我想要兴趣在写我自己简单的模拟器 Z80 处理器。我已经毫无经验的这类程序。我大多没有使用C-基于语言为他们是我知道最好的。

我需要做什么来完成这和什么是一些良好的教程/文献可以帮助我这个项目?

我还喜欢一个教程编码ROM倾销的应用对于我的 TI-84加 计算这样我就可以使用其ROM用这种模拟器。

有帮助吗?

解决方案

或许首先看看这些:

可在此处找到一个好的教程:独立的Z80组装指南

Z80文档

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

完整的Z80指令参考

Z80微处理器指令集摘要

其他提示

这是一次侧面旅行,但是既然你说你没有这种编程的经验,你可能想要为 2006年ICFP编程大赛的/um-spec.txt“rel =”noreferrer“>通用虚拟机 。这项任务需要有经验的程序员90分钟,但许多没有经验的团队能够在几天内完成它。当你完成模拟器时,它解锁了一堆有趣的东西,在你解决Z80之前它可能是一个很好的热身。

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

  1. 不信任的文件是100%的免费的错误

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

  2. 测试你的CPU核对错误的正确

    它将保存你从多头痛的问题和混乱之后。

用于测试我使用的三种方法:

  1. 踏/跟踪的已知代码 (般评论ROM拆)

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

  2. 包括不同的Z80核心,在你的仿真程序和过程的一切,因为双仿真的

    使两个人分离的'模拟器同步进、跟踪和运行的系统。两者的Cpu应该有它自己的存储器硬件,等等。

    My dual emulator example

    • 运行模拟器和之后各个比较的指令寄存器和瞬时记忆的地点像 [hl],[sp],[sp-1]...
    • 在第一个差别停下来看看有什么指令而引起的。
      调试和继续下去,直到你有错误的自由'。要注意的第二个核心可以也越野车那么调试谨慎。
  3. 当你更运行,能够使用核测试仪

    使用 ZEXALL锻炼.这是最好的 Z80 (至少从我的经验)。它帮助了我很多东西(我的核心现在是100%ZEXALL兼容)。它完成了对真正的硬件,所以不会有任何错误。这是从 CP/M 因此,一些版本需要 64K RAM模式 运行。不同的 OS/ROM 或任何可能导致某些指令的记忆访问失败,因此,对于那些你需要找到正的社区康复中心或比较对真正的硬件。

    例如,原 ZEXALL 失败很多事情上 ZX谱 (作为这样做是为了 MSX64K RAM 没有 ROM),但有版本所做的真的 ZX谱 他们都是100% "确定"ZX谱 (而我的仿真太:))

    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 仿真花了周围 30-60 分来完成。它需要按一个关键的滚动几次...

    如果你需要一个竞争的模式,添加适当的测试。然后找到一个。对于 ZX谱 有很多浮动旅,中断和视测试。对于 TI 我不知道...(我不是一个 TI 计算器用户)

顺便说一句: 怎么去你的仿真器?(你做了吗?)

指示设置

我会复我的指令集在这里,但它具有1792线和121KB,因此它将不适合成为一个30KB的限制。而不是你可以找到它在下载链接在这个回答我

它包含了"所有" ZX 说明正确的 OP 代码、编码的时机和机器周期。我花了几年中放在一起所有的文档,所以我穿 ZEXALL100% 正确。我的仿真器载荷本(1792指令)文本文件的核心上 init 和配置的指令解码器和处理器在运行时,我是能够改变事情真的快速和足够简单的(如果错误是检测到的)...它救了我一个 很多 时间。

米奇是完全正确的。首先要了解处理器。然后通过编写代码来实现特定指令。使用C ++,BTW,而不是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 /编程/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top