我想对为Z80处理器编写自己的简单仿真器感兴趣。我对这种类型的编程没有经验。我最擅长使用基于 C 的语言,因为它们是我最了解的语言。
我需要什么来完成这项工作,有哪些好的教程/参考资料可以帮助我完成这个项目?
我还想要一个为我的TI-84 Plus计算器编写 ROM 转储应用程序的教程,这样我就可以在这个模拟器中使用它的 ROM。
这有点偏题,但既然你说你没有这种类型的编程经验,你可能想从为2006 年 ICFP 编程竞赛的通用虚拟机构建一个模拟器开始。这是一个需要经验丰富的程序员 90 分钟完成的任务,但许多没有经验的团队能够在几天内完成。当你完成模拟器后,它会解锁一堆有趣的东西,在你处理 Z80 之前它可能是一个很好的热身。
一些需要补充的东西(尤其是 Z80):
不要相信文档是 100% 没有错误的
我没有看到任何没有错误,包括这里提到的错误。
正确测试您的 CPU 内核是否存在错误
它将使您免于以后的许多头痛和困惑。
对于测试,我使用三种方法:
对已知代码进行步进/跟踪(通常注释为 ROM 反汇编)
这是还没有任何效果的第一步。您将看到错误(解码)编码的指令。
在您的仿真器中包含不同的 Z80 内核,并将所有内容作为双重仿真处理
制作两个具有相同步进、跟踪和运行系统的“分离”仿真器。两个 CPU 都应该有自己的内存硬件等。
[hl],[sp],[sp-1]
...当您更易于运行时,请使用核心测试仪
使用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
米奇是完全正确的。从了解处理器开始。然后通过编写代码来实现特定指令来玩一下。为此使用 C++,顺便说一句,而不是 C,否则处理器的概念将不会映射到代码中的类。
在执行指令的过程中,您会发现需要定义标志和指令指针等内容。这最终会让您到达需要实现内存模型甚至 I/O 模型的地方。
您最终必须弄清楚如何将代码和数据加载到内存中,以及如何将其转储回磁盘。
只有这样,您才需要在给定的指令指针处模拟加载到内存中的代码的执行。
尝试看看 Sega Master System 和 Game Gear 模拟器(我很确定其中一些是开源的)。这些控制台有一个 Z80 作为 CPU, ZX Spectrum也使用它,http://www.worldofspectrum.org/emulators.html。
您似乎想要的模拟器不仅仅是一个处理器,而是一台完整的机器。您还将承担模拟其余硬件的任务,而查找相关文档很可能是等待您完成的更困难的任务。
根据您的目标,您可能希望从现有的 Z80 模拟器开始。快速搜索给出了其中的几个,但没有 TI-84 的仿真器。 simh,旧计算机仿真的框架已经具有 Z80 处理器的仿真,添加其余硬件的仿真应该比从头开始更容易。即使你不走那条路,那里也有一些设计文件可以帮助你。
我建议您考虑首先为稍微简单但相关的 CPU 编写一个模拟器,即8080。Z80 实际上相当复杂(多字节指令、更多寻址模式、索引寄存器等),而 8080 指令非常容易解码(您可以使用 256 项查找表,作为一阶解决方案) .
如果您决定继续尝试 Z80,您为控制程序而编写的所有代码(显示、数据输入、内存转储等)都应该是可重复使用的,并且确实应该将用户界面设计为模拟处理器-独立的。
我在这里了解了有关 Z80 和计算器组件的所有信息:http: //www.ticalc.org/programming/