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

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

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

Я также хотел бы учебник для кодирования приложения ROM-dumping для my TI-84 Plus калькулятор, чтобы я мог использовать его ROM с этим эмулятором.

8 ответов



Это немного боковая поездка, но поскольку вы говорите, что у вас нет опыта работы с этим типом программирования, вы можете начать с создания эмулятора для Универсальная Виртуальная Машина С конкурс программирования ICFP 2006. Это задача, которая занимает у опытного программиста 90 минут, но многие команды без опыта смогли выполнить ее за несколько дней. Когда вы закончите эмулятор, он разблокирует кучу забавных вещей, и это может быть хорошая разминка прежде чем взяться за Z80.


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

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

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

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

    Это избавит вас от многих головных болей и затруднений в будущем.

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

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

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

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

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

    My dual emulator example

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