diff --git a/.DS_Store b/.DS_Store index fba11cc..436a083 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/armsx.app/Contents/MacOS/armsx b/armsx.app/Contents/MacOS/armsx index 78193b7..81cdca1 100755 Binary files a/armsx.app/Contents/MacOS/armsx and b/armsx.app/Contents/MacOS/armsx differ diff --git a/build/fsui/native/CMakeFiles/fsui-backend-sdl.dir/flags.make b/build/fsui/native/CMakeFiles/fsui-backend-sdl.dir/flags.make index 34ce08e..56c5674 100644 --- a/build/fsui/native/CMakeFiles/fsui-backend-sdl.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui-backend-sdl.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DFSUI_HAS_METAL_RENDERER -DFSUI_HAS_SDL2RENDERER_RENDERER -DFSUI_ CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -I/Users/mohammed/Documents/ARMSX/build/fsui/native -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/glad/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/gladsources/fsui_glad/include -isystem /opt/homebrew/Cellar/sdl2/2.32.10/include/SDL2 -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC -O2 +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui-core.dir/flags.make b/build/fsui/native/CMakeFiles/fsui-core.dir/flags.make index 901302a..7c804d2 100644 --- a/build/fsui/native/CMakeFiles/fsui-core.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui-core.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DFSUI_HAS_METAL_RENDERER -DFSUI_HAS_SDL2RENDERER_RENDERER -DFSUI_ CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/glad/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/gladsources/fsui_glad/include -isystem /opt/homebrew/Cellar/sdl2/2.32.10/include/SDL2 -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC -O2 +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui-donor.dir/flags.make b/build/fsui/native/CMakeFiles/fsui-donor.dir/flags.make index d7b6df8..afe856b 100644 --- a/build/fsui/native/CMakeFiles/fsui-donor.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui-donor.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DFSUI_HAS_METAL_RENDERER -DFSUI_HAS_SDL2RENDERER_RENDERER -DFSUI_ CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/glad/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC -O2 +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui-platform-sdl2.dir/flags.make b/build/fsui/native/CMakeFiles/fsui-platform-sdl2.dir/flags.make index 1ba9938..21067a1 100644 --- a/build/fsui/native/CMakeFiles/fsui-platform-sdl2.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui-platform-sdl2.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DFSUI_HAS_METAL_RENDERER -DFSUI_HAS_SDL2RENDERER_RENDERER -DFSUI_ CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -I/Users/mohammed/Documents/ARMSX/build/fsui/native -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/glad/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -isystem /opt/homebrew/Cellar/sdl2/2.32.10/include/SDL2 -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC -O2 +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui-renderer-metal.dir/flags.make b/build/fsui/native/CMakeFiles/fsui-renderer-metal.dir/flags.make index e5e29f0..8deb973 100644 --- a/build/fsui/native/CMakeFiles/fsui-renderer-metal.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui-renderer-metal.dir/flags.make @@ -6,5 +6,7 @@ OBJCXX_DEFINES = -DFSUI_HAS_METAL_RENDERER -DFSUI_HAS_SDL2RENDERER_RENDERER -DFS OBJCXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -I/Users/mohammed/Documents/ARMSX/build/fsui/native -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/glad/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -F/Volumes/FastDrive/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks -isystem /opt/homebrew/Cellar/sdl2/2.32.10/include/SDL2 -OBJCXX_FLAGS = -std=gnu++2a -mmacosx-version-min=10.15 -fPIC -O2 +OBJCXX_FLAGSarm64 = -std=gnu++2a -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +OBJCXX_FLAGS = -std=gnu++2a -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui-renderer-opengl.dir/flags.make b/build/fsui/native/CMakeFiles/fsui-renderer-opengl.dir/flags.make index 34ce08e..56c5674 100644 --- a/build/fsui/native/CMakeFiles/fsui-renderer-opengl.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui-renderer-opengl.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DFSUI_HAS_METAL_RENDERER -DFSUI_HAS_SDL2RENDERER_RENDERER -DFSUI_ CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -I/Users/mohammed/Documents/ARMSX/build/fsui/native -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/glad/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/gladsources/fsui_glad/include -isystem /opt/homebrew/Cellar/sdl2/2.32.10/include/SDL2 -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC -O2 +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui-renderer-sdl2.dir/flags.make b/build/fsui/native/CMakeFiles/fsui-renderer-sdl2.dir/flags.make index 1ba9938..21067a1 100644 --- a/build/fsui/native/CMakeFiles/fsui-renderer-sdl2.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui-renderer-sdl2.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DFSUI_HAS_METAL_RENDERER -DFSUI_HAS_SDL2RENDERER_RENDERER -DFSUI_ CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -I/Users/mohammed/Documents/ARMSX/build/fsui/native -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/glad/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -isystem /opt/homebrew/Cellar/sdl2/2.32.10/include/SDL2 -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC -O2 +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui-renderer-sdl2surface.dir/flags.make b/build/fsui/native/CMakeFiles/fsui-renderer-sdl2surface.dir/flags.make index 1ba9938..21067a1 100644 --- a/build/fsui/native/CMakeFiles/fsui-renderer-sdl2surface.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui-renderer-sdl2surface.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DFSUI_HAS_METAL_RENDERER -DFSUI_HAS_SDL2RENDERER_RENDERER -DFSUI_ CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -I/Users/mohammed/Documents/ARMSX/build/fsui/native -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/glad/include -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -isystem /opt/homebrew/Cellar/sdl2/2.32.10/include/SDL2 -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC -O2 +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui_glad.dir/flags.make b/build/fsui/native/CMakeFiles/fsui_glad.dir/flags.make index e03f1a1..d834f4b 100644 --- a/build/fsui/native/CMakeFiles/fsui_glad.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui_glad.dir/flags.make @@ -6,5 +6,7 @@ C_DEFINES = -DIMGUI_FRONTEND C_INCLUDES = -I/Users/mohammed/Documents/ARMSX/build/fsui/native/gladsources/fsui_glad/include -C_FLAGS = -mmacosx-version-min=10.15 -fPIC +C_FLAGSarm64 = -arch arm64 -mmacosx-version-min=10.15 -fPIC + +C_FLAGS = -arch arm64 -mmacosx-version-min=10.15 -fPIC diff --git a/build/fsui/native/CMakeFiles/fsui_imgui.dir/flags.make b/build/fsui/native/CMakeFiles/fsui_imgui.dir/flags.make index bfb7521..0c31404 100644 --- a/build/fsui/native/CMakeFiles/fsui_imgui.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui_imgui.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DIMGUI_FRONTEND CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/include -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/imgui/backends -I/Users/mohammed/Documents/ARMSX/third_party/fsui-lib/third_party/stb -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC -O2 +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC -O2 diff --git a/build/fsui/native/CMakeFiles/fsui_resources.dir/flags.make b/build/fsui/native/CMakeFiles/fsui_resources.dir/flags.make index e2d3433..bcaa29a 100644 --- a/build/fsui/native/CMakeFiles/fsui_resources.dir/flags.make +++ b/build/fsui/native/CMakeFiles/fsui_resources.dir/flags.make @@ -6,5 +6,7 @@ CXX_DEFINES = -DIMGUI_FRONTEND CXX_INCLUDES = -I/Users/mohammed/Documents/ARMSX/build/fsui/native/_cmrc/include -CXX_FLAGS = -std=gnu++20 -mmacosx-version-min=10.15 -fPIC +CXX_FLAGSarm64 = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC + +CXX_FLAGS = -std=gnu++20 -arch arm64 -mmacosx-version-min=10.15 -fPIC diff --git a/build/fsui/native/libfsui-backend-sdl.a b/build/fsui/native/libfsui-backend-sdl.a index 187cf8f..2a631ab 100644 Binary files a/build/fsui/native/libfsui-backend-sdl.a and b/build/fsui/native/libfsui-backend-sdl.a differ diff --git a/build/fsui/native/libfsui-core.a b/build/fsui/native/libfsui-core.a index 50f29d0..7a77853 100644 Binary files a/build/fsui/native/libfsui-core.a and b/build/fsui/native/libfsui-core.a differ diff --git a/build/fsui/native/libfsui-donor.a b/build/fsui/native/libfsui-donor.a index ae69675..cf39f37 100644 Binary files a/build/fsui/native/libfsui-donor.a and b/build/fsui/native/libfsui-donor.a differ diff --git a/build/fsui/native/libfsui-platform-sdl2.a b/build/fsui/native/libfsui-platform-sdl2.a index 4a94076..55e6249 100644 Binary files a/build/fsui/native/libfsui-platform-sdl2.a and b/build/fsui/native/libfsui-platform-sdl2.a differ diff --git a/build/fsui/native/libfsui-renderer-metal.a b/build/fsui/native/libfsui-renderer-metal.a index 239c0c8..5b07b09 100644 Binary files a/build/fsui/native/libfsui-renderer-metal.a and b/build/fsui/native/libfsui-renderer-metal.a differ diff --git a/build/fsui/native/libfsui-renderer-opengl.a b/build/fsui/native/libfsui-renderer-opengl.a index ac796b0..6e54703 100644 Binary files a/build/fsui/native/libfsui-renderer-opengl.a and b/build/fsui/native/libfsui-renderer-opengl.a differ diff --git a/build/fsui/native/libfsui-renderer-sdl2.a b/build/fsui/native/libfsui-renderer-sdl2.a index 146dc27..7816609 100644 Binary files a/build/fsui/native/libfsui-renderer-sdl2.a and b/build/fsui/native/libfsui-renderer-sdl2.a differ diff --git a/build/fsui/native/libfsui-renderer-sdl2surface.a b/build/fsui/native/libfsui-renderer-sdl2surface.a index 1f4fe64..b786bf4 100644 Binary files a/build/fsui/native/libfsui-renderer-sdl2surface.a and b/build/fsui/native/libfsui-renderer-sdl2surface.a differ diff --git a/build/fsui/native/libfsui_glad.a b/build/fsui/native/libfsui_glad.a index c8e3407..b2a1ef5 100644 Binary files a/build/fsui/native/libfsui_glad.a and b/build/fsui/native/libfsui_glad.a differ diff --git a/build/fsui/native/libfsui_imgui.a b/build/fsui/native/libfsui_imgui.a index e7dceb5..3a4c6d0 100644 Binary files a/build/fsui/native/libfsui_imgui.a and b/build/fsui/native/libfsui_imgui.a differ diff --git a/build/fsui/native/libfsui_resources.a b/build/fsui/native/libfsui_resources.a index f20c336..b070e8d 100644 Binary files a/build/fsui/native/libfsui_resources.a and b/build/fsui/native/libfsui_resources.a differ diff --git a/psx/dev/spu.c b/psx/dev/spu.c index 1c2a5a9..1b5db35 100644 --- a/psx/dev/spu.c +++ b/psx/dev/spu.c @@ -5,10 +5,57 @@ #include "spu.h" #include "../log.h" -#define CLAMP(v, l, h) (((v) <= (l)) ? (l) : (((v) >= (h)) ? (h) : (v))) -#define MAX(a, b) ((a) > (b) ? (a) : (b)) - -#define VOICE_COUNT 24 +#define CLAMP(v, l, h) (((v) <= (l)) ? (l) : (((v) >= (h)) ? (h) : (v))) +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define SPU_RAM_ADDR_MASK (SPU_RAM_SIZE - 1) +#define SPU_RAM_WORD_ADDR_MASK (SPU_RAM_ADDR_MASK & ~1u) + +#define VOICE_COUNT 24 + +static inline uint32_t spu_wrap_addr(uint32_t addr) { + return addr & SPU_RAM_ADDR_MASK; +} + +static inline uint32_t spu_wrap_word_addr(uint32_t addr) { + return addr & SPU_RAM_WORD_ADDR_MASK; +} + +static inline uint8_t spu_ram_read8(const psx_spu_t* spu, uint32_t addr) { + return spu->ram[spu_wrap_addr(addr)]; +} + +static inline uint16_t spu_ram_read16(const psx_spu_t* spu, uint32_t addr) { + const uint32_t wrapped = spu_wrap_word_addr(addr); + const uint32_t next = spu_wrap_addr(wrapped + 1); + return (uint16_t)(spu->ram[wrapped] | (((uint16_t)spu->ram[next]) << 8)); +} + +static inline void spu_ram_write16(psx_spu_t* spu, uint32_t addr, uint16_t value) { + const uint32_t wrapped = spu_wrap_word_addr(addr); + const uint32_t next = spu_wrap_addr(wrapped + 1); + spu->ram[wrapped] = value & 0xff; + spu->ram[next] = value >> 8; +} + +static inline uint16_t spu_reg_read16(const uint8_t* ptr, uint32_t offset) { + uint16_t value; + memcpy(&value, ptr + offset, sizeof(value)); + return value; +} + +static inline uint32_t spu_reg_read32(const uint8_t* ptr, uint32_t offset) { + uint32_t value; + memcpy(&value, ptr + offset, sizeof(value)); + return value; +} + +static inline void spu_reg_write16(uint8_t* ptr, uint32_t offset, uint16_t value) { + memcpy(ptr + offset, &value, sizeof(value)); +} + +static inline void spu_reg_write32(uint8_t* ptr, uint32_t offset, uint32_t value) { + memcpy(ptr + offset, &value, sizeof(value)); +} // static float interpolate_hermite(float a, float b, float c, float d, float t) { // float x = -a/2.0f + (3.0f*b)/2.0f - (3.0f*c)/2.0f + d/2.0f; @@ -114,25 +161,24 @@ void psx_spu_init(psx_spu_t* spu, psx_ic_t* ic) { spu->irq9addr = 0xffff; } -uint32_t psx_spu_read32(psx_spu_t* spu, uint32_t offset) { - const uint8_t* ptr = (uint8_t*)&spu->voice[0].volumel; +uint32_t psx_spu_read32(psx_spu_t* spu, uint32_t offset) { + const uint8_t* ptr = (uint8_t*)&spu->voice[0].volumel; + + return spu_reg_read32(ptr, offset); +} - return *((uint32_t*)(ptr + offset)); -} - -uint16_t psx_spu_read16(psx_spu_t* spu, uint32_t offset) { - if (offset == SPUR_TFIFO) { - uint16_t data = *(uint16_t*)(&spu->ram[spu->taddr]); - - spu->taddr += 2; - - return data; - } - - const uint8_t* ptr = (uint8_t*)&spu->voice[0].volumel; - - return *((uint16_t*)(ptr + offset)); -} +uint16_t psx_spu_read16(psx_spu_t* spu, uint32_t offset) { + if (offset == SPUR_TFIFO) { + uint16_t data = spu_ram_read16(spu, spu->taddr); + spu->taddr = spu_wrap_word_addr(spu->taddr + 2); + + return data; + } + + const uint8_t* ptr = (uint8_t*)&spu->voice[0].volumel; + + return spu_reg_read16(ptr, offset); +} uint8_t psx_spu_read8(psx_spu_t* spu, uint32_t offset) { log_fatal("Unhandled 8-bit SPU read at offset %08x", offset); @@ -140,11 +186,11 @@ uint8_t psx_spu_read8(psx_spu_t* spu, uint32_t offset) { return 0x0; } -void spu_read_block(psx_spu_t* spu, int v) { - uint32_t addr = spu->data[v].current_addr; - uint8_t hdr = spu->ram[addr]; - - spu->data[v].block_flags = spu->ram[addr + 1]; +void spu_read_block(psx_spu_t* spu, int v) { + uint32_t addr = spu_wrap_addr(spu->data[v].current_addr); + uint8_t hdr = spu_ram_read8(spu, addr); + + spu->data[v].block_flags = spu_ram_read8(spu, addr + 1); unsigned hdr_shift = hdr & 0x0f; @@ -154,11 +200,11 @@ void spu_read_block(psx_spu_t* spu, int v) { unsigned shift = 12 - hdr_shift; unsigned filter = (hdr >> 4) & 7; - int32_t f0 = g_spu_pos_adpcm_table[filter]; - int32_t f1 = g_spu_neg_adpcm_table[filter]; - - for (int j = 0; j < 28; j++) { - uint16_t n = (spu->ram[addr + 2 + (j >> 1)] >> ((j & 1) * 4)) & 0xf; + int32_t f0 = g_spu_pos_adpcm_table[filter]; + int32_t f1 = g_spu_neg_adpcm_table[filter]; + + for (int j = 0; j < 28; j++) { + uint16_t n = (spu_ram_read8(spu, addr + 2 + (j >> 1)) >> ((j & 1) * 4)) & 0xf; // Sign extend t int16_t t = (int16_t)(n << 12) >> 12; @@ -335,13 +381,13 @@ void spu_handle_adsr(psx_spu_t* spu, int v) { void spu_kon(psx_spu_t* spu, uint32_t value) { for (int i = 0; i < VOICE_COUNT; i++) { - if ((value & (1 << i))) { - spu->data[i].playing = 1; - spu->data[i].current_addr = spu->voice[i].adsaddr << 3; - spu->data[i].repeat_addr = spu->voice[i].adraddr << 3; - spu->data[i].lvol = ((float)(spu->voice[i].volumel) / 32767.0f) * 2.0f; - spu->data[i].rvol = ((float)(spu->voice[i].volumer) / 32767.0f) * 2.0f; - spu->data[i].adsr_sustain_level = ((spu->voice[i].envctl1 & 0xf) + 1) * 0x800; + if ((value & (1 << i))) { + spu->data[i].playing = 1; + spu->data[i].current_addr = spu_wrap_addr((uint32_t)spu->voice[i].adsaddr << 3); + spu->data[i].repeat_addr = spu_wrap_addr((uint32_t)spu->voice[i].adraddr << 3); + spu->data[i].lvol = ((float)(spu->voice[i].volumel) / 32767.0f) * 2.0f; + spu->data[i].rvol = ((float)(spu->voice[i].volumer) / 32767.0f) * 2.0f; + spu->data[i].adsr_sustain_level = ((spu->voice[i].envctl1 & 0xf) + 1) * 0x800; spu->data[i].envctl = (((uint32_t)spu->voice[i].envctl2) << 16) | (uint32_t)spu->voice[i].envctl1; @@ -385,46 +431,46 @@ int spu_handle_write(psx_spu_t* spu, uint32_t offset, uint32_t value) { spu_koff(spu, value << (16 * high)); } return 1; - case SPUR_TADDR: { - spu->ramdta = value; - spu->taddr = value << 3; - } return 1; - - case SPUR_TFIFO: { - spu->ramdtf = value; - spu->tfifo[spu->tfifo_index++] = value; - - if (spu->tfifo_index == 32) { - if (((spu->spucnt >> 4) & 3) == 2) { - for (int i = 0; i < spu->tfifo_index; i++) { - spu->ram[spu->taddr++] = spu->tfifo[i] & 0xff; - spu->ram[spu->taddr++] = spu->tfifo[i] >> 8; - } - - spu->tfifo_index = 0; - } - } + case SPUR_TADDR: { + spu->ramdta = value; + spu->taddr = spu_wrap_word_addr((uint32_t)value << 3); + } return 1; + + case SPUR_TFIFO: { + spu->ramdtf = value; + spu->tfifo[spu->tfifo_index++] = value; + + if (spu->tfifo_index == 32) { + if (((spu->spucnt >> 4) & 3) == 2) { + for (int i = 0; i < spu->tfifo_index; i++) { + spu_ram_write16(spu, spu->taddr, spu->tfifo[i]); + spu->taddr = spu_wrap_word_addr(spu->taddr + 2); + } + + spu->tfifo_index = 0; + } + } } return 1; case SPUR_SPUCNT: { spu->spucnt = value; - spu->spustat &= 0xffc0; - spu->spustat |= value & 0x3f; - - if ((value >> 4) & 3) { - for (int i = 0; i < spu->tfifo_index; i++) { - spu->ram[spu->taddr++] = spu->tfifo[i] & 0xff; - spu->ram[spu->taddr++] = spu->tfifo[i] >> 8; - } - - spu->tfifo_index = 0; - } - } return 1; - - case SPUR_MBASE: { - spu->mbase = value; - spu->revbaddr = spu->mbase << 3; - } return 1; + spu->spustat &= 0xffc0; + spu->spustat |= value & 0x3f; + + if ((value >> 4) & 3) { + for (int i = 0; i < spu->tfifo_index; i++) { + spu_ram_write16(spu, spu->taddr, spu->tfifo[i]); + spu->taddr = spu_wrap_word_addr(spu->taddr + 2); + } + + spu->tfifo_index = 0; + } + } return 1; + + case SPUR_MBASE: { + spu->mbase = value; + spu->revbaddr = spu_wrap_word_addr((uint32_t)spu->mbase << 3); + } return 1; } return 0; @@ -435,21 +481,21 @@ void psx_spu_write32(psx_spu_t* spu, uint32_t offset, uint32_t value) { if (spu_handle_write(spu, offset, value)) return; - const uint8_t* ptr = (uint8_t*)&spu->voice[0]; - - *((uint32_t*)(ptr + offset)) = value; -} + uint8_t* ptr = (uint8_t*)&spu->voice[0]; + + spu_reg_write32(ptr, offset, value); +} void psx_spu_write16(psx_spu_t* spu, uint32_t offset, uint16_t value) { // Handle special cases first if (spu_handle_write(spu, offset, value)) return; - const uint8_t* ptr = (uint8_t*)&spu->voice[0].volumel; - - if (offset != 0x0c) - *((uint16_t*)(ptr + offset)) = value; -} + uint8_t* ptr = (uint8_t*)&spu->voice[0].volumel; + + if (offset != 0x0c) + spu_reg_write16(ptr, offset, value); +} void psx_spu_write8(psx_spu_t* spu, uint32_t offset, uint8_t value) { printf("Unhandled 8-bit SPU write at offset %08x (%02x)\n", offset, value); @@ -462,14 +508,14 @@ void psx_spu_destroy(psx_spu_t* spu) { // To-do: Optimize reverb -int16_t spu_read_reverb(psx_spu_t* spu, uint32_t addr) { - uint32_t mbase = spu->mbase << 3; +int16_t spu_read_reverb(psx_spu_t* spu, uint32_t addr) { + uint32_t mbase = spu->mbase << 3; uint32_t relative = (addr + spu->revbaddr - mbase) % (0x80000 - mbase); uint32_t wrapped = (mbase + relative) & 0x7fffe; - return *(int16_t*)(spu->ram + wrapped); -} + return (int16_t)spu_ram_read16(spu, wrapped); +} void spu_write_reverb(psx_spu_t* spu, uint32_t addr, int16_t value) { uint32_t mbase = spu->mbase << 3; @@ -477,8 +523,8 @@ void spu_write_reverb(psx_spu_t* spu, uint32_t addr, int16_t value) { uint32_t relative = (addr + spu->revbaddr - mbase) % (0x80000 - mbase); uint32_t wrapped = (mbase + relative) & 0x7fffe; - *(int16_t*)(spu->ram + wrapped) = value; -} + spu_ram_write16(spu, wrapped, (uint16_t)value); +} #define R16(addr) (spu_read_reverb(spu, addr)) #define W16(addr, value) spu_write_reverb(spu, addr, value) @@ -589,7 +635,7 @@ uint32_t psx_spu_get_sample(psx_spu_t* spu) { spu_handle_adsr(spu, v); - uint32_t sample_index = spu->data[v].counter >> 12; + uint32_t sample_index = spu->data[v].counter >> 12; if (sample_index > 27) { sample_index -= 28; @@ -600,18 +646,20 @@ uint32_t psx_spu_get_sample(psx_spu_t* spu) { if (spu->data[v].block_flags & 4) spu->data[v].repeat_addr = spu->data[v].current_addr; - switch (spu->data[v].block_flags & 3) { - case 0: case 2: { - if (((spu->irq9addr << 3) == spu->data[v].current_addr) && (spu->spucnt & 0x40)) { - psx_ic_irq(spu->ic, IC_SPU); - } - - spu->data[v].current_addr += 0x10; - - if (((spu->irq9addr << 3) == spu->data[v].current_addr) && (spu->spucnt & 0x40)) { - psx_ic_irq(spu->ic, IC_SPU); - } - } break; + switch (spu->data[v].block_flags & 3) { + case 0: case 2: { + const uint32_t irq_addr = spu_wrap_addr((uint32_t)spu->irq9addr << 3); + + if ((irq_addr == spu_wrap_addr(spu->data[v].current_addr)) && (spu->spucnt & 0x40)) { + psx_ic_irq(spu->ic, IC_SPU); + } + + spu->data[v].current_addr = spu_wrap_addr(spu->data[v].current_addr + 0x10); + + if ((irq_addr == spu_wrap_addr(spu->data[v].current_addr)) && (spu->spucnt & 0x40)) { + psx_ic_irq(spu->ic, IC_SPU); + } + } break; case 1: { spu->data[v].current_addr = spu->data[v].repeat_addr; @@ -744,4 +792,4 @@ void psx_spu_update_cdda_buffer(psx_spu_t* spu, void* buf) { } #undef CLAMP -#undef MAX \ No newline at end of file +#undef MAX