From 0fe4091f27bec2f0fa34b6e679d3239de9adfbd6 Mon Sep 17 00:00:00 2001 From: Souryo Date: Wed, 25 Jun 2014 13:30:02 -0400 Subject: [PATCH] Fixed reset state for CPU (to pass test roms) --- Core/CPU.cpp | 26 ++++++++++++++++---------- Core/CPU.h | 2 +- Core/Console.cpp | 8 ++++---- Core/Console.h | 2 +- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/Core/CPU.cpp b/Core/CPU.cpp index b4b33a0d..3ba80969 100644 --- a/Core/CPU.cpp +++ b/Core/CPU.cpp @@ -71,20 +71,26 @@ CPU::CPU(MemoryManager *memoryManager) : _memoryManager(memoryManager) memcpy(_cyclesPageCrossed, cyclesPageCrossed, sizeof(uint8_t) * 256); } -void CPU::Reset() +void CPU::Reset(bool softReset) { CPU::NMIFlag = false; CPU::IRQFlag = 0; CPU::CycleCount = 0; - _state.A = 0; - _state.PC = MemoryReadWord(0xFFFC); - _state.SP = 0xFF; - _state.X = 0; - _state.Y = 0; - _state.PS = PSFlags::Zero | PSFlags::Reserved | PSFlags::Interrupt; - _runIRQ = false; - _runNMI = false; + _state.PC = MemoryReadWord(CPU::ResetVector); + if(softReset) { + SetFlags(PSFlags::Interrupt); + _state.SP -= 0x03; + } else { + _state.A = 0; + _state.SP = 0xFD; + _state.X = 0; + _state.Y = 0; + _state.PS = PSFlags::Reserved | PSFlags::Interrupt; + + _runIRQ = false; + _runNMI = false; + } } uint32_t CPU::Exec() @@ -111,7 +117,7 @@ uint32_t CPU::Exec() if(!_runIRQ && opCode == 0x40 && CPU::IRQFlag > 0 && !CheckFlag(PSFlags::Interrupt)) { //"If an IRQ is pending and an RTI is executed that clears the I flag, the CPU will invoke the IRQ handler immediately after RTI finishes executing." - //_runIRQ = true; + _runIRQ = true; } } else { if(_runNMI) { diff --git a/Core/CPU.h b/Core/CPU.h index 977ae403..611dbf58 100644 --- a/Core/CPU.h +++ b/Core/CPU.h @@ -657,7 +657,7 @@ public: CPU::IRQFlag &= ~(int)source; } - void Reset(); + void Reset(bool softReset); uint32_t Exec(); State GetState() { return _state; } diff --git a/Core/Console.cpp b/Core/Console.cpp index e9f0c440..8a66619d 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -23,7 +23,7 @@ Console::Console(wstring filename) _memoryManager->RegisterIODevice(_apu.get()); _memoryManager->RegisterIODevice(_controlManager.get()); - ResetComponents(); + ResetComponents(false); } Console::~Console() @@ -35,9 +35,9 @@ void Console::Reset() _reset = true; } -void Console::ResetComponents() +void Console::ResetComponents(bool softReset) { - _cpu->Reset(); + _cpu->Reset(softReset); _ppu->Reset(); _apu->Reset(); } @@ -108,7 +108,7 @@ void Console::Run() fpsTimer.Reset(); lastFrameCount = 0; elapsedTime = 0; - ResetComponents(); + ResetComponents(true); _reset = false; } } diff --git a/Core/Console.h b/Core/Console.h index 8367bb2c..c0feae65 100644 --- a/Core/Console.h +++ b/Core/Console.h @@ -31,7 +31,7 @@ class Console bool _stop = false; bool _reset = false; - void ResetComponents(); + void ResetComponents(bool softReset); public: Console(wstring filename);