3468 lines
121 KiB
Plaintext
3468 lines
121 KiB
Plaintext
// This document was previously called "DSP_UC_AX1.txt" and "Crazy Taxi.txt"
|
|
// CR is set to #FF all the time in this ucode, so srs/lrs always operate on hw registers.
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Known addresses in DRAM
|
|
Addr Name Description/Notes
|
|
|
|
// Buffers
|
|
0x0000 Main Right
|
|
0x0140 Main Left
|
|
0x0280
|
|
0x0400
|
|
0x0540
|
|
0x0680
|
|
0x07c0
|
|
0x0900
|
|
0x0a40
|
|
|
|
0x03c0 update_block Contains <offset, value> pairs to update current PB with
|
|
|
|
0x0b80 pb Current pb, length = 0xc0
|
|
|
|
0x0e04 ms_remaining Milliseconds remaining to process for current voice
|
|
0x0e05 pUpdate_block Pointer to update_block
|
|
0x0e06 pUpdates_this_ms Pointer to number of updates
|
|
|
|
// Pointers to buffers
|
|
0x0e08 0x0000 See buffers at 0x0000
|
|
0x0e09 0x0140
|
|
0x0e0a 0x0280
|
|
0x0e0b 0x0400
|
|
0x0e0c 0x0540
|
|
0x0e0d 0x0680
|
|
0x0e0e 0x07c0
|
|
0x0e0f 0x0900
|
|
0x0e10 0x0a40
|
|
|
|
// Func pointers
|
|
0x0e14 selectedMixCtrl
|
|
0x0e15 selectedSRC
|
|
0x0e16 selectedCoef Points into DROM
|
|
|
|
// ITD
|
|
0x0e40
|
|
0x0e41
|
|
0x0e42
|
|
0x0e43
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
// Good ol' exception table
|
|
0000 0000 nop
|
|
0001 0000 nop // 0 Reset falls through, kinda wierd...
|
|
0002 029f 0c10 jmp 0x0c10 // 1 Stack U/O flow
|
|
0004 029f 0c1f jmp 0x0c1f // 2
|
|
0006 029f 0c3b jmp 0x0c3b // 3
|
|
0008 029f 0c4a jmp 0x0c4a // 4 ? empty
|
|
000a 029f 0c50 jmp 0x0c50 // 5 accelerator address overflow
|
|
000c 029f 0c82 jmp 0x0c82 // 6 ? empty
|
|
000e 029f 0c88 jmp 0x0c88 // 7 ? empty
|
|
|
|
// Entry point
|
|
void Task_Init() {
|
|
// AX operates in this context all the time
|
|
// 0010 1302 sbset #0x02
|
|
// 0011 1303 sbset #0x03
|
|
// 0012 1204 sbclr #0x04
|
|
// 0013 1305 sbset #0x05
|
|
// 0014 1306 sbset #0x06
|
|
// 0015 8e00 set16
|
|
// 0016 8c00 clr15
|
|
// 0017 8b00 m0
|
|
// 0018 0092 00ff lri $CR, #0x00ff
|
|
|
|
// 001a 8100 clr $ACC0
|
|
// 001b 8900 clr $ACC1
|
|
// 001c 009e 0e80 lri $AC0.M, #0x0e80
|
|
// 001e 00fe 0e1b sr @0x0e1b, $AC0.M
|
|
// 0020 8100 clr $ACC0
|
|
// 0021 00fe 0e31 sr @0x0e31, $AC0.M
|
|
ACC0 = ACC1 = 0
|
|
*0x0e1b = 0xe80 // Used in Cmd8
|
|
*0x0e31 = 0
|
|
|
|
// Send DSP_INIT mail
|
|
// 0023 16fc dcd1 si @DMBH, #0xdcd1
|
|
// 0025 16fd 0000 si @DMBL, #0x0000
|
|
// 0027 16fb 0001 si @DIRQ, #0x0001
|
|
DMB = 0xdcd10000
|
|
// 0029 26fc lrs $AC0.M, @DMBH
|
|
// 002a 02a0 8000 andf $AC0.M, #0x8000
|
|
// 002c 029c 0029 jlnz 0x0029
|
|
while (@DMBH & 0x8000 == 0);
|
|
|
|
// 002e 029f 0045 jmp 0x0045
|
|
goto GetNextCmdBlock;
|
|
}
|
|
|
|
void Task_Resume() {
|
|
// Ensure sane context
|
|
// 0030 1302 sbset #0x02
|
|
// 0031 1303 sbset #0x03
|
|
// 0032 1204 sbclr #0x04
|
|
// 0033 1305 sbset #0x05
|
|
// 0034 1306 sbset #0x06
|
|
// 0035 8e00 set16
|
|
// 0036 8c00 clr15
|
|
// 0037 8b00 m0
|
|
// 0038 0092 00ff lri $CR, #0x00ff
|
|
|
|
// Send DSP_RESUME mail
|
|
// 003a 16fc dcd1 si @DMBH, #0xdcd1
|
|
// 003c 16fd 0001 si @DMBL, #0x0001
|
|
// 003e 16fb 0001 si @DIRQ, #0x0001
|
|
DMB = 0xdcd10001
|
|
// 0040 26fc lrs $AC0.M, @DMBH
|
|
// 0041 02a0 8000 andf $AC0.M, #0x8000
|
|
// 0043 029c 0040 jlnz 0x0040
|
|
while (@DMBH & 0x8000 == 0);
|
|
|
|
GetNextCmdBlock:
|
|
0045 8e00 set16
|
|
0046 8100 clr $ACC0
|
|
0047 8900 clr $ACC1
|
|
0048 009f babe lri $AC1.M, #0xbabe
|
|
|
|
// Wait for 0xbabexxxx mail from cpu
|
|
do {
|
|
// 004a 26fe lrs $AC0.M, @CMBH
|
|
// 004b 02c0 8000 andcf $AC0.M, #0x8000
|
|
// 004d 029c 004a jlnz 0x004a
|
|
while (@CMBH & 0x8000 == 0);
|
|
|
|
// 004f 8200 cmp
|
|
// 0050 0294 004a jnz 0x004a
|
|
} while (@CMBH != 0xbabe);
|
|
|
|
// Save the low 16bits of the mail
|
|
// 0052 23ff lrs $AX1.H, @CMBL
|
|
u16 length = @CMBL
|
|
|
|
// Get next mail
|
|
// 0053 8100 clr $ACC0
|
|
// 0054 26fe lrs $AC0.M, @CMBH
|
|
// 0055 02c0 8000 andcf $AC0.M, #0x8000
|
|
// 0057 029c 0054 jlnz 0x0054
|
|
while (@CMBH & 0x8000 == 0);
|
|
|
|
// 0059 27ff lrs $AC1.M, @CMBL
|
|
// 005a 0240 7fff andi $AC0.M, #0x7fff
|
|
// 005c 2ece srs @DSMAH, $AC0.M
|
|
// 005d 2fcf srs @DSMAL, $AC1.M
|
|
// 005e 16cd 0c00 si @DSPA, #0x0c00
|
|
// 0060 8100 clr $ACC0
|
|
// 0061 2ec9 srs @DSCR, $AC0.M
|
|
// 0062 1ffb mrr $AC1.M, $AX1.H
|
|
// 0063 2fcb srs @DSBL, $AC1.M
|
|
// DMA in the CmdBlock
|
|
static u16* CmdBlockBuf = 0x0c00
|
|
DSMA = (@CMBH & ~0x8000) << 16 | @CMBL
|
|
DSPA = CmdBlockBuf
|
|
DSCR = 0 // CPU -> DMEM
|
|
DSBL = length
|
|
|
|
// 0064 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// Init the CmdBlock pointer
|
|
0066 0080 0c00 lri $AR0, #0x0c00
|
|
|
|
DoNextCommand:
|
|
// 0068 8e00 set16
|
|
// 0069 8100 clr $ACC0
|
|
// 006a 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
// 006b b100 tst $ACC0
|
|
// 006c 0291 007e jl 0x007e
|
|
u16 Cmd = *(CmdBlockBuf++)
|
|
if (Cmd < 0) // How could this be possible? 'l is 16bit load...
|
|
Die_InvalidCmd();
|
|
|
|
// 006e 0a12 lris $AX0.H, #0x12
|
|
// 006f c100 cmpar $ACC0, $AX0.H
|
|
// 0070 0292 007e jg 0x007e
|
|
if (Cmd > 0x12)
|
|
Die_InvalidCmd();
|
|
|
|
// 0072 009f 0aff lri $AC1.M, #0x0aff
|
|
// 0074 4c00 add $ACC0, $ACC1
|
|
// 0075 1c7e mrr $AR3, $AC0.M
|
|
// 0076 0213 ilrr $AC0.M, @$AR3
|
|
// 0077 1c7e mrr $AR3, $AC0.M
|
|
// 0078 176f jmpr $AR3
|
|
switch (Cmd) {
|
|
case 0: Cmd_0(); break; // 0082
|
|
case 1: Cmd_1(); break; // 013e
|
|
case 2: Cmd_2(); break; // 01bc
|
|
case 3: Cmd_3(); break; // 0248
|
|
case 4: Cmd_4(); break; // 0413
|
|
case 5: Cmd_5(); break; // 0427
|
|
case 6: Cmd_6(); break; // 0165
|
|
case 7: Cmd_7(); break; // 0574
|
|
case 8: Cmd_8(); break; // 0b37
|
|
case 9: Cmd_9(); break; // 015f
|
|
case 0xa: Cmd_a(); break; // 0478
|
|
case 0xb: Cmd_b(); break; // 0474
|
|
case 0xc: Cmd_c(); break; // 0476
|
|
case 0xd: Cmd_d(); break; // 01a9
|
|
case 0xe: Cmd_e(); break; // 043b
|
|
case 0xf: Cmd_f(); break; // 047a
|
|
case 0x10: Cmd_10(); break; // 0bb1
|
|
case 0x11: Cmd_11(); break; // 0175
|
|
}
|
|
|
|
// Somehow we've passed the cmd proccessor; DIE!!
|
|
// 0079 16fc fbad si @DMBH, #0xfbad
|
|
// 007b 16fd 8080 si @DMBL, #0x8080
|
|
DMB = 0xfbad8080
|
|
007d 0021 halt
|
|
}
|
|
|
|
// Die and conveniently tell the cpu which cmd was baad
|
|
void Die_InvalidCmd() {
|
|
007e 16fc baad si @DMBH, #0xbaad
|
|
0080 2efd srs @DMBL, $AC0.M
|
|
0081 0021 halt
|
|
}
|
|
|
|
// Executes the same operation 3 times on buffers: (0, 0x0400, 0x07c0)
|
|
void Cmd_0() {
|
|
// 0082 8100 clr $ACC0
|
|
// 0083 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
// 0084 8e78 set16'l : $AC1.M, @$AR0
|
|
u16 maddrh = *(CmdBlockBuf++)
|
|
u16 maddrl = *(CmdBlockBuf++)
|
|
|
|
// 0085 2ece srs @DSMAH, $AC0.M
|
|
// 0086 2fcf srs @DSMAL, $AC1.M
|
|
// 0087 009e 0e44 lri $AC0.M, #0x0e44
|
|
// 0089 2ecd srs @DSPA, $AC0.M
|
|
// 008a 0e00 lris $AC0.M, #0x00
|
|
// 008b 2ec9 srs @DSCR, $AC0.M
|
|
// 008c 009e 0040 lri $AC0.M, #0x0040
|
|
// 008e 2ecb srs @DSBL, $AC0.M
|
|
|
|
// DMA 0x0040bytes to DRAM @ 0x0e44 from CPU @ maddr
|
|
|
|
008f 0081 0e44 lri $AR1, #0x0e44 // source
|
|
0091 0082 0000 lri $AR2, #0x0000 // destination
|
|
|
|
0093 009b 009f lri $AX1.H, #0x009f
|
|
0095 009a 0140 lri $AX0.H, #0x0140 // loop length if !ACC0
|
|
|
|
0097 8100 clr $ACC0
|
|
0098 8900 clr $ACC1
|
|
|
|
0099 8f00 set40
|
|
|
|
// 009a 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
009c 193e lrri $AC0.M, @$AR1
|
|
009d 193c lrri $AC0.L, @$AR1
|
|
009e b100 tst $ACC0
|
|
009f 193f lrri $AC1.M, @$AR1 // added to ACC0 in confusing ways
|
|
// 00a0 0294 00a6 jnz 0x00a6
|
|
if (!$ACC0) {
|
|
00a2 005a loop $AX0.H
|
|
00a3 1b5e srri @$AR2, $AC0.M
|
|
|
|
// 00a4 029f 00ae jmp 0x00ae
|
|
} else {
|
|
00a6 9900 asr16 $ACC1
|
|
00a7 1b5e srri @$AR2, $AC0.M
|
|
00a8 1b5c srri @$AR2, $AC0.L
|
|
00a9 007b 00ad bloop $AX1.H, 0x00ad
|
|
00ab 4c00 add $ACC0, $ACC1
|
|
00ac 1b5e srri @$AR2, $AC0.M
|
|
00ad 1b5c srri @$AR2, $AC0.L
|
|
|
|
}
|
|
|
|
// same code block as above...epic fail?
|
|
00ae 193e lrri $AC0.M, @$AR1
|
|
00af 193c lrri $AC0.L, @$AR1
|
|
00b0 b100 tst $ACC0
|
|
00b1 193f lrri $AC1.M, @$AR1
|
|
// 00b2 0294 00b8 jnz 0x00b8
|
|
if (!$ACC0) {
|
|
00b4 005a loop $AX0.H
|
|
00b5 1b5e srri @$AR2, $AC0.M
|
|
|
|
// 00b6 029f 00c0 jmp 0x00c0
|
|
} else {
|
|
00b8 9900 asr16 $ACC1
|
|
00b9 1b5e srri @$AR2, $AC0.M
|
|
00ba 1b5c srri @$AR2, $AC0.L
|
|
00bb 007b 00bf bloop $AX1.H, 0x00bf
|
|
00bd 4c00 add $ACC0, $ACC1
|
|
00be 1b5e srri @$AR2, $AC0.M
|
|
00bf 1b5c srri @$AR2, $AC0.L
|
|
|
|
}
|
|
|
|
// ...and again! wtf
|
|
00c0 193e lrri $AC0.M, @$AR1
|
|
00c1 193c lrri $AC0.L, @$AR1
|
|
00c2 b100 tst $ACC0
|
|
00c3 193f lrri $AC1.M, @$AR1
|
|
// 00c4 0294 00ca jnz 0x00ca
|
|
if (!$ACC0) {
|
|
00c6 005a loop $AX0.H
|
|
00c7 1b5e srri @$AR2, $AC0.M
|
|
|
|
// 00c8 029f 00d2 jmp 0x00d2
|
|
} else {
|
|
00ca 9900 asr16 $ACC1
|
|
00cb 1b5e srri @$AR2, $AC0.M
|
|
00cc 1b5c srri @$AR2, $AC0.L
|
|
00cd 007b 00d1 bloop $AX1.H, 0x00d1
|
|
00cf 4c00 add $ACC0, $ACC1
|
|
00d0 1b5e srri @$AR2, $AC0.M
|
|
00d1 1b5c srri @$AR2, $AC0.L
|
|
|
|
}
|
|
|
|
// set to next buffer
|
|
00d2 0082 0400 lri $AR2, #0x0400
|
|
|
|
// same code block, uses tst'l in one place...otherwise the same
|
|
00d4 193e lrri $AC0.M, @$AR1
|
|
00d5 193c lrri $AC0.L, @$AR1
|
|
00d6 b179 tst'l $ACC0 : $AC1.M, @$AR1
|
|
// 00d7 0294 00dd jnz 0x00dd
|
|
if (!$ACC0) {
|
|
00d9 005a loop $AX0.H
|
|
00da 1b5e srri @$AR2, $AC0.M
|
|
// 00db 029f 00e5 jmp 0x00e5
|
|
} else {
|
|
00dd 9900 asr16 $ACC1
|
|
00de 1b5e srri @$AR2, $AC0.M
|
|
00df 1b5c srri @$AR2, $AC0.L
|
|
00e0 007b 00e4 bloop $AX1.H, 0x00e4
|
|
00e2 4c00 add $ACC0, $ACC1
|
|
00e3 1b5e srri @$AR2, $AC0.M
|
|
00e4 1b5c srri @$AR2, $AC0.L
|
|
}
|
|
|
|
// same code block, using tst'l again...wonder if it actually changes behavior?
|
|
00e5 193e lrri $AC0.M, @$AR1
|
|
00e6 193c lrri $AC0.L, @$AR1
|
|
00e7 b179 tst'l $ACC0 : $AC1.M, @$AR1
|
|
// 00e8 0294 00ee jnz 0x00ee
|
|
if (!$ACC0) {
|
|
00ea 005a loop $AX0.H
|
|
00eb 1b5e srri @$AR2, $AC0.M
|
|
// 00ec 029f 00f6 jmp 0x00f6
|
|
} else {
|
|
00ee 9900 asr16 $ACC1
|
|
00ef 1b5e srri @$AR2, $AC0.M
|
|
00f0 1b5c srri @$AR2, $AC0.L
|
|
00f1 007b 00f5 bloop $AX1.H, 0x00f5
|
|
00f3 4c00 add $ACC0, $ACC1
|
|
00f4 1b5e srri @$AR2, $AC0.M
|
|
00f5 1b5c srri @$AR2, $AC0.L
|
|
}
|
|
|
|
// see comments above
|
|
00f6 193e lrri $AC0.M, @$AR1
|
|
00f7 193c lrri $AC0.L, @$AR1
|
|
00f8 b179 tst'l $ACC0 : $AC1.M, @$AR1
|
|
// 00f9 0294 00ff jnz 0x00ff
|
|
if (!$ACC0) {
|
|
00fb 005a loop $AX0.H
|
|
00fc 1b5e srri @$AR2, $AC0.M
|
|
// 00fd 029f 0107 jmp 0x0107
|
|
} else {
|
|
00ff 9900 asr16 $ACC1
|
|
0100 1b5e srri @$AR2, $AC0.M
|
|
0101 1b5c srri @$AR2, $AC0.L
|
|
0102 007b 0106 bloop $AX1.H, 0x0106
|
|
0104 4c00 add $ACC0, $ACC1
|
|
0105 1b5e srri @$AR2, $AC0.M
|
|
0106 1b5c srri @$AR2, $AC0.L
|
|
}
|
|
|
|
// set to next buffer
|
|
0107 0082 07c0 lri $AR2, #0x07c0
|
|
|
|
// see comments above
|
|
0109 193e lrri $AC0.M, @$AR1
|
|
010a 193c lrri $AC0.L, @$AR1
|
|
010b b179 tst'l $ACC0 : $AC1.M, @$AR1
|
|
// 010c 0294 0112 jnz 0x0112
|
|
if (!$ACC0) {
|
|
010e 005a loop $AX0.H
|
|
010f 1b5e srri @$AR2, $AC0.M
|
|
// 0110 029f 011a jmp 0x011a
|
|
} else {
|
|
0112 9900 asr16 $ACC1
|
|
0113 1b5e srri @$AR2, $AC0.M
|
|
0114 1b5c srri @$AR2, $AC0.L
|
|
0115 007b 0119 bloop $AX1.H, 0x0119
|
|
0117 4c00 add $ACC0, $ACC1
|
|
0118 1b5e srri @$AR2, $AC0.M
|
|
0119 1b5c srri @$AR2, $AC0.L
|
|
}
|
|
|
|
// see comments above
|
|
011a 193e lrri $AC0.M, @$AR1
|
|
011b 193c lrri $AC0.L, @$AR1
|
|
011c b179 tst'l $ACC0 : $AC1.M, @$AR1
|
|
// 011d 0294 0123 jnz 0x0123
|
|
if (!$ACC0) {
|
|
011f 005a loop $AX0.H
|
|
0120 1b5e srri @$AR2, $AC0.M
|
|
// 0121 029f 012b jmp 0x012b
|
|
} else {
|
|
0123 9900 asr16 $ACC1
|
|
0124 1b5e srri @$AR2, $AC0.M
|
|
0125 1b5c srri @$AR2, $AC0.L
|
|
0126 007b 012a bloop $AX1.H, 0x012a
|
|
0128 4c00 add $ACC0, $ACC1
|
|
0129 1b5e srri @$AR2, $AC0.M
|
|
012a 1b5c srri @$AR2, $AC0.L
|
|
}
|
|
|
|
// see comments above
|
|
012b 193e lrri $AC0.M, @$AR1
|
|
012c 193c lrri $AC0.L, @$AR1
|
|
012d b179 tst'l $ACC0 : $AC1.M, @$AR1
|
|
// 012e 0294 0134 jnz 0x0134
|
|
if (!$ACC0) {
|
|
0130 005a loop $AX0.H
|
|
0131 1b5e srri @$AR2, $AC0.M
|
|
// 0132 029f 013c jmp 0x013c
|
|
} else {
|
|
0134 9900 asr16 $ACC1
|
|
0135 1b5e srri @$AR2, $AC0.M
|
|
0136 1b5c srri @$AR2, $AC0.L
|
|
0137 007b 013b bloop $AX1.H, 0x013b
|
|
0139 4c00 add $ACC0, $ACC1
|
|
013a 1b5e srri @$AR2, $AC0.M
|
|
013b 1b5c srri @$AR2, $AC0.L
|
|
}
|
|
|
|
// 013c 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void Cmd_1() {
|
|
013e 0085 ffff lri $IX1, #0xffff // -1
|
|
|
|
// 0140 8150 clr'l $ACC0 : $AX0.H, @$AR0
|
|
// 0141 8940 clr'l $ACC1 : $AX0.L, @$AR0
|
|
// 0142 8e48 set16'l : $AX1.L, @$AR0
|
|
// 0143 00fa 0e17 sr @0x0e17, $AX0.H
|
|
// 0145 00f8 0e18 sr @0x0e18, $AX0.L
|
|
// 0147 0081 0000 lri $AR1, #0x0000
|
|
// 0149 02bf 04f1 call 0x04f1
|
|
u16 maddrh = *(CmdBlockBuf++)
|
|
u16 maddrl = *(CmdBlockBuf++)
|
|
u16 unkForMulBuffer1 = *(CmdBlockBuf++)
|
|
u16 unkForMulBuffer2 = 0 // a buffer in dram
|
|
Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2)
|
|
|
|
// 014b 00da 0e17 lr $AX0.H, @0x0e17
|
|
// 014d 00d8 0e18 lr $AX0.L, @0x0e18
|
|
// 014f 8948 clr'l $ACC1 : $AX1.L, @$AR0
|
|
// 0150 0081 0400 lri $AR1, #0x0400
|
|
// 0152 02bf 04f1 call 0x04f1
|
|
unkForMulBuffer1 = *(CmdBlockBuf++)
|
|
unkForMulBuffer2 = 0x0400
|
|
Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2)
|
|
|
|
// 0154 00da 0e17 lr $AX0.H, @0x0e17
|
|
// 0156 00d8 0e18 lr $AX0.L, @0x0e18
|
|
// 0158 8948 clr'l $ACC1 : $AX1.L, @$AR0
|
|
// 0159 0081 07c0 lri $AR1, #0x07c0
|
|
// 015b 02bf 04f1 call 0x04f1
|
|
unkForMulBuffer1 = *(CmdBlockBuf++)
|
|
unkForMulBuffer2 = 0x07c0
|
|
Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2)
|
|
|
|
// 015d 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void Cmd_9() {
|
|
015f 0086 07c0 lri $IX2, #0x07c0 // often used buffer in dram
|
|
|
|
0161 02bf 0484 call 0x0484
|
|
|
|
// 0163 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void Cmd_6() {
|
|
0165 8100 clr $ACC0
|
|
0166 8e00 set16
|
|
|
|
// 0167 191e lrri $AC0.M, @$AR0
|
|
// 0168 191c lrri $AC0.L, @$AR0
|
|
u16 maddrh = *(CmdBlockBuf++)
|
|
u16 maddrl = *(CmdBlockBuf++)
|
|
|
|
// 0169 2ece srs @DSMAH, $AC0.M
|
|
// 016a 2ccf srs @DSMAL, $AC0.L
|
|
// 016b 16cd 0000 si @DSPA, #0x0000
|
|
// 016d 16c9 0001 si @DSCR, #0x0001
|
|
// 016f 16cb 0780 si @DSBL, #0x0780
|
|
|
|
// DMA 0x780bytes to CPU @ maddr from DMEM @ 0
|
|
|
|
// 0171 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 0173 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void Cmd_11() {
|
|
// 0175 8100 clr $ACC0
|
|
// 0176 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
// 0177 8e60 set16'l : $AC0.L, @$AR0
|
|
u16 maddrh = *(CmdBlockBuf++)
|
|
u16 maddrl = *(CmdBlockBuf++)
|
|
|
|
// 0178 2ece srs @DSMAH, $AC0.M
|
|
// 0179 2ccf srs @DSMAL, $AC0.L
|
|
// 017a 16cd 0e44 si @DSPA, #0x0e44
|
|
// 017c 16c9 0000 si @DSCR, #0x0000
|
|
// 017e 8900 clr $ACC1
|
|
// 017f 0d20 lris $AC1.L, #0x20
|
|
// 0180 2dcb srs @DSBL, $AC1.L
|
|
|
|
// DMA 0x20bytes to DRAM @ 0x0e44 from CPU @ maddr
|
|
|
|
u16 length_of_0e44 = 0x20
|
|
|
|
// 0181 4c00 add $ACC0, $ACC1
|
|
maddr += length_of_0e44
|
|
|
|
// Save CmdBlockBuf
|
|
// 0182 1c80 mrr $IX0, $AR0
|
|
|
|
// 0183 0080 0280 lri $AR0, #0x0280
|
|
// 0185 0081 0000 lri $AR1, #0x0000
|
|
// 0187 0082 0140 lri $AR2, #0x0140
|
|
// 0189 0083 0e44 lri $AR3, #0x0e44
|
|
// 018b 0a00 lris $AX0.H, #0x00
|
|
|
|
// 018c 27c9 lrs $AC1.M, @DSCR
|
|
// 018d 03a0 0004 andf $AC1.M, #0x0004
|
|
// 018f 029c 018c jlnz 0x018c
|
|
while (@DSCR & 4);
|
|
|
|
// 0191 2ece srs @DSMAH, $AC0.M
|
|
// 0192 2ccf srs @DSMAL, $AC0.L
|
|
// 0193 16cd 0e54 si @DSPA, #0x0e54
|
|
// 0195 16c9 0000 si @DSCR, #0x0000
|
|
// 0197 16cb 0260 si @DSBL, #0x0260
|
|
|
|
// DMA 0x0260bytes to DRAM @ 0x0e54 from CPU @ maddr
|
|
|
|
// 0199 009f 00a0 lri $AC1.M, #0x00a0
|
|
// 019b 8f00 set40
|
|
// 019c 007f 01a5 bloop $AC1.M, 0x01a5
|
|
// 019e 197e lrri $AC0.M, @$AR3
|
|
// 019f 1b1a srri @$AR0, $AX0.H
|
|
// 01a0 197c lrri $AC0.L, @$AR3
|
|
// 01a1 1b1a srri @$AR0, $AX0.H
|
|
// 01a2 1b5e srri @$AR2, $AC0.M
|
|
// 01a3 7c22 neg's $ACC0 : @$AR2, $AC0.L
|
|
// 01a4 1b3e srri @$AR1, $AC0.M
|
|
// 01a5 1b3c srri @$AR1, $AC0.L
|
|
|
|
// high reg will only be sign bits, and it's never stored, so we can use s32 here
|
|
s32* buffer_source = 0x0e44
|
|
s32* buffer_dest = 0x0140
|
|
s32* buffer_to_zero = 0x0280
|
|
s32* buffer_dest_neg = 0x0000
|
|
for (i = 0x00a0; i > 0; i--) {
|
|
s32 thing = *(buffer_source++)
|
|
*(buffer_to_zero++) = 0
|
|
*(buffer_dest++) = thing
|
|
*(buffer_dest_neg++) = ~thing
|
|
}
|
|
|
|
// Restore CmdBlockBuf
|
|
01a6 1c04 mrr $AR0, $IX0
|
|
|
|
// 01a7 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
// Interesting, DMAs in new CmdBlock and starts executing it
|
|
void Cmd_D() {
|
|
// 01a9 8e70 set16'l : $AC0.M, @$AR0
|
|
// 01aa 8960 clr'l $ACC1 : $AC0.L, @$AR0
|
|
u16 maddrh = *(CmdBlockBuf++)
|
|
u16 maddrl = *(CmdBlockBuf++)
|
|
|
|
// 01ab 191f lrri $AC1.M, @$AR0
|
|
u16 numbytes = *(CmdBlockBuf++)
|
|
|
|
// 01ac 2ece srs @DSMAH, $AC0.M
|
|
// 01ad 2ccf srs @DSMAL, $AC0.L
|
|
// 01ae 16cd 0c00 si @DSPA, #0x0c00
|
|
// 01b0 16c9 0000 si @DSCR, #0x0000
|
|
// 01b2 0503 addis $AC1.M, #0x03
|
|
// 01b3 0340 fff0 andi $AC1.M, #0xfff0
|
|
// 01b5 2fcb srs @DSBL, $AC1.M
|
|
|
|
// DMA ((numbytes + 3) & 0xfff0)bytes to DMEM @ 0x0c00 from CPU @ maddr
|
|
|
|
// 01b6 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 01b8 0080 0c00 lri $AR0, #0x0c00
|
|
CmdBlockBuf = 0x0c00
|
|
|
|
// 01ba 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
// DMAs in a new PB and inits values (itd, func pointers, etc)
|
|
// DMAs in new update_block, but doesn't apply it
|
|
void Cmd_2() {
|
|
01bc 8100 clr $ACC0
|
|
|
|
// 01bd 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
// 01be 8e78 set16'l : $AC1.M, @$AR0
|
|
u16 maddrh = *(CmdBlockBuf++)
|
|
u16 maddrl = *(CmdBlockBuf++)
|
|
|
|
// 01bf 2ece srs @DSMAH, $AC0.M
|
|
// 01c0 2fcf srs @DSMAL, $AC1.M
|
|
// 01c1 16cd 0b80 si @DSPA, #0x0b80
|
|
// 01c3 16c9 0000 si @DSCR, #0x0000
|
|
// 01c5 16cb 00c0 si @DSBL, #0x00c0
|
|
|
|
// DMA 0x00c0bytes to DMEM @ 0x0b80 from CPU @ maddr
|
|
|
|
// 01c7 0082 0e08 lri $AR2, #0x0e08
|
|
// 01c9 009f 0000 lri $AC1.M, #0x0000
|
|
// 01cb 1b5f srri @$AR2, $AC1.M
|
|
// 01cc 009f 0140 lri $AC1.M, #0x0140
|
|
// 01ce 1b5f srri @$AR2, $AC1.M
|
|
// 01cf 009f 0280 lri $AC1.M, #0x0280
|
|
// 01d1 1b5f srri @$AR2, $AC1.M
|
|
// 01d2 009f 0400 lri $AC1.M, #0x0400
|
|
// 01d4 1b5f srri @$AR2, $AC1.M
|
|
// 01d5 009f 0540 lri $AC1.M, #0x0540
|
|
// 01d7 1b5f srri @$AR2, $AC1.M
|
|
// 01d8 009f 0680 lri $AC1.M, #0x0680
|
|
// 01da 1b5f srri @$AR2, $AC1.M
|
|
// 01db 009f 07c0 lri $AC1.M, #0x07c0
|
|
// 01dd 1b5f srri @$AR2, $AC1.M
|
|
// 01de 009f 0900 lri $AC1.M, #0x0900
|
|
// 01e0 1b5f srri @$AR2, $AC1.M
|
|
// 01e1 009f 0a40 lri $AC1.M, #0x0a40
|
|
// 01e3 1b5f srri @$AR2, $AC1.M
|
|
*0x0e08 = 0x0000
|
|
*0x0e09 = 0x0140
|
|
*0x0e0a = 0x0280
|
|
*0x0e0b = 0x0400
|
|
*0x0e0c = 0x0540
|
|
*0x0e0d = 0x0680
|
|
*0x0e0e = 0x07c0
|
|
*0x0e0f = 0x0900
|
|
*0x0e10 = 0x0a40
|
|
|
|
// 01e4 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 01e6 00de 0ba7 lr $AC0.M, @0x0ba7
|
|
// 01e8 00df 0ba8 lr $AC1.M, @0x0ba8
|
|
// 01ea 2ece srs @DSMAH, $AC0.M
|
|
// 01eb 2fcf srs @DSMAL, $AC1.M
|
|
// 01ec 16cd 03c0 si @DSPA, #0x03c0
|
|
// 01ee 16c9 0000 si @DSCR, #0x0000
|
|
// 01f0 16cb 0080 si @DSBL, #0x0080
|
|
|
|
// DMA 0x80bytes from CPU @ ((pb.update.dataHi << 16) | pb.update.dataLo) to DRAM @ 0x03c0
|
|
|
|
// 01f2 8100 clr $ACC0
|
|
// 01f3 8900 clr $ACC1
|
|
|
|
// 01f4 00de 0b84 lr $AC0.M, @0x0b84
|
|
// 01f6 009f 0b31 lri $AC1.M, #0x0b31
|
|
// 01f8 4c00 add $ACC0, $ACC1
|
|
// 01f9 1c7e mrr $AR3, $AC0.M
|
|
// 01fa 0213 ilrr $AC0.M, @$AR3
|
|
// 01fb 00fe 0e15 sr @0x0e15, $AC0.M
|
|
*0x0e15 = *(0x0b31 + pb.srcSelect) // func ptr for src
|
|
|
|
// 01fd 00de 0b85 lr $AC0.M, @0x0b85
|
|
// 01ff 009f 0b34 lri $AC1.M, #0x0b34
|
|
// 0201 4c00 add $ACC0, $ACC1
|
|
// 0202 1c7e mrr $AR3, $AC0.M
|
|
// 0203 0213 ilrr $AC0.M, @$AR3
|
|
// 0204 00fe 0e16 sr @0x0e16, $AC0.M
|
|
*0x0e16 = *(0x0b34 + pb.coefSelect) // ptr to coef table
|
|
|
|
// 0206 00de 0b86 lr $AC0.M, @0x0b86
|
|
// 0208 009f 0b11 lri $AC1.M, #0x0b11
|
|
// 020a 4c00 add $ACC0, $ACC1
|
|
// 020b 1c7e mrr $AR3, $AC0.M
|
|
// 020c 0213 ilrr $AC0.M, @$AR3
|
|
// 020d 00fe 0e14 sr @0x0e14, $AC0.M
|
|
*0x0e14 = *(0x0b11 + pb.mixerCtrl) // func ptr for mixer
|
|
|
|
// 020f 8100 clr $ACC0
|
|
// 0210 00de 0b9b lr $AC0.M, @0x0b9b
|
|
// 0212 b100 tst $ACC0
|
|
// 0213 0295 023a jz 0x023a
|
|
if (pb.itd.flag != AX_PB_ITD_OFF) {
|
|
// 0215 8900 clr $ACC1
|
|
// 0216 00df 0b9e lr $AC1.M, @0x0b9e
|
|
// 0218 0300 0cc0 addi $AC1.M, #0x0cc0
|
|
// 021a 00ff 0e40 sr @0x0e40, $AC1.M
|
|
*0x0e40 = 0x0cc0 + pb.itd.shiftL
|
|
|
|
// 021c 00df 0b9f lr $AC1.M, @0x0b9f
|
|
// 021e 0300 0cc0 addi $AC1.M, #0x0cc0
|
|
// 0220 00ff 0e41 sr @0x0e41, $AC1.M
|
|
*0x0e41 = 0x0cc0 + pb.itd.shiftR
|
|
|
|
// 0222 009f 0ce0 lri $AC1.M, #0x0ce0
|
|
// 0224 00ff 0e42 sr @0x0e42, $AC1.M
|
|
// 0226 00ff 0e43 sr @0x0e43, $AC1.M
|
|
*0x0e42 = 0x0ce0
|
|
*0x0e43 = 0x0ce0
|
|
|
|
// 0228 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 022a 00de 0b9c lr $AC0.M, @0x0b9c
|
|
// 022c 2ece srs @DSMAH, $AC0.M
|
|
// 022d 00de 0b9d lr $AC0.M, @0x0b9d
|
|
// 022f 2ecf srs @DSMAL, $AC0.M
|
|
// 0230 16cd 0cc0 si @DSPA, #0x0cc0
|
|
// 0232 16c9 0000 si @DSCR, #0x0000
|
|
// 0234 16cb 0040 si @DSBL, #0x0040
|
|
|
|
// DMA 0x0040bytes to DMEM @ 0x0cc0 from CPU @ (pb.itd.bufferHi << 16) | pb.itd.bufferLo
|
|
|
|
// 0236 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 0238 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
|
|
} else {
|
|
|
|
// 023a 009f 0ce0 lri $AC1.M, #0x0ce0
|
|
// 023c 00ff 0e42 sr @0x0e42, $AC1.M
|
|
// 023e 00ff 0e40 sr @0x0e40, $AC1.M
|
|
// 0240 00ff 0e41 sr @0x0e41, $AC1.M
|
|
// 0242 00ff 0e43 sr @0x0e43, $AC1.M
|
|
*0x0e42 = 0x0ce0
|
|
*0x0e40 = 0x0ce0
|
|
*0x0e41 = 0x0ce0
|
|
*0x0e43 = 0x0ce0
|
|
|
|
// 0244 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 0246 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
}
|
|
|
|
// Function calls itself until there are no more linked PBs
|
|
void Cmd_3() {
|
|
0248 8e00 set16
|
|
|
|
// Save CmdBlockBuf ptr
|
|
0249 00e0 0e07 sr @0x0e07, $AR0
|
|
|
|
// Processes pb.update.updNum[0] to pb.update.updNum[5]
|
|
// Applies specified number of updates for every millisecond of voice frame (5 millisecs)
|
|
// first millisec's updates are ignored <- not proven, yet
|
|
|
|
// 024b 0080 0ba2 lri $AR0, #0x0ba2 // pb.update.updNum[0]
|
|
// 024d 0081 03c0 lri $AR1, #0x03c0
|
|
// 024f 0e05 lris $AC0.M, #0x05
|
|
// 0250 00fe 0e04 sr @0x0e04, $AC0.M // counter to decrement
|
|
// 0252 8900 clr $ACC1
|
|
u16* pUpdates_this_ms = 0x0ba2
|
|
u16* pUpdate_block = 0x03c0
|
|
u16 ms_remaining = 5
|
|
|
|
NextMillisecUpd:
|
|
// 0253 8150 clr'l $ACC0 : $AX0.H, @$AR0
|
|
// 0254 009f 0b80 lri $AC1.M, #0x0b80
|
|
// 0256 007a 025b bloop $AX0.H, 0x025b
|
|
// 0258 193e lrri $AC0.M, @$AR1
|
|
// 0259 4c49 add'l $ACC0, $ACC1 : $AX1.L, @$AR1
|
|
// 025a 1c5e mrr $AR2, $AC0.M
|
|
// 025b 1a59 srr @$AR2, $AX1.L // AR2 isn't changed till updates are done
|
|
|
|
// Write updates from update_block to pb in dram
|
|
for (int i = 0; i < *pUpdates_this_ms; i+=2) {
|
|
// Looks like 0x03c0 is a struct of <offset, value> pairs to write into PB
|
|
*(0x0b80 + *(pUpdate_block + i)) = *(pUpdate_block + i + 1)
|
|
}
|
|
pUpdates_this_ms++
|
|
|
|
// 025c 0083 0e05 lri $AR3, #0x0e05
|
|
// 025e 1b61 srri @$AR3, $AR1
|
|
// 025f 1b60 srri @$AR3, $AR0
|
|
*0x0e05 = pUpdate_block
|
|
*0x0e06 = pUpdates_this_ms
|
|
// They are restored before jmping back to NextMillisecUpd
|
|
|
|
// 0260 00de 0b87 lr $AC0.M, @0x0b87
|
|
// 0262 0601 cmpis $AC0.M, #0x01
|
|
// 0263 0295 0267 jz 0x0267
|
|
// 0265 029f 0332 jmp 0x0332
|
|
if (pb.state == AX_PB_STATE_RUN) {
|
|
|
|
// 0267 00de 0e42 lr $AC0.M, @0x0e42
|
|
// 0269 00fe 0e1c sr @0x0e1c, $AC0.M
|
|
*0x0e1c = *0x0e42
|
|
|
|
// 026b 00c3 0e15 lr $AR3, @0x0e15
|
|
// 026d 177f callr $AR3
|
|
DoSelectedSRC()
|
|
|
|
// Volume Envelope Processing
|
|
// 026e 8e00 set16
|
|
// 026f 8a00 m2
|
|
// 0270 8100 clr $ACC0
|
|
// 0271 8900 clr $ACC1
|
|
// 0272 00de 0bb3 lr $AC0.M, @0x0bb3 // currentDelta (s16)
|
|
// 0274 00df 0bb2 lr $AC1.M, @0x0bb2 // currentVolume (u16)
|
|
// 0276 1f1f mrr $AX0.L, $AC1.M
|
|
// 0277 4d00 add $ACC1, $ACC0
|
|
// 0278 1481 asl $ACC0, #1
|
|
// 0279 8d1e set15'mv : $AX1.H, $AC0.M // unsigned mulx,
|
|
// 027a 1fd8 mrr $AC0.M, $AX0.L
|
|
// 027b 0098 8000 lri $AX0.L, #0x8000
|
|
// 027d 0080 0e44 lri $AR0, #0x0e44
|
|
// 027f a830 mulx's $AX0.L, $AX1.H : @$AR0, $AC0.M
|
|
// 0280 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0281 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0282 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0283 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0284 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0285 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0286 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0287 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0288 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0289 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 028a ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 028b ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 028c ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 028d ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 028e ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 028f ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0290 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0291 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0292 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0293 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0294 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0295 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0296 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0297 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 0298 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 0299 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 029a ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 029b ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 029c ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 029d ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
|
|
// 029e ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
|
|
// 029f 00fe 0bb2 sr @0x0bb2, $AC0.M
|
|
|
|
u40 temp1 = pb.ve.currentVolume << 16
|
|
u40 temp2 = (pb.ve.currentVolume + pb.ve.currentDelta) << 16
|
|
*0x0e44 = temp1 >> 16
|
|
*0x0e45 = temp2 >> 16
|
|
|
|
u40 PROD = (u16)0x8000 * (u16)(pb.ve.currentDelta << 1) * 2
|
|
for (u16* i = 0x0e46; i < 0x0e46 + 30; i+=2) {
|
|
temp1 += PROD
|
|
temp2 += PROD
|
|
|
|
*i = temp1 >> 16
|
|
*(i + 1) = temp2 >> 16
|
|
}
|
|
temp1 += PROD
|
|
pb.ve.currentVolume = temp1 >> 16
|
|
|
|
// 02a1 8f00 set40
|
|
// 02a2 0080 0e44 lri $AR0, #0x0e44
|
|
// 02a4 00c1 0e43 lr $AR1, @0x0e43
|
|
// 02a6 1c61 mrr $AR3, $AR1
|
|
// 02a7 193a lrri $AX0.H, @$AR1
|
|
// 02a8 1918 lrri $AX0.L, @$AR0
|
|
// 02a9 9059 mul'l $AX0.L, $AX0.H : $AX1.H, @$AR1
|
|
// 02aa 1919 lrri $AX1.L, @$AR0
|
|
// 02ab 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02ac 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02ad 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02ae 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02af 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02b0 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02b1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02b2 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02b3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02b4 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02b5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02b6 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02b7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02b8 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02b9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02ba 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02bb 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02bc 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02bd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02be 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02bf 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02c0 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02c1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02c2 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02c3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02c4 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02c5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02c6 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02c7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02c8 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02c9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02ca 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02cb 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02cc 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02cd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02ce 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02cf 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02d0 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02d1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02d2 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02d3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02d4 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02d5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02d6 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02d7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02d8 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02d9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02da 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02db 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02dc 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02dd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02de 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02df 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02e0 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02e1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02e2 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02e3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
|
|
// 02e4 8080 nx'ls : $AX0.L, $AC0.M
|
|
// 02e5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
|
|
// 02e6 8091 nx'ls : $AX1.L, $AC1.M
|
|
// 02e7 9e00 mulmv $AX1.L, $AX1.H, $ACC0
|
|
// 02e8 6f33 movp's $ACC1 : @$AR3, $AC0.M
|
|
// 02e9 1b7f srri @$AR3, $AC1.M
|
|
|
|
u16* dst = *0x0e43
|
|
u16* temp1 = 0x0e44
|
|
|
|
for (x = 0; x < 0x20; x++) {
|
|
*(dst + x) = ((u16)*(temp1 + x) * (u16)*(dst + x) * 2) >> 16
|
|
}
|
|
|
|
// 02ea 00c3 0e14 lr $AR3, @0x0e14
|
|
// 02ec 8f00 set40
|
|
// 02ed 8d00 set15
|
|
// 02ee 8a00 m2
|
|
// 02ef 177f callr $AR3
|
|
// Keep in mind: 40bit, unsigned, *2
|
|
DoSelectedMixer()
|
|
|
|
// Note: 40bit, unsigned, *2 not changed till 0x0332
|
|
|
|
// 02f0 8100 clr $ACC0
|
|
// 02f1 00de 0b9b lr $AC0.M, @0x0b9b
|
|
// 02f3 b100 tst $ACC0
|
|
// 02f4 0295 032a jz 0x032a
|
|
if (pb.itd.flag != AX_PB_ITD_OFF) {
|
|
// 02f6 00de 0e42 lr $AC0.M, @0x0e42
|
|
// 02f8 00fe 0e43 sr @0x0e43, $AC0.M
|
|
*0x0e43 = *0x0e42
|
|
|
|
// 02fa 8100 clr $ACC0
|
|
// 02fb 8900 clr $ACC1
|
|
// 02fc 00de 0b9e lr $AC0.M, @0x0b9e
|
|
// 02fe 00df 0ba0 lr $AC1.M, @0x0ba0
|
|
// 0300 8200 cmp
|
|
// 0301 0293 0306 jle 0x0306
|
|
if (pb.itd.shiftL > pb.itd.targetShiftL) {
|
|
// 0303 7800 decm $AC0.M
|
|
// 0304 029f 0309 jmp 0x0309
|
|
pb.itd.shiftL--
|
|
} else if (pb.itd.shiftL < pb.itd.targetShiftL) {
|
|
// 0306 0295 0309 jz 0x0309
|
|
// 0308 7400 incm $AC0.M
|
|
pb.itd.shiftL++
|
|
}
|
|
// 0309 00fe 0b9e sr @0x0b9e, $AC0.M // Store pb.itd.shiftL
|
|
|
|
// 030b 00df 0e43 lr $AC1.M, @0x0e43
|
|
// 030d 05e0 addis $AC1.M, #0xe0
|
|
// 030e 4c00 add $ACC0, $ACC1
|
|
// 030f 00fe 0e40 sr @0x0e40, $AC0.M
|
|
*0x0e40 = *0x0e43 - 32
|
|
|
|
// 0311 8100 clr $ACC0
|
|
// 0312 8900 clr $ACC1
|
|
// 0313 00de 0b9f lr $AC0.M, @0x0b9f
|
|
// 0315 00df 0ba1 lr $AC1.M, @0x0ba1
|
|
// 0317 8200 cmp
|
|
// 0318 0293 031d jle 0x031d
|
|
if (pb.itd.shiftR > pb.itd.targetShiftR) {
|
|
// 031a 7800 decm $AC0.M
|
|
// 031b 029f 0320 jmp 0x0320
|
|
pb.itd.shiftR--
|
|
} else if (pb.itd.shiftR < pb.itd.targetShiftR) {
|
|
// 031d 0295 0320 jz 0x0320
|
|
// 031f 7400 incm $AC0.M
|
|
pb.itd.shiftR++
|
|
}
|
|
// 0320 00fe 0b9f sr @0x0b9f, $AC0.M // Store pb.itd.shiftR
|
|
|
|
// 0322 00df 0e43 lr $AC1.M, @0x0e43
|
|
// 0324 05e0 addis $AC1.M, #0xe0
|
|
// 0325 4c00 add $ACC0, $ACC1
|
|
// 0326 00fe 0e41 sr @0x0e41, $AC0.M
|
|
*0x0e41 = *0x0e43 - 32
|
|
|
|
0328 029f 0332 jmp 0x0332
|
|
|
|
} else { // pb.itd.flag == AX_PB_ITD_OFF
|
|
|
|
// 032a 00de 0e42 lr $AC0.M, @0x0e42
|
|
// 032c 00fe 0e40 sr @0x0e40, $AC0.M
|
|
// 032e 00fe 0e41 sr @0x0e41, $AC0.M
|
|
// 0330 00fe 0e43 sr @0x0e43, $AC0.M
|
|
*0x0e40 = *0x0e42
|
|
*0x0e41 = *0x0e42
|
|
*0x0e43 = *0x0e42
|
|
}
|
|
}
|
|
|
|
|
|
// 0332 8100 clr $ACC0
|
|
// 0333 8e00 set16
|
|
// 0334 8400 clrp
|
|
// 0335 8900 clr $ACC1
|
|
// 0336 1efe mrr $PROD.M2, $AC0.M
|
|
// 0337 0e40 lris $AC0.M, #0x40
|
|
// 0338 1ebe mrr $PROD.M1, $AC0.M
|
|
// 0339 0083 0e08 lri $AR3, #0x0e08
|
|
// 033b 1c03 mrr $AR0, $AR3
|
|
// 033c 1ff5 mrr $AC1.M, $PROD.M1
|
|
// 033d 191a lrri $AX0.H, @$AR0
|
|
// 033e f858 addpaxz'l $ACC0, $AX0.H : $AX1.H, @$AR0
|
|
// 033f fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M
|
|
// 0340 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M
|
|
// 0341 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M
|
|
// 0342 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M
|
|
// 0343 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M
|
|
// 0344 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M
|
|
// 0345 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M
|
|
// 0346 f83b addpaxz's $ACC0, $AX0.H : @$AR3, $AC1.M
|
|
// 0347 1b7e srri @$AR3, $AC0.M
|
|
|
|
for (u16* i = 0x0e08; i <= 0x0e10; i++) {
|
|
*i = (u16)( (0xff00400000 + (u40)(*i << 16)) >> 16 )
|
|
}
|
|
|
|
// 0348 0083 0e04 lri $AR3, #0x0e04
|
|
// 034a 8100 clr $ACC0
|
|
// 034b 8973 clr'l $ACC1 : $AC0.M, @$AR3
|
|
// 034c 1961 lrri $AR1, @$AR3 // 0x0e05
|
|
// 034d 1960 lrri $AR0, @$AR3 // 0x0e06
|
|
// 034e 7800 decm $AC0.M
|
|
// 034f 00fe 0e04 sr @0x0e04, $AC0.M
|
|
// 0351 0294 0253 jnz 0x0253
|
|
ms_remaining--
|
|
if (ms_remaining)
|
|
goto NextMillisecUpd
|
|
|
|
// 0353 8e00 set16
|
|
// 0354 8100 clr $ACC0
|
|
// 0355 00de 0b9b lr $AC0.M, @0x0b9b
|
|
// 0357 b100 tst $ACC0
|
|
// 0358 0295 036a jz 0x036a
|
|
if (pb.itd.flag != AX_PB_ITD_OFF) {
|
|
|
|
// 035a 00de 0b9c lr $AC0.M, @0x0b9c
|
|
// 035c 00dc 0b9d lr $AC0.L, @0x0b9d
|
|
// 035e 2ece srs @DSMAH, $AC0.M
|
|
// 035f 2ccf srs @DSMAL, $AC0.L
|
|
// 0360 8100 clr $ACC0
|
|
// 0361 00de 0e1c lr $AC0.M, @0x0e1c
|
|
// 0363 2ecd srs @DSPA, $AC0.M
|
|
// 0364 16c9 0001 si @DSCR, #0x0001
|
|
// 0366 16cb 0040 si @DSBL, #0x0040
|
|
|
|
// DMA 0x40bytes from DRAM @ (*0x0e1c) to CPU @ ((pb.itd.bufferHi << 16) | pb.itd.bufferLo)
|
|
|
|
// 0368 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
}
|
|
|
|
// 036a 8100 clr $ACC0
|
|
// 036b 8900 clr $ACC1
|
|
// 036c 00de 0b82 lr $AC0.M, @0x0b82
|
|
// 036e 00df 0b83 lr $AC1.M, @0x0b83
|
|
u16 maddrh = pb.currHi
|
|
u16 maddrl = pb.currLo
|
|
|
|
// This writes back the whole PB to mram from dsp
|
|
// 0370 2ece srs @DSMAH, $AC0.M
|
|
// 0371 2fcf srs @DSMAL, $AC1.M
|
|
// 0372 16cd 0b80 si @DSPA, #0x0b80
|
|
// 0374 16c9 0001 si @DSCR, #0x0001
|
|
// 0376 16cb 00c0 si @DSBL, #0x00c0
|
|
|
|
// DMA 0xc0bytes from DRAM @ 0x0b80 to CPU @ maddr
|
|
|
|
// 0378 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 037a 8100 clr $ACC0
|
|
// 037b 00de 0b80 lr $AC0.M, @0x0b80
|
|
// 037d 00dc 0b81 lr $AC0.L, @0x0b81
|
|
// 037f b100 tst $ACC0
|
|
// 0380 0294 0386 jnz 0x0386
|
|
if (((pb.nextHi << 16) | pb.nextLo) == 0) {
|
|
// No more PBs!
|
|
|
|
// Restore CmdBlockBuf ptr
|
|
0382 00c0 0e07 lr $AR0, @0x0e07
|
|
// 0384 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
// DMA in the next PB
|
|
// From here on out, it's the same as Cmd2, except it calls itself to process the PB it just loaded
|
|
|
|
// 0386 2ece srs @DSMAH, $AC0.M
|
|
// 0387 2ccf srs @DSMAL, $AC0.L
|
|
// 0388 16cd 0b80 si @DSPA, #0x0b80
|
|
// 038a 16c9 0000 si @DSCR, #0x0000
|
|
// 038c 16cb 00c0 si @DSBL, #0x00c0
|
|
|
|
// DMA 0xc0bytes from CPU @ ((pb.nextHi << 16) | pb.nextLo) to DRAM @ 0x0b80
|
|
|
|
// 038e 0082 0e08 lri $AR2, #0x0e08
|
|
// 0390 009f 0000 lri $AC1.M, #0x0000
|
|
// 0392 1b5f srri @$AR2, $AC1.M
|
|
// 0393 009f 0140 lri $AC1.M, #0x0140
|
|
// 0395 1b5f srri @$AR2, $AC1.M
|
|
// 0396 009f 0280 lri $AC1.M, #0x0280
|
|
// 0398 1b5f srri @$AR2, $AC1.M
|
|
// 0399 009f 0400 lri $AC1.M, #0x0400
|
|
// 039b 1b5f srri @$AR2, $AC1.M
|
|
// 039c 009f 0540 lri $AC1.M, #0x0540
|
|
// 039e 1b5f srri @$AR2, $AC1.M
|
|
// 039f 009f 0680 lri $AC1.M, #0x0680
|
|
// 03a1 1b5f srri @$AR2, $AC1.M
|
|
// 03a2 009f 07c0 lri $AC1.M, #0x07c0
|
|
// 03a4 1b5f srri @$AR2, $AC1.M
|
|
// 03a5 009f 0900 lri $AC1.M, #0x0900
|
|
// 03a7 1b5f srri @$AR2, $AC1.M
|
|
// 03a8 009f 0a40 lri $AC1.M, #0x0a40
|
|
// 03aa 1b5f srri @$AR2, $AC1.M
|
|
*0x0e08 = 0x0000
|
|
*0x0e09 = 0x0140
|
|
*0x0e0a = 0x0280
|
|
*0x0e0b = 0x0400
|
|
*0x0e0c = 0x0540
|
|
*0x0e0d = 0x0680
|
|
*0x0e0e = 0x07c0
|
|
*0x0e0f = 0x0900
|
|
*0x0e10 = 0x0a40
|
|
|
|
// 03ab 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 03ad 00de 0ba7 lr $AC0.M, @0x0ba7
|
|
// 03af 00df 0ba8 lr $AC1.M, @0x0ba8
|
|
// 03b1 2ece srs @DSMAH, $AC0.M
|
|
// 03b2 2fcf srs @DSMAL, $AC1.M
|
|
// 03b3 16cd 03c0 si @DSPA, #0x03c0
|
|
// 03b5 16c9 0000 si @DSCR, #0x0000
|
|
// 03b7 16cb 0080 si @DSBL, #0x0080
|
|
|
|
// DMA 0x80bytes from CPU @ ((pb.update.dataHi << 16) | pb.update.dataLo) to DRAM @ 0x03c0
|
|
|
|
// 03b9 8100 clr $ACC0
|
|
// 03ba 8900 clr $ACC1
|
|
|
|
// 03bb 00de 0b84 lr $AC0.M, @0x0b84
|
|
// 03bd 009f 0b31 lri $AC1.M, #0x0b31
|
|
// 03bf 4c00 add $ACC0, $ACC1
|
|
// 03c0 1c7e mrr $AR3, $AC0.M
|
|
// 03c1 0213 ilrr $AC0.M, @$AR3
|
|
// 03c2 00fe 0e15 sr @0x0e15, $AC0.M
|
|
*0x0e15 = *(0x0b31 + pb.srcSelect) // func ptr for src
|
|
|
|
// 03c4 00de 0b85 lr $AC0.M, @0x0b85
|
|
// 03c6 009f 0b34 lri $AC1.M, #0x0b34
|
|
// 03c8 4c00 add $ACC0, $ACC1
|
|
// 03c9 1c7e mrr $AR3, $AC0.M
|
|
// 03ca 0213 ilrr $AC0.M, @$AR3
|
|
// 03cb 00fe 0e16 sr @0x0e16, $AC0.M
|
|
*0x0e16 = *(0x0b34 + pb.coefSelect) // ptr to coef table
|
|
|
|
// 03cd 00de 0b86 lr $AC0.M, @0x0b86
|
|
// 03cf 009f 0b11 lri $AC1.M, #0x0b11
|
|
// 03d1 4c00 add $ACC0, $ACC1
|
|
// 03d2 1c7e mrr $AR3, $AC0.M
|
|
// 03d3 0213 ilrr $AC0.M, @$AR3
|
|
// 03d4 00fe 0e14 sr @0x0e14, $AC0.M
|
|
*0x0e14 = *(0x0b11 + pb.mixerCtrl) // func ptr for mixer
|
|
|
|
// 03d6 8100 clr $ACC0
|
|
// 03d7 00de 0b9b lr $AC0.M, @0x0b9b
|
|
// 03d9 b100 tst $ACC0
|
|
// 03da 0295 0403 jz 0x0403
|
|
if (pb.itd.flag != AX_PB_ITD_OFF) {
|
|
// 03dc 8900 clr $ACC1
|
|
// 03dd 00df 0b9e lr $AC1.M, @0x0b9e
|
|
// 03df 0300 0cc0 addi $AC1.M, #0x0cc0
|
|
// 03e1 00ff 0e40 sr @0x0e40, $AC1.M
|
|
*0x0e40 = 0x0cc0 + pb.itd.shiftL
|
|
|
|
// 03e3 00df 0b9f lr $AC1.M, @0x0b9f
|
|
// 03e5 0300 0cc0 addi $AC1.M, #0x0cc0
|
|
// 03e7 00ff 0e41 sr @0x0e41, $AC1.M
|
|
*0x0e41 = 0x0cc0 + pb.itd.shiftR
|
|
|
|
// 03e9 009f 0ce0 lri $AC1.M, #0x0ce0
|
|
// 03eb 00ff 0e42 sr @0x0e42, $AC1.M
|
|
// 03ed 00ff 0e43 sr @0x0e43, $AC1.M
|
|
*0x0e42 = 0x0ce0
|
|
*0x0e43 = 0x0ce0
|
|
|
|
// 03ef 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 03f1 00de 0b9c lr $AC0.M, @0x0b9c
|
|
// 03f3 2ece srs @DSMAH, $AC0.M
|
|
// 03f4 00de 0b9d lr $AC0.M, @0x0b9d
|
|
// 03f6 2ecf srs @DSMAL, $AC0.M
|
|
// 03f7 16cd 0cc0 si @DSPA, #0x0cc0
|
|
// 03f9 16c9 0000 si @DSCR, #0x0000
|
|
// 03fb 16cb 0040 si @DSBL, #0x0040
|
|
|
|
// DMA 0x0040bytes to DMEM @ 0x0cc0 from CPU @ (pb.itd.bufferHi << 16) | pb.itd.bufferLo
|
|
|
|
// 03fd 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// Restore CmdBlockBuf ptr
|
|
03ff 00c0 0e07 lr $AR0, @0x0e07
|
|
// 0401 029f 0248 jmp 0x0248
|
|
goto Cmd_3() // Calls itself till there are no more PBs linked
|
|
|
|
} else {
|
|
|
|
// 0403 009f 0ce0 lri $AC1.M, #0x0ce0
|
|
// 0405 00ff 0e42 sr @0x0e42, $AC1.M
|
|
// 0407 00ff 0e40 sr @0x0e40, $AC1.M
|
|
// 0409 00ff 0e41 sr @0x0e41, $AC1.M
|
|
// 040b 00ff 0e43 sr @0x0e43, $AC1.M
|
|
*0x0e42 = 0x0ce0
|
|
*0x0e40 = 0x0ce0
|
|
*0x0e41 = 0x0ce0
|
|
*0x0e43 = 0x0ce0
|
|
|
|
// 040d 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// Restore CmdBlockBuf ptr
|
|
040f 00c0 0e07 lr $AR0, @0x0e07
|
|
// 0411 029f 0248 jmp 0x0248
|
|
goto Cmd_3() // Calls itself till there are no more PBs linked
|
|
}
|
|
}
|
|
|
|
void Cmd_4() {
|
|
0413 8e00 set16
|
|
|
|
0414 0086 0400 lri $IX2, #0x0400 // buffer in dram
|
|
|
|
// 0416 8100 clr $ACC0
|
|
// 0417 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
// 0418 191c lrri $AC0.L, @$AR0
|
|
u16 maddrh = *(CmdBlockBuf++)
|
|
u16 maddrl = *(CmdBlockBuf++)
|
|
|
|
// 0419 2ece srs @DSMAH, $AC0.M
|
|
// 041a 2ccf srs @DSMAL, $AC0.L
|
|
// 041b 1fc6 mrr $AC0.M, $IX2
|
|
// 041c 2ecd srs @DSPA, $AC0.M
|
|
// 041d 16c9 0001 si @DSCR, #0x0001
|
|
// 041f 16cb 0780 si @DSBL, #0x0780
|
|
|
|
// DMA 0x0780bytes from DRAM @ 0x0400 to CPU @ maddr
|
|
|
|
// 0421 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
0423 02bf 0484 call 0x0484
|
|
|
|
// 0425 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void Cmd_5() {
|
|
0427 8e00 set16
|
|
|
|
0428 0086 07c0 lri $IX2, #0x07c0
|
|
|
|
042a 8100 clr $ACC0
|
|
042b 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
042c 191c lrri $AC0.L, @$AR0
|
|
042d 2ece srs @DSMAH, $AC0.M
|
|
042e 2ccf srs @DSMAL, $AC0.L
|
|
042f 1fc6 mrr $AC0.M, $IX2
|
|
0430 2ecd srs @DSPA, $AC0.M
|
|
0431 16c9 0001 si @DSCR, #0x0001
|
|
0433 16cb 0780 si @DSBL, #0x0780
|
|
|
|
// 0435 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
0437 02bf 0484 call 0x0484
|
|
|
|
// 0439 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void Cmd_E() {
|
|
043b 8c00 clr15
|
|
043c 8a00 m2
|
|
043d 8100 clr $ACC0
|
|
043e 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
043f 191f lrri $AC1.M, @$AR0
|
|
0440 2ece srs @DSMAH, $AC0.M
|
|
0441 2fcf srs @DSMAL, $AC1.M
|
|
0442 16cd 0280 si @DSPA, #0x0280
|
|
0444 16c9 0001 si @DSCR, #0x0001 // DMEM -> CPU
|
|
0446 16cb 0280 si @DSBL, #0x0280
|
|
|
|
0448 8f50 set40'l : $AX0.H, @$AR0
|
|
0449 8140 clr'l $ACC0 : $AX0.L, @$AR0
|
|
044a 0081 0400 lri $AR1, #0x0400
|
|
044c 0083 0000 lri $AR3, #0x0000
|
|
044e 0082 0140 lri $AR2, #0x0140
|
|
0450 0099 0080 lri $AX1.L, #0x0080
|
|
|
|
// 0452 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
0454 1105 046c bloopi #0x05, 0x046c
|
|
0456 1f61 mrr $AX1.H, $AR1
|
|
|
|
0457 1120 045e bloopi #0x20, 0x045e
|
|
0459 8972 clr'l $ACC1 : $AC0.M, @$AR2
|
|
045a 195c lrri $AC0.L, @$AR2
|
|
045b f07b lsl16'l $ACC0 : $AC1.M, @$AR3
|
|
045c 197d lrri $AC1.L, @$AR3
|
|
045d f131 lsl16's $ACC1 : @$AR1, $AC0.M
|
|
045e 8139 clr's $ACC0 : @$AR1, $AC1.M
|
|
|
|
045f 8900 clr $ACC1
|
|
0460 6800 movax $ACC0, $AX0
|
|
0461 2ece srs @DSMAH, $AC0.M
|
|
0462 2ccf srs @DSMAL, $AC0.L
|
|
0463 1ffb mrr $AC1.M, $AX1.H
|
|
0464 2fcd srs @DSPA, $AC1.M
|
|
0465 0f01 lris $AC1.M, #0x01
|
|
0466 2fc9 srs @DSCR, $AC1.M
|
|
0467 1ff9 mrr $AC1.M, $AX1.L
|
|
0468 2fcb srs @DSBL, $AC1.M
|
|
0469 7200 addaxl $ACC0, $AX1.L
|
|
046a 1f5e mrr $AX0.H, $AC0.M
|
|
046b 1f1c mrr $AX0.L, $AC0.L
|
|
046c 8100 clr $ACC0
|
|
|
|
// 046d 26c9 lrs $AC0.M, @DSCR
|
|
// 046e 02a0 0004 andf $AC0.M, #0x0004
|
|
// 0470 029c 046d jlnz 0x046d
|
|
while (@DSCR & 4);
|
|
|
|
// 0472 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void UnimplimentedCmd_B() {
|
|
// 0474 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void UnimplimentedCmd_C() {
|
|
// 0476 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void UnimplimentedCmd_A() {
|
|
// 0478 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void Task_Yield() {
|
|
// Send DSP_YIELD mail
|
|
// 047a 16fc dcd1 si @DMBH, #0xdcd1
|
|
// 047c 16fd 0002 si @DMBL, #0x0002
|
|
DMB = 0xdcd10002
|
|
// 047e 16fb 0001 si @DIRQ, #0x0001
|
|
|
|
0480 029f 0c91 jmp 0x0c91
|
|
}
|
|
|
|
// Unused?
|
|
// 0482 029f 0045 jmp 0x0045
|
|
goto GetNextCmdBlock;
|
|
|
|
// Called by cmds 4 5 9
|
|
// IX2 is always modified before calling...
|
|
void UnkFunc() {
|
|
0484 8e00 set16
|
|
0485 191f lrri $AC1.M, @$AR0
|
|
0486 191d lrri $AC1.L, @$AR0
|
|
0487 1f5f mrr $AX0.H, $AC1.M
|
|
0488 1f1d mrr $AX0.L, $AC1.L
|
|
0489 2fce srs @DSMAH, $AC1.M
|
|
048a 2dcf srs @DSMAL, $AC1.L
|
|
048b 8900 clr $ACC1
|
|
048c 1fa6 mrr $AC1.L, $IX2
|
|
048d 2dcd srs @DSPA, $AC1.L
|
|
048e 0e00 lris $AC0.M, #0x00
|
|
048f 2ec9 srs @DSCR, $AC0.M
|
|
0490 8100 clr $ACC0
|
|
0491 009c 00c0 lri $AC0.L, #0x00c0
|
|
0493 2ccb srs @DSBL, $AC0.L
|
|
0494 1ca0 mrr $IX1, $AR0
|
|
0495 0081 0e44 lri $AR1, #0x0e44
|
|
0497 4800 addax $ACC0, $AX0
|
|
0498 1b3e srri @$AR1, $AC0.M
|
|
0499 1b3c srri @$AR1, $AC0.L
|
|
049a 0b00 lris $AX1.H, #0x00
|
|
049b 0099 0060 lri $AX1.L, #0x0060
|
|
049d 4b00 addax $ACC1, $AX1
|
|
049e 1b3d srri @$AR1, $AC1.L
|
|
049f 0081 0e44 lri $AR1, #0x0e44
|
|
04a1 1c06 mrr $AR0, $IX2
|
|
04a2 0083 0000 lri $AR3, #0x0000
|
|
04a4 1c43 mrr $AR2, $AR3
|
|
|
|
04a5 27c9 lrs $AC1.M, @DSCR
|
|
04a6 03a0 0004 andf $AC1.M, #0x0004
|
|
04a8 029c 04a5 jlnz 0x04a5
|
|
|
|
04aa 1109 04da bloopi #0x09, 0x04da
|
|
04ac 8e00 set16
|
|
04ad 193a lrri $AX0.H, @$AR1
|
|
04ae 1938 lrri $AX0.L, @$AR1
|
|
04af 6900 movax $ACC1, $AX0
|
|
04b0 2fce srs @DSMAH, $AC1.M
|
|
04b1 2dcf srs @DSMAL, $AC1.L
|
|
04b2 8900 clr $ACC1
|
|
04b3 193d lrri $AC1.L, @$AR1
|
|
04b4 2dcd srs @DSPA, $AC1.L
|
|
04b5 16c9 0000 si @DSCR, #0x0000
|
|
04b7 8100 clr $ACC0
|
|
04b8 009c 00c0 lri $AC0.L, #0x00c0
|
|
04ba 2ccb srs @DSBL, $AC0.L
|
|
04bb 0081 0e44 lri $AR1, #0x0e44
|
|
04bd 4800 addax $ACC0, $AX0
|
|
04be 1b3e srri @$AR1, $AC0.M
|
|
04bf 1b3c srri @$AR1, $AC0.L
|
|
04c0 0b00 lris $AX1.H, #0x00
|
|
04c1 0960 lris $AX1.L, #0x60
|
|
04c2 4b00 addax $ACC1, $AX1
|
|
04c3 1b3d srri @$AR1, $AC1.L
|
|
04c4 0081 0e44 lri $AR1, #0x0e44
|
|
04c6 8f00 set40
|
|
04c7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
04c8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
04c9 6a00 movax $ACC0, $AX1
|
|
04ca 4800 addax $ACC0, $AX0
|
|
04cb 1117 04d4 bloopi #0x17, 0x04d4
|
|
04cd 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
04ce 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
04cf 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
|
|
04d0 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
|
|
04d1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
04d2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
04d3 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M
|
|
04d4 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L
|
|
04d5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
04d6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
04d7 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
|
|
04d8 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
|
|
04d9 1b5f srri @$AR2, $AC1.M
|
|
04da 1b5d srri @$AR2, $AC1.L
|
|
|
|
04db 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
04dc 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
04dd 6a00 movax $ACC0, $AX1
|
|
04de 4800 addax $ACC0, $AX0
|
|
|
|
04df 1117 04e8 bloopi #0x17, 0x04e8
|
|
04e1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
04e2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
04e3 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
|
|
04e4 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
|
|
04e5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
04e6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
04e7 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M
|
|
04e8 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L
|
|
|
|
04e9 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
04ea 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
04eb 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
|
|
04ec 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
|
|
04ed 1b5f srri @$AR2, $AC1.M
|
|
04ee 1b5d srri @$AR2, $AC1.L
|
|
04ef 1c05 mrr $AR0, $IX1
|
|
04f0 02df ret
|
|
}
|
|
|
|
// Only called by Command 1
|
|
// AX0 = maddr
|
|
// AX1.L = unkForMulBuffer1
|
|
// AR1 = unkForMulBuffer2
|
|
void Unk(maddr, unkForMulBuffer1, unkForMulBuffer2) {
|
|
04f1 8e00 set16
|
|
|
|
// 04f2 009b 0e44 lri $AX1.H, #0x0e44
|
|
// 04f4 009d 00c0 lri $AC1.L, #0x00c0
|
|
// 04f6 02bf 0541 call 0x0541
|
|
u16 daddr = 0x0e44
|
|
const u16 dma_len = 0x00c0
|
|
DMA_CPUToDMEM(maddr, daddr, dma_len);
|
|
|
|
// 04f8 4900 addax $ACC1, $AX0
|
|
// 04f9 00ff 0e1d sr @0x0e1d, $AC1.M
|
|
// 04fb 00fd 0e1e sr @0x0e1e, $AC1.L
|
|
// 04fd 8900 clr $ACC1
|
|
maddr += dma_len
|
|
|
|
// 04fe 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
// 0500 1104 052c bloopi #0x04, 0x052c
|
|
for (u8 i = 0; i < 4; i++) {
|
|
// 0502 00da 0e1d lr $AX0.H, @0x0e1d // restore
|
|
// 0504 00d8 0e1e lr $AX0.L, @0x0e1e // restore
|
|
// 0506 009b 0ea4 lri $AX1.H, #0x0ea4 // buffer 2
|
|
// 0508 009d 00c0 lri $AC1.L, #0x00c0 // restore
|
|
// 050a 02bf 0541 call 0x0541
|
|
daddr = 0x0ea4
|
|
DMA_CPUToDMEM(maddr, daddr, dma_len);
|
|
|
|
// 050c 4900 addax $ACC1, $AX0
|
|
// 050d 00ff 0e1d sr @0x0e1d, $AC1.M // update
|
|
// 050f 00fd 0e1e sr @0x0e1e, $AC1.L
|
|
maddr += dma_len
|
|
|
|
// 0511 0083 0e44 lri $AR3, #0x0e44
|
|
// 0513 02bf 054c call 0x054c
|
|
UnknownMulBuffer(0x0e44);
|
|
|
|
// 0515 8900 clr $ACC1
|
|
// 0516 00da 0e1d lr $AX0.H, @0x0e1d // restore
|
|
// 0518 00d8 0e1e lr $AX0.L, @0x0e1e // restore
|
|
// 051a 009b 0e44 lri $AX1.H, #0x0e44 // buffer 1
|
|
// 051c 009d 00c0 lri $AC1.L, #0x00c0 // restore
|
|
// 051e 02bf 0541 call 0x0541
|
|
daddr = 0x0e44
|
|
DMA_CPUToDMEM(maddr, daddr, dma_len);
|
|
|
|
// 0520 4900 addax $ACC1, $AX0
|
|
// 0521 00ff 0e1d sr @0x0e1d, $AC1.M // update
|
|
// 0523 00fd 0e1e sr @0x0e1e, $AC1.L
|
|
maddr += dma_len
|
|
|
|
// 0525 0083 0ea4 lri $AR3, #0x0ea4 // buffer 2
|
|
// 0527 02bf 054c call 0x054c
|
|
UnknownMulBuffer(0x0ea4);
|
|
|
|
// 0529 0000 nop
|
|
// 052a 0000 nop
|
|
// 052b 8e00 set16 // restore
|
|
// 052c 8900 clr $ACC1
|
|
}
|
|
|
|
// 052d 00da 0e1d lr $AX0.H, @0x0e1d // restore
|
|
// 052f 00d8 0e1e lr $AX0.L, @0x0e1e // restore
|
|
// 0531 009b 0ea4 lri $AX1.H, #0x0ea4 // buffer 2
|
|
// 0533 009d 00c0 lri $AC1.L, #0x00c0 // restore
|
|
// 0535 02bf 0541 call 0x0541
|
|
DMA_CPUToDMEM(maddr, daddr, dma_len);
|
|
|
|
// 0537 4900 addax $ACC1, $AX0
|
|
maddr += dma_len
|
|
|
|
// 0538 0083 0e44 lri $AR3, #0x0e44 // buffer 1
|
|
// 053a 02bf 054c call 0x054c
|
|
UnknownMulBuffer(0x0e44);
|
|
|
|
// 053c 0083 0ea4 lri $AR3, #0x0ea4 // buffer 2
|
|
// 053e 02bf 054c call 0x054c
|
|
UnknownMulBuffer(0x0ea4);
|
|
|
|
0540 02df ret
|
|
}
|
|
|
|
// u32 maddr = AX0
|
|
// u16 daddr = AX1.H
|
|
// u16 len = AC1.L
|
|
// Only transfers from CPU -> DMEM
|
|
void DMA_CPUToDMEM() {
|
|
0541 8e00 set16
|
|
0542 00fa ffce sr @DSMAH, $AX0.H
|
|
0544 00f8 ffcf sr @DSMAL, $AX0.L
|
|
0546 00fb ffcd sr @DSPA, $AX1.H
|
|
0548 16c9 0000 si @DSCR, #0x0000
|
|
054a 2dcb srs @DSBL, $AC1.L
|
|
054b 02df ret
|
|
}
|
|
|
|
// IX1 = 0xffff
|
|
// AX1.L = unkForMulBuffer1 (next value in cmd block)
|
|
// AR1 = unkForMulBuffer2 (0, 0x0400, then 0x07c0)
|
|
// AR3 is some buffer, either 0x0e44 or 0x0ea4
|
|
void UnknownMulBuffer() {
|
|
054c 8f00 set40 // Loaded ACx.M values extend to the entire ACC
|
|
054d 8d00 set15 // multiplicands unsigned
|
|
054e 8a00 m2 // mul results doubled
|
|
|
|
// 054f 197a lrri $AX0.H, @$AR3
|
|
// 0550 1978 lrri $AX0.L, @$AR3
|
|
AX0.H = *(AR3++)
|
|
AX0.L = *(AR3++)
|
|
|
|
// 0551 a000 mulx $AX0.L, $AX1.L
|
|
// 0552 b600 mulxmv $AX0.H, $AX1.L, $ACC0
|
|
ACC0 = (u16)AX0.L * (u16)unkForMulBuffer1 * 2
|
|
PROD = (u16)AX0.H * (u16)unkForMulBuffer1 * 2
|
|
|
|
// 0553 1130 055a bloopi #0x30, 0x055a
|
|
for (int i=0; i<48; i++) {
|
|
// 0555 9179 asr16'l $ACC0 : $AC1.M, @$AR1
|
|
ACC0 >>= 16
|
|
AC1.M = *(unkForMulBuffer2++)
|
|
|
|
// 0556 4e6d addp'ln $ACC0 : $AC1.L, @$AR1
|
|
ACC0 += PROD
|
|
AC1.L = *unkForMulBuffer2
|
|
unkForMulBuffer2 -= 1
|
|
|
|
// 0557 197a lrri $AX0.H, @$AR3
|
|
AX0.H = *(AR3++)
|
|
|
|
// 0558 4d43 add'l $ACC1, $ACC0 : $AX0.L, @$AR3
|
|
ACC1 += ACC0
|
|
AX0.L = *(AR3++)
|
|
|
|
// 0559 a039 mulx's $AX0.L, $AX1.L : @$AR1, $AC1.M
|
|
// 055a b629 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR1, $AC1.L
|
|
ACC0 = (u16)AX0.L * (u16)unkForMulBuffer1 * 2
|
|
*(unkForMulBuffer2++) = AC1.M
|
|
PROD = (u16)AX0.H * (u16)unkForMulBuffer1 * 2
|
|
*(unkForMulBuffer2++) = AC1.L
|
|
}
|
|
|
|
055b 02df ret
|
|
}
|
|
|
|
void WaitDMA() {
|
|
// 055c 26c9 lrs $AC0.M, @DSCR
|
|
// 055d 02a0 0004 andf $AC0.M, #0x0004
|
|
// 055f 029c 055c jlnz 0x055c
|
|
while (@DSCR & 4);
|
|
|
|
// 0561 02df ret
|
|
return;
|
|
}
|
|
|
|
// All apparently unused?
|
|
void WaitForCPUMailbox() {
|
|
0562 26fe lrs $AC0.M, @CMBH
|
|
0563 02c0 8000 andcf $AC0.M, #0x8000
|
|
0565 029c 0562 jlnz 0x0562
|
|
0567 02df ret
|
|
}
|
|
void WaitForDSPMailbox1() {
|
|
0568 26fc lrs $AC0.M, @DMBH
|
|
0569 02a0 8000 andf $AC0.M, #0x8000
|
|
056b 029c 0568 jlnz 0x0568
|
|
056d 02df ret
|
|
}
|
|
void WaitForDSPMailbox2() {
|
|
056e 26fc lrs $AC0.M, @DMBH
|
|
056f 02a0 8000 andf $AC0.M, #0x8000
|
|
0571 029c 056e jlnz 0x056e
|
|
0573 02df ret
|
|
}
|
|
|
|
void Cmd_7() {
|
|
// 0574 8100 clr $ACC0
|
|
// 0575 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
// 0576 8e60 set16'l : $AC0.L, @$AR0
|
|
u16 maddrh = *(CmdBlockBuf++)
|
|
u16 maddrl = *(CmdBlockBuf++)
|
|
|
|
// 0577 2ece srs @DSMAH, $AC0.M
|
|
// 0578 2ccf srs @DSMAL, $AC0.L
|
|
// 0579 16cd 0e44 si @DSPA, #0x0e44
|
|
// 057b 16c9 0000 si @DSCR, #0x0000
|
|
// 057d 8900 clr $ACC1
|
|
// 057e 0d20 lris $AC1.L, #0x20
|
|
u16 dma_len = 32
|
|
|
|
// 057f 2dcb srs @DSBL, $AC1.L
|
|
// DMA 32bytes from CPU @ maddr -> DMEM @ 0x0e44
|
|
|
|
// 0580 4c00 add $ACC0, $ACC1
|
|
maddr += dma_len
|
|
|
|
// Push CmdBlockBuf ptr
|
|
0581 1c80 mrr $IX0, $AR0
|
|
|
|
// 0582 0080 0280 lri $AR0, #0x0280
|
|
// 0584 0081 0000 lri $AR1, #0x0000
|
|
// 0586 0082 0140 lri $AR2, #0x0140
|
|
// 0588 0083 0e44 lri $AR3, #0x0e44
|
|
u16* unk_buf1 = 0x0280
|
|
u16* unk_buf2 = 0x0000
|
|
u16* unk_buf3 = 0x0140
|
|
u16* dmem_buf = 0x0e44
|
|
|
|
// 058a 0a00 lris $AX0.H, #0x00
|
|
const u16 null = 0 // Guess is that it's faster to use AXx instead of imm value?
|
|
|
|
// 058b 27c9 lrs $AC1.M, @DSCR
|
|
// 058c 03a0 0004 andf $AC1.M, #0x0004
|
|
// 058e 029c 058b jlnz 0x058b
|
|
while (@DSCR & 4); // Wait for DMA completion
|
|
|
|
// 0590 2ece srs @DSMAH, $AC0.M
|
|
// 0591 2ccf srs @DSMAL, $AC0.L
|
|
// 0592 16cd 0e54 si @DSPA, #0x0e54
|
|
// 0594 16c9 0000 si @DSCR, #0x0000
|
|
// 0596 16cb 0260 si @DSBL, #0x0260
|
|
|
|
// DMA 0x0260bytes from CPU @ maddr -> DMEM @ 0x0e54
|
|
// No waiting for DMA
|
|
|
|
// 0598 009f 00a0 lri $AC1.M, #0x00a0
|
|
u16 size = 0x00a0
|
|
|
|
// accum loads in the loop are 40bit
|
|
// 059a 8f00 set40
|
|
|
|
// 059b 007f 05a4 bloop $AC1.M, 0x05a4
|
|
for (int i = 0; i < size; i++) {
|
|
// !!! Doesn't make sense with current understanding of set40
|
|
059d 197e lrri $AC0.M, @$AR3
|
|
059e 1b1a srri @$AR0, $AX0.H
|
|
059f 197c lrri $AC0.L, @$AR3
|
|
05a0 1b1a srri @$AR0, $AX0.H
|
|
05a1 1b5e srri @$AR2, $AC0.M
|
|
05a2 1b5c srri @$AR2, $AC0.L
|
|
05a3 1b3e srri @$AR1, $AC0.M
|
|
05a4 1b3c srri @$AR1, $AC0.L
|
|
}
|
|
|
|
// Pop CmdBlockBuf ptr
|
|
05a5 1c04 mrr $AR0, $IX0
|
|
|
|
// 05a6 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
# Following 3 funcs are the SRCs to select from, in order
|
|
|
|
void SRC_Polyphase() {
|
|
// Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs
|
|
// 05a8 0082 0bb8 lri $AR2, #0x0bb8
|
|
// 05aa 195e lrri $AC0.M, @$AR2
|
|
// 05ab 2ed1 srs @SampleFormat, $AC0.M
|
|
// 05ac 195e lrri $AC0.M, @$AR2
|
|
// 05ad 2ed4 srs @ACSAH, $AC0.M
|
|
// 05ae 195e lrri $AC0.M, @$AR2
|
|
// 05af 2ed5 srs @ACSAL, $AC0.M
|
|
// 05b0 195e lrri $AC0.M, @$AR2
|
|
// 05b1 2ed6 srs @ACEAH, $AC0.M
|
|
// 05b2 195e lrri $AC0.M, @$AR2
|
|
// 05b3 2ed7 srs @ACEAL, $AC0.M
|
|
// 05b4 195e lrri $AC0.M, @$AR2
|
|
// 05b5 2ed8 srs @ACCAH, $AC0.M
|
|
// 05b6 195e lrri $AC0.M, @$AR2
|
|
// 05b7 2ed9 srs @ACCAL, $AC0.M
|
|
// 05b8 195e lrri $AC0.M, @$AR2
|
|
// 05b9 2ea0 srs @COEF_A1_0, $AC0.M
|
|
// 05ba 195e lrri $AC0.M, @$AR2
|
|
// 05bb 2ea1 srs @COEF_A2_0, $AC0.M
|
|
// 05bc 195e lrri $AC0.M, @$AR2
|
|
// 05bd 2ea2 srs @COEF_A1_1, $AC0.M
|
|
// 05be 195e lrri $AC0.M, @$AR2
|
|
// 05bf 2ea3 srs @COEF_A2_1, $AC0.M
|
|
// 05c0 195e lrri $AC0.M, @$AR2
|
|
// 05c1 2ea4 srs @COEF_A1_2, $AC0.M
|
|
// 05c2 195e lrri $AC0.M, @$AR2
|
|
// 05c3 2ea5 srs @COEF_A2_2, $AC0.M
|
|
// 05c4 195e lrri $AC0.M, @$AR2
|
|
// 05c5 2ea6 srs @COEF_A1_3, $AC0.M
|
|
// 05c6 195e lrri $AC0.M, @$AR2
|
|
// 05c7 2ea7 srs @COEF_A2_3, $AC0.M
|
|
// 05c8 195e lrri $AC0.M, @$AR2
|
|
// 05c9 2ea8 srs @COEF_A1_4, $AC0.M
|
|
// 05ca 195e lrri $AC0.M, @$AR2
|
|
// 05cb 2ea9 srs @COEF_A2_4, $AC0.M
|
|
// 05cc 195e lrri $AC0.M, @$AR2
|
|
// 05cd 2eaa srs @COEF_A1_5, $AC0.M
|
|
// 05ce 195e lrri $AC0.M, @$AR2
|
|
// 05cf 2eab srs @COEF_A2_5, $AC0.M
|
|
// 05d0 195e lrri $AC0.M, @$AR2
|
|
// 05d1 2eac srs @COEF_A1_6, $AC0.M
|
|
// 05d2 195e lrri $AC0.M, @$AR2
|
|
// 05d3 2ead srs @COEF_A2_6, $AC0.M
|
|
// 05d4 195e lrri $AC0.M, @$AR2
|
|
// 05d5 2eae srs @COEF_A1_7, $AC0.M
|
|
// 05d6 195e lrri $AC0.M, @$AR2
|
|
// 05d7 2eaf srs @COEF_A2_7, $AC0.M
|
|
// 05d8 195e lrri $AC0.M, @$AR2
|
|
// 05d9 2ede srs @GAIN, $AC0.M
|
|
// 05da 195e lrri $AC0.M, @$AR2
|
|
// 05db 2eda srs @scale, $AC0.M
|
|
// 05dc 195e lrri $AC0.M, @$AR2
|
|
// 05dd 2edb srs @yn1, $AC0.M
|
|
// 05de 195e lrri $AC0.M, @$AR2
|
|
// 05df 2edc srs @yn2, $AC0.M
|
|
|
|
05e0 8c00 clr15
|
|
05e1 8a00 m2
|
|
05e2 8e00 set16
|
|
05e3 00d8 0e16 lr $AX0.L, @0x0e16
|
|
05e5 195b lrri $AX1.H, @$AR2
|
|
05e6 1959 lrri $AX1.L, @$AR2
|
|
05e7 8100 clr $ACC0
|
|
05e8 195c lrri $AC0.L, @$AR2
|
|
05e9 0080 0e44 lri $AR0, #0x0e44
|
|
05eb 195f lrri $AC1.M, @$AR2
|
|
05ec 1b1f srri @$AR0, $AC1.M
|
|
05ed 195f lrri $AC1.M, @$AR2
|
|
05ee 1b1f srri @$AR0, $AC1.M
|
|
05ef 195f lrri $AC1.M, @$AR2
|
|
05f0 1b1f srri @$AR0, $AC1.M
|
|
05f1 185f lrr $AC1.M, @$AR2
|
|
05f2 1b1f srri @$AR0, $AC1.M
|
|
05f3 6b00 movax $ACC1, $AX1
|
|
05f4 1505 lsl $ACC1, #5
|
|
05f5 4d00 add $ACC1, $ACC0
|
|
05f6 157e lsr $ACC1, #-2
|
|
05f7 1c9f mrr $IX0, $AC1.M
|
|
05f8 1cbd mrr $IX1, $AC1.L
|
|
05f9 05e0 addis $AC1.M, #0xe0
|
|
05fa 9900 asr16 $ACC1
|
|
05fb 7d00 neg $ACC1
|
|
05fc 1cdd mrr $IX2, $AC1.L
|
|
05fd 8900 clr $ACC1
|
|
05fe 1fa5 mrr $AC1.L, $IX1
|
|
05ff 1502 lsl $ACC1, #2
|
|
0600 1cbf mrr $IX1, $AC1.M
|
|
0601 009a 01fc lri $AX0.H, #0x01fc
|
|
0603 009e 0e44 lri $AC0.M, #0x0e44
|
|
0605 0081 ffdd lri $AR1, #0xffdd
|
|
0607 0083 0d80 lri $AR3, #0x0d80
|
|
0609 0064 061a bloop $IX0, 0x061a
|
|
060b 1827 lrr $IX3, @$AR1
|
|
060c 1b07 srri @$AR0, $IX3
|
|
060d 4a00 addax $ACC0, $AX1
|
|
060e 1ffc mrr $AC1.M, $AC0.L
|
|
060f 1827 lrr $IX3, @$AR1
|
|
0610 1b07 srri @$AR0, $IX3
|
|
0611 1579 lsr $ACC1, #-7
|
|
0612 3500 andr $AC1.M, $AX0.H
|
|
0613 1827 lrr $IX3, @$AR1
|
|
0614 1b07 srri @$AR0, $IX3
|
|
0615 4100 addr $ACC1, $AX0.L
|
|
0616 1b7e srri @$AR3, $AC0.M
|
|
0617 1827 lrr $IX3, @$AR1
|
|
0618 1b07 srri @$AR0, $IX3
|
|
0619 1b7f srri @$AR3, $AC1.M
|
|
061a 0000 nop
|
|
|
|
061b 0065 0620 bloop $IX1, 0x0620
|
|
061d 1827 lrr $IX3, @$AR1
|
|
061e 1b07 srri @$AR0, $IX3
|
|
061f 0000 nop
|
|
0620 0000 nop
|
|
|
|
0621 0007 dar $AR3
|
|
0622 187f lrr $AC1.M, @$AR3
|
|
0623 0066 0629 bloop $IX2, 0x0629
|
|
0625 4a3b addax's $ACC0, $AX1.L : @$AR3, $AC1.M
|
|
0626 1ffc mrr $AC1.M, $AC0.L
|
|
0627 1579 lsr $ACC1, #-7
|
|
0628 3533 andr's $AC1.M, $AX0.H : @$AR3, $AC0.M
|
|
0629 4100 addr $ACC1, $AX0.L
|
|
|
|
062a 1b7f srri @$AR3, $AC1.M
|
|
062b 0004 dar $AR0
|
|
062c 189f lrrd $AC1.M, @$AR0
|
|
062d 1adf srrd @$AR2, $AC1.M
|
|
062e 189f lrrd $AC1.M, @$AR0
|
|
062f 1adf srrd @$AR2, $AC1.M
|
|
0630 189f lrrd $AC1.M, @$AR0
|
|
0631 1adf srrd @$AR2, $AC1.M
|
|
0632 189f lrrd $AC1.M, @$AR0
|
|
0633 1adf srrd @$AR2, $AC1.M
|
|
0634 1adc srrd @$AR2, $AC0.L
|
|
0635 0082 0bd2 lri $AR2, #0x0bd2
|
|
0637 27dc lrs $AC1.M, @yn2
|
|
0638 1adf srrd @$AR2, $AC1.M
|
|
0639 27db lrs $AC1.M, @yn1
|
|
063a 1adf srrd @$AR2, $AC1.M
|
|
063b 27da lrs $AC1.M, @scale
|
|
063c 1adf srrd @$AR2, $AC1.M
|
|
063d 0082 0bbe lri $AR2, #0x0bbe
|
|
063f 27d9 lrs $AC1.M, @ACCAL
|
|
0640 1adf srrd @$AR2, $AC1.M
|
|
0641 27d8 lrs $AC1.M, @ACCAH
|
|
0642 1adf srrd @$AR2, $AC1.M
|
|
0643 8f00 set40
|
|
0644 00c1 0e42 lr $AR1, @0x0e42
|
|
0646 0082 0d80 lri $AR2, #0x0d80
|
|
0648 1940 lrri $AR0, @$AR2
|
|
0649 1943 lrri $AR3, @$AR2
|
|
064a 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
064b b8c0 mulx'ld $AX0.H, $AX1.H : $AX0.L, $AX1.L, @$AR0
|
|
064c 111f 0654 bloopi #0x1f, 0x0654
|
|
064e a6f0 mulxmv'ld $AX0.L, $AX1.L, $ACC0 : $AX0.H, $AX1.H, @$AR0
|
|
064f bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0
|
|
0650 1940 lrri $AR0, @$AR2
|
|
0651 1943 lrri $AR3, @$AR2
|
|
0652 bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0
|
|
0653 4ec0 addp'ld $ACC0 : $AX0.L, $AX1.L, @$AR0
|
|
0654 b831 mulx's $AX0.H, $AX1.H : @$AR1, $AC0.M
|
|
|
|
0655 a6f0 mulxmv'ld $AX0.L, $AX1.L, $ACC0 : $AX0.H, $AX1.H, @$AR0
|
|
0656 bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0
|
|
0657 bc00 mulxac $AX0.H, $AX1.H, $ACC0
|
|
0658 4e00 addp $ACC0
|
|
0659 1b3e srri @$AR1, $AC0.M
|
|
065a 00e1 0e42 sr @0x0e42, $AR1
|
|
|
|
065c 02df ret
|
|
}
|
|
|
|
void SRC_Linear() {
|
|
// Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs
|
|
// 065d 0082 0bb8 lri $AR2, #0x0bb8
|
|
// 065f 195e lrri $AC0.M, @$AR2
|
|
// 0660 2ed1 srs @SampleFormat, $AC0.M
|
|
// 0661 195e lrri $AC0.M, @$AR2
|
|
// 0662 2ed4 srs @ACSAH, $AC0.M
|
|
// 0663 195e lrri $AC0.M, @$AR2
|
|
// 0664 2ed5 srs @ACSAL, $AC0.M
|
|
// 0665 195e lrri $AC0.M, @$AR2
|
|
// 0666 2ed6 srs @ACEAH, $AC0.M
|
|
// 0667 195e lrri $AC0.M, @$AR2
|
|
// 0668 2ed7 srs @ACEAL, $AC0.M
|
|
// 0669 195e lrri $AC0.M, @$AR2
|
|
// 066a 2ed8 srs @ACCAH, $AC0.M
|
|
// 066b 195e lrri $AC0.M, @$AR2
|
|
// 066c 2ed9 srs @ACCAL, $AC0.M
|
|
// 066d 195e lrri $AC0.M, @$AR2
|
|
// 066e 2ea0 srs @COEF_A1_0, $AC0.M
|
|
// 066f 195e lrri $AC0.M, @$AR2
|
|
// 0670 2ea1 srs @COEF_A2_0, $AC0.M
|
|
// 0671 195e lrri $AC0.M, @$AR2
|
|
// 0672 2ea2 srs @COEF_A1_1, $AC0.M
|
|
// 0673 195e lrri $AC0.M, @$AR2
|
|
// 0674 2ea3 srs @COEF_A2_1, $AC0.M
|
|
// 0675 195e lrri $AC0.M, @$AR2
|
|
// 0676 2ea4 srs @COEF_A1_2, $AC0.M
|
|
// 0677 195e lrri $AC0.M, @$AR2
|
|
// 0678 2ea5 srs @COEF_A2_2, $AC0.M
|
|
// 0679 195e lrri $AC0.M, @$AR2
|
|
// 067a 2ea6 srs @COEF_A1_3, $AC0.M
|
|
// 067b 195e lrri $AC0.M, @$AR2
|
|
// 067c 2ea7 srs @COEF_A2_3, $AC0.M
|
|
// 067d 195e lrri $AC0.M, @$AR2
|
|
// 067e 2ea8 srs @COEF_A1_4, $AC0.M
|
|
// 067f 195e lrri $AC0.M, @$AR2
|
|
// 0680 2ea9 srs @COEF_A2_4, $AC0.M
|
|
// 0681 195e lrri $AC0.M, @$AR2
|
|
// 0682 2eaa srs @COEF_A1_5, $AC0.M
|
|
// 0683 195e lrri $AC0.M, @$AR2
|
|
// 0684 2eab srs @COEF_A2_5, $AC0.M
|
|
// 0685 195e lrri $AC0.M, @$AR2
|
|
// 0686 2eac srs @COEF_A1_6, $AC0.M
|
|
// 0687 195e lrri $AC0.M, @$AR2
|
|
// 0688 2ead srs @COEF_A2_6, $AC0.M
|
|
// 0689 195e lrri $AC0.M, @$AR2
|
|
// 068a 2eae srs @COEF_A1_7, $AC0.M
|
|
// 068b 195e lrri $AC0.M, @$AR2
|
|
// 068c 2eaf srs @COEF_A2_7, $AC0.M
|
|
// 068d 195e lrri $AC0.M, @$AR2
|
|
// 068e 2ede srs @GAIN, $AC0.M
|
|
// 068f 195e lrri $AC0.M, @$AR2
|
|
// 0690 2eda srs @scale, $AC0.M
|
|
// 0691 195e lrri $AC0.M, @$AR2
|
|
// 0692 2edb srs @yn1, $AC0.M
|
|
// 0693 195e lrri $AC0.M, @$AR2
|
|
// 0694 2edc srs @yn2, $AC0.M
|
|
|
|
// 0695 8c00 clr15 // signed mulx
|
|
// 0696 8a00 m2 // *2
|
|
// 0697 8e00 set16 // no sign extend
|
|
|
|
// 0698 195b lrri $AX1.H, @$AR2
|
|
// 0699 1959 lrri $AX1.L, @$AR2
|
|
// 069a 8100 clr $ACC0
|
|
// 069b 195c lrri $AC0.L, @$AR2
|
|
// 069c 0080 0e44 lri $AR0, #0x0e44
|
|
// 069e 195f lrri $AC1.M, @$AR2
|
|
// 069f 195f lrri $AC1.M, @$AR2
|
|
// 06a0 195f lrri $AC1.M, @$AR2
|
|
// 06a1 1b1f srri @$AR0, $AC1.M
|
|
AR0 = 0x0e44
|
|
AX1.H = pb.src.ratioHi
|
|
AX1.L = pb.src.ratioLo
|
|
AC0.L = pb.src.currentAddressFrac
|
|
AC1.M = pb.src.last_samples[2]
|
|
|
|
*0x0e44 = pb.src.last_samples[2]
|
|
*0x0e45 = pb.src.last_samples[3]
|
|
|
|
// 06a2 185f lrr $AC1.M, @$AR2
|
|
// 06a3 1b1f srri @$AR0, $AC1.M
|
|
// 06a4 6b00 movax $ACC1, $AX1
|
|
// 06a5 1505 lsl $ACC1, #5
|
|
// 06a6 4d00 add $ACC1, $ACC0
|
|
// 06a7 157e lsr $ACC1, #-2
|
|
// 06a8 1c9f mrr $IX0, $AC1.M
|
|
// 06a9 1cbd mrr $IX1, $AC1.L
|
|
ACC1 = (pb.src.currentAddressFrac + (pb.src.ratio << 5)) >> 2
|
|
IX0 = ACC1 >> 16
|
|
IX1 = ((ACC1 & 0xffff) & 0xc000) >> 14
|
|
IX2 = ~((ACC1 >> 16) - 32)
|
|
AX0.H = 0x01fc
|
|
AC0.M = 0x0e45
|
|
AR1 = 0xffdd // DSP_ACCELERATOR
|
|
AR3 = 0x0d80
|
|
|
|
// 06aa 05e0 addis $AC1.M, #0xe0
|
|
// 06ab 9900 asr16 $ACC1
|
|
// 06ac 7d00 neg $ACC1
|
|
// 06ad 1cdd mrr $IX2, $AC1.L
|
|
// 06ae 8900 clr $ACC1
|
|
// 06af 1fa5 mrr $AC1.L, $IX1
|
|
// 06b0 1502 lsl $ACC1, #2
|
|
// 06b1 1cbf mrr $IX1, $AC1.M
|
|
// 06b2 009a 01fc lri $AX0.H, #0x01fc
|
|
// 06b4 009e 0e45 lri $AC0.M, #0x0e45
|
|
// 06b6 0081 ffdd lri $AR1, #0xffdd
|
|
// 06b8 0083 0d80 lri $AR3, #0x0d80
|
|
// 06ba 0064 06cb bloop $IX0, 0x06cb
|
|
// 06bc 1827 lrr $IX3, @$AR1
|
|
// 06bd 1b07 srri @$AR0, $IX3
|
|
// 06be 4a00 addax $ACC0, $AX1
|
|
// 06bf 1b7e srri @$AR3, $AC0.M
|
|
// 06c0 1827 lrr $IX3, @$AR1
|
|
// 06c1 1b07 srri @$AR0, $IX3
|
|
// 06c2 1b7c srri @$AR3, $AC0.L
|
|
// 06c3 0000 nop
|
|
// 06c4 1827 lrr $IX3, @$AR1
|
|
// 06c5 1b07 srri @$AR0, $IX3
|
|
// 06c6 0000 nop
|
|
// 06c7 0000 nop
|
|
// 06c8 1827 lrr $IX3, @$AR1
|
|
// 06c9 1b07 srri @$AR0, $IX3
|
|
// 06ca 0000 nop
|
|
// 06cb 0000 nop
|
|
ACCO = (0x0e45 << 16) + pb.src.currentAddressFrac
|
|
for (i = 0; i < IX0; i++) {
|
|
ACC0 += pb.src.ratio
|
|
*(0x0d80++) = ACC0 >> 16
|
|
*(0x0d80++) = ACC0 & 0xffff
|
|
*(0x0e46++) = *DSP_ACCELERATOR
|
|
*(0x0e46++) = *DSP_ACCELERATOR
|
|
*(0x0e46++) = *DSP_ACCELERATOR
|
|
*(0x0e46++) = *DSP_ACCELERATOR
|
|
}
|
|
|
|
// 06cc 0065 06d1 bloop $IX1, 0x06d1
|
|
// 06ce 1827 lrr $IX3, @$AR1
|
|
// 06cf 1b07 srri @$AR0, $IX3
|
|
// 06d0 0000 nop
|
|
// 06d1 0000 nop
|
|
for (i = 0; i < IX1; i++) {
|
|
*(0x0e46++) = *DSP_ACCELERATOR
|
|
}
|
|
|
|
// 06d2 0066 06d6 bloop $IX2, 0x06d6
|
|
// 06d4 4a00 addax $ACC0, $AX1
|
|
// 06d5 1b7e srri @$AR3, $AC0.M
|
|
// 06d6 1b7c srri @$AR3, $AC0.L
|
|
for (i = 0; i < IX2; i++) {
|
|
ACC0 += pb.src.ratio
|
|
*(0x0d80++) = ACC0 >> 16
|
|
*(0x0d80++) = ACC0 & 0xffff
|
|
}
|
|
|
|
// 06d7 0004 dar $AR0
|
|
// 06d8 189f lrrd $AC1.M, @$AR0
|
|
// 06d9 1adf srrd @$AR2, $AC1.M
|
|
// 06da 189f lrrd $AC1.M, @$AR0
|
|
// 06db 1adf srrd @$AR2, $AC1.M
|
|
// 06dc 189f lrrd $AC1.M, @$AR0
|
|
// 06dd 1adf srrd @$AR2, $AC1.M
|
|
// 06de 189f lrrd $AC1.M, @$AR0
|
|
// 06df 1adf srrd @$AR2, $AC1.M
|
|
// 06e0 1adc srrd @$AR2, $AC0.L
|
|
*(0x0e46++)--
|
|
pb.src.last_samples[3] = *(0x0e46--)
|
|
pb.src.last_samples[2] = *(0x0e46--)
|
|
pb.src.last_samples[1] = *(0x0e46--)
|
|
pb.src.last_samples[0] = *(0x0e46--)
|
|
pb.src.currentAddressFrac = ACC0 & 0xffff
|
|
|
|
// 06e1 0082 0bd2 lri $AR2, #0x0bd2
|
|
// 06e3 27dc lrs $AC1.M, @yn2
|
|
// 06e4 1adf srrd @$AR2, $AC1.M
|
|
// 06e5 27db lrs $AC1.M, @yn1
|
|
// 06e6 1adf srrd @$AR2, $AC1.M
|
|
// 06e7 27da lrs $AC1.M, @scale
|
|
// 06e8 1adf srrd @$AR2, $AC1.M
|
|
// 06e9 0082 0bbe lri $AR2, #0x0bbe
|
|
// 06eb 27d9 lrs $AC1.M, @ACCAL
|
|
// 06ec 1adf srrd @$AR2, $AC1.M
|
|
// 06ed 27d8 lrs $AC1.M, @ACCAH
|
|
// 06ee 1adf srrd @$AR2, $AC1.M
|
|
pb.adpm.yn2 = *yn2
|
|
pb.adpm.yn1 = *yn1
|
|
pb.adpm.pred_scale = *scale
|
|
pb.addr.currentAddressLo = *ACCAL // Current playback position
|
|
pb.addr.currentAddressHi = *ACCAH
|
|
|
|
06ef 8d00 set15 // unsigned mulx
|
|
06f0 8b00 m0 // no *2
|
|
06f1 8f00 set40 // sign extend
|
|
06f2 00c1 0e42 lr $AR1, @0x0e42
|
|
06f4 0082 0d80 lri $AR2, #0x0d80
|
|
06f6 8100 clr $ACC0
|
|
06f7 1120 0703 bloopi #0x20, 0x0703
|
|
06f9 8900 clr $ACC1
|
|
06fa 1940 lrri $AR0, @$AR2
|
|
06fb 189e lrrd $AC0.M, @$AR0
|
|
06fc 181b lrr $AX1.H, @$AR0
|
|
06fd 199a lrrn $AX0.H, @$AR0
|
|
06fe 5400 subr $ACC0, $AX0.H
|
|
06ff 1f5e mrr $AX0.H, $AC0.M
|
|
0700 1959 lrri $AX1.L, @$AR2
|
|
0701 b000 mulx $AX0.H, $AX1.L
|
|
0702 fb00 addpaxz $ACC1, $AX1
|
|
0703 8139 clr's $ACC0 : @$AR1, $AC1.M
|
|
|
|
0704 00e1 0e42 sr @0x0e42, $AR1
|
|
|
|
0706 02df ret
|
|
}
|
|
|
|
void SRC_None() {
|
|
// Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs
|
|
// 0707 0082 0bb8 lri $AR2, #0x0bb8
|
|
// 0709 195e lrri $AC0.M, @$AR2
|
|
// 070a 2ed1 srs @SampleFormat, $AC0.M
|
|
// 070b 195e lrri $AC0.M, @$AR2
|
|
// 070c 2ed4 srs @ACSAH, $AC0.M
|
|
// 070d 195e lrri $AC0.M, @$AR2
|
|
// 070e 2ed5 srs @ACSAL, $AC0.M
|
|
// 070f 195e lrri $AC0.M, @$AR2
|
|
// 0710 2ed6 srs @ACEAH, $AC0.M
|
|
// 0711 195e lrri $AC0.M, @$AR2
|
|
// 0712 2ed7 srs @ACEAL, $AC0.M
|
|
// 0713 195e lrri $AC0.M, @$AR2
|
|
// 0714 2ed8 srs @ACCAH, $AC0.M
|
|
// 0715 195e lrri $AC0.M, @$AR2
|
|
// 0716 2ed9 srs @ACCAL, $AC0.M
|
|
// 0717 195e lrri $AC0.M, @$AR2
|
|
// 0718 2ea0 srs @COEF_A1_0, $AC0.M
|
|
// 0719 195e lrri $AC0.M, @$AR2
|
|
// 071a 2ea1 srs @COEF_A2_0, $AC0.M
|
|
// 071b 195e lrri $AC0.M, @$AR2
|
|
// 071c 2ea2 srs @COEF_A1_1, $AC0.M
|
|
// 071d 195e lrri $AC0.M, @$AR2
|
|
// 071e 2ea3 srs @COEF_A2_1, $AC0.M
|
|
// 071f 195e lrri $AC0.M, @$AR2
|
|
// 0720 2ea4 srs @COEF_A1_2, $AC0.M
|
|
// 0721 195e lrri $AC0.M, @$AR2
|
|
// 0722 2ea5 srs @COEF_A2_2, $AC0.M
|
|
// 0723 195e lrri $AC0.M, @$AR2
|
|
// 0724 2ea6 srs @COEF_A1_3, $AC0.M
|
|
// 0725 195e lrri $AC0.M, @$AR2
|
|
// 0726 2ea7 srs @COEF_A2_3, $AC0.M
|
|
// 0727 195e lrri $AC0.M, @$AR2
|
|
// 0728 2ea8 srs @COEF_A1_4, $AC0.M
|
|
// 0729 195e lrri $AC0.M, @$AR2
|
|
// 072a 2ea9 srs @COEF_A2_4, $AC0.M
|
|
// 072b 195e lrri $AC0.M, @$AR2
|
|
// 072c 2eaa srs @COEF_A1_5, $AC0.M
|
|
// 072d 195e lrri $AC0.M, @$AR2
|
|
// 072e 2eab srs @COEF_A2_5, $AC0.M
|
|
// 072f 195e lrri $AC0.M, @$AR2
|
|
// 0730 2eac srs @COEF_A1_6, $AC0.M
|
|
// 0731 195e lrri $AC0.M, @$AR2
|
|
// 0732 2ead srs @COEF_A2_6, $AC0.M
|
|
// 0733 195e lrri $AC0.M, @$AR2
|
|
// 0734 2eae srs @COEF_A1_7, $AC0.M
|
|
// 0735 195e lrri $AC0.M, @$AR2
|
|
// 0736 2eaf srs @COEF_A2_7, $AC0.M
|
|
// 0737 195e lrri $AC0.M, @$AR2
|
|
// 0738 2ede srs @GAIN, $AC0.M
|
|
// 0739 195e lrri $AC0.M, @$AR2
|
|
// 073a 2eda srs @scale, $AC0.M
|
|
// 073b 195e lrri $AC0.M, @$AR2
|
|
// 073c 2edb srs @yn1, $AC0.M
|
|
// 073d 195e lrri $AC0.M, @$AR2
|
|
// 073e 2edc srs @yn2, $AC0.M
|
|
|
|
// 073f 00c0 0e42 lr $AR0, @0x0e42
|
|
// 0741 0081 ffdd lri $AR1, #0xffdd // DSP_ACCELERATOR
|
|
// 0743 1120 0748 bloopi #0x20, 0x0748
|
|
// 0745 1824 lrr $IX0, @$AR1
|
|
// 0746 1b04 srri @$AR0, $IX0
|
|
// 0747 0000 nop
|
|
// 0748 0000 nop
|
|
// 0749 00e0 0e42 sr @0x0e42, $AR0
|
|
|
|
u16 i = *0x0e42
|
|
for (; i < ((*0x0e42) + 0x20); i++) {
|
|
*i = *DSP_ACCELERATOR
|
|
}
|
|
*0x0e42 = i
|
|
|
|
// 074b 0082 0bd9 lri $AR2, #0x0bd9 // pb.src.last_samples[3]
|
|
// 074d 0004 dar $AR0
|
|
// 074e 189f lrrd $AC1.M, @$AR0
|
|
// 074f 1adf srrd @$AR2, $AC1.M
|
|
// 0750 189f lrrd $AC1.M, @$AR0
|
|
// 0751 1adf srrd @$AR2, $AC1.M
|
|
// 0752 189f lrrd $AC1.M, @$AR0
|
|
// 0753 1adf srrd @$AR2, $AC1.M
|
|
// 0754 189f lrrd $AC1.M, @$AR0
|
|
// 0755 1adf srrd @$AR2, $AC1.M
|
|
// 0756 8900 clr $ACC1
|
|
// 0757 1adc srrd @$AR2, $AC0.L // uhhh assume AC0.L is 0?
|
|
i-- // Guess that 0x0e42 points to struct of 1 pointer and 32 values
|
|
pb.src.last_samples[3] = *(i--)
|
|
pb.src.last_samples[2] = *(i--)
|
|
pb.src.last_samples[1] = *(i--)
|
|
pb.src.last_samples[0] = *(i--)
|
|
pb.src.currentAddressFrac = 0
|
|
|
|
// 0758 27dc lrs $AC1.M, @yn2
|
|
// 0759 00ff 0bd2 sr @0x0bd2, $AC1.M
|
|
// 075b 27db lrs $AC1.M, @yn1
|
|
// 075c 00ff 0bd1 sr @0x0bd1, $AC1.M
|
|
// 075e 27da lrs $AC1.M, @scale
|
|
// 075f 00ff 0bd0 sr @0x0bd0, $AC1.M
|
|
// 0761 27d9 lrs $AC1.M, @ACCAL
|
|
// 0762 00ff 0bbe sr @0x0bbe, $AC1.M
|
|
// 0764 27d8 lrs $AC1.M, @ACCAH
|
|
// 0765 00ff 0bbd sr @0x0bbd, $AC1.M
|
|
pb.adpm.yn2 = *yn2
|
|
pb.adpm.yn1 = *yn1
|
|
pb.adpm.pred_scale = *scale
|
|
pb.addr.currentAddressLo = *ACCAL // Current playback position
|
|
pb.addr.currentAddressHi = *ACCAH
|
|
|
|
0767 02df ret
|
|
}
|
|
|
|
|
|
# From here to the jump tables, all the funcs just wrap calls to mixer(s) in IROM
|
|
|
|
void Mixer_0() {
|
|
0768 00c0 0e40 lr $AR0, @0x0e40
|
|
076a 0081 0b89 lri $AR1, #0x0b89
|
|
076c 00c2 0e08 lr $AR2, @0x0e08
|
|
076e 1c62 mrr $AR3, $AR2
|
|
076f 00c4 0e41 lr $IX0, @0x0e41
|
|
0771 00c5 0e09 lr $IX1, @0x0e09
|
|
0773 02bf 80e7 call 0x80e7
|
|
0775 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0777 00fb 0bac sr @0x0bac, $AX1.H
|
|
0779 02df ret
|
|
}
|
|
|
|
void Mixer_1() {
|
|
077a 00c0 0e40 lr $AR0, @0x0e40
|
|
077c 0081 0b89 lri $AR1, #0x0b89
|
|
077e 00c2 0e08 lr $AR2, @0x0e08
|
|
0780 1c62 mrr $AR3, $AR2
|
|
0781 00c4 0e41 lr $IX0, @0x0e41
|
|
0783 00c5 0e09 lr $IX1, @0x0e09
|
|
0785 02bf 80e7 call 0x80e7
|
|
0787 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0789 00fb 0bac sr @0x0bac, $AX1.H
|
|
078b 00c0 0e40 lr $AR0, @0x0e40
|
|
078d 0081 0b8d lri $AR1, #0x0b8d
|
|
078f 00c2 0e0b lr $AR2, @0x0e0b
|
|
0791 1c62 mrr $AR3, $AR2
|
|
0792 00c4 0e41 lr $IX0, @0x0e41
|
|
0794 00c5 0e0c lr $IX1, @0x0e0c
|
|
0796 02bf 80e7 call 0x80e7
|
|
0798 00f8 0baa sr @0x0baa, $AX0.L
|
|
079a 00fb 0bad sr @0x0bad, $AX1.H
|
|
079c 02df ret
|
|
}
|
|
|
|
void Mixer_2() {
|
|
079d 00c0 0e40 lr $AR0, @0x0e40
|
|
079f 0081 0b89 lri $AR1, #0x0b89
|
|
07a1 00c2 0e08 lr $AR2, @0x0e08
|
|
07a3 1c62 mrr $AR3, $AR2
|
|
07a4 00c4 0e41 lr $IX0, @0x0e41
|
|
07a6 00c5 0e09 lr $IX1, @0x0e09
|
|
07a8 02bf 80e7 call 0x80e7
|
|
07aa 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
07ac 00fb 0bac sr @0x0bac, $AX1.H
|
|
07ae 00c0 0e40 lr $AR0, @0x0e40
|
|
07b0 0081 0b91 lri $AR1, #0x0b91
|
|
07b2 00c2 0e0e lr $AR2, @0x0e0e
|
|
07b4 1c62 mrr $AR3, $AR2
|
|
07b5 00c4 0e41 lr $IX0, @0x0e41
|
|
07b7 00c5 0e0f lr $IX1, @0x0e0f
|
|
07b9 02bf 80e7 call 0x80e7
|
|
07bb 00f8 0bab sr @0x0bab, $AX0.L
|
|
07bd 00fb 0bae sr @0x0bae, $AX1.H
|
|
07bf 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
07c0 00c0 0e40 lr $AR0, @0x0e40
|
|
07c2 0081 0b89 lri $AR1, #0x0b89
|
|
07c4 00c2 0e08 lr $AR2, @0x0e08
|
|
07c6 1c62 mrr $AR3, $AR2
|
|
07c7 00c4 0e41 lr $IX0, @0x0e41
|
|
07c9 00c5 0e09 lr $IX1, @0x0e09
|
|
07cb 02bf 80e7 call 0x80e7
|
|
07cd 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
07cf 00fb 0bac sr @0x0bac, $AX1.H
|
|
07d1 00c0 0e40 lr $AR0, @0x0e40
|
|
07d3 0081 0b8d lri $AR1, #0x0b8d
|
|
07d5 00c2 0e0b lr $AR2, @0x0e0b
|
|
07d7 1c62 mrr $AR3, $AR2
|
|
07d8 00c4 0e41 lr $IX0, @0x0e41
|
|
07da 00c5 0e0c lr $IX1, @0x0e0c
|
|
07dc 02bf 80e7 call 0x80e7
|
|
07de 00f8 0baa sr @0x0baa, $AX0.L
|
|
07e0 00fb 0bad sr @0x0bad, $AX1.H
|
|
07e2 00c0 0e40 lr $AR0, @0x0e40
|
|
07e4 0081 0b91 lri $AR1, #0x0b91
|
|
07e6 00c2 0e0e lr $AR2, @0x0e0e
|
|
07e8 1c62 mrr $AR3, $AR2
|
|
07e9 00c4 0e41 lr $IX0, @0x0e41
|
|
07eb 00c5 0e0f lr $IX1, @0x0e0f
|
|
07ed 02bf 80e7 call 0x80e7
|
|
07ef 00f8 0bab sr @0x0bab, $AX0.L
|
|
07f1 00fb 0bae sr @0x0bae, $AX1.H
|
|
07f3 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
07f4 00c0 0e40 lr $AR0, @0x0e40
|
|
07f6 0081 0b89 lri $AR1, #0x0b89
|
|
07f8 00c2 0e08 lr $AR2, @0x0e08
|
|
07fa 1c62 mrr $AR3, $AR2
|
|
07fb 00c4 0e41 lr $IX0, @0x0e41
|
|
07fd 00c5 0e09 lr $IX1, @0x0e09
|
|
07ff 02bf 80e7 call 0x80e7
|
|
0801 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0803 00fb 0bac sr @0x0bac, $AX1.H
|
|
0805 00c0 0e43 lr $AR0, @0x0e43
|
|
0807 0081 0b97 lri $AR1, #0x0b97
|
|
0809 00c2 0e0a lr $AR2, @0x0e0a
|
|
080b 1c62 mrr $AR3, $AR2
|
|
080c 02bf 81f9 call 0x81f9
|
|
080e 00f8 0baf sr @0x0baf, $AX0.L
|
|
0810 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0811 00c0 0e40 lr $AR0, @0x0e40
|
|
0813 0081 0b89 lri $AR1, #0x0b89
|
|
0815 00c2 0e08 lr $AR2, @0x0e08
|
|
0817 1c62 mrr $AR3, $AR2
|
|
0818 00c4 0e41 lr $IX0, @0x0e41
|
|
081a 00c5 0e09 lr $IX1, @0x0e09
|
|
081c 02bf 80e7 call 0x80e7
|
|
081e 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0820 00fb 0bac sr @0x0bac, $AX1.H
|
|
0822 00c0 0e40 lr $AR0, @0x0e40
|
|
0824 0081 0b8d lri $AR1, #0x0b8d
|
|
0826 00c2 0e0b lr $AR2, @0x0e0b
|
|
0828 1c62 mrr $AR3, $AR2
|
|
0829 00c4 0e41 lr $IX0, @0x0e41
|
|
082b 00c5 0e0c lr $IX1, @0x0e0c
|
|
082d 02bf 80e7 call 0x80e7
|
|
082f 00f8 0baa sr @0x0baa, $AX0.L
|
|
0831 00fb 0bad sr @0x0bad, $AX1.H
|
|
0833 00c0 0e43 lr $AR0, @0x0e43
|
|
0835 0081 0b97 lri $AR1, #0x0b97
|
|
0837 00c2 0e0a lr $AR2, @0x0e0a
|
|
0839 1c62 mrr $AR3, $AR2
|
|
083a 1c80 mrr $IX0, $AR0
|
|
083b 00c5 0e0d lr $IX1, @0x0e0d
|
|
083d 02bf 80e7 call 0x80e7
|
|
083f 00f8 0baf sr @0x0baf, $AX0.L
|
|
0841 00fb 0bb0 sr @0x0bb0, $AX1.H
|
|
0843 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0844 00c0 0e40 lr $AR0, @0x0e40
|
|
0846 0081 0b89 lri $AR1, #0x0b89
|
|
0848 00c2 0e08 lr $AR2, @0x0e08
|
|
084a 1c62 mrr $AR3, $AR2
|
|
084b 00c4 0e41 lr $IX0, @0x0e41
|
|
084d 00c5 0e09 lr $IX1, @0x0e09
|
|
084f 02bf 80e7 call 0x80e7
|
|
0851 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0853 00fb 0bac sr @0x0bac, $AX1.H
|
|
0855 00c0 0e40 lr $AR0, @0x0e40
|
|
0857 0081 0b91 lri $AR1, #0x0b91
|
|
0859 00c2 0e0e lr $AR2, @0x0e0e
|
|
085b 1c62 mrr $AR3, $AR2
|
|
085c 00c4 0e41 lr $IX0, @0x0e41
|
|
085e 00c5 0e0f lr $IX1, @0x0e0f
|
|
0860 02bf 80e7 call 0x80e7
|
|
0862 00f8 0bab sr @0x0bab, $AX0.L
|
|
0864 00fb 0bae sr @0x0bae, $AX1.H
|
|
0866 00c0 0e43 lr $AR0, @0x0e43
|
|
0868 0081 0b95 lri $AR1, #0x0b95
|
|
086a 00c2 0e10 lr $AR2, @0x0e10
|
|
086c 1c62 mrr $AR3, $AR2
|
|
086d 1c80 mrr $IX0, $AR0
|
|
086e 00c5 0e0a lr $IX1, @0x0e0a
|
|
0870 02bf 80e7 call 0x80e7
|
|
0872 00f8 0bb1 sr @0x0bb1, $AX0.L
|
|
0874 00fb 0baf sr @0x0baf, $AX1.H
|
|
0876 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0877 00c0 0e40 lr $AR0, @0x0e40
|
|
0879 0081 0b89 lri $AR1, #0x0b89
|
|
087b 00c2 0e08 lr $AR2, @0x0e08
|
|
087d 1c62 mrr $AR3, $AR2
|
|
087e 00c4 0e41 lr $IX0, @0x0e41
|
|
0880 00c5 0e09 lr $IX1, @0x0e09
|
|
0882 02bf 80e7 call 0x80e7
|
|
0884 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0886 00fb 0bac sr @0x0bac, $AX1.H
|
|
0888 00c0 0e40 lr $AR0, @0x0e40
|
|
088a 0081 0b8d lri $AR1, #0x0b8d
|
|
088c 00c2 0e0b lr $AR2, @0x0e0b
|
|
088e 1c62 mrr $AR3, $AR2
|
|
088f 00c4 0e41 lr $IX0, @0x0e41
|
|
0891 00c5 0e0c lr $IX1, @0x0e0c
|
|
0893 02bf 80e7 call 0x80e7
|
|
0895 00f8 0baa sr @0x0baa, $AX0.L
|
|
0897 00fb 0bad sr @0x0bad, $AX1.H
|
|
0899 00c0 0e40 lr $AR0, @0x0e40
|
|
089b 0081 0b91 lri $AR1, #0x0b91
|
|
089d 00c2 0e0e lr $AR2, @0x0e0e
|
|
089f 1c62 mrr $AR3, $AR2
|
|
08a0 00c4 0e41 lr $IX0, @0x0e41
|
|
08a2 00c5 0e0f lr $IX1, @0x0e0f
|
|
08a4 02bf 80e7 call 0x80e7
|
|
08a6 00f8 0bab sr @0x0bab, $AX0.L
|
|
08a8 00fb 0bae sr @0x0bae, $AX1.H
|
|
08aa 00c0 0e43 lr $AR0, @0x0e43
|
|
08ac 0081 0b97 lri $AR1, #0x0b97
|
|
08ae 00c2 0e0a lr $AR2, @0x0e0a
|
|
08b0 1c62 mrr $AR3, $AR2
|
|
08b1 1c80 mrr $IX0, $AR0
|
|
08b2 00c5 0e0d lr $IX1, @0x0e0d
|
|
08b4 02bf 80e7 call 0x80e7
|
|
08b6 00f8 0baf sr @0x0baf, $AX0.L
|
|
08b8 00fb 0bb0 sr @0x0bb0, $AX1.H
|
|
08ba 00c0 0e43 lr $AR0, @0x0e43
|
|
08bc 0081 0b95 lri $AR1, #0x0b95
|
|
08be 00c2 0e10 lr $AR2, @0x0e10
|
|
08c0 1c62 mrr $AR3, $AR2
|
|
08c1 02bf 81f9 call 0x81f9
|
|
08c3 00f8 0bb1 sr @0x0bb1, $AX0.L
|
|
08c5 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
08c6 00c0 0e40 lr $AR0, @0x0e40
|
|
08c8 0081 0b89 lri $AR1, #0x0b89
|
|
08ca 00c2 0e08 lr $AR2, @0x0e08
|
|
08cc 0083 0e44 lri $AR3, #0x0e44
|
|
08ce 00c4 0e41 lr $IX0, @0x0e41
|
|
08d0 00c5 0e09 lr $IX1, @0x0e09
|
|
08d2 02bf 8282 call 0x8282
|
|
08d4 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
08d6 00fb 0bac sr @0x0bac, $AX1.H
|
|
08d8 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
08d9 00c0 0e40 lr $AR0, @0x0e40
|
|
08db 0081 0b89 lri $AR1, #0x0b89
|
|
08dd 00c2 0e08 lr $AR2, @0x0e08
|
|
08df 0083 0e44 lri $AR3, #0x0e44
|
|
08e1 00c4 0e41 lr $IX0, @0x0e41
|
|
08e3 00c5 0e09 lr $IX1, @0x0e09
|
|
08e5 02bf 8282 call 0x8282
|
|
08e7 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
08e9 00fb 0bac sr @0x0bac, $AX1.H
|
|
08eb 00c0 0e40 lr $AR0, @0x0e40
|
|
08ed 0081 0b8d lri $AR1, #0x0b8d
|
|
08ef 00c2 0e0b lr $AR2, @0x0e0b
|
|
08f1 0083 0e44 lri $AR3, #0x0e44
|
|
08f3 00c4 0e41 lr $IX0, @0x0e41
|
|
08f5 00c5 0e0c lr $IX1, @0x0e0c
|
|
08f7 02bf 8282 call 0x8282
|
|
08f9 00f8 0baa sr @0x0baa, $AX0.L
|
|
08fb 00fb 0bad sr @0x0bad, $AX1.H
|
|
08fd 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
08fe 00c0 0e40 lr $AR0, @0x0e40
|
|
0900 0081 0b89 lri $AR1, #0x0b89
|
|
0902 00c2 0e08 lr $AR2, @0x0e08
|
|
0904 0083 0e44 lri $AR3, #0x0e44
|
|
0906 00c4 0e41 lr $IX0, @0x0e41
|
|
0908 00c5 0e09 lr $IX1, @0x0e09
|
|
090a 02bf 8282 call 0x8282
|
|
090c 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
090e 00fb 0bac sr @0x0bac, $AX1.H
|
|
0910 00c0 0e40 lr $AR0, @0x0e40
|
|
0912 0081 0b91 lri $AR1, #0x0b91
|
|
0914 00c2 0e0e lr $AR2, @0x0e0e
|
|
0916 0083 0e44 lri $AR3, #0x0e44
|
|
0918 00c4 0e41 lr $IX0, @0x0e41
|
|
091a 00c5 0e0f lr $IX1, @0x0e0f
|
|
091c 02bf 8282 call 0x8282
|
|
091e 00f8 0bab sr @0x0bab, $AX0.L
|
|
0920 00fb 0bae sr @0x0bae, $AX1.H
|
|
0922 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0923 00c0 0e40 lr $AR0, @0x0e40
|
|
0925 0081 0b89 lri $AR1, #0x0b89
|
|
0927 00c2 0e08 lr $AR2, @0x0e08
|
|
0929 0083 0e44 lri $AR3, #0x0e44
|
|
092b 00c4 0e41 lr $IX0, @0x0e41
|
|
092d 00c5 0e09 lr $IX1, @0x0e09
|
|
092f 02bf 8282 call 0x8282
|
|
0931 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0933 00fb 0bac sr @0x0bac, $AX1.H
|
|
0935 00c0 0e40 lr $AR0, @0x0e40
|
|
0937 0081 0b8d lri $AR1, #0x0b8d
|
|
0939 00c2 0e0b lr $AR2, @0x0e0b
|
|
093b 0083 0e44 lri $AR3, #0x0e44
|
|
093d 00c4 0e41 lr $IX0, @0x0e41
|
|
093f 00c5 0e0c lr $IX1, @0x0e0c
|
|
0941 02bf 8282 call 0x8282
|
|
0943 00f8 0baa sr @0x0baa, $AX0.L
|
|
0945 00fb 0bad sr @0x0bad, $AX1.H
|
|
0947 00c0 0e40 lr $AR0, @0x0e40
|
|
0949 0081 0b91 lri $AR1, #0x0b91
|
|
094b 00c2 0e0e lr $AR2, @0x0e0e
|
|
094d 0083 0e44 lri $AR3, #0x0e44
|
|
094f 00c4 0e41 lr $IX0, @0x0e41
|
|
0951 00c5 0e0f lr $IX1, @0x0e0f
|
|
0953 02bf 8282 call 0x8282
|
|
0955 00f8 0bab sr @0x0bab, $AX0.L
|
|
0957 00fb 0bae sr @0x0bae, $AX1.H
|
|
0959 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
095a 00c0 0e40 lr $AR0, @0x0e40
|
|
095c 0081 0b89 lri $AR1, #0x0b89
|
|
095e 00c2 0e08 lr $AR2, @0x0e08
|
|
0960 0083 0e44 lri $AR3, #0x0e44
|
|
0962 00c4 0e41 lr $IX0, @0x0e41
|
|
0964 00c5 0e09 lr $IX1, @0x0e09
|
|
0966 02bf 8282 call 0x8282
|
|
0968 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
096a 00fb 0bac sr @0x0bac, $AX1.H
|
|
096c 00c0 0e43 lr $AR0, @0x0e43
|
|
096e 0081 0b97 lri $AR1, #0x0b97
|
|
0970 00c2 0e0a lr $AR2, @0x0e0a
|
|
0972 0083 0e44 lri $AR3, #0x0e44
|
|
0974 02bf 845d call 0x845d
|
|
0976 00f8 0baf sr @0x0baf, $AX0.L
|
|
0978 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0979 00c0 0e40 lr $AR0, @0x0e40
|
|
097b 0081 0b89 lri $AR1, #0x0b89
|
|
097d 00c2 0e08 lr $AR2, @0x0e08
|
|
097f 0083 0e44 lri $AR3, #0x0e44
|
|
0981 00c4 0e41 lr $IX0, @0x0e41
|
|
0983 00c5 0e09 lr $IX1, @0x0e09
|
|
0985 02bf 8282 call 0x8282
|
|
0987 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0989 00fb 0bac sr @0x0bac, $AX1.H
|
|
098b 00c0 0e40 lr $AR0, @0x0e40
|
|
098d 0081 0b8d lri $AR1, #0x0b8d
|
|
098f 00c2 0e0b lr $AR2, @0x0e0b
|
|
0991 0083 0e44 lri $AR3, #0x0e44
|
|
0993 00c4 0e41 lr $IX0, @0x0e41
|
|
0995 00c5 0e0c lr $IX1, @0x0e0c
|
|
0997 02bf 8282 call 0x8282
|
|
0999 00f8 0baa sr @0x0baa, $AX0.L
|
|
099b 00fb 0bad sr @0x0bad, $AX1.H
|
|
099d 00c0 0e43 lr $AR0, @0x0e43
|
|
099f 0081 0b97 lri $AR1, #0x0b97
|
|
09a1 00c2 0e0a lr $AR2, @0x0e0a
|
|
09a3 0083 0e44 lri $AR3, #0x0e44
|
|
09a5 1c80 mrr $IX0, $AR0
|
|
09a6 00c5 0e0d lr $IX1, @0x0e0d
|
|
09a8 02bf 8282 call 0x8282
|
|
09aa 00f8 0baf sr @0x0baf, $AX0.L
|
|
09ac 00fb 0bb0 sr @0x0bb0, $AX1.H
|
|
09ae 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
09af 00c0 0e40 lr $AR0, @0x0e40
|
|
09b1 0081 0b89 lri $AR1, #0x0b89
|
|
09b3 00c2 0e08 lr $AR2, @0x0e08
|
|
09b5 0083 0e44 lri $AR3, #0x0e44
|
|
09b7 00c4 0e41 lr $IX0, @0x0e41
|
|
09b9 00c5 0e09 lr $IX1, @0x0e09
|
|
09bb 02bf 8282 call 0x8282
|
|
09bd 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
09bf 00fb 0bac sr @0x0bac, $AX1.H
|
|
09c1 00c0 0e40 lr $AR0, @0x0e40
|
|
09c3 0081 0b91 lri $AR1, #0x0b91
|
|
09c5 00c2 0e0e lr $AR2, @0x0e0e
|
|
09c7 0083 0e44 lri $AR3, #0x0e44
|
|
09c9 00c4 0e41 lr $IX0, @0x0e41
|
|
09cb 00c5 0e0f lr $IX1, @0x0e0f
|
|
09cd 02bf 8282 call 0x8282
|
|
09cf 00f8 0bab sr @0x0bab, $AX0.L
|
|
09d1 00fb 0bae sr @0x0bae, $AX1.H
|
|
09d3 00c0 0e43 lr $AR0, @0x0e43
|
|
09d5 0081 0b95 lri $AR1, #0x0b95
|
|
09d7 00c2 0e10 lr $AR2, @0x0e10
|
|
09d9 0083 0e44 lri $AR3, #0x0e44
|
|
09db 1c80 mrr $IX0, $AR0
|
|
09dc 00c5 0e0a lr $IX1, @0x0e0a
|
|
09de 02bf 8282 call 0x8282
|
|
09e0 00f8 0bb1 sr @0x0bb1, $AX0.L
|
|
09e2 00fb 0baf sr @0x0baf, $AX1.H
|
|
09e4 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
09e5 00c0 0e40 lr $AR0, @0x0e40
|
|
09e7 0081 0b89 lri $AR1, #0x0b89
|
|
09e9 00c2 0e08 lr $AR2, @0x0e08
|
|
09eb 0083 0e44 lri $AR3, #0x0e44
|
|
09ed 00c4 0e41 lr $IX0, @0x0e41
|
|
09ef 00c5 0e09 lr $IX1, @0x0e09
|
|
09f1 02bf 8282 call 0x8282
|
|
09f3 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
09f5 00fb 0bac sr @0x0bac, $AX1.H
|
|
09f7 00c0 0e40 lr $AR0, @0x0e40
|
|
09f9 0081 0b8d lri $AR1, #0x0b8d
|
|
09fb 00c2 0e0b lr $AR2, @0x0e0b
|
|
09fd 0083 0e44 lri $AR3, #0x0e44
|
|
09ff 00c0 0e41 lr $AR0, @0x0e41
|
|
0a01 00c5 0e0c lr $IX1, @0x0e0c
|
|
0a03 02bf 8282 call 0x8282
|
|
0a05 00f8 0baa sr @0x0baa, $AX0.L
|
|
0a07 00fb 0bad sr @0x0bad, $AX1.H
|
|
0a09 00c0 0e40 lr $AR0, @0x0e40
|
|
0a0b 0081 0b91 lri $AR1, #0x0b91
|
|
0a0d 00c2 0e0e lr $AR2, @0x0e0e
|
|
0a0f 0083 0e44 lri $AR3, #0x0e44
|
|
0a11 00c4 0e41 lr $IX0, @0x0e41
|
|
0a13 00c5 0e0f lr $IX1, @0x0e0f
|
|
0a15 02bf 8282 call 0x8282
|
|
0a17 00f8 0bab sr @0x0bab, $AX0.L
|
|
0a19 00fb 0bae sr @0x0bae, $AX1.H
|
|
0a1b 00c0 0e43 lr $AR0, @0x0e43
|
|
0a1d 0081 0b97 lri $AR1, #0x0b97
|
|
0a1f 00c2 0e0a lr $AR2, @0x0e0a
|
|
0a21 0083 0e44 lri $AR3, #0x0e44
|
|
0a23 1c80 mrr $IX0, $AR0
|
|
0a24 00c5 0e0d lr $IX1, @0x0e0d
|
|
0a26 02bf 8282 call 0x8282
|
|
0a28 00f8 0baf sr @0x0baf, $AX0.L
|
|
0a2a 00fb 0bb0 sr @0x0bb0, $AX1.H
|
|
0a2c 00c0 0e43 lr $AR0, @0x0e43
|
|
0a2e 0081 0b95 lri $AR1, #0x0b95
|
|
0a30 00c2 0e10 lr $AR2, @0x0e10
|
|
0a32 0083 0e44 lri $AR3, #0x0e44
|
|
0a34 02bf 845d call 0x845d
|
|
0a36 00f8 0bb1 sr @0x0bb1, $AX0.L
|
|
0a38 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0a39 00c0 0e40 lr $AR0, @0x0e40
|
|
0a3b 0081 0b89 lri $AR1, #0x0b89
|
|
0a3d 00c2 0e08 lr $AR2, @0x0e08
|
|
0a3f 1c62 mrr $AR3, $AR2
|
|
0a40 00c4 0e41 lr $IX0, @0x0e41
|
|
0a42 00c5 0e09 lr $IX1, @0x0e09
|
|
0a44 02bf 80e7 call 0x80e7
|
|
0a46 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0a48 00fb 0bac sr @0x0bac, $AX1.H
|
|
0a4a 00c0 0e43 lr $AR0, @0x0e43
|
|
0a4c 0081 0b91 lri $AR1, #0x0b91
|
|
0a4e 00c2 0e0e lr $AR2, @0x0e0e
|
|
0a50 1c62 mrr $AR3, $AR2
|
|
0a51 1c80 mrr $IX0, $AR0
|
|
0a52 00c5 0e0f lr $IX1, @0x0e0f
|
|
0a54 02bf 80e7 call 0x80e7
|
|
0a56 00f8 0bab sr @0x0bab, $AX0.L
|
|
0a58 00fb 0bae sr @0x0bae, $AX1.H
|
|
0a5a 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0a5b 00c0 0e40 lr $AR0, @0x0e40
|
|
0a5d 0081 0b89 lri $AR1, #0x0b89
|
|
0a5f 00c2 0e08 lr $AR2, @0x0e08
|
|
0a61 1c62 mrr $AR3, $AR2
|
|
0a62 00c4 0e41 lr $IX0, @0x0e41
|
|
0a64 00c5 0e09 lr $IX1, @0x0e09
|
|
0a66 02bf 80e7 call 0x80e7
|
|
0a68 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0a6a 00fb 0bac sr @0x0bac, $AX1.H
|
|
0a6c 00c0 0e43 lr $AR0, @0x0e43
|
|
0a6e 0081 0b91 lri $AR1, #0x0b91
|
|
0a70 00c2 0e0e lr $AR2, @0x0e0e
|
|
0a72 1c62 mrr $AR3, $AR2
|
|
0a73 1c80 mrr $IX0, $AR0
|
|
0a74 00c5 0e0f lr $IX1, @0x0e0f
|
|
0a76 02bf 80e7 call 0x80e7
|
|
0a78 00f8 0bab sr @0x0bab, $AX0.L
|
|
0a7a 00fb 0bae sr @0x0bae, $AX1.H
|
|
0a7c 00c0 0e40 lr $AR0, @0x0e40
|
|
0a7e 0081 0b8d lri $AR1, #0x0b8d
|
|
0a80 00c2 0e0b lr $AR2, @0x0e0b
|
|
0a82 1c62 mrr $AR3, $AR2
|
|
0a83 00c4 0e41 lr $IX0, @0x0e41
|
|
0a85 00c5 0e0c lr $IX1, @0x0e0c
|
|
0a87 02bf 80e7 call 0x80e7
|
|
0a89 00f8 0baa sr @0x0baa, $AX0.L
|
|
0a8b 00fb 0bad sr @0x0bad, $AX1.H
|
|
0a8d 00c0 0e43 lr $AR0, @0x0e43
|
|
0a8f 0081 0b99 lri $AR1, #0x0b99
|
|
0a91 00c2 0e0d lr $AR2, @0x0e0d
|
|
0a93 1c62 mrr $AR3, $AR2
|
|
0a94 02bf 81f9 call 0x81f9
|
|
0a96 00f8 0bb0 sr @0x0bb0, $AX0.L
|
|
0a98 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0a99 00c0 0e40 lr $AR0, @0x0e40
|
|
0a9b 0081 0b89 lri $AR1, #0x0b89
|
|
0a9d 00c2 0e08 lr $AR2, @0x0e08
|
|
0a9f 0083 0e44 lri $AR3, #0x0e44
|
|
0aa1 00c4 0e41 lr $IX0, @0x0e41
|
|
0aa3 00c5 0e09 lr $IX1, @0x0e09
|
|
0aa5 02bf 8282 call 0x8282
|
|
0aa7 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0aa9 00fb 0bac sr @0x0bac, $AX1.H
|
|
0aab 00c0 0e43 lr $AR0, @0x0e43
|
|
0aad 0081 0b91 lri $AR1, #0x0b91
|
|
0aaf 00c2 0e0e lr $AR2, @0x0e0e
|
|
0ab1 0083 0e44 lri $AR3, #0x0e44
|
|
0ab3 1c80 mrr $IX0, $AR0
|
|
0ab4 00c5 0e0f lr $IX1, @0x0e0f
|
|
0ab6 02bf 8282 call 0x8282
|
|
0ab8 00f8 0bab sr @0x0bab, $AX0.L
|
|
0aba 00fb 0bae sr @0x0bae, $AX1.H
|
|
0abc 02df ret
|
|
}
|
|
|
|
void Unk() {
|
|
0abd 00c0 0e40 lr $AR0, @0x0e40
|
|
0abf 0081 0b89 lri $AR1, #0x0b89
|
|
0ac1 00c2 0e08 lr $AR2, @0x0e08
|
|
0ac3 0083 0e44 lri $AR3, #0x0e44
|
|
0ac5 00c4 0e41 lr $IX0, @0x0e41
|
|
0ac7 00c5 0e09 lr $IX1, @0x0e09
|
|
0ac9 02bf 8282 call 0x8282
|
|
0acb 00f8 0ba9 sr @0x0ba9, $AX0.L
|
|
0acd 00fb 0bac sr @0x0bac, $AX1.H
|
|
0acf 00c0 0e43 lr $AR0, @0x0e43
|
|
0ad1 0081 0b91 lri $AR1, #0x0b91
|
|
0ad3 00c2 0e0e lr $AR2, @0x0e0e
|
|
0ad5 0083 0e44 lri $AR3, #0x0e44
|
|
0ad7 1c80 mrr $IX0, $AR0
|
|
0ad8 00c5 0e0f lr $IX1, @0x0e0f
|
|
0ada 02bf 8282 call 0x8282
|
|
0adc 00f8 0bab sr @0x0bab, $AX0.L
|
|
0ade 00fb 0bae sr @0x0bae, $AX1.H
|
|
0ae0 00c0 0e40 lr $AR0, @0x0e40
|
|
0ae2 0081 0b8d lri $AR1, #0x0b8d
|
|
0ae4 00c2 0e0b lr $AR2, @0x0e0b
|
|
0ae6 0083 0e44 lri $AR3, #0x0e44
|
|
0ae8 00c4 0e41 lr $IX0, @0x0e41
|
|
0aea 00c5 0e0c lr $IX1, @0x0e0c
|
|
0aec 02bf 8282 call 0x8282
|
|
0aee 00f8 0baa sr @0x0baa, $AX0.L
|
|
0af0 00fb 0bad sr @0x0bad, $AX1.H
|
|
0af2 00c0 0e43 lr $AR0, @0x0e43
|
|
0af4 0081 0b99 lri $AR1, #0x0b99
|
|
0af6 00c2 0e0d lr $AR2, @0x0e0d
|
|
0af8 0083 0e44 lri $AR3, #0x0e44
|
|
0afa 02bf 845d call 0x845d
|
|
0afc 00f8 0bb0 sr @0x0bb0, $AX0.L
|
|
0afe 02df ret
|
|
}
|
|
|
|
# Jump table for main commands
|
|
0aff 0082 // Jump 0
|
|
0b00 013e // Jump 1
|
|
0b01 01bc // Jump 2
|
|
0b02 0248 // Jump 3
|
|
0b03 0413 // Jump 4
|
|
0b04 0427 // Jump 5
|
|
0b05 0165 // Jump 6
|
|
0b06 0574 // Jump 7
|
|
0b07 0b37 // Jump 8
|
|
0b08 015f // Jump 9
|
|
0b09 0478 // Jump a
|
|
0b0a 0474 // Jump b
|
|
0b0b 0476 // Jump c
|
|
0b0c 01a9 // Jump d
|
|
0b0d 043b // Jump e
|
|
0b0e 047a // Jump f Task_Yield()
|
|
0b0f 0bb1 // Jump 10
|
|
0b10 0175 // Jump 11
|
|
|
|
# LUT for pb.mixerCtrl
|
|
0b11 0768 // Jump3 0
|
|
0b12 077a // Jump3 1
|
|
0b13 079d // Jump3 2
|
|
0b14 07c0 // Jump3 3
|
|
0b15 07f4 // Jump3 4
|
|
0b16 0811 // Jump3 5
|
|
0b17 0844 // Jump3 6
|
|
0b18 0877 // Jump3 7
|
|
0b19 08c6 // Jump3 8
|
|
0b1a 08d9 // Jump3 9
|
|
0b1b 08fe // Jump3 a
|
|
0b1c 0923 // Jump3 b
|
|
0b1d 095a // Jump3 c
|
|
0b1e 0979 // Jump3 d
|
|
0b1f 09af // Jump3 e
|
|
0b20 09e5 // Jump3 f
|
|
|
|
0b21 0a39 // Jump3 10
|
|
0b22 0a5b // Jump3 11
|
|
0b23 0768 // Jump3 12
|
|
0b24 0768 // Jump3 13
|
|
0b25 0768 // Jump3 14
|
|
0b26 0768 // Jump3 15
|
|
0b27 0768 // Jump3 16
|
|
0b28 0768 // Jump3 17
|
|
0b29 0a99 // Jump3 18
|
|
0b2a 0abd // Jump3 19
|
|
0b2b 0768 // Jump3 1a
|
|
0b2c 0768 // Jump3 1b
|
|
0b2d 0768 // Jump3 1c
|
|
0b2e 0768 // Jump3 1d
|
|
0b2f 0768 // Jump3 1e
|
|
0b30 0768 // Jump3 1f
|
|
|
|
# LUT for pb.srcSelect
|
|
0b31 05a8 // Jump4 0
|
|
0b32 065d // Jump4 1
|
|
0b33 0707 // Jump4 2
|
|
|
|
# LUT for pb.coefSelect tables (in drom)
|
|
0b34 1000
|
|
0b35 1200
|
|
0b36 1400
|
|
|
|
# End of noise - back to code.
|
|
|
|
void Cmd_8() {
|
|
0b37 8e00 set16
|
|
|
|
0b38 8100 clr $ACC0
|
|
0b39 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
0b3a 191c lrri $AC0.L, @$AR0
|
|
|
|
0b3b 2ece srs @DSMAH, $AC0.M
|
|
0b3c 2ccf srs @DSMAL, $AC0.L
|
|
0b3d 16cd 0e80 si @DSPA, #0x0e80
|
|
0b3f 16c9 0000 si @DSCR, #0x0000
|
|
0b41 16cb 0100 si @DSBL, #0x0100
|
|
|
|
0b43 1f7e mrr $AX1.H, $AC0.M
|
|
0b44 1f3c mrr $AX1.L, $AC0.L
|
|
|
|
0b45 8100 clr $ACC0
|
|
|
|
0b46 26c9 lrs $AC0.M, @DSCR
|
|
0b47 02a0 0004 andf $AC0.M, #0x0004
|
|
0b49 029c 0b46 jlnz 0x0b46
|
|
|
|
0b4b 191e lrri $AC0.M, @$AR0
|
|
0b4c 191c lrri $AC0.L, @$AR0
|
|
0b4d 2ece srs @DSMAH, $AC0.M
|
|
0b4e 2ccf srs @DSMAL, $AC0.L
|
|
0b4f 16cd 0280 si @DSPA, #0x0280
|
|
0b51 16c9 0000 si @DSCR, #0x0000
|
|
0b53 16cb 0280 si @DSBL, #0x0280
|
|
|
|
0b55 1c80 mrr $IX0, $AR0
|
|
|
|
0b56 0080 0280 lri $AR0, #0x0280
|
|
0b58 00c1 0e1b lr $AR1, @0x0e1b
|
|
0b5a 0085 0000 lri $IX1, #0x0000
|
|
0b5c 0089 007f lri $WR1, #0x007f
|
|
0b5e 0082 0f00 lri $AR2, #0x0f00
|
|
0b60 0083 16b4 lri $AR3, #0x16b4
|
|
0b62 1ce3 mrr $IX3, $AR3
|
|
0b63 8100 clr $ACC0
|
|
|
|
0b64 26c9 lrs $AC0.M, @DSCR
|
|
0b65 02a0 0004 andf $AC0.M, #0x0004
|
|
0b67 029c 0b64 jlnz 0x0b64
|
|
|
|
0b69 8f00 set40
|
|
0b6a 8a78 m2'l : $AC1.M, @$AR0
|
|
0b6b 8c68 clr15'l : $AC1.L, @$AR0
|
|
0b6c f100 lsl16 $ACC1
|
|
0b6d 1a3f srr @$AR1, $AC1.M
|
|
0b6e 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3
|
|
0b6f 107e loopi #0x7e
|
|
0b70 f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
|
|
0b71 f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
|
|
0b72 f278 madd'l $AX0.L, $AX0.H : $AC1.M, @$AR0
|
|
0b73 6e68 movp'l $ACC0 : $AC1.L, @$AR0
|
|
0b74 f132 lsl16's $ACC1 : @$AR2, $AC0.M
|
|
0b75 1a3f srr @$AR1, $AC1.M
|
|
0b76 119e 0b80 bloopi #0x9e, 0x0b80
|
|
0b78 1c67 mrr $AR3, $IX3
|
|
0b79 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3
|
|
0b7a 107e loopi #0x7e
|
|
0b7b f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
|
|
0b7c f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
|
|
0b7d f278 madd'l $AX0.L, $AX0.H : $AC1.M, @$AR0
|
|
0b7e 6e68 movp'l $ACC0 : $AC1.L, @$AR0
|
|
0b7f f132 lsl16's $ACC1 : @$AR2, $AC0.M
|
|
0b80 1a3f srr @$AR1, $AC1.M
|
|
|
|
0b81 1c67 mrr $AR3, $IX3
|
|
0b82 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3
|
|
0b83 107e loopi #0x7e
|
|
0b84 f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
|
|
0b85 f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
|
|
0b86 f200 madd $AX0.L, $AX0.H
|
|
0b87 6e00 movp $ACC0
|
|
0b88 1b5e srri @$AR2, $AC0.M
|
|
0b89 00e1 0e1b sr @0x0e1b, $AR1
|
|
|
|
0b8b 0080 0280 lri $AR0, #0x0280
|
|
0b8d 0083 0f00 lri $AR3, #0x0f00
|
|
0b8f 0081 0000 lri $AR1, #0x0000
|
|
0b91 0082 0140 lri $AR2, #0x0140
|
|
0b93 0089 ffff lri $WR1, #0xffff
|
|
|
|
0b95 8900 clr $ACC1
|
|
0b96 8100 clr $ACC0
|
|
|
|
0b97 8f00 set40
|
|
|
|
0b98 11a0 0ba0 bloopi #0xa0, 0x0ba0
|
|
0b9a 197f lrri $AC1.M, @$AR3
|
|
0b9b 9930 asr16's $ACC1 : @$AR0, $AC0.M
|
|
0b9c 1b1e srri @$AR0, $AC0.M
|
|
0b9d 1b3f srri @$AR1, $AC1.M
|
|
0b9e 7d29 neg's $ACC1 : @$AR1, $AC1.L
|
|
0b9f 1b5f srri @$AR2, $AC1.M
|
|
0ba0 1b5d srri @$AR2, $AC1.L
|
|
|
|
0ba1 8e00 set16
|
|
|
|
0ba2 1fdb mrr $AC0.M, $AX1.H
|
|
0ba3 1f99 mrr $AC0.L, $AX1.L
|
|
0ba4 2ece srs @DSMAH, $AC0.M
|
|
0ba5 2ccf srs @DSMAL, $AC0.L
|
|
0ba6 16cd 0e80 si @DSPA, #0x0e80
|
|
0ba8 16c9 0001 si @DSCR, #0x0001
|
|
0baa 16cb 0100 si @DSBL, #0x0100
|
|
|
|
// 0bac 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
0bae 1c04 mrr $AR0, $IX0
|
|
|
|
// 0baf 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
void Cmd_10() {
|
|
0bb1 8e00 set16
|
|
|
|
0bb2 8100 clr $ACC0
|
|
0bb3 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
0bb4 191c lrri $AC0.L, @$AR0
|
|
|
|
0bb5 2ece srs @DSMAH, $AC0.M
|
|
0bb6 2ccf srs @DSMAL, $AC0.L
|
|
0bb7 16cd 07c0 si @DSPA, #0x07c0
|
|
0bb9 16c9 0001 si @DSCR, #0x0001
|
|
0bbb 16cb 0500 si @DSBL, #0x0500
|
|
|
|
// 0bbd 02bf 055c call 0x055c
|
|
WaitDMA();
|
|
|
|
0bbf 8100 clr $ACC0
|
|
0bc0 8970 clr'l $ACC1 : $AC0.M, @$AR0
|
|
0bc1 191c lrri $AC0.L, @$AR0
|
|
|
|
0bc2 2ece srs @DSMAH, $AC0.M
|
|
0bc3 2ccf srs @DSMAL, $AC0.L
|
|
0bc4 16cd 07c0 si @DSPA, #0x07c0
|
|
0bc6 16c9 0000 si @DSCR, #0x0000
|
|
0bc8 8900 clr $ACC1
|
|
0bc9 0d20 lris $AC1.L, #0x20
|
|
0bca 2dcb srs @DSBL, $AC1.L
|
|
|
|
0bcb 4c00 add $ACC0, $ACC1
|
|
|
|
0bcc 1c80 mrr $IX0, $AR0
|
|
|
|
0bcd 0080 07c0 lri $AR0, #0x07c0
|
|
0bcf 0083 0000 lri $AR3, #0x0000
|
|
0bd1 1c43 mrr $AR2, $AR3
|
|
0bd2 0a00 lris $AX0.H, #0x00
|
|
|
|
0bd3 27c9 lrs $AC1.M, @DSCR
|
|
0bd4 03a0 0004 andf $AC1.M, #0x0004
|
|
0bd6 029c 0bd3 jlnz 0x0bd3
|
|
|
|
0bd8 2ece srs @DSMAH, $AC0.M
|
|
0bd9 2ccf srs @DSMAL, $AC0.L
|
|
0bda 16cd 07d0 si @DSPA, #0x07d0
|
|
0bdc 16c9 0000 si @DSCR, #0x0000
|
|
0bde 16cb 04e0 si @DSBL, #0x04e0
|
|
|
|
0be0 8f00 set40
|
|
|
|
0be1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
0be2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
0be3 6a00 movax $ACC0, $AX1
|
|
0be4 4800 addax $ACC0, $AX0
|
|
0be5 114f 0bee bloopi #0x4f, 0x0bee
|
|
0be7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
0be8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
0be9 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
|
|
0bea 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
|
|
0beb 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
0bec 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
0bed 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M
|
|
0bee 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L
|
|
|
|
0bef 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
0bf0 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
0bf1 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
|
|
0bf2 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
|
|
0bf3 1b5f srri @$AR2, $AC1.M
|
|
0bf4 1b5d srri @$AR2, $AC1.L
|
|
0bf5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
0bf6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
0bf7 6800 movax $ACC0, $AX0
|
|
0bf8 7c00 neg $ACC0
|
|
0bf9 4a00 addax $ACC0, $AX1
|
|
0bfa 114f 0c05 bloopi #0x4f, 0x0c05
|
|
0bfc 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
0bfd 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
0bfe 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M
|
|
0bff 7d00 neg $ACC1
|
|
0c00 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L
|
|
0c01 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
0c02 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
0c03 683a movax's $ACC0, $AX0.L : @$AR2, $AC1.M
|
|
0c04 7c00 neg $ACC0
|
|
0c05 4a2a addax's $ACC0, $AX1.L : @$AR2, $AC1.L
|
|
|
|
0c06 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
|
|
0c07 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
|
|
0c08 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M
|
|
0c09 7d00 neg $ACC1
|
|
0c0a 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L
|
|
0c0b 1b5f srri @$AR2, $AC1.M
|
|
0c0c 1b5d srri @$AR2, $AC1.L
|
|
|
|
0c0d 1c04 mrr $AR0, $IX0
|
|
|
|
// 0c0e 029f 0068 jmp 0x0068
|
|
goto DoNextCommand;
|
|
}
|
|
|
|
# Begin interrupt handlers
|
|
|
|
// Sends mail with value on top of callstack and rti's
|
|
void ResetAndStackUOFlow_Handler() {
|
|
0c10 8e00 set16
|
|
|
|
// 0c11 16fc ecc0 si @DMBH, #0xecc0
|
|
// 0c13 1fcc mrr $AC0.M, $ST0
|
|
// 0c14 1d9e mrr $ST0, $AC0.M
|
|
// 0c15 2efd srs @DMBL, $AC0.M
|
|
DMB = 0xecc00000 | $ST0
|
|
|
|
// 0c16 26fc lrs $AC0.M, @DMBH
|
|
// 0c17 02a0 8000 andf $AC0.M, #0x8000
|
|
// 0c19 029c 0c16 jlnz 0x0c16
|
|
while (@DMBH & 0x8000 == 0);
|
|
|
|
// 0c1b 0000 nop
|
|
// 0c1c 0000 nop
|
|
// 0c1d 0000 nop
|
|
// 0c1e 02ff rti
|
|
return;
|
|
}
|
|
|
|
// Saves/Restores whole ACC0, but only modifies AC0.M. strange
|
|
void Int2_Handler() {
|
|
0c1f 8e00 set16
|
|
|
|
// Save ACC0
|
|
0c20 00f0 0e17 sr @0x0e17, $AC0.H
|
|
0c22 00fe 0e18 sr @0x0e18, $AC0.M
|
|
0c24 00fc 0e19 sr @0x0e19, $AC0.L
|
|
|
|
// 0c26 1fcc mrr $AC0.M, $ST0
|
|
// 0c27 1d9e mrr $ST0, $AC0.M
|
|
// 0c28 16fc feed si @DMBH, #0xfeed
|
|
// 0c2a 2efd srs @DMBL, $AC0.M
|
|
DMB = 0xfeed0000 | $ST0
|
|
|
|
// 0c2b 26fc lrs $AC0.M, @DMBH
|
|
// 0c2c 02a0 8000 andf $AC0.M, #0x8000
|
|
// 0c2e 029c 0c2b jlnz 0x0c2b
|
|
while (@DMBH & 0x8000 == 0);
|
|
|
|
// Restore ACC0
|
|
0c30 00d0 0e17 lr $AC0.H, @0x0e17
|
|
0c32 00de 0e18 lr $AC0.M, @0x0e18
|
|
0c34 00dc 0e19 lr $AC0.L, @0x0e19
|
|
|
|
// 0c36 0000 nop
|
|
// 0c37 0000 nop
|
|
// 0c38 0000 nop
|
|
// 0c39 0000 nop
|
|
// 0c3a 02ff rti
|
|
return;
|
|
}
|
|
|
|
void Int3_Handler() {
|
|
0c3b 8e00 set16
|
|
|
|
// Save AC0.L, AC0.M
|
|
0c3c 1dbc mrr $ST1, $AC0.L
|
|
0c3d 1dbe mrr $ST1, $AC0.M
|
|
|
|
// 0c3e 8100 clr $ACC0
|
|
// 0c3f 00de 0bb7 lr $AC0.M, @0x0bb7
|
|
// 0c41 0601 cmpis $AC0.M, #0x01
|
|
// 0c42 0295 0c47 jz 0x0c47
|
|
// 0c44 0e00 lris $AC0.M, #0x00
|
|
// 0c45 00fe 0b87 sr @0x0b87, $AC0.M
|
|
if (*0x0bb7 != 1) { // pb.addr != AXPBADDR_LOOP_ON
|
|
*0x0b87 = 0; // pb.state = AX_PB_STATE_STOP
|
|
}
|
|
|
|
// Restore AC0.L, AC0.M
|
|
0c47 1fcd mrr $AC0.M, $ST1
|
|
0c48 1f8d mrr $AC0.L, $ST1
|
|
|
|
// 0c49 02ff rti
|
|
return;
|
|
}
|
|
|
|
void Int4_Handler() {
|
|
// 0c4a 0000 nop
|
|
// 0c4b 0000 nop
|
|
// 0c4c 0000 nop
|
|
// 0c4d 0000 nop
|
|
// 0c4e 0000 nop
|
|
// 0c4f 02ff rti
|
|
return;
|
|
}
|
|
|
|
void Int5_Handler() {
|
|
0c50 8e00 set16
|
|
|
|
// Save AC0.L, AC0.M
|
|
0c51 1dbc mrr $ST1, $AC0.L
|
|
0c52 1dbe mrr $ST1, $AC0.M
|
|
|
|
// 0c53 8100 clr $ACC0
|
|
// 0c54 00de 0bb7 lr $AC0.M, @0x0bb7
|
|
// 0c56 0601 cmpis $AC0.M, #0x01
|
|
// 0c57 0295 0c5f jz 0x0c5f
|
|
if (*0x0bb7 != 1) // pb.addr != AXPBADDR_LOOP_ON
|
|
{
|
|
// 0c59 0e00 lris $AC0.M, #0x00
|
|
// 0c5a 00fe 0b87 sr @0x0b87, $AC0.M
|
|
*0x0b87 = 0; // pb.state = AX_PB_STATE_STOP
|
|
|
|
// Restore AC0.L, AC0.M
|
|
0c5c 1fcd mrr $AC0.M, $ST1
|
|
0c5d 1f8d mrr $AC0.L, $ST1
|
|
|
|
// 0c5e 02ff rti
|
|
return;
|
|
}
|
|
|
|
// 0c5f 8100 clr $ACC0
|
|
// 0c60 00de 0b88 lr $AC0.M, @0x0b88
|
|
// 0c62 0601 cmpis $AC0.M, #0x01
|
|
// 0c63 0295 0c71 jz 0x0c71
|
|
if (*0x0b88 != 1) { // pb.type != AX_PB_TYPE_STREAM
|
|
|
|
// 0c65 00de 0bda lr $AC0.M, @0x0bda
|
|
// 0c67 2eda srs @scale, $AC0.M
|
|
// 0c68 00de 0bdb lr $AC0.M, @0x0bdb
|
|
// 0c6a 2edb srs @yn1, $AC0.M
|
|
// 0c6b 00de 0bdc lr $AC0.M, @0x0bdc
|
|
// 0c6d 2edc srs @yn2, $AC0.M
|
|
@scale = pb.adpcmLoop.loop_pred_scale
|
|
@yn1 = pb.adpcmLoop.loop_yn1
|
|
@yn2 = pb.adpcmLoop.loop_yn2
|
|
|
|
// Restore AC0.L, AC0.M
|
|
0c6e 1fcd mrr $AC0.M, $ST1
|
|
0c6f 1f8d mrr $AC0.L, $ST1
|
|
|
|
// 0c70 02ff rti
|
|
return;
|
|
|
|
} else {
|
|
|
|
// 0c71 00de 0bda lr $AC0.M, @0x0bda
|
|
// 0c73 2eda srs @scale, $AC0.M
|
|
// 0c74 26db lrs $AC0.M, @yn1
|
|
// 0c75 2edb srs @yn1, $AC0.M
|
|
// 0c76 26dc lrs $AC0.M, @yn2
|
|
// 0c77 2edc srs @yn2, $AC0.M
|
|
@scale = pb.adpcmLoop.loop_pred_scale
|
|
// refresh @yn1, @yn2....why?
|
|
@yn1 = @yn1
|
|
@yn2 = @yn2
|
|
|
|
// Well helllloooo there, padding
|
|
// 0c78 8100 clr $ACC0
|
|
// 0c79 00dc 0bdd lr $AC0.L, @0x0bdd
|
|
// 0c7b 7600 inc $ACC0
|
|
// 0c7c 00fc 0bdd sr @0x0bdd, $AC0.L
|
|
// 0c7e 8100 clr $ACC0
|
|
pb.pad[0]++
|
|
|
|
// Restore AC0.L, AC0.M
|
|
0c7f 1fcd mrr $AC0.M, $ST1
|
|
0c80 1f8d mrr $AC0.L, $ST1
|
|
|
|
// 0c81 02ff rti
|
|
return;
|
|
}
|
|
}
|
|
|
|
void Int6_Handler() {
|
|
0c82 0000 nop
|
|
0c83 0000 nop
|
|
0c84 0000 nop
|
|
0c85 0000 nop
|
|
0c86 0000 nop
|
|
0c87 02ff rti
|
|
}
|
|
|
|
void Int7_Handler() {
|
|
0c88 0000 nop
|
|
0c89 0000 nop
|
|
0c8a 0000 nop
|
|
0c8b 0000 nop
|
|
0c8c 02ff rti
|
|
}
|
|
|
|
# End of interrupt handlers
|
|
|
|
// Jump table for the next function.
|
|
0c8d 0c9f // some kind of soft-reset for the UCode
|
|
0c8e 0ca2 // looks like code to dump the UCode memory for debugging
|
|
0c8f 0cda // rest the UCode and jump to ROM
|
|
0c90 0cdd // normal case to return to the main-loop
|
|
|
|
// Called only from Task_Yield()
|
|
// Decides what to do next (this cmdblock is done)
|
|
void JumpThroughTable2() {
|
|
0c91 8e00 set16
|
|
0c92 8100 clr $ACC0
|
|
0c93 8900 clr $ACC1
|
|
|
|
// 0c94 02bf 0ce0 call 0x0ce0
|
|
WaitForCPUMail0();
|
|
|
|
// 0c96 27ff lrs $AC1.M, @CMBL
|
|
// 0c97 009e 0c8d lri $AC0.M, #0x0c8d
|
|
// 0c99 4c00 add $ACC0, $ACC1
|
|
// 0c9a 1c7e mrr $AR3, $AC0.M
|
|
// 0c9b 0313 ilrr $AC1.M, @$AR3
|
|
// 0c9c 1c7f mrr $AR3, $AC1.M
|
|
// 0c9d 176f jmpr $AR3
|
|
switch(@CMBL) {
|
|
case 0: AX_ResumeTask(); break;
|
|
case 1: JumpTable2_1(); break;
|
|
case 2: IROM_Reset(); break;
|
|
case 3: AX_GetNextCmdBlock(); break;
|
|
}
|
|
0c9e 0021 halt
|
|
}
|
|
|
|
// case 0:
|
|
void AX_ResumeTask() {
|
|
0c9f 029f 0030 jmp 0x0030
|
|
0ca1 0021 halt
|
|
}
|
|
|
|
// case 1:
|
|
// funky...calls the mbox funcs, sometimes prefilling ACx regs...
|
|
// Perhaps DMAs some stuff and yields?
|
|
// Need to RE the ROM to figure this func out completely
|
|
void JumpTable2_1() {
|
|
// 0ca2 8100 clr $ACC0
|
|
// 0ca3 8900 clr $ACC1
|
|
// 0ca4 02bf 0ce0 call 0x0ce0
|
|
WaitForCPUMail0();
|
|
|
|
// 0ca6 24ff lrs $AC0.L, @CMBL
|
|
// 0ca7 02bf 0ce6 call 0x0ce6
|
|
WaitForCPUMail1();
|
|
|
|
// 0ca9 25ff lrs $AC1.L, @CMBL
|
|
// 0caa 02bf 0ce6 call 0x0ce6
|
|
WaitForCPUMail1();
|
|
|
|
0cac 27ff lrs $AC1.M, @CMBL
|
|
0cad 2ece srs @DSMAH, $AC0.M
|
|
0cae 2ccf srs @DSMAL, $AC0.L
|
|
0caf 16c9 0001 si @DSCR, #0x0001
|
|
0cb1 2fcd srs @DSPA, $AC1.M
|
|
0cb2 2dcb srs @DSBL, $AC1.L
|
|
|
|
// 0cb3 8100 clr $ACC0
|
|
// 0cb4 8900 clr $ACC1
|
|
// 0cb5 02bf 0ce0 call 0x0ce0
|
|
WaitForCPUMail0();
|
|
|
|
0cb7 24ff lrs $AC0.L, @CMBL
|
|
0cb8 1c9e mrr $IX0, $AC0.M
|
|
0cb9 1cbc mrr $IX1, $AC0.L
|
|
0cba 02bf 0ce6 call 0x0ce6
|
|
WaitForCPUMail1();
|
|
|
|
0cbc 25ff lrs $AC1.L, @CMBL
|
|
0cbd 02bf 0ce6 call 0x0ce6
|
|
WaitForCPUMail1();
|
|
|
|
0cbf 27ff lrs $AC1.M, @CMBL
|
|
0cc0 1cdf mrr $IX2, $AC1.M
|
|
0cc1 1cfd mrr $IX3, $AC1.L
|
|
|
|
// 0cc2 8100 clr $ACC0
|
|
// 0cc3 02bf 0ce0 call 0x0ce0
|
|
WaitForCPUMail0();
|
|
|
|
0cc5 26ff lrs $AC0.M, @CMBL
|
|
0cc6 1c1e mrr $AR0, $AC0.M
|
|
0cc7 8900 clr $ACC1
|
|
0cc8 02bf 0ce6 call 0x0ce6
|
|
WaitForCPUMail1();
|
|
|
|
0cca 20ff lrs $AX0.L, @CMBL
|
|
0ccb 1f5f mrr $AX0.H, $AC1.M
|
|
0ccc 02bf 0ce0 call 0x0ce0
|
|
WaitForCPUMail0();
|
|
|
|
0cce 21ff lrs $AX1.L, @CMBL
|
|
0ccf 02bf 0ce0 call 0x0ce0
|
|
WaitForCPUMail0();
|
|
|
|
0cd1 23ff lrs $AX1.H, @CMBL
|
|
|
|
// 0cd2 26c9 lrs $AC0.M, @DSCR
|
|
// 0cd3 02a0 0004 andf $AC0.M, #0x0004
|
|
// 0cd5 029c 0cd2 jlnz 0x0cd2
|
|
while (@DSCR & 0x0004 != 0); // Wait for DMA to complete
|
|
|
|
// 0cd7 029f 80b5 jmp 0x80b5
|
|
// 0cd9 0021 halt
|
|
IROM_ErrorAndDie(); // Not sure...gotta RE the ROM
|
|
}
|
|
|
|
// case 2:
|
|
void IROM_Reset() {
|
|
0cda 029f 8000 jmp 0x8000
|
|
0cdc 0021 halt
|
|
}
|
|
|
|
// case 3:
|
|
void AX_GetNextCmdBlock() {
|
|
// 0cdd 029f 0045 jmp 0x0045
|
|
goto GetNextCmdBlock;
|
|
|
|
0cdf 0021 halt
|
|
}
|
|
|
|
void WaitForCPUMail0() {
|
|
// 0ce0 26fe lrs $AC0.M, @CMBH
|
|
// 0ce1 02c0 8000 andcf $AC0.M, #0x8000
|
|
// 0ce3 029c 0ce0 jlnz 0x0ce0
|
|
while (@CMBH & 0x8000 == 0);
|
|
// 0ce5 02df ret
|
|
return;
|
|
}
|
|
|
|
void WaitForCPUMail1() {
|
|
// 0ce6 27fe lrs $AC1.M, @CMBH
|
|
// 0ce7 03c0 8000 andcf $AC1.M, #0x8000
|
|
// 0ce9 029c 0ce6 jlnz 0x0ce6
|
|
while (@CMBH & 0x8000 == 0);
|
|
// 0ceb 02df ret
|
|
return;
|
|
}
|
|
|
|
0cec 0000 nop
|
|
0ced 0000 nop
|
|
0cee 0000 nop
|
|
0cef 0000 nop
|