Написание графического эмулятора Z80 на C или c++ [закрыто]
Я хочу проявить интерес к написанию моего собственного простого эмулятора для на Z80 процессор. У меня нет опыта в такого рода программировании. Я в основном в порядке с использованием языков на основе C, поскольку они являются теми, которые я знаю лучше всего.
Что мне нужно для этого и какие хорошие учебники / ссылки могут помочь мне в этом проекте?
Я также хотел бы учебник для кодирования приложения ROM-dumping для my TI-84 Plus калькулятор, чтобы я мог использовать его ROM с этим эмулятором.
8 ответов
возможно, начните с просмотра этих:
хороший учебник можно найти здесь: Независимое Руководство По Сборке Z80
без документов на Z80 документально версии v0.91 (pdf)
Это немного боковая поездка, но поскольку вы говорите, что у вас нет опыта работы с этим типом программирования, вы можете начать с создания эмулятора для Универсальная Виртуальная Машина С конкурс программирования ICFP 2006. Это задача, которая занимает у опытного программиста 90 минут, но многие команды без опыта смогли выполнить ее за несколько дней. Когда вы закончите эмулятор, он разблокирует кучу забавных вещей, и это может быть хорошая разминка прежде чем взяться за Z80.
некоторые вещи, чтобы добавить (особенно для Z80):
-
Не доверяйте документации на 100% без ошибок
Я не вижу никаких ошибок, в том числе упомянутых здесь.
-
Проверьте ядро процессора на наличие ошибок должным образом
Это избавит вас от многих головных болей и затруднений в будущем.
для тестирования я использую три подходы:
-
шаг / трассировка против известного кода (обычно комментируется разборка ROM)
Это первый шаг, когда еще ничего не работает. Вы увидите плохо (de)закодированные инструкции.
-
включите различные ядра Z80 в свой эмулятор и обработайте все как двойную эмуляцию
сделайте два "разделенных" эмулятора с одной и той же системой шага, трассировки и запуска. Оба ЦП должен иметь собственное оборудование памяти и т. д.
- запустите эмулятор и после каждой инструкции сравните регистры и непосредственные места памяти, такие как
[hl],[sp],[sp-1]
... - при первой разнице остановитесь и посмотрите, какая инструкция вызвала это.
Отладьте его и продолжайте, пока не будете "без ошибок". Остерегайтесь, что второе ядро также может быть багги, поэтому отлаживайте с осторожностью.
- запустите эмулятор и после каждой инструкции сравните регистры и непосредственные места памяти, такие как
-
когда вы более работоспособное использование core tester
использовать тренажер ZEXALL. Это лучший на на Z80 (по крайней мере из моего опыта). Это помогло мне с очень многими вещами (мое ядро теперь на 100% совместимо с ZEXALL). Это сделано против реального оборудования, поэтому в нем нет ошибок. Это от CP / M поэтому некоторым версиям нужно 64K RAM mode запустить. Разные OS / ROM или что может вызвать некоторые инструкции с памятью доступ к сбою, поэтому для тех, кому нужно найти исправленные CRCs или сравнить с реальным оборудованием.
например, raw ZEXALL терпит неудачу многие вещи на ZX Spectrum (как это делается для MSX и 64K RAM без ROM), но есть версии, сделанные для real ZX Spectrum и они на 100% OK on ZX Spectrum (и на моем эмуляторе тоже :))
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 on ~50 МГц эмуляция заняла около
30-60
мин до полного. И он должен нажать клавишу для прокрутки несколько раз ...Если вам нужна модель конкуренции, добавьте правильные тесты. Тогда найди. Для ZX Spectrum есть много плавающих шин, прерываний и экранных тестеров. Для TI понятия не имею... (Я не TI калькулятор пользователь)
кстати: как все прошло с вашим эмулятором? (Ты сделал это?)
набор команд
Я бы скопировал свой набор инструкций здесь, но он имеет 1792 строки и 121 КБ, поэтому он не будет вписываться в ограничение 30 КБ. Вместо этого вы можете найти его в ссылке для скачивания в этом моем ответе
это содержит 'все' ZX инструкция с правильной OP коды, время кодирования и машинные циклы. Мне потребовалось несколько лет, чтобы собрать всю документацию, поэтому я прохожу ZEXALL 100% правильно. Мой эмулятор загружает этот (1792 инструкция) текстовый файл в ядро на init
и настраивает декодер инструкций и процессор во время выполнения, поэтому я смог изменить вещи очень быстро и достаточно просто (если ошибка была обнаружена)... Это спасло меня много of время.
Митч совершенно прав. Начните с понимания процессора. Затем немного поиграйте, написав код для реализации определенных инструкций. Используйте C++ для этого, кстати, не C, или понятия процессора не будут сопоставляться с классами в вашем коде.
в процессе реализации инструкций вы обнаружите, что вам нужно определить такие вещи, как флаги и указатель инструкции. Это должно в конечном итоге привести вас к тому, где вам нужно реализовать модель памяти и даже ввод-вывод модель.
вам в конечном итоге придется выяснить, как загрузить код и данные в память и, возможно, как сбросить его обратно на диск.
только тогда вам нужно добраться до точки эмуляции выполнения кода, загруженного в память, по заданному указателю инструкции.
похоже, вам нужен эмулятор не только для процессора, но и для полной машины. У вас также будет задача эмуляции остального оборудования, и найти документацию для этого вполне может быть более сложной задачей, ожидающей вас.
в зависимости от вашей цели, вы можете начать с уже существующей эмулятор для Z80. Быстрый поиск дает несколько из них, но нет эмулятора для TI-84. simh рамки для эмуляции старых компьютеров уже эмуляция процессора Z80, добавление эмуляции остального оборудования должно быть проще, чем начинать с нуля. Даже если вы не идете по этой дороге, есть некоторые проектные документы, которые могут вам помочь.
Я бы рекомендовал вам рассмотреть возможность начать с написания эмулятора для немного более простого, но связанного процессора,8080. Z80 на самом деле довольно сложный (многобайтовые инструкции, больше режимов адресации, индексные регистры и т. д.), в то время как инструкции 8080 очень легко декодировать (вы можете просто использовать таблицу поиска 256-entry в качестве решения первого порядка).
весь код, который вы пишете для управления программой(дисплей, ввод данных, дампы памяти и т. д.) должен быть повторно использован если вы затем решите попробовать Z80, и действительно, Вы должны создать пользовательский интерфейс для имитации процессора.
попробуйте взглянуть на Sega Master System и Game Gear эмуляторы (я уверен, что некоторые из них с открытым исходным кодом). Эти консоли имеют Z80 как CPU, и ZX Spectrum использовал его тоже,http://www.worldofspectrum.org/emulators.html.
Я узнал все, что знаю о сборке Z80 и калькулятора прямо здесь:http://www.ticalc.org/programming/