14

我想对为Z80处理器编写自己的简单仿真器感兴趣。我对这种类型的编程没有经验。我最擅长使用基于 C 的语言,因为它们是我最了解的语言。

我需要什么来完成这项工作,有哪些好的教程/参考资料可以帮助我完成这个项目?

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

4

8 回答 8

17

这有点偏题,但既然你说你没有这种类型的编程经验,你可能想从为2006 年 ICFP 编程竞赛的通用虚拟机构建一个模拟器开始。这是一个需要经验丰富的程序员 90 分钟完成的任务,但许多没有经验的团队能够在几天内完成。当你完成模拟器后,它会解锁一堆有趣的东西,在你处理 Z80 之前它可能是一个很好的热身。

于 2009-08-01T04:58:51.780 回答
16

也许从看看这些开始:

一个很好的教程可以在这里找到:独立 Z80 组装指南

Z80 文档

无证 Z80 有证 v0.91 (pdf)

完整的 Z80 指令参考

Z80微处理器指令集总结

于 2009-08-01T03:47:13.813 回答
12

一些需要补充的东西(尤其是 Z80):

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

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

  2. 正确测试您的 CPU 内核是否存在错误

    它将使您免于以后的许多头痛和困惑。

对于测试,我使用三种方法:

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

    这是还没有任何效果的第一步。您将看到错误(解码)编码的指令。

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

    制作两个具有相同步进、跟踪和运行系统的“分离”仿真器。两个 CPU 都应该有自己的内存硬件等。

    我的双模拟器示例

    • 运行模拟器并在每条指令之后比较寄存器和立即内存位置,例如[hl],[sp],[sp-1]...
    • 在第一个差异停止,看看是什么指令导致它。
      调试它并继续,直到你“没有错误”。注意第二个核心也可能有问题,因此请谨慎调试。
  3. 当您更易于运行时,请使用核心测试仪

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

    例如,原始ZEXALL在ZX Spectrum上失败了很多事情(就像它在MSX和没有ROM的64K RAM上所做的那样),但是有一些版本是为真正的ZX Spectrum完成的,它们在ZX Spectrum上是 100% OK的(在我的模拟器上也是: ))

    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~50MHz仿真上大约需要几分钟30-60才能完成。它需要按一个键滚动几次......

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

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

指令系统

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

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

于 2013-10-07T07:15:00.317 回答
5

米奇是完全正确的。从了解处理器开始。然后通过编写代码来实现特定指令来玩一下。为此使用 C++,顺便说一句,而不是 C,否则处理器的概念将不会映射到代码中的类。

在执行指令的过程中,您会发现需要定义标志和指令指针等内容。这最终会让您到达需要实现内存模型甚至 I/O 模型的地方。

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

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

于 2009-08-01T03:53:50.350 回答
4

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

于 2009-08-01T12:47:49.090 回答
3

您似乎想要的模拟器不仅仅是一个处理器,而是一台完整的机器。您还将承担模拟其余硬件的任务,而查找相关文档很可能是等待您完成的更困难的任务。

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

于 2009-08-01T08:20:13.667 回答
3

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

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

于 2009-08-01T08:29:41.353 回答
2

我在这里了解了有关 Z80 和计算器组件的所有信息:http: //www.ticalc.org/programming/

于 2012-12-13T17:49:58.647 回答