Gameboy(z80)操作码用途

Zac*_*ier 8 z80 emulation opcode gameboy

我一直工作在一个游戏机模拟器,和我注意到,有一定的操作码存在是永远不会改变的任何值,如LD A, A,LD B, B等,并且还AND A.第一个显然不会改变任何东西,因为它们将寄存器的值加载到相同的寄存器中,并且由于将ANDA寄存器进行比较,因此AND A将始终返回A.这些操作有什么用途,或者与NOP每个循环后的操作基本相同?

Gab*_*iro 10

正如Jeffrey BosboomHans Passant在评论中指出的那样,原因很简单.更具体地说,硬件简单

LD r,r'指令将源寄存器(r')的内容复制到目标寄存器(r).LD r,r'操作码遵循以下形式:

        -------------------------------
BIT    | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
        -------------------------------
OPCODE | 0 | 1 |     r     |     r'    |
        -------------------------------
Run Code Online (Sandbox Code Playgroud)

目标和源寄存器可以采用以下值:

 -----------
| BIT | REG |
 -----------
| 111 |  A  |
 -----------
| 000 |  B  |
 -----------
| 001 |  C  |
 -----------
| 010 |  D  |
 -----------
| 011 |  E  |
 -----------
| 100 |  H  |
 -----------
| 101 |  L  |
 -----------
Run Code Online (Sandbox Code Playgroud)

为了在硬件中实现这些指令,我们只需要一个接收位0-2来选择源寄存器的多路复用器和另一个接收位3-5以选择目标寄存器的多路复用器.

如果要验证位0-2和位3-5是否指向同一寄存器,则必须向CPU添加更多逻辑.众所周知,80年代的资源更加有限:P

请注意,加载指令,例如LD A,A,LD B,B,LD C,C,LD D,D,LD E,E,LD H,H,和LD L,L行为像NOP.但是,AND A并且OR A 不要表现NOP,因为它们会影响标志寄存器,并且它们的执行可能会改变内部机器状态.

  • 从软件角度来看,很容易忽略原始系统上必须具备的硬件.正是我在寻找,谢谢. (3认同)

HBP*_*HBP 6

类似LD A,AAND A可能看起来像NOPs的指令但它们也可能改变处理器标志并用于测试寄存器的值.

请务必仔细检查指令集文档以了解此类副作用.