Use virtual class for different cpu types rather than that hot mess with pointers and shiz

This commit is contained in:
CocoSimone
2023-02-19 22:14:59 +01:00
parent 24eac65357
commit f113db7059
26 changed files with 700 additions and 536 deletions

View File

@@ -9,63 +9,60 @@ Core::Core() {
if(SDL_GameControllerAddMappingsFromFile("resources/gamecontrollerdb.txt") < 0) {
Util::print("Failed to load game controller DB\n");
}
Stop();
}
void Core::Stop() {
CpuReset();
mem.Reset();
cpu->Reset();
cpu->mem.Reset();
pause = true;
romLoaded = false;
}
CartInfo Core::LoadROM(const std::string& rom_) {
rom = rom_;
CpuReset();
mem.Reset();
cpu->Reset();
cpu->mem.Reset();
pause = false;
romLoaded = true;
CartInfo cartInfo = mem.LoadROM(rom);
CartInfo cartInfo = cpu->mem.LoadROM(rom);
isPAL = cartInfo.isPAL;
mem.mmio.si.pif.ExecutePIF(mem, CpuGetRegs(), cartInfo);
cpu->mem.mmio.si.pif.ExecutePIF(cpu->mem, cpu->regs, cartInfo);
return cartInfo;
}
void Core::Run(Window& window, float volumeL, float volumeR) {
MMIO& mmio = mem.mmio;
Registers& regs = CpuGetRegs();
MMIO& mmio = cpu->mem.mmio;
for(int field = 0; field < mmio.vi.numFields; field++) {
for (int field = 0; field < mmio.vi.numFields; field++) {
int frameCycles = 0;
if(!pause && romLoaded) {
if (!pause && romLoaded) {
for (int i = 0; i < mmio.vi.numHalflines; i++) {
mmio.vi.current = (i << 1) + field;
if ((mmio.vi.current & 0x3FE) == mmio.vi.intr) {
InterruptRaise(mmio.mi, regs, Interrupt::VI);
InterruptRaise(mmio.mi, cpu->regs, Interrupt::VI);
}
int cpuCount = CpuStep(*this);
int cpuCount = cpu->Run();
frameCycles += cpuCount;
mmio.rsp.Run(cpuCount, regs, mem);
mmio.ai.Step(mem, regs, cpuCount, volumeL, volumeR);
scheduler.tick(cpuCount, mem, regs);
mmio.rsp.Run(cpuCount, cpu->regs, cpu->mem);
mmio.ai.Step(cpu->mem, cpu->regs, cpuCount, volumeL, volumeR);
scheduler.tick(cpuCount, cpu->mem, cpu->regs);
}
if ((mmio.vi.current & 0x3FE) == mmio.vi.intr) {
InterruptRaise(mmio.mi, regs, Interrupt::VI);
InterruptRaise(mmio.mi, cpu->regs, Interrupt::VI);
}
UpdateScreenParallelRdp(*this, window, GetVI());
int missedCycles = N64_CYCLES_PER_FRAME(isPAL) - frameCycles;
mmio.ai.Step(mem, regs, missedCycles, volumeL, volumeR);
} else if(pause && romLoaded) {
mmio.ai.Step(cpu->mem, cpu->regs, missedCycles, volumeL, volumeR);
} else if (pause && romLoaded) {
UpdateScreenParallelRdp(*this, window, GetVI());
} else if(pause && !romLoaded) {
} else if (pause && !romLoaded) {
UpdateScreenParallelRdpNoGame(*this, window);
}
}