Это отчасти вызвано задачей Intel 8086, которая также здесь, но я подумал, что задача 6502 тоже будет интересной.
Соревнование
Я думал, что это было бы забавно, чтобы увидеть результаты для. Этот, очевидно, направлен на более продвинутую сторону спектра. Задача состоит в том, чтобы написать собственный эмулятор процессора 6502. Это, конечно, подразумевает понимание его набора команд и формата кодирования. Ресурсы связаны в нижней части этого. 6502 - один из самых простых реальных процессоров для эмуляции. В этом случае вам не нужно беспокоиться о времени цикла, если вы этого не хотите - но это всегда плюс!
НЕ КОПИРУЙТЕ КОД ЧЕЛОВЕКА ЕЩЕ! Конечно, вы можете, конечно, взглянуть на другие эмуляторы, чтобы помочь вам понять, но без копирования и вставки! :)
Как только ваш код сработает, вы всегда можете пройти лишнюю милю, если хотите, и превратить его в эмулятор Apple II, или NES, C64, VIC-20 или любую из других миллиардов старых систем на базе 6502 из прошлого.
Тестирование вашего эмулятора
Я собрал набор тестов 6502, исходный код которого я нашел здесь: http://code.google.com/p/hmc-6502/source/browse/trunk/emu/testvectors/AllSuiteA.asm
Мою скомпилированную версию можно скачать здесь: http://rubbermallet.org/AllSuiteA.zip
Загрузите двоичный файл размером 48 КБ в область памяти вашего эмулятора за 4000 долларов, что оставляет под ним 16 КБ оперативной памяти для чтения и записи. Когда тест завершится, значение в адресе $ 0210 должно быть $ FF, если ваш ЦП прошел. Вы узнаете, что тест завершен, когда счетчик программ (ПК) достиг адреса $ 45C0.
Другие тесты также доступны здесь: http://visual6502.org/wiki/index.php?title=6502TestPrograms
Делать что-то более интерактивное с этим
Как только ваш процессор заработает, вам, вероятно, захочется сделать что-то более веселое, чем смотреть на результаты теста! Я скомпилировал образ ПЗУ Enhanced BASIC для 6502. Это 16 КБ, поэтому вы должны загрузить его в $ C000 вашего эмулируемого пространства памяти, сбросить виртуальный 6502 и начать выполнение.
Загрузите этот ZIP, который содержит ehbasic.bin: http://rubbermallet.org/ehbasic.zip
Способ, которым EhBASIC обрабатывает ввод / вывод, очень прост. Когда он хочет записать символ в консоль, он записывает байт в ячейку памяти $ F001. Итак, когда ваш эмулятор видит, что 6502 пытается записать в это место, просто выведите это символьное значение на консоль с помощью printf ("% c", значение); или как угодно еще. (Конечно, этот вызов не ограничен C)
Когда он опрашивает персонажа, вводимого из консоли, это очень похоже. Он продолжает чтение из памяти $ F004, где вы должны получить следующее символьное значение ASCII с клавиатуры, ожидающее чтения. Если больше нет входных данных для чтения, он должен вернуть значение ноль.
EhBASIC опрашивает значение в этом месте, пока оно не будет равно нулю, что позволит ему узнать, что байт является допустимым вводом с клавиатуры. Поэтому, если больше нет ввода для чтения, эмулятор должен вернуть ноль. EhBASIC будет крутить его до следующей действительной клавиши, когда будет искать ввод.
Если вы не сбросите это значение до нуля после того, как оно прочитает последнее значение ключа, оно будет повторяться, как если бы вы удерживали клавишу нажатой, поэтому будьте осторожны, чтобы сделать это правильно!
Если ваш эмулятор работает правильно, это то, что вы увидите распечатанным на консоли при запуске образа ROM:
6502 EhBASIC [C]old/[W]arm ?
Нажмите C, затем нажмите Enter, и вы должны увидеть:
Memory size ?
31999 Bytes free
Enhanced BASIC 2.22
Ready
Свободные байты могут отличаться для вас, но в моем эмуляторе я ограничил область памяти для записи до 32 КБ. Вы действительно можете пройти весь путь до того места, где начинается ПЗУ, что составляет отметку 48 КБ.
6502 ссылки на ресурсы процессора
Вот некоторые ресурсы, которые должны дать вам достаточно информации для работы:
http://www.obelisk.demon.co.uk/6502/instructions.html
http://www.e-tradition.net/bytes/6502/6502_instruction_set.html
http://www.llx.com/~nparker/a2/opcodes.html <- здесь есть очень интересная информация
http://en.wikipedia.org/wiki/MOS_Technology_6502
Если у вас есть вопросы или вам нужна дополнительная техническая информация, не стесняйтесь спрашивать меня. Существует также огромное количество другой 6502 информации в Интернете. Google твой друг!
источник
Ответы:
Думал, что я пойду дальше и опубликую свою собственную реализацию. Это ПОЛНОСТЬЮ ungolfed, но это полная реализация.
источник
Эмулятор MOS 6502 в Haskell. Особенности включают в себя:
Это несколько полная версия полной реализации (с большим количеством функций), которую я сделал для этой задачи, которую я опубликую позже. Несмотря на гольф, код все еще прост. Единственная известная отсутствующая функция - это режим BCD
Запускает код ehBASIC:
И код, всего менее 300 строк:
источник
Для всех, кто заинтересовался, я решил поделиться своей реализацией 6502 в C #. Как и в других постах здесь, это полностью безвкусно, но это полная реализация функции.
Я начал этот проект с создания электронной таблицы инструкций, когда впервые узнал о процессоре. Я понял, что могу использовать эту таблицу, чтобы сэкономить время при наборе текста. Я превратил это в таблицу текстовых файлов, которую эмулятор загружает для подсчета циклов и облегчения вывода разборки.
Весь проект доступен на Github https://github.com/amensch/e6502
источник