213 lines
3.6 KiB
C
213 lines
3.6 KiB
C
//
|
|
// 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; i<AX0.H; i++)
|
|
{
|
|
AC0.M = *R01++
|
|
AC0.M = AC0.M + AC1.M
|
|
AX1.L = *R01++
|
|
R02 = AC0.M
|
|
*R02 = AX1.L
|
|
}
|
|
|
|
// 0x25c
|
|
R03 = 0x0E05
|
|
*R03++ = R01
|
|
*R03++ = R02
|
|
|
|
// 0x260
|
|
AC0.M = *0x0B87 // AXPB->state
|
|
|
|
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()
|
|
{
|
|
|
|
|
|
} |