Game Boy:半进位标志和 16 位指令(特别是操作码 0xE8)

2024-01-17

像许多其他人一样,我正在编写一个 Game Boy 模拟器,并且我有几个关于指令 0xE8 的问题(ADD SP, n带有 8 位立即数)。

据称here http://www.codeslinger.co.uk/pages/projects/gameboy/hardware.html在 16 位指令中,如果从位 7 到位 8 发生进位,则设置半进位标志,而here https://stackoverflow.com/questions/8868396/gbz80-what-constitutes-a-half-carry据说半进位标志表示从位 11 到位 12 的进位。这个 Reddit 话题 https://www.reddit.com/r/EmuDev/comments/4ycoix/a_guide_to_the_gameboys_halfcarry_flag/关于这个问题似乎有点混乱,并且(我听说这是众所周知的缺陷)Game Boy CPU 手册 http://marc.rawer.de/Gameboy/Docs/GBCPUman.pdf似乎也没有什么有用的东西可说。

我的问题如下:

  1. 半进位标志在操作码 0xE8 中的表现如何?
  2. 操作码 0xE8 在物理硬件中是如何实现的?
  3. 半进位发生在位 7 到位 8 之间,或者半进位发生在位 11 到位 12 之间(对于 16 位指令),哪个是正确的?

TL;DR:对于ADD SP,n,当位 3 到位 4 发生进位时,H 标志被置位。


我决定在真实硬件上对此进行测试,因此我在 GB-Z80 程序集中编写了一个简单的测试 ROM,用于测试以下场景:

[SP = $000F]
ADD SP,$01

[SP = $00F0]
ADD SP,$10

[SP = $0FF0]
ADD SP,$10

对于每种情况,我存储寄存器的值F之后ADD内存中,然后我在屏幕上显示每个字节的第 5 位(H 标志)。

我在 3 种不同的型号(Gameboy Pocket、Gameboy Color 和 Gameboy Advance SP)上运行此程序,并在所有 3 种设备上获得以下输出:1 0 0。因此,来自位 3->4 的进位导致 H 被置位,而来自 7->8 或 11->12 的进位则不会。


For ADD HL,rr (where rr is BC/DE/HL/SP)这似乎是一个不同的故事。根据我的测试,如果从位 11 到位 12 发生进位,则 H 被置位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Game Boy:半进位标志和 16 位指令(特别是操作码 0xE8) 的相关文章

随机推荐