用C或C ++编写图形化Z80仿真器

时间:2009-08-01 03:42:47

标签: c++ c emulation z80

我想有兴趣为Z80处理器编写自己的简单模拟器。我对这种类型的编程没有经验。使用基于C语言的我很好,因为他们是我最熟悉的语言。

我需要做些什么以及哪些好的教程/参考资料可以帮助我完成这个项目?

我还想要一个为我的TI-84 Plus计算器编写ROM转储应用程序的教程,这样我就可以将它的ROM用于这个模拟器。

8 个答案:

答案 0 :(得分:16)

这是一次侧面旅行,但由于您说您没有使用此类编程的经验,您可能需要从Universal Virtual Machine2006 ICFP programming contest构建模拟器。这项任务需要有经验的程序员90分钟,但许多没有经验的团队能够在几天内完成它。当你完成模拟器时,它解锁了一堆有趣的东西,在你解决Z80之前它可能是一个很好的热身。

答案 1 :(得分:14)

答案 2 :(得分:8)

要添加的一些内容(特别是对于Z80):

  1. 不要相信文档是100%无错误的

    我没有看到任何没有错误,包括这里提到的错误。

  2. 正确测试您的CPU核心

    它可以让你免于许多头痛和困惑。

  3. 为了测试,我使用了三种方法:

    1. 对已知代码进行步进/跟踪(通常是注释ROM反汇编)

      这是没有任何作用的第一步。您将看到严格(解)编码的指令。

    2. 在您的模拟器中包含不同的Z80内核并将所有内容作为双重模拟进行处理

      使用相同的步进,跟踪和运行系统制作两个“分离的”模拟器。两个CPU都应该有自己的内存硬件等。

      My dual emulator example

      • 运行仿真器,并在每条指令比较寄存器和直接存储器位置,如[hl],[sp],[sp-1] ...
      • 在第一个差异停止,看看是什么指示导致它。
        调试它并继续,直到你“无错误”。当心第二个核心也可能有问题,所以请谨慎调试。
    3. 当你更可运行时使用核心测试人员

      使用ZEXALL Exerciser。这是 Z80 的最佳选择(至少从我的经验来看)。它帮助了我很多东西(我的核心现在是100%与ZEXALL兼容)。这是针对真实硬件完成的,因此没有错误。它来自 CP/M ,因此某些版本需要 64K RAM模式才能运行。不同的 OS / ROM 或任何可能导致某些内存访问指令失败的内容,因此对于那些需要找到更正的CRC或与真实硬件进行比较的人。

      例如,原始 ZEXALL ZX Spectrum 上失败很多(因为它是针对 MSX 64K RAM strong>没有 ROM ),但有真正 ZX Spectrum 的版本, ZX Spectrum 100%确定 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 ,请注意它是非常详尽的测试,并且〜50MHz 仿真 IIRC 它需要{{1最小化完成。它需要按一个键才能滚动几次......

      如果您需要争用模型,请添加适当的测试。然后找一个。对于 ZX Spectrum ,有许多浮动总线,中断和屏幕测试器。对于 TI 我不知道......(我不是 TI 计算器用户)

    4. BTW:你的模拟器怎么样? (你做过吗?)

      指令集

      我会复制我的指令集,但它有1792行和121 KB,所以它不符合30 KB的限制。相反,你可以在我的这个答案的下载链接中找到它

      它包含带有正确 OP 代码,编码时序和机器周期的“全部” ZX 指令。我花了几年的时间来整理所有文档,所以我正确地传递了 ZEXALL 100%。我的模拟器将此(1792指令)文本文件加载到30-60上的核心并在运行时配置指令解码器和处理器,因此我能够非常快速和简单地更改内容(如果检测到错误)...它为我节省了很多时间。

答案 3 :(得分:5)

米奇是完全正确的。首先要了解处理器。然后通过编写代码来实现特定指令。使用C ++,BTW,而不是C,或者处理器的概念不会映射到代码中的类。

在实现指令的过程中,您会发现需要定义标志和指令指针之类的内容。这应该最终将您带到您需要实现内存模型的位置,甚至是I / O模型。

您最终必须弄清楚如何将代码和数据加载到内存中,以及如何将其转储回磁盘。

只有这样才能在给定的指令指针处模拟执行加载到内存中的代码。

答案 4 :(得分:3)

你似乎想要一个超过处理器的模拟器,但是对于一台完整的机器。您还需要模拟其余硬件,找到相关文档可能是等待您的更困难的任务。

根据您的目标,您可能希望从已存在的Z80仿真器开始。快速搜索提供了几个,但没有TI-84的模拟器。 simh,旧计算机仿真的框架已经模拟了Z80处理器,添加其余硬件的仿真应该比从头开始更容易。即使你不走那条路,也有一些可以帮助你的设计文件。

答案 5 :(得分:3)

我建议你考虑首先为一个稍微简单但相关的CPU 8080编写一个模拟器。 Z80实际上相当复杂(多字节指令,更多寻址模式,索引寄存器等),而8080指令非常容易解码(您可以使用256条目查找表,作为一阶解决方案) 。

如果您决定继续尝试使用Z80,那么您编写的用于控制程序(显示,数据输入,内存转储等)的所有代码都应该是可重用的,实际上您应该将用户界面设计为模拟处理器无关。

答案 6 :(得分:3)

试着看一下Sega Master System和Game Gear模拟器(我很确定有些是开源的)。那些控制台有一个Z80作为CPU,和 ZX Spectrum也使用了http://www.worldofspectrum.org/emulators.html

答案 7 :(得分:2)

我在这里了解了所有关于Z80和计算器装配的知识:http://www.ticalc.org/programming/