Emulator: Store registers separately
This commit is contained in:
+24
-18
@@ -17,28 +17,34 @@ CPU::CPU(uint32_t frequency)
|
|||||||
// CGB registers
|
// CGB registers
|
||||||
// https://gbdev.io/pandocs/Power_Up_Sequence.html#cpu-registers
|
// https://gbdev.io/pandocs/Power_Up_Sequence.html#cpu-registers
|
||||||
m_a = 0x11;
|
m_a = 0x11;
|
||||||
m_bc = 0x0; // B = 0x0, C = 0x0
|
m_b = 0x0;
|
||||||
m_de = 0xff56; // D = 0xff, E = 0x56
|
m_c = 0x0;
|
||||||
m_hl = 0x000d; // H = 0x0, L = 0x0d
|
m_d = 0xff;
|
||||||
|
m_e = 0x56;
|
||||||
|
m_h = 0x0;
|
||||||
|
m_l = 0x0d;
|
||||||
m_pc = 0x100;
|
m_pc = 0x100;
|
||||||
m_sp = 0xffe;
|
m_sp = 0xffe;
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
m_z = 0x1;
|
m_zf = 0x1;
|
||||||
m_n = 0x0;
|
m_nf = 0x0;
|
||||||
m_h = 0x0;
|
m_hf = 0x0;
|
||||||
m_c = 0x0;
|
m_cf = 0x0;
|
||||||
|
|
||||||
m_shared_registers.emplace("a", &m_a);
|
m_shared_registers.emplace("a", &m_a);
|
||||||
m_shared_registers.emplace("bc", &m_bc);
|
m_shared_registers.emplace("b", &m_b);
|
||||||
m_shared_registers.emplace("de", &m_de);
|
m_shared_registers.emplace("c", &m_c);
|
||||||
m_shared_registers.emplace("hl", &m_hl);
|
m_shared_registers.emplace("d", &m_d);
|
||||||
|
m_shared_registers.emplace("e", &m_e);
|
||||||
|
m_shared_registers.emplace("h", &m_h);
|
||||||
|
m_shared_registers.emplace("l", &m_l);
|
||||||
m_shared_registers.emplace("sp", &m_sp);
|
m_shared_registers.emplace("sp", &m_sp);
|
||||||
m_shared_registers.emplace("pc", &m_pc);
|
m_shared_registers.emplace("pc", &m_pc);
|
||||||
m_shared_registers.emplace("z", &m_z);
|
m_shared_registers.emplace("zf", &m_zf);
|
||||||
m_shared_registers.emplace("n", &m_n);
|
m_shared_registers.emplace("nf", &m_nf);
|
||||||
m_shared_registers.emplace("h", &m_h);
|
m_shared_registers.emplace("hf", &m_hf);
|
||||||
m_shared_registers.emplace("c", &m_c);
|
m_shared_registers.emplace("cf", &m_cf);
|
||||||
}
|
}
|
||||||
|
|
||||||
CPU::~CPU()
|
CPU::~CPU()
|
||||||
@@ -66,10 +72,10 @@ void CPU::add(uint8_t opcode, uint8_t immediate)
|
|||||||
m_wait_cycles += 8;
|
m_wait_cycles += 8;
|
||||||
|
|
||||||
// Flags: Z0HC
|
// Flags: Z0HC
|
||||||
m_z = m_a + immediate == 0;
|
m_zf = m_a + immediate == 0;
|
||||||
m_n = 0;
|
m_nf = 0;
|
||||||
m_h = m_a + immediate > 16;
|
m_hf = m_a + immediate > 16;
|
||||||
m_c = m_a + immediate > 255;
|
m_cf = m_a + immediate > 255;
|
||||||
|
|
||||||
// A = A + r
|
// A = A + r
|
||||||
m_a += immediate;
|
m_a += immediate;
|
||||||
|
|||||||
@@ -39,17 +39,20 @@ public:
|
|||||||
private:
|
private:
|
||||||
// Registers
|
// Registers
|
||||||
uint32_t m_a { 0 }; // Accumulator
|
uint32_t m_a { 0 }; // Accumulator
|
||||||
uint32_t m_bc { 0 }; // BC
|
uint32_t m_b { 0 }; // B
|
||||||
uint32_t m_de { 0 }; // DE
|
uint32_t m_c { 0 }; // C
|
||||||
uint32_t m_hl { 0 }; // HL
|
uint32_t m_d { 0 }; // D
|
||||||
|
uint32_t m_e { 0 }; // E
|
||||||
|
uint32_t m_h { 0 }; // H
|
||||||
|
uint32_t m_l { 0 }; // L
|
||||||
uint32_t m_pc { 0 }; // Program Counter
|
uint32_t m_pc { 0 }; // Program Counter
|
||||||
uint32_t m_sp { 0 }; // Stack Pointer
|
uint32_t m_sp { 0 }; // Stack Pointer
|
||||||
|
|
||||||
// Flags
|
// Flags
|
||||||
uint32_t m_z { 0 }; // Zero flag
|
uint32_t m_zf { 0 }; // Zero flag
|
||||||
uint32_t m_n { 0 }; // Subtraction flag (BCD)
|
uint32_t m_nf { 0 }; // Subtraction flag (BCD)
|
||||||
uint32_t m_h { 0 }; // Half Carry flag (BCD)
|
uint32_t m_hf { 0 }; // Half Carry flag (BCD)
|
||||||
uint32_t m_c { 0 }; // Carry flag
|
uint32_t m_cf { 0 }; // Carry flag
|
||||||
|
|
||||||
int8_t m_wait_cycles { 0 };
|
int8_t m_wait_cycles { 0 };
|
||||||
};
|
};
|
||||||
|
|||||||
+1
-1
@@ -30,7 +30,7 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
// Get shared register
|
// Get shared register
|
||||||
print("{}\n", *Emu::the().processingUnit("cpu")->sharedRegister("a"));
|
print("{}\n", *Emu::the().processingUnit("cpu")->sharedRegister("a"));
|
||||||
print("{}\n", *Emu::the().processingUnit("cpu")->sharedRegister("bc"));
|
print("{}\n", *Emu::the().processingUnit("cpu")->sharedRegister("b"));
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
Emu::the().update();
|
Emu::the().update();
|
||||||
|
|||||||
Reference in New Issue
Block a user