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);
}
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) {

View file

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

View file

@ -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;
}
}

View file

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