Fixed reset state for CPU (to pass test roms)
This commit is contained in:
parent
9f68ce1a8c
commit
0fe4091f27
4 changed files with 22 additions and 16 deletions
26
Core/CPU.cpp
26
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) {
|
||||
|
|
|
@ -657,7 +657,7 @@ public:
|
|||
CPU::IRQFlag &= ~(int)source;
|
||||
}
|
||||
|
||||
void Reset();
|
||||
void Reset(bool softReset);
|
||||
uint32_t Exec();
|
||||
State GetState() { return _state; }
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ class Console
|
|||
bool _stop = false;
|
||||
bool _reset = false;
|
||||
|
||||
void ResetComponents();
|
||||
void ResetComponents(bool softReset);
|
||||
|
||||
public:
|
||||
Console(wstring filename);
|
||||
|
|
Loading…
Add table
Reference in a new issue