From ec53e6d22f2a7cdac2af05d77a6b18ea83dcba6c Mon Sep 17 00:00:00 2001 From: Xavier Del Campo Romero Date: Wed, 8 Dec 2021 03:24:56 +0100 Subject: [PATCH] spu.c: do not assume 64-byte blocks on SsUpload --- libpsx/src/spu.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libpsx/src/spu.c b/libpsx/src/spu.c index 53ddf2d..e46d153 100644 --- a/libpsx/src/spu.c +++ b/libpsx/src/spu.c @@ -164,6 +164,8 @@ void SsUpload(const void *addr, int size, int spu_addr) while(size > 0) { + int n = size / sizeof *ptr > 32 ? 32 : size / sizeof *ptr; + SPU_STATUS = 4; // Sound RAM Data Transfer Control SPU_CONTROL = SPU_CONTROL & ~0x30; // SPUCNT.transfer_mode = 0 (STOP) @@ -173,7 +175,7 @@ void SsUpload(const void *addr, int size, int spu_addr) SPU_ADDR = spu_addr >> 3; - for(i = 0; i < 32; i++) + for(i = 0; i < n; i++) SPU_DATA = ptr[i]; SPU_CONTROL = (SPU_CONTROL & ~0x30) | 16; // SPUCNT.transfer_mode = 1 (MANUAL) @@ -183,9 +185,9 @@ void SsUpload(const void *addr, int size, int spu_addr) while(SPU_STATUS2 & 0x400); // wait for transfer busy bit to be cleared - spu_addr += 64; - ptr += 32; - size-=64; + spu_addr += n * sizeof *ptr; + ptr += n; + size-=n * sizeof *ptr; } }