6502 эмуляции процессора

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

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

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

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

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

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

etc

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

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

EDIT: я понимаю, что это, вероятно, снято в темноте, но я надеялся, что здесь скрываются некоторые хакеры старой школы Apple и Commodore.

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

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

http://www.codeplex.com/Cpu6502/SourceControl/DirectoryView.aspx?SourcePath=&changeSetId=1810

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

6 ответов


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


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

HEX LEN TIM

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

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


эта книга может помочь: http://www.atariarchives.org/mlb/

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


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


ПЗУ apple II включали в себя dissassembler, я думаю, что это то, что он назывался, и он покажет вам в хорошем формате шестнадцатеричные опкоды и 3-символьный опкод и операнды.

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

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


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

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