Написание графического эмулятора Z80 в C или С++

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

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

Мне также понравился учебник по кодированию приложения для дискретизации для моего TI-84 Plus, поэтому я могу использовать его ROM с этот эмулятор.

Ответ 2

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

Ответ 3

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

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

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

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

    Это избавит вас от многих головных болей и путаницы позже.

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

  • Шаг/трассировка с известным кодом (обычно комментируется разбор ROM)

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

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

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

    Мой пример с двумя эмуляторами

    • Запустите эмулятор и после каждой команды сравните регистры и оперативные ячейки памяти, например [hl],[sp],[sp-1]...
    • При первой остановке разницы и посмотрите, какая инструкция вызвала ее.
      Отлаживайте его и продолжайте, пока не будете "без ошибок". Остерегайтесь, что второе ядро ​​может быть также ошибочным, поэтому отлаживайте его с осторожностью.
  • Если вы используете более опытный тестер ядра

    Используйте ZEXALL Exerciser. Это лучшее из Z80 (по крайней мере, по моему опыту). Это помогло мне с очень многими вещами (мой ядро ​​теперь на 100% совместим с ZEXALL). Это сделано против реального оборудования, поэтому в нем нет ошибок. Это от CP/M, поэтому для некоторых версий требуется режим 64K RAM. Различные ОС/ПЗУ или все, что может привести к сбоям некоторых инструкций с доступом к памяти, поэтому для тех, кому нужно найти исправленные CRC или сравнить с реальным оборудованием.

    Например, raw ZEXALL не может выполнить много вещей в ZX Spectrum (как это делается для MSX и 64 КБ ОЗУ strong > без ROM), но существуют версии для реального ZX Spectrum, и они на 100% ОК на ZX Spectrum strong > (и на моем эмуляторе тоже:))

    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 Spectrum существует множество плавающих шинных, прерывистых и экранных тестеров. Для TI я понятия не имею... (я не пользователь TI)

BTW: Как прошло с вашим эмулятором? (Вы сделали это?)

Набор инструкций

Я бы скопировал здесь свой набор команд, но он имеет 1792 строки и 121 KB, поэтому он не будет вписываться в 30-килобайтный лимит. Вместо этого вы можете найти его в ссылке для загрузки в этом ответе моей

Он содержит инструкции "все" ZX с правильными кодами OP, временем кодирования и машинными циклами. Мне потребовалось несколько лет, чтобы собрать всю документацию, поэтому я правильно передаю ZEXALL 100%. Мой эмулятор загружает текстовый файл инструкции (1792) в ядро ​​на init и настраивает декодер команд и процессор во время выполнения, поэтому я смог быстро и просто изменить ситуацию (если обнаружена ошибка)... спас меня лот.

Ответ 4

Митч абсолютно прав. Начните с понимания процессора. Затем немного поиграйте, написав код для реализации определенных инструкций. Используйте С++ для этого, BTW, а не C, или концепции процессора не будут сопоставляться с классами в вашем коде.

В процессе выполнения инструкций вы обнаружите, что вам нужно определить такие вещи, как флаги, и указатель команд. Это должно в конечном итоге привести вас к тому, где вам нужно реализовать модель памяти и даже модель ввода-вывода.

В конечном итоге вам придется выяснить, как загружать код и данные в память, и, возможно, как выгрузить его обратно на диск.

Только тогда вам нужно перейти к эмуляции выполнения кода, загруженного в память, с помощью указателя инструкции.

Ответ 5

Кажется, вам нужен эмулятор для более чем процессора, но для полной машины. У вас также будет задача подражать остальной части аппаратного обеспечения, и найти документацию для этого может оказаться более сложной задачей, ожидающей вас.

В зависимости от вашей цели вы можете начать с уже существующего эмулятора для Z80. Быстрый поиск дает несколько из них, но нет эмулятора для TI-84. simh, в среде эмуляции старых компьютеров уже есть эмуляция процессора Z80, добавление эмуляции остальной части вашего оборудования должно быть проще чем начинать с нуля. Даже если вы не идете по этой дороге, там есть некоторые проектные документы, которые могли бы вам помочь.

Ответ 6

Я бы посоветовал вам начать с написания эмулятора для немного более простого, но связанного с ним процессора, 8080. Z80 на самом деле довольно сложный (многобайтовые команды, режимы адресации, индексные регистры и т.д.), Тогда как 8080 команд очень легко декодировать (вы можете просто использовать таблицу поиска по 256 записей, как решение первого порядка),

Весь код, который вы пишете для управления программой (отображение, ввод данных, дампы памяти и т.д.), должен быть повторно использован, если вы затем решите продолжить работу над Z80, и действительно, вы должны разработать интерфейс пользователя для быть смоделированным независимо от процессора.

Ответ 7

Попытайтесь взглянуть на эмуляторы Sega Master System и Game Gear (я уверен, что некоторые из них с открытым исходным кодом). Эти консоли имеют Z80 как CPU, и ZX Spectrum также использовал его, http://www.worldofspectrum.org/emulators.html.