properly reset a lot of the emulator state
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ void RSP::Reset() {
|
|||||||
divIn = 0;
|
divIn = 0;
|
||||||
divOut = 0;
|
divOut = 0;
|
||||||
divInLoaded = false;
|
divInLoaded = false;
|
||||||
|
steps = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
#include <common.hpp>
|
|
||||||
#include <core/mmio/MI.hpp>
|
|
||||||
|
|
||||||
namespace n64 {
|
|
||||||
|
|
||||||
struct Registers;
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <common.hpp>
|
#include <common.hpp>
|
||||||
#include <core/mmio/Interrupt.hpp>
|
|
||||||
|
|
||||||
namespace n64 {
|
namespace n64 {
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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{};
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user