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 Инструкция по набору матрицы:
Эта книга может помочь: http://www.atariarchives.org/mlb/
Кроме того, попробуйте проверить любой другой 6502 aseembler/simulator/debugger, чтобы увидеть, как ассемблер кодируется как машинный язык.
Руководства 6502 находятся в Интернете, на разных исторических сайтах. КИМ-1 поставляется с ними. Возможно, в них больше, чем нужно знать.
Яблоки Apple II включали в себя дизассемблер, я думаю, именно так он и назывался, и он показал бы вам в хорошем формате шестнадцатеричные коды операций, трехзначный код операции и операнды.
Таким образом, учитывая, как мало памяти было доступно, им удалось засунуть в счетчик байтов операнда (всегда 0, 1 или 2) 3-символьный код операции для всего набора команд 6502 в действительно небольшое пространство, потому что его на самом деле не так уж много.
Если вы можете выкопать rom 2 яблока, вы можете просто вырезать и вставить оттуда...
6502 имеет разные режимы адресации, одна и та же инструкция имеет несколько разных кодов операций в зависимости от режима адресации. Взгляните на следующие ссылки, в которых описаны различные способы, которыми 6502 может извлекать данные из памяти или непосредственно из ПЗУ.