写在C或C图形Z80模拟器++ [关闭](Writing a graphical Z80 emula

2019-06-27 11:18发布

我想在写我自己的简单模拟器的兴趣Z80处理器。 我有这种类型的节目的经验。 我主要是使用基于C的语言,因为他们是我最熟悉的那些罚款。

我需要做什么来实现这一点,有一些什么好的教程/引用,可以帮助我在这个项目?

我也想对编码ROM倾销申请我的教程TI-84 +计算器,所以我可以使用它的ROM与这个模拟器。

Answer 1:

也许通过看这些开始:

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

Z80文档

未记录的文件化Z80 v0.91 (PDF)

完整的Z80指令参考

Z80微处理器指令集汇总



Answer 2:

这是一个有点顺路的,但既然你说你有这种类型的节目没有经验,你可能希望通过建立在一个仿真程序启动通用虚拟机从2006年ICFP编程大赛 。 这是需要有经验的程序员90分钟的任务,但很多球队没有任何经验,能够完成它在几天之内。 当您完成模拟器它解锁了一堆有趣的东西,你解决Z80之前它可能是一个很好的热身。



Answer 3:

有些事情要增加(尤其是Z80):

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

    我还没有看到任何错误不包括这里提到的那些。

  2. 正确的测试错误的CPU核心

    它将为您节省许多麻烦和混乱之后。

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

  1. 步进/追踪针对已知码 (通常说明ROM拆卸)

    这是第一步时没有什么作品呢。 你会看到严重的(de)编码指令。

  2. 包括在你的仿真器和过程的一切,双模拟不同的Z80内核

    让两个“分离”的模拟器相同步进,追踪,和运行系统。 两个CPU都应该有自己的存储硬件等

    • 运行仿真器,并且每个指令之后比较寄存器和立即存储器位置等[hl],[sp],[sp-1] ...
    • 在第一个差异停下来看看指令造成的。
      调试和继续下去,直到你是“无缺陷”。 当心第二个核心也可以越野车所以请谨慎进行调试。
  3. 当你更多的运行能够使用的核心测试仪

    使用ZEXALL健身器 。 这是Z80的最佳(至少从我的经验)。 它帮助我非常多的东西(我的核心现在是100%ZEXALL兼容)。 所以,中间有没有bug这违反了真正的硬件来完成。 这是一个从CP / M这样一些版本需要64K RAM模式下运行。 不同的OS / ROM或任何可能会导致内存访问一些指令失败,所以对于那些你需要找到纠正的CRC或与之比较的实际硬件。

    例如,生ZEXALL失败很多事情上ZX频谱 (因为它是为MSX64K RAM,而不ROM完成),但也有真正的ZX频谱进行版本和他们在ZX谱 100% 确定 (和我的模拟器太: ))

     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频谱有许多漂浮总线,中断和屏幕测试。 对于TI我不知道...(我不是一个TI计算器用户)

BTW:它怎么与你的模拟器去? (你做完了吗?)

指令系统

我会复制我的指令,在这里设置,但它具有1792线和121 KB,所以它不会放入一个30 KB的限制。 相反,你可以在这个答案我的下载链接找到它

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

它包含与正确OP码,编码定时与机器周期“所有” ZX指令。 我花了几年放在一起的所有文件,所以我正确地传递ZEXALL 100%。 我的仿真器加载此(1792指令)的文本文件,以在核心init和配置在运行时的指令解码器和处理器,所以我能够改变的事情,实在是快,很简单(如果检测到错误)......它救了我大量的时间。



Answer 4:

米奇是完全正确的。 通过了解处理器开始。 然后,通过编写代码来实现具体的说明了一下周围玩耍。 使用C ++此,顺便说一句,不C,或处理器的概念将不会映射到类在你的代码。

在执行指令的过程中,你会发现你需要定义类的标志的东西,并且指令指针。 这应该最终获得您可以在您需要实现内存模型,甚至是I / O模型。

你会最终要弄清楚如何代码和数据加载到内存中,也许如何转储它回到磁盘。

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



Answer 5:

你似乎想要一个模拟器比处理器多,而且是一个完整的机器。 您还可以模拟硬件的其余部分,并找到该文件很可能是更艰巨的任务等着你的任务。

根据你的目标,你可能要开始与Z80已经存在的模拟器。 快速搜索给出了一些人,但没有模拟器TI-84。 SIMH ,对旧电脑仿真的框架有已经是Z80处理器的仿真,增加硬件的其余部分的仿真应该比从头开始更容易。 即使你不走这条路,也有一些设计文件存在,可以帮助你。



Answer 6:

我建议你考虑写一个仿真器一个稍微简单一些,但相关的CPU,启动8080 。 在Z80其实是相当复杂的(多字节指令,更多的寻址方式,变址寄存器等),而8080的指令是很容易解码(你可以使用256条目查找表,作为第一级解决方案) 。

所有的代码编写控制程序(显示,数据录入,内存转储等),应可重复使用的,如果你再决定去尝试的Z80,实际上你应该设计到模拟处理器的用户界面-独立。



Answer 7:

尝试看看世嘉主系统和游戏齿轮仿真器(我敢肯定,有些是开源的)。 这些游戏机有Z80作为CPU,和ZX频谱使用它太, http://www.worldofspectrum.org/emulators.html 。



Answer 8:

我学会了所有我知道的Z80和计算器集会的权利在这里: http://www.ticalc.org/programming/



文章来源: Writing a graphical Z80 emulator in C or C++ [closed]