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.