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

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

17 голосов
/ 21 сентября 2008

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

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

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

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

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

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

и т.д.

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

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

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

РЕДАКТИРОВАТЬ: Спасибо за вашу помощь всем. После того, как я внес соответствующие изменения, чтобы выровнять каждую операцию, процессор может загрузить и запустить Mario Brothers. Он ничего не делает, кроме цикла ожидания запуска, но это хороший знак:)

Я загрузил источник:

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

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

Ответы [ 7 ]

12 голосов
/ 21 сентября 2008

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

3 голосов
/ 21 сентября 2008

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

HEX LEN TIM

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

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

1 голос
/ 21 сентября 2008

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

1 голос
/ 21 сентября 2008

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

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

0 голосов
/ 20 марта 2019

Это лучше - 6502 Матрица набора инструкций:

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

0 голосов
/ 18 марта 2018

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

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

0 голосов
/ 05 февраля 2009

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

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

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

...