Написание графического эмулятора Z80 на C или C ++ [закрыто]

StackOverflow https://stackoverflow.com/questions/1215777

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Что мне нужно для достижения этого и какие есть хорошие учебные пособия / ссылки, которые могли бы помочь мне в этом проекте?

Мне также хотелось бы получить руководство по кодированию приложения для сброса ПЗУ для моего TI-84 Плюс калькулятор, чтобы я мог использовать его ПЗУ с этим эмулятором.

Это было полезно?

Другие советы

Некоторые вещи, которые нужно добавить (особенно для Z80):

  1. Не доверяйте документации, она на 100% свободна от ошибок

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

  2. Правильно проверьте ядро вашего процессора на наличие ошибок

    Позже это избавит вас от многих головных болей и замешательства.

Для тестирования я использую три подхода:

  1. Пошаговое выполнение / трассировка по известному коду (обычно комментируемая разборка ПЗУ)

    Это первый шаг, когда еще ничего не работает.Вы увидите плохо (де) закодированные инструкции.

  2. Включите в свой эмулятор разные ядра Z80 и обработайте все как двойную эмуляцию

    Создайте два "отдельных" эмулятора с одинаковой системой пошагового управления, трассировки и запуска.Оба процессора должны иметь собственную аппаратную память и т.д.

    My dual emulator example

    • Запустите эмулятор и после каждой инструкции сравнивайте регистры и непосредственные ячейки памяти, такие как [hl],[sp],[sp-1]...
    • При первом же различии остановитесь и посмотрите, какая инструкция вызвала его.
      Отладьте его и продолжайте до тех пор, пока не будете "свободны от ошибок".Имейте в виду, что второе ядро также может глючить, поэтому выполняйте отладку с осторожностью.
  3. Когда вы будете более работоспособны, используйте 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 / программирование /

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top