Gameboy(z80)操作码用途

时间:2014-10-17 02:10:53

标签: emulation opcode z80 gameboy

我一直在研究Gameboy模拟器,我注意到存在一些永远不会改变任何值的操作码,例如LD A, ALD B, B等等。 AND A。第一个显然没有改变任何东西,因为它们将寄存器的值加载到相同的寄存器中,并且由于AND正在与A寄存器进行比较,AND A将始终返回{ {1}}。这些操作是否有任何目的,或者在每个循环后与A基本相同?

3 个答案:

答案 0 :(得分: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'    |
        -------------------------------

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

 -----------
| BIT | REG |
 -----------
| 111 |  A  |
 -----------
| 000 |  B  |
 -----------
| 001 |  C  |
 -----------
| 010 |  D  |
 -----------
| 011 |  E  |
 -----------
| 100 |  H  |
 -----------
| 101 |  L  |
 -----------

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

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

请注意加载LD A,ALD B,BLD C,CLD D,DLD E,ELD H,H和{{1}等说明表现得像LD L,L。但是NOPAND A 不要的行为与OR A相同,因为它们会影响标记寄存器,并且它们的执行可能会改变内部机器状态。

答案 1 :(得分:6)

LD A,AAND A等指令似乎可能是NOP,但它们也可能会更改处理器标志并用于测试寄存器的值。

请务必仔细检查说明书文档以了解此类副作用。

答案 2 :(得分:2)

实际上是AND A(以及OR A)指令的目的 - 当Z为零时,它会设置标记A否则就会清除。因此,AND AOR A经常用于此目的。