Fix the annoying gap in the OpenGL configuration dialog in the "General" tab between...
[dolphin.git] / docs / DSP / DSP_UC_AX_DD7E72D5.txt
blobd985232bb7f4f50705e1ec5bb807fa550fe2f933
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
8 // Buffers
9 0x0000                                          Main Right
10 0x0140                                          Main Left
11 0x0280  
12 0x0400  
13 0x0540  
14 0x0680  
15 0x07c0  
16 0x0900  
17 0x0a40  
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
29 0x0e09  0x0140                          
30 0x0e0a  0x0280                          
31 0x0e0b  0x0400                          
32 0x0e0c  0x0540                          
33 0x0e0d  0x0680                          
34 0x0e0e  0x07c0                          
35 0x0e0f  0x0900                          
36 0x0e10  0x0a40                          
38 // Func pointers
39 0x0e14  selectedMixCtrl         
40 0x0e15  selectedSRC                     
41 0x0e16  selectedCoef            Points into DROM
43 // ITD
44 0x0e40  
45 0x0e41  
46 0x0e42  
47 0x0e43  
48 //////////////////////////////////////////////////////////////////////////
50 // Good ol' exception table
51 0000 0000      nop         
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
61 // Entry point
62 void Task_Init() {
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
69         // 0015 8e00      set16       
70         // 0016 8c00      clr15       
71         // 0017 8b00      m0          
72         // 0018 0092 00ff lri         $CR, #0x00ff
73         
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
80         ACC0 = ACC1 = 0
81         *0x0e1b = 0xe80 // Used in Cmd8
82         *0x0e31 = 0
83         
84         // Send DSP_INIT mail
85         // 0023 16fc dcd1 si          @DMBH, #0xdcd1
86         // 0025 16fd 0000 si          @DMBL, #0x0000
87         // 0027 16fb 0001 si          @DIRQ, #0x0001
88         DMB = 0xdcd10000
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);
93         
94         // 002e 029f 0045 jmp         0x0045
95         goto GetNextCmdBlock;
98 void Task_Resume() {
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
105         // 0035 8e00      set16       
106         // 0036 8c00      clr15       
107         // 0037 8b00      m0          
108         // 0038 0092 00ff lri         $CR, #0x00ff
109         
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
114         DMB = 0xdcd10001
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);
119         
120 GetNextCmdBlock:
121         0045 8e00      set16       
122         0046 8100      clr         $ACC0
123         0047 8900      clr         $ACC1
124         0048 009f babe lri         $AC1.M, #0xbabe
125         
126         // Wait for 0xbabexxxx mail from cpu
127         do {
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);
132         
133         // 004f 8200      cmp         
134         // 0050 0294 004a jnz         0x004a
135         } while (@CMBH != 0xbabe);
136         
137         // Save the low 16bits of the mail
138         // 0052 23ff      lrs         $AX1.H, @CMBL
139         u16 length = @CMBL
140         
141         // Get next mail
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);
147         
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
160         DSPA = CmdBlockBuf
161         DSCR = 0 // CPU -> DMEM
162         DSBL = length
163         
164         // 0064 02bf 055c call        0x055c
165         WaitDMA();
166         
167         // Init the CmdBlock pointer
168         0066 0080 0c00 lri         $AR0, #0x0c00
170 DoNextCommand:
171         // 0068 8e00      set16       
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...
178                 Die_InvalidCmd();
179         
180         // 006e 0a12      lris        $AX0.H, #0x12
181         // 006f c100      cmpar       $ACC0, $AX0.H
182         // 0070 0292 007e jg          0x007e
183         if (Cmd > 0x12)
184                 Die_InvalidCmd();
185         
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
192         switch (Cmd) {
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
211         }
213         // Somehow we've passed the cmd proccessor; DIE!!
214         // 0079 16fc fbad si          @DMBH, #0xfbad
215         // 007b 16fd 8080 si          @DMBL, #0x8080
216         DMB = 0xfbad8080
217         007d 0021      halt        
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
224         0081 0021      halt        
227 // Executes the same operation 3 times on buffers: (0, 0x0400, 0x07c0)
228 void Cmd_0() {
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++)
234         
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
243         
244         // DMA 0x0040bytes to DRAM @ 0x0e44 from CPU @ maddr
245         
246         008f 0081 0e44 lri         $AR1, #0x0e44 // source
247         0091 0082 0000 lri         $AR2, #0x0000 // destination
248         
249         0093 009b 009f lri         $AX1.H, #0x009f
250         0095 009a 0140 lri         $AX0.H, #0x0140 // loop length if !ACC0
251         
252         0097 8100      clr         $ACC0
253         0098 8900      clr         $ACC1
254         
255         0099 8f00      set40       
256         
257         // 009a 02bf 055c call        0x055c
258         WaitDMA();
259         
260         009c 193e      lrri        $AC0.M, @$AR1
261         009d 193c      lrri        $AC0.L, @$AR1
262         009e b100      tst         $ACC0
263         009f 193f      lrri        $AC1.M, @$AR1 // added to ACC0 in confusing ways
264         // 00a0 0294 00a6 jnz         0x00a6
265         if (!$ACC0) {
266                 00a2 005a      loop        $AX0.H
267                         00a3 1b5e      srri        @$AR2, $AC0.M
268                         
269         // 00a4 029f 00ae jmp         0x00ae
270         } else {
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
278                         
279         }
280         
281         // same code block as above...epic fail?
282         00ae 193e      lrri        $AC0.M, @$AR1
283         00af 193c      lrri        $AC0.L, @$AR1
284         00b0 b100      tst         $ACC0
285         00b1 193f      lrri        $AC1.M, @$AR1
286         // 00b2 0294 00b8 jnz         0x00b8
287         if (!$ACC0) {
288                 00b4 005a      loop        $AX0.H
289                         00b5 1b5e      srri        @$AR2, $AC0.M
290                         
291         // 00b6 029f 00c0 jmp         0x00c0
292         } else {
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
300                         
301         }
302         
303         // ...and again! wtf
304         00c0 193e      lrri        $AC0.M, @$AR1
305         00c1 193c      lrri        $AC0.L, @$AR1
306         00c2 b100      tst         $ACC0
307         00c3 193f      lrri        $AC1.M, @$AR1
308         // 00c4 0294 00ca jnz         0x00ca
309         if (!$ACC0) {
310                 00c6 005a      loop        $AX0.H
311                         00c7 1b5e      srri        @$AR2, $AC0.M
312                         
313         // 00c8 029f 00d2 jmp         0x00d2
314         } else {
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
322                         
323         }
324         
325         // set to next buffer
326         00d2 0082 0400 lri         $AR2, #0x0400
327         
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
333         if (!$ACC0) {
334                 00d9 005a      loop        $AX0.H
335                         00da 1b5e      srri        @$AR2, $AC0.M
336         // 00db 029f 00e5 jmp         0x00e5
337         } else {
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
345         }
346         
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
352         if (!$ACC0) {
353                 00ea 005a      loop        $AX0.H
354                         00eb 1b5e      srri        @$AR2, $AC0.M
355         // 00ec 029f 00f6 jmp         0x00f6
356         } else {
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
364         }
365         
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
371         if (!$ACC0) {
372                 00fb 005a      loop        $AX0.H
373                         00fc 1b5e      srri        @$AR2, $AC0.M
374         // 00fd 029f 0107 jmp         0x0107
375         } else {
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
383         }
384         
385         // set to next buffer
386         0107 0082 07c0 lri         $AR2, #0x07c0
387         
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
393         if (!$ACC0) {
394                 010e 005a      loop        $AX0.H
395                         010f 1b5e      srri        @$AR2, $AC0.M
396         // 0110 029f 011a jmp         0x011a
397         } else {
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
405         }
406         
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
412         if (!$ACC0) {
413                 011f 005a      loop        $AX0.H
414                         0120 1b5e      srri        @$AR2, $AC0.M
415         // 0121 029f 012b jmp         0x012b
416         } else {
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
424         }
425         
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
431         if (!$ACC0) {
432                 0130 005a      loop        $AX0.H
433                         0131 1b5e      srri        @$AR2, $AC0.M
434         // 0132 029f 013c jmp         0x013c
435         } else {
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
443         }
444         
445         // 013c 029f 0068 jmp         0x0068
446         goto DoNextCommand;
449 void Cmd_1() {
450         013e 0085 ffff lri         $IX1, #0xffff // -1
451         
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)
464         
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)
473         
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)
482         
483         // 015d 029f 0068 jmp         0x0068
484         goto DoNextCommand;
487 void Cmd_9() {
488         015f 0086 07c0 lri         $IX2, #0x07c0 // often used buffer in dram
489         
490         0161 02bf 0484 call        0x0484
491         
492         // 0163 029f 0068 jmp         0x0068
493         goto DoNextCommand;
496 void Cmd_6() {
497         0165 8100      clr         $ACC0
498         0166 8e00      set16       
499         
500         // 0167 191e      lrri        $AC0.M, @$AR0
501         // 0168 191c      lrri        $AC0.L, @$AR0
502         u16 maddrh = *(CmdBlockBuf++)
503         u16 maddrl = *(CmdBlockBuf++)
504         
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
510         
511         // DMA 0x780bytes to CPU @ maddr from DMEM @ 0
512         
513         // 0171 02bf 055c call        0x055c
514         WaitDMA();
515         
516         // 0173 029f 0068 jmp         0x0068
517         goto DoNextCommand;
520 void Cmd_11() {
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++)
526         
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
534         
535         // DMA 0x20bytes to DRAM @ 0x0e44 from CPU @ maddr
536         
537         u16 length_of_0e44 = 0x20
538         
539         // 0181 4c00      add         $ACC0, $ACC1
540         maddr += length_of_0e44
541         
542         // Save CmdBlockBuf
543         // 0182 1c80      mrr         $IX0, $AR0
544         
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
550         
551         // 018c 27c9      lrs         $AC1.M, @DSCR
552         // 018d 03a0 0004 andf        $AC1.M, #0x0004
553         // 018f 029c 018c jlnz        0x018c
554         while (@DSCR & 4);
555         
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
561         
562         // DMA 0x0260bytes to DRAM @ 0x0e54 from CPU @ maddr
563         
564         // 0199 009f 00a0 lri         $AC1.M, #0x00a0
565         // 019b 8f00      set40       
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
575                 
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
586         }
587         
588         // Restore CmdBlockBuf
589         01a6 1c04      mrr         $AR0, $IX0
590         
591         // 01a7 029f 0068 jmp         0x0068
592         goto DoNextCommand;
595 // Interesting, DMAs in new CmdBlock and starts executing it
596 void Cmd_D() {
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++)
601         
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
612         
613         // DMA ((numbytes + 3) & 0xfff0)bytes to DMEM @ 0x0c00 from CPU @ maddr
614         
615         // 01b6 02bf 055c call        0x055c
616         WaitDMA();
617         
618         // 01b8 0080 0c00 lri         $AR0, #0x0c00
619         CmdBlockBuf = 0x0c00
620         
621         // 01ba 029f 0068 jmp         0x0068
622         goto DoNextCommand;
625 // DMAs in a new PB and inits values (itd, func pointers, etc)
626 // DMAs in new update_block, but doesn't apply it
627 void Cmd_2() {
628         01bc 8100      clr         $ACC0
629         
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++)
634         
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
640         
641         // DMA 0x00c0bytes to DMEM @ 0x0b80 from CPU @ maddr
642         
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
662         *0x0e08 = 0x0000
663         *0x0e09 = 0x0140
664         *0x0e0a = 0x0280
665         *0x0e0b = 0x0400
666         *0x0e0c = 0x0540
667         *0x0e0d = 0x0680
668         *0x0e0e = 0x07c0
669         *0x0e0f = 0x0900
670         *0x0e10 = 0x0a40
671         
672         // 01e4 02bf 055c call        0x055c
673         WaitDMA();
674         
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
682         
683         // DMA 0x80bytes from CPU @ ((pb.update.dataHi << 16) | pb.update.dataLo) to DRAM @ 0x03c0
684         
685         // 01f2 8100      clr         $ACC0
686         // 01f3 8900      clr         $ACC1
687         
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
695         
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
703         
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
711         
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
722                 
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
727                 
728                 // 0222 009f 0ce0 lri         $AC1.M, #0x0ce0
729                 // 0224 00ff 0e42 sr          @0x0e42, $AC1.M
730                 // 0226 00ff 0e43 sr          @0x0e43, $AC1.M
731                 *0x0e42 = 0x0ce0
732                 *0x0e43 = 0x0ce0
733                 
734                 // 0228 02bf 055c call        0x055c
735                 WaitDMA();
736                 
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
744                 
745                 // DMA 0x0040bytes to DMEM @ 0x0cc0 from CPU @ (pb.itd.bufferHi << 16) | pb.itd.bufferLo
746                 
747                 // 0236 02bf 055c call        0x055c
748                 WaitDMA();
749                 
750                 // 0238 029f 0068 jmp         0x0068
751                 goto DoNextCommand;
753         } else {
754         
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
760                 *0x0e42 = 0x0ce0
761                 *0x0e40 = 0x0ce0
762                 *0x0e41 = 0x0ce0
763                 *0x0e43 = 0x0ce0
764                 
765                 // 0244 02bf 055c call        0x055c
766                 WaitDMA();
767                 
768                 // 0246 029f 0068 jmp         0x0068
769                 goto DoNextCommand;
770         }
773 // Function calls itself until there are no more linked PBs
774 void Cmd_3() {
775         0248 8e00      set16       
776         
777         // Save CmdBlockBuf ptr
778         0249 00e0 0e07 sr          @0x0e07, $AR0
779         
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
783         
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
791         u16 ms_remaining = 5
793 NextMillisecUpd:
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)
806         }
807         pUpdates_this_ms++
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
815         
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) {
821                 
822                 // 0267 00de 0e42 lr          $AC0.M, @0x0e42
823                 // 0269 00fe 0e1c sr          @0x0e1c, $AC0.M
824                 *0x0e1c = *0x0e42
825                 
826                 // 026b 00c3 0e15 lr          $AR3, @0x0e15
827                 // 026d 177f      callr       $AR3
828                 DoSelectedSRC()
829                 
830                 // Volume Envelope Processing
831                 // 026e 8e00      set16       
832                 // 026f 8a00      m2          
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
877                 
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
882                 
883                 u40 PROD = (u16)0x8000 * (u16)(pb.ve.currentDelta << 1) * 2
884                 for (u16* i = 0x0e46; i < 0x0e46 + 30; i+=2) {
885                         temp1 += PROD
886                         temp2 += PROD
887                         
888                         *i = temp1 >> 16
889                         *(i + 1) = temp2 >> 16
890                 }
891                 temp1 += PROD
892                 pb.ve.currentVolume = temp1 >> 16
894                 // 02a1 8f00      set40       
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
965                 
966                 u16* dst = *0x0e43
967                 u16* temp1 = 0x0e44
968                 
969                 for (x = 0; x < 0x20; x++) {
970                         *(dst + x) = ((u16)*(temp1 + x) * (u16)*(dst + x) * 2) >> 16
971                 }
972                 
973                 // 02ea 00c3 0e14 lr          $AR3, @0x0e14
974                 // 02ec 8f00      set40       
975                 // 02ed 8d00      set15       
976                 // 02ee 8a00      m2          
977                 // 02ef 177f      callr       $AR3
978                 // Keep in mind: 40bit, unsigned, *2
979                 DoSelectedMixer()
980                 
981                 // Note: 40bit, unsigned, *2 not changed till 0x0332
982                 
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
990                         *0x0e43 = *0x0e42
991                 
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
996                         // 0300 8200      cmp         
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
1001                                 pb.itd.shiftL--
1002                         } else if (pb.itd.shiftL < pb.itd.targetShiftL) {
1003                                 // 0306 0295 0309 jz          0x0309
1004                                 // 0308 7400      incm        $AC0.M
1005                                 pb.itd.shiftL++
1006                         }
1007                         // 0309 00fe 0b9e sr          @0x0b9e, $AC0.M // Store pb.itd.shiftL
1008                         
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
1014                         
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
1019                         // 0317 8200      cmp         
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
1024                                 pb.itd.shiftR--
1025                         } else if (pb.itd.shiftR < pb.itd.targetShiftR) {
1026                                 // 031d 0295 0320 jz          0x0320
1027                                 // 031f 7400      incm        $AC0.M
1028                                 pb.itd.shiftR++
1029                         }
1030                         // 0320 00fe 0b9f sr          @0x0b9f, $AC0.M // Store pb.itd.shiftR
1031                         
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
1037                         
1038                         0328 029f 0332 jmp         0x0332
1039                 
1040                 } else { // pb.itd.flag == AX_PB_ITD_OFF
1041                 
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
1046                         *0x0e40 = *0x0e42
1047                         *0x0e41 = *0x0e42
1048                         *0x0e43 = *0x0e42
1049                 }
1050         }
1053         // 0332 8100      clr         $ACC0
1054         // 0333 8e00      set16       
1055         // 0334 8400      clrp        
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
1074         
1075         for (u16* i = 0x0e08; i <= 0x0e10; i++) {
1076                 *i = (u16)( (0xff00400000 + (u40)(*i << 16)) >> 16 )
1077         }
1078         
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
1087         ms_remaining--
1088         if (ms_remaining)
1089                 goto NextMillisecUpd
1090         
1091         // 0353 8e00      set16       
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
1107                 
1108                 // DMA 0x40bytes from DRAM @ (*0x0e1c) to CPU @ ((pb.itd.bufferHi << 16) | pb.itd.bufferLo)
1109                 
1110                 // 0368 02bf 055c call        0x055c
1111                 WaitDMA();
1112         }
1113         
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
1120         
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
1127         
1128         // DMA 0xc0bytes from DRAM @ 0x0b80 to CPU @ maddr
1129         
1130         // 0378 02bf 055c call        0x055c
1131         WaitDMA();
1132         
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) {
1139                 // No more PBs!
1140                 
1141                 // Restore CmdBlockBuf ptr
1142                 0382 00c0 0e07 lr          $AR0, @0x0e07
1143                 // 0384 029f 0068 jmp         0x0068
1144                 goto DoNextCommand;
1145         }
1146         
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
1149         
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
1155         
1156         // DMA 0xc0bytes from CPU @ ((pb.nextHi << 16) | pb.nextLo) to DRAM @ 0x0b80
1157         
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
1177         *0x0e08 = 0x0000
1178         *0x0e09 = 0x0140
1179         *0x0e0a = 0x0280
1180         *0x0e0b = 0x0400
1181         *0x0e0c = 0x0540
1182         *0x0e0d = 0x0680
1183         *0x0e0e = 0x07c0
1184         *0x0e0f = 0x0900
1185         *0x0e10 = 0x0a40
1186         
1187         // 03ab 02bf 055c call        0x055c
1188         WaitDMA();
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
1197         
1198         // DMA 0x80bytes from CPU @ ((pb.update.dataHi << 16) | pb.update.dataLo) to DRAM @ 0x03c0
1199         
1200         // 03b9 8100      clr         $ACC0
1201         // 03ba 8900      clr         $ACC1
1202         
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
1210         
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
1218         
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
1226         
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
1237                 
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
1242                 
1243                 // 03e9 009f 0ce0 lri         $AC1.M, #0x0ce0
1244                 // 03eb 00ff 0e42 sr          @0x0e42, $AC1.M
1245                 // 03ed 00ff 0e43 sr          @0x0e43, $AC1.M
1246                 *0x0e42 = 0x0ce0
1247                 *0x0e43 = 0x0ce0
1249                 // 03ef 02bf 055c call        0x055c
1250                 WaitDMA();
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
1259                 
1260                 // DMA 0x0040bytes to DMEM @ 0x0cc0 from CPU @ (pb.itd.bufferHi << 16) | pb.itd.bufferLo
1262                 // 03fd 02bf 055c call        0x055c
1263                 WaitDMA();
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
1269                 
1270         } else {
1271         
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
1277                 *0x0e42 = 0x0ce0
1278                 *0x0e40 = 0x0ce0
1279                 *0x0e41 = 0x0ce0
1280                 *0x0e43 = 0x0ce0
1282                 // 040d 02bf 055c call        0x055c
1283                 WaitDMA();
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
1289         }
1292 void Cmd_4() {
1293         0413 8e00      set16       
1294         
1295         0414 0086 0400 lri         $IX2, #0x0400 // buffer in dram
1296         
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++)
1302         
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
1309         
1310         // DMA 0x0780bytes from DRAM @ 0x0400 to CPU @ maddr
1312         // 0421 02bf 055c call        0x055c
1313         WaitDMA();
1315         0423 02bf 0484 call        0x0484
1316         
1317         // 0425 029f 0068 jmp         0x0068
1318         goto DoNextCommand;
1321 void Cmd_5() {
1322         0427 8e00      set16       
1323         
1324         0428 0086 07c0 lri         $IX2, #0x07c0
1325         
1326         042a 8100      clr         $ACC0
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
1337         WaitDMA();
1339         0437 02bf 0484 call        0x0484
1340         
1341         // 0439 029f 0068 jmp         0x0068
1342         goto DoNextCommand;
1345 void Cmd_E() {
1346         043b 8c00      clr15       
1347         043c 8a00      m2          
1348         043d 8100      clr         $ACC0
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
1356         
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
1365         WaitDMA();
1367         0454 1105 046c bloopi      #0x05, 0x046c
1368                 0456 1f61      mrr         $AX1.H, $AR1
1369                 
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
1377                         
1378                 045f 8900      clr         $ACC1
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
1391                 046c 8100      clr         $ACC0
1392         
1393         // 046d 26c9      lrs         $AC0.M, @DSCR
1394         // 046e 02a0 0004 andf        $AC0.M, #0x0004
1395         // 0470 029c 046d jlnz        0x046d
1396         while (@DSCR & 4);
1397         
1398         // 0472 029f 0068 jmp         0x0068
1399         goto DoNextCommand;
1402 void UnimplimentedCmd_B() {
1403         // 0474 029f 0068 jmp         0x0068
1404         goto DoNextCommand;
1407 void UnimplimentedCmd_C() {
1408         // 0476 029f 0068 jmp         0x0068
1409         goto DoNextCommand;
1412 void UnimplimentedCmd_A() {
1413         // 0478 029f 0068 jmp         0x0068
1414         goto DoNextCommand;
1417 void Task_Yield() {
1418         // Send DSP_YIELD mail
1419         // 047a 16fc dcd1 si          @DMBH, #0xdcd1
1420         // 047c 16fd 0002 si          @DMBL, #0x0002
1421         DMB = 0xdcd10002
1422         // 047e 16fb 0001 si          @DIRQ, #0x0001
1423         
1424         0480 029f 0c91 jmp         0x0c91
1426         
1427         // Unused?
1428         // 0482 029f 0045 jmp         0x0045
1429         goto GetNextCmdBlock;
1431 // Called by cmds 4 5 9
1432 // IX2 is always modified before calling...
1433 void UnkFunc() {
1434         0484 8e00      set16       
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
1441         048b 8900      clr         $ACC1
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
1446         0490 8100      clr         $ACC0
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
1462         
1463         04a5 27c9      lrs         $AC1.M, @DSCR
1464         04a6 03a0 0004 andf        $AC1.M, #0x0004
1465         04a8 029c 04a5 jlnz        0x04a5
1466         
1467         04aa 1109 04da bloopi      #0x09, 0x04da
1468                 04ac 8e00      set16       
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
1474                 04b2 8900      clr         $ACC1
1475                 04b3 193d      lrri        $AC1.L, @$AR1
1476                 04b4 2dcd      srs         @DSPA, $AC1.L
1477                 04b5 16c9 0000 si          @DSCR, #0x0000
1478                 04b7 8100      clr         $ACC0
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
1490                 04c6 8f00      set40       
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
1515         
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
1525                 
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
1533         04f0 02df      ret         
1536 // Only called by Command 1
1537 // AX0 = maddr
1538 // AX1.L = unkForMulBuffer1
1539 // AR1 = unkForMulBuffer2
1540 void Unk(maddr, unkForMulBuffer1, unkForMulBuffer2) {
1541         04f1 8e00      set16       
1542         
1543         // 04f2 009b 0e44 lri         $AX1.H, #0x0e44
1544         // 04f4 009d 00c0 lri         $AC1.L, #0x00c0
1545         // 04f6 02bf 0541 call        0x0541
1546         u16 daddr = 0x0e44
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
1554         maddr += dma_len
1555         
1556         // 04fe 02bf 055c call        0x055c
1557         WaitDMA();
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
1566                 daddr = 0x0ea4
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
1572                 maddr += dma_len
1573                 
1574                 // 0511 0083 0e44 lri         $AR3, #0x0e44
1575                 // 0513 02bf 054c call        0x054c
1576                 UnknownMulBuffer(0x0e44);
1577                 
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
1584                 daddr = 0x0e44
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
1590                 maddr += dma_len                
1591                 
1592                 // 0525 0083 0ea4 lri         $AR3, #0x0ea4 // buffer 2
1593                 // 0527 02bf 054c call        0x054c
1594                 UnknownMulBuffer(0x0ea4);
1595                 
1596                 // 0529 0000      nop         
1597                 // 052a 0000      nop         
1598                 // 052b 8e00      set16       // restore
1599                 // 052c 8900      clr         $ACC1
1600         }
1601                 
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);
1608         
1609         // 0537 4900      addax       $ACC1, $AX0
1610         maddr += dma_len
1611         
1612         // 0538 0083 0e44 lri         $AR3, #0x0e44 // buffer 1
1613         // 053a 02bf 054c call        0x054c
1614         UnknownMulBuffer(0x0e44);
1615         
1616         // 053c 0083 0ea4 lri         $AR3, #0x0ea4 // buffer 2
1617         // 053e 02bf 054c call        0x054c
1618         UnknownMulBuffer(0x0ea4);
1619         
1620         0540 02df      ret
1623 // u32 maddr = AX0
1624 // u16 daddr = AX1.H
1625 // u16 len   = AC1.L
1626 // Only transfers from CPU -> DMEM
1627 void DMA_CPUToDMEM() {
1628         0541 8e00      set16       
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
1634         054b 02df      ret
1637 // IX1 = 0xffff
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
1645         
1646         // 054f 197a      lrri        $AX0.H, @$AR3
1647         // 0550 1978      lrri        $AX0.L, @$AR3
1648         AX0.H = *(AR3++)
1649         AX0.L = *(AR3++)
1650         
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
1655         
1656         // 0553 1130 055a bloopi      #0x30, 0x055a
1657         for (int i=0; i<48; i++) {
1658                 // 0555 9179      asr16'l     $ACC0 : $AC1.M, @$AR1
1659                 ACC0 >>= 16
1660                 AC1.M = *(unkForMulBuffer2++)
1661                 
1662                 // 0556 4e6d      addp'ln     $ACC0 : $AC1.L, @$AR1
1663                 ACC0 += PROD
1664                 AC1.L = *unkForMulBuffer2
1665                 unkForMulBuffer2 -= 1
1666                 
1667                 // 0557 197a      lrri        $AX0.H, @$AR3
1668                 AX0.H = *(AR3++)
1669                 
1670                 // 0558 4d43      add'l       $ACC1, $ACC0 : $AX0.L, @$AR3
1671                 ACC1 += ACC0
1672                 AX0.L = *(AR3++)
1673                 
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
1680         }
1681                 
1682         055b 02df      ret
1685 void WaitDMA() {
1686         // 055c 26c9      lrs         $AC0.M, @DSCR
1687         // 055d 02a0 0004 andf        $AC0.M, #0x0004
1688         // 055f 029c 055c jlnz        0x055c
1689         while (@DSCR & 4);
1690         
1691         // 0561 02df      ret
1692         return;
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
1700         0567 02df      ret
1702 void WaitForDSPMailbox1() {
1703         0568 26fc      lrs         $AC0.M, @DMBH
1704         0569 02a0 8000 andf        $AC0.M, #0x8000
1705         056b 029c 0568 jlnz        0x0568
1706         056d 02df      ret
1708 void WaitForDSPMailbox2() {
1709         056e 26fc      lrs         $AC0.M, @DMBH
1710         056f 02a0 8000 andf        $AC0.M, #0x8000
1711         0571 029c 056e jlnz        0x056e
1712         0573 02df      ret
1715 void Cmd_7() {
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++)
1721         
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
1728         u16 dma_len = 32
1729         
1730         // 057f 2dcb      srs         @DSBL, $AC1.L
1731         // DMA 32bytes from CPU @ maddr -> DMEM @ 0x0e44
1732         
1733         // 0580 4c00      add         $ACC0, $ACC1
1734         maddr += dma_len
1735         
1736         // Push CmdBlockBuf ptr
1737         0581 1c80      mrr         $IX0, $AR0
1738         
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
1747         
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?
1750         
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
1755         
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
1761         
1762         // DMA 0x0260bytes from CPU @ maddr -> DMEM @ 0x0e54
1763         // No waiting for DMA
1764         
1765         // 0598 009f 00a0 lri         $AC1.M, #0x00a0
1766         u16 size = 0x00a0
1767         
1768         // accum loads in the loop are 40bit
1769         // 059a 8f00      set40       
1770         
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
1782         }
1783         
1784         // Pop CmdBlockBuf ptr
1785         05a5 1c04      mrr         $AR0, $IX0
1786         
1787         // 05a6 029f 0068 jmp         0x0068
1788         goto DoNextCommand;
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
1850         
1851         05e0 8c00      clr15       
1852         05e1 8a00      m2          
1853         05e2 8e00      set16       
1854         05e3 00d8 0e16 lr          $AX0.L, @0x0e16
1855         05e5 195b      lrri        $AX1.H, @$AR2
1856         05e6 1959      lrri        $AX1.L, @$AR2
1857         05e7 8100      clr         $ACC0
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
1876         05fb 7d00      neg         $ACC1
1877         05fc 1cdd      mrr         $IX2, $AC1.L
1878         05fd 8900      clr         $ACC1
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
1902                 061a 0000      nop         
1903                 
1904         061b 0065 0620 bloop       $IX1, 0x0620
1905                 061d 1827      lrr         $IX3, @$AR1
1906                 061e 1b07      srri        @$AR0, $IX3
1907                 061f 0000      nop         
1908                 0620 0000      nop         
1909                 
1910         0621 0007      dar         $AR3
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
1918                 
1919         062a 1b7f      srri        @$AR3, $AC1.M
1920         062b 0004      dar         $AR0
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
1942         0643 8f00      set40       
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
1957                 
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
1964         
1965         065c 02df      ret
1968 void SRC_Linear() {
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
2025         
2026         // 0695 8c00      clr15       // signed mulx
2027         // 0696 8a00      m2          // *2
2028         // 0697 8e00      set16       // no sign extend
2029         
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
2039         AR0 = 0x0e44
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]
2044         
2045         *0x0e44 = pb.src.last_samples[2]
2046         *0x0e45 = pb.src.last_samples[3]
2047         
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
2057         IX0 = ACC1 >> 16
2058         IX1 = ((ACC1 & 0xffff) & 0xc000) >> 14
2059         IX2 = ~((ACC1 >> 16) - 32)
2060         AX0.H = 0x01fc
2061         AC0.M = 0x0e45
2062         AR1 = 0xffdd // DSP_ACCELERATOR
2063         AR3 = 0x0d80
2064         
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
2085         //      06c3 0000      nop         
2086         //      06c4 1827      lrr         $IX3, @$AR1
2087         //      06c5 1b07      srri        @$AR0, $IX3
2088         //      06c6 0000      nop         
2089         //      06c7 0000      nop         
2090         //      06c8 1827      lrr         $IX3, @$AR1
2091         //      06c9 1b07      srri        @$AR0, $IX3
2092         //      06ca 0000      nop         
2093         //      06cb 0000      nop         
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
2103         }
2104                 
2105         // 06cc 0065 06d1 bloop       $IX1, 0x06d1
2106         //      06ce 1827      lrr         $IX3, @$AR1
2107         //      06cf 1b07      srri        @$AR0, $IX3
2108         //      06d0 0000      nop         
2109         //      06d1 0000      nop         
2110         for (i = 0; i < IX1; i++) {
2111                 *(0x0e46++) = *DSP_ACCELERATOR
2112         }
2113                 
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
2122         }
2123                 
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
2134         *(0x0e46++)--
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
2140         
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
2153         pb.adpm.yn2 = *yn2
2154         pb.adpm.yn1 = *yn1
2155         pb.adpm.pred_scale = *scale
2156         pb.addr.currentAddressLo = *ACCAL // Current playback position
2157         pb.addr.currentAddressHi = *ACCAH
2158         
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
2164         06f6 8100      clr         $ACC0
2165         06f7 1120 0703 bloopi      #0x20, 0x0703
2166                 06f9 8900      clr         $ACC1
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
2177                 
2178         0704 00e1 0e42 sr          @0x0e42, $AR1
2179         
2180         0706 02df      ret
2183 void SRC_None() {
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
2240         
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
2246         //      0747 0000      nop         
2247         //      0748 0000      nop         
2248         // 0749 00e0 0e42 sr          @0x0e42, $AR0
2249         
2250         u16 i = *0x0e42
2251         for (; i < ((*0x0e42) + 0x20); i++) {
2252                 *i = *DSP_ACCELERATOR
2253         }
2254         *0x0e42 = i
2255         
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
2274         
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
2285         pb.adpm.yn2 = *yn2
2286         pb.adpm.yn1 = *yn1
2287         pb.adpm.pred_scale = *scale
2288         pb.addr.currentAddressLo = *ACCAL // Current playback position
2289         pb.addr.currentAddressHi = *ACCAH
2290         
2291         0767 02df      ret
2295 # From here to the jump tables, all the funcs just wrap calls to mixer(s) in IROM
2297 void Mixer_0() {
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
2307         0779 02df      ret
2310 void Mixer_1() {
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
2329         079c 02df      ret
2332 void Mixer_2() {
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
2351         07bf 02df      ret
2354 void Unk() {
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
2382         07f3 02df      ret
2385 void Unk() {
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
2401         0810 02df      ret
2404 void Unk() {
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
2432         0843 02df      ret
2435 void Unk() {
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
2463         0876 02df      ret
2466 void Unk() {
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
2509         08c5 02df      ret
2512 void Unk() {
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
2522         08d8 02df      ret
2525 void Unk() {
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
2544         08fd 02df      ret
2547 void Unk() {
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
2566         0922 02df      ret
2569 void Unk() {
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
2597         0959 02df      ret
2600 void Unk() {
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
2616         0978 02df      ret
2619 void Unk() {
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
2647         09ae 02df      ret
2650 void Unk() {
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
2678         09e4 02df      ret
2681 void Unk() {
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
2724         0a38 02df      ret
2727 void Unk() {
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
2746         0a5a 02df      ret
2749 void Unk() {
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
2783         0a98 02df      ret
2786 void Unk() {
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
2805         0abc 02df      ret
2808 void Unk() {
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
2842         0afe 02df      ret
2845 # Jump table for main commands
2846 0aff 0082   // Jump  0
2847 0b00 013e   // Jump  1
2848 0b01 01bc   // Jump  2
2849 0b02 0248   // Jump  3
2850 0b03 0413   // Jump  4
2851 0b04 0427   // Jump  5
2852 0b05 0165   // Jump  6
2853 0b06 0574   // Jump  7
2854 0b07 0b37   // Jump  8
2855 0b08 015f   // Jump  9
2856 0b09 0478   // Jump  a
2857 0b0a 0474   // Jump  b
2858 0b0b 0476   // Jump  c
2859 0b0c 01a9   // Jump  d
2860 0b0d 043b   // Jump  e
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)
2906 0b34 1000
2907 0b35 1200
2908 0b36 1400
2910 # End of noise - back to code.
2912 void Cmd_8() {
2913         0b37 8e00      set16       
2914         
2915         0b38 8100      clr         $ACC0
2916         0b39 8970      clr'l       $ACC1 : $AC0.M, @$AR0
2917         0b3a 191c      lrri        $AC0.L, @$AR0
2918         
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
2924         
2925         0b43 1f7e      mrr         $AX1.H, $AC0.M
2926         0b44 1f3c      mrr         $AX1.L, $AC0.L
2927         
2928         0b45 8100      clr         $ACC0
2929         
2930         0b46 26c9      lrs         $AC0.M, @DSCR
2931         0b47 02a0 0004 andf        $AC0.M, #0x0004
2932         0b49 029c 0b46 jlnz        0x0b46
2933         
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
2941         
2942         0b55 1c80      mrr         $IX0, $AR0
2943         
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
2951         0b63 8100      clr         $ACC0
2952         
2953         0b64 26c9      lrs         $AC0.M, @DSCR
2954         0b65 02a0 0004 andf        $AC0.M, #0x0004
2955         0b67 029c 0b64 jlnz        0x0b64
2956         
2957         0b69 8f00      set40       
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
2980                 
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
2990         
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
2996         
2997         0b95 8900      clr         $ACC1
2998         0b96 8100      clr         $ACC0
2999         
3000         0b97 8f00      set40       
3001         
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
3010                 
3011         0ba1 8e00      set16       
3012         
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
3020         
3021         // 0bac 02bf 055c call        0x055c
3022         WaitDMA();
3023         
3024         0bae 1c04      mrr         $AR0, $IX0
3025         
3026         // 0baf 029f 0068 jmp         0x0068
3027         goto DoNextCommand;
3030 void Cmd_10() {
3031         0bb1 8e00      set16       
3032         
3033         0bb2 8100      clr         $ACC0
3034         0bb3 8970      clr'l       $ACC1 : $AC0.M, @$AR0
3035         0bb4 191c      lrri        $AC0.L, @$AR0
3036         
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
3042         
3043         // 0bbd 02bf 055c call        0x055c
3044         WaitDMA();
3045         
3046         0bbf 8100      clr         $ACC0
3047         0bc0 8970      clr'l       $ACC1 : $AC0.M, @$AR0
3048         0bc1 191c      lrri        $AC0.L, @$AR0
3049         
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
3054         0bc8 8900      clr         $ACC1
3055         0bc9 0d20      lris        $AC1.L, #0x20
3056         0bca 2dcb      srs         @DSBL, $AC1.L
3057         
3058         0bcb 4c00      add         $ACC0, $ACC1
3059         
3060         0bcc 1c80      mrr         $IX0, $AR0
3061         
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
3066         
3067         0bd3 27c9      lrs         $AC1.M, @DSCR
3068         0bd4 03a0 0004 andf        $AC1.M, #0x0004
3069         0bd6 029c 0bd3 jlnz        0x0bd3
3070         
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
3076         
3077         0be0 8f00      set40       
3078         
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
3092                 
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
3102         0bf8 7c00      neg         $ACC0
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
3108                 0bff 7d00      neg         $ACC1
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
3113                 0c04 7c00      neg         $ACC0
3114                 0c05 4a2a      addax's     $ACC0, $AX1.L : @$AR2, $AC1.L
3115                 
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
3119         0c09 7d00      neg         $ACC1
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
3123         
3124         0c0d 1c04      mrr         $AR0, $IX0
3125         
3126         // 0c0e 029f 0068 jmp         0x0068
3127         goto DoNextCommand;
3130 # Begin interrupt handlers
3132 // Sends mail with value on top of callstack and rti's
3133 void ResetAndStackUOFlow_Handler() {
3134         0c10 8e00      set16       
3135         
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
3141         
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);
3146         
3147         // 0c1b 0000      nop         
3148         // 0c1c 0000      nop         
3149         // 0c1d 0000      nop         
3150         // 0c1e 02ff      rti         
3151         return;
3154 // Saves/Restores whole ACC0, but only modifies AC0.M. strange
3155 void Int2_Handler() {
3156         0c1f 8e00      set16       
3157         
3158         // Save ACC0
3159         0c20 00f0 0e17 sr          @0x0e17, $AC0.H
3160         0c22 00fe 0e18 sr          @0x0e18, $AC0.M
3161         0c24 00fc 0e19 sr          @0x0e19, $AC0.L
3162         
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
3168         
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);
3173         
3174         // Restore ACC0
3175         0c30 00d0 0e17 lr          $AC0.H, @0x0e17
3176         0c32 00de 0e18 lr          $AC0.M, @0x0e18
3177         0c34 00dc 0e19 lr          $AC0.L, @0x0e19
3178         
3179         // 0c36 0000      nop         
3180         // 0c37 0000      nop         
3181         // 0c38 0000      nop         
3182         // 0c39 0000      nop         
3183         // 0c3a 02ff      rti         
3184         return;
3187 void Int3_Handler() {
3188         0c3b 8e00      set16       
3189         
3190         // Save AC0.L, AC0.M
3191         0c3c 1dbc      mrr         $ST1, $AC0.L
3192         0c3d 1dbe      mrr         $ST1, $AC0.M
3193         
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
3202         }
3203         
3204         // Restore AC0.L, AC0.M
3205         0c47 1fcd      mrr         $AC0.M, $ST1
3206         0c48 1f8d      mrr         $AC0.L, $ST1
3207         
3208         // 0c49 02ff      rti         
3209         return;
3212 void Int4_Handler() {
3213         // 0c4a 0000      nop         
3214         // 0c4b 0000      nop         
3215         // 0c4c 0000      nop         
3216         // 0c4d 0000      nop         
3217         // 0c4e 0000      nop         
3218         // 0c4f 02ff      rti         
3219         return;
3222 void Int5_Handler() {
3223         0c50 8e00      set16       
3224         
3225         // Save AC0.L, AC0.M
3226         0c51 1dbc      mrr         $ST1, $AC0.L
3227         0c52 1dbe      mrr         $ST1, $AC0.M
3228         
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
3234         {
3235                 // 0c59 0e00      lris        $AC0.M, #0x00
3236                 // 0c5a 00fe 0b87 sr          @0x0b87, $AC0.M
3237                 *0x0b87 = 0;    // pb.state = AX_PB_STATE_STOP
3238                 
3239                 // Restore AC0.L, AC0.M
3240                 0c5c 1fcd      mrr         $AC0.M, $ST1
3241                 0c5d 1f8d      mrr         $AC0.L, $ST1
3242                 
3243                 // 0c5e 02ff      rti         
3244                 return;
3245         }
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
3252         
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
3262                 
3263                 // Restore AC0.L, AC0.M
3264                 0c6e 1fcd      mrr         $AC0.M, $ST1
3265                 0c6f 1f8d      mrr         $AC0.L, $ST1
3266                 
3267                 // 0c70 02ff      rti         
3268                 return;
3269                 
3270         } else {
3271         
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?
3280                 @yn1 = @yn1
3281                 @yn2 = @yn2
3282                 
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
3289                 pb.pad[0]++
3290                 
3291                 // Restore AC0.L, AC0.M
3292                 0c7f 1fcd      mrr         $AC0.M, $ST1
3293                 0c80 1f8d      mrr         $AC0.L, $ST1
3294                 
3295                 // 0c81 02ff      rti         
3296                 return;
3297         }
3300 void Int6_Handler() {
3301         0c82 0000      nop         
3302         0c83 0000      nop         
3303         0c84 0000      nop         
3304         0c85 0000      nop         
3305         0c86 0000      nop         
3306         0c87 02ff      rti         
3309 void Int7_Handler() {
3310         0c88 0000      nop         
3311         0c89 0000      nop         
3312         0c8a 0000      nop         
3313         0c8b 0000      nop         
3314         0c8c 02ff      rti         
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() {
3328         0c91 8e00      set16       
3329         0c92 8100      clr         $ACC0
3330         0c93 8900      clr         $ACC1
3331         
3332         // 0c94 02bf 0ce0 call        0x0ce0
3333         WaitForCPUMail0();
3334         
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
3342         switch(@CMBL) {
3343         case 0: AX_ResumeTask(); break;
3344         case 1: JumpTable2_1(); break;
3345         case 2: IROM_Reset(); break;
3346         case 3: AX_GetNextCmdBlock(); break;
3347         }
3348         0c9e 0021      halt        
3351 // case 0:
3352 void AX_ResumeTask() {
3353         0c9f 029f 0030 jmp         0x0030
3354         0ca1 0021      halt        
3357 // case 1:
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
3365         WaitForCPUMail0();
3366         
3367         // 0ca6 24ff      lrs         $AC0.L, @CMBL
3368         // 0ca7 02bf 0ce6 call        0x0ce6
3369         WaitForCPUMail1();
3370         
3371         // 0ca9 25ff      lrs         $AC1.L, @CMBL
3372         // 0caa 02bf 0ce6 call        0x0ce6
3373         WaitForCPUMail1();
3374         
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
3381         
3382         // 0cb3 8100      clr         $ACC0
3383         // 0cb4 8900      clr         $ACC1
3384         // 0cb5 02bf 0ce0 call        0x0ce0
3385         WaitForCPUMail0();
3386         
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
3391         WaitForCPUMail1();
3392         
3393         0cbc 25ff      lrs         $AC1.L, @CMBL
3394         0cbd 02bf 0ce6 call        0x0ce6
3395         WaitForCPUMail1();
3396         
3397         0cbf 27ff      lrs         $AC1.M, @CMBL
3398         0cc0 1cdf      mrr         $IX2, $AC1.M
3399         0cc1 1cfd      mrr         $IX3, $AC1.L
3400         
3401         // 0cc2 8100      clr         $ACC0
3402         // 0cc3 02bf 0ce0 call        0x0ce0
3403         WaitForCPUMail0();
3404         
3405         0cc5 26ff      lrs         $AC0.M, @CMBL
3406         0cc6 1c1e      mrr         $AR0, $AC0.M
3407         0cc7 8900      clr         $ACC1
3408         0cc8 02bf 0ce6 call        0x0ce6
3409         WaitForCPUMail1();
3410         
3411         0cca 20ff      lrs         $AX0.L, @CMBL
3412         0ccb 1f5f      mrr         $AX0.H, $AC1.M
3413         0ccc 02bf 0ce0 call        0x0ce0
3414         WaitForCPUMail0();
3415         
3416         0cce 21ff      lrs         $AX1.L, @CMBL
3417         0ccf 02bf 0ce0 call        0x0ce0
3418         WaitForCPUMail0();
3419         
3420         0cd1 23ff      lrs         $AX1.H, @CMBL
3421         
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
3426         
3427         // 0cd7 029f 80b5 jmp         0x80b5
3428         // 0cd9 0021      halt        
3429         IROM_ErrorAndDie(); // Not sure...gotta RE the ROM
3432 // case 2:
3433 void IROM_Reset() {
3434         0cda 029f 8000 jmp         0x8000
3435         0cdc 0021      halt        
3438 // case 3:
3439 void AX_GetNextCmdBlock() {
3440         // 0cdd 029f 0045 jmp         0x0045
3441         goto GetNextCmdBlock;
3442         
3443         0cdf 0021      halt        
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);
3451         // 0ce5 02df      ret
3452         return;
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);
3460         // 0ceb 02df      ret
3461         return;
3464 0cec 0000      nop         
3465 0ced 0000      nop         
3466 0cee 0000      nop         
3467 0cef 0000      nop