Могут ли программы Chip-8 переходить на нечетные адреса?

Я пишу интерпретатор чип-8. У меня есть моё фальшивое оборудование, выполнение команд, пользовательский интерфейс и т. Д. Все хорошо, поэтому я начал загружать и выполнять настоящие программы на чип-8.

В zip-архиве, который я нашел в сети, есть несколько игр, в которых, кажется, есть нелегальные прыжковые вызовы.

Из спецификации CowGod говорится:

Все инструкции имеют длину 2 байта и сохраняются в порядке старшего байта. В памяти первый байт каждой инструкции должен быть расположен по четным адресам. Если программа содержит данные спрайта, она должна быть дополнена, чтобы любые последующие инструкции были правильно расположены в ОЗУ.

Это кажется очень настойчивым, что невозможно иметь инструкцию, которая выполняется с нечетного адреса памяти, и поэтому я закодировал мой интерпретатор, чтобы потерпеть неудачу, в итоге мы пытаемся перейти на нечетный адрес памяти (в основном потому, что я предполагаю, что читаю что-то неправильно, если это произошло).

Однако две игры в моем пакете (INVADERS, а также BLITZ), кажется, сразу начинается с вызова перехода (они подписывают ромы своими именами в ascii, поэтому первая инструкция - это вызов для перехода после подписи.

Первый начинается с 0x12 0x25 а вторая начинается с 0x12 0x17, Оба из них указывают на переходы вызовов на нечетные адреса (0x225 и 0x217 соответственно), которые затем терпят неудачу в моем эмуляторе. Смотря на те адреса, на которые они указывают, они выглядят так, как будто они содержат действительные инструкции (байт 25 в первом содержит 0x6000 (LD V0, 00) и байт 17 в последнем указывает на 0xA341 (LD I, 341).

Я просто слишком строго интерпретирую спецификации, и ожидается, что реальные приложения не будут дополнены и могут быть запущены по нечетным адресам?

1 ответ

Ответ на этот вопрос (на основе комментариев): спецификация Chip-8, очевидно, намеревалась включить требование, чтобы инструкции начинались на четных адресах, однако из-за того, что он не указан очень сильно (в спецификации упоминается только при передаче с использованием термин "должен" вместо "должен"), а также тот факт, что набор инструкций отлично работает с инструкциями, которые не находятся по четным адресам (например, инструкция перехода может переходить на любой адрес, а не только на один), разработчики эмулятора как правило, игнорируют требование. Следовательно, существует множество двоичных файлов для Chip-8, которые имеют инструкции по нечетным адресам, поэтому маловероятно, что будущие эмуляторы будут выполнять это требование.

Другие вопросы по тегам