From d5a52cc491a222f1b7d33fa6789bed617ec6638b Mon Sep 17 00:00:00 2001 From: Hannes Schulze Date: Sat, 18 Jan 2025 00:05:53 +0100 Subject: cpu: bugfixes --- src/nes/cpu.cc | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'src/nes/cpu.cc') diff --git a/src/nes/cpu.cc b/src/nes/cpu.cc index 277c05d..2a079cc 100644 --- a/src/nes/cpu.cc +++ b/src/nes/cpu.cc @@ -14,6 +14,25 @@ namespace nes registers_.pc = read16(address{ 0xFFFC }); } + auto cpu::snapshot(test::status& snapshot) -> void + { + snapshot.cpu_cycle = current_cycles_; + snapshot.ram = std::vector(std::begin(ram_), std::end(ram_)); + snapshot.registers.pc = registers_.pc; + snapshot.registers.sp = registers_.sp; + snapshot.registers.a = registers_.a; + snapshot.registers.x = registers_.x; + snapshot.registers.y = registers_.y; + snapshot.registers.p = registers_.p; + snapshot.registers.c = registers_.c; + snapshot.registers.z = registers_.z; + snapshot.registers.i = registers_.i; + snapshot.registers.d = registers_.d; + snapshot.registers.b = registers_.b; + snapshot.registers.v = registers_.v; + snapshot.registers.n = registers_.n; + } + auto cpu::step_to(cycle_count const target) -> void { while (current_cycles_ < target) @@ -71,7 +90,7 @@ namespace nes case 0x27: run_rla(); break; case 0x28: run_plp(); break; case 0x29: run_and(); break; - case 0x2A: run_rol(); break; + case 0x2A: run_rol(); break; case 0x2B: run_anc(); break; case 0x2C: run_bit(); break; case 0x2D: run_and(); break; @@ -352,7 +371,7 @@ namespace nes { // ASL: Arithmetic Shift Left auto operand = fetch_operand(); - eval_asl(operand.read()); + operand.write(eval_asl(operand.read())); current_cycles_ += shift_cycle_count(); } @@ -613,7 +632,7 @@ namespace nes template auto cpu::run_ahx() -> void { - // AHX: AND A X H + // AHX: ??? // TODO std::abort(); } @@ -694,7 +713,7 @@ namespace nes template auto cpu::run_tas() -> void { - // TAS: S = A & X + AND S H + // TAS: ??? // TODO std::abort(); } @@ -702,7 +721,7 @@ namespace nes template auto cpu::run_shy() -> void { - // SHY: AND Y H + // SHY: ??? // TODO std::abort(); } @@ -710,7 +729,7 @@ namespace nes template auto cpu::run_shx() -> void { - // SHY: AND X H + // SHY: ??? // TODO std::abort(); } @@ -796,7 +815,7 @@ namespace nes template auto cpu::run_las() -> void { - // LAS: AND S, store into A, X, S + // LAS: ??? // TODO std::abort(); } @@ -1055,7 +1074,7 @@ namespace nes registers_.a = new_val; registers_.c = tmp > 0xFF; - registers_.v = ((old_val ^ arg) & 0x80) == 0 && ((old_val ^ new_val) & 0x80) == 0; + registers_.v = ((old_val ^ arg) & 0x80) == 0 && ((old_val ^ new_val) & 0x80) != 0; update_alu_flags(registers_.a); } -- cgit v1.3.1