From 770339f84e12bb469438782a9f616cc71ea8c2ed Mon Sep 17 00:00:00 2001 From: CocoSimone Date: Sat, 1 Oct 2022 03:47:26 +0200 Subject: [PATCH] SW in Lemmy's suite with Krom's IPL3 loops infinitely due to throwing exception that shouldn't happen --- .gitignore | 1 + src/frontend/App.cpp | 9 ++++++++- src/main.cpp | 3 +++ src/n64/core/Mem.cpp | 5 +++++ src/n64/core/cpu/decode.cpp | 5 ++++- src/n64/core/cpu/instructions.cpp | 10 +++++----- 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index 095860ae..42daa649 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ roms/ .cache/ .vscode/ vgcore.* +*.dump *.data disasm.txt log.txt \ No newline at end of file diff --git a/src/frontend/App.cpp b/src/frontend/App.cpp index d9fb329e..d25d2c19 100644 --- a/src/frontend/App.cpp +++ b/src/frontend/App.cpp @@ -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; diff --git a/src/main.cpp b/src/main.cpp index 65d8e041..d72f8d78 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,6 +9,9 @@ int main(int argc, char** argv) { if(argc > 1) { app->LoadROM(argv[1]); } + app->Run(); + + delete app; return 0; } \ No newline at end of file diff --git a/src/n64/core/Mem.cpp b/src/n64/core/Mem.cpp index 49bc3758..5c010793 100644 --- a/src/n64/core/Mem.cpp +++ b/src/n64/core/Mem.cpp @@ -83,6 +83,7 @@ u8 Mem::Read8(n64::Registers ®s, 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 ®s, u32 vaddr, s64 pc) { case 0x04300000 ... 0x044FFFFF: case 0x04500000 ... 0x048FFFFF: return mmio.Read(paddr); case 0x10000000 ... 0x1FBFFFFF: + paddr = (paddr + 2) & ~3; return util::ReadAccess(cart.data(), HALF_ADDRESS(paddr) & romMask); case 0x1FC00000 ... 0x1FC007BF: return util::ReadAccess(pifBootrom, HALF_ADDRESS(paddr) & PIF_BOOTROM_DSIZE); @@ -276,6 +278,9 @@ template void Mem::Write32(Registers& regs, u32 vaddr, u32 val, s64 pc) { u32 paddr = vaddr; if(!MapVAddr(regs, STORE, vaddr, paddr)) { + if(pc == 0xFFFFFFFF80002C14) { + printf("\n"); + } HandleTLBException(regs, vaddr); FireException(regs, GetTLBExceptionCode(regs.cop0.tlbError, STORE), 0, pc); } diff --git a/src/n64/core/cpu/decode.cpp b/src/n64/core/cpu/decode.cpp index 18b14fee..6641edbd 100644 --- a/src/n64/core/cpu/decode.cpp +++ b/src/n64/core/cpu/decode.cpp @@ -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; diff --git a/src/n64/core/cpu/instructions.cpp b/src/n64/core/cpu/instructions.cpp index 4082093d..757476fe 100644 --- a/src/n64/core/cpu/instructions.cpp +++ b/src/n64/core/cpu/instructions.cpp @@ -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) {