SW in Lemmy's suite with Krom's IPL3 loops infinitely due to throwing exception that shouldn't happen
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -8,6 +8,7 @@ roms/
|
||||
.cache/
|
||||
.vscode/
|
||||
vgcore.*
|
||||
*.dump
|
||||
*.data
|
||||
disasm.txt
|
||||
log.txt
|
||||
@@ -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;
|
||||
|
||||
@@ -9,6 +9,9 @@ int main(int argc, char** argv) {
|
||||
if(argc > 1) {
|
||||
app->LoadROM(argv[1]);
|
||||
}
|
||||
|
||||
app->Run();
|
||||
|
||||
delete app;
|
||||
return 0;
|
||||
}
|
||||
@@ -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<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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user