【问题标题】:How does adding and subtracting affect register states in a GameBoy?加减法如何影响 GameBoy 中的寄存器状态?
【发布时间】:2020-03-26 13:22:38
【问题描述】:

我目前正在开发一个 GameBoy 模拟器。在编码时,我开始质疑添加到寄存器如何影响它。

cpu上有8个8位寄存器和4个16位寄存器。 8 位寄存器可以组合成 16 位寄存器。这是我在代码中表示它们的方式。

struct Registers{
    //8 bit registers
    uint8_t a;
    uint8_t b;
    uint8_t c;
    uint8_t d;
    uint8_t e;
    uint8_t f;
    uint8_t h;
    uint8_t l;
    //16 bit registers
    uint16_t af;
    uint16_t bc;
    uint16_t de;
    uint16_t hl;
};

问题:

  1. 如果低位寄存器的值为 0b11111111,我将其加 1。该位是继续到较高的寄存器,还是回绕到较低的 8 位寄存器的开头。

  2. 1234563
  3. 如果一个高位寄存器的值是 0b00000000 并且 I sub 1 从它,它会影响低位寄存器吗?

【问题讨论】:

    标签: emulation gameboy


    【解决方案1】:

    首先,我认为您组织寄存器的方式不是一个好方法,因为您有重复的信息(同时存储 a、f 和 af)。一种选择是使用工会;联合确保两个变量共享相同的内存位置。所以,你可以这样做:

    struct Registers{
        union{
            struct{
                uint_8t f;
                uint_8t a;
            };
            uint_16t af;
        };
        // And so on for the rest...
    };
    

    这样,您可以单独操作每个 8 位寄存器 (registers.a) 或同时操作两个 (registers.af)。请注意,如果您在大端机器上进行开发,应交换 f 和 a 以确保正确的端序。

    如果您的编译器不支持匿名结构和联合,我认为更好的选择是创建一个函数来操作两个 8 位寄存器并将它们移位以形成一个 16 位寄存器。这样您就不必每次修改 a 和 af 时都访问它们。

    现在回答您的实际问题。我的信息来自this table(其中包含我被告知的一些错误,因此最好查看其他来源以确认它们)和this manual

    问题 1: 不行,不进高位寄存器,会溢出。

    问题 2: 同样的,它换行到 0xFF。

    问题 3: 假设您使用的是 8 位 ALU 操作,那么不,它不会影响它。

    请注意,如果您使用 16 位 ALU 操作,那么它们会影响其他寄存器。例如:

    假设 SP = 0x00FF;

    ADD SP, 0x1 #Now SP does contain 0x0100 because you used 16 bit arithmetic.
    

    但是:

    假设 HL = 0x00FF;

    ADD L, 1 # L Overflows to 0x00, however HL = 0x0000 because you used 8 bit arithmetic
    

    【讨论】:

    • 非常感谢。这就是我正在寻找的确切答案。我曾想过在结构内使用联合,但决定反对。我会改变它。谢谢
    • 公平地说,这不是我的主意,我没那么聪明,我会使用函数。我记得this guy的这个提示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2019-08-18
    • 2010-09-06
    • 1970-01-01
    • 2015-04-07
    相关资源
    最近更新 更多