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

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

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

我还想要一个为我的TI-84 Plus计算器编写ROM转储应用程序的教程,这样我就可以在这个仿真器中使用它的ROM。

或许首先看一下这些:

这里有一个很好的教程: 独立的Z80assembly指南

Z80文件

未记载的Z80文献v0.91 (pdf)

完整的Z80指令参考

Z80微处理器指令集汇总

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

一些要添加的东西(特别是对于Z80):

  1. 不要相信文档是100%无bug

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

  2. 正确测试CPU核心是否存在错误

    它将为您免除许多麻烦和以后的困惑。

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

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

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

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

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

    我的双仿真器示例

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

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

    例如,原始ZEXALLZX Spectrum上失败了许多东西(因为它是针对MSX和没有ROM的 64K RAM完成的),但是有真正的ZX Spectrum完成的版本,它们在ZX Spectrum上是100% 正常的 (在我的模拟器上也是如此: ))

     Z80all instruction exerciser  hl,...OK add hl,.........OK add ix,.........OK add iy,.........OK aluop a,nn...................OK aluop a,.OK aluop a,....OK aluop a,(+1)..........OK bit n,(+1)............OK bit n,...OK cpd.......................OK cpi.......................OK ............OK  a..................OK  b..................OK  bc.................OK  c..................OK  d..................OK  de.................OK  e..................OK  h..................OK  hl.................OK  ix.................OK  iy.................OK  l..................OK  (hl)...............OK  sp.................OK  (+1)........OK  ixh................OK  ixl................OK  iyh...............OK  iyl................OK ld ,(nnnn)............OK ld hl,(nnnn).................OK ld sp,(nnnn).................OK ld ,(nnnn)............OK ld (nnnn),............OK ld (nnnn),hl.................OK ld (nnnn),sp.................OK ld (nnnn),............OK ld ,nnnn........OK ld ,nnnn..............OK ld a,<(bc),(de)>.............OK ld ,nn...OK ld (+1),nn............OK ld ,(+1).....OK ld ,(+1).........OK ld a,(+1).............OK ld ,nn......OK ld ,.......OK ld ,.......OK ld a,(nnnn) / ld (nnnn),a....OK ldd (1)...................OK ldd (2)...................OK ldi (1)...................OK ldi (2)...................OK neg..........................OK ....................OK ..........OK shf/rot (+1)..........OK shf/rot .OK  n,....OK  n,(+1)......OK ld (+1),.....OK ld (+1),.........OK ld (+1),a.............OK ld (),a...............OK Tests complete 

    如果您即将使用ZEXALL,请注意它是非常详尽的测试和IIRC~50MHz仿真上需要大约30-60分钟才能完成。 它需要按一个键才能滚动几次……

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

顺便说一句:你的模拟器怎么样? (你做完了吗?)

指令系统

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

  • 什么是硬件仿真的正确实现 。

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

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

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

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

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

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

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

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

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

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

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