From 1c421708105c83afd29e1714a61cbbe450dc1c13 Mon Sep 17 00:00:00 2001 From: CocoSimone Date: Tue, 21 Feb 2023 01:29:26 +0100 Subject: [PATCH] fix crash on Windows + small performace improvement BUT breaks Donkey Kong --- README.md | 12 ++++++------ src/backend/Core.cpp | 10 ++++------ src/backend/MemoryRegions.hpp | 2 +- src/backend/core/BaseCPU.hpp | 3 +++ src/backend/core/Interpreter.cpp | 4 ++-- src/backend/core/Mem.cpp | 14 ++++---------- src/backend/core/RDP.cpp | 6 ++---- src/backend/core/RDP.hpp | 2 +- src/common.hpp | 3 ++- src/utils/MemoryHelpers.hpp | 2 +- 10 files changed, 26 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 10f25241..b7b2421b 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,21 @@ # Gadolinium -[![CodeFactor](https://www.codefactor.io/repository/github/cocosimone/Gadolinium/badge/master)](https://www.codefactor.io/repository/github/cocosimone/Gadolinium/overview/master) -[![build](https://github.com/CocoSimone/Gadolinium/actions/workflows/build.yml/badge.svg)](https://github.com/CocoSimone/Gadolinium/actions/workflows/build.yml) +[![CodeFactor](https://www.codefactor.io/repository/github/SimoneN64/Gadolinium/badge/master)](https://www.codefactor.io/repository/github/SimoneN64/Gadolinium/overview/master) +[![build](https://github.com/SimoneN64/Gadolinium/actions/workflows/build.yml/badge.svg)](https://github.com/SimoneN64/Gadolinium/actions/workflows/build.yml) -Rewrite of my Nintendo 64 emulator "[shibumi](https://github.com/CocoSimone/shibumi)". +Rewrite of my Nintendo 64 emulator "[shibumi](https://github.com/SimoneN64/shibumi)". ![Mario's face](resources/mario.png?raw=true) ## Pre-built binaries | Release | |---------------------------------------------------------------------------------------------------------------| -| [Windows (Release)](https://nightly.link/CocoSimone/Gadolinium/workflows/build/master/gadolinium-windows.zip) | -| [Linux (Release)](https://nightly.link/CocoSimone/Gadolinium/workflows/build/master/gadolinium-linux.zip) | +| [Windows (Release)](https://nightly.link/SimoneN64/Gadolinium/workflows/build/master/gadolinium-windows.zip) | +| [Linux (Release)](https://nightly.link/SimoneN64/Gadolinium/workflows/build/master/gadolinium-linux.zip) | ## Build instructions: -First clone the repository: `git clone --recursive https://github.com/CocoSimone/Gadolinium` +First clone the repository: `git clone --recursive https://github.com/SimoneN64/Gadolinium` ### Windows diff --git a/src/backend/Core.cpp b/src/backend/Core.cpp index aad5ff57..cc46af63 100644 --- a/src/backend/Core.cpp +++ b/src/backend/Core.cpp @@ -36,8 +36,8 @@ void Core::Run(Window& window, float volumeL, float volumeR) { MMIO& mmio = cpu->mem.mmio; for (int field = 0; field < mmio.vi.numFields; field++) { - int frameCycles = 0; if (!pause && romLoaded) { + int frameCycles = 0; for (int i = 0; i < mmio.vi.numHalflines; i++) { mmio.vi.current = (i << 1) + field; @@ -46,10 +46,8 @@ void Core::Run(Window& window, float volumeL, float volumeR) { } int cpuCount = cpu->Run(); + cpu->RunRSP(cpuCount); frameCycles += cpuCount; - mmio.rsp.Run(cpuCount, cpu->regs, cpu->mem); - mmio.ai.Step(cpu->mem, cpu->regs, cpuCount, volumeL, volumeR); - scheduler.tick(cpuCount, cpu->mem, cpu->regs); } if ((mmio.vi.current & 0x3FE) == mmio.vi.intr) { @@ -58,8 +56,8 @@ void Core::Run(Window& window, float volumeL, float volumeR) { UpdateScreenParallelRdp(*this, window, GetVI()); - int missedCycles = N64_CYCLES_PER_FRAME(isPAL) - frameCycles; - mmio.ai.Step(cpu->mem, cpu->regs, missedCycles, volumeL, volumeR); + mmio.ai.Step(cpu->mem, cpu->regs, frameCycles, volumeL, volumeR); + scheduler.tick(frameCycles, cpu->mem, cpu->regs); } else if (pause && romLoaded) { UpdateScreenParallelRdp(*this, window, GetVI()); } else if (pause && !romLoaded) { diff --git a/src/backend/MemoryRegions.hpp b/src/backend/MemoryRegions.hpp index 27126c0c..21bc2555 100644 --- a/src/backend/MemoryRegions.hpp +++ b/src/backend/MemoryRegions.hpp @@ -58,6 +58,6 @@ constexpr u64 operator""_gb(unsigned long long int x) { return 1024_mb * x; } -#define ADDRESS_RANGE_SIZE 4_gb +#define ADDRESS_RANGE_SIZE 0x80000000ull #define PAGE_SIZE 4_kb #define PAGE_COUNT ((ADDRESS_RANGE_SIZE) / (PAGE_SIZE)) \ No newline at end of file diff --git a/src/backend/core/BaseCPU.hpp b/src/backend/core/BaseCPU.hpp index 444dcb0c..f4d3ac74 100644 --- a/src/backend/core/BaseCPU.hpp +++ b/src/backend/core/BaseCPU.hpp @@ -6,6 +6,9 @@ struct BaseCPU { virtual ~BaseCPU() {} virtual void Reset() {} virtual int Run() {} + void RunRSP(int cpuCount) { + mem.mmio.rsp.Run(cpuCount, regs, mem); + } Registers regs; Mem mem; }; diff --git a/src/backend/core/Interpreter.cpp b/src/backend/core/Interpreter.cpp index f08ddc6c..13c33e87 100644 --- a/src/backend/core/Interpreter.cpp +++ b/src/backend/core/Interpreter.cpp @@ -26,8 +26,8 @@ void Interpreter::Reset() { } int Interpreter::Run() { - int cycles = 0; - for(; cycles <= mem.mmio.vi.cyclesPerHalfline; cycles++) { + int cycles = 1; + for(; cycles < mem.mmio.vi.cyclesPerHalfline; cycles++) { CheckCompareInterrupt(mem.mmio.mi, regs); regs.prevDelaySlot = regs.delaySlot; diff --git a/src/backend/core/Mem.cpp b/src/backend/core/Mem.cpp index c4817207..1ba84658 100644 --- a/src/backend/core/Mem.cpp +++ b/src/backend/core/Mem.cpp @@ -8,6 +8,8 @@ namespace n64 { Mem::Mem() { + cart = (u8*)calloc(CART_SIZE, 1); + sram = (u8*)calloc(SRAM_SIZE, 1); Reset(); } @@ -22,16 +24,8 @@ void Mem::Reset() { writePages[i] = pointer; } - if(sram) { - free(sram); - } - - if(cart) { - free(cart); - } - - cart = (u8*)calloc(CART_SIZE, 1); - sram = (u8*)calloc(SRAM_SIZE, 1); + memset(cart, 0, CART_SIZE); + memset(sram, 0, SRAM_SIZE); mmio.Reset(); } diff --git a/src/backend/core/RDP.cpp b/src/backend/core/RDP.cpp index 5eeac0af..4166e560 100644 --- a/src/backend/core/RDP.cpp +++ b/src/backend/core/RDP.cpp @@ -6,15 +6,13 @@ namespace n64 { RDP::RDP() { + rdram = (u8*)calloc(RDRAM_SIZE, 1); Reset(); } void RDP::Reset() { dpc.status.raw = 0x80; - if(rdram) { - free(rdram); - } - rdram = (u8*)calloc(RDRAM_SIZE, 1); + memset(rdram, 0, RDRAM_SIZE); memset(cmd_buf, 0, 0x100000); } diff --git a/src/backend/core/RDP.hpp b/src/backend/core/RDP.hpp index 1c88f313..87cca928 100644 --- a/src/backend/core/RDP.hpp +++ b/src/backend/core/RDP.hpp @@ -57,7 +57,7 @@ struct RDP { RDP(); void Reset(); - u8* rdram; + u8* rdram = nullptr; [[nodiscard]] auto Read(u32 addr) const -> u32; void Write(MI& mi, Registers& regs, RSP& rsp, u32 addr, u32 val); void WriteStatus(MI& mi, Registers& regs, RSP& rsp, u32 val); diff --git a/src/common.hpp b/src/common.hpp index ff139422..1b90f57d 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -36,4 +36,5 @@ using m128i = __m128i; #define BYTE_INDEX(i) (15 - (i)) #define unlikely(exp) __builtin_expect(exp, 0) -#define likely(exp) __builtin_expect(exp, 1) \ No newline at end of file +#define likely(exp) __builtin_expect(exp, 1) +#define INLINE static inline __attribute__((always_inline)) \ No newline at end of file diff --git a/src/utils/MemoryHelpers.hpp b/src/utils/MemoryHelpers.hpp index f284667a..f35a7acc 100644 --- a/src/utils/MemoryHelpers.hpp +++ b/src/utils/MemoryHelpers.hpp @@ -7,7 +7,7 @@ namespace Util { template inline T ReadAccess(u8 *data, u32 index) { - if constexpr (sizeof(T) == 1) { + if constexpr (sizeof(T) == 1) { // return data[index]; } else if constexpr (sizeof(T) == 2 || sizeof(T) == 4) { T result = 0;