diff options
| author | Hannes Schulze <haschu0103@outlook.de> | 2025-01-18 23:06:34 +0100 |
|---|---|---|
| committer | Hannes Schulze <haschu0103@outlook.de> | 2025-01-18 23:06:34 +0100 |
| commit | 502dc171f45e5acf00c34521328b414d5285f598 (patch) | |
| tree | f08a723b8c770556106168c6f3e7880057d32b50 /src/nes/cpu.cc | |
| parent | 67672d06776e38b06f31f6599678767c60eed58a (diff) | |
wip ppu
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)); |
