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

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

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

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

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

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

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

так далее

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

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

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

РЕДАКТИРОВАТЬ: Спасибо за вашу помощь всем. После того, как я внес необходимые изменения, чтобы выровнять каждую операцию, процессор может загрузить и запустить 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) не кодируются в самом коде операции. Вам необходимо сохранить эти данные в загрузчике / запуске программы. Это просто большой справочный стол. Или вы можете определить мини-язык для кодирования данных и чтения.

Это лучше - 6502 Инструкция по набору матрицы:

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам