【问题标题】:GBZ80: How does LD HL,(SP+e) affect H and C flags?GBZ80:LD HL,(SP+e) 如何影响 H 和 C 标志?
【发布时间】:2011-03-01 19:55:21
【问题描述】:

在 Gameboy Z80 上,LD HL,(SP+e) 操作究竟如何影响 H 和 C 标志? (半进位+进位)

参考:http://www.devrs.com/gb/files/opcodes.html

【问题讨论】:

  • 它们可能是根据SP+e 的结果设置的,除非我遗漏了什么?
  • 它有用吗?或者它只是如何在处理器上实现的产物?我真的不明白为什么有人会对这些信息感兴趣。
  • 我猜是神器。但这只是猜测。
  • 确实,您链接到的文档与 pan-koopa 文档冲突:HL <- (SP + s_offset8) vs HL <- SP + s_offset8
  • 另一个图表 pastraiser.com/cpu/gameboy/gameboy_opcodes.html 与 Pan-Koopa 文档匹配。

标签: assembly z80 gameboy


【解决方案1】:

我意识到这是一个老问题,但不久前我遇到了类似的问题,我只想添加我的解决方案,因为据我所知,绝对没有文档或开源模拟器可以正确完成。我在一个真正的游戏机上进行了一些实际调试以找到解决方案。

对于 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

【讨论】:

    【解决方案2】:

    如下所示:http://www.pastraiser.com/cpu/gameboy/gameboy_opcodes.html SP+e 的和会影响半进位和进位标志,因此您应该检查从位 3 到 4 和从 7 到 8 是否有进位(从 0 开始!)

    【讨论】:

      猜你喜欢
      • 2016-08-29
      • 2015-03-26
      • 2012-11-14
      • 2017-12-05
      • 2017-12-03
      • 2012-10-16
      • 2019-01-10
      • 1970-01-01
      • 2016-09-07
      相关资源
      最近更新 更多