diff --git a/Core/Cpu.Instructions.cpp b/Core/Cpu.Instructions.cpp index 6c2616a..bfbb7a7 100644 --- a/Core/Cpu.Instructions.cpp +++ b/Core/Cpu.Instructions.cpp @@ -425,7 +425,7 @@ Interrupts void Cpu::ProcessInterrupt(uint16_t vector) { if(_state.EmulationMode) { - PushWord(_state.PC + 1); + PushWord(_state.PC); PushByte(_state.PS | 0x20); SetFlags(ProcFlags::IrqDisable); @@ -434,12 +434,13 @@ void Cpu::ProcessInterrupt(uint16_t vector) _state.PC = ReadDataWord(vector); } else { PushByte(_state.K); - PushWord(_state.PC + 1); + PushWord(_state.PC); PushByte(_state.PS); SetFlags(ProcFlags::IrqDisable); ClearFlags(ProcFlags::Decimal); + _state.K = 0; _state.PC = ReadDataWord(vector); } } diff --git a/Core/Cpu.cpp b/Core/Cpu.cpp index 0a274f7..171c2ad 100644 --- a/Core/Cpu.cpp +++ b/Core/Cpu.cpp @@ -13,7 +13,7 @@ Cpu::Cpu(shared_ptr memoryManager) &C::JSR, &C::AND, &C::JSL, &C::AND, &C::BIT, &C::AND, &C::ROL, &C::AND, &C::PLP, &C::AND, &C::ROL, &C::PLD, &C::BIT, &C::AND, &C::ROL, &C::AND, // 2 &C::BMI, &C::AND, &C::AND, &C::AND, &C::BIT, &C::AND, &C::ROL, &C::AND, &C::SEC, &C::AND, &C::DEC, &C::TSC, &C::BIT, &C::AND, &C::ROL, &C::AND, // 3 &C::RTI, &C::EOR, &C::WDM, &C::EOR, &C::MVP, &C::EOR, &C::LSR, &C::EOR, &C::PHA, &C::EOR, &C::LSR, &C::PHK, &C::JMP, &C::EOR, &C::LSR, &C::EOR, // 4 - &C::BVC, &C::EOR, &C::EOR, &C::EOR, &C::MVN, &C::EOR, &C::LSR, &C::EOR, &C::CLI, &C::EOR, &C::PHY, &C::TCD, &C::JMP, &C::EOR, &C::LSR, &C::EOR, // 5 + &C::BVC, &C::EOR, &C::EOR, &C::EOR, &C::MVN, &C::EOR, &C::LSR, &C::EOR, &C::CLI, &C::EOR, &C::PHY, &C::TCD, &C::JML, &C::EOR, &C::LSR, &C::EOR, // 5 &C::RTS, &C::ADC, &C::PER, &C::ADC, &C::STZ, &C::ADC, &C::ROR, &C::ADC, &C::PLA, &C::ADC, &C::ROR, &C::RTL, &C::JMP, &C::ADC, &C::ROR, &C::ADC, // 6 &C::BVS, &C::ADC, &C::ADC, &C::ADC, &C::STZ, &C::ADC, &C::ROR, &C::ADC, &C::SEI, &C::ADC, &C::PLY, &C::TDC, &C::JMP, &C::ADC, &C::ROR, &C::ADC, // 7 &C::BRA, &C::STA, &C::BRL, &C::STA, &C::STY, &C::STA, &C::STX, &C::STA, &C::DEY, &C::BIT, &C::TXA, &C::PHB, &C::STY, &C::STA, &C::STX, &C::STA, // 8 @@ -78,7 +78,7 @@ void Cpu::Exec() opCount++; if(_nmiFlag) { - ProcessInterrupt(Cpu::NmiVector); + ProcessInterrupt(_state.EmulationMode ? Cpu::LegacyNmiVector : Cpu::NmiVector); _nmiFlag = false; } } diff --git a/Core/Cpu.h b/Core/Cpu.h index 387d7f9..bd72436 100644 --- a/Core/Cpu.h +++ b/Core/Cpu.h @@ -13,9 +13,9 @@ public: int32_t GetLastOperand() { return (int32_t)_operand; } private: - static constexpr uint32_t NmiVector = 0x00FFFA; + static constexpr uint32_t NmiVector = 0x00FFEA; static constexpr uint32_t ResetVector = 0x00FFFC; - static constexpr uint32_t IrqVector = 0x00FFFE; + static constexpr uint32_t IrqVector = 0x00FFEE; static constexpr uint32_t AbortVector = 0x00FFE8; static constexpr uint32_t BreakVector = 0x00FFE6; static constexpr uint32_t CoprocessorVector = 0x00FFE4;