SW in Lemmy's suite with Krom's IPL3 loops infinitely due to throwing exception that shouldn't happen

This commit is contained in:
CocoSimone
2022-10-01 03:47:26 +02:00
parent a711093b55
commit 770339f84e
6 changed files with 26 additions and 7 deletions

View File

@@ -14,7 +14,14 @@ void App::Run() {
while (SDL_PollEvent(&event)) {
ImGui_ImplSDL2_ProcessEvent(&event);
switch(event.type) {
case SDL_QUIT: core.done = true; break;
case SDL_QUIT: {
core.done = true;
FILE *fp = fopen("rdram.dump", "wb");
u8 *temp = core.mem.GetRDRAM();
util::SwapBuffer32(RDRAM_SIZE, temp);
fwrite(temp, 1, RDRAM_SIZE, fp);
fclose(fp);
} break;
case SDL_WINDOWEVENT:
core.done = window.gotClosed(event);
break;

View File

@@ -9,6 +9,9 @@ int main(int argc, char** argv) {
if(argc > 1) {
app->LoadROM(argv[1]);
}
app->Run();
delete app;
return 0;
}

View File

@@ -83,6 +83,7 @@ u8 Mem::Read8(n64::Registers &regs, u32 vaddr, s64 pc) {
case 0x04300000 ... 0x044FFFFF: case 0x04500000 ... 0x048FFFFF:
return mmio.Read(paddr);
case 0x10000000 ... 0x1FBFFFFF:
paddr = (paddr + 2) & ~2;
return cart[BYTE_ADDRESS(paddr) & romMask];
case 0x1FC00000 ... 0x1FC007BF:
return pifBootrom[BYTE_ADDRESS(paddr) & PIF_BOOTROM_DSIZE];
@@ -115,6 +116,7 @@ u16 Mem::Read16(n64::Registers &regs, u32 vaddr, s64 pc) {
case 0x04300000 ... 0x044FFFFF: case 0x04500000 ... 0x048FFFFF:
return mmio.Read(paddr);
case 0x10000000 ... 0x1FBFFFFF:
paddr = (paddr + 2) & ~3;
return util::ReadAccess<u16>(cart.data(), HALF_ADDRESS(paddr) & romMask);
case 0x1FC00000 ... 0x1FC007BF:
return util::ReadAccess<u16>(pifBootrom, HALF_ADDRESS(paddr) & PIF_BOOTROM_DSIZE);
@@ -276,6 +278,9 @@ template <bool tlb>
void Mem::Write32(Registers& regs, u32 vaddr, u32 val, s64 pc) {
u32 paddr = vaddr;
if(!MapVAddr<tlb>(regs, STORE, vaddr, paddr)) {
if(pc == 0xFFFFFFFF80002C14) {
printf("\n");
}
HandleTLBException(regs, vaddr);
FireException(regs, GetTLBExceptionCode(regs.cop0.tlbError, STORE), 0, pc);
}

View File

@@ -99,7 +99,10 @@ void Cpu::Exec(Mem& mem, u32 instr) {
case 0x02: j(instr); break;
case 0x03: jal(instr); break;
case 0x04: b(instr, regs.gpr[RS(instr)] == regs.gpr[RT(instr)]); break;
case 0x05: b(instr, regs.gpr[RS(instr)] != regs.gpr[RT(instr)]); break;
case 0x05: {
//fmt::print("RS: {:016X}, RT: {:016X}\n", (u64)regs.gpr[RS(instr)], (u64)regs.gpr[RT(instr)]);
b(instr, regs.gpr[RS(instr)] != regs.gpr[RT(instr)]);
} break;
case 0x06: b(instr, regs.gpr[RS(instr)] <= 0); break;
case 0x07: b(instr, regs.gpr[RS(instr)] > 0); break;
case 0x08: addi(instr); break;

View File

@@ -194,12 +194,12 @@ void Cpu::lui(u32 instr) {
}
void Cpu::lb(Mem& mem, u32 instr) {
u32 address = regs.gpr[RS(instr)] + (s16)instr;
u64 address = regs.gpr[RS(instr)] + (s16)instr;
regs.gpr[RT(instr)] = (s8)mem.Read8(regs, address, regs.oldPC);
}
void Cpu::lh(Mem& mem, u32 instr) {
s64 address = regs.gpr[RS(instr)] + (s16)instr;
u64 address = regs.gpr[RS(instr)] + (s16)instr;
if (check_address_error(address, 0b1)) {
HandleTLBException(regs, address);
FireException(regs, ExceptionCode::AddressErrorLoad, 0, regs.oldPC);
@@ -318,7 +318,7 @@ void Cpu::ldr(Mem& mem, u32 instr) {
}
void Cpu::lbu(Mem& mem, u32 instr) {
u32 address = regs.gpr[RS(instr)] + (s16)instr;
u64 address = regs.gpr[RS(instr)] + (s16)instr;
u8 value = mem.Read8(regs, address, regs.oldPC);
regs.gpr[RT(instr)] = value;
}
@@ -506,11 +506,11 @@ void Cpu::jalr(u32 instr) {
}
void Cpu::slti(u32 instr) {
regs.gpr[RT(instr)] = regs.gpr[RS(instr)] < se_imm((s64)instr);
regs.gpr[RT(instr)] = regs.gpr[RS(instr)] < se_imm(instr);
}
void Cpu::sltiu(u32 instr) {
regs.gpr[RT(instr)] = (u64)regs.gpr[RS(instr)] < se_imm((s64)instr);
regs.gpr[RT(instr)] = (u64)regs.gpr[RS(instr)] < se_imm(instr);
}
void Cpu::slt(u32 instr) {