mirror of
https://github.com/SourMesen/Mesen.git
synced 2025-04-02 10:52:48 -04:00
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
16
Core/CPU.cpp
16
Core/CPU.cpp
|
@ -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) {
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue