// // Pseudo C // // // DSP: // // Memory USAGE 0x0B80 to 0x0C40 CurrentPB 0x0B87 0x0E15 SrcSelectFunction // perhaps CMD0 setups some kind of jmp table at this addresses 0x0E16 CoefFunction 0x0E14 MixCtrlFunction 0x0e17 TmpBuffer exceptions 0x0e18 TmpBuffer exceptions 0x0e19 TmpBuffer exceptions // instrcution memory 0x0B31 to 0x0B33 some kind of JMP-Table to handle srcSelect ??? 0x0B34 to 0x0B36 some kind of JMP-Table to handle coefSelect ??? 0x0B11 to 0x0B1F some kind of JMP-Table to handle mixerCtrl ??? void CMD2() { // 0x1BC int_addrPB = (*r00 << 16) | *(r00+1) DMA_From_Memory(0x0B80, _addrPB, 0xC0); // read first PB to 0x0B80 // 0x1C7 *0x0E08 = 0x0000 *0x0E09 = 0x0140 *0x0E0A = 0x0280 *0x0E0B = 0x0400 *0x0E0C = 0x0540 *0x0E0D = 0x0680 *0x0E0E = 0x07C0 *0x0E0F = 0x0900 *0x0E10 = 0x0A40 // 0x1E4 WaitForDMATransfer() // 0x1E6 Addr = (*0x0BA7 << 16) | *0x0BA8 DMA_From_Memory(0x03C0, Addr, 0x80); // Copy Update Data to 0x03C0 (AXPBUPDATE dataHi, dataLo) // 0x1F4 R03 = (*0x0B84) + 0x0B31 // AXPB->srcSelect + 0x0B31 ??? some kind of flag handling ??? SRCSEL can be 0x0 to 0x2 AC0.M = *R03 *0x0E15 = *AC0.M // 0x1FD R03 = (*0x0B85) + 0x0B34 // AXPB->coefSelect + 0x0B34 ??? some kind of flag handling ??? COEF can be 0x0 to 0x2 AC0.M = *R03 *0x0E16 = *AC0.M // 0x206 R03 = (*0x0B86) + 0x0B11 // AXPB->mixerCtrl + 0x0B36 ??? some kind of flag handling ??? MIXCTRL can be 0x0 to 0xE AC0.M = *R03 *0x0E14 = *AC0.M // 0x20F if (*0x0B9B == 0) // AXPBITD->flag (on or off for this voice) { // jmp to 0x23a *0x0E42 = 0x0CE0 *0x0E40 = 0x0CE0 *0x0E41 = 0x0CE0 *0x0E43 = 0x0CE0 WaitForDMATransfer() } else { // code at 0x216 *0x0E40 = *0x0B9E + 0x0CC0 // AXPBITD->shiftL *0x0E41 = *0x0B9F + 0x0CC0 // AXPBITD->shiftR *0x0E42 = 0xCE0 *0x0E43 = 0xCE0 WaitForDMATransfer() // 0x22a Addr = (*0x0B9C << 16) | *0x0B9D DMA_From_Memory(0x0CC0, Addr, 0x40); // (AXPBITD->bufferHi << 16 | AXPBITD->bufferLo) -> 0xCC0 WaitForDMATransfer() } } void CMD0() { } void CMD3() { 0x0E07 = R00 R00 = 0x0BA2 // AXPBUPDATE->updNum R01 = 0x03C0 *0x0E04 = 0x05 AC1 = 0 AC0 = 0 AX0.H = *R00++ // AXPBUPDATE->updNum[0] AC1.M = 0x0B80 // 0x256 for (i=0; istate if (AC0.M == 1) { // JMP 0x267 (AX_PB_STATE_RUN) *0x0E1C = *0x0E42 CALLR *0x0E15 // Load Sample (SrcSelectFunction) // 0x270 AC0.M = *0xBB3 // AXPBVE->currentDelta (.15 volume at start of frame) AC1.M = *0xBB2 // AXPBVE->currentVolume // 0x278 AX0.L = AC1.M AC1.M = AC1.M + AC0.M AC0.M = AC0.M << 1 SET15 // ???? AX1.H = AC0.M AC0.M = AX0.L AX0.L = 0x8000 R00 = 0x0E44 // 0x27f // scale volume table . . . /* for (int i=0; i<32; i++) { *R00++ = AC0.M; prod = AX0.L * AX1.H *R00++ = AC1.M; AC0 = AC0 + prod prod = AX0.L * AX1.H *R00++ = AC0.M; AC1 = AC1 + prod prod = AX0.L * AX1.H }*/ // 0x29f *0xBB2 = CurrentVolume // 0x2a1 // mutiply volume with sample . . . // 0x2ea // Call mixer // 0x02f0 } else { // JMP 0x332 . . . . } } // =============================================================== void Func_0x065D() { }