Gameboy ~Z80处理器中指令LD A,(C)的长度是多少?

11

你好,我正在写一款Game Boy模拟器。

我使用了这个参考文献:Gameboy CPU (LR35902) 指令集

这份文档指出以下操作码:

0xE2 LD (C),A

0xF2 LD A,(C)

长度为2。

Game Boy CPU 手册 中提到这些指令:

将寄存器 C 中的地址 $FF00 加上值放入寄存器 A 中。

将寄存器 A 的值放入地址 $FF00 + 寄存器 C 中。

我认为它的长度为1,因为操作码本身已经足够解释该指令。如果长度为2,第二个字节有什么用呢?


你为什么这样想? - Blorgbeard
该图表显示指令为8位。我没有任何理由怀疑。 - Malcolm McLean
所有的来源都说是2个字节,但没有一个说明第二个字节用于什么。Gbemulator源代码中没有使用它做任何事情,所以可能是未定义的,只是原始z80编码的剩余部分,这些编码被重新用于这些Gameboy特定的指令。 - Jester
2
我可能误解了这个问题,但我从未见过0xE2和0xF2使用第二个字节。以下是GBC中0xE2的示例:http://datacrystal.romhacking.net/wiki/Yu-Gi-Oh!_Dark_Duel_Stories:ROM_map#LCD_Control - Méga Lag
3
根据@MégaLag所给的例子和pandocs中的说明,我将其视为1个字节的指令。 - Demeter Purjon
显示剩余2条评论
1个回答

14

你是完全正确的。LD (C),ALD A,(C)都是1个字节长。

我甚至给负责人(Pastraiser)发送了电子邮件,请求澄清(或者修复网站),但是我没有得到回复。

还有一件困扰我的事情是,prefix CB被认为是1个字节长,并且需要4个周期。而所有的扩展指令都被认为是2个字节长,并且需要8个周期(如果它们访问(HL),则需要16个周期)。对我来说,更合理的做法是将Prefix CB下面的空白留空,以便清楚地表明所有扩展指令已经包括了其前缀的大小和处理周期。

另一件困扰我的事情是,STOP长度为2。实际上只有一个字节长。Gameboy Classic上有一个硬件错误,导致跟随STOP的指令被跳过。因此,任天堂开始告诉开发人员在STOP后始终添加一个NOP。因此,为了100%的正确性,我认为STOP应该是(1,4)而不是(2,4)。这个问题在Gameboy Color上不存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接