diff options
| author | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2021-12-08 03:24:56 +0100 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi.dcr@tutanota.com> | 2021-12-08 03:24:56 +0100 |
| commit | ec53e6d22f2a7cdac2af05d77a6b18ea83dcba6c (patch) | |
| tree | 792a77a6be85ca9fa4405805b05ed637bd7cc585 | |
| parent | d78c64ba7c5d77c128b3929867858910488041d6 (diff) | |
spu.c: do not assume 64-byte blocks on SsUpload
| -rw-r--r-- | libpsx/src/spu.c | 10 |
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; } } |
