spu.c: do not assume 64-byte blocks on SsUpload

This commit is contained in:
Xavier Del Campo Romero 2021-12-08 03:24:56 +01:00
parent d78c64ba7c
commit ec53e6d22f
1 changed files with 6 additions and 4 deletions

View File

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