summaryrefslogtreecommitdiff
path: root/src/nes/cpu.cc
diff options
context:
space:
mode:
authorHannes Schulze <haschu0103@outlook.de>2025-01-18 23:06:34 +0100
committerHannes Schulze <haschu0103@outlook.de>2025-01-18 23:06:34 +0100
commit502dc171f45e5acf00c34521328b414d5285f598 (patch)
treef08a723b8c770556106168c6f3e7880057d32b50 /src/nes/cpu.cc
parent67672d06776e38b06f31f6599678767c60eed58a (diff)
wip ppu
Diffstat (limited to 'src/nes/cpu.cc')
-rw-r--r--src/nes/cpu.cc21
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));