6502 Эмуляция процессора
-
02-07-2019 - |
Вопрос
Сегодня выходные, поэтому я отдыхаю от того, что всю неделю занимаюсь программированием, и пишу проект для хобби.
Вчера я написал фреймворк эмулятора процессора MOS 6502, регистры, стек, память и все коды операций реализованы.(Ссылка на источник ниже)
Я могу вручную запустить серию операций в отладчике, который я написал, но я хотел бы загрузить rom NES и просто указать программному счетчику на его инструкции, я решил, что это будет самый быстрый способ найти ошибочные коды операций.
Я написал быстрый загрузчик ПЗУ NES и загрузил банки ПЗУ в память процессора.
Проблема в том, что я не знаю, как кодируются коды операций.Я знаю, что сами коды операций следуют шаблону в один байт на код операции, который однозначно идентифицирует код операции,
0 - BRK
1 - ORA (D,X)
2 - COP b
и т.д.
Однако я не уверен, где я должен найти аргумент кода операции.Это непосредственно следующий байт?В абсолютной памяти, я полагаю, это может быть не байт, а короткое значение.
Кто-нибудь знаком с моделью памяти этого процессора?
Редактировать:Я понимаю, что это, вероятно, снято в темноте, но я надеялся, что здесь скрываются какие-нибудь олдскульные хакеры Apple и Commodore.
Редактировать: Всем спасибо за вашу помощь.После того, как я внес соответствующие изменения для согласования каждой операции, процессор может загрузить и запустить Mario Brothers.Он не делает ничего, кроме цикла ожидания запуска, но это хороший знак :)
Я загрузил исходный код:
https://archive.codeplex.com/?p=cpu6502
Если кто-нибудь когда-нибудь задавался вопросом, как работает эмулятор, то разобраться в нем довольно легко.Нисколько не оптимизирован, но опять же, я эмулирую процессор, который работает на частоте 2 МГц на компьютере с частотой 2,4 ГГц :)
Решение
Код операции занимает один байт, а операнды находятся в следующих байтах.Проверьте столбец "размер в байтах" здесь, например.
Другие советы
Если вы посмотрите на ссылки, такие как http://www.atarimax.com/jindroush.atari.org/aopc.html, вы увидите , что каждый код операции имеет кодировку , указанную как:
HEX LEN TIM
Шестнадцатеричный код - это ваш 1-байтовый код операции.Сразу за ним следует LEN байт его аргумента.Обратитесь к ссылке, чтобы узнать, что это за аргументы.Временные данные важны для эмуляторов - это количество тактов, которое требуется для выполнения этой инструкции.Это понадобится вам, чтобы правильно рассчитать время.
Эти значения (LEN, TIM) не кодируются в самом коде операции.Вам необходимо сохранить эти данные в вашем загрузчике / исполнителе программ.Это просто большая справочная таблица.Или вы можете определить мини-язык для кодирования данных и считывателя.
Эта книга могла бы помочь: http://www.atariarchives.org/mlb/
Кроме того, попробуйте проверить любой другой 6502 aseembler / simulator / debugger, чтобы увидеть, как сборка кодируется как машинный язык.
Руководства 6502 находятся в Интернете, на различных исторических сайтах.КИМ-1 отправили вместе с ними.Может быть, в них больше, чем вам нужно знать.
ПЗУ Apple II включали в себя разборщик, я думаю, именно так он назывался, и он показывал вам в удобном формате шестнадцатеричные коды операций, код операции из 3 символов и операнды.
Таким образом, учитывая, как мало памяти было доступно, им удалось засунуть в счетчик байтов операнда (всегда 0, 1 или 2) 3-символьный код операции для всего набора команд 6502 в действительно небольшое пространство, потому что на самом деле его не так уж и много.
Если вам удастся откопать ПЗУ Apple II, вы можете просто вырезать и вставить оттуда...
6502 имеет разные режимы адресации, одна и та же команда имеет несколько разных кодов операций в зависимости от режима адресации.Взгляните на следующие ссылки, в которых описаны различные способы, которыми 6502 может извлекать данные из памяти или непосредственно из ПЗУ.
Это лучше - матрица набора команд 6502: