Fixed reset state for CPU (to pass test roms)

This commit is contained in:
Souryo 2014-06-25 13:30:02 -04:00
parent 9f68ce1a8c
commit 0fe4091f27
4 changed files with 22 additions and 16 deletions

View file

@ -71,20 +71,26 @@ CPU::CPU(MemoryManager *memoryManager) : _memoryManager(memoryManager)
memcpy(_cyclesPageCrossed, cyclesPageCrossed, sizeof(uint8_t) * 256); memcpy(_cyclesPageCrossed, cyclesPageCrossed, sizeof(uint8_t) * 256);
} }
void CPU::Reset() void CPU::Reset(bool softReset)
{ {
CPU::NMIFlag = false; CPU::NMIFlag = false;
CPU::IRQFlag = 0; CPU::IRQFlag = 0;
CPU::CycleCount = 0; CPU::CycleCount = 0;
_state.PC = MemoryReadWord(CPU::ResetVector);
if(softReset) {
SetFlags(PSFlags::Interrupt);
_state.SP -= 0x03;
} else {
_state.A = 0; _state.A = 0;
_state.PC = MemoryReadWord(0xFFFC); _state.SP = 0xFD;
_state.SP = 0xFF;
_state.X = 0; _state.X = 0;
_state.Y = 0; _state.Y = 0;
_state.PS = PSFlags::Zero | PSFlags::Reserved | PSFlags::Interrupt; _state.PS = PSFlags::Reserved | PSFlags::Interrupt;
_runIRQ = false; _runIRQ = false;
_runNMI = false; _runNMI = false;
}
} }
uint32_t CPU::Exec() uint32_t CPU::Exec()
@ -111,7 +117,7 @@ uint32_t CPU::Exec()
if(!_runIRQ && opCode == 0x40 && CPU::IRQFlag > 0 && !CheckFlag(PSFlags::Interrupt)) { 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." //"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 { } else {
if(_runNMI) { if(_runNMI) {

View file

@ -657,7 +657,7 @@ public:
CPU::IRQFlag &= ~(int)source; CPU::IRQFlag &= ~(int)source;
} }
void Reset(); void Reset(bool softReset);
uint32_t Exec(); uint32_t Exec();
State GetState() { return _state; } State GetState() { return _state; }

View file

@ -23,7 +23,7 @@ Console::Console(wstring filename)
_memoryManager->RegisterIODevice(_apu.get()); _memoryManager->RegisterIODevice(_apu.get());
_memoryManager->RegisterIODevice(_controlManager.get()); _memoryManager->RegisterIODevice(_controlManager.get());
ResetComponents(); ResetComponents(false);
} }
Console::~Console() Console::~Console()
@ -35,9 +35,9 @@ void Console::Reset()
_reset = true; _reset = true;
} }
void Console::ResetComponents() void Console::ResetComponents(bool softReset)
{ {
_cpu->Reset(); _cpu->Reset(softReset);
_ppu->Reset(); _ppu->Reset();
_apu->Reset(); _apu->Reset();
} }
@ -108,7 +108,7 @@ void Console::Run()
fpsTimer.Reset(); fpsTimer.Reset();
lastFrameCount = 0; lastFrameCount = 0;
elapsedTime = 0; elapsedTime = 0;
ResetComponents(); ResetComponents(true);
_reset = false; _reset = false;
} }
} }

View file

@ -31,7 +31,7 @@ class Console
bool _stop = false; bool _stop = false;
bool _reset = false; bool _reset = false;
void ResetComponents(); void ResetComponents(bool softReset);
public: public:
Console(wstring filename); Console(wstring filename);