diff options
Diffstat (limited to 'src/nes/cpu.cc')
| -rw-r--r-- | src/nes/cpu.cc | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/nes/cpu.cc b/src/nes/cpu.cc index 9b5ed66..bb4830f 100644 --- a/src/nes/cpu.cc +++ b/src/nes/cpu.cc @@ -38,6 +38,11 @@ namespace nes current_cycles_ += count; } + auto cpu::trigger_nmi() -> void + { + nmi_pending_ = true; + } + auto cpu::step_to(cycle_count const target) -> void { while (current_cycles_ < target) @@ -50,6 +55,12 @@ namespace nes { // See https://www.nesdev.org/wiki/CPU_unofficial_opcodes + if (nmi_pending_) + { + execute_interrupt(address{ 0xFFFA }); + nmi_pending_ = false; + } + auto const opcode = advance_pc8(); switch (opcode) { @@ -1035,6 +1046,16 @@ namespace nes } } + auto cpu::execute_interrupt(address vector) -> void + { + push_stack16(registers_.pc); + run_php(); + registers_.pc = read16(vector); + registers_.i = true; + current_cycles_ += cycle_count::from_cpu(7); + } + + auto cpu::eval_ror(std::uint8_t const arg) -> std::uint8_t { auto const res = static_cast<std::uint8_t>((registers_.c << 7) | (arg >> 1)); |
