summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2021-12-08 03:24:56 +0100
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2021-12-08 03:24:56 +0100
commitec53e6d22f2a7cdac2af05d77a6b18ea83dcba6c (patch)
tree792a77a6be85ca9fa4405805b05ed637bd7cc585
parentd78c64ba7c5d77c128b3929867858910488041d6 (diff)
spu.c: do not assume 64-byte blocks on SsUpload
-rw-r--r--libpsx/src/spu.c10
1 files 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;
}
}