Browse Source

Emulator: Store registers separately

master
Riyyi 2 years ago
parent
commit
e3c3875195
  1. 42
      src/cpu.cpp
  2. 17
      src/cpu.h
  3. 2
      src/main.cpp

42
src/cpu.cpp

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

17
src/cpu.h

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

2
src/main.cpp

@ -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();

Loading…
Cancel
Save