From f4a4aebbee62ca052c7370f477ddf17d4d30dbef Mon Sep 17 00:00:00 2001 From: SimoneN64 Date: Fri, 21 Jun 2024 22:25:50 +0200 Subject: [PATCH] properly reset a lot of the emulator state --- src/backend/core/Interpreter.hpp | 1 + src/backend/core/MMIO.hpp | 4 +++- src/backend/core/Mem.cpp | 9 +++++++++ src/backend/core/RDP.cpp | 2 +- src/backend/core/RSP.cpp | 1 + src/backend/core/RSP.hpp | 1 - src/backend/core/mem/Flash.cpp | 5 +++++ src/backend/core/mmio/AI.cpp | 4 ++-- src/backend/core/mmio/AI.hpp | 5 ++--- src/backend/core/mmio/Interrupt.cpp | 1 - src/backend/core/mmio/Interrupt.hpp | 9 --------- src/backend/core/mmio/MI.cpp | 1 - src/backend/core/mmio/PI.cpp | 1 + src/backend/core/mmio/PI.hpp | 1 - src/backend/core/mmio/PIF.cpp | 13 +++++++------ src/backend/core/mmio/PIF.hpp | 6 ++++-- src/backend/core/mmio/SI.cpp | 1 + src/backend/core/mmio/SI.hpp | 1 - src/backend/core/mmio/VI.cpp | 6 +++++- src/backend/core/registers/Cop0.cpp | 23 +++++++++++++++++++++++ src/backend/core/registers/Registers.cpp | 6 ++++++ src/backend/core/rsp/decode.cpp | 1 - 22 files changed, 71 insertions(+), 31 deletions(-) delete mode 100644 src/backend/core/mmio/Interrupt.hpp diff --git a/src/backend/core/Interpreter.hpp b/src/backend/core/Interpreter.hpp index 2b724985..383f1bc8 100644 --- a/src/backend/core/Interpreter.hpp +++ b/src/backend/core/Interpreter.hpp @@ -12,6 +12,7 @@ struct Interpreter final : BaseCPU { void Reset() override { regs.Reset(); mem.Reset(); + cop2Latch = {}; } Mem& GetMem() override { diff --git a/src/backend/core/MMIO.hpp b/src/backend/core/MMIO.hpp index 32864f1b..ccb00339 100644 --- a/src/backend/core/MMIO.hpp +++ b/src/backend/core/MMIO.hpp @@ -15,7 +15,9 @@ struct Mem; struct Registers; struct MMIO { - MMIO(Mem& mem, Registers& regs, ParallelRDP& parallel) : vi(mem, regs), mi(regs), ai(mem, regs), pi(mem, regs), si(mem, regs), rsp(mem, regs), rdp(mem, parallel) {} + MMIO(Mem& mem, Registers& regs, ParallelRDP& parallel) : vi(mem, regs), mi(regs), ai(mem, regs), pi(mem, regs), si(mem, regs), rsp(mem, regs), rdp(mem, parallel) { + Reset(); + } void Reset(); VI vi; diff --git a/src/backend/core/Mem.cpp b/src/backend/core/Mem.cpp index 7e54003b..dfb65dc3 100644 --- a/src/backend/core/Mem.cpp +++ b/src/backend/core/Mem.cpp @@ -33,6 +33,15 @@ void Mem::Reset() { saveData.unmap(); } mmio.Reset(); + memset(readPages, 0, PAGE_COUNT); + memset(writePages, 0, PAGE_COUNT); + + for(u64 i = 0; i < RDRAM_SIZE / PAGE_SIZE; i++) { + const auto addr = (i * PAGE_SIZE) & RDRAM_DSIZE; + const auto pointer = (uintptr_t) &mmio.rdp.rdram[addr]; + readPages[i] = pointer; + writePages[i] = pointer; + } } void Mem::LoadSRAM(SaveType save_type, fs::path path) { diff --git a/src/backend/core/RDP.cpp b/src/backend/core/RDP.cpp index a445011d..3aae9573 100644 --- a/src/backend/core/RDP.cpp +++ b/src/backend/core/RDP.cpp @@ -2,7 +2,6 @@ #include #include #include -#include namespace n64 { RDP::RDP(Mem& mem, ParallelRDP& parallel) : mem(mem), parallel(parallel) { @@ -13,6 +12,7 @@ RDP::RDP(Mem& mem, ParallelRDP& parallel) : mem(mem), parallel(parallel) { } void RDP::Reset() { + dpc = {}; dpc.status.raw = 0x80; std::fill(rdram.begin(), rdram.end(), 0); memset(cmd_buf, 0, 0x100000); diff --git a/src/backend/core/RSP.cpp b/src/backend/core/RSP.cpp index 99175f55..6a7c77ad 100644 --- a/src/backend/core/RSP.cpp +++ b/src/backend/core/RSP.cpp @@ -31,6 +31,7 @@ void RSP::Reset() { divIn = 0; divOut = 0; divInLoaded = false; + steps = 0; } /* diff --git a/src/backend/core/RSP.hpp b/src/backend/core/RSP.hpp index 1c4c9e46..194a0843 100644 --- a/src/backend/core/RSP.hpp +++ b/src/backend/core/RSP.hpp @@ -3,7 +3,6 @@ #include #include #include -#include #include #define RSP_BYTE(addr) (dmem[BYTE_ADDRESS(addr) & 0xFFF]) diff --git a/src/backend/core/mem/Flash.cpp b/src/backend/core/mem/Flash.cpp index 1e652c0f..30590496 100644 --- a/src/backend/core/mem/Flash.cpp +++ b/src/backend/core/mem/Flash.cpp @@ -8,6 +8,11 @@ Flash::Flash(mio::mmap_sink &saveData) : saveData(saveData) {} void Flash::Reset() { state = FlashState::Idle; + writeOffs = {}; + state = {}; + status = {}; + eraseOffs = {}; + writeBuf = {}; } void Flash::Load(SaveType saveType, const std::string& path) { diff --git a/src/backend/core/mmio/AI.cpp b/src/backend/core/mmio/AI.cpp index 06eac4da..50e9fbe5 100644 --- a/src/backend/core/mmio/AI.cpp +++ b/src/backend/core/mmio/AI.cpp @@ -13,8 +13,8 @@ void AI::Reset() { dmaCount = 0; dmaAddrCarry = false; cycles = 0; - memset(dmaLen, 0, 2); - memset(dmaAddr, 0, 2); + dmaLen = {}; + dmaAddr = {}; dac = {44100, N64_CPU_FREQ / dac.freq, 16}; } diff --git a/src/backend/core/mmio/AI.hpp b/src/backend/core/mmio/AI.hpp index 3f522216..e441a2ed 100644 --- a/src/backend/core/mmio/AI.hpp +++ b/src/backend/core/mmio/AI.hpp @@ -1,6 +1,5 @@ #pragma once #include -#include #include namespace n64 { @@ -17,8 +16,8 @@ struct AI { u16 dacRate{}; u8 bitrate{}; int dmaCount{}; - u32 dmaLen[2]{}; - u32 dmaAddr[2]{}; + std::array dmaLen{}; + std::array dmaAddr{}; bool dmaAddrCarry{}; u32 cycles{}; AudioDevice device; diff --git a/src/backend/core/mmio/Interrupt.cpp b/src/backend/core/mmio/Interrupt.cpp index ef91d770..4ea044c2 100644 --- a/src/backend/core/mmio/Interrupt.cpp +++ b/src/backend/core/mmio/Interrupt.cpp @@ -1,4 +1,3 @@ -#include #include #include diff --git a/src/backend/core/mmio/Interrupt.hpp b/src/backend/core/mmio/Interrupt.hpp deleted file mode 100644 index addfbdc7..00000000 --- a/src/backend/core/mmio/Interrupt.hpp +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -#include -#include - -namespace n64 { - -struct Registers; - -} \ No newline at end of file diff --git a/src/backend/core/mmio/MI.cpp b/src/backend/core/mmio/MI.cpp index 4faf3ecd..bd819bb5 100644 --- a/src/backend/core/mmio/MI.cpp +++ b/src/backend/core/mmio/MI.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #define MI_VERSION_REG 0x02020102 diff --git a/src/backend/core/mmio/PI.cpp b/src/backend/core/mmio/PI.cpp index 4f95aaaf..a1e81c02 100644 --- a/src/backend/core/mmio/PI.cpp +++ b/src/backend/core/mmio/PI.cpp @@ -9,6 +9,7 @@ PI::PI(Mem& mem, Registers& regs) : mem(mem), regs(regs) { } void PI::Reset() { + toCart = false; dmaBusy = false; ioBusy = false; latch = 0; diff --git a/src/backend/core/mmio/PI.hpp b/src/backend/core/mmio/PI.hpp index 04f4f4ce..8e0a6e07 100644 --- a/src/backend/core/mmio/PI.hpp +++ b/src/backend/core/mmio/PI.hpp @@ -1,6 +1,5 @@ #pragma once #include -#include namespace n64 { diff --git a/src/backend/core/mmio/PIF.cpp b/src/backend/core/mmio/PIF.cpp index 7b92782c..4f8c96d4 100644 --- a/src/backend/core/mmio/PIF.cpp +++ b/src/backend/core/mmio/PIF.cpp @@ -10,9 +10,9 @@ namespace n64 { void PIF::Reset() { - memset(joybusDevices, 0, sizeof(JoybusDevice) * 6); - memset(bootrom, 0, PIF_BOOTROM_SIZE); - memset(ram, 0, PIF_RAM_SIZE); + joybusDevices = {}; + bootrom = {}; + ram = {}; std::error_code error; if(mempak.is_mapped()) { mempak.sync(error); @@ -26,6 +26,7 @@ void PIF::Reset() { } mempakOpen = false; + channel = 0; } void PIF::MaybeLoadMempak() { @@ -630,11 +631,11 @@ std::vector PIF::Serialize() { sizeof(int)); u32 index = 0; - memcpy(res.data() + index, joybusDevices, 6*sizeof(JoybusDevice)); + memcpy(res.data() + index, joybusDevices.data(), 6*sizeof(JoybusDevice)); index += 6*sizeof(JoybusDevice); - memcpy(res.data() + index, bootrom, PIF_BOOTROM_SIZE); + memcpy(res.data() + index, bootrom.data(), PIF_BOOTROM_SIZE); index += PIF_BOOTROM_SIZE; - memcpy(res.data() + index, ram, PIF_RAM_SIZE); + memcpy(res.data() + index, ram.data(), PIF_RAM_SIZE); index += PIF_RAM_SIZE; memcpy(res.data() + index, mempak.data(), mempak.size()); index += mempak.size(); diff --git a/src/backend/core/mmio/PIF.hpp b/src/backend/core/mmio/PIF.hpp index 5945c274..0833e8bc 100644 --- a/src/backend/core/mmio/PIF.hpp +++ b/src/backend/core/mmio/PIF.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include "MupenMovie.hpp" namespace fs = std::filesystem; @@ -178,8 +179,9 @@ struct PIF { } bool mempakOpen = false; - JoybusDevice joybusDevices[6]{}; - u8 bootrom[PIF_BOOTROM_SIZE]{}, ram[PIF_RAM_SIZE]{}; + std::array joybusDevices{}; + std::array bootrom{}; + std::array ram{}; mio::mmap_sink mempak, eeprom; int channel = 0; std::string mempakPath{}, eepromPath{}; diff --git a/src/backend/core/mmio/SI.cpp b/src/backend/core/mmio/SI.cpp index db8d9a15..fbd01424 100644 --- a/src/backend/core/mmio/SI.cpp +++ b/src/backend/core/mmio/SI.cpp @@ -11,6 +11,7 @@ void SI::Reset() { status.raw = 0; dramAddr = 0; pifAddr = 0; + toDram = false; pif.Reset(); } diff --git a/src/backend/core/mmio/SI.hpp b/src/backend/core/mmio/SI.hpp index e58f25bb..f6c2acde 100644 --- a/src/backend/core/mmio/SI.hpp +++ b/src/backend/core/mmio/SI.hpp @@ -1,6 +1,5 @@ #pragma once #include -#include #include #include diff --git a/src/backend/core/mmio/VI.cpp b/src/backend/core/mmio/VI.cpp index f1230ac2..47dc3b60 100644 --- a/src/backend/core/mmio/VI.cpp +++ b/src/backend/core/mmio/VI.cpp @@ -2,7 +2,6 @@ #include #include #include -#include namespace n64 { VI::VI (Mem& mem, Registers& regs) : mem(mem), regs(regs) { @@ -20,6 +19,11 @@ void VI::Reset() { numHalflines = 262; numFields = 1; cyclesPerHalfline = 1000; + xscale = {}, yscale = {}; + hsyncLeap = {}, burst = {}, vburst = {}; + hstart = {}, vstart = {}; + isPal = false; + swaps = {}; } u32 VI::Read(u32 paddr) const { diff --git a/src/backend/core/registers/Cop0.cpp b/src/backend/core/registers/Cop0.cpp index c20f2cb1..5023da95 100644 --- a/src/backend/core/registers/Cop0.cpp +++ b/src/backend/core/registers/Cop0.cpp @@ -20,6 +20,29 @@ void Cop0::Reset() { wired = 0; index.raw = 63; badVaddr = 0xFFFFFFFFFFFFFFFF; + + kernelMode = {true}; + supervisorMode = {false}; + userMode = {false}; + is64BitAddressing = {false}; + llbit = {}; + + pageMask = {}; + entryHi = {}; + entryLo0 = {}, entryLo1 = {}; + context = {}; + wired = {}, r7 = {}; + count = {}; + compare = {}; + LLAddr = {}, WatchLo = {}, WatchHi = {}; + xcontext = {}; + r21 = {}, r22 = {}, r23 = {}, r24 = {}, r25 = {}; + ParityError = {}, CacheError = {}, TagLo = {}, TagHi = {}; + ErrorEPC = {}; + r31 = {}; + memset(tlb, 0, sizeof(TLBEntry)*32); + tlbError = NONE; + openbus = {}; } u32 Cop0::GetReg32(u8 addr) { diff --git a/src/backend/core/registers/Registers.cpp b/src/backend/core/registers/Registers.cpp index 60e8e064..c2f8cdfb 100644 --- a/src/backend/core/registers/Registers.cpp +++ b/src/backend/core/registers/Registers.cpp @@ -11,6 +11,12 @@ void Registers::Reset() { delaySlot = false; prevDelaySlot = false; memset(gpr, 0, 32*sizeof(s64)); + + cop0.Reset(); + cop1.Reset(); + + steps = 0; + extraCycles = 0; } void Registers::SetPC64(s64 val) { diff --git a/src/backend/core/rsp/decode.cpp b/src/backend/core/rsp/decode.cpp index 224e6d17..737da901 100644 --- a/src/backend/core/rsp/decode.cpp +++ b/src/backend/core/rsp/decode.cpp @@ -1,7 +1,6 @@ #include #include #include -#include #include namespace n64 {