diff --git a/src/n64/core/Mem.cpp b/src/n64/core/Mem.cpp index 5c010793..3a9739a4 100644 --- a/src/n64/core/Mem.cpp +++ b/src/n64/core/Mem.cpp @@ -40,15 +40,18 @@ u32 Mem::LoadROM(const std::string& filename) { util::SwapN64Rom(crc, sizeAdjusted, cart.data()); memcpy(mmio.rsp.dmem, cart.data(), 0x1000); + u32 rdram_size = RDRAM_SIZE; + memcpy(&mmio.rdp.dram[0x318], &rdram_size, sizeof(u32)); + return crc; } template -bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr) { +bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr) { paddr = vaddr & 0x1FFFFFFF; if constexpr(!tlb) return true; - switch(vaddr >> 29) { + switch(u32(vaddr) >> 29) { case 0 ... 3: case 7: return ProbeTLB(regs, accessType, vaddr, paddr, nullptr); case 4 ... 5: return true; @@ -60,11 +63,11 @@ bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr) return false; } -template bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr); -template bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr); +template bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr); +template bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr); template -u8 Mem::Read8(n64::Registers ®s, u32 vaddr, s64 pc) { +u8 Mem::Read8(n64::Registers ®s, u64 vaddr, s64 pc) { u32 paddr = vaddr; if(!MapVAddr(regs, LOAD, vaddr, paddr)) { HandleTLBException(regs, vaddr); @@ -97,7 +100,7 @@ u8 Mem::Read8(n64::Registers ®s, u32 vaddr, s64 pc) { } template -u16 Mem::Read16(n64::Registers ®s, u32 vaddr, s64 pc) { +u16 Mem::Read16(n64::Registers ®s, u64 vaddr, s64 pc) { u32 paddr = vaddr; if(!MapVAddr(regs, LOAD, vaddr, paddr)) { HandleTLBException(regs, vaddr); @@ -130,7 +133,7 @@ u16 Mem::Read16(n64::Registers ®s, u32 vaddr, s64 pc) { } template -u32 Mem::Read32(n64::Registers ®s, u32 vaddr, s64 pc) { +u32 Mem::Read32(n64::Registers ®s, u64 vaddr, s64 pc) { u32 paddr = vaddr; if(!MapVAddr(regs, LOAD, vaddr, paddr)) { HandleTLBException(regs, vaddr); @@ -162,7 +165,7 @@ u32 Mem::Read32(n64::Registers ®s, u32 vaddr, s64 pc) { } template -u64 Mem::Read64(n64::Registers ®s, u32 vaddr, s64 pc) { +u64 Mem::Read64(n64::Registers ®s, u64 vaddr, s64 pc) { u32 paddr = vaddr; if(!MapVAddr(regs, LOAD, vaddr, paddr)) { HandleTLBException(regs, vaddr); @@ -193,17 +196,17 @@ u64 Mem::Read64(n64::Registers ®s, u32 vaddr, s64 pc) { } } -template u8 Mem::Read8(n64::Registers ®s, u32 vaddr, s64 pc); -template u8 Mem::Read8(n64::Registers ®s, u32 vaddr, s64 pc); -template u16 Mem::Read16(n64::Registers ®s, u32 vaddr, s64 pc); -template u16 Mem::Read16(n64::Registers ®s, u32 vaddr, s64 pc); -template u32 Mem::Read32(n64::Registers ®s, u32 vaddr, s64 pc); -template u32 Mem::Read32(n64::Registers ®s, u32 vaddr, s64 pc); -template u64 Mem::Read64(n64::Registers ®s, u32 vaddr, s64 pc); -template u64 Mem::Read64(n64::Registers ®s, u32 vaddr, s64 pc); +template u8 Mem::Read8(n64::Registers ®s, u64 vaddr, s64 pc); +template u8 Mem::Read8(n64::Registers ®s, u64 vaddr, s64 pc); +template u16 Mem::Read16(n64::Registers ®s, u64 vaddr, s64 pc); +template u16 Mem::Read16(n64::Registers ®s, u64 vaddr, s64 pc); +template u32 Mem::Read32(n64::Registers ®s, u64 vaddr, s64 pc); +template u32 Mem::Read32(n64::Registers ®s, u64 vaddr, s64 pc); +template u64 Mem::Read64(n64::Registers ®s, u64 vaddr, s64 pc); +template u64 Mem::Read64(n64::Registers ®s, u64 vaddr, s64 pc); template -void Mem::Write8(Registers& regs, u32 vaddr, u32 val, s64 pc) { +void Mem::Write8(Registers& regs, u64 vaddr, u32 val, s64 pc) { u32 paddr = vaddr; if(!MapVAddr(regs, STORE, vaddr, paddr)) { HandleTLBException(regs, vaddr); @@ -239,7 +242,7 @@ void Mem::Write8(Registers& regs, u32 vaddr, u32 val, s64 pc) { } template -void Mem::Write16(Registers& regs, u32 vaddr, u32 val, s64 pc) { +void Mem::Write16(Registers& regs, u64 vaddr, u32 val, s64 pc) { u32 paddr = vaddr; if(!MapVAddr(regs, STORE, vaddr, paddr)) { HandleTLBException(regs, vaddr); @@ -275,12 +278,9 @@ void Mem::Write16(Registers& regs, u32 vaddr, u32 val, s64 pc) { } template -void Mem::Write32(Registers& regs, u32 vaddr, u32 val, s64 pc) { +void Mem::Write32(Registers& regs, u64 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); } @@ -321,7 +321,7 @@ void Mem::Write32(Registers& regs, u32 vaddr, u32 val, s64 pc) { } template -void Mem::Write64(Registers& regs, u32 vaddr, u64 val, s64 pc) { +void Mem::Write64(Registers& regs, u64 vaddr, u64 val, s64 pc) { u32 paddr = vaddr; if(!MapVAddr(regs, STORE, vaddr, paddr)) { HandleTLBException(regs, vaddr); @@ -353,12 +353,12 @@ void Mem::Write64(Registers& regs, u32 vaddr, u64 val, s64 pc) { } } -template void Mem::Write8(Registers& regs, u32 vaddr, u32 val, s64 pc); -template void Mem::Write8(Registers& regs, u32 vaddr, u32 val, s64 pc); -template void Mem::Write16(Registers& regs, u32 vaddr, u32 val, s64 pc); -template void Mem::Write16(Registers& regs, u32 vaddr, u32 val, s64 pc); -template void Mem::Write32(Registers& regs, u32 vaddr, u32 val, s64 pc); -template void Mem::Write32(Registers& regs, u32 vaddr, u32 val, s64 pc); -template void Mem::Write64(Registers& regs, u32 vaddr, u64 val, s64 pc); -template void Mem::Write64(Registers& regs, u32 vaddr, u64 val, s64 pc); +template void Mem::Write8(Registers& regs, u64 vaddr, u32 val, s64 pc); +template void Mem::Write8(Registers& regs, u64 vaddr, u32 val, s64 pc); +template void Mem::Write16(Registers& regs, u64 vaddr, u32 val, s64 pc); +template void Mem::Write16(Registers& regs, u64 vaddr, u32 val, s64 pc); +template void Mem::Write32(Registers& regs, u64 vaddr, u32 val, s64 pc); +template void Mem::Write32(Registers& regs, u64 vaddr, u32 val, s64 pc); +template void Mem::Write64(Registers& regs, u64 vaddr, u64 val, s64 pc); +template void Mem::Write64(Registers& regs, u64 vaddr, u64 val, s64 pc); } \ No newline at end of file diff --git a/src/n64/core/Mem.hpp b/src/n64/core/Mem.hpp index 067db48e..127c2855 100644 --- a/src/n64/core/Mem.hpp +++ b/src/n64/core/Mem.hpp @@ -17,21 +17,21 @@ struct Mem { } template - u8 Read8(Registers&, u32, s64); + u8 Read8(Registers&, u64, s64); template - u16 Read16(Registers&, u32, s64); + u16 Read16(Registers&, u64, s64); template - u32 Read32(Registers&, u32, s64); + u32 Read32(Registers&, u64, s64); template - u64 Read64(Registers&, u32, s64); + u64 Read64(Registers&, u64, s64); template - void Write8(Registers&, u32, u32, s64); + void Write8(Registers&, u64, u32, s64); template - void Write16(Registers&, u32, u32, s64); + void Write16(Registers&, u64, u32, s64); template - void Write32(Registers&, u32, u32, s64); + void Write32(Registers&, u64, u32, s64); template - void Write64(Registers&, u32, u64, s64); + void Write64(Registers&, u64, u64, s64); MMIO mmio; u8 pifRam[PIF_RAM_SIZE]{}; @@ -49,5 +49,5 @@ private: }; template -bool MapVAddr(Registers& regs, TLBAccessType accessType, u32 vaddr, u32& paddr); +bool MapVAddr(Registers& regs, TLBAccessType accessType, u64 vaddr, u32& paddr); } diff --git a/src/n64/core/cpu/instructions.cpp b/src/n64/core/cpu/instructions.cpp index 757476fe..8e386de0 100644 --- a/src/n64/core/cpu/instructions.cpp +++ b/src/n64/core/cpu/instructions.cpp @@ -209,7 +209,7 @@ void Cpu::lh(Mem& mem, u32 instr) { } void Cpu::lw(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, 0b11)) { HandleTLBException(regs, address); FireException(regs, ExceptionCode::AddressErrorLoad, 0, regs.oldPC); @@ -391,7 +391,7 @@ void Cpu::sh(Mem& mem, u32 instr) { } void Cpu::sw(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, 0b11)) { HandleTLBException(regs, address); FireException(regs, ExceptionCode::AddressErrorStore, 0, regs.oldPC); diff --git a/src/n64/core/cpu/registers/Cop0.cpp b/src/n64/core/cpu/registers/Cop0.cpp index 760c9039..8bb9b02d 100644 --- a/src/n64/core/cpu/registers/Cop0.cpp +++ b/src/n64/core/cpu/registers/Cop0.cpp @@ -170,7 +170,7 @@ u64 getVPN(u64 addr, u64 pageMask) { return vpn & ~mask; } -TLBEntry* TLBTryMatch(Registers& regs, s64 vaddr, int* match) { +TLBEntry* TLBTryMatch(Registers& regs, u64 vaddr, int* match) { for(int i = 0; i < 32; i++) { TLBEntry *entry = ®s.cop0.tlb[i]; u64 entry_vpn = getVPN(entry->entryHi.raw, entry->pageMask.raw); @@ -190,7 +190,7 @@ TLBEntry* TLBTryMatch(Registers& regs, s64 vaddr, int* match) { return nullptr; } -bool ProbeTLB(Registers& regs, TLBAccessType access_type, s64 vaddr, u32& paddr, int* match) { +bool ProbeTLB(Registers& regs, TLBAccessType access_type, u64 vaddr, u32& paddr, int* match) { TLBEntry* entry = TLBTryMatch(regs, vaddr, match); if(!entry) { regs.cop0.tlbError = MISS; diff --git a/src/n64/core/cpu/registers/Cop0.hpp b/src/n64/core/cpu/registers/Cop0.hpp index b6157a10..583a48d9 100644 --- a/src/n64/core/cpu/registers/Cop0.hpp +++ b/src/n64/core/cpu/registers/Cop0.hpp @@ -267,8 +267,8 @@ private: struct Registers; enum class ExceptionCode : u8; -TLBEntry* TLBTryMatch(Registers& regs, s64 vaddr, int* match); -bool ProbeTLB(Registers& regs, TLBAccessType access_type, s64 vaddr, u32& paddr, int* match); +TLBEntry* TLBTryMatch(Registers& regs, u64 vaddr, int* match); +bool ProbeTLB(Registers& regs, TLBAccessType access_type, u64 vaddr, u32& paddr, int* match); void HandleTLBException(Registers& regs, u64 vaddr); ExceptionCode GetTLBExceptionCode(TLBError error, TLBAccessType access_type); } \ No newline at end of file