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

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

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

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

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

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

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

так далее

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

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

РЕДАКТИРОВАТЬ: Я понимаю, что это, вероятно, снято в темноте, но я надеялся, что здесь скрываются какие-то старые хакеры Apple и Commodore.

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

Я залил исходник:

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

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


person FlySwat    schedule 21.09.2008    source источник
comment
Эй, я почти в той же ситуации (на момент публикации). Я хотел бы проверить ваш код, но ссылка кажется неработающей. У вас все еще есть это?   -  person Petruza    schedule 25.01.2010


Ответы (7)


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

person moonshadow    schedule 21.09.2008
comment
Итак, мне придется модифицировать каждый опкод, чтобы он знал, как далеко от ПК смотреть вперед, чтобы получить свои аргументы? - person FlySwat; 21.09.2008
comment
Тебе придется где-то держать столик, да. Хотя это никогда не будет больше трех байтов. Или просто запрограммируйте его в коде, выполняющем работу каждой инструкции. - person moonshadow; 22.09.2008

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

HEX LEN TIM

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

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

person Frank Krueger    schedule 21.09.2008
comment
Я не думаю, что LEN и TIM на самом деле закодированы, я думаю, вы должны это предоставить. Я уже сделал это с синхронизацией, каждый код операции знает, сколько циклов он должен занять. - person FlySwat; 21.09.2008
comment
Они действительно есть во многих случаях. Для всех кодов операций с битами аргумента [4:2] кода операции определяется 3-битное кодирование режима адресации. Я обнаружил, что это последовательно: 0 = НЕПРЯМАЯ X, 1 = НУЛЕВАЯ СТРАНИЦА, 2 = НЕМЕДЛЕННАЯ (иногда АККУМУЛЯТОР), 3 = АБСОЛЮТНАЯ, 4 = НЕПРЯМАЯ Y, 5 = НУЛЕВАЯ СТРАНИЦА X, 6 = АБСОЛЮТНАЯ Y, 7 = АБСОЛЮТНАЯ Икс - person Mark Renouf; 27.11.2009

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

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

person Brendan Kidwell    schedule 21.09.2008

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

person gbarry    schedule 21.09.2008

Это лучше - матрица 6502 Instruction Set:

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

person i486    schedule 20.03.2019

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

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

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

person stu    schedule 04.02.2009

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

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

person nenchev    schedule 18.03.2018