1 // This document was previously called "DSP_UC_AX1.txt" and "Crazy Taxi.txt"
2 // CR is set to #FF all the time in this ucode, so srs/lrs always operate on hw registers.
4 //////////////////////////////////////////////////////////////////////////
5 // Known addresses in DRAM
6 Addr Name Description/Notes
19 0x03c0 update_block Contains <offset, value> pairs to update current PB with
21 0x0b80 pb Current pb, length = 0xc0
23 0x0e04 ms_remaining Milliseconds remaining to process for current voice
24 0x0e05 pUpdate_block Pointer to update_block
25 0x0e06 pUpdates_this_ms Pointer to number of updates
27 // Pointers to buffers
28 0x0e08 0x0000 See buffers at 0x0000
39 0x0e14 selectedMixCtrl
41 0x0e16 selectedCoef Points into DROM
48 //////////////////////////////////////////////////////////////////////////
50 // Good ol' exception table
52 0001 0000 nop // 0 Reset falls through, kinda wierd...
53 0002 029f 0c10 jmp 0x0c10 // 1 Stack U/O flow
54 0004 029f 0c1f jmp 0x0c1f // 2
55 0006 029f 0c3b jmp 0x0c3b // 3
56 0008 029f 0c4a jmp 0x0c4a // 4 ? empty
57 000a 029f 0c50 jmp 0x0c50 // 5 accelerator address overflow
58 000c 029f 0c82 jmp 0x0c82 // 6 ? empty
59 000e 029f 0c88 jmp 0x0c88 // 7 ? empty
63 // AX operates in this context all the time
64 // 0010 1302 sbset #0x02
65 // 0011 1303 sbset #0x03
66 // 0012 1204 sbclr #0x04
67 // 0013 1305 sbset #0x05
68 // 0014 1306 sbset #0x06
72 // 0018 0092 00ff lri $CR, #0x00ff
74 // 001a 8100 clr $ACC0
75 // 001b 8900 clr $ACC1
76 // 001c 009e 0e80 lri $AC0.M, #0x0e80
77 // 001e 00fe 0e1b sr @0x0e1b, $AC0.M
78 // 0020 8100 clr $ACC0
79 // 0021 00fe 0e31 sr @0x0e31, $AC0.M
81 *0x0e1b = 0xe80 // Used in Cmd8
85 // 0023 16fc dcd1 si @DMBH, #0xdcd1
86 // 0025 16fd 0000 si @DMBL, #0x0000
87 // 0027 16fb 0001 si @DIRQ, #0x0001
89 // 0029 26fc lrs $AC0.M, @DMBH
90 // 002a 02a0 8000 andf $AC0.M, #0x8000
91 // 002c 029c 0029 jlnz 0x0029
92 while (@DMBH & 0x8000 == 0);
94 // 002e 029f 0045 jmp 0x0045
99 // Ensure sane context
100 // 0030 1302 sbset #0x02
101 // 0031 1303 sbset #0x03
102 // 0032 1204 sbclr #0x04
103 // 0033 1305 sbset #0x05
104 // 0034 1306 sbset #0x06
108 // 0038 0092 00ff lri $CR, #0x00ff
110 // Send DSP_RESUME mail
111 // 003a 16fc dcd1 si @DMBH, #0xdcd1
112 // 003c 16fd 0001 si @DMBL, #0x0001
113 // 003e 16fb 0001 si @DIRQ, #0x0001
115 // 0040 26fc lrs $AC0.M, @DMBH
116 // 0041 02a0 8000 andf $AC0.M, #0x8000
117 // 0043 029c 0040 jlnz 0x0040
118 while (@DMBH & 0x8000 == 0);
124 0048 009f babe lri $AC1.M, #0xbabe
126 // Wait for 0xbabexxxx mail from cpu
128 // 004a 26fe lrs $AC0.M, @CMBH
129 // 004b 02c0 8000 andcf $AC0.M, #0x8000
130 // 004d 029c 004a jlnz 0x004a
131 while (@CMBH & 0x8000 == 0);
134 // 0050 0294 004a jnz 0x004a
135 } while (@CMBH != 0xbabe);
137 // Save the low 16bits of the mail
138 // 0052 23ff lrs $AX1.H, @CMBL
142 // 0053 8100 clr $ACC0
143 // 0054 26fe lrs $AC0.M, @CMBH
144 // 0055 02c0 8000 andcf $AC0.M, #0x8000
145 // 0057 029c 0054 jlnz 0x0054
146 while (@CMBH & 0x8000 == 0);
148 // 0059 27ff lrs $AC1.M, @CMBL
149 // 005a 0240 7fff andi $AC0.M, #0x7fff
150 // 005c 2ece srs @DSMAH, $AC0.M
151 // 005d 2fcf srs @DSMAL, $AC1.M
152 // 005e 16cd 0c00 si @DSPA, #0x0c00
153 // 0060 8100 clr $ACC0
154 // 0061 2ec9 srs @DSCR, $AC0.M
155 // 0062 1ffb mrr $AC1.M, $AX1.H
156 // 0063 2fcb srs @DSBL, $AC1.M
157 // DMA in the CmdBlock
158 static u16* CmdBlockBuf = 0x0c00
159 DSMA = (@CMBH & ~0x8000) << 16 | @CMBL
161 DSCR = 0 // CPU -> DMEM
164 // 0064 02bf 055c call 0x055c
167 // Init the CmdBlock pointer
168 0066 0080 0c00 lri $AR0, #0x0c00
172 // 0069 8100 clr $ACC0
173 // 006a 8970 clr'l $ACC1 : $AC0.M, @$AR0
174 // 006b b100 tst $ACC0
175 // 006c 0291 007e jl 0x007e
176 u16 Cmd = *(CmdBlockBuf++)
177 if (Cmd < 0) // How could this be possible? 'l is 16bit load...
180 // 006e 0a12 lris $AX0.H, #0x12
181 // 006f c100 cmpar $ACC0, $AX0.H
182 // 0070 0292 007e jg 0x007e
186 // 0072 009f 0aff lri $AC1.M, #0x0aff
187 // 0074 4c00 add $ACC0, $ACC1
188 // 0075 1c7e mrr $AR3, $AC0.M
189 // 0076 0213 ilrr $AC0.M, @$AR3
190 // 0077 1c7e mrr $AR3, $AC0.M
191 // 0078 176f jmpr $AR3
193 case 0: Cmd_0(); break; // 0082
194 case 1: Cmd_1(); break; // 013e
195 case 2: Cmd_2(); break; // 01bc
196 case 3: Cmd_3(); break; // 0248
197 case 4: Cmd_4(); break; // 0413
198 case 5: Cmd_5(); break; // 0427
199 case 6: Cmd_6(); break; // 0165
200 case 7: Cmd_7(); break; // 0574
201 case 8: Cmd_8(); break; // 0b37
202 case 9: Cmd_9(); break; // 015f
203 case 0xa: Cmd_a(); break; // 0478
204 case 0xb: Cmd_b(); break; // 0474
205 case 0xc: Cmd_c(); break; // 0476
206 case 0xd: Cmd_d(); break; // 01a9
207 case 0xe: Cmd_e(); break; // 043b
208 case 0xf: Cmd_f(); break; // 047a
209 case 0x10: Cmd_10(); break; // 0bb1
210 case 0x11: Cmd_11(); break; // 0175
213 // Somehow we've passed the cmd proccessor; DIE!!
214 // 0079 16fc fbad si @DMBH, #0xfbad
215 // 007b 16fd 8080 si @DMBL, #0x8080
220 // Die and conveniently tell the cpu which cmd was baad
221 void Die_InvalidCmd() {
222 007e 16fc baad si @DMBH, #0xbaad
223 0080 2efd srs @DMBL, $AC0.M
227 // Executes the same operation 3 times on buffers: (0, 0x0400, 0x07c0)
229 // 0082 8100 clr $ACC0
230 // 0083 8970 clr'l $ACC1 : $AC0.M, @$AR0
231 // 0084 8e78 set16'l : $AC1.M, @$AR0
232 u16 maddrh = *(CmdBlockBuf++)
233 u16 maddrl = *(CmdBlockBuf++)
235 // 0085 2ece srs @DSMAH, $AC0.M
236 // 0086 2fcf srs @DSMAL, $AC1.M
237 // 0087 009e 0e44 lri $AC0.M, #0x0e44
238 // 0089 2ecd srs @DSPA, $AC0.M
239 // 008a 0e00 lris $AC0.M, #0x00
240 // 008b 2ec9 srs @DSCR, $AC0.M
241 // 008c 009e 0040 lri $AC0.M, #0x0040
242 // 008e 2ecb srs @DSBL, $AC0.M
244 // DMA 0x0040bytes to DRAM @ 0x0e44 from CPU @ maddr
246 008f 0081 0e44 lri $AR1, #0x0e44 // source
247 0091 0082 0000 lri $AR2, #0x0000 // destination
249 0093 009b 009f lri $AX1.H, #0x009f
250 0095 009a 0140 lri $AX0.H, #0x0140 // loop length if !ACC0
257 // 009a 02bf 055c call 0x055c
260 009c 193e lrri $AC0.M, @$AR1
261 009d 193c lrri $AC0.L, @$AR1
263 009f 193f lrri $AC1.M, @$AR1 // added to ACC0 in confusing ways
264 // 00a0 0294 00a6 jnz 0x00a6
266 00a2 005a loop $AX0.H
267 00a3 1b5e srri @$AR2, $AC0.M
269 // 00a4 029f 00ae jmp 0x00ae
271 00a6 9900 asr16 $ACC1
272 00a7 1b5e srri @$AR2, $AC0.M
273 00a8 1b5c srri @$AR2, $AC0.L
274 00a9 007b 00ad bloop $AX1.H, 0x00ad
275 00ab 4c00 add $ACC0, $ACC1
276 00ac 1b5e srri @$AR2, $AC0.M
277 00ad 1b5c srri @$AR2, $AC0.L
281 // same code block as above...epic fail?
282 00ae 193e lrri $AC0.M, @$AR1
283 00af 193c lrri $AC0.L, @$AR1
285 00b1 193f lrri $AC1.M, @$AR1
286 // 00b2 0294 00b8 jnz 0x00b8
288 00b4 005a loop $AX0.H
289 00b5 1b5e srri @$AR2, $AC0.M
291 // 00b6 029f 00c0 jmp 0x00c0
293 00b8 9900 asr16 $ACC1
294 00b9 1b5e srri @$AR2, $AC0.M
295 00ba 1b5c srri @$AR2, $AC0.L
296 00bb 007b 00bf bloop $AX1.H, 0x00bf
297 00bd 4c00 add $ACC0, $ACC1
298 00be 1b5e srri @$AR2, $AC0.M
299 00bf 1b5c srri @$AR2, $AC0.L
304 00c0 193e lrri $AC0.M, @$AR1
305 00c1 193c lrri $AC0.L, @$AR1
307 00c3 193f lrri $AC1.M, @$AR1
308 // 00c4 0294 00ca jnz 0x00ca
310 00c6 005a loop $AX0.H
311 00c7 1b5e srri @$AR2, $AC0.M
313 // 00c8 029f 00d2 jmp 0x00d2
315 00ca 9900 asr16 $ACC1
316 00cb 1b5e srri @$AR2, $AC0.M
317 00cc 1b5c srri @$AR2, $AC0.L
318 00cd 007b 00d1 bloop $AX1.H, 0x00d1
319 00cf 4c00 add $ACC0, $ACC1
320 00d0 1b5e srri @$AR2, $AC0.M
321 00d1 1b5c srri @$AR2, $AC0.L
325 // set to next buffer
326 00d2 0082 0400 lri $AR2, #0x0400
328 // same code block, uses tst'l in one place...otherwise the same
329 00d4 193e lrri $AC0.M, @$AR1
330 00d5 193c lrri $AC0.L, @$AR1
331 00d6 b179 tst'l $ACC0 : $AC1.M, @$AR1
332 // 00d7 0294 00dd jnz 0x00dd
334 00d9 005a loop $AX0.H
335 00da 1b5e srri @$AR2, $AC0.M
336 // 00db 029f 00e5 jmp 0x00e5
338 00dd 9900 asr16 $ACC1
339 00de 1b5e srri @$AR2, $AC0.M
340 00df 1b5c srri @$AR2, $AC0.L
341 00e0 007b 00e4 bloop $AX1.H, 0x00e4
342 00e2 4c00 add $ACC0, $ACC1
343 00e3 1b5e srri @$AR2, $AC0.M
344 00e4 1b5c srri @$AR2, $AC0.L
347 // same code block, using tst'l again...wonder if it actually changes behavior?
348 00e5 193e lrri $AC0.M, @$AR1
349 00e6 193c lrri $AC0.L, @$AR1
350 00e7 b179 tst'l $ACC0 : $AC1.M, @$AR1
351 // 00e8 0294 00ee jnz 0x00ee
353 00ea 005a loop $AX0.H
354 00eb 1b5e srri @$AR2, $AC0.M
355 // 00ec 029f 00f6 jmp 0x00f6
357 00ee 9900 asr16 $ACC1
358 00ef 1b5e srri @$AR2, $AC0.M
359 00f0 1b5c srri @$AR2, $AC0.L
360 00f1 007b 00f5 bloop $AX1.H, 0x00f5
361 00f3 4c00 add $ACC0, $ACC1
362 00f4 1b5e srri @$AR2, $AC0.M
363 00f5 1b5c srri @$AR2, $AC0.L
366 // see comments above
367 00f6 193e lrri $AC0.M, @$AR1
368 00f7 193c lrri $AC0.L, @$AR1
369 00f8 b179 tst'l $ACC0 : $AC1.M, @$AR1
370 // 00f9 0294 00ff jnz 0x00ff
372 00fb 005a loop $AX0.H
373 00fc 1b5e srri @$AR2, $AC0.M
374 // 00fd 029f 0107 jmp 0x0107
376 00ff 9900 asr16 $ACC1
377 0100 1b5e srri @$AR2, $AC0.M
378 0101 1b5c srri @$AR2, $AC0.L
379 0102 007b 0106 bloop $AX1.H, 0x0106
380 0104 4c00 add $ACC0, $ACC1
381 0105 1b5e srri @$AR2, $AC0.M
382 0106 1b5c srri @$AR2, $AC0.L
385 // set to next buffer
386 0107 0082 07c0 lri $AR2, #0x07c0
388 // see comments above
389 0109 193e lrri $AC0.M, @$AR1
390 010a 193c lrri $AC0.L, @$AR1
391 010b b179 tst'l $ACC0 : $AC1.M, @$AR1
392 // 010c 0294 0112 jnz 0x0112
394 010e 005a loop $AX0.H
395 010f 1b5e srri @$AR2, $AC0.M
396 // 0110 029f 011a jmp 0x011a
398 0112 9900 asr16 $ACC1
399 0113 1b5e srri @$AR2, $AC0.M
400 0114 1b5c srri @$AR2, $AC0.L
401 0115 007b 0119 bloop $AX1.H, 0x0119
402 0117 4c00 add $ACC0, $ACC1
403 0118 1b5e srri @$AR2, $AC0.M
404 0119 1b5c srri @$AR2, $AC0.L
407 // see comments above
408 011a 193e lrri $AC0.M, @$AR1
409 011b 193c lrri $AC0.L, @$AR1
410 011c b179 tst'l $ACC0 : $AC1.M, @$AR1
411 // 011d 0294 0123 jnz 0x0123
413 011f 005a loop $AX0.H
414 0120 1b5e srri @$AR2, $AC0.M
415 // 0121 029f 012b jmp 0x012b
417 0123 9900 asr16 $ACC1
418 0124 1b5e srri @$AR2, $AC0.M
419 0125 1b5c srri @$AR2, $AC0.L
420 0126 007b 012a bloop $AX1.H, 0x012a
421 0128 4c00 add $ACC0, $ACC1
422 0129 1b5e srri @$AR2, $AC0.M
423 012a 1b5c srri @$AR2, $AC0.L
426 // see comments above
427 012b 193e lrri $AC0.M, @$AR1
428 012c 193c lrri $AC0.L, @$AR1
429 012d b179 tst'l $ACC0 : $AC1.M, @$AR1
430 // 012e 0294 0134 jnz 0x0134
432 0130 005a loop $AX0.H
433 0131 1b5e srri @$AR2, $AC0.M
434 // 0132 029f 013c jmp 0x013c
436 0134 9900 asr16 $ACC1
437 0135 1b5e srri @$AR2, $AC0.M
438 0136 1b5c srri @$AR2, $AC0.L
439 0137 007b 013b bloop $AX1.H, 0x013b
440 0139 4c00 add $ACC0, $ACC1
441 013a 1b5e srri @$AR2, $AC0.M
442 013b 1b5c srri @$AR2, $AC0.L
445 // 013c 029f 0068 jmp 0x0068
450 013e 0085 ffff lri $IX1, #0xffff // -1
452 // 0140 8150 clr'l $ACC0 : $AX0.H, @$AR0
453 // 0141 8940 clr'l $ACC1 : $AX0.L, @$AR0
454 // 0142 8e48 set16'l : $AX1.L, @$AR0
455 // 0143 00fa 0e17 sr @0x0e17, $AX0.H
456 // 0145 00f8 0e18 sr @0x0e18, $AX0.L
457 // 0147 0081 0000 lri $AR1, #0x0000
458 // 0149 02bf 04f1 call 0x04f1
459 u16 maddrh = *(CmdBlockBuf++)
460 u16 maddrl = *(CmdBlockBuf++)
461 u16 unkForMulBuffer1 = *(CmdBlockBuf++)
462 u16 unkForMulBuffer2 = 0 // a buffer in dram
463 Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2)
465 // 014b 00da 0e17 lr $AX0.H, @0x0e17
466 // 014d 00d8 0e18 lr $AX0.L, @0x0e18
467 // 014f 8948 clr'l $ACC1 : $AX1.L, @$AR0
468 // 0150 0081 0400 lri $AR1, #0x0400
469 // 0152 02bf 04f1 call 0x04f1
470 unkForMulBuffer1 = *(CmdBlockBuf++)
471 unkForMulBuffer2 = 0x0400
472 Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2)
474 // 0154 00da 0e17 lr $AX0.H, @0x0e17
475 // 0156 00d8 0e18 lr $AX0.L, @0x0e18
476 // 0158 8948 clr'l $ACC1 : $AX1.L, @$AR0
477 // 0159 0081 07c0 lri $AR1, #0x07c0
478 // 015b 02bf 04f1 call 0x04f1
479 unkForMulBuffer1 = *(CmdBlockBuf++)
480 unkForMulBuffer2 = 0x07c0
481 Unk(maddrh << 16 | maddrl, unkForMulBuffer1, unkForMulBuffer2)
483 // 015d 029f 0068 jmp 0x0068
488 015f 0086 07c0 lri $IX2, #0x07c0 // often used buffer in dram
490 0161 02bf 0484 call 0x0484
492 // 0163 029f 0068 jmp 0x0068
500 // 0167 191e lrri $AC0.M, @$AR0
501 // 0168 191c lrri $AC0.L, @$AR0
502 u16 maddrh = *(CmdBlockBuf++)
503 u16 maddrl = *(CmdBlockBuf++)
505 // 0169 2ece srs @DSMAH, $AC0.M
506 // 016a 2ccf srs @DSMAL, $AC0.L
507 // 016b 16cd 0000 si @DSPA, #0x0000
508 // 016d 16c9 0001 si @DSCR, #0x0001
509 // 016f 16cb 0780 si @DSBL, #0x0780
511 // DMA 0x780bytes to CPU @ maddr from DMEM @ 0
513 // 0171 02bf 055c call 0x055c
516 // 0173 029f 0068 jmp 0x0068
521 // 0175 8100 clr $ACC0
522 // 0176 8970 clr'l $ACC1 : $AC0.M, @$AR0
523 // 0177 8e60 set16'l : $AC0.L, @$AR0
524 u16 maddrh = *(CmdBlockBuf++)
525 u16 maddrl = *(CmdBlockBuf++)
527 // 0178 2ece srs @DSMAH, $AC0.M
528 // 0179 2ccf srs @DSMAL, $AC0.L
529 // 017a 16cd 0e44 si @DSPA, #0x0e44
530 // 017c 16c9 0000 si @DSCR, #0x0000
531 // 017e 8900 clr $ACC1
532 // 017f 0d20 lris $AC1.L, #0x20
533 // 0180 2dcb srs @DSBL, $AC1.L
535 // DMA 0x20bytes to DRAM @ 0x0e44 from CPU @ maddr
537 u16 length_of_0e44 = 0x20
539 // 0181 4c00 add $ACC0, $ACC1
540 maddr += length_of_0e44
543 // 0182 1c80 mrr $IX0, $AR0
545 // 0183 0080 0280 lri $AR0, #0x0280
546 // 0185 0081 0000 lri $AR1, #0x0000
547 // 0187 0082 0140 lri $AR2, #0x0140
548 // 0189 0083 0e44 lri $AR3, #0x0e44
549 // 018b 0a00 lris $AX0.H, #0x00
551 // 018c 27c9 lrs $AC1.M, @DSCR
552 // 018d 03a0 0004 andf $AC1.M, #0x0004
553 // 018f 029c 018c jlnz 0x018c
556 // 0191 2ece srs @DSMAH, $AC0.M
557 // 0192 2ccf srs @DSMAL, $AC0.L
558 // 0193 16cd 0e54 si @DSPA, #0x0e54
559 // 0195 16c9 0000 si @DSCR, #0x0000
560 // 0197 16cb 0260 si @DSBL, #0x0260
562 // DMA 0x0260bytes to DRAM @ 0x0e54 from CPU @ maddr
564 // 0199 009f 00a0 lri $AC1.M, #0x00a0
566 // 019c 007f 01a5 bloop $AC1.M, 0x01a5
567 // 019e 197e lrri $AC0.M, @$AR3
568 // 019f 1b1a srri @$AR0, $AX0.H
569 // 01a0 197c lrri $AC0.L, @$AR3
570 // 01a1 1b1a srri @$AR0, $AX0.H
571 // 01a2 1b5e srri @$AR2, $AC0.M
572 // 01a3 7c22 neg's $ACC0 : @$AR2, $AC0.L
573 // 01a4 1b3e srri @$AR1, $AC0.M
574 // 01a5 1b3c srri @$AR1, $AC0.L
576 // high reg will only be sign bits, and it's never stored, so we can use s32 here
577 s32* buffer_source = 0x0e44
578 s32* buffer_dest = 0x0140
579 s32* buffer_to_zero = 0x0280
580 s32* buffer_dest_neg = 0x0000
581 for (i = 0x00a0; i > 0; i--) {
582 s32 thing = *(buffer_source++)
583 *(buffer_to_zero++) = 0
584 *(buffer_dest++) = thing
585 *(buffer_dest_neg++) = ~thing
588 // Restore CmdBlockBuf
589 01a6 1c04 mrr $AR0, $IX0
591 // 01a7 029f 0068 jmp 0x0068
595 // Interesting, DMAs in new CmdBlock and starts executing it
597 // 01a9 8e70 set16'l : $AC0.M, @$AR0
598 // 01aa 8960 clr'l $ACC1 : $AC0.L, @$AR0
599 u16 maddrh = *(CmdBlockBuf++)
600 u16 maddrl = *(CmdBlockBuf++)
602 // 01ab 191f lrri $AC1.M, @$AR0
603 u16 numbytes = *(CmdBlockBuf++)
605 // 01ac 2ece srs @DSMAH, $AC0.M
606 // 01ad 2ccf srs @DSMAL, $AC0.L
607 // 01ae 16cd 0c00 si @DSPA, #0x0c00
608 // 01b0 16c9 0000 si @DSCR, #0x0000
609 // 01b2 0503 addis $AC1.M, #0x03
610 // 01b3 0340 fff0 andi $AC1.M, #0xfff0
611 // 01b5 2fcb srs @DSBL, $AC1.M
613 // DMA ((numbytes + 3) & 0xfff0)bytes to DMEM @ 0x0c00 from CPU @ maddr
615 // 01b6 02bf 055c call 0x055c
618 // 01b8 0080 0c00 lri $AR0, #0x0c00
621 // 01ba 029f 0068 jmp 0x0068
625 // DMAs in a new PB and inits values (itd, func pointers, etc)
626 // DMAs in new update_block, but doesn't apply it
630 // 01bd 8970 clr'l $ACC1 : $AC0.M, @$AR0
631 // 01be 8e78 set16'l : $AC1.M, @$AR0
632 u16 maddrh = *(CmdBlockBuf++)
633 u16 maddrl = *(CmdBlockBuf++)
635 // 01bf 2ece srs @DSMAH, $AC0.M
636 // 01c0 2fcf srs @DSMAL, $AC1.M
637 // 01c1 16cd 0b80 si @DSPA, #0x0b80
638 // 01c3 16c9 0000 si @DSCR, #0x0000
639 // 01c5 16cb 00c0 si @DSBL, #0x00c0
641 // DMA 0x00c0bytes to DMEM @ 0x0b80 from CPU @ maddr
643 // 01c7 0082 0e08 lri $AR2, #0x0e08
644 // 01c9 009f 0000 lri $AC1.M, #0x0000
645 // 01cb 1b5f srri @$AR2, $AC1.M
646 // 01cc 009f 0140 lri $AC1.M, #0x0140
647 // 01ce 1b5f srri @$AR2, $AC1.M
648 // 01cf 009f 0280 lri $AC1.M, #0x0280
649 // 01d1 1b5f srri @$AR2, $AC1.M
650 // 01d2 009f 0400 lri $AC1.M, #0x0400
651 // 01d4 1b5f srri @$AR2, $AC1.M
652 // 01d5 009f 0540 lri $AC1.M, #0x0540
653 // 01d7 1b5f srri @$AR2, $AC1.M
654 // 01d8 009f 0680 lri $AC1.M, #0x0680
655 // 01da 1b5f srri @$AR2, $AC1.M
656 // 01db 009f 07c0 lri $AC1.M, #0x07c0
657 // 01dd 1b5f srri @$AR2, $AC1.M
658 // 01de 009f 0900 lri $AC1.M, #0x0900
659 // 01e0 1b5f srri @$AR2, $AC1.M
660 // 01e1 009f 0a40 lri $AC1.M, #0x0a40
661 // 01e3 1b5f srri @$AR2, $AC1.M
672 // 01e4 02bf 055c call 0x055c
675 // 01e6 00de 0ba7 lr $AC0.M, @0x0ba7
676 // 01e8 00df 0ba8 lr $AC1.M, @0x0ba8
677 // 01ea 2ece srs @DSMAH, $AC0.M
678 // 01eb 2fcf srs @DSMAL, $AC1.M
679 // 01ec 16cd 03c0 si @DSPA, #0x03c0
680 // 01ee 16c9 0000 si @DSCR, #0x0000
681 // 01f0 16cb 0080 si @DSBL, #0x0080
683 // DMA 0x80bytes from CPU @ ((pb.update.dataHi << 16) | pb.update.dataLo) to DRAM @ 0x03c0
685 // 01f2 8100 clr $ACC0
686 // 01f3 8900 clr $ACC1
688 // 01f4 00de 0b84 lr $AC0.M, @0x0b84
689 // 01f6 009f 0b31 lri $AC1.M, #0x0b31
690 // 01f8 4c00 add $ACC0, $ACC1
691 // 01f9 1c7e mrr $AR3, $AC0.M
692 // 01fa 0213 ilrr $AC0.M, @$AR3
693 // 01fb 00fe 0e15 sr @0x0e15, $AC0.M
694 *0x0e15 = *(0x0b31 + pb.srcSelect) // func ptr for src
696 // 01fd 00de 0b85 lr $AC0.M, @0x0b85
697 // 01ff 009f 0b34 lri $AC1.M, #0x0b34
698 // 0201 4c00 add $ACC0, $ACC1
699 // 0202 1c7e mrr $AR3, $AC0.M
700 // 0203 0213 ilrr $AC0.M, @$AR3
701 // 0204 00fe 0e16 sr @0x0e16, $AC0.M
702 *0x0e16 = *(0x0b34 + pb.coefSelect) // ptr to coef table
704 // 0206 00de 0b86 lr $AC0.M, @0x0b86
705 // 0208 009f 0b11 lri $AC1.M, #0x0b11
706 // 020a 4c00 add $ACC0, $ACC1
707 // 020b 1c7e mrr $AR3, $AC0.M
708 // 020c 0213 ilrr $AC0.M, @$AR3
709 // 020d 00fe 0e14 sr @0x0e14, $AC0.M
710 *0x0e14 = *(0x0b11 + pb.mixerCtrl) // func ptr for mixer
712 // 020f 8100 clr $ACC0
713 // 0210 00de 0b9b lr $AC0.M, @0x0b9b
714 // 0212 b100 tst $ACC0
715 // 0213 0295 023a jz 0x023a
716 if (pb.itd.flag != AX_PB_ITD_OFF) {
717 // 0215 8900 clr $ACC1
718 // 0216 00df 0b9e lr $AC1.M, @0x0b9e
719 // 0218 0300 0cc0 addi $AC1.M, #0x0cc0
720 // 021a 00ff 0e40 sr @0x0e40, $AC1.M
721 *0x0e40 = 0x0cc0 + pb.itd.shiftL
723 // 021c 00df 0b9f lr $AC1.M, @0x0b9f
724 // 021e 0300 0cc0 addi $AC1.M, #0x0cc0
725 // 0220 00ff 0e41 sr @0x0e41, $AC1.M
726 *0x0e41 = 0x0cc0 + pb.itd.shiftR
728 // 0222 009f 0ce0 lri $AC1.M, #0x0ce0
729 // 0224 00ff 0e42 sr @0x0e42, $AC1.M
730 // 0226 00ff 0e43 sr @0x0e43, $AC1.M
734 // 0228 02bf 055c call 0x055c
737 // 022a 00de 0b9c lr $AC0.M, @0x0b9c
738 // 022c 2ece srs @DSMAH, $AC0.M
739 // 022d 00de 0b9d lr $AC0.M, @0x0b9d
740 // 022f 2ecf srs @DSMAL, $AC0.M
741 // 0230 16cd 0cc0 si @DSPA, #0x0cc0
742 // 0232 16c9 0000 si @DSCR, #0x0000
743 // 0234 16cb 0040 si @DSBL, #0x0040
745 // DMA 0x0040bytes to DMEM @ 0x0cc0 from CPU @ (pb.itd.bufferHi << 16) | pb.itd.bufferLo
747 // 0236 02bf 055c call 0x055c
750 // 0238 029f 0068 jmp 0x0068
755 // 023a 009f 0ce0 lri $AC1.M, #0x0ce0
756 // 023c 00ff 0e42 sr @0x0e42, $AC1.M
757 // 023e 00ff 0e40 sr @0x0e40, $AC1.M
758 // 0240 00ff 0e41 sr @0x0e41, $AC1.M
759 // 0242 00ff 0e43 sr @0x0e43, $AC1.M
765 // 0244 02bf 055c call 0x055c
768 // 0246 029f 0068 jmp 0x0068
773 // Function calls itself until there are no more linked PBs
777 // Save CmdBlockBuf ptr
778 0249 00e0 0e07 sr @0x0e07, $AR0
780 // Processes pb.update.updNum[0] to pb.update.updNum[5]
781 // Applies specified number of updates for every millisecond of voice frame (5 millisecs)
782 // first millisec's updates are ignored <- not proven, yet
784 // 024b 0080 0ba2 lri $AR0, #0x0ba2 // pb.update.updNum[0]
785 // 024d 0081 03c0 lri $AR1, #0x03c0
786 // 024f 0e05 lris $AC0.M, #0x05
787 // 0250 00fe 0e04 sr @0x0e04, $AC0.M // counter to decrement
788 // 0252 8900 clr $ACC1
789 u16* pUpdates_this_ms = 0x0ba2
790 u16* pUpdate_block = 0x03c0
794 // 0253 8150 clr'l $ACC0 : $AX0.H, @$AR0
795 // 0254 009f 0b80 lri $AC1.M, #0x0b80
796 // 0256 007a 025b bloop $AX0.H, 0x025b
797 // 0258 193e lrri $AC0.M, @$AR1
798 // 0259 4c49 add'l $ACC0, $ACC1 : $AX1.L, @$AR1
799 // 025a 1c5e mrr $AR2, $AC0.M
800 // 025b 1a59 srr @$AR2, $AX1.L // AR2 isn't changed till updates are done
802 // Write updates from update_block to pb in dram
803 for (int i = 0; i < *pUpdates_this_ms; i+=2) {
804 // Looks like 0x03c0 is a struct of <offset, value> pairs to write into PB
805 *(0x0b80 + *(pUpdate_block + i)) = *(pUpdate_block + i + 1)
809 // 025c 0083 0e05 lri $AR3, #0x0e05
810 // 025e 1b61 srri @$AR3, $AR1
811 // 025f 1b60 srri @$AR3, $AR0
812 *0x0e05 = pUpdate_block
813 *0x0e06 = pUpdates_this_ms
814 // They are restored before jmping back to NextMillisecUpd
816 // 0260 00de 0b87 lr $AC0.M, @0x0b87
817 // 0262 0601 cmpis $AC0.M, #0x01
818 // 0263 0295 0267 jz 0x0267
819 // 0265 029f 0332 jmp 0x0332
820 if (pb.state == AX_PB_STATE_RUN) {
822 // 0267 00de 0e42 lr $AC0.M, @0x0e42
823 // 0269 00fe 0e1c sr @0x0e1c, $AC0.M
826 // 026b 00c3 0e15 lr $AR3, @0x0e15
827 // 026d 177f callr $AR3
830 // Volume Envelope Processing
833 // 0270 8100 clr $ACC0
834 // 0271 8900 clr $ACC1
835 // 0272 00de 0bb3 lr $AC0.M, @0x0bb3 // currentDelta (s16)
836 // 0274 00df 0bb2 lr $AC1.M, @0x0bb2 // currentVolume (u16)
837 // 0276 1f1f mrr $AX0.L, $AC1.M
838 // 0277 4d00 add $ACC1, $ACC0
839 // 0278 1481 asl $ACC0, #1
840 // 0279 8d1e set15'mv : $AX1.H, $AC0.M // unsigned mulx,
841 // 027a 1fd8 mrr $AC0.M, $AX0.L
842 // 027b 0098 8000 lri $AX0.L, #0x8000
843 // 027d 0080 0e44 lri $AR0, #0x0e44
844 // 027f a830 mulx's $AX0.L, $AX1.H : @$AR0, $AC0.M
845 // 0280 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
846 // 0281 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
847 // 0282 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
848 // 0283 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
849 // 0284 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
850 // 0285 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
851 // 0286 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
852 // 0287 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
853 // 0288 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
854 // 0289 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
855 // 028a ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
856 // 028b ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
857 // 028c ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
858 // 028d ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
859 // 028e ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
860 // 028f ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
861 // 0290 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
862 // 0291 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
863 // 0292 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
864 // 0293 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
865 // 0294 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
866 // 0295 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
867 // 0296 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
868 // 0297 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
869 // 0298 ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
870 // 0299 ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
871 // 029a ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
872 // 029b ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
873 // 029c ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
874 // 029d ad30 mulxac's $AX0.L, $AX1.H, $ACC1 : @$AR0, $AC0.M
875 // 029e ac38 mulxac's $AX0.L, $AX1.H, $ACC0 : @$AR0, $AC1.M
876 // 029f 00fe 0bb2 sr @0x0bb2, $AC0.M
878 u40 temp1 = pb.ve.currentVolume << 16
879 u40 temp2 = (pb.ve.currentVolume + pb.ve.currentDelta) << 16
880 *0x0e44 = temp1 >> 16
881 *0x0e45 = temp2 >> 16
883 u40 PROD = (u16)0x8000 * (u16)(pb.ve.currentDelta << 1) * 2
884 for (u16* i = 0x0e46; i < 0x0e46 + 30; i+=2) {
889 *(i + 1) = temp2 >> 16
892 pb.ve.currentVolume = temp1 >> 16
895 // 02a2 0080 0e44 lri $AR0, #0x0e44
896 // 02a4 00c1 0e43 lr $AR1, @0x0e43
897 // 02a6 1c61 mrr $AR3, $AR1
898 // 02a7 193a lrri $AX0.H, @$AR1
899 // 02a8 1918 lrri $AX0.L, @$AR0
900 // 02a9 9059 mul'l $AX0.L, $AX0.H : $AX1.H, @$AR1
901 // 02aa 1919 lrri $AX1.L, @$AR0
902 // 02ab 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
903 // 02ac 8080 nx'ls : $AX0.L, $AC0.M
904 // 02ad 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
905 // 02ae 8091 nx'ls : $AX1.L, $AC1.M
906 // 02af 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
907 // 02b0 8080 nx'ls : $AX0.L, $AC0.M
908 // 02b1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
909 // 02b2 8091 nx'ls : $AX1.L, $AC1.M
910 // 02b3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
911 // 02b4 8080 nx'ls : $AX0.L, $AC0.M
912 // 02b5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
913 // 02b6 8091 nx'ls : $AX1.L, $AC1.M
914 // 02b7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
915 // 02b8 8080 nx'ls : $AX0.L, $AC0.M
916 // 02b9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
917 // 02ba 8091 nx'ls : $AX1.L, $AC1.M
918 // 02bb 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
919 // 02bc 8080 nx'ls : $AX0.L, $AC0.M
920 // 02bd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
921 // 02be 8091 nx'ls : $AX1.L, $AC1.M
922 // 02bf 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
923 // 02c0 8080 nx'ls : $AX0.L, $AC0.M
924 // 02c1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
925 // 02c2 8091 nx'ls : $AX1.L, $AC1.M
926 // 02c3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
927 // 02c4 8080 nx'ls : $AX0.L, $AC0.M
928 // 02c5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
929 // 02c6 8091 nx'ls : $AX1.L, $AC1.M
930 // 02c7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
931 // 02c8 8080 nx'ls : $AX0.L, $AC0.M
932 // 02c9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
933 // 02ca 8091 nx'ls : $AX1.L, $AC1.M
934 // 02cb 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
935 // 02cc 8080 nx'ls : $AX0.L, $AC0.M
936 // 02cd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
937 // 02ce 8091 nx'ls : $AX1.L, $AC1.M
938 // 02cf 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
939 // 02d0 8080 nx'ls : $AX0.L, $AC0.M
940 // 02d1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
941 // 02d2 8091 nx'ls : $AX1.L, $AC1.M
942 // 02d3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
943 // 02d4 8080 nx'ls : $AX0.L, $AC0.M
944 // 02d5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
945 // 02d6 8091 nx'ls : $AX1.L, $AC1.M
946 // 02d7 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
947 // 02d8 8080 nx'ls : $AX0.L, $AC0.M
948 // 02d9 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
949 // 02da 8091 nx'ls : $AX1.L, $AC1.M
950 // 02db 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
951 // 02dc 8080 nx'ls : $AX0.L, $AC0.M
952 // 02dd 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
953 // 02de 8091 nx'ls : $AX1.L, $AC1.M
954 // 02df 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
955 // 02e0 8080 nx'ls : $AX0.L, $AC0.M
956 // 02e1 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
957 // 02e2 8091 nx'ls : $AX1.L, $AC1.M
958 // 02e3 9e51 mulmv'l $AX1.L, $AX1.H, $ACC0 : $AX0.H, @$AR1
959 // 02e4 8080 nx'ls : $AX0.L, $AC0.M
960 // 02e5 9759 mulmv'l $AX0.L, $AX0.H, $ACC1 : $AX1.H, @$AR1
961 // 02e6 8091 nx'ls : $AX1.L, $AC1.M
962 // 02e7 9e00 mulmv $AX1.L, $AX1.H, $ACC0
963 // 02e8 6f33 movp's $ACC1 : @$AR3, $AC0.M
964 // 02e9 1b7f srri @$AR3, $AC1.M
969 for (x = 0; x < 0x20; x++) {
970 *(dst + x) = ((u16)*(temp1 + x) * (u16)*(dst + x) * 2) >> 16
973 // 02ea 00c3 0e14 lr $AR3, @0x0e14
977 // 02ef 177f callr $AR3
978 // Keep in mind: 40bit, unsigned, *2
981 // Note: 40bit, unsigned, *2 not changed till 0x0332
983 // 02f0 8100 clr $ACC0
984 // 02f1 00de 0b9b lr $AC0.M, @0x0b9b
985 // 02f3 b100 tst $ACC0
986 // 02f4 0295 032a jz 0x032a
987 if (pb.itd.flag != AX_PB_ITD_OFF) {
988 // 02f6 00de 0e42 lr $AC0.M, @0x0e42
989 // 02f8 00fe 0e43 sr @0x0e43, $AC0.M
992 // 02fa 8100 clr $ACC0
993 // 02fb 8900 clr $ACC1
994 // 02fc 00de 0b9e lr $AC0.M, @0x0b9e
995 // 02fe 00df 0ba0 lr $AC1.M, @0x0ba0
997 // 0301 0293 0306 jle 0x0306
998 if (pb.itd.shiftL > pb.itd.targetShiftL) {
999 // 0303 7800 decm $AC0.M
1000 // 0304 029f 0309 jmp 0x0309
1002 } else if (pb.itd.shiftL < pb.itd.targetShiftL) {
1003 // 0306 0295 0309 jz 0x0309
1004 // 0308 7400 incm $AC0.M
1007 // 0309 00fe 0b9e sr @0x0b9e, $AC0.M // Store pb.itd.shiftL
1009 // 030b 00df 0e43 lr $AC1.M, @0x0e43
1010 // 030d 05e0 addis $AC1.M, #0xe0
1011 // 030e 4c00 add $ACC0, $ACC1
1012 // 030f 00fe 0e40 sr @0x0e40, $AC0.M
1013 *0x0e40 = *0x0e43 - 32
1015 // 0311 8100 clr $ACC0
1016 // 0312 8900 clr $ACC1
1017 // 0313 00de 0b9f lr $AC0.M, @0x0b9f
1018 // 0315 00df 0ba1 lr $AC1.M, @0x0ba1
1020 // 0318 0293 031d jle 0x031d
1021 if (pb.itd.shiftR > pb.itd.targetShiftR) {
1022 // 031a 7800 decm $AC0.M
1023 // 031b 029f 0320 jmp 0x0320
1025 } else if (pb.itd.shiftR < pb.itd.targetShiftR) {
1026 // 031d 0295 0320 jz 0x0320
1027 // 031f 7400 incm $AC0.M
1030 // 0320 00fe 0b9f sr @0x0b9f, $AC0.M // Store pb.itd.shiftR
1032 // 0322 00df 0e43 lr $AC1.M, @0x0e43
1033 // 0324 05e0 addis $AC1.M, #0xe0
1034 // 0325 4c00 add $ACC0, $ACC1
1035 // 0326 00fe 0e41 sr @0x0e41, $AC0.M
1036 *0x0e41 = *0x0e43 - 32
1038 0328 029f 0332 jmp 0x0332
1040 } else { // pb.itd.flag == AX_PB_ITD_OFF
1042 // 032a 00de 0e42 lr $AC0.M, @0x0e42
1043 // 032c 00fe 0e40 sr @0x0e40, $AC0.M
1044 // 032e 00fe 0e41 sr @0x0e41, $AC0.M
1045 // 0330 00fe 0e43 sr @0x0e43, $AC0.M
1053 // 0332 8100 clr $ACC0
1056 // 0335 8900 clr $ACC1
1057 // 0336 1efe mrr $PROD.M2, $AC0.M
1058 // 0337 0e40 lris $AC0.M, #0x40
1059 // 0338 1ebe mrr $PROD.M1, $AC0.M
1060 // 0339 0083 0e08 lri $AR3, #0x0e08
1061 // 033b 1c03 mrr $AR0, $AR3
1062 // 033c 1ff5 mrr $AC1.M, $PROD.M1
1063 // 033d 191a lrri $AX0.H, @$AR0
1064 // 033e f858 addpaxz'l $ACC0, $AX0.H : $AX1.H, @$AR0
1065 // 033f fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M
1066 // 0340 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M
1067 // 0341 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M
1068 // 0342 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M
1069 // 0343 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M
1070 // 0344 f8b1 addpaxz'ls $ACC0, $AX0.H : $AX1.H, $AC1.M
1071 // 0345 fba0 addpaxz'ls $ACC1, $AX1.H : $AX0.H, $AC0.M
1072 // 0346 f83b addpaxz's $ACC0, $AX0.H : @$AR3, $AC1.M
1073 // 0347 1b7e srri @$AR3, $AC0.M
1075 for (u16* i = 0x0e08; i <= 0x0e10; i++) {
1076 *i = (u16)( (0xff00400000 + (u40)(*i << 16)) >> 16 )
1079 // 0348 0083 0e04 lri $AR3, #0x0e04
1080 // 034a 8100 clr $ACC0
1081 // 034b 8973 clr'l $ACC1 : $AC0.M, @$AR3
1082 // 034c 1961 lrri $AR1, @$AR3 // 0x0e05
1083 // 034d 1960 lrri $AR0, @$AR3 // 0x0e06
1084 // 034e 7800 decm $AC0.M
1085 // 034f 00fe 0e04 sr @0x0e04, $AC0.M
1086 // 0351 0294 0253 jnz 0x0253
1089 goto NextMillisecUpd
1092 // 0354 8100 clr $ACC0
1093 // 0355 00de 0b9b lr $AC0.M, @0x0b9b
1094 // 0357 b100 tst $ACC0
1095 // 0358 0295 036a jz 0x036a
1096 if (pb.itd.flag != AX_PB_ITD_OFF) {
1098 // 035a 00de 0b9c lr $AC0.M, @0x0b9c
1099 // 035c 00dc 0b9d lr $AC0.L, @0x0b9d
1100 // 035e 2ece srs @DSMAH, $AC0.M
1101 // 035f 2ccf srs @DSMAL, $AC0.L
1102 // 0360 8100 clr $ACC0
1103 // 0361 00de 0e1c lr $AC0.M, @0x0e1c
1104 // 0363 2ecd srs @DSPA, $AC0.M
1105 // 0364 16c9 0001 si @DSCR, #0x0001
1106 // 0366 16cb 0040 si @DSBL, #0x0040
1108 // DMA 0x40bytes from DRAM @ (*0x0e1c) to CPU @ ((pb.itd.bufferHi << 16) | pb.itd.bufferLo)
1110 // 0368 02bf 055c call 0x055c
1114 // 036a 8100 clr $ACC0
1115 // 036b 8900 clr $ACC1
1116 // 036c 00de 0b82 lr $AC0.M, @0x0b82
1117 // 036e 00df 0b83 lr $AC1.M, @0x0b83
1118 u16 maddrh = pb.currHi
1119 u16 maddrl = pb.currLo
1121 // This writes back the whole PB to mram from dsp
1122 // 0370 2ece srs @DSMAH, $AC0.M
1123 // 0371 2fcf srs @DSMAL, $AC1.M
1124 // 0372 16cd 0b80 si @DSPA, #0x0b80
1125 // 0374 16c9 0001 si @DSCR, #0x0001
1126 // 0376 16cb 00c0 si @DSBL, #0x00c0
1128 // DMA 0xc0bytes from DRAM @ 0x0b80 to CPU @ maddr
1130 // 0378 02bf 055c call 0x055c
1133 // 037a 8100 clr $ACC0
1134 // 037b 00de 0b80 lr $AC0.M, @0x0b80
1135 // 037d 00dc 0b81 lr $AC0.L, @0x0b81
1136 // 037f b100 tst $ACC0
1137 // 0380 0294 0386 jnz 0x0386
1138 if (((pb.nextHi << 16) | pb.nextLo) == 0) {
1141 // Restore CmdBlockBuf ptr
1142 0382 00c0 0e07 lr $AR0, @0x0e07
1143 // 0384 029f 0068 jmp 0x0068
1147 // DMA in the next PB
1148 // From here on out, it's the same as Cmd2, except it calls itself to process the PB it just loaded
1150 // 0386 2ece srs @DSMAH, $AC0.M
1151 // 0387 2ccf srs @DSMAL, $AC0.L
1152 // 0388 16cd 0b80 si @DSPA, #0x0b80
1153 // 038a 16c9 0000 si @DSCR, #0x0000
1154 // 038c 16cb 00c0 si @DSBL, #0x00c0
1156 // DMA 0xc0bytes from CPU @ ((pb.nextHi << 16) | pb.nextLo) to DRAM @ 0x0b80
1158 // 038e 0082 0e08 lri $AR2, #0x0e08
1159 // 0390 009f 0000 lri $AC1.M, #0x0000
1160 // 0392 1b5f srri @$AR2, $AC1.M
1161 // 0393 009f 0140 lri $AC1.M, #0x0140
1162 // 0395 1b5f srri @$AR2, $AC1.M
1163 // 0396 009f 0280 lri $AC1.M, #0x0280
1164 // 0398 1b5f srri @$AR2, $AC1.M
1165 // 0399 009f 0400 lri $AC1.M, #0x0400
1166 // 039b 1b5f srri @$AR2, $AC1.M
1167 // 039c 009f 0540 lri $AC1.M, #0x0540
1168 // 039e 1b5f srri @$AR2, $AC1.M
1169 // 039f 009f 0680 lri $AC1.M, #0x0680
1170 // 03a1 1b5f srri @$AR2, $AC1.M
1171 // 03a2 009f 07c0 lri $AC1.M, #0x07c0
1172 // 03a4 1b5f srri @$AR2, $AC1.M
1173 // 03a5 009f 0900 lri $AC1.M, #0x0900
1174 // 03a7 1b5f srri @$AR2, $AC1.M
1175 // 03a8 009f 0a40 lri $AC1.M, #0x0a40
1176 // 03aa 1b5f srri @$AR2, $AC1.M
1187 // 03ab 02bf 055c call 0x055c
1190 // 03ad 00de 0ba7 lr $AC0.M, @0x0ba7
1191 // 03af 00df 0ba8 lr $AC1.M, @0x0ba8
1192 // 03b1 2ece srs @DSMAH, $AC0.M
1193 // 03b2 2fcf srs @DSMAL, $AC1.M
1194 // 03b3 16cd 03c0 si @DSPA, #0x03c0
1195 // 03b5 16c9 0000 si @DSCR, #0x0000
1196 // 03b7 16cb 0080 si @DSBL, #0x0080
1198 // DMA 0x80bytes from CPU @ ((pb.update.dataHi << 16) | pb.update.dataLo) to DRAM @ 0x03c0
1200 // 03b9 8100 clr $ACC0
1201 // 03ba 8900 clr $ACC1
1203 // 03bb 00de 0b84 lr $AC0.M, @0x0b84
1204 // 03bd 009f 0b31 lri $AC1.M, #0x0b31
1205 // 03bf 4c00 add $ACC0, $ACC1
1206 // 03c0 1c7e mrr $AR3, $AC0.M
1207 // 03c1 0213 ilrr $AC0.M, @$AR3
1208 // 03c2 00fe 0e15 sr @0x0e15, $AC0.M
1209 *0x0e15 = *(0x0b31 + pb.srcSelect) // func ptr for src
1211 // 03c4 00de 0b85 lr $AC0.M, @0x0b85
1212 // 03c6 009f 0b34 lri $AC1.M, #0x0b34
1213 // 03c8 4c00 add $ACC0, $ACC1
1214 // 03c9 1c7e mrr $AR3, $AC0.M
1215 // 03ca 0213 ilrr $AC0.M, @$AR3
1216 // 03cb 00fe 0e16 sr @0x0e16, $AC0.M
1217 *0x0e16 = *(0x0b34 + pb.coefSelect) // ptr to coef table
1219 // 03cd 00de 0b86 lr $AC0.M, @0x0b86
1220 // 03cf 009f 0b11 lri $AC1.M, #0x0b11
1221 // 03d1 4c00 add $ACC0, $ACC1
1222 // 03d2 1c7e mrr $AR3, $AC0.M
1223 // 03d3 0213 ilrr $AC0.M, @$AR3
1224 // 03d4 00fe 0e14 sr @0x0e14, $AC0.M
1225 *0x0e14 = *(0x0b11 + pb.mixerCtrl) // func ptr for mixer
1227 // 03d6 8100 clr $ACC0
1228 // 03d7 00de 0b9b lr $AC0.M, @0x0b9b
1229 // 03d9 b100 tst $ACC0
1230 // 03da 0295 0403 jz 0x0403
1231 if (pb.itd.flag != AX_PB_ITD_OFF) {
1232 // 03dc 8900 clr $ACC1
1233 // 03dd 00df 0b9e lr $AC1.M, @0x0b9e
1234 // 03df 0300 0cc0 addi $AC1.M, #0x0cc0
1235 // 03e1 00ff 0e40 sr @0x0e40, $AC1.M
1236 *0x0e40 = 0x0cc0 + pb.itd.shiftL
1238 // 03e3 00df 0b9f lr $AC1.M, @0x0b9f
1239 // 03e5 0300 0cc0 addi $AC1.M, #0x0cc0
1240 // 03e7 00ff 0e41 sr @0x0e41, $AC1.M
1241 *0x0e41 = 0x0cc0 + pb.itd.shiftR
1243 // 03e9 009f 0ce0 lri $AC1.M, #0x0ce0
1244 // 03eb 00ff 0e42 sr @0x0e42, $AC1.M
1245 // 03ed 00ff 0e43 sr @0x0e43, $AC1.M
1249 // 03ef 02bf 055c call 0x055c
1252 // 03f1 00de 0b9c lr $AC0.M, @0x0b9c
1253 // 03f3 2ece srs @DSMAH, $AC0.M
1254 // 03f4 00de 0b9d lr $AC0.M, @0x0b9d
1255 // 03f6 2ecf srs @DSMAL, $AC0.M
1256 // 03f7 16cd 0cc0 si @DSPA, #0x0cc0
1257 // 03f9 16c9 0000 si @DSCR, #0x0000
1258 // 03fb 16cb 0040 si @DSBL, #0x0040
1260 // DMA 0x0040bytes to DMEM @ 0x0cc0 from CPU @ (pb.itd.bufferHi << 16) | pb.itd.bufferLo
1262 // 03fd 02bf 055c call 0x055c
1265 // Restore CmdBlockBuf ptr
1266 03ff 00c0 0e07 lr $AR0, @0x0e07
1267 // 0401 029f 0248 jmp 0x0248
1268 goto Cmd_3() // Calls itself till there are no more PBs linked
1272 // 0403 009f 0ce0 lri $AC1.M, #0x0ce0
1273 // 0405 00ff 0e42 sr @0x0e42, $AC1.M
1274 // 0407 00ff 0e40 sr @0x0e40, $AC1.M
1275 // 0409 00ff 0e41 sr @0x0e41, $AC1.M
1276 // 040b 00ff 0e43 sr @0x0e43, $AC1.M
1282 // 040d 02bf 055c call 0x055c
1285 // Restore CmdBlockBuf ptr
1286 040f 00c0 0e07 lr $AR0, @0x0e07
1287 // 0411 029f 0248 jmp 0x0248
1288 goto Cmd_3() // Calls itself till there are no more PBs linked
1295 0414 0086 0400 lri $IX2, #0x0400 // buffer in dram
1297 // 0416 8100 clr $ACC0
1298 // 0417 8970 clr'l $ACC1 : $AC0.M, @$AR0
1299 // 0418 191c lrri $AC0.L, @$AR0
1300 u16 maddrh = *(CmdBlockBuf++)
1301 u16 maddrl = *(CmdBlockBuf++)
1303 // 0419 2ece srs @DSMAH, $AC0.M
1304 // 041a 2ccf srs @DSMAL, $AC0.L
1305 // 041b 1fc6 mrr $AC0.M, $IX2
1306 // 041c 2ecd srs @DSPA, $AC0.M
1307 // 041d 16c9 0001 si @DSCR, #0x0001
1308 // 041f 16cb 0780 si @DSBL, #0x0780
1310 // DMA 0x0780bytes from DRAM @ 0x0400 to CPU @ maddr
1312 // 0421 02bf 055c call 0x055c
1315 0423 02bf 0484 call 0x0484
1317 // 0425 029f 0068 jmp 0x0068
1324 0428 0086 07c0 lri $IX2, #0x07c0
1327 042b 8970 clr'l $ACC1 : $AC0.M, @$AR0
1328 042c 191c lrri $AC0.L, @$AR0
1329 042d 2ece srs @DSMAH, $AC0.M
1330 042e 2ccf srs @DSMAL, $AC0.L
1331 042f 1fc6 mrr $AC0.M, $IX2
1332 0430 2ecd srs @DSPA, $AC0.M
1333 0431 16c9 0001 si @DSCR, #0x0001
1334 0433 16cb 0780 si @DSBL, #0x0780
1336 // 0435 02bf 055c call 0x055c
1339 0437 02bf 0484 call 0x0484
1341 // 0439 029f 0068 jmp 0x0068
1349 043e 8970 clr'l $ACC1 : $AC0.M, @$AR0
1350 043f 191f lrri $AC1.M, @$AR0
1351 0440 2ece srs @DSMAH, $AC0.M
1352 0441 2fcf srs @DSMAL, $AC1.M
1353 0442 16cd 0280 si @DSPA, #0x0280
1354 0444 16c9 0001 si @DSCR, #0x0001 // DMEM -> CPU
1355 0446 16cb 0280 si @DSBL, #0x0280
1357 0448 8f50 set40'l : $AX0.H, @$AR0
1358 0449 8140 clr'l $ACC0 : $AX0.L, @$AR0
1359 044a 0081 0400 lri $AR1, #0x0400
1360 044c 0083 0000 lri $AR3, #0x0000
1361 044e 0082 0140 lri $AR2, #0x0140
1362 0450 0099 0080 lri $AX1.L, #0x0080
1364 // 0452 02bf 055c call 0x055c
1367 0454 1105 046c bloopi #0x05, 0x046c
1368 0456 1f61 mrr $AX1.H, $AR1
1370 0457 1120 045e bloopi #0x20, 0x045e
1371 0459 8972 clr'l $ACC1 : $AC0.M, @$AR2
1372 045a 195c lrri $AC0.L, @$AR2
1373 045b f07b lsl16'l $ACC0 : $AC1.M, @$AR3
1374 045c 197d lrri $AC1.L, @$AR3
1375 045d f131 lsl16's $ACC1 : @$AR1, $AC0.M
1376 045e 8139 clr's $ACC0 : @$AR1, $AC1.M
1379 0460 6800 movax $ACC0, $AX0
1380 0461 2ece srs @DSMAH, $AC0.M
1381 0462 2ccf srs @DSMAL, $AC0.L
1382 0463 1ffb mrr $AC1.M, $AX1.H
1383 0464 2fcd srs @DSPA, $AC1.M
1384 0465 0f01 lris $AC1.M, #0x01
1385 0466 2fc9 srs @DSCR, $AC1.M
1386 0467 1ff9 mrr $AC1.M, $AX1.L
1387 0468 2fcb srs @DSBL, $AC1.M
1388 0469 7200 addaxl $ACC0, $AX1.L
1389 046a 1f5e mrr $AX0.H, $AC0.M
1390 046b 1f1c mrr $AX0.L, $AC0.L
1393 // 046d 26c9 lrs $AC0.M, @DSCR
1394 // 046e 02a0 0004 andf $AC0.M, #0x0004
1395 // 0470 029c 046d jlnz 0x046d
1398 // 0472 029f 0068 jmp 0x0068
1402 void UnimplimentedCmd_B() {
1403 // 0474 029f 0068 jmp 0x0068
1407 void UnimplimentedCmd_C() {
1408 // 0476 029f 0068 jmp 0x0068
1412 void UnimplimentedCmd_A() {
1413 // 0478 029f 0068 jmp 0x0068
1418 // Send DSP_YIELD mail
1419 // 047a 16fc dcd1 si @DMBH, #0xdcd1
1420 // 047c 16fd 0002 si @DMBL, #0x0002
1422 // 047e 16fb 0001 si @DIRQ, #0x0001
1424 0480 029f 0c91 jmp 0x0c91
1428 // 0482 029f 0045 jmp 0x0045
1429 goto GetNextCmdBlock;
1431 // Called by cmds 4 5 9
1432 // IX2 is always modified before calling...
1435 0485 191f lrri $AC1.M, @$AR0
1436 0486 191d lrri $AC1.L, @$AR0
1437 0487 1f5f mrr $AX0.H, $AC1.M
1438 0488 1f1d mrr $AX0.L, $AC1.L
1439 0489 2fce srs @DSMAH, $AC1.M
1440 048a 2dcf srs @DSMAL, $AC1.L
1442 048c 1fa6 mrr $AC1.L, $IX2
1443 048d 2dcd srs @DSPA, $AC1.L
1444 048e 0e00 lris $AC0.M, #0x00
1445 048f 2ec9 srs @DSCR, $AC0.M
1447 0491 009c 00c0 lri $AC0.L, #0x00c0
1448 0493 2ccb srs @DSBL, $AC0.L
1449 0494 1ca0 mrr $IX1, $AR0
1450 0495 0081 0e44 lri $AR1, #0x0e44
1451 0497 4800 addax $ACC0, $AX0
1452 0498 1b3e srri @$AR1, $AC0.M
1453 0499 1b3c srri @$AR1, $AC0.L
1454 049a 0b00 lris $AX1.H, #0x00
1455 049b 0099 0060 lri $AX1.L, #0x0060
1456 049d 4b00 addax $ACC1, $AX1
1457 049e 1b3d srri @$AR1, $AC1.L
1458 049f 0081 0e44 lri $AR1, #0x0e44
1459 04a1 1c06 mrr $AR0, $IX2
1460 04a2 0083 0000 lri $AR3, #0x0000
1461 04a4 1c43 mrr $AR2, $AR3
1463 04a5 27c9 lrs $AC1.M, @DSCR
1464 04a6 03a0 0004 andf $AC1.M, #0x0004
1465 04a8 029c 04a5 jlnz 0x04a5
1467 04aa 1109 04da bloopi #0x09, 0x04da
1469 04ad 193a lrri $AX0.H, @$AR1
1470 04ae 1938 lrri $AX0.L, @$AR1
1471 04af 6900 movax $ACC1, $AX0
1472 04b0 2fce srs @DSMAH, $AC1.M
1473 04b1 2dcf srs @DSMAL, $AC1.L
1475 04b3 193d lrri $AC1.L, @$AR1
1476 04b4 2dcd srs @DSPA, $AC1.L
1477 04b5 16c9 0000 si @DSCR, #0x0000
1479 04b8 009c 00c0 lri $AC0.L, #0x00c0
1480 04ba 2ccb srs @DSBL, $AC0.L
1481 04bb 0081 0e44 lri $AR1, #0x0e44
1482 04bd 4800 addax $ACC0, $AX0
1483 04be 1b3e srri @$AR1, $AC0.M
1484 04bf 1b3c srri @$AR1, $AC0.L
1485 04c0 0b00 lris $AX1.H, #0x00
1486 04c1 0960 lris $AX1.L, #0x60
1487 04c2 4b00 addax $ACC1, $AX1
1488 04c3 1b3d srri @$AR1, $AC1.L
1489 04c4 0081 0e44 lri $AR1, #0x0e44
1491 04c7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1492 04c8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
1493 04c9 6a00 movax $ACC0, $AX1
1494 04ca 4800 addax $ACC0, $AX0
1495 04cb 1117 04d4 bloopi #0x17, 0x04d4
1496 04cd 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1497 04ce 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
1498 04cf 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
1499 04d0 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
1500 04d1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1501 04d2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
1502 04d3 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M
1503 04d4 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L
1504 04d5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1505 04d6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
1506 04d7 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
1507 04d8 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
1508 04d9 1b5f srri @$AR2, $AC1.M
1509 04da 1b5d srri @$AR2, $AC1.L
1511 04db 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1512 04dc 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
1513 04dd 6a00 movax $ACC0, $AX1
1514 04de 4800 addax $ACC0, $AX0
1516 04df 1117 04e8 bloopi #0x17, 0x04e8
1517 04e1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1518 04e2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
1519 04e3 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
1520 04e4 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
1521 04e5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1522 04e6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
1523 04e7 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M
1524 04e8 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L
1526 04e9 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1527 04ea 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
1528 04eb 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
1529 04ec 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
1530 04ed 1b5f srri @$AR2, $AC1.M
1531 04ee 1b5d srri @$AR2, $AC1.L
1532 04ef 1c05 mrr $AR0, $IX1
1536 // Only called by Command 1
1538 // AX1.L = unkForMulBuffer1
1539 // AR1 = unkForMulBuffer2
1540 void Unk(maddr, unkForMulBuffer1, unkForMulBuffer2) {
1543 // 04f2 009b 0e44 lri $AX1.H, #0x0e44
1544 // 04f4 009d 00c0 lri $AC1.L, #0x00c0
1545 // 04f6 02bf 0541 call 0x0541
1547 const u16 dma_len = 0x00c0
1548 DMA_CPUToDMEM(maddr, daddr, dma_len);
1550 // 04f8 4900 addax $ACC1, $AX0
1551 // 04f9 00ff 0e1d sr @0x0e1d, $AC1.M
1552 // 04fb 00fd 0e1e sr @0x0e1e, $AC1.L
1553 // 04fd 8900 clr $ACC1
1556 // 04fe 02bf 055c call 0x055c
1559 // 0500 1104 052c bloopi #0x04, 0x052c
1560 for (u8 i = 0; i < 4; i++) {
1561 // 0502 00da 0e1d lr $AX0.H, @0x0e1d // restore
1562 // 0504 00d8 0e1e lr $AX0.L, @0x0e1e // restore
1563 // 0506 009b 0ea4 lri $AX1.H, #0x0ea4 // buffer 2
1564 // 0508 009d 00c0 lri $AC1.L, #0x00c0 // restore
1565 // 050a 02bf 0541 call 0x0541
1567 DMA_CPUToDMEM(maddr, daddr, dma_len);
1569 // 050c 4900 addax $ACC1, $AX0
1570 // 050d 00ff 0e1d sr @0x0e1d, $AC1.M // update
1571 // 050f 00fd 0e1e sr @0x0e1e, $AC1.L
1574 // 0511 0083 0e44 lri $AR3, #0x0e44
1575 // 0513 02bf 054c call 0x054c
1576 UnknownMulBuffer(0x0e44);
1578 // 0515 8900 clr $ACC1
1579 // 0516 00da 0e1d lr $AX0.H, @0x0e1d // restore
1580 // 0518 00d8 0e1e lr $AX0.L, @0x0e1e // restore
1581 // 051a 009b 0e44 lri $AX1.H, #0x0e44 // buffer 1
1582 // 051c 009d 00c0 lri $AC1.L, #0x00c0 // restore
1583 // 051e 02bf 0541 call 0x0541
1585 DMA_CPUToDMEM(maddr, daddr, dma_len);
1587 // 0520 4900 addax $ACC1, $AX0
1588 // 0521 00ff 0e1d sr @0x0e1d, $AC1.M // update
1589 // 0523 00fd 0e1e sr @0x0e1e, $AC1.L
1592 // 0525 0083 0ea4 lri $AR3, #0x0ea4 // buffer 2
1593 // 0527 02bf 054c call 0x054c
1594 UnknownMulBuffer(0x0ea4);
1598 // 052b 8e00 set16 // restore
1599 // 052c 8900 clr $ACC1
1602 // 052d 00da 0e1d lr $AX0.H, @0x0e1d // restore
1603 // 052f 00d8 0e1e lr $AX0.L, @0x0e1e // restore
1604 // 0531 009b 0ea4 lri $AX1.H, #0x0ea4 // buffer 2
1605 // 0533 009d 00c0 lri $AC1.L, #0x00c0 // restore
1606 // 0535 02bf 0541 call 0x0541
1607 DMA_CPUToDMEM(maddr, daddr, dma_len);
1609 // 0537 4900 addax $ACC1, $AX0
1612 // 0538 0083 0e44 lri $AR3, #0x0e44 // buffer 1
1613 // 053a 02bf 054c call 0x054c
1614 UnknownMulBuffer(0x0e44);
1616 // 053c 0083 0ea4 lri $AR3, #0x0ea4 // buffer 2
1617 // 053e 02bf 054c call 0x054c
1618 UnknownMulBuffer(0x0ea4);
1624 // u16 daddr = AX1.H
1626 // Only transfers from CPU -> DMEM
1627 void DMA_CPUToDMEM() {
1629 0542 00fa ffce sr @DSMAH, $AX0.H
1630 0544 00f8 ffcf sr @DSMAL, $AX0.L
1631 0546 00fb ffcd sr @DSPA, $AX1.H
1632 0548 16c9 0000 si @DSCR, #0x0000
1633 054a 2dcb srs @DSBL, $AC1.L
1638 // AX1.L = unkForMulBuffer1 (next value in cmd block)
1639 // AR1 = unkForMulBuffer2 (0, 0x0400, then 0x07c0)
1640 // AR3 is some buffer, either 0x0e44 or 0x0ea4
1641 void UnknownMulBuffer() {
1642 054c 8f00 set40 // Loaded ACx.M values extend to the entire ACC
1643 054d 8d00 set15 // multiplicands unsigned
1644 054e 8a00 m2 // mul results doubled
1646 // 054f 197a lrri $AX0.H, @$AR3
1647 // 0550 1978 lrri $AX0.L, @$AR3
1651 // 0551 a000 mulx $AX0.L, $AX1.L
1652 // 0552 b600 mulxmv $AX0.H, $AX1.L, $ACC0
1653 ACC0 = (u16)AX0.L * (u16)unkForMulBuffer1 * 2
1654 PROD = (u16)AX0.H * (u16)unkForMulBuffer1 * 2
1656 // 0553 1130 055a bloopi #0x30, 0x055a
1657 for (int i=0; i<48; i++) {
1658 // 0555 9179 asr16'l $ACC0 : $AC1.M, @$AR1
1660 AC1.M = *(unkForMulBuffer2++)
1662 // 0556 4e6d addp'ln $ACC0 : $AC1.L, @$AR1
1664 AC1.L = *unkForMulBuffer2
1665 unkForMulBuffer2 -= 1
1667 // 0557 197a lrri $AX0.H, @$AR3
1670 // 0558 4d43 add'l $ACC1, $ACC0 : $AX0.L, @$AR3
1674 // 0559 a039 mulx's $AX0.L, $AX1.L : @$AR1, $AC1.M
1675 // 055a b629 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR1, $AC1.L
1676 ACC0 = (u16)AX0.L * (u16)unkForMulBuffer1 * 2
1677 *(unkForMulBuffer2++) = AC1.M
1678 PROD = (u16)AX0.H * (u16)unkForMulBuffer1 * 2
1679 *(unkForMulBuffer2++) = AC1.L
1686 // 055c 26c9 lrs $AC0.M, @DSCR
1687 // 055d 02a0 0004 andf $AC0.M, #0x0004
1688 // 055f 029c 055c jlnz 0x055c
1695 // All apparently unused?
1696 void WaitForCPUMailbox() {
1697 0562 26fe lrs $AC0.M, @CMBH
1698 0563 02c0 8000 andcf $AC0.M, #0x8000
1699 0565 029c 0562 jlnz 0x0562
1702 void WaitForDSPMailbox1() {
1703 0568 26fc lrs $AC0.M, @DMBH
1704 0569 02a0 8000 andf $AC0.M, #0x8000
1705 056b 029c 0568 jlnz 0x0568
1708 void WaitForDSPMailbox2() {
1709 056e 26fc lrs $AC0.M, @DMBH
1710 056f 02a0 8000 andf $AC0.M, #0x8000
1711 0571 029c 056e jlnz 0x056e
1716 // 0574 8100 clr $ACC0
1717 // 0575 8970 clr'l $ACC1 : $AC0.M, @$AR0
1718 // 0576 8e60 set16'l : $AC0.L, @$AR0
1719 u16 maddrh = *(CmdBlockBuf++)
1720 u16 maddrl = *(CmdBlockBuf++)
1722 // 0577 2ece srs @DSMAH, $AC0.M
1723 // 0578 2ccf srs @DSMAL, $AC0.L
1724 // 0579 16cd 0e44 si @DSPA, #0x0e44
1725 // 057b 16c9 0000 si @DSCR, #0x0000
1726 // 057d 8900 clr $ACC1
1727 // 057e 0d20 lris $AC1.L, #0x20
1730 // 057f 2dcb srs @DSBL, $AC1.L
1731 // DMA 32bytes from CPU @ maddr -> DMEM @ 0x0e44
1733 // 0580 4c00 add $ACC0, $ACC1
1736 // Push CmdBlockBuf ptr
1737 0581 1c80 mrr $IX0, $AR0
1739 // 0582 0080 0280 lri $AR0, #0x0280
1740 // 0584 0081 0000 lri $AR1, #0x0000
1741 // 0586 0082 0140 lri $AR2, #0x0140
1742 // 0588 0083 0e44 lri $AR3, #0x0e44
1743 u16* unk_buf1 = 0x0280
1744 u16* unk_buf2 = 0x0000
1745 u16* unk_buf3 = 0x0140
1746 u16* dmem_buf = 0x0e44
1748 // 058a 0a00 lris $AX0.H, #0x00
1749 const u16 null = 0 // Guess is that it's faster to use AXx instead of imm value?
1751 // 058b 27c9 lrs $AC1.M, @DSCR
1752 // 058c 03a0 0004 andf $AC1.M, #0x0004
1753 // 058e 029c 058b jlnz 0x058b
1754 while (@DSCR & 4); // Wait for DMA completion
1756 // 0590 2ece srs @DSMAH, $AC0.M
1757 // 0591 2ccf srs @DSMAL, $AC0.L
1758 // 0592 16cd 0e54 si @DSPA, #0x0e54
1759 // 0594 16c9 0000 si @DSCR, #0x0000
1760 // 0596 16cb 0260 si @DSBL, #0x0260
1762 // DMA 0x0260bytes from CPU @ maddr -> DMEM @ 0x0e54
1763 // No waiting for DMA
1765 // 0598 009f 00a0 lri $AC1.M, #0x00a0
1768 // accum loads in the loop are 40bit
1771 // 059b 007f 05a4 bloop $AC1.M, 0x05a4
1772 for (int i = 0; i < size; i++) {
1773 // !!! Doesn't make sense with current understanding of set40
1774 059d 197e lrri $AC0.M, @$AR3
1775 059e 1b1a srri @$AR0, $AX0.H
1776 059f 197c lrri $AC0.L, @$AR3
1777 05a0 1b1a srri @$AR0, $AX0.H
1778 05a1 1b5e srri @$AR2, $AC0.M
1779 05a2 1b5c srri @$AR2, $AC0.L
1780 05a3 1b3e srri @$AR1, $AC0.M
1781 05a4 1b3c srri @$AR1, $AC0.L
1784 // Pop CmdBlockBuf ptr
1785 05a5 1c04 mrr $AR0, $IX0
1787 // 05a6 029f 0068 jmp 0x0068
1791 # Following 3 funcs are the SRCs to select from, in order
1793 void SRC_Polyphase() {
1794 // Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs
1795 // 05a8 0082 0bb8 lri $AR2, #0x0bb8
1796 // 05aa 195e lrri $AC0.M, @$AR2
1797 // 05ab 2ed1 srs @SampleFormat, $AC0.M
1798 // 05ac 195e lrri $AC0.M, @$AR2
1799 // 05ad 2ed4 srs @ACSAH, $AC0.M
1800 // 05ae 195e lrri $AC0.M, @$AR2
1801 // 05af 2ed5 srs @ACSAL, $AC0.M
1802 // 05b0 195e lrri $AC0.M, @$AR2
1803 // 05b1 2ed6 srs @ACEAH, $AC0.M
1804 // 05b2 195e lrri $AC0.M, @$AR2
1805 // 05b3 2ed7 srs @ACEAL, $AC0.M
1806 // 05b4 195e lrri $AC0.M, @$AR2
1807 // 05b5 2ed8 srs @ACCAH, $AC0.M
1808 // 05b6 195e lrri $AC0.M, @$AR2
1809 // 05b7 2ed9 srs @ACCAL, $AC0.M
1810 // 05b8 195e lrri $AC0.M, @$AR2
1811 // 05b9 2ea0 srs @COEF_A1_0, $AC0.M
1812 // 05ba 195e lrri $AC0.M, @$AR2
1813 // 05bb 2ea1 srs @COEF_A2_0, $AC0.M
1814 // 05bc 195e lrri $AC0.M, @$AR2
1815 // 05bd 2ea2 srs @COEF_A1_1, $AC0.M
1816 // 05be 195e lrri $AC0.M, @$AR2
1817 // 05bf 2ea3 srs @COEF_A2_1, $AC0.M
1818 // 05c0 195e lrri $AC0.M, @$AR2
1819 // 05c1 2ea4 srs @COEF_A1_2, $AC0.M
1820 // 05c2 195e lrri $AC0.M, @$AR2
1821 // 05c3 2ea5 srs @COEF_A2_2, $AC0.M
1822 // 05c4 195e lrri $AC0.M, @$AR2
1823 // 05c5 2ea6 srs @COEF_A1_3, $AC0.M
1824 // 05c6 195e lrri $AC0.M, @$AR2
1825 // 05c7 2ea7 srs @COEF_A2_3, $AC0.M
1826 // 05c8 195e lrri $AC0.M, @$AR2
1827 // 05c9 2ea8 srs @COEF_A1_4, $AC0.M
1828 // 05ca 195e lrri $AC0.M, @$AR2
1829 // 05cb 2ea9 srs @COEF_A2_4, $AC0.M
1830 // 05cc 195e lrri $AC0.M, @$AR2
1831 // 05cd 2eaa srs @COEF_A1_5, $AC0.M
1832 // 05ce 195e lrri $AC0.M, @$AR2
1833 // 05cf 2eab srs @COEF_A2_5, $AC0.M
1834 // 05d0 195e lrri $AC0.M, @$AR2
1835 // 05d1 2eac srs @COEF_A1_6, $AC0.M
1836 // 05d2 195e lrri $AC0.M, @$AR2
1837 // 05d3 2ead srs @COEF_A2_6, $AC0.M
1838 // 05d4 195e lrri $AC0.M, @$AR2
1839 // 05d5 2eae srs @COEF_A1_7, $AC0.M
1840 // 05d6 195e lrri $AC0.M, @$AR2
1841 // 05d7 2eaf srs @COEF_A2_7, $AC0.M
1842 // 05d8 195e lrri $AC0.M, @$AR2
1843 // 05d9 2ede srs @GAIN, $AC0.M
1844 // 05da 195e lrri $AC0.M, @$AR2
1845 // 05db 2eda srs @scale, $AC0.M
1846 // 05dc 195e lrri $AC0.M, @$AR2
1847 // 05dd 2edb srs @yn1, $AC0.M
1848 // 05de 195e lrri $AC0.M, @$AR2
1849 // 05df 2edc srs @yn2, $AC0.M
1854 05e3 00d8 0e16 lr $AX0.L, @0x0e16
1855 05e5 195b lrri $AX1.H, @$AR2
1856 05e6 1959 lrri $AX1.L, @$AR2
1858 05e8 195c lrri $AC0.L, @$AR2
1859 05e9 0080 0e44 lri $AR0, #0x0e44
1860 05eb 195f lrri $AC1.M, @$AR2
1861 05ec 1b1f srri @$AR0, $AC1.M
1862 05ed 195f lrri $AC1.M, @$AR2
1863 05ee 1b1f srri @$AR0, $AC1.M
1864 05ef 195f lrri $AC1.M, @$AR2
1865 05f0 1b1f srri @$AR0, $AC1.M
1866 05f1 185f lrr $AC1.M, @$AR2
1867 05f2 1b1f srri @$AR0, $AC1.M
1868 05f3 6b00 movax $ACC1, $AX1
1869 05f4 1505 lsl $ACC1, #5
1870 05f5 4d00 add $ACC1, $ACC0
1871 05f6 157e lsr $ACC1, #-2
1872 05f7 1c9f mrr $IX0, $AC1.M
1873 05f8 1cbd mrr $IX1, $AC1.L
1874 05f9 05e0 addis $AC1.M, #0xe0
1875 05fa 9900 asr16 $ACC1
1877 05fc 1cdd mrr $IX2, $AC1.L
1879 05fe 1fa5 mrr $AC1.L, $IX1
1880 05ff 1502 lsl $ACC1, #2
1881 0600 1cbf mrr $IX1, $AC1.M
1882 0601 009a 01fc lri $AX0.H, #0x01fc
1883 0603 009e 0e44 lri $AC0.M, #0x0e44
1884 0605 0081 ffdd lri $AR1, #0xffdd
1885 0607 0083 0d80 lri $AR3, #0x0d80
1886 0609 0064 061a bloop $IX0, 0x061a
1887 060b 1827 lrr $IX3, @$AR1
1888 060c 1b07 srri @$AR0, $IX3
1889 060d 4a00 addax $ACC0, $AX1
1890 060e 1ffc mrr $AC1.M, $AC0.L
1891 060f 1827 lrr $IX3, @$AR1
1892 0610 1b07 srri @$AR0, $IX3
1893 0611 1579 lsr $ACC1, #-7
1894 0612 3500 andr $AC1.M, $AX0.H
1895 0613 1827 lrr $IX3, @$AR1
1896 0614 1b07 srri @$AR0, $IX3
1897 0615 4100 addr $ACC1, $AX0.L
1898 0616 1b7e srri @$AR3, $AC0.M
1899 0617 1827 lrr $IX3, @$AR1
1900 0618 1b07 srri @$AR0, $IX3
1901 0619 1b7f srri @$AR3, $AC1.M
1904 061b 0065 0620 bloop $IX1, 0x0620
1905 061d 1827 lrr $IX3, @$AR1
1906 061e 1b07 srri @$AR0, $IX3
1911 0622 187f lrr $AC1.M, @$AR3
1912 0623 0066 0629 bloop $IX2, 0x0629
1913 0625 4a3b addax's $ACC0, $AX1.L : @$AR3, $AC1.M
1914 0626 1ffc mrr $AC1.M, $AC0.L
1915 0627 1579 lsr $ACC1, #-7
1916 0628 3533 andr's $AC1.M, $AX0.H : @$AR3, $AC0.M
1917 0629 4100 addr $ACC1, $AX0.L
1919 062a 1b7f srri @$AR3, $AC1.M
1921 062c 189f lrrd $AC1.M, @$AR0
1922 062d 1adf srrd @$AR2, $AC1.M
1923 062e 189f lrrd $AC1.M, @$AR0
1924 062f 1adf srrd @$AR2, $AC1.M
1925 0630 189f lrrd $AC1.M, @$AR0
1926 0631 1adf srrd @$AR2, $AC1.M
1927 0632 189f lrrd $AC1.M, @$AR0
1928 0633 1adf srrd @$AR2, $AC1.M
1929 0634 1adc srrd @$AR2, $AC0.L
1930 0635 0082 0bd2 lri $AR2, #0x0bd2
1931 0637 27dc lrs $AC1.M, @yn2
1932 0638 1adf srrd @$AR2, $AC1.M
1933 0639 27db lrs $AC1.M, @yn1
1934 063a 1adf srrd @$AR2, $AC1.M
1935 063b 27da lrs $AC1.M, @scale
1936 063c 1adf srrd @$AR2, $AC1.M
1937 063d 0082 0bbe lri $AR2, #0x0bbe
1938 063f 27d9 lrs $AC1.M, @ACCAL
1939 0640 1adf srrd @$AR2, $AC1.M
1940 0641 27d8 lrs $AC1.M, @ACCAH
1941 0642 1adf srrd @$AR2, $AC1.M
1943 0644 00c1 0e42 lr $AR1, @0x0e42
1944 0646 0082 0d80 lri $AR2, #0x0d80
1945 0648 1940 lrri $AR0, @$AR2
1946 0649 1943 lrri $AR3, @$AR2
1947 064a 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
1948 064b b8c0 mulx'ld $AX0.H, $AX1.H : $AX0.L, $AX1.L, @$AR0
1949 064c 111f 0654 bloopi #0x1f, 0x0654
1950 064e a6f0 mulxmv'ld $AX0.L, $AX1.L, $ACC0 : $AX0.H, $AX1.H, @$AR0
1951 064f bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0
1952 0650 1940 lrri $AR0, @$AR2
1953 0651 1943 lrri $AR3, @$AR2
1954 0652 bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0
1955 0653 4ec0 addp'ld $ACC0 : $AX0.L, $AX1.L, @$AR0
1956 0654 b831 mulx's $AX0.H, $AX1.H : @$AR1, $AC0.M
1958 0655 a6f0 mulxmv'ld $AX0.L, $AX1.L, $ACC0 : $AX0.H, $AX1.H, @$AR0
1959 0656 bcf0 mulxac'ld $AX0.H, $AX1.H, $ACC0 : $AX0.H, $AX1.H, @$AR0
1960 0657 bc00 mulxac $AX0.H, $AX1.H, $ACC0
1961 0658 4e00 addp $ACC0
1962 0659 1b3e srri @$AR1, $AC0.M
1963 065a 00e1 0e42 sr @0x0e42, $AR1
1969 // Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs
1970 // 065d 0082 0bb8 lri $AR2, #0x0bb8
1971 // 065f 195e lrri $AC0.M, @$AR2
1972 // 0660 2ed1 srs @SampleFormat, $AC0.M
1973 // 0661 195e lrri $AC0.M, @$AR2
1974 // 0662 2ed4 srs @ACSAH, $AC0.M
1975 // 0663 195e lrri $AC0.M, @$AR2
1976 // 0664 2ed5 srs @ACSAL, $AC0.M
1977 // 0665 195e lrri $AC0.M, @$AR2
1978 // 0666 2ed6 srs @ACEAH, $AC0.M
1979 // 0667 195e lrri $AC0.M, @$AR2
1980 // 0668 2ed7 srs @ACEAL, $AC0.M
1981 // 0669 195e lrri $AC0.M, @$AR2
1982 // 066a 2ed8 srs @ACCAH, $AC0.M
1983 // 066b 195e lrri $AC0.M, @$AR2
1984 // 066c 2ed9 srs @ACCAL, $AC0.M
1985 // 066d 195e lrri $AC0.M, @$AR2
1986 // 066e 2ea0 srs @COEF_A1_0, $AC0.M
1987 // 066f 195e lrri $AC0.M, @$AR2
1988 // 0670 2ea1 srs @COEF_A2_0, $AC0.M
1989 // 0671 195e lrri $AC0.M, @$AR2
1990 // 0672 2ea2 srs @COEF_A1_1, $AC0.M
1991 // 0673 195e lrri $AC0.M, @$AR2
1992 // 0674 2ea3 srs @COEF_A2_1, $AC0.M
1993 // 0675 195e lrri $AC0.M, @$AR2
1994 // 0676 2ea4 srs @COEF_A1_2, $AC0.M
1995 // 0677 195e lrri $AC0.M, @$AR2
1996 // 0678 2ea5 srs @COEF_A2_2, $AC0.M
1997 // 0679 195e lrri $AC0.M, @$AR2
1998 // 067a 2ea6 srs @COEF_A1_3, $AC0.M
1999 // 067b 195e lrri $AC0.M, @$AR2
2000 // 067c 2ea7 srs @COEF_A2_3, $AC0.M
2001 // 067d 195e lrri $AC0.M, @$AR2
2002 // 067e 2ea8 srs @COEF_A1_4, $AC0.M
2003 // 067f 195e lrri $AC0.M, @$AR2
2004 // 0680 2ea9 srs @COEF_A2_4, $AC0.M
2005 // 0681 195e lrri $AC0.M, @$AR2
2006 // 0682 2eaa srs @COEF_A1_5, $AC0.M
2007 // 0683 195e lrri $AC0.M, @$AR2
2008 // 0684 2eab srs @COEF_A2_5, $AC0.M
2009 // 0685 195e lrri $AC0.M, @$AR2
2010 // 0686 2eac srs @COEF_A1_6, $AC0.M
2011 // 0687 195e lrri $AC0.M, @$AR2
2012 // 0688 2ead srs @COEF_A2_6, $AC0.M
2013 // 0689 195e lrri $AC0.M, @$AR2
2014 // 068a 2eae srs @COEF_A1_7, $AC0.M
2015 // 068b 195e lrri $AC0.M, @$AR2
2016 // 068c 2eaf srs @COEF_A2_7, $AC0.M
2017 // 068d 195e lrri $AC0.M, @$AR2
2018 // 068e 2ede srs @GAIN, $AC0.M
2019 // 068f 195e lrri $AC0.M, @$AR2
2020 // 0690 2eda srs @scale, $AC0.M
2021 // 0691 195e lrri $AC0.M, @$AR2
2022 // 0692 2edb srs @yn1, $AC0.M
2023 // 0693 195e lrri $AC0.M, @$AR2
2024 // 0694 2edc srs @yn2, $AC0.M
2026 // 0695 8c00 clr15 // signed mulx
2027 // 0696 8a00 m2 // *2
2028 // 0697 8e00 set16 // no sign extend
2030 // 0698 195b lrri $AX1.H, @$AR2
2031 // 0699 1959 lrri $AX1.L, @$AR2
2032 // 069a 8100 clr $ACC0
2033 // 069b 195c lrri $AC0.L, @$AR2
2034 // 069c 0080 0e44 lri $AR0, #0x0e44
2035 // 069e 195f lrri $AC1.M, @$AR2
2036 // 069f 195f lrri $AC1.M, @$AR2
2037 // 06a0 195f lrri $AC1.M, @$AR2
2038 // 06a1 1b1f srri @$AR0, $AC1.M
2040 AX1.H = pb.src.ratioHi
2041 AX1.L = pb.src.ratioLo
2042 AC0.L = pb.src.currentAddressFrac
2043 AC1.M = pb.src.last_samples[2]
2045 *0x0e44 = pb.src.last_samples[2]
2046 *0x0e45 = pb.src.last_samples[3]
2048 // 06a2 185f lrr $AC1.M, @$AR2
2049 // 06a3 1b1f srri @$AR0, $AC1.M
2050 // 06a4 6b00 movax $ACC1, $AX1
2051 // 06a5 1505 lsl $ACC1, #5
2052 // 06a6 4d00 add $ACC1, $ACC0
2053 // 06a7 157e lsr $ACC1, #-2
2054 // 06a8 1c9f mrr $IX0, $AC1.M
2055 // 06a9 1cbd mrr $IX1, $AC1.L
2056 ACC1 = (pb.src.currentAddressFrac + (pb.src.ratio << 5)) >> 2
2058 IX1 = ((ACC1 & 0xffff) & 0xc000) >> 14
2059 IX2 = ~((ACC1 >> 16) - 32)
2062 AR1 = 0xffdd // DSP_ACCELERATOR
2065 // 06aa 05e0 addis $AC1.M, #0xe0
2066 // 06ab 9900 asr16 $ACC1
2067 // 06ac 7d00 neg $ACC1
2068 // 06ad 1cdd mrr $IX2, $AC1.L
2069 // 06ae 8900 clr $ACC1
2070 // 06af 1fa5 mrr $AC1.L, $IX1
2071 // 06b0 1502 lsl $ACC1, #2
2072 // 06b1 1cbf mrr $IX1, $AC1.M
2073 // 06b2 009a 01fc lri $AX0.H, #0x01fc
2074 // 06b4 009e 0e45 lri $AC0.M, #0x0e45
2075 // 06b6 0081 ffdd lri $AR1, #0xffdd
2076 // 06b8 0083 0d80 lri $AR3, #0x0d80
2077 // 06ba 0064 06cb bloop $IX0, 0x06cb
2078 // 06bc 1827 lrr $IX3, @$AR1
2079 // 06bd 1b07 srri @$AR0, $IX3
2080 // 06be 4a00 addax $ACC0, $AX1
2081 // 06bf 1b7e srri @$AR3, $AC0.M
2082 // 06c0 1827 lrr $IX3, @$AR1
2083 // 06c1 1b07 srri @$AR0, $IX3
2084 // 06c2 1b7c srri @$AR3, $AC0.L
2086 // 06c4 1827 lrr $IX3, @$AR1
2087 // 06c5 1b07 srri @$AR0, $IX3
2090 // 06c8 1827 lrr $IX3, @$AR1
2091 // 06c9 1b07 srri @$AR0, $IX3
2094 ACCO = (0x0e45 << 16) + pb.src.currentAddressFrac
2095 for (i = 0; i < IX0; i++) {
2096 ACC0 += pb.src.ratio
2097 *(0x0d80++) = ACC0 >> 16
2098 *(0x0d80++) = ACC0 & 0xffff
2099 *(0x0e46++) = *DSP_ACCELERATOR
2100 *(0x0e46++) = *DSP_ACCELERATOR
2101 *(0x0e46++) = *DSP_ACCELERATOR
2102 *(0x0e46++) = *DSP_ACCELERATOR
2105 // 06cc 0065 06d1 bloop $IX1, 0x06d1
2106 // 06ce 1827 lrr $IX3, @$AR1
2107 // 06cf 1b07 srri @$AR0, $IX3
2110 for (i = 0; i < IX1; i++) {
2111 *(0x0e46++) = *DSP_ACCELERATOR
2114 // 06d2 0066 06d6 bloop $IX2, 0x06d6
2115 // 06d4 4a00 addax $ACC0, $AX1
2116 // 06d5 1b7e srri @$AR3, $AC0.M
2117 // 06d6 1b7c srri @$AR3, $AC0.L
2118 for (i = 0; i < IX2; i++) {
2119 ACC0 += pb.src.ratio
2120 *(0x0d80++) = ACC0 >> 16
2121 *(0x0d80++) = ACC0 & 0xffff
2124 // 06d7 0004 dar $AR0
2125 // 06d8 189f lrrd $AC1.M, @$AR0
2126 // 06d9 1adf srrd @$AR2, $AC1.M
2127 // 06da 189f lrrd $AC1.M, @$AR0
2128 // 06db 1adf srrd @$AR2, $AC1.M
2129 // 06dc 189f lrrd $AC1.M, @$AR0
2130 // 06dd 1adf srrd @$AR2, $AC1.M
2131 // 06de 189f lrrd $AC1.M, @$AR0
2132 // 06df 1adf srrd @$AR2, $AC1.M
2133 // 06e0 1adc srrd @$AR2, $AC0.L
2135 pb.src.last_samples[3] = *(0x0e46--)
2136 pb.src.last_samples[2] = *(0x0e46--)
2137 pb.src.last_samples[1] = *(0x0e46--)
2138 pb.src.last_samples[0] = *(0x0e46--)
2139 pb.src.currentAddressFrac = ACC0 & 0xffff
2141 // 06e1 0082 0bd2 lri $AR2, #0x0bd2
2142 // 06e3 27dc lrs $AC1.M, @yn2
2143 // 06e4 1adf srrd @$AR2, $AC1.M
2144 // 06e5 27db lrs $AC1.M, @yn1
2145 // 06e6 1adf srrd @$AR2, $AC1.M
2146 // 06e7 27da lrs $AC1.M, @scale
2147 // 06e8 1adf srrd @$AR2, $AC1.M
2148 // 06e9 0082 0bbe lri $AR2, #0x0bbe
2149 // 06eb 27d9 lrs $AC1.M, @ACCAL
2150 // 06ec 1adf srrd @$AR2, $AC1.M
2151 // 06ed 27d8 lrs $AC1.M, @ACCAH
2152 // 06ee 1adf srrd @$AR2, $AC1.M
2155 pb.adpm.pred_scale = *scale
2156 pb.addr.currentAddressLo = *ACCAL // Current playback position
2157 pb.addr.currentAddressHi = *ACCAH
2159 06ef 8d00 set15 // unsigned mulx
2160 06f0 8b00 m0 // no *2
2161 06f1 8f00 set40 // sign extend
2162 06f2 00c1 0e42 lr $AR1, @0x0e42
2163 06f4 0082 0d80 lri $AR2, #0x0d80
2165 06f7 1120 0703 bloopi #0x20, 0x0703
2167 06fa 1940 lrri $AR0, @$AR2
2168 06fb 189e lrrd $AC0.M, @$AR0
2169 06fc 181b lrr $AX1.H, @$AR0
2170 06fd 199a lrrn $AX0.H, @$AR0
2171 06fe 5400 subr $ACC0, $AX0.H
2172 06ff 1f5e mrr $AX0.H, $AC0.M
2173 0700 1959 lrri $AX1.L, @$AR2
2174 0701 b000 mulx $AX0.H, $AX1.L
2175 0702 fb00 addpaxz $ACC1, $AX1
2176 0703 8139 clr's $ACC0 : @$AR1, $AC1.M
2178 0704 00e1 0e42 sr @0x0e42, $AR1
2184 // Copy pb's data [pb.addr.format to pb.adpm.yn2] to corresponding hw regs
2185 // 0707 0082 0bb8 lri $AR2, #0x0bb8
2186 // 0709 195e lrri $AC0.M, @$AR2
2187 // 070a 2ed1 srs @SampleFormat, $AC0.M
2188 // 070b 195e lrri $AC0.M, @$AR2
2189 // 070c 2ed4 srs @ACSAH, $AC0.M
2190 // 070d 195e lrri $AC0.M, @$AR2
2191 // 070e 2ed5 srs @ACSAL, $AC0.M
2192 // 070f 195e lrri $AC0.M, @$AR2
2193 // 0710 2ed6 srs @ACEAH, $AC0.M
2194 // 0711 195e lrri $AC0.M, @$AR2
2195 // 0712 2ed7 srs @ACEAL, $AC0.M
2196 // 0713 195e lrri $AC0.M, @$AR2
2197 // 0714 2ed8 srs @ACCAH, $AC0.M
2198 // 0715 195e lrri $AC0.M, @$AR2
2199 // 0716 2ed9 srs @ACCAL, $AC0.M
2200 // 0717 195e lrri $AC0.M, @$AR2
2201 // 0718 2ea0 srs @COEF_A1_0, $AC0.M
2202 // 0719 195e lrri $AC0.M, @$AR2
2203 // 071a 2ea1 srs @COEF_A2_0, $AC0.M
2204 // 071b 195e lrri $AC0.M, @$AR2
2205 // 071c 2ea2 srs @COEF_A1_1, $AC0.M
2206 // 071d 195e lrri $AC0.M, @$AR2
2207 // 071e 2ea3 srs @COEF_A2_1, $AC0.M
2208 // 071f 195e lrri $AC0.M, @$AR2
2209 // 0720 2ea4 srs @COEF_A1_2, $AC0.M
2210 // 0721 195e lrri $AC0.M, @$AR2
2211 // 0722 2ea5 srs @COEF_A2_2, $AC0.M
2212 // 0723 195e lrri $AC0.M, @$AR2
2213 // 0724 2ea6 srs @COEF_A1_3, $AC0.M
2214 // 0725 195e lrri $AC0.M, @$AR2
2215 // 0726 2ea7 srs @COEF_A2_3, $AC0.M
2216 // 0727 195e lrri $AC0.M, @$AR2
2217 // 0728 2ea8 srs @COEF_A1_4, $AC0.M
2218 // 0729 195e lrri $AC0.M, @$AR2
2219 // 072a 2ea9 srs @COEF_A2_4, $AC0.M
2220 // 072b 195e lrri $AC0.M, @$AR2
2221 // 072c 2eaa srs @COEF_A1_5, $AC0.M
2222 // 072d 195e lrri $AC0.M, @$AR2
2223 // 072e 2eab srs @COEF_A2_5, $AC0.M
2224 // 072f 195e lrri $AC0.M, @$AR2
2225 // 0730 2eac srs @COEF_A1_6, $AC0.M
2226 // 0731 195e lrri $AC0.M, @$AR2
2227 // 0732 2ead srs @COEF_A2_6, $AC0.M
2228 // 0733 195e lrri $AC0.M, @$AR2
2229 // 0734 2eae srs @COEF_A1_7, $AC0.M
2230 // 0735 195e lrri $AC0.M, @$AR2
2231 // 0736 2eaf srs @COEF_A2_7, $AC0.M
2232 // 0737 195e lrri $AC0.M, @$AR2
2233 // 0738 2ede srs @GAIN, $AC0.M
2234 // 0739 195e lrri $AC0.M, @$AR2
2235 // 073a 2eda srs @scale, $AC0.M
2236 // 073b 195e lrri $AC0.M, @$AR2
2237 // 073c 2edb srs @yn1, $AC0.M
2238 // 073d 195e lrri $AC0.M, @$AR2
2239 // 073e 2edc srs @yn2, $AC0.M
2241 // 073f 00c0 0e42 lr $AR0, @0x0e42
2242 // 0741 0081 ffdd lri $AR1, #0xffdd // DSP_ACCELERATOR
2243 // 0743 1120 0748 bloopi #0x20, 0x0748
2244 // 0745 1824 lrr $IX0, @$AR1
2245 // 0746 1b04 srri @$AR0, $IX0
2248 // 0749 00e0 0e42 sr @0x0e42, $AR0
2251 for (; i < ((*0x0e42) + 0x20); i++) {
2252 *i = *DSP_ACCELERATOR
2256 // 074b 0082 0bd9 lri $AR2, #0x0bd9 // pb.src.last_samples[3]
2257 // 074d 0004 dar $AR0
2258 // 074e 189f lrrd $AC1.M, @$AR0
2259 // 074f 1adf srrd @$AR2, $AC1.M
2260 // 0750 189f lrrd $AC1.M, @$AR0
2261 // 0751 1adf srrd @$AR2, $AC1.M
2262 // 0752 189f lrrd $AC1.M, @$AR0
2263 // 0753 1adf srrd @$AR2, $AC1.M
2264 // 0754 189f lrrd $AC1.M, @$AR0
2265 // 0755 1adf srrd @$AR2, $AC1.M
2266 // 0756 8900 clr $ACC1
2267 // 0757 1adc srrd @$AR2, $AC0.L // uhhh assume AC0.L is 0?
2268 i-- // Guess that 0x0e42 points to struct of 1 pointer and 32 values
2269 pb.src.last_samples[3] = *(i--)
2270 pb.src.last_samples[2] = *(i--)
2271 pb.src.last_samples[1] = *(i--)
2272 pb.src.last_samples[0] = *(i--)
2273 pb.src.currentAddressFrac = 0
2275 // 0758 27dc lrs $AC1.M, @yn2
2276 // 0759 00ff 0bd2 sr @0x0bd2, $AC1.M
2277 // 075b 27db lrs $AC1.M, @yn1
2278 // 075c 00ff 0bd1 sr @0x0bd1, $AC1.M
2279 // 075e 27da lrs $AC1.M, @scale
2280 // 075f 00ff 0bd0 sr @0x0bd0, $AC1.M
2281 // 0761 27d9 lrs $AC1.M, @ACCAL
2282 // 0762 00ff 0bbe sr @0x0bbe, $AC1.M
2283 // 0764 27d8 lrs $AC1.M, @ACCAH
2284 // 0765 00ff 0bbd sr @0x0bbd, $AC1.M
2287 pb.adpm.pred_scale = *scale
2288 pb.addr.currentAddressLo = *ACCAL // Current playback position
2289 pb.addr.currentAddressHi = *ACCAH
2295 # From here to the jump tables, all the funcs just wrap calls to mixer(s) in IROM
2298 0768 00c0 0e40 lr $AR0, @0x0e40
2299 076a 0081 0b89 lri $AR1, #0x0b89
2300 076c 00c2 0e08 lr $AR2, @0x0e08
2301 076e 1c62 mrr $AR3, $AR2
2302 076f 00c4 0e41 lr $IX0, @0x0e41
2303 0771 00c5 0e09 lr $IX1, @0x0e09
2304 0773 02bf 80e7 call 0x80e7
2305 0775 00f8 0ba9 sr @0x0ba9, $AX0.L
2306 0777 00fb 0bac sr @0x0bac, $AX1.H
2311 077a 00c0 0e40 lr $AR0, @0x0e40
2312 077c 0081 0b89 lri $AR1, #0x0b89
2313 077e 00c2 0e08 lr $AR2, @0x0e08
2314 0780 1c62 mrr $AR3, $AR2
2315 0781 00c4 0e41 lr $IX0, @0x0e41
2316 0783 00c5 0e09 lr $IX1, @0x0e09
2317 0785 02bf 80e7 call 0x80e7
2318 0787 00f8 0ba9 sr @0x0ba9, $AX0.L
2319 0789 00fb 0bac sr @0x0bac, $AX1.H
2320 078b 00c0 0e40 lr $AR0, @0x0e40
2321 078d 0081 0b8d lri $AR1, #0x0b8d
2322 078f 00c2 0e0b lr $AR2, @0x0e0b
2323 0791 1c62 mrr $AR3, $AR2
2324 0792 00c4 0e41 lr $IX0, @0x0e41
2325 0794 00c5 0e0c lr $IX1, @0x0e0c
2326 0796 02bf 80e7 call 0x80e7
2327 0798 00f8 0baa sr @0x0baa, $AX0.L
2328 079a 00fb 0bad sr @0x0bad, $AX1.H
2333 079d 00c0 0e40 lr $AR0, @0x0e40
2334 079f 0081 0b89 lri $AR1, #0x0b89
2335 07a1 00c2 0e08 lr $AR2, @0x0e08
2336 07a3 1c62 mrr $AR3, $AR2
2337 07a4 00c4 0e41 lr $IX0, @0x0e41
2338 07a6 00c5 0e09 lr $IX1, @0x0e09
2339 07a8 02bf 80e7 call 0x80e7
2340 07aa 00f8 0ba9 sr @0x0ba9, $AX0.L
2341 07ac 00fb 0bac sr @0x0bac, $AX1.H
2342 07ae 00c0 0e40 lr $AR0, @0x0e40
2343 07b0 0081 0b91 lri $AR1, #0x0b91
2344 07b2 00c2 0e0e lr $AR2, @0x0e0e
2345 07b4 1c62 mrr $AR3, $AR2
2346 07b5 00c4 0e41 lr $IX0, @0x0e41
2347 07b7 00c5 0e0f lr $IX1, @0x0e0f
2348 07b9 02bf 80e7 call 0x80e7
2349 07bb 00f8 0bab sr @0x0bab, $AX0.L
2350 07bd 00fb 0bae sr @0x0bae, $AX1.H
2355 07c0 00c0 0e40 lr $AR0, @0x0e40
2356 07c2 0081 0b89 lri $AR1, #0x0b89
2357 07c4 00c2 0e08 lr $AR2, @0x0e08
2358 07c6 1c62 mrr $AR3, $AR2
2359 07c7 00c4 0e41 lr $IX0, @0x0e41
2360 07c9 00c5 0e09 lr $IX1, @0x0e09
2361 07cb 02bf 80e7 call 0x80e7
2362 07cd 00f8 0ba9 sr @0x0ba9, $AX0.L
2363 07cf 00fb 0bac sr @0x0bac, $AX1.H
2364 07d1 00c0 0e40 lr $AR0, @0x0e40
2365 07d3 0081 0b8d lri $AR1, #0x0b8d
2366 07d5 00c2 0e0b lr $AR2, @0x0e0b
2367 07d7 1c62 mrr $AR3, $AR2
2368 07d8 00c4 0e41 lr $IX0, @0x0e41
2369 07da 00c5 0e0c lr $IX1, @0x0e0c
2370 07dc 02bf 80e7 call 0x80e7
2371 07de 00f8 0baa sr @0x0baa, $AX0.L
2372 07e0 00fb 0bad sr @0x0bad, $AX1.H
2373 07e2 00c0 0e40 lr $AR0, @0x0e40
2374 07e4 0081 0b91 lri $AR1, #0x0b91
2375 07e6 00c2 0e0e lr $AR2, @0x0e0e
2376 07e8 1c62 mrr $AR3, $AR2
2377 07e9 00c4 0e41 lr $IX0, @0x0e41
2378 07eb 00c5 0e0f lr $IX1, @0x0e0f
2379 07ed 02bf 80e7 call 0x80e7
2380 07ef 00f8 0bab sr @0x0bab, $AX0.L
2381 07f1 00fb 0bae sr @0x0bae, $AX1.H
2386 07f4 00c0 0e40 lr $AR0, @0x0e40
2387 07f6 0081 0b89 lri $AR1, #0x0b89
2388 07f8 00c2 0e08 lr $AR2, @0x0e08
2389 07fa 1c62 mrr $AR3, $AR2
2390 07fb 00c4 0e41 lr $IX0, @0x0e41
2391 07fd 00c5 0e09 lr $IX1, @0x0e09
2392 07ff 02bf 80e7 call 0x80e7
2393 0801 00f8 0ba9 sr @0x0ba9, $AX0.L
2394 0803 00fb 0bac sr @0x0bac, $AX1.H
2395 0805 00c0 0e43 lr $AR0, @0x0e43
2396 0807 0081 0b97 lri $AR1, #0x0b97
2397 0809 00c2 0e0a lr $AR2, @0x0e0a
2398 080b 1c62 mrr $AR3, $AR2
2399 080c 02bf 81f9 call 0x81f9
2400 080e 00f8 0baf sr @0x0baf, $AX0.L
2405 0811 00c0 0e40 lr $AR0, @0x0e40
2406 0813 0081 0b89 lri $AR1, #0x0b89
2407 0815 00c2 0e08 lr $AR2, @0x0e08
2408 0817 1c62 mrr $AR3, $AR2
2409 0818 00c4 0e41 lr $IX0, @0x0e41
2410 081a 00c5 0e09 lr $IX1, @0x0e09
2411 081c 02bf 80e7 call 0x80e7
2412 081e 00f8 0ba9 sr @0x0ba9, $AX0.L
2413 0820 00fb 0bac sr @0x0bac, $AX1.H
2414 0822 00c0 0e40 lr $AR0, @0x0e40
2415 0824 0081 0b8d lri $AR1, #0x0b8d
2416 0826 00c2 0e0b lr $AR2, @0x0e0b
2417 0828 1c62 mrr $AR3, $AR2
2418 0829 00c4 0e41 lr $IX0, @0x0e41
2419 082b 00c5 0e0c lr $IX1, @0x0e0c
2420 082d 02bf 80e7 call 0x80e7
2421 082f 00f8 0baa sr @0x0baa, $AX0.L
2422 0831 00fb 0bad sr @0x0bad, $AX1.H
2423 0833 00c0 0e43 lr $AR0, @0x0e43
2424 0835 0081 0b97 lri $AR1, #0x0b97
2425 0837 00c2 0e0a lr $AR2, @0x0e0a
2426 0839 1c62 mrr $AR3, $AR2
2427 083a 1c80 mrr $IX0, $AR0
2428 083b 00c5 0e0d lr $IX1, @0x0e0d
2429 083d 02bf 80e7 call 0x80e7
2430 083f 00f8 0baf sr @0x0baf, $AX0.L
2431 0841 00fb 0bb0 sr @0x0bb0, $AX1.H
2436 0844 00c0 0e40 lr $AR0, @0x0e40
2437 0846 0081 0b89 lri $AR1, #0x0b89
2438 0848 00c2 0e08 lr $AR2, @0x0e08
2439 084a 1c62 mrr $AR3, $AR2
2440 084b 00c4 0e41 lr $IX0, @0x0e41
2441 084d 00c5 0e09 lr $IX1, @0x0e09
2442 084f 02bf 80e7 call 0x80e7
2443 0851 00f8 0ba9 sr @0x0ba9, $AX0.L
2444 0853 00fb 0bac sr @0x0bac, $AX1.H
2445 0855 00c0 0e40 lr $AR0, @0x0e40
2446 0857 0081 0b91 lri $AR1, #0x0b91
2447 0859 00c2 0e0e lr $AR2, @0x0e0e
2448 085b 1c62 mrr $AR3, $AR2
2449 085c 00c4 0e41 lr $IX0, @0x0e41
2450 085e 00c5 0e0f lr $IX1, @0x0e0f
2451 0860 02bf 80e7 call 0x80e7
2452 0862 00f8 0bab sr @0x0bab, $AX0.L
2453 0864 00fb 0bae sr @0x0bae, $AX1.H
2454 0866 00c0 0e43 lr $AR0, @0x0e43
2455 0868 0081 0b95 lri $AR1, #0x0b95
2456 086a 00c2 0e10 lr $AR2, @0x0e10
2457 086c 1c62 mrr $AR3, $AR2
2458 086d 1c80 mrr $IX0, $AR0
2459 086e 00c5 0e0a lr $IX1, @0x0e0a
2460 0870 02bf 80e7 call 0x80e7
2461 0872 00f8 0bb1 sr @0x0bb1, $AX0.L
2462 0874 00fb 0baf sr @0x0baf, $AX1.H
2467 0877 00c0 0e40 lr $AR0, @0x0e40
2468 0879 0081 0b89 lri $AR1, #0x0b89
2469 087b 00c2 0e08 lr $AR2, @0x0e08
2470 087d 1c62 mrr $AR3, $AR2
2471 087e 00c4 0e41 lr $IX0, @0x0e41
2472 0880 00c5 0e09 lr $IX1, @0x0e09
2473 0882 02bf 80e7 call 0x80e7
2474 0884 00f8 0ba9 sr @0x0ba9, $AX0.L
2475 0886 00fb 0bac sr @0x0bac, $AX1.H
2476 0888 00c0 0e40 lr $AR0, @0x0e40
2477 088a 0081 0b8d lri $AR1, #0x0b8d
2478 088c 00c2 0e0b lr $AR2, @0x0e0b
2479 088e 1c62 mrr $AR3, $AR2
2480 088f 00c4 0e41 lr $IX0, @0x0e41
2481 0891 00c5 0e0c lr $IX1, @0x0e0c
2482 0893 02bf 80e7 call 0x80e7
2483 0895 00f8 0baa sr @0x0baa, $AX0.L
2484 0897 00fb 0bad sr @0x0bad, $AX1.H
2485 0899 00c0 0e40 lr $AR0, @0x0e40
2486 089b 0081 0b91 lri $AR1, #0x0b91
2487 089d 00c2 0e0e lr $AR2, @0x0e0e
2488 089f 1c62 mrr $AR3, $AR2
2489 08a0 00c4 0e41 lr $IX0, @0x0e41
2490 08a2 00c5 0e0f lr $IX1, @0x0e0f
2491 08a4 02bf 80e7 call 0x80e7
2492 08a6 00f8 0bab sr @0x0bab, $AX0.L
2493 08a8 00fb 0bae sr @0x0bae, $AX1.H
2494 08aa 00c0 0e43 lr $AR0, @0x0e43
2495 08ac 0081 0b97 lri $AR1, #0x0b97
2496 08ae 00c2 0e0a lr $AR2, @0x0e0a
2497 08b0 1c62 mrr $AR3, $AR2
2498 08b1 1c80 mrr $IX0, $AR0
2499 08b2 00c5 0e0d lr $IX1, @0x0e0d
2500 08b4 02bf 80e7 call 0x80e7
2501 08b6 00f8 0baf sr @0x0baf, $AX0.L
2502 08b8 00fb 0bb0 sr @0x0bb0, $AX1.H
2503 08ba 00c0 0e43 lr $AR0, @0x0e43
2504 08bc 0081 0b95 lri $AR1, #0x0b95
2505 08be 00c2 0e10 lr $AR2, @0x0e10
2506 08c0 1c62 mrr $AR3, $AR2
2507 08c1 02bf 81f9 call 0x81f9
2508 08c3 00f8 0bb1 sr @0x0bb1, $AX0.L
2513 08c6 00c0 0e40 lr $AR0, @0x0e40
2514 08c8 0081 0b89 lri $AR1, #0x0b89
2515 08ca 00c2 0e08 lr $AR2, @0x0e08
2516 08cc 0083 0e44 lri $AR3, #0x0e44
2517 08ce 00c4 0e41 lr $IX0, @0x0e41
2518 08d0 00c5 0e09 lr $IX1, @0x0e09
2519 08d2 02bf 8282 call 0x8282
2520 08d4 00f8 0ba9 sr @0x0ba9, $AX0.L
2521 08d6 00fb 0bac sr @0x0bac, $AX1.H
2526 08d9 00c0 0e40 lr $AR0, @0x0e40
2527 08db 0081 0b89 lri $AR1, #0x0b89
2528 08dd 00c2 0e08 lr $AR2, @0x0e08
2529 08df 0083 0e44 lri $AR3, #0x0e44
2530 08e1 00c4 0e41 lr $IX0, @0x0e41
2531 08e3 00c5 0e09 lr $IX1, @0x0e09
2532 08e5 02bf 8282 call 0x8282
2533 08e7 00f8 0ba9 sr @0x0ba9, $AX0.L
2534 08e9 00fb 0bac sr @0x0bac, $AX1.H
2535 08eb 00c0 0e40 lr $AR0, @0x0e40
2536 08ed 0081 0b8d lri $AR1, #0x0b8d
2537 08ef 00c2 0e0b lr $AR2, @0x0e0b
2538 08f1 0083 0e44 lri $AR3, #0x0e44
2539 08f3 00c4 0e41 lr $IX0, @0x0e41
2540 08f5 00c5 0e0c lr $IX1, @0x0e0c
2541 08f7 02bf 8282 call 0x8282
2542 08f9 00f8 0baa sr @0x0baa, $AX0.L
2543 08fb 00fb 0bad sr @0x0bad, $AX1.H
2548 08fe 00c0 0e40 lr $AR0, @0x0e40
2549 0900 0081 0b89 lri $AR1, #0x0b89
2550 0902 00c2 0e08 lr $AR2, @0x0e08
2551 0904 0083 0e44 lri $AR3, #0x0e44
2552 0906 00c4 0e41 lr $IX0, @0x0e41
2553 0908 00c5 0e09 lr $IX1, @0x0e09
2554 090a 02bf 8282 call 0x8282
2555 090c 00f8 0ba9 sr @0x0ba9, $AX0.L
2556 090e 00fb 0bac sr @0x0bac, $AX1.H
2557 0910 00c0 0e40 lr $AR0, @0x0e40
2558 0912 0081 0b91 lri $AR1, #0x0b91
2559 0914 00c2 0e0e lr $AR2, @0x0e0e
2560 0916 0083 0e44 lri $AR3, #0x0e44
2561 0918 00c4 0e41 lr $IX0, @0x0e41
2562 091a 00c5 0e0f lr $IX1, @0x0e0f
2563 091c 02bf 8282 call 0x8282
2564 091e 00f8 0bab sr @0x0bab, $AX0.L
2565 0920 00fb 0bae sr @0x0bae, $AX1.H
2570 0923 00c0 0e40 lr $AR0, @0x0e40
2571 0925 0081 0b89 lri $AR1, #0x0b89
2572 0927 00c2 0e08 lr $AR2, @0x0e08
2573 0929 0083 0e44 lri $AR3, #0x0e44
2574 092b 00c4 0e41 lr $IX0, @0x0e41
2575 092d 00c5 0e09 lr $IX1, @0x0e09
2576 092f 02bf 8282 call 0x8282
2577 0931 00f8 0ba9 sr @0x0ba9, $AX0.L
2578 0933 00fb 0bac sr @0x0bac, $AX1.H
2579 0935 00c0 0e40 lr $AR0, @0x0e40
2580 0937 0081 0b8d lri $AR1, #0x0b8d
2581 0939 00c2 0e0b lr $AR2, @0x0e0b
2582 093b 0083 0e44 lri $AR3, #0x0e44
2583 093d 00c4 0e41 lr $IX0, @0x0e41
2584 093f 00c5 0e0c lr $IX1, @0x0e0c
2585 0941 02bf 8282 call 0x8282
2586 0943 00f8 0baa sr @0x0baa, $AX0.L
2587 0945 00fb 0bad sr @0x0bad, $AX1.H
2588 0947 00c0 0e40 lr $AR0, @0x0e40
2589 0949 0081 0b91 lri $AR1, #0x0b91
2590 094b 00c2 0e0e lr $AR2, @0x0e0e
2591 094d 0083 0e44 lri $AR3, #0x0e44
2592 094f 00c4 0e41 lr $IX0, @0x0e41
2593 0951 00c5 0e0f lr $IX1, @0x0e0f
2594 0953 02bf 8282 call 0x8282
2595 0955 00f8 0bab sr @0x0bab, $AX0.L
2596 0957 00fb 0bae sr @0x0bae, $AX1.H
2601 095a 00c0 0e40 lr $AR0, @0x0e40
2602 095c 0081 0b89 lri $AR1, #0x0b89
2603 095e 00c2 0e08 lr $AR2, @0x0e08
2604 0960 0083 0e44 lri $AR3, #0x0e44
2605 0962 00c4 0e41 lr $IX0, @0x0e41
2606 0964 00c5 0e09 lr $IX1, @0x0e09
2607 0966 02bf 8282 call 0x8282
2608 0968 00f8 0ba9 sr @0x0ba9, $AX0.L
2609 096a 00fb 0bac sr @0x0bac, $AX1.H
2610 096c 00c0 0e43 lr $AR0, @0x0e43
2611 096e 0081 0b97 lri $AR1, #0x0b97
2612 0970 00c2 0e0a lr $AR2, @0x0e0a
2613 0972 0083 0e44 lri $AR3, #0x0e44
2614 0974 02bf 845d call 0x845d
2615 0976 00f8 0baf sr @0x0baf, $AX0.L
2620 0979 00c0 0e40 lr $AR0, @0x0e40
2621 097b 0081 0b89 lri $AR1, #0x0b89
2622 097d 00c2 0e08 lr $AR2, @0x0e08
2623 097f 0083 0e44 lri $AR3, #0x0e44
2624 0981 00c4 0e41 lr $IX0, @0x0e41
2625 0983 00c5 0e09 lr $IX1, @0x0e09
2626 0985 02bf 8282 call 0x8282
2627 0987 00f8 0ba9 sr @0x0ba9, $AX0.L
2628 0989 00fb 0bac sr @0x0bac, $AX1.H
2629 098b 00c0 0e40 lr $AR0, @0x0e40
2630 098d 0081 0b8d lri $AR1, #0x0b8d
2631 098f 00c2 0e0b lr $AR2, @0x0e0b
2632 0991 0083 0e44 lri $AR3, #0x0e44
2633 0993 00c4 0e41 lr $IX0, @0x0e41
2634 0995 00c5 0e0c lr $IX1, @0x0e0c
2635 0997 02bf 8282 call 0x8282
2636 0999 00f8 0baa sr @0x0baa, $AX0.L
2637 099b 00fb 0bad sr @0x0bad, $AX1.H
2638 099d 00c0 0e43 lr $AR0, @0x0e43
2639 099f 0081 0b97 lri $AR1, #0x0b97
2640 09a1 00c2 0e0a lr $AR2, @0x0e0a
2641 09a3 0083 0e44 lri $AR3, #0x0e44
2642 09a5 1c80 mrr $IX0, $AR0
2643 09a6 00c5 0e0d lr $IX1, @0x0e0d
2644 09a8 02bf 8282 call 0x8282
2645 09aa 00f8 0baf sr @0x0baf, $AX0.L
2646 09ac 00fb 0bb0 sr @0x0bb0, $AX1.H
2651 09af 00c0 0e40 lr $AR0, @0x0e40
2652 09b1 0081 0b89 lri $AR1, #0x0b89
2653 09b3 00c2 0e08 lr $AR2, @0x0e08
2654 09b5 0083 0e44 lri $AR3, #0x0e44
2655 09b7 00c4 0e41 lr $IX0, @0x0e41
2656 09b9 00c5 0e09 lr $IX1, @0x0e09
2657 09bb 02bf 8282 call 0x8282
2658 09bd 00f8 0ba9 sr @0x0ba9, $AX0.L
2659 09bf 00fb 0bac sr @0x0bac, $AX1.H
2660 09c1 00c0 0e40 lr $AR0, @0x0e40
2661 09c3 0081 0b91 lri $AR1, #0x0b91
2662 09c5 00c2 0e0e lr $AR2, @0x0e0e
2663 09c7 0083 0e44 lri $AR3, #0x0e44
2664 09c9 00c4 0e41 lr $IX0, @0x0e41
2665 09cb 00c5 0e0f lr $IX1, @0x0e0f
2666 09cd 02bf 8282 call 0x8282
2667 09cf 00f8 0bab sr @0x0bab, $AX0.L
2668 09d1 00fb 0bae sr @0x0bae, $AX1.H
2669 09d3 00c0 0e43 lr $AR0, @0x0e43
2670 09d5 0081 0b95 lri $AR1, #0x0b95
2671 09d7 00c2 0e10 lr $AR2, @0x0e10
2672 09d9 0083 0e44 lri $AR3, #0x0e44
2673 09db 1c80 mrr $IX0, $AR0
2674 09dc 00c5 0e0a lr $IX1, @0x0e0a
2675 09de 02bf 8282 call 0x8282
2676 09e0 00f8 0bb1 sr @0x0bb1, $AX0.L
2677 09e2 00fb 0baf sr @0x0baf, $AX1.H
2682 09e5 00c0 0e40 lr $AR0, @0x0e40
2683 09e7 0081 0b89 lri $AR1, #0x0b89
2684 09e9 00c2 0e08 lr $AR2, @0x0e08
2685 09eb 0083 0e44 lri $AR3, #0x0e44
2686 09ed 00c4 0e41 lr $IX0, @0x0e41
2687 09ef 00c5 0e09 lr $IX1, @0x0e09
2688 09f1 02bf 8282 call 0x8282
2689 09f3 00f8 0ba9 sr @0x0ba9, $AX0.L
2690 09f5 00fb 0bac sr @0x0bac, $AX1.H
2691 09f7 00c0 0e40 lr $AR0, @0x0e40
2692 09f9 0081 0b8d lri $AR1, #0x0b8d
2693 09fb 00c2 0e0b lr $AR2, @0x0e0b
2694 09fd 0083 0e44 lri $AR3, #0x0e44
2695 09ff 00c0 0e41 lr $AR0, @0x0e41
2696 0a01 00c5 0e0c lr $IX1, @0x0e0c
2697 0a03 02bf 8282 call 0x8282
2698 0a05 00f8 0baa sr @0x0baa, $AX0.L
2699 0a07 00fb 0bad sr @0x0bad, $AX1.H
2700 0a09 00c0 0e40 lr $AR0, @0x0e40
2701 0a0b 0081 0b91 lri $AR1, #0x0b91
2702 0a0d 00c2 0e0e lr $AR2, @0x0e0e
2703 0a0f 0083 0e44 lri $AR3, #0x0e44
2704 0a11 00c4 0e41 lr $IX0, @0x0e41
2705 0a13 00c5 0e0f lr $IX1, @0x0e0f
2706 0a15 02bf 8282 call 0x8282
2707 0a17 00f8 0bab sr @0x0bab, $AX0.L
2708 0a19 00fb 0bae sr @0x0bae, $AX1.H
2709 0a1b 00c0 0e43 lr $AR0, @0x0e43
2710 0a1d 0081 0b97 lri $AR1, #0x0b97
2711 0a1f 00c2 0e0a lr $AR2, @0x0e0a
2712 0a21 0083 0e44 lri $AR3, #0x0e44
2713 0a23 1c80 mrr $IX0, $AR0
2714 0a24 00c5 0e0d lr $IX1, @0x0e0d
2715 0a26 02bf 8282 call 0x8282
2716 0a28 00f8 0baf sr @0x0baf, $AX0.L
2717 0a2a 00fb 0bb0 sr @0x0bb0, $AX1.H
2718 0a2c 00c0 0e43 lr $AR0, @0x0e43
2719 0a2e 0081 0b95 lri $AR1, #0x0b95
2720 0a30 00c2 0e10 lr $AR2, @0x0e10
2721 0a32 0083 0e44 lri $AR3, #0x0e44
2722 0a34 02bf 845d call 0x845d
2723 0a36 00f8 0bb1 sr @0x0bb1, $AX0.L
2728 0a39 00c0 0e40 lr $AR0, @0x0e40
2729 0a3b 0081 0b89 lri $AR1, #0x0b89
2730 0a3d 00c2 0e08 lr $AR2, @0x0e08
2731 0a3f 1c62 mrr $AR3, $AR2
2732 0a40 00c4 0e41 lr $IX0, @0x0e41
2733 0a42 00c5 0e09 lr $IX1, @0x0e09
2734 0a44 02bf 80e7 call 0x80e7
2735 0a46 00f8 0ba9 sr @0x0ba9, $AX0.L
2736 0a48 00fb 0bac sr @0x0bac, $AX1.H
2737 0a4a 00c0 0e43 lr $AR0, @0x0e43
2738 0a4c 0081 0b91 lri $AR1, #0x0b91
2739 0a4e 00c2 0e0e lr $AR2, @0x0e0e
2740 0a50 1c62 mrr $AR3, $AR2
2741 0a51 1c80 mrr $IX0, $AR0
2742 0a52 00c5 0e0f lr $IX1, @0x0e0f
2743 0a54 02bf 80e7 call 0x80e7
2744 0a56 00f8 0bab sr @0x0bab, $AX0.L
2745 0a58 00fb 0bae sr @0x0bae, $AX1.H
2750 0a5b 00c0 0e40 lr $AR0, @0x0e40
2751 0a5d 0081 0b89 lri $AR1, #0x0b89
2752 0a5f 00c2 0e08 lr $AR2, @0x0e08
2753 0a61 1c62 mrr $AR3, $AR2
2754 0a62 00c4 0e41 lr $IX0, @0x0e41
2755 0a64 00c5 0e09 lr $IX1, @0x0e09
2756 0a66 02bf 80e7 call 0x80e7
2757 0a68 00f8 0ba9 sr @0x0ba9, $AX0.L
2758 0a6a 00fb 0bac sr @0x0bac, $AX1.H
2759 0a6c 00c0 0e43 lr $AR0, @0x0e43
2760 0a6e 0081 0b91 lri $AR1, #0x0b91
2761 0a70 00c2 0e0e lr $AR2, @0x0e0e
2762 0a72 1c62 mrr $AR3, $AR2
2763 0a73 1c80 mrr $IX0, $AR0
2764 0a74 00c5 0e0f lr $IX1, @0x0e0f
2765 0a76 02bf 80e7 call 0x80e7
2766 0a78 00f8 0bab sr @0x0bab, $AX0.L
2767 0a7a 00fb 0bae sr @0x0bae, $AX1.H
2768 0a7c 00c0 0e40 lr $AR0, @0x0e40
2769 0a7e 0081 0b8d lri $AR1, #0x0b8d
2770 0a80 00c2 0e0b lr $AR2, @0x0e0b
2771 0a82 1c62 mrr $AR3, $AR2
2772 0a83 00c4 0e41 lr $IX0, @0x0e41
2773 0a85 00c5 0e0c lr $IX1, @0x0e0c
2774 0a87 02bf 80e7 call 0x80e7
2775 0a89 00f8 0baa sr @0x0baa, $AX0.L
2776 0a8b 00fb 0bad sr @0x0bad, $AX1.H
2777 0a8d 00c0 0e43 lr $AR0, @0x0e43
2778 0a8f 0081 0b99 lri $AR1, #0x0b99
2779 0a91 00c2 0e0d lr $AR2, @0x0e0d
2780 0a93 1c62 mrr $AR3, $AR2
2781 0a94 02bf 81f9 call 0x81f9
2782 0a96 00f8 0bb0 sr @0x0bb0, $AX0.L
2787 0a99 00c0 0e40 lr $AR0, @0x0e40
2788 0a9b 0081 0b89 lri $AR1, #0x0b89
2789 0a9d 00c2 0e08 lr $AR2, @0x0e08
2790 0a9f 0083 0e44 lri $AR3, #0x0e44
2791 0aa1 00c4 0e41 lr $IX0, @0x0e41
2792 0aa3 00c5 0e09 lr $IX1, @0x0e09
2793 0aa5 02bf 8282 call 0x8282
2794 0aa7 00f8 0ba9 sr @0x0ba9, $AX0.L
2795 0aa9 00fb 0bac sr @0x0bac, $AX1.H
2796 0aab 00c0 0e43 lr $AR0, @0x0e43
2797 0aad 0081 0b91 lri $AR1, #0x0b91
2798 0aaf 00c2 0e0e lr $AR2, @0x0e0e
2799 0ab1 0083 0e44 lri $AR3, #0x0e44
2800 0ab3 1c80 mrr $IX0, $AR0
2801 0ab4 00c5 0e0f lr $IX1, @0x0e0f
2802 0ab6 02bf 8282 call 0x8282
2803 0ab8 00f8 0bab sr @0x0bab, $AX0.L
2804 0aba 00fb 0bae sr @0x0bae, $AX1.H
2809 0abd 00c0 0e40 lr $AR0, @0x0e40
2810 0abf 0081 0b89 lri $AR1, #0x0b89
2811 0ac1 00c2 0e08 lr $AR2, @0x0e08
2812 0ac3 0083 0e44 lri $AR3, #0x0e44
2813 0ac5 00c4 0e41 lr $IX0, @0x0e41
2814 0ac7 00c5 0e09 lr $IX1, @0x0e09
2815 0ac9 02bf 8282 call 0x8282
2816 0acb 00f8 0ba9 sr @0x0ba9, $AX0.L
2817 0acd 00fb 0bac sr @0x0bac, $AX1.H
2818 0acf 00c0 0e43 lr $AR0, @0x0e43
2819 0ad1 0081 0b91 lri $AR1, #0x0b91
2820 0ad3 00c2 0e0e lr $AR2, @0x0e0e
2821 0ad5 0083 0e44 lri $AR3, #0x0e44
2822 0ad7 1c80 mrr $IX0, $AR0
2823 0ad8 00c5 0e0f lr $IX1, @0x0e0f
2824 0ada 02bf 8282 call 0x8282
2825 0adc 00f8 0bab sr @0x0bab, $AX0.L
2826 0ade 00fb 0bae sr @0x0bae, $AX1.H
2827 0ae0 00c0 0e40 lr $AR0, @0x0e40
2828 0ae2 0081 0b8d lri $AR1, #0x0b8d
2829 0ae4 00c2 0e0b lr $AR2, @0x0e0b
2830 0ae6 0083 0e44 lri $AR3, #0x0e44
2831 0ae8 00c4 0e41 lr $IX0, @0x0e41
2832 0aea 00c5 0e0c lr $IX1, @0x0e0c
2833 0aec 02bf 8282 call 0x8282
2834 0aee 00f8 0baa sr @0x0baa, $AX0.L
2835 0af0 00fb 0bad sr @0x0bad, $AX1.H
2836 0af2 00c0 0e43 lr $AR0, @0x0e43
2837 0af4 0081 0b99 lri $AR1, #0x0b99
2838 0af6 00c2 0e0d lr $AR2, @0x0e0d
2839 0af8 0083 0e44 lri $AR3, #0x0e44
2840 0afa 02bf 845d call 0x845d
2841 0afc 00f8 0bb0 sr @0x0bb0, $AX0.L
2845 # Jump table for main commands
2861 0b0e 047a // Jump f Task_Yield()
2862 0b0f 0bb1 // Jump 10
2863 0b10 0175 // Jump 11
2865 # LUT for pb.mixerCtrl
2866 0b11 0768 // Jump3 0
2867 0b12 077a // Jump3 1
2868 0b13 079d // Jump3 2
2869 0b14 07c0 // Jump3 3
2870 0b15 07f4 // Jump3 4
2871 0b16 0811 // Jump3 5
2872 0b17 0844 // Jump3 6
2873 0b18 0877 // Jump3 7
2874 0b19 08c6 // Jump3 8
2875 0b1a 08d9 // Jump3 9
2876 0b1b 08fe // Jump3 a
2877 0b1c 0923 // Jump3 b
2878 0b1d 095a // Jump3 c
2879 0b1e 0979 // Jump3 d
2880 0b1f 09af // Jump3 e
2881 0b20 09e5 // Jump3 f
2883 0b21 0a39 // Jump3 10
2884 0b22 0a5b // Jump3 11
2885 0b23 0768 // Jump3 12
2886 0b24 0768 // Jump3 13
2887 0b25 0768 // Jump3 14
2888 0b26 0768 // Jump3 15
2889 0b27 0768 // Jump3 16
2890 0b28 0768 // Jump3 17
2891 0b29 0a99 // Jump3 18
2892 0b2a 0abd // Jump3 19
2893 0b2b 0768 // Jump3 1a
2894 0b2c 0768 // Jump3 1b
2895 0b2d 0768 // Jump3 1c
2896 0b2e 0768 // Jump3 1d
2897 0b2f 0768 // Jump3 1e
2898 0b30 0768 // Jump3 1f
2900 # LUT for pb.srcSelect
2901 0b31 05a8 // Jump4 0
2902 0b32 065d // Jump4 1
2903 0b33 0707 // Jump4 2
2905 # LUT for pb.coefSelect tables (in drom)
2910 # End of noise - back to code.
2916 0b39 8970 clr'l $ACC1 : $AC0.M, @$AR0
2917 0b3a 191c lrri $AC0.L, @$AR0
2919 0b3b 2ece srs @DSMAH, $AC0.M
2920 0b3c 2ccf srs @DSMAL, $AC0.L
2921 0b3d 16cd 0e80 si @DSPA, #0x0e80
2922 0b3f 16c9 0000 si @DSCR, #0x0000
2923 0b41 16cb 0100 si @DSBL, #0x0100
2925 0b43 1f7e mrr $AX1.H, $AC0.M
2926 0b44 1f3c mrr $AX1.L, $AC0.L
2930 0b46 26c9 lrs $AC0.M, @DSCR
2931 0b47 02a0 0004 andf $AC0.M, #0x0004
2932 0b49 029c 0b46 jlnz 0x0b46
2934 0b4b 191e lrri $AC0.M, @$AR0
2935 0b4c 191c lrri $AC0.L, @$AR0
2936 0b4d 2ece srs @DSMAH, $AC0.M
2937 0b4e 2ccf srs @DSMAL, $AC0.L
2938 0b4f 16cd 0280 si @DSPA, #0x0280
2939 0b51 16c9 0000 si @DSCR, #0x0000
2940 0b53 16cb 0280 si @DSBL, #0x0280
2942 0b55 1c80 mrr $IX0, $AR0
2944 0b56 0080 0280 lri $AR0, #0x0280
2945 0b58 00c1 0e1b lr $AR1, @0x0e1b
2946 0b5a 0085 0000 lri $IX1, #0x0000
2947 0b5c 0089 007f lri $WR1, #0x007f
2948 0b5e 0082 0f00 lri $AR2, #0x0f00
2949 0b60 0083 16b4 lri $AR3, #0x16b4
2950 0b62 1ce3 mrr $IX3, $AR3
2953 0b64 26c9 lrs $AC0.M, @DSCR
2954 0b65 02a0 0004 andf $AC0.M, #0x0004
2955 0b67 029c 0b64 jlnz 0x0b64
2958 0b6a 8a78 m2'l : $AC1.M, @$AR0
2959 0b6b 8c68 clr15'l : $AC1.L, @$AR0
2960 0b6c f100 lsl16 $ACC1
2961 0b6d 1a3f srr @$AR1, $AC1.M
2962 0b6e 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3
2963 0b6f 107e loopi #0x7e
2964 0b70 f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
2965 0b71 f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
2966 0b72 f278 madd'l $AX0.L, $AX0.H : $AC1.M, @$AR0
2967 0b73 6e68 movp'l $ACC0 : $AC1.L, @$AR0
2968 0b74 f132 lsl16's $ACC1 : @$AR2, $AC0.M
2969 0b75 1a3f srr @$AR1, $AC1.M
2970 0b76 119e 0b80 bloopi #0x9e, 0x0b80
2971 0b78 1c67 mrr $AR3, $IX3
2972 0b79 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3
2973 0b7a 107e loopi #0x7e
2974 0b7b f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
2975 0b7c f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
2976 0b7d f278 madd'l $AX0.L, $AX0.H : $AC1.M, @$AR0
2977 0b7e 6e68 movp'l $ACC0 : $AC1.L, @$AR0
2978 0b7f f132 lsl16's $ACC1 : @$AR2, $AC0.M
2979 0b80 1a3f srr @$AR1, $AC1.M
2981 0b81 1c67 mrr $AR3, $IX3
2982 0b82 84e3 clrp'ld : $AX0.H, $AX1.L, @$AR3
2983 0b83 107e loopi #0x7e
2984 0b84 f2e3 madd'ld $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
2985 0b85 f2e7 madd'ldn $AX0.L, $AX0.H : $AX0.H, $AX1.L, @$AR3
2986 0b86 f200 madd $AX0.L, $AX0.H
2987 0b87 6e00 movp $ACC0
2988 0b88 1b5e srri @$AR2, $AC0.M
2989 0b89 00e1 0e1b sr @0x0e1b, $AR1
2991 0b8b 0080 0280 lri $AR0, #0x0280
2992 0b8d 0083 0f00 lri $AR3, #0x0f00
2993 0b8f 0081 0000 lri $AR1, #0x0000
2994 0b91 0082 0140 lri $AR2, #0x0140
2995 0b93 0089 ffff lri $WR1, #0xffff
3002 0b98 11a0 0ba0 bloopi #0xa0, 0x0ba0
3003 0b9a 197f lrri $AC1.M, @$AR3
3004 0b9b 9930 asr16's $ACC1 : @$AR0, $AC0.M
3005 0b9c 1b1e srri @$AR0, $AC0.M
3006 0b9d 1b3f srri @$AR1, $AC1.M
3007 0b9e 7d29 neg's $ACC1 : @$AR1, $AC1.L
3008 0b9f 1b5f srri @$AR2, $AC1.M
3009 0ba0 1b5d srri @$AR2, $AC1.L
3013 0ba2 1fdb mrr $AC0.M, $AX1.H
3014 0ba3 1f99 mrr $AC0.L, $AX1.L
3015 0ba4 2ece srs @DSMAH, $AC0.M
3016 0ba5 2ccf srs @DSMAL, $AC0.L
3017 0ba6 16cd 0e80 si @DSPA, #0x0e80
3018 0ba8 16c9 0001 si @DSCR, #0x0001
3019 0baa 16cb 0100 si @DSBL, #0x0100
3021 // 0bac 02bf 055c call 0x055c
3024 0bae 1c04 mrr $AR0, $IX0
3026 // 0baf 029f 0068 jmp 0x0068
3034 0bb3 8970 clr'l $ACC1 : $AC0.M, @$AR0
3035 0bb4 191c lrri $AC0.L, @$AR0
3037 0bb5 2ece srs @DSMAH, $AC0.M
3038 0bb6 2ccf srs @DSMAL, $AC0.L
3039 0bb7 16cd 07c0 si @DSPA, #0x07c0
3040 0bb9 16c9 0001 si @DSCR, #0x0001
3041 0bbb 16cb 0500 si @DSBL, #0x0500
3043 // 0bbd 02bf 055c call 0x055c
3047 0bc0 8970 clr'l $ACC1 : $AC0.M, @$AR0
3048 0bc1 191c lrri $AC0.L, @$AR0
3050 0bc2 2ece srs @DSMAH, $AC0.M
3051 0bc3 2ccf srs @DSMAL, $AC0.L
3052 0bc4 16cd 07c0 si @DSPA, #0x07c0
3053 0bc6 16c9 0000 si @DSCR, #0x0000
3055 0bc9 0d20 lris $AC1.L, #0x20
3056 0bca 2dcb srs @DSBL, $AC1.L
3058 0bcb 4c00 add $ACC0, $ACC1
3060 0bcc 1c80 mrr $IX0, $AR0
3062 0bcd 0080 07c0 lri $AR0, #0x07c0
3063 0bcf 0083 0000 lri $AR3, #0x0000
3064 0bd1 1c43 mrr $AR2, $AR3
3065 0bd2 0a00 lris $AX0.H, #0x00
3067 0bd3 27c9 lrs $AC1.M, @DSCR
3068 0bd4 03a0 0004 andf $AC1.M, #0x0004
3069 0bd6 029c 0bd3 jlnz 0x0bd3
3071 0bd8 2ece srs @DSMAH, $AC0.M
3072 0bd9 2ccf srs @DSMAL, $AC0.L
3073 0bda 16cd 07d0 si @DSPA, #0x07d0
3074 0bdc 16c9 0000 si @DSCR, #0x0000
3075 0bde 16cb 04e0 si @DSBL, #0x04e0
3079 0be1 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
3080 0be2 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
3081 0be3 6a00 movax $ACC0, $AX1
3082 0be4 4800 addax $ACC0, $AX0
3083 0be5 114f 0bee bloopi #0x4f, 0x0bee
3084 0be7 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
3085 0be8 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
3086 0be9 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
3087 0bea 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
3088 0beb 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
3089 0bec 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
3090 0bed 6a3a movax's $ACC0, $AX1.L : @$AR2, $AC1.M
3091 0bee 482a addax's $ACC0, $AX0.L : @$AR2, $AC1.L
3093 0bef 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
3094 0bf0 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
3095 0bf1 6b32 movax's $ACC1, $AX1.L : @$AR2, $AC0.M
3096 0bf2 4922 addax's $ACC1, $AX0.L : @$AR2, $AC0.L
3097 0bf3 1b5f srri @$AR2, $AC1.M
3098 0bf4 1b5d srri @$AR2, $AC1.L
3099 0bf5 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
3100 0bf6 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
3101 0bf7 6800 movax $ACC0, $AX0
3103 0bf9 4a00 addax $ACC0, $AX1
3104 0bfa 114f 0c05 bloopi #0x4f, 0x0c05
3105 0bfc 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
3106 0bfd 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
3107 0bfe 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M
3109 0c00 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L
3110 0c01 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
3111 0c02 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
3112 0c03 683a movax's $ACC0, $AX0.L : @$AR2, $AC1.M
3114 0c05 4a2a addax's $ACC0, $AX1.L : @$AR2, $AC1.L
3116 0c06 80f0 nx'ld : $AX0.H, $AX1.H, @$AR0
3117 0c07 80c0 nx'ld : $AX0.L, $AX1.L, @$AR0
3118 0c08 6932 movax's $ACC1, $AX0.L : @$AR2, $AC0.M
3120 0c0a 4b22 addax's $ACC1, $AX1.L : @$AR2, $AC0.L
3121 0c0b 1b5f srri @$AR2, $AC1.M
3122 0c0c 1b5d srri @$AR2, $AC1.L
3124 0c0d 1c04 mrr $AR0, $IX0
3126 // 0c0e 029f 0068 jmp 0x0068
3130 # Begin interrupt handlers
3132 // Sends mail with value on top of callstack and rti's
3133 void ResetAndStackUOFlow_Handler() {
3136 // 0c11 16fc ecc0 si @DMBH, #0xecc0
3137 // 0c13 1fcc mrr $AC0.M, $ST0
3138 // 0c14 1d9e mrr $ST0, $AC0.M
3139 // 0c15 2efd srs @DMBL, $AC0.M
3140 DMB = 0xecc00000 | $ST0
3142 // 0c16 26fc lrs $AC0.M, @DMBH
3143 // 0c17 02a0 8000 andf $AC0.M, #0x8000
3144 // 0c19 029c 0c16 jlnz 0x0c16
3145 while (@DMBH & 0x8000 == 0);
3154 // Saves/Restores whole ACC0, but only modifies AC0.M. strange
3155 void Int2_Handler() {
3159 0c20 00f0 0e17 sr @0x0e17, $AC0.H
3160 0c22 00fe 0e18 sr @0x0e18, $AC0.M
3161 0c24 00fc 0e19 sr @0x0e19, $AC0.L
3163 // 0c26 1fcc mrr $AC0.M, $ST0
3164 // 0c27 1d9e mrr $ST0, $AC0.M
3165 // 0c28 16fc feed si @DMBH, #0xfeed
3166 // 0c2a 2efd srs @DMBL, $AC0.M
3167 DMB = 0xfeed0000 | $ST0
3169 // 0c2b 26fc lrs $AC0.M, @DMBH
3170 // 0c2c 02a0 8000 andf $AC0.M, #0x8000
3171 // 0c2e 029c 0c2b jlnz 0x0c2b
3172 while (@DMBH & 0x8000 == 0);
3175 0c30 00d0 0e17 lr $AC0.H, @0x0e17
3176 0c32 00de 0e18 lr $AC0.M, @0x0e18
3177 0c34 00dc 0e19 lr $AC0.L, @0x0e19
3187 void Int3_Handler() {
3190 // Save AC0.L, AC0.M
3191 0c3c 1dbc mrr $ST1, $AC0.L
3192 0c3d 1dbe mrr $ST1, $AC0.M
3194 // 0c3e 8100 clr $ACC0
3195 // 0c3f 00de 0bb7 lr $AC0.M, @0x0bb7
3196 // 0c41 0601 cmpis $AC0.M, #0x01
3197 // 0c42 0295 0c47 jz 0x0c47
3198 // 0c44 0e00 lris $AC0.M, #0x00
3199 // 0c45 00fe 0b87 sr @0x0b87, $AC0.M
3200 if (*0x0bb7 != 1) { // pb.addr != AXPBADDR_LOOP_ON
3201 *0x0b87 = 0; // pb.state = AX_PB_STATE_STOP
3204 // Restore AC0.L, AC0.M
3205 0c47 1fcd mrr $AC0.M, $ST1
3206 0c48 1f8d mrr $AC0.L, $ST1
3212 void Int4_Handler() {
3222 void Int5_Handler() {
3225 // Save AC0.L, AC0.M
3226 0c51 1dbc mrr $ST1, $AC0.L
3227 0c52 1dbe mrr $ST1, $AC0.M
3229 // 0c53 8100 clr $ACC0
3230 // 0c54 00de 0bb7 lr $AC0.M, @0x0bb7
3231 // 0c56 0601 cmpis $AC0.M, #0x01
3232 // 0c57 0295 0c5f jz 0x0c5f
3233 if (*0x0bb7 != 1) // pb.addr != AXPBADDR_LOOP_ON
3235 // 0c59 0e00 lris $AC0.M, #0x00
3236 // 0c5a 00fe 0b87 sr @0x0b87, $AC0.M
3237 *0x0b87 = 0; // pb.state = AX_PB_STATE_STOP
3239 // Restore AC0.L, AC0.M
3240 0c5c 1fcd mrr $AC0.M, $ST1
3241 0c5d 1f8d mrr $AC0.L, $ST1
3247 // 0c5f 8100 clr $ACC0
3248 // 0c60 00de 0b88 lr $AC0.M, @0x0b88
3249 // 0c62 0601 cmpis $AC0.M, #0x01
3250 // 0c63 0295 0c71 jz 0x0c71
3251 if (*0x0b88 != 1) { // pb.type != AX_PB_TYPE_STREAM
3253 // 0c65 00de 0bda lr $AC0.M, @0x0bda
3254 // 0c67 2eda srs @scale, $AC0.M
3255 // 0c68 00de 0bdb lr $AC0.M, @0x0bdb
3256 // 0c6a 2edb srs @yn1, $AC0.M
3257 // 0c6b 00de 0bdc lr $AC0.M, @0x0bdc
3258 // 0c6d 2edc srs @yn2, $AC0.M
3259 @scale = pb.adpcmLoop.loop_pred_scale
3260 @yn1 = pb.adpcmLoop.loop_yn1
3261 @yn2 = pb.adpcmLoop.loop_yn2
3263 // Restore AC0.L, AC0.M
3264 0c6e 1fcd mrr $AC0.M, $ST1
3265 0c6f 1f8d mrr $AC0.L, $ST1
3272 // 0c71 00de 0bda lr $AC0.M, @0x0bda
3273 // 0c73 2eda srs @scale, $AC0.M
3274 // 0c74 26db lrs $AC0.M, @yn1
3275 // 0c75 2edb srs @yn1, $AC0.M
3276 // 0c76 26dc lrs $AC0.M, @yn2
3277 // 0c77 2edc srs @yn2, $AC0.M
3278 @scale = pb.adpcmLoop.loop_pred_scale
3279 // refresh @yn1, @yn2....why?
3283 // Well helllloooo there, padding
3284 // 0c78 8100 clr $ACC0
3285 // 0c79 00dc 0bdd lr $AC0.L, @0x0bdd
3286 // 0c7b 7600 inc $ACC0
3287 // 0c7c 00fc 0bdd sr @0x0bdd, $AC0.L
3288 // 0c7e 8100 clr $ACC0
3291 // Restore AC0.L, AC0.M
3292 0c7f 1fcd mrr $AC0.M, $ST1
3293 0c80 1f8d mrr $AC0.L, $ST1
3300 void Int6_Handler() {
3309 void Int7_Handler() {
3317 # End of interrupt handlers
3319 // Jump table for the next function.
3320 0c8d 0c9f // some kind of soft-reset for the UCode
3321 0c8e 0ca2 // looks like code to dump the UCode memory for debugging
3322 0c8f 0cda // rest the UCode and jump to ROM
3323 0c90 0cdd // normal case to return to the main-loop
3325 // Called only from Task_Yield()
3326 // Decides what to do next (this cmdblock is done)
3327 void JumpThroughTable2() {
3332 // 0c94 02bf 0ce0 call 0x0ce0
3335 // 0c96 27ff lrs $AC1.M, @CMBL
3336 // 0c97 009e 0c8d lri $AC0.M, #0x0c8d
3337 // 0c99 4c00 add $ACC0, $ACC1
3338 // 0c9a 1c7e mrr $AR3, $AC0.M
3339 // 0c9b 0313 ilrr $AC1.M, @$AR3
3340 // 0c9c 1c7f mrr $AR3, $AC1.M
3341 // 0c9d 176f jmpr $AR3
3343 case 0: AX_ResumeTask(); break;
3344 case 1: JumpTable2_1(); break;
3345 case 2: IROM_Reset(); break;
3346 case 3: AX_GetNextCmdBlock(); break;
3352 void AX_ResumeTask() {
3353 0c9f 029f 0030 jmp 0x0030
3358 // funky...calls the mbox funcs, sometimes prefilling ACx regs...
3359 // Perhaps DMAs some stuff and yields?
3360 // Need to RE the ROM to figure this func out completely
3361 void JumpTable2_1() {
3362 // 0ca2 8100 clr $ACC0
3363 // 0ca3 8900 clr $ACC1
3364 // 0ca4 02bf 0ce0 call 0x0ce0
3367 // 0ca6 24ff lrs $AC0.L, @CMBL
3368 // 0ca7 02bf 0ce6 call 0x0ce6
3371 // 0ca9 25ff lrs $AC1.L, @CMBL
3372 // 0caa 02bf 0ce6 call 0x0ce6
3375 0cac 27ff lrs $AC1.M, @CMBL
3376 0cad 2ece srs @DSMAH, $AC0.M
3377 0cae 2ccf srs @DSMAL, $AC0.L
3378 0caf 16c9 0001 si @DSCR, #0x0001
3379 0cb1 2fcd srs @DSPA, $AC1.M
3380 0cb2 2dcb srs @DSBL, $AC1.L
3382 // 0cb3 8100 clr $ACC0
3383 // 0cb4 8900 clr $ACC1
3384 // 0cb5 02bf 0ce0 call 0x0ce0
3387 0cb7 24ff lrs $AC0.L, @CMBL
3388 0cb8 1c9e mrr $IX0, $AC0.M
3389 0cb9 1cbc mrr $IX1, $AC0.L
3390 0cba 02bf 0ce6 call 0x0ce6
3393 0cbc 25ff lrs $AC1.L, @CMBL
3394 0cbd 02bf 0ce6 call 0x0ce6
3397 0cbf 27ff lrs $AC1.M, @CMBL
3398 0cc0 1cdf mrr $IX2, $AC1.M
3399 0cc1 1cfd mrr $IX3, $AC1.L
3401 // 0cc2 8100 clr $ACC0
3402 // 0cc3 02bf 0ce0 call 0x0ce0
3405 0cc5 26ff lrs $AC0.M, @CMBL
3406 0cc6 1c1e mrr $AR0, $AC0.M
3408 0cc8 02bf 0ce6 call 0x0ce6
3411 0cca 20ff lrs $AX0.L, @CMBL
3412 0ccb 1f5f mrr $AX0.H, $AC1.M
3413 0ccc 02bf 0ce0 call 0x0ce0
3416 0cce 21ff lrs $AX1.L, @CMBL
3417 0ccf 02bf 0ce0 call 0x0ce0
3420 0cd1 23ff lrs $AX1.H, @CMBL
3422 // 0cd2 26c9 lrs $AC0.M, @DSCR
3423 // 0cd3 02a0 0004 andf $AC0.M, #0x0004
3424 // 0cd5 029c 0cd2 jlnz 0x0cd2
3425 while (@DSCR & 0x0004 != 0); // Wait for DMA to complete
3427 // 0cd7 029f 80b5 jmp 0x80b5
3429 IROM_ErrorAndDie(); // Not sure...gotta RE the ROM
3434 0cda 029f 8000 jmp 0x8000
3439 void AX_GetNextCmdBlock() {
3440 // 0cdd 029f 0045 jmp 0x0045
3441 goto GetNextCmdBlock;
3446 void WaitForCPUMail0() {
3447 // 0ce0 26fe lrs $AC0.M, @CMBH
3448 // 0ce1 02c0 8000 andcf $AC0.M, #0x8000
3449 // 0ce3 029c 0ce0 jlnz 0x0ce0
3450 while (@CMBH & 0x8000 == 0);
3455 void WaitForCPUMail1() {
3456 // 0ce6 27fe lrs $AC1.M, @CMBH
3457 // 0ce7 03c0 8000 andcf $AC1.M, #0x8000
3458 // 0ce9 029c 0ce6 jlnz 0x0ce6
3459 while (@CMBH & 0x8000 == 0);