在 Gameboy Z80 上,该操作究竟如何LD HL,(SP+e)
影响 H 和 C 标志?(半进位+进位)
参考: http: //www.devrs.com/gb/files/opcodes.html
在 Gameboy Z80 上,该操作究竟如何LD HL,(SP+e)
影响 H 和 C 标志?(半进位+进位)
参考: http: //www.devrs.com/gb/files/opcodes.html
我意识到这是一个老问题,但不久前我遇到了类似的问题,只是想添加我的解决方案,因为据我所知,绝对没有文档或开源模拟器可以正确完成。我在一个真正的游戏男孩上进行了一些实际调试以找到解决方案。
对于 16 位 SP + s8(有符号立即数)操作:
如果第 7 位到第 8 位溢出,则设置进位标志。
如果从第 3 位溢出到第 4 位,则设置半进位标志。
我发现对正负符号立即数(Lua)分别执行该行为更容易:
local D8 = self:Read(self.PC+1)
local S8 = ((D8&127)-(D8&128))
local SP = self.SP + S8
if S8 >= 0 then
self.Cf = ( (self.SP & 0xFF) + ( S8 ) ) > 0xFF
self.Hf = ( (self.SP & 0xF) + ( S8 & 0xF ) ) > 0xF
else
self.Cf = (SP & 0xFF) <= (self.SP & 0xFF)
self.Hf = (SP & 0xF) <= (self.SP & 0xF)
end
如此处所示:http: //www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html SP+e 的总和会影响半进位和进位标志,因此您应该检查从位 3 到 4 是否有进位7 到 8(从 0 开始!)