properly reset a lot of the emulator state

This commit is contained in:
SimoneN64
2024-06-21 22:25:50 +02:00
parent 3e36dbc4bb
commit f4a4aebbee
22 changed files with 71 additions and 31 deletions

View File

@@ -12,6 +12,7 @@ struct Interpreter final : BaseCPU {
void Reset() override { void Reset() override {
regs.Reset(); regs.Reset();
mem.Reset(); mem.Reset();
cop2Latch = {};
} }
Mem& GetMem() override { Mem& GetMem() override {

View File

@@ -15,7 +15,9 @@ struct Mem;
struct Registers; struct Registers;
struct MMIO { 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(); void Reset();
VI vi; VI vi;

View File

@@ -33,6 +33,15 @@ void Mem::Reset() {
saveData.unmap(); saveData.unmap();
} }
mmio.Reset(); 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) { void Mem::LoadSRAM(SaveType save_type, fs::path path) {

View File

@@ -2,7 +2,6 @@
#include <log.hpp> #include <log.hpp>
#include <core/RSP.hpp> #include <core/RSP.hpp>
#include <parallel-rdp/ParallelRDPWrapper.hpp> #include <parallel-rdp/ParallelRDPWrapper.hpp>
#include <core/mmio/Interrupt.hpp>
namespace n64 { namespace n64 {
RDP::RDP(Mem& mem, ParallelRDP& parallel) : mem(mem), parallel(parallel) { 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() { void RDP::Reset() {
dpc = {};
dpc.status.raw = 0x80; dpc.status.raw = 0x80;
std::fill(rdram.begin(), rdram.end(), 0); std::fill(rdram.begin(), rdram.end(), 0);
memset(cmd_buf, 0, 0x100000); memset(cmd_buf, 0, 0x100000);

View File

@@ -31,6 +31,7 @@ void RSP::Reset() {
divIn = 0; divIn = 0;
divOut = 0; divOut = 0;
divInLoaded = false; divInLoaded = false;
steps = 0;
} }
/* /*

View File

@@ -3,7 +3,6 @@
#include <core/RDP.hpp> #include <core/RDP.hpp>
#include <MemoryRegions.hpp> #include <MemoryRegions.hpp>
#include <MemoryHelpers.hpp> #include <MemoryHelpers.hpp>
#include <Interrupt.hpp>
#include <array> #include <array>
#define RSP_BYTE(addr) (dmem[BYTE_ADDRESS(addr) & 0xFFF]) #define RSP_BYTE(addr) (dmem[BYTE_ADDRESS(addr) & 0xFFF])

View File

@@ -8,6 +8,11 @@ Flash::Flash(mio::mmap_sink &saveData) : saveData(saveData) {}
void Flash::Reset() { void Flash::Reset() {
state = FlashState::Idle; state = FlashState::Idle;
writeOffs = {};
state = {};
status = {};
eraseOffs = {};
writeBuf = {};
} }
void Flash::Load(SaveType saveType, const std::string& path) { void Flash::Load(SaveType saveType, const std::string& path) {

View File

@@ -13,8 +13,8 @@ void AI::Reset() {
dmaCount = 0; dmaCount = 0;
dmaAddrCarry = false; dmaAddrCarry = false;
cycles = 0; cycles = 0;
memset(dmaLen, 0, 2); dmaLen = {};
memset(dmaAddr, 0, 2); dmaAddr = {};
dac = {44100, N64_CPU_FREQ / dac.freq, 16}; dac = {44100, N64_CPU_FREQ / dac.freq, 16};
} }

View File

@@ -1,6 +1,5 @@
#pragma once #pragma once
#include <common.hpp> #include <common.hpp>
#include <core/mmio/Interrupt.hpp>
#include <core/mmio/Audio.hpp> #include <core/mmio/Audio.hpp>
namespace n64 { namespace n64 {
@@ -17,8 +16,8 @@ struct AI {
u16 dacRate{}; u16 dacRate{};
u8 bitrate{}; u8 bitrate{};
int dmaCount{}; int dmaCount{};
u32 dmaLen[2]{}; std::array<u32, 2> dmaLen{};
u32 dmaAddr[2]{}; std::array<u32, 2> dmaAddr{};
bool dmaAddrCarry{}; bool dmaAddrCarry{};
u32 cycles{}; u32 cycles{};
AudioDevice device; AudioDevice device;

View File

@@ -1,4 +1,3 @@
#include <core/mmio/Interrupt.hpp>
#include <core/mmio/MI.hpp> #include <core/mmio/MI.hpp>
#include <core/registers/Registers.hpp> #include <core/registers/Registers.hpp>

View File

@@ -1,9 +0,0 @@
#pragma once
#include <common.hpp>
#include <core/mmio/MI.hpp>
namespace n64 {
struct Registers;
}

View File

@@ -1,7 +1,6 @@
#include <core/mmio/MI.hpp> #include <core/mmio/MI.hpp>
#include <core/registers/Registers.hpp> #include <core/registers/Registers.hpp>
#include <log.hpp> #include <log.hpp>
#include <core/mmio/Interrupt.hpp>
#define MI_VERSION_REG 0x02020102 #define MI_VERSION_REG 0x02020102

View File

@@ -9,6 +9,7 @@ PI::PI(Mem& mem, Registers& regs) : mem(mem), regs(regs) {
} }
void PI::Reset() { void PI::Reset() {
toCart = false;
dmaBusy = false; dmaBusy = false;
ioBusy = false; ioBusy = false;
latch = 0; latch = 0;

View File

@@ -1,6 +1,5 @@
#pragma once #pragma once
#include <common.hpp> #include <common.hpp>
#include <core/mmio/Interrupt.hpp>
namespace n64 { namespace n64 {

View File

@@ -10,9 +10,9 @@
namespace n64 { namespace n64 {
void PIF::Reset() { void PIF::Reset() {
memset(joybusDevices, 0, sizeof(JoybusDevice) * 6); joybusDevices = {};
memset(bootrom, 0, PIF_BOOTROM_SIZE); bootrom = {};
memset(ram, 0, PIF_RAM_SIZE); ram = {};
std::error_code error; std::error_code error;
if(mempak.is_mapped()) { if(mempak.is_mapped()) {
mempak.sync(error); mempak.sync(error);
@@ -26,6 +26,7 @@ void PIF::Reset() {
} }
mempakOpen = false; mempakOpen = false;
channel = 0;
} }
void PIF::MaybeLoadMempak() { void PIF::MaybeLoadMempak() {
@@ -630,11 +631,11 @@ std::vector<u8> PIF::Serialize() {
sizeof(int)); sizeof(int));
u32 index = 0; u32 index = 0;
memcpy(res.data() + index, joybusDevices, 6*sizeof(JoybusDevice)); memcpy(res.data() + index, joybusDevices.data(), 6*sizeof(JoybusDevice));
index += 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; 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; index += PIF_RAM_SIZE;
memcpy(res.data() + index, mempak.data(), mempak.size()); memcpy(res.data() + index, mempak.data(), mempak.size());
index += mempak.size(); index += mempak.size();

View File

@@ -4,6 +4,7 @@
#include <filesystem> #include <filesystem>
#include <mio/mmap.hpp> #include <mio/mmap.hpp>
#include <vector> #include <vector>
#include <array>
#include "MupenMovie.hpp" #include "MupenMovie.hpp"
namespace fs = std::filesystem; namespace fs = std::filesystem;
@@ -178,8 +179,9 @@ struct PIF {
} }
bool mempakOpen = false; bool mempakOpen = false;
JoybusDevice joybusDevices[6]{}; std::array<JoybusDevice, 6> joybusDevices{};
u8 bootrom[PIF_BOOTROM_SIZE]{}, ram[PIF_RAM_SIZE]{}; std::array<u8, PIF_BOOTROM_SIZE> bootrom{};
std::array<u8, PIF_RAM_SIZE> ram{};
mio::mmap_sink mempak, eeprom; mio::mmap_sink mempak, eeprom;
int channel = 0; int channel = 0;
std::string mempakPath{}, eepromPath{}; std::string mempakPath{}, eepromPath{};

View File

@@ -11,6 +11,7 @@ void SI::Reset() {
status.raw = 0; status.raw = 0;
dramAddr = 0; dramAddr = 0;
pifAddr = 0; pifAddr = 0;
toDram = false;
pif.Reset(); pif.Reset();
} }

View File

@@ -1,6 +1,5 @@
#pragma once #pragma once
#include <common.hpp> #include <common.hpp>
#include <core/mmio/Interrupt.hpp>
#include <core/mmio/MI.hpp> #include <core/mmio/MI.hpp>
#include <core/mmio/PIF.hpp> #include <core/mmio/PIF.hpp>

View File

@@ -2,7 +2,6 @@
#include <log.hpp> #include <log.hpp>
#include <core/registers/Registers.hpp> #include <core/registers/Registers.hpp>
#include <core/Mem.hpp> #include <core/Mem.hpp>
#include <core/mmio/Interrupt.hpp>
namespace n64 { namespace n64 {
VI::VI (Mem& mem, Registers& regs) : mem(mem), regs(regs) { VI::VI (Mem& mem, Registers& regs) : mem(mem), regs(regs) {
@@ -20,6 +19,11 @@ void VI::Reset() {
numHalflines = 262; numHalflines = 262;
numFields = 1; numFields = 1;
cyclesPerHalfline = 1000; cyclesPerHalfline = 1000;
xscale = {}, yscale = {};
hsyncLeap = {}, burst = {}, vburst = {};
hstart = {}, vstart = {};
isPal = false;
swaps = {};
} }
u32 VI::Read(u32 paddr) const { u32 VI::Read(u32 paddr) const {

View File

@@ -20,6 +20,29 @@ void Cop0::Reset() {
wired = 0; wired = 0;
index.raw = 63; index.raw = 63;
badVaddr = 0xFFFFFFFFFFFFFFFF; 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) { u32 Cop0::GetReg32(u8 addr) {

View File

@@ -11,6 +11,12 @@ void Registers::Reset() {
delaySlot = false; delaySlot = false;
prevDelaySlot = false; prevDelaySlot = false;
memset(gpr, 0, 32*sizeof(s64)); memset(gpr, 0, 32*sizeof(s64));
cop0.Reset();
cop1.Reset();
steps = 0;
extraCycles = 0;
} }
void Registers::SetPC64(s64 val) { void Registers::SetPC64(s64 val) {

View File

@@ -1,7 +1,6 @@
#include <core/RSP.hpp> #include <core/RSP.hpp>
#include <log.hpp> #include <log.hpp>
#include <core/registers/Registers.hpp> #include <core/registers/Registers.hpp>
#include <Interrupt.hpp>
#include <Mem.hpp> #include <Mem.hpp>
namespace n64 { namespace n64 {