spu.c: do not assume 64-byte blocks on SsUpload
This commit is contained in:
parent
d78c64ba7c
commit
ec53e6d22f
|
@ -164,6 +164,8 @@ void SsUpload(const void *addr, int size, int spu_addr)
|
||||||
|
|
||||||
while(size > 0)
|
while(size > 0)
|
||||||
{
|
{
|
||||||
|
int n = size / sizeof *ptr > 32 ? 32 : size / sizeof *ptr;
|
||||||
|
|
||||||
SPU_STATUS = 4; // Sound RAM Data Transfer Control
|
SPU_STATUS = 4; // Sound RAM Data Transfer Control
|
||||||
SPU_CONTROL = SPU_CONTROL & ~0x30; // SPUCNT.transfer_mode = 0 (STOP)
|
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;
|
SPU_ADDR = spu_addr >> 3;
|
||||||
|
|
||||||
for(i = 0; i < 32; i++)
|
for(i = 0; i < n; i++)
|
||||||
SPU_DATA = ptr[i];
|
SPU_DATA = ptr[i];
|
||||||
|
|
||||||
SPU_CONTROL = (SPU_CONTROL & ~0x30) | 16; // SPUCNT.transfer_mode = 1 (MANUAL)
|
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
|
while(SPU_STATUS2 & 0x400); // wait for transfer busy bit to be cleared
|
||||||
|
|
||||||
spu_addr += 64;
|
spu_addr += n * sizeof *ptr;
|
||||||
ptr += 32;
|
ptr += n;
|
||||||
size-=64;
|
size-=n * sizeof *ptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue