Spo*_*oze 12 memory assembly z80 emulation gameboy
在查看Gameboy的指令集时,我遇到了如下指令:
LD A, A
LD B, B
LD C, C
LD D, D
...
Run Code Online (Sandbox Code Playgroud)
每条指令中有自己的操作码此表,这让我觉得他们是一些重要的,由于可能的操作码的数量限制.
我首先想到它可能是在该寄存器中取消引用指针并将值存储在该指针处(就像在这个问题中一样),但是在模拟器中,LD A, A实现为:
Z80._r.a = Z80._r.a
Run Code Online (Sandbox Code Playgroud)
它们似乎对处理器的状态没有影响(只是将寄存器设置为它们自己的值)并且NOP执行与a相同的周期数.
为什么这些操作码包含在指令集中,它们的用途是什么?
Ped*_*d7g 13
如果您要检查,它们会简化解码单元
7F LD A,A
78 LD A,B
79 LD A,C
Run Code Online (Sandbox Code Playgroud)
VS
47 LD B,A
40 LD B,B
41 LD B,C
Run Code Online (Sandbox Code Playgroud)
VS
4F LD C,A
48 LD C,B
49 LD C,C
Run Code Online (Sandbox Code Playgroud)
您可以注意到,底部的3位是为源寄存器保留的(值为0到7 B,C,D,E,H,L,(HL),A),它们旁边的3位是目标寄存器,再次具有相同的0-7含义(因此0对0创建LD B,B),并且顶部两位01选择LD,不确定从快速浏览一下我是否完美地破译了它.
人们也期望再76要LD (HL),(HL),这使得比意义更小LD A,A,所以有特殊的逻辑来赶上一个做HALT代替.
因此,这是关于指令解码器的简单性,使用相同的位模式来选择源/目标寄存器,以及不会添加更多的晶体管来捕捉same,same情况,除了(HL),(HL)(可能在源和目标都需要内存访问的内部失败,所以也许硬件设计中额外的"逻辑"相当简单.
请记住,早期的CPU通常是手工设计的,并且总晶体管的数量必须保持在低水平以适应芯片,并且可以自由地绘制电路并验证其正确性.
编辑:Z80有大约8500个晶体管,您可能需要检查:https://en.wikipedia.org/wiki/Transistor_count和https://en.wikipedia.org/wiki/Zilog_Z80 ...而且GameBoy有一点修改了Z80,但总晶体管的数量将与原始值非常接近,虽然我没有搜索确切的值,但我不确定任天堂在未来的延伸范围内,也许他们可以甚至可以承受20-50k这样的东西,但我对此表示怀疑.
附录:最近我读到了俄罗斯Sinclair ZX Spectrum克隆,它们是经过大量修改的机器,增加了额外的功率,内存和功能......而且其中一些使用这些ld same,same操作码来控制DMA传输,所以在这些机器上使用它们的代码因为nop可能无法正确执行.这不是与GameBoy相关的,但是如果您有二进制目标"Sprinter"或类似的俄罗斯ZX克隆之一,并且您在反汇编中找到其中一个,不要自动考虑它们nop,它们可能是实际执行的有效代码的一部分某事(很可能是DMA).
这些好奇的NOP指令一直回到Intel 8008的原始祖先处理器.在该芯片中,它们仅仅是寄存器移动指令实现的结果.允许MOV A,A等简化了指令解码器并节省了硅空间.
从8080到Z80(以及更高版本),这些都需要保持向后兼容性.他们甚至以形式存在于x86世界中
MOV AL,AL等
所以大多数现代台式机仍然支持这些奇怪的指令.
注意:我在描述Intel机器时使用了Intel助记符.请放心,这些组装成与Zilog助记符相同的二进制代码.
| 归档时间: |
|
| 查看次数: |
524 次 |
| 最近记录: |