模拟GBA的半进位标志

Half carry flag emulating the GBA

我看过一些关于检测 GBA 的 HALF CARRY 标志变化的文档。我正在用 C++ 编写一个模拟器,当我 减去 两个不同的数字时,我很难思考如何检测 HALF CARRY 标志的变化。 (这在移位和旋转操作中也应该很明显,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;
}

谢谢!

我现在明白了 half carry 本质上是什么 -> 它是对你正在寻找的类型大小的一半的进位位的检查。

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;
}