【问题标题】:Half carry flag emulating the GBA模拟 GBA 的半进位标志
【发布时间】:2020-01-09 01:53:46
【问题描述】:

我看过一些关于检测 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;
}

谢谢!

【问题讨论】:

    标签: c++ emulation game-boy-advance


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多