1

我看过一些关于检测 GBA 的 HALF CARRY 标志更改的文档。我正在用 C++ 编写一个模拟器,当我减去两个不同的数字时,我很难思考如何检测 HALF CARRY 标志的变化。(这在 shift 和 rotate 操作中也应该很明显,ADD 在 Stack Overflow 和不同的指南上都有很好的记录)。

到目前为止,我有这个功能可以检测一个操作是否触发了 HALF CARRY 设置(我很肯定这仅适用于添加):

#include <stdint.h>
static constexpr bool HalfCarryOnAddition(uint8_t first_num, uint8_t second_num)
{
    return (((first_num & 0xF) + (second_num & 0xF)) & 0x10) == 0x10;
}

谢谢!

4

1 回答 1

1

我现在明白半进位本质上是什么->它检查您要查找的类型大小的一半的进位位。

uint8_t 和 uint16_t 的 HALF-CARRY 标志的 ADD、SUB 的实现是:

#include <stdint.h>
static constexpr bool HalfCarryOnAddition(uint8_t first_num, uint8_t second_num)
{
    return (((first_num & 0x0F) + (second_num & 0x0F)) & 0x10) == 0x10;
}

static constexpr bool HalfCarryOnAddition(uint16_t first_num, uint16_t second_num)
{
    return (((first_num & 0x00FF) + (second_num & 0x00FF)) & 0x0100) == 0x0100;
}

static constexpr bool HalfCarryOnSubtration(uint8_t first_num, uint8_t second_num)
{
    return (int)(first_num & 0x0F) - (int)(second_num & 0x0F) < 0;
}

static constexpr bool HalfCarryOnSubtration(uint16_t first_num, uint16_t second_num)
{
    return (int)(first_num & 0x00FF) - (int)(second_num & 0x00FF) < 0;
}
于 2019-09-06T13:12:46.447 回答