加法和减法如何影响GameBoy中的寄存器状态?

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

cpu上有八个8位寄存器和四个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. 如果低位寄存器的值为0b00000000并且我从中减去1,它是否保持为零,或者该位是否回绕到寄存器的顶部。

  3. 如果一个高位寄存器的值为0b00000000并且我从中减去1,它会影响低位寄存器吗。

jkx_zhaobin 回答:加法和减法如何影响GameBoy中的寄存器状态?

首先,我认为您组织寄存器的方法不是一个好方法,因为您有重复的信息(存储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),也可以同时操纵两个8bit寄存器(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
本文链接:https://www.f2er.com/2996954.html

大家都在问