summaryrefslogtreecommitdiff
path: root/libpsx/src
diff options
context:
space:
mode:
Diffstat (limited to 'libpsx/src')
-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;
}
}