Вопрос

Сегодня выходные, поэтому я отдыхаю от того, что всю неделю занимаюсь программированием, и пишу проект для хобби.

Вчера я написал фреймворк эмулятора процессора MOS 6502, регистры, стек, память и все коды операций реализованы.(Ссылка на источник ниже)

Я могу вручную запустить серию операций в отладчике, который я написал, но я хотел бы загрузить rom NES и просто указать программному счетчику на его инструкции, я решил, что это будет самый быстрый способ найти ошибочные коды операций.

Я написал быстрый загрузчик ПЗУ NES и загрузил банки ПЗУ в память процессора.

Проблема в том, что я не знаю, как кодируются коды операций.Я знаю, что сами коды операций следуют шаблону в один байт на код операции, который однозначно идентифицирует код операции,

0 - BRK
1 - ORA (D,X)
2 - COP b

и т.д.

Однако я не уверен, где я должен найти аргумент кода операции.Это непосредственно следующий байт?В абсолютной памяти, я полагаю, это может быть не байт, а короткое значение.

Кто-нибудь знаком с моделью памяти этого процессора?

Редактировать:Я понимаю, что это, вероятно, снято в темноте, но я надеялся, что здесь скрываются какие-нибудь олдскульные хакеры Apple и Commodore.

Редактировать: Всем спасибо за вашу помощь.После того, как я внес соответствующие изменения для согласования каждой операции, процессор может загрузить и запустить Mario Brothers.Он не делает ничего, кроме цикла ожидания запуска, но это хороший знак :)

Я загрузил исходный код:

https://archive.codeplex.com/?p=cpu6502

Если кто-нибудь когда-нибудь задавался вопросом, как работает эмулятор, то разобраться в нем довольно легко.Нисколько не оптимизирован, но опять же, я эмулирую процессор, который работает на частоте 2 МГц на компьютере с частотой 2,4 ГГц :)

Это было полезно?

Решение

Код операции занимает один байт, а операнды находятся в следующих байтах.Проверьте столбец "размер в байтах" здесь, например.

Другие советы

Если вы посмотрите на ссылки, такие как http://www.atarimax.com/jindroush.atari.org/aopc.html, вы увидите , что каждый код операции имеет кодировку , указанную как:

HEX LEN TIM

Шестнадцатеричный код - это ваш 1-байтовый код операции.Сразу за ним следует LEN байт его аргумента.Обратитесь к ссылке, чтобы узнать, что это за аргументы.Временные данные важны для эмуляторов - это количество тактов, которое требуется для выполнения этой инструкции.Это понадобится вам, чтобы правильно рассчитать время.

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

Эта книга могла бы помочь: http://www.atariarchives.org/mlb/

Кроме того, попробуйте проверить любой другой 6502 aseembler / simulator / debugger, чтобы увидеть, как сборка кодируется как машинный язык.

Руководства 6502 находятся в Интернете, на различных исторических сайтах.КИМ-1 отправили вместе с ними.Может быть, в них больше, чем вам нужно знать.

ПЗУ Apple II включали в себя разборщик, я думаю, именно так он назывался, и он показывал вам в удобном формате шестнадцатеричные коды операций, код операции из 3 символов и операнды.

Таким образом, учитывая, как мало памяти было доступно, им удалось засунуть в счетчик байтов операнда (всегда 0, 1 или 2) 3-символьный код операции для всего набора команд 6502 в действительно небольшое пространство, потому что на самом деле его не так уж и много.

Если вам удастся откопать ПЗУ Apple II, вы можете просто вырезать и вставить оттуда...

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

http://obelisk.me.uk/6502/addressing.html#IMM

Это лучше - матрица набора команд 6502:

https://www.masswerk.at/6502/6502_instruction_set.html

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top