Я пишу интерпретатор чип-8.У меня есть фиктивное аппаратное обеспечение, выполнение инструкций, пользовательский интерфейс и т. Д. Все в порядке, поэтому я начал загружать и выполнять настоящие программы на чип-8.
В zip-архиве, который я нашел в Интернете, есть несколько игр втам, кажется, есть незаконные прыжки.
Из Спецификация CowGod гласит:
Все инструкции имеют длину 2 байта и сначала сохраняются в старшем значащем байте.В памяти первый байт каждой инструкции должен быть расположен по четным адресам.Если программа содержит данные спрайта, она должна быть дополнена, поэтому любые последующие инструкции будут правильно расположены в ОЗУ.
Это кажется очень настойчивым, так как невозможно иметь инструкцию, которая выполняется с нечетного адреса памятии поэтому я закодировал мой интерпретатор как сбой, так как в итоге мы пытаемся перейти по нечетному адресу памяти (в основном потому, что я предполагаю, что я читаю что-то не так, если это произошло).
Однако две игры вмоя пачка (INVADERS
и BLITZ
), похоже, сразу начинается с вызова прыжка (они подписывают ромы своими именами в ascii, поэтому первая инструкция - это вызов для перехода после подписи.
Первый из них начинается с 0x12 0x25
, а второй начинается с 0x12 0x17
. Оба этих параметра указывают, что в моем эмуляторе происходит сбой вызовов на нечетные адреса (0x225 и 0x217 соответственно). Смотря на те адреса, на которые они указывают, они выглядят так, как будто онисодержит действительные инструкции (байт 25 в первом содержит 0x6000 (LD V0, 00
) и байт 17 в тон указывает на 0xA341 (LD I, 341
).
Я просто слишком строго интерпретирую спецификации, и ожидается, что реальные приложения не будут дополнены и могут быть запущены по нечетным адресам?