首页 > 解决方案 > 试图弄清楚为什么会出现某个 Pokemon Red/Blue 故障。为什么程序员在这里使用 sbc 指令?

问题描述

我试图了解 Pokemon Red/Blue 中发生的一个奇怪错误,如果您在低于最大 HP 255 hp 时尝试使用移动恢复,移动将失败。

我正在查看的代码是可以在此处找到的反汇编代码。有问题的特定代码位于 .healEffect 标签下。

我想我已经从代码方面弄清楚了为什么会发生这种情况。假设您的最大 HP 为 703,而您目前为 448。机器会比较您的 HP 值,以确保您没有尝试以满 HP 进行治疗。但是,程序员使用了“cp”指令,该指令仅适用于 8 位数字,切断了最高位。我认为这只是程序员错误。

703 = 00000010 10111111 44​​8
= 00000001 11000000
去掉最高位,你的最大值变成191,电流变成192。这是不可能的,所以触发了进位。

现在我感到困惑的是为什么使用 sbc 指令。sbc 被调用,机器执行当前 HP - 最大 HP - 进位。使用上面的示例,结果为 0,这意味着在机器眼中你的 HP 已满,移动失败。

我可以将 cp 指令解释为程序员错误。但是为什么在这里使用 sbc 呢?sbc 旨在用于多字算术,但 HP 是一个 16 位数字。我很难想到在这种情况下需要 sbc 的情况。

有任何想法吗?

标签: assemblyz80

解决方案


要检查是否相等,您不需要进位,您可以简单地分别检查两个字节。如果您想要执行此代码明确打算执行的“更少/更大”,则进位很有用。因此,该错误jp z应该jp nc意味着“如果您可以从电流中减去最大值而不产生进位,这意味着电流至少与最大值一样大,因此不允许操作”


推荐阅读