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; } }