Написание графического эмулятора Z80 на C или C ++ [закрыто]
Вопрос
Я хочу проявить интерес к написанию моего собственного простого эмулятора для Z80 процессор.У меня нет опыта работы с этим типом программирования.В основном меня устраивает использование языков на основе C, поскольку именно их я знаю лучше всего.
Что мне нужно для достижения этого и какие есть хорошие учебные пособия / ссылки, которые могли бы помочь мне в этом проекте?
Мне также хотелось бы получить руководство по кодированию приложения для сброса ПЗУ для моего TI-84 Плюс калькулятор, чтобы я мог использовать его ПЗУ с этим эмулятором.
Решение
Возможно, начнем с рассмотрения этих вопросов.
Хорошее руководство можно найти здесь: Независимое руководство по сборке Z80 р>
Документированный документ Z80 v0.91 (pdf) р>
Полный справочник инструкций по Z80
Сводная информация о наборе инструкций для микропроцессора Z80
Другие советы
Это что-то вроде второстепенной задачи, но, поскольку вы говорите, что у вас нет опыта работы с этим типом программирования, вы можете начать с создания эмулятора для Универсальная виртуальная машина с конкурса программирования ICFP 2006 года а>. Это задача, которая занимает у опытного программиста 90 минут, но многие команды, не имеющие опыта, смогли выполнить ее за несколько дней. Когда вы заканчиваете эмулятор, он открывает кучу забавных вещей, и это может быть хорошей разминкой перед тем, как вы начнете заниматься Z80.
Некоторые вещи, которые нужно добавить (особенно для Z80):
Не доверяйте документации, она на 100% свободна от ошибок
Я не видел ни одного без ошибок, включая упомянутые здесь.
Правильно проверьте ядро вашего процессора на наличие ошибок
Позже это избавит вас от многих головных болей и замешательства.
Для тестирования я использую три подхода:
Пошаговое выполнение / трассировка по известному коду (обычно комментируемая разборка ПЗУ)
Это первый шаг, когда еще ничего не работает.Вы увидите плохо (де) закодированные инструкции.
Включите в свой эмулятор разные ядра Z80 и обработайте все как двойную эмуляцию
Создайте два "отдельных" эмулятора с одинаковой системой пошагового управления, трассировки и запуска.Оба процессора должны иметь собственную аппаратную память и т.д.
- Запустите эмулятор и после каждой инструкции сравнивайте регистры и непосредственные ячейки памяти, такие как
[hl],[sp],[sp-1]
... - При первом же различии остановитесь и посмотрите, какая инструкция вызвала его.
Отладьте его и продолжайте до тех пор, пока не будете "свободны от ошибок".Имейте в виду, что второе ядро также может глючить, поэтому выполняйте отладку с осторожностью.
- Запустите эмулятор и после каждой инструкции сравнивайте регистры и непосредственные ячейки памяти, такие как
Когда вы будете более работоспособны, используйте core tester
Использование Тренажер ZEXALL.Это лучшее на Z80 (по крайней мере, исходя из моего опыта).Это помогло мне с очень многими вещами (мое ядро теперь на 100% совместимо с ZEXALL).Это сделано на реальном оборудовании, так что в нем нет ошибок.Это от CP/М таким образом, некоторые версии нуждаются Режим оперативной памяти 64 Кб бежать.Другой Операционная система /ПЗУ или что-то еще, что может привести к сбою некоторых инструкций с доступом к памяти, поэтому для них вам нужно найти исправленные CRC или сравнить с реальным оборудованием.
Например, необработанный ZEXALL ( ЗЕКСАЛЛ ) многие вещи выходят из строя на ZX Спектр (как это делается для MSX и 64 КБ оперативной памяти без ПЗУ), но есть версии, сделанные по-настоящему ZX Спектр и они равны 100% ОК вкл . ZX Спектр (и на моем эмуляторе тоже :))
Z80all instruction exerciser <adc,sbc> hl,<bc,de,hl,sp>...OK add hl,<bc,de,hl,sp>.........OK add ix,<bc,de,ix,sp>.........OK add iy,<bc,de,iy,sp>.........OK aluop a,nn...................OK aluop a,<b,c,d,e,h,l,(hl),a>.OK aluop a,<ixh,ixl,iyh,iyl>....OK aluop a,(<ix,iy>+1)..........OK bit n,(<ix,iy>+1)............OK bit n,<b,c,d,e,h,l,(hl),a>...OK cpd<r>.......................OK cpi<r>.......................OK <daa,cpl,scf,ccf>............OK <inc,dec> a..................OK <inc,dec> b..................OK <inc,dec> bc.................OK <inc,dec> c..................OK <inc,dec> d..................OK <inc,dec> de.................OK <inc,dec> e..................OK <inc,dec> h..................OK <inc,dec> hl.................OK <inc,dec> ix.................OK <inc,dec> iy.................OK <inc,dec> l..................OK <inc,dec> (hl)...............OK <inc,dec> sp.................OK <inc,dec> (<ix,iy>+1)........OK <inc,dec> ixh................OK <inc,dec> ixl................OK <inc,dec> iyh...............OK <inc,dec> iyl................OK ld <bc,de>,(nnnn)............OK ld hl,(nnnn).................OK ld sp,(nnnn).................OK ld <ix,iy>,(nnnn)............OK ld (nnnn),<bc,de>............OK ld (nnnn),hl.................OK ld (nnnn),sp.................OK ld (nnnn),<ix,iy>............OK ld <bc,de,hl,sp>,nnnn........OK ld <ix,iy>,nnnn..............OK ld a,<(bc),(de)>.............OK ld <b,c,d,e,h,l,(hl),a>,nn...OK ld (<ix,iy>+1),nn............OK ld <b,c,d,e>,(<ix,iy>+1).....OK ld <h,l>,(<ix,iy>+1).........OK ld a,(<ix,iy>+1).............OK ld <ixh,ixl,iyh,iyl>,nn......OK ld <bcdehla>,<bcdehla>.......OK ld <bcdexya>,<bcdexya>.......OK ld a,(nnnn) / ld (nnnn),a....OK ldd<r> (1)...................OK ldd<r> (2)...................OK ldi<r> (1)...................OK ldi<r> (2)...................OK neg..........................OK <rrd,rld>....................OK <rlca,rrca,rla,rra>..........OK shf/rot (<ix,iy>+1)..........OK shf/rot <b,c,d,e,h,l,(hl),a>.OK <set,res> n,<bcdehl(hl)a>....OK <set,res> n,(<ix,iy>+1)......OK ld (<ix,iy>+1),<b,c,d,e>.....OK ld (<ix,iy>+1),<h,l>.........OK ld (<ix,iy>+1),a.............OK ld (<bc,de>),a...............OK Tests complete
На случай, если вы собираетесь использовать ZEXALL ( ЗЕКСАЛЛ ) будьте осторожны, это действительно исчерпывающий тест и IIRC вкл . ~ 50 МГц подражание, которое потребовалось примерно
30-60
минимум до завершения.И для этого нужно нажать клавишу для прокрутки несколько раз ...Если вам нужна конфликтная модель, добавьте соответствующие тесты.Тогда найди его.Для ZX Спектр существует множество тестеров плавающих шин, прерываний и экранов.Для ТИ Я понятия не имею...(Я не являюсь ТИ пользователь калькулятора)
Кстати: Как все прошло с вашим эмулятором?(Вы это сделали?)
Набор инструкций
Я бы скопировал свой набор инструкций сюда, но в нем 1792 строки и 121 КБ, поэтому он не вписывается в ограничение в 30 КБ.Вместо этого вы можете найти его по ссылке для скачивания в этом моем ответе
Он содержит "все" ZX инструкции с правильным OP коды, хронометраж кодирования и машинные циклы.Мне потребовалось несколько лет, чтобы собрать всю документацию, поэтому я передаю ZEXALL 100% правильно.Мой эмулятор загружает этот текстовый файл (1792 инструкции) в ядро на init
и настраивает декодер команд и процессор во время выполнения, так что я смог изменить ситуацию действительно быстро и достаточно просто (если была обнаружена ошибка)...Это спасло мне жизнь. лот времени.
Митч полностью прав. Начните с понимания процессора. Затем немного поиграйте, написав код для реализации конкретных инструкций. Для этого используйте C ++, кстати, а не C, иначе концепции процессора не будут сопоставляться с классами в вашем коде.
В процессе реализации инструкций вы обнаружите, что вам нужно определить такие вещи, как флаги и указатель инструкций. Это должно в конечном итоге привести вас туда, где вам нужно реализовать модель памяти и даже модель ввода-вывода. Р>
В конечном итоге вам придется выяснить, как загрузить код и данные в память и, возможно, как выгрузить их обратно на диск.
Только тогда вам нужно приступить к эмуляции выполнения кода, загруженного в память, по заданному указателю инструкции.
Попробуйте взглянуть на эмуляторы Sega Master System и Game Gear (я уверен, что некоторые из них с открытым исходным кодом). Эти консоли имеют Z80 в качестве процессора, и ZX Spectrum тоже использовал его, http://www.worldofspectrum.org/emulators.html .
Похоже, вам нужен эмулятор не только для процессора, но и для полной машины. У вас также будет задача эмулировать остальное оборудование, и поиск документации для этого вполне может оказаться более сложной задачей, ожидающей вас.
В зависимости от вашей цели вы можете начать с уже существующего эмулятора для Z80. Быстрый поиск дает несколько из них, но без эмулятора для TI-84. simh , платформа для эмуляции старых компьютеров уже имеет эмуляцию процессора Z80, добавляя эмуляцию остальных ваших аппаратное обеспечение должно быть проще, чем начинать с нуля. Даже если вы не пойдете по этой дороге, там есть несколько проектных документов, которые могут вам помочь.
Я бы порекомендовал вам начать с написания эмулятора для немного более простого, но связанного процессора, 8080 . Z80 на самом деле довольно сложный (многобайтовые инструкции, больше режимов адресации, регистры индекса и т. Д.), Тогда как инструкции 8080 очень легко декодировать (вы можете просто использовать таблицу поиска с 256 записями в качестве решения первого порядка) , Р>
Весь код, который вы пишете для управления программой (отображение, ввод данных, дампы памяти и т. д.), должен быть повторно использован, если вы затем решите попробовать Z80, и действительно вы должны разработать пользовательский интерфейс для быть смоделированным независимо от процессора.
Я узнал все, что знаю о сборке Z80 и калькулятора, прямо здесь: http://www.ticalc.org / программирование /