dolphin/docs/DSP/DSP_UC_SuperMarioGalaxy.txt

3174 lines
128 KiB
Plaintext
Raw Normal View History

// Memory map:
//
// 0x0D00: final right buffer #1
// 0x0D60: final left buffer #1
// 0x0F40: final right buffer #2
// 0x0CA0: final left buffer #2
0000 029f 0012 jmp 0x0012 // Reset()
0002 0000 nop
0003 0000 nop
0004 02ff rti
0005 0000 nop
0006 02ff rti
0007 0000 nop
0008 02ff rti
0009 0000 nop
000a 02ff rti
000b 0000 nop
000c 02ff rti
000d 0000 nop
000e 029f 06e9 jmp 0x06e9 // Exception_0E()
0010 029f 004c jmp 0x004c // TaskStart()
// Reset()
0012 1205 sbclr #0x05
0013 02bf 0055 call 0x0055
0015 8100 clr $ACC0
0016 009f 1000 lri $AC1.M, #0x1000
0018 0080 0000 lri $AR0, #0x0000
001a 005f loop $AC1.M
001b 1b1e srri @$AR0, $AC0.M
001c 02bf 07b9 call 0x07b9 // InitGlobalVars()
001e 02bf 0f0a call 0x0f0a // InitUnkTable()
0020 0e00 lris $AC0.M, #0x00
0021 02bf 079b call 0x079b // SendMail_DCD1(0x0000)
0023 009e 1111 lri $AC0.M, #0x1111
0025 02bf 07a5 call 0x07a5 // sendMail_F355(0x1111)
0027 0e00 lris $AC0.M, #0x00
0028 00fe 034e sr @0x034e, $AC0.M
002a 1305 sbset #0x05
002b 029f 07f6 jmp 0x07f6 // jump to MessageLoop()
// OpcodeHandler()
002d 00df 0357 lr $AC1.M, @0x0357
002f 00ff 0345 sr @0x0345, $AC1.M
0031 00de 0356 lr $AC0.M, @0x0356
0033 1ffe mrr $AC1.M, $AC0.M
0034 0340 00ff andi $AC1.M, #0x00ff
0036 00ff 0344 sr @0x0344, $AC1.M
0038 1479 lsr $ACC0, #-7
0039 0240 007e andi $AC0.M, #0x007e
003b 00fe 0343 sr @0x0343, $AC0.M
003d 0200 0073 addi $AC0.M, #0x0073 // Opcode jump table address (0x0073)
003f 1c1e mrr $AR0, $AC0.M
0040 170f jmpr $AR0 // jump to opcode handler
0041 0092 00ff lri $CR, #0x00ff // Return address from opcode handler
0043 0e04 lris $AC0.M, #0x04
0044 02bf 079b call 0x079b // SendMail_DCD1(0x0004)
0046 00de 0356 lr $AC0.M, @0x0356
0048 02bf 07a5 call 0x07a5 // SendMail_F355(mail_high_part)
004a 029f 002b jmp 0x002b // jump back to MessageLoop()
// TaskStart()
004c 1205 sbclr #0x05
004d 02bf 0055 call 0x0055
004f 0e01 lris $AC0.M, #0x01
0050 02bf 079b call 0x079b // SendMail_DCD1(0x0001)
0052 1305 sbset #0x05
0053 029f 002b jmp 0x002b // jump back to MessageLoop()
//
0055 1202 sbclr #0x02
0056 1203 sbclr #0x03
0057 1204 sbclr #0x04
0058 1306 sbset #0x06
0059 8e00 set16
005a 8c00 clr15
005b 8b00 m0
005c 009e ffff lri $AC0.M, #0xffff
005e 1d1e mrr $WR0, $AC0.M
005f 1d3e mrr $WR1, $AC0.M
0060 1d5e mrr $WR2, $AC0.M
0061 1d7e mrr $WR3, $AC0.M
0062 0092 00ff lri $CR, #0x00ff
0064 02df ret
// ReadWholeMessage()
0065 0081 0358 lri $AR1, #0x0358
0067 0090 0000 lri $AC0.H, #0x0000
0069 0c00 lris $AC0.L, #0x00
006a 007e 006f bloop $AC0.M, 0x006f
006c 193e lrri $AC0.M, @$AR1
006d 1b1e srri @$AR0, $AC0.M
006e 193e lrri $AC0.M, @$AR1
006f 1b1e srri @$AR0, $AC0.M
0070 02df ret
// Opcode_03() (dummy)
0071 029f 0041 jmp 0x0041
// Opcode jump table (16 opcodes available)
0073 029f 0041 jmp 0x0041 // 0 (dummy)
0075 029f 0093 jmp 0x0093 // 1 (DsetupTable)
0077 029f 029d jmp 0x029d // 2 (SyncFrame)
0079 029f 0071 jmp 0x0071 // 3 (dummy)
007b 029f 0616 jmp 0x0616 // 4 ()
007d 029f 0628 jmp 0x0628 // 5 ()
007f 029f 0041 jmp 0x0041 // 6 (dummy)
0081 029f 055f jmp 0x055f // 7 ()
0083 029f 05ab jmp 0x05ab // 8 ()
0085 029f 058f jmp 0x058f // 9 ()
0087 029f 0041 jmp 0x0041 // A (dummy)
0089 029f 0041 jmp 0x0041 // B (dummy)
008b 029f 0041 jmp 0x0041 // C (dummy)
008d 029f 00bd jmp 0x00bd // D (DsetDolbyDelay)
008f 029f 00b0 jmp 0x00b0 // E ()
0091 029f 0041 jmp 0x0041 // F (dummy)
// Opcode_01() - DsetupTable
// Message body: 5 mails
// Mail 1: bit0-15 = max (see inner loop of SyncFrame), bit16-32 = 0, bit24-30 = command (0x01)
// Mail 2: Address in main memory of parameter blocks used during mixing; there are X blocks of 384 bytes (192 words) each
// Mail 3: Address in main memory of something (640 words copied to 0x0000)
// Mail 4: Address in main memory of something (32 words copied to 0x0300)
// Mail 5: Address in main memory of other parameter blocks; there are 4 blocks (or more?) of 32 bytes (16 words) each
// Stores the mail body to 0x0380.
0093 0080 0380 lri $AR0, #0x0380
0095 0e04 lris $AC0.M, #0x04
0096 02bf 0065 call 0x0065
0098 0081 0382 lri $AR1, #0x0382
009a 009f 0000 lri $AC1.M, #0x0000
009c 0080 0280 lri $AR0, #0x0280
009e 02bf 05e6 call 0x05e6 // DmaCopy(0x0000, Dword[0x0382], 0x280)
00a0 0081 0384 lri $AR1, #0x0384
00a2 009f 0300 lri $AC1.M, #0x0300
00a4 0080 0020 lri $AR0, #0x0020
00a6 02bf 05e6 call 0x05e6 // DmaCopy(0x0300, Dword[0x0384], 32)
00a8 00de 0345 lr $AC0.M, @0x0345
00aa 00fe 0342 sr @0x0342, $AC0.M
00ac 02bf 0d01 call 0x0d01
00ae 029f 0041 jmp 0x0041
// Opcode_0E()
00b0 0080 037d lri $AR0, #0x037d
00b2 0e01 lris $AC0.M, #0x01
00b3 02bf 0065 call 0x0065
00b5 00de 037d lr $AC0.M, @0x037d
00b7 0240 7fff andi $AC0.M, #0x7fff
00b9 00fe 037d sr @0x037d, $AC0.M
00bb 029f 0041 jmp 0x0041
// Opcode_0D() - DsetDolbyDelay
00bd 0080 0374 lri $AR0, #0x0374
00bf 0e01 lris $AC0.M, #0x01
00c0 00fe 0377 sr @0x0377, $AC0.M
00c2 00fe 037c sr @0x037c, $AC0.M
00c4 02bf 0065 call 0x0065
00c6 00de 0345 lr $AC0.M, @0x0345
00c8 00fe 0376 sr @0x0376, $AC0.M
00ca 029f 0041 jmp 0x0041
// read PB
00cc 0081 034c lri $AR1, #0x034c
00ce 009f 0400 lri $AC1.M, #0x0400
00d0 0080 00c0 lri $AR0, #0x00c0
00d2 02bf 05e6 call 0x05e6 // DmaCopy(0x0400, Dword[0x034C], 192)
00d4 02df ret
// writeback PB
00d5 0081 034c lri $AR1, #0x034c
00d7 009f 0400 lri $AC1.M, #0x0400
00d9 0080 0080 lri $AR0, #0x0080
00db 0081 034c lri $AR1, #0x034c
00dd 193e lrri $AC0.M, @$AR1
00de 193c lrri $AC0.L, @$AR1
00df 0098 0000 lri $AX0.L, #0x0000
00e1 7000 addaxl $ACC0, $AX0.L
00e2 02bf 05f5 call 0x05f5 // DmaCopy(Dword[0x034C], 0x0400, 128)
00e4 02df ret
//
00e5 191e lrri $AC0.M, @$AR0
00e6 191a lrri $AX0.H, @$AR0
00e7 005f loop $AC1.M
00e8 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
00e9 1b7e srri @$AR3, $AC0.M
00ea 1b7a srri @$AR3, $AX0.H
00eb 02df ret
// memcpy(destination, source, length)
// AR0 = source address
// AR3 = destination address
// AC1.M = length in dwords
00ec 0000 nop
00ed 007f 00f2 bloop $AC1.M, 0x00f2
00ef 191e lrri $AC0.M, @$AR0
00f0 1b7e srri @$AR3, $AC0.M
00f1 191e lrri $AC0.M, @$AR0
00f2 1b7e srri @$AR3, $AC0.M
00f3 0000 nop
00f4 02df ret
//
00f5 191e lrri $AC0.M, @$AR0
00f6 191a lrri $AX0.H, @$AR0
00f7 007f 00fc bloop $AC1.M, 0x00fc
00f9 32b2 xorr'sl $AC0.M, $AX1.H : $AC0.M, $AX1.H
00fa 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M
00fb 33ba xorr'slm $AC1.M, $AX1.H : $AC0.M, $AX1.H
00fc 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M
00fd 0000 nop
00fe 02df ret
// multiply routine
// AC1.M = size in words
// AR0 = source addres
// AR3 = destination address
00ff 8a00 m2 // multiply result by 2
0100 157f lsr $ACC1, #-1 // size >>= 1 (process buffers per dwords)
0101 1c20 mrr $AR1, $AR0 // AR1 = AR0
0102 1c03 mrr $AR0, $AR3 // AR0 = AR3
0103 193a lrri $AX0.H, @$AR1 // AX0.H = Mem[AR1]; AR1++;
0104 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 // prod = AX0.L * AX0.H; AX0.H = Mem[AR1]; AR1++;
0105 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 // AC0.M = prod; AC0.L = 0; prod = AX0.L * AX0.H; AX1.H = Mem[AR3]; AR3++;
0106 007f 010b bloop $AC1.M, 0x010b
0108 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 // ACC0 += AX1.H; AX0.H = Mem[AR1]; AR1++;
0109 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H // AC0.M = prod; AC0.L = 0; prod = AX0.L * AX0.H; ...
010a 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1
010b 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H
010c 8b00 m0 // don't multiply result
010d 02df ret
//
010e 8a00 m2
010f 191a lrri $AX0.H, @$AR0
0110 9050 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR0
0111 9250 mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX0.H, @$AR0
0112 005f loop $AC1.M
0113 92a0 mulmvz'ls $AX0.L, $AX0.H, $ACC0 : $AX0.H, $AC0.M
0114 8b00 m0
0115 02df ret
// ClearBuffers()
// clears:
// - 80 words at 0x0D00 (right buffer #1)
// - 80 words at 0x0D60 (left buffer #1)
// - 80 words at 0x0CA0 (left buffer #2)
// - 80 words at 0x0F40 (right buffer #2)
// - 80 words at 0x0FA0
// - 80 words at 0x0A00
// - 80 words at 0x09A0
// - 80 words at 0x0DC8
// - 80 words at 0x0E28
// - 80 words at 0x0E88
// - 80 words at 0x0EE8
// copies:
// - 8 words from 0x0E10 to 0x0DC0
// - 8 words from 0x0E70 to 0x0E20
// - 8 words from 0x0ED0 to 0x0E80
// - 8 words from 0x0F30 to 0x0EE0
0116 8100 clr $ACC0
0117 8900 clr $ACC1
0118 0e50 lris $AC0.M, #0x50
0119 0080 0d00 lri $AR0, #0x0d00
011b 005e loop $AC0.M
011c 1b1f srri @$AR0, $AC1.M
011d 0080 0d60 lri $AR0, #0x0d60
011f 005e loop $AC0.M
0120 1b1f srri @$AR0, $AC1.M
0121 00da 0374 lr $AX0.H, @0x0374
0123 8600 tstaxh $AX0.H
0124 02b5 0f35 callz 0x0f35 // call this mixer if right buffer address is 0??? uh???
0126 8100 clr $ACC0
0127 8900 clr $ACC1
0128 0e50 lris $AC0.M, #0x50
0129 0080 0ca0 lri $AR0, #0x0ca0
012b 005e loop $AC0.M
012c 1b1f srri @$AR0, $AC1.M
012d 0080 0f40 lri $AR0, #0x0f40
012f 005e loop $AC0.M
0130 1b1f srri @$AR0, $AC1.M
0131 0080 0fa0 lri $AR0, #0x0fa0
0133 005e loop $AC0.M
0134 1b1f srri @$AR0, $AC1.M
0135 0080 0a00 lri $AR0, #0x0a00
0137 005e loop $AC0.M
0138 1b1f srri @$AR0, $AC1.M
0139 0080 09a0 lri $AR0, #0x09a0
013b 005e loop $AC0.M
013c 1b1f srri @$AR0, $AC1.M
013d 0f04 lris $AC1.M, #0x04
013e 0080 0e10 lri $AR0, #0x0e10
0140 0083 0dc0 lri $AR3, #0x0dc0
0142 02bf 00ec call 0x00ec // memcpy(0x0DC0, 0x0E10, 4);
0144 0080 0e70 lri $AR0, #0x0e70
0146 0083 0e20 lri $AR3, #0x0e20
0148 02bf 00ec call 0x00ec // memcpy(0x0E20, 0x0E70, 4);
014a 0080 0ed0 lri $AR0, #0x0ed0
014c 0083 0e80 lri $AR3, #0x0e80
014e 02bf 00ec call 0x00ec // memcpy(0x0E80, 0x0ED0, 4);
0150 0080 0f30 lri $AR0, #0x0f30
0152 0083 0ee0 lri $AR3, #0x0ee0
0154 02bf 00ec call 0x00ec // memcpy(0x0EE0, 0x0F30, 4);
0156 8100 clr $ACC0
0157 0e50 lris $AC0.M, #0x50
0158 8900 clr $ACC1
0159 0080 0dc8 lri $AR0, #0x0dc8
015b 005e loop $AC0.M
015c 1b1f srri @$AR0, $AC1.M
015d 0080 0e28 lri $AR0, #0x0e28
015f 005e loop $AC0.M
0160 1b1f srri @$AR0, $AC1.M
0161 0080 0e88 lri $AR0, #0x0e88
0163 005e loop $AC0.M
0164 1b1f srri @$AR0, $AC1.M
0165 0080 0ee8 lri $AR0, #0x0ee8
0167 005e loop $AC0.M
0168 1b1f srri @$AR0, $AC1.M
0169 02df ret
//
016a 009f 0580 lri $AC1.M, #0x0580
016c 009b 00a0 lri $AX1.H, #0x00a0
016e 0081 0393 lri $AR1, #0x0393
0170 18bc lrrd $AC0.L, @$AR1 // AC0.L = Mem[0x0393];
0171 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 // AC0.M = Mem[0x0392];
0172 bc00 mulxac $AX0.H, $AX1.H, $ACC0 // ACC0 += (AX0.H * AX1.H); (Mem[0x03A4] * 160)
0173 0080 0050 lri $AR0, #0x0050
0175 02bf 05e8 call 0x05e8 // DmaCopy(0x0580, ((Dword[0x0392 << 16) | Dword[0x0393]) + (Mem[0x03A4] * 160), 80);
0177 02df ret
//
0178 00df 03a1 lr $AC1.M, @0x03a1
017a 0508 addis $ACC1, #0x08
017b 0080 0580 lri $AR0, #0x0580
017d 1c7f mrr $AR3, $AC1.M
017e 0098 7fff lri $AX0.L, #0x7fff
0180 8900 clr $ACC1
0181 0f50 lris $AC1.M, #0x50
0182 02bf 00ff call 0x00ff // mult routine
0184 02df ret
// mix?
0185 00c0 03a0 lr $AR0, @0x03a0
0187 191a lrri $AX0.H, @$AR0 // AX0.H = Mem[0x03A4];
0188 02bf 016a call 0x016a // get music?
018a 02bf 0178 call 0x0178
018c 8100 clr $ACC0
018d 8900 clr $ACC1
018e 00de 0390 lr $AC0.M, @0x0390 // First word of PB: status; 1 = playing, 0 = not playing
0190 02a0 0001 andf $AC0.M, #0x0001
0192 029d 019b jlz 0x019b
0194 0080 0398 lri $AR0, #0x0398 //
0196 0e08 lris $AC0.M, #0x08
0197 00c1 03a1 lr $AR1, @0x03a1
0199 02bf 0c43 call 0x0c43 // ???
019b 0f50 lris $AC1.M, #0x50
019c 00c0 03a1 lr $AR0, @0x03a1
019e 00da 0394 lr $AX0.H, @0x0394 //
01a0 8600 tstaxh $AX0.H
01a1 0295 01a8 jz 0x01a8
01a3 1c7a mrr $AR3, $AX0.H
01a4 00d8 0395 lr $AX0.L, @0x0395
01a6 02bf 00ff call 0x00ff // mult routine
01a8 0f50 lris $AC1.M, #0x50
01a9 00c0 03a1 lr $AR0, @0x03a1
01ab 00da 0396 lr $AX0.H, @0x0396
01ad 8600 tstaxh $AX0.H
01ae 0295 01b5 jz 0x01b5
01b0 1c7a mrr $AR3, $AX0.H
01b1 00d8 0397 lr $AX0.L, @0x0397
01b3 02bf 00ff call 0x00ff
01b5 00de 0390 lr $AC0.M, @0x0390
01b7 02a0 0002 andf $AC0.M, #0x0002
01b9 02dd retlz
01ba 0080 0398 lri $AR0, #0x0398
01bc 0e08 lris $AC0.M, #0x08
01bd 00c1 03a1 lr $AR1, @0x03a1
01bf 02bf 0c43 call 0x0c43
01c1 02df ret
// mix background music? called by cmd 02 (SyncFrame)
// uses the 4 first PBs
// so these PBs would be for background music?
01c2 8900 clr $ACC1
01c3 009f 0dc0 lri $AC1.M, #0x0dc0
01c5 00ff 03a1 sr @0x03a1, $AC1.M
01c7 009f 03a8 lri $AC1.M, #0x03a8
01c9 00ff 03a2 sr @0x03a2, $AC1.M
01cb 009f 03a4 lri $AC1.M, #0x03a4
01cd 00ff 03a0 sr @0x03a0, $AC1.M
01cf 1104 01ef bloopi #0x04, 0x01ef // Perform mixing for 4 PBs
01d1 00c0 03a2 lr $AR0, @0x03a2 // Inited to 0x03A8
01d3 0083 0390 lri $AR3, #0x0390
01d5 8900 clr $ACC1
01d6 0f08 lris $AC1.M, #0x08
01d7 02bf 00ec call 0x00ec // memcpy(0x0390, Mem[0x03A2], 8); Copy the current PB to 0x0390
01d9 00da 0390 lr $AX0.H, @0x0390
01db 8600 tstaxh $AX0.H
01dc 0295 01e0 jz 0x01e0 // skip the call below if [0x0390] is nonzero? ([0x0390] = first word of PB, probably start/stop flag?)
01de 02bf 0185 call 0x0185 // mix?
01e0 8100 clr $ACC0
01e1 00de 03a2 lr $AC0.M, @0x03a2
01e3 0410 addis $ACC0, #0x10 // Increment address to next PB
01e4 00fe 03a2 sr @0x03a2, $AC0.M
01e6 00de 03a1 lr $AC0.M, @0x03a1
01e8 0460 addis $ACC0, #0x60 // Increment another value (buffer address???)
01e9 00fe 03a1 sr @0x03a1, $AC0.M
01eb 00de 03a0 lr $AC0.M, @0x03a0
01ed 7400 incm $AC0.M // Increment another value (address of something)
01ee 00fe 03a0 sr @0x03a0, $AC0.M
01f0 00da 0374 lr $AX0.H, @0x0374
01f2 8600 tstaxh $AX0.H
01f3 0294 0219 jnz 0x0219
01f5 0f50 lris $AC1.M, #0x50
01f6 0080 0be0 lri $AR0, #0x0be0
01f8 0083 0e80 lri $AR3, #0x0e80
01fa 0098 7fff lri $AX0.L, #0x7fff // +32767
01fc 02bf 00ff call 0x00ff // mult routine
01fe 0f50 lris $AC1.M, #0x50
01ff 0080 0be0 lri $AR0, #0x0be0
0201 0083 0ee0 lri $AR3, #0x0ee0
0203 0098 b820 lri $AX0.L, #0xb820 // -18400
0205 02bf 00ff call 0x00ff // mult routine
0207 0f28 lris $AC1.M, #0x28
0208 0080 0c68 lri $AR0, #0x0c68
020a 0083 0e80 lri $AR3, #0x0e80
020c 0098 b820 lri $AX0.L, #0xb820 // -18400
020e 02bf 00ff call 0x00ff // mult routine
0210 0f28 lris $AC1.M, #0x28
0211 0080 0c68 lri $AR0, #0x0c68
0213 0083 0ee0 lri $AR3, #0x0ee0
0215 0098 7fff lri $AX0.L, #0x7fff // +32767
0217 02bf 00ff call 0x00ff // mult routine
// clear buffers at 0x0BE0 and 0x0C40 (80 words(160 bytes) each)
0219 8100 clr $ACC0
021a 8900 clr $ACC1
021b 0e50 lris $AC0.M, #0x50
021c 0080 0be0 lri $AR0, #0x0be0
021e 005e loop $AC0.M
021f 1b1f srri @$AR0, $AC1.M
0220 0080 0c40 lri $AR0, #0x0c40
0222 005e loop $AC0.M
0223 1b1f srri @$AR0, $AC1.M
0224 02df ret
//
0225 00c0 03a0 lr $AR0, @0x03a0
0227 181a lrr $AX0.H, @$AR0
0228 8100 clr $ACC0
0229 181e lrr $AC0.M, @$AR0
022a 00db 0391 lr $AX1.H, @0x0391
022c 7400 incm $AC0.M
022d d100 cmpar $ACC1, $AX0.H
022e 0270 ifns
022f 8100 clr $ACC0
0230 1b1e srri @$AR0, $AC0.M
0231 00df 03a1 lr $AC1.M, @0x03a1
0233 009b 00a0 lri $AX1.H, #0x00a0
0235 0081 0393 lri $AR1, #0x0393
0237 18bc lrrd $AC0.L, @$AR1
0238 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1
0239 bc00 mulxac $AX0.H, $AX1.H, $ACC0
023a 0080 0050 lri $AR0, #0x0050
023c 02bf 05f5 call 0x05f5 // DmaCopy((Mem[0x0392] << 16 | Mem[0x0393]), Mem[0x03A1], 80);
023e 02df ret
// another mixer?
023f 00da 0374 lr $AX0.H, @0x0374
0241 8600 tstaxh $AX0.H
0242 0294 0258 jnz 0x0258
0244 8900 clr $ACC1
0245 0f28 lris $AC1.M, #0x28
0246 0080 0c40 lri $AR0, #0x0c40
0248 0083 0ea8 lri $AR3, #0x0ea8
024a 0098 b820 lri $AX0.L, #0xb820
024c 02bf 00ff call 0x00ff
024e 8900 clr $ACC1
024f 0f28 lris $AC1.M, #0x28
0250 0080 0c40 lri $AR0, #0x0c40
0252 0083 0f08 lri $AR3, #0x0f08
0254 0098 7fff lri $AX0.L, #0x7fff
0256 02bf 00ff call 0x00ff
0258 009f 0dc0 lri $AC1.M, #0x0dc0
025a 00ff 03a1 sr @0x03a1, $AC1.M
025c 009f 03a8 lri $AC1.M, #0x03a8
025e 00ff 03a2 sr @0x03a2, $AC1.M
0260 009f 03a4 lri $AC1.M, #0x03a4
0262 00ff 03a0 sr @0x03a0, $AC1.M
0264 1104 0282 bloopi #0x04, 0x0282
0266 00c0 03a2 lr $AR0, @0x03a2
0268 0083 0390 lri $AR3, #0x0390
026a 0f08 lris $AC1.M, #0x08
026b 02bf 00ec call 0x00ec // memcpy(0x0390, Mem[0x03A2], 8);
026d 00da 0390 lr $AX0.H, @0x0390
026f 8600 tstaxh $AX0.H
0270 0295 0274 jz 0x0274
0272 02bf 0225 call 0x0225
0274 00de 03a2 lr $AC0.M, @0x03a2
0276 0410 addis $ACC0, #0x10
0277 00fe 03a2 sr @0x03a2, $AC0.M
0279 00de 03a1 lr $AC0.M, @0x03a1
027b 0460 addis $ACC0, #0x60
027c 00fe 03a1 sr @0x03a1, $AC0.M
027e 00de 03a0 lr $AC0.M, @0x03a0
0280 7400 incm $AC0.M
0281 00fe 03a0 sr @0x03a0, $AC0.M
0283 02df ret
// CopyPBs()
// Copies some main memory region to 0x03A8
// The memory region contains what seems to be PBs...
// Each PB is 32 bytes (16 words) long
// The transfer copies 64 words, ie 4 PBs.
// There may be more PBs, though. Dunno...
0284 0081 0386 lri $AR1, #0x0386 // address of PBs, set by DsetupTable
0286 009f 03a8 lri $AC1.M, #0x03a8
0288 0080 0040 lri $AR0, #0x0040
028a 02bf 05e6 call 0x05e6 // DmaCopy(0x03A8, Dword[0x0386], 64)
028c 02df ret
// Helper
// Increment the 32-bit value at AR0 by the value
// in AX0.L.
028d 191e lrri $AC0.M, @$AR0
028e 189c lrrd $AC0.L, @$AR0
028f 4800 addax $ACC0, $AX0.L
0290 1b1e srri @$AR0, $AC0.M
0291 1b1c srri @$AR0, $AC0.L
0292 02df ret
// WaitForNextSyncMessage()
// Note: the wait loop continues until two values become non-equal.
// One of these values is set when sync mails are received.
// These mails, as well as 'regular' mails, are processed by the
// exception 7 handler. That's why that wait loop never checks for
// new mails.
0293 8100 clr $ACC0
0294 8900 clr $ACC1
0295 00df 0354 lr $AC1.M, @0x0354
0297 00de 034e lr $AC0.M, @0x034e
0299 8200 cmp
029a 0293 0293 jle 0x0293
029c 02df ret
// Opcode_02() - SyncFrame
// Message body: 5 mails
// Mail 1: bit0-15 = some number, bit16-32 = number of buffers to fill, bit24-30 = command (0x02)
// Mail 2: Address of right buffers in main memory (each buffer is 160 bytes long)
// Mail 3: Address of left buffers in main memory (each buffer is 160 bytes long)
// Mail 4: unused (zero)
// Mail 5: unused (zero)
// Stores the message body to 0x0388 and 0x0374.
// Performs mixing synchronously with the game.
029d 0080 0388 lri $AR0, #0x0388
029f 0081 0065 lri $AR1, #0x0065
02a1 0e02 lris $AC0.M, #0x02 // Copy only 2 mails. The 2 last mails are unused.
02a2 173f callr $AR1 // Copy message body to 0x0388
02a3 02bf 0476 call 0x0476 // Copy message body to 0x0374
02a5 00de 0344 lr $AC0.M, @0x0344
02a7 00fe 0341 sr @0x0341, $AC0.M
02a9 00de 0345 lr $AC0.M, @0x0345
02ab 00fe 038e sr @0x038e, $AC0.M // Mem[0x038E] = Mem[0x0345] (set by DsetupTable)
02ad 8100 clr $ACC0
02ae 00fe 0355 sr @0x0355, $AC0.M
02b0 02bf 0284 call 0x0284 // Copy 4 PBs to 0x03A8
02b2 0092 00ff lri $CR, #0x00ff
02b4 00de 0341 lr $AC0.M, @0x0341
02b6 007e 0471 bloop $AC0.M, 0x0471 // Outer loop: for(i = 0; i < number_of_buffers; i++)
02b8 02bf 0116 call 0x0116 // ClearBuffers()
02ba 02bf 01c2 call 0x01c2 // ??? mix background music? echo processing?
02bc 02bf 04e2 call 0x04e2 // ??? again a mixer?
02be 02bf 0a91 call 0x0a91 // ??? multiplications
02c0 00de 0355 lr $AC0.M, @0x0355
02c2 7400 incm $AC0.M // increment some counter
02c3 00fe 0355 sr @0x0355, $AC0.M
02c5 8100 clr $ACC0
02c6 00fe 0354 sr @0x0354, $AC0.M // reset some counter
02c8 00de 0342 lr $AC0.M, @0x0342
02ca 007e 0415 bloop $AC0.M, 0x0415 // Inner loop: for(j = 0; j < max (usually 64; set by DsetupTable); j++)
02cc 02bf 0293 call 0x0293 // WaitForNextSyncMessage()
02ce 8100 clr $ACC0
02cf 8900 clr $ACC1
02d0 00de 0354 lr $AC0.M, @0x0354
02d2 147c lsr $ACC0, #-4
02d3 0200 04fc addi $AC0.M, #0x04fc
02d5 1c1e mrr $AR0, $AC0.M
02d6 181f lrr $AC1.M, @$AR0
02d7 00de 0354 lr $AC0.M, @0x0354
02d9 0240 000f andi $AC0.M, #0x000f
02db 3d80 andc'ls $AC1.M : $AX0.L, $AC0.M
02dc 03c0 8000 andcf $AC1.M, #0x8000
02de 029c 0411 jlnz 0x0411 // skip if (AC1.M & 0x8000) != 0x8000
02e0 00d8 0354 lr $AX0.L, @0x0354
02e2 009a 0180 lri $AX0.H, #0x0180
02e4 8100 clr $ACC0
02e5 00de 0380 lr $AC0.M, @0x0380
02e7 00dc 0381 lr $AC0.L, @0x0381
02e9 9000 mul $AX0.L, $AX0.H
02ea 9400 mulac $AX0.L, $AX0.H, $ACC0 // ACC0 += (j * 384);
02eb 00fe 034c sr @0x034c, $AC0.M
02ed 00fc 034d sr @0x034d, $AC0.L
02ef 02bf 00cc call 0x00cc // read PB; dma transfer from (Dword[0x0380] + (j*384)) to 0x0400, 192 words
02f1 00da 0400 lr $AX0.H, @0x0400
02f3 8600 tstaxh $AX0.H
02f4 0295 0411 jz 0x0411 // skip if Mem[0x0400] is zero
02f6 00da 0401 lr $AX0.H, @0x0401
02f8 8600 tstaxh $AX0.H
02f9 0294 0411 jnz 0x0411 // skip if Mem[0x0401] is nonzero
02fb 00da 0433 lr $AX0.H, @0x0433
02fd 00fa 03f8 sr @0x03f8, $AX0.H // Mem[0x03F8] = Mem[0x0433]
02ff 00da 0406 lr $AX0.H, @0x0406
0301 8600 tstaxh $AX0.H
0302 0294 0ef5 jnz 0x0ef5 // jump to 0x0EF5 if Mem[0x0406] is nonzero
0304 8100 clr $ACC0
0305 00de 0480 lr $AC0.M, @0x0480 // switch (Mem[0x0480]) ; sound format?
0307 0609 cmpis $ACC0, #0x09 // case 0x09: (smg)
0308 0295 031b jz 0x031b
030a 0605 cmpis $ACC0, #0x05 // case 0x05:
030b 0295 031b jz 0x031b
030d 0608 cmpis $ACC0, #0x08 // case 0x08:
030e 0295 0ac1 jz 0x0ac1
0310 0610 cmpis $ACC0, #0x10 // case 0x10: (smg)
0311 0295 0b3e jz 0x0b3e
0313 0620 cmpis $ACC0, #0x20 // case 0x20:
0314 0295 0baf jz 0x0baf
0316 0621 cmpis $ACC0, #0x21 // case 0x21:
0317 0295 0bb7 jz 0x0bb7
0319 029f 09ae jmp 0x09ae // default:
// sound types 9 and 5
// no compression?
031b 00d8 0402 lr $AX0.L, @0x0402 // 0x0D71
031d 8100 clr $ACC0
031e 8900 clr $ACC1
031f 00dc 0430 lr $AC0.L, @0x0430 // 0x0000
0321 8d00 set15
0322 0950 lris $AX1.L, #0x50
0323 a000 mulx $AX0.L, $AX1.L
0324 a400 mulxac $AX0.L, $AX1.L, $ACC0
0325 1404 lsl $ACC0, #4 // ACC0 = (Mem[0x0430] + (Mem[0x0402] * 80)) << 4; (AC0.L = 0x3500; AC0.M = 0x0043; AC0.H = 0x00;)
0326 8c00 clr15
0327 1ffe mrr $AC1.M, $AC0.M // AC1.M = 0x0043;
0328 0083 0580 lri $AR3, #0x0580 // AR3 = 0x0580;
032a 02bf 086e call 0x086e
032c 029f 032e jmp 0x032e
032e 0080 0580 lri $AR0, #0x0580
0330 0081 0520 lri $AR1, #0x0520
0332 0099 0000 lri $AX1.L, #0x0000
0334 02bf 0e75 call 0x0e75 // store ramp
0336 009e 0520 lri $AC0.M, #0x0520
0338 00fe 038f sr @0x038f, $AC0.M // Mem[0x038F] = 0x0520;
033a 8900 clr $ACC1
033b 00df 0484 lr $AC1.M, @0x0484
033d 0340 001f andi $AC1.M, #0x001f
033f b900 tst $ACC1
0340 0295 0366 jz 0x0366
0342 00de 038f lr $AC0.M, @0x038f
0344 5c00 sub $ACC0, $AC1.L
0345 00fe 038f sr @0x038f, $AC0.M // Mem[0x038F] -= AC1.L; uh?
0347 1c7e mrr $AR3, $AC0.M
0348 0080 0440 lri $AR0, #0x0440
034a 05fe addis $ACC1, #0xfe
034b 02bf 00e5 call 0x00e5 // ???
034d 0080 0490 lri $AR0, #0x0490
034f 00c1 038f lr $AR1, @0x038f
0351 8900 clr $ACC1
0352 00df 0484 lr $AC1.M, @0x0484
0354 0340 001f andi $AC1.M, #0x001f
0356 02bf 0c62 call 0x0c62 // ???
0358 00de 038f lr $AC0.M, @0x038f
035a 0450 addis $ACC0, #0x50
035b 1c1e mrr $AR0, $AC0.M
035c 0083 0440 lri $AR3, #0x0440
035e 8900 clr $ACC1
035f 00df 0484 lr $AC1.M, @0x0484
0361 0340 001f andi $AC1.M, #0x001f
0363 05fe addis $ACC1, #0xfe
0364 02bf 00e5 call 0x00e5 // ???
0366 00de 0484 lr $AC0.M, @0x0484
0368 0240 0020 andi $AC0.M, #0x0020
036a 0295 0388 jz 0x0388
036c 0080 04a4 lri $AR0, #0x04a4
036e 00c1 038f lr $AR1, @0x038f
0370 0082 0454 lri $AR2, #0x0454
0372 0083 04a7 lri $AR3, #0x04a7
0374 18fa lrrd $AX0.H, @$AR3
0375 8600 tstaxh $AX0.H
0376 0294 0386 jnz 0x0386
0378 18fa lrrd $AX0.H, @$AR3
0379 8600 tstaxh $AX0.H
037a 0294 0386 jnz 0x0386
037c 18fa lrrd $AX0.H, @$AR3
037d 8600 tstaxh $AX0.H
037e 0294 0386 jnz 0x0386
0380 8100 clr $ACC0
0381 18fe lrrd $AC0.M, @$AR3
0382 0280 7fff cmpi $AC0.M, #0x7fff
0384 0295 0388 jz 0x0388
0386 02bf 0c7d call 0x0c7d // ???
0388 8100 clr $ACC0
0389 00de 042c lr $AC0.M, @0x042c // 0x0001
038b b100 tst $ACC0
038c 0295 0392 jz 0x0392
038e 02bf 0dc3 call 0x0dc3 // ???
0390 029f 0407 jmp 0x0407
0392 8100 clr $ACC0
0393 1c9e mrr $IX0, $AC0.M
0394 1cde mrr $IX2, $AC0.M
0395 7400 incm $AC0.M
0396 1cfe mrr $IX3, $AC0.M
0397 8100 clr $ACC0
0398 00de 0407 lr $AC0.M, @0x0407
039a b100 tst $ACC0
039b 0295 03aa jz 0x03aa
039d 00c3 038f lr $AR3, @0x038f
039f 0007 dar $AR3
03a0 0080 0477 lri $AR0, #0x0477
03a2 0084 ffff lri $IX0, #0xffff
03a4 0087 ffff lri $IX3, #0xffff
03a6 199a lrrn $AX0.H, @$AR0
03a7 6554 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR0
03a8 005e loop $AC0.M
03a9 65ad movr'lsnm $ACC1, $AX0.H : $AX0.H, $AC1.M
03aa 00da 0485 lr $AX0.H, @0x0485
03ac 8600 tstaxh $AX0.H
03ad 0295 03c0 jz 0x03c0
03af 8900 clr $ACC1
03b0 0086 0005 lri $IX2, #0x0005
03b2 0082 040a lri $AR2, #0x040a
03b4 1106 03b8 bloopi #0x06, 0x03b8
03b6 18de lrrd $AC0.M, @$AR2
03b7 147f lsr $ACC0, #-1
03b8 4d36 add'sn $ACC1, $AC0.L : @$AR2, $AC0.M
03b9 b900 tst $ACC1
03ba 0294 03c0 jnz 0x03c0
03bc 009a 0001 lri $AX0.H, #0x0001
03be 00fa 0401 sr @0x0401, $AX0.H // Key Off
03c0 8f00 set40
03c1 0086 0002 lri $IX2, #0x0002
03c3 0082 0408 lri $AR2, #0x0408
03c5 1106 03f0 bloopi #0x06, 0x03f0
03c7 8100 clr $ACC0
03c8 195e lrri $AC0.M, @$AR2
03c9 1200 sbclr #0x00
03ca b100 tst $ACC0
03cb 0275 ifz
03cc 1300 sbset #0x00
03cd 1c7e mrr $AR3, $AC0.M
03ce 195e lrri $AC0.M, @$AR2
03cf 195f lrri $AC1.M, @$AR2
03d0 5c00 sub $ACC0, $AC1.L
03d1 14fb asr $ACC0, #-5
03d2 1f5e mrr $AX0.H, $AC0.M
03d3 1f1c mrr $AX0.L, $AC0.L
03d4 185e lrr $AC0.M, @$AR2
03d5 0240 00ff andi $AC0.M, #0x00ff
03d7 1f7e mrr $AX1.H, $AC0.M
03d8 185e lrr $AC0.M, @$AR2
03d9 1478 lsr $ACC0, #-8
03da 009c 0000 lri $AC0.L, #0x0000
03dc d100 cmpar $ACC1, $AX0.H
03dd 0295 03e5 jz 0x03e5
03df 185e lrr $AC0.M, @$AR2
03e0 0272 ifg
03e1 7400 incm $AC0.M
03e2 0271 ifs
03e3 7800 decm $AC0.M
03e4 1a5e srr @$AR2, $AC0.M
03e5 0006 dar $AR2
03e6 00de 038f lr $AC0.M, @0x038f
03e8 5600 subr $ACC0, $AX1.H
03e9 029d 03ee jlz 0x03ee
03eb 1c1e mrr $AR0, $AC0.M
03ec 02bf 0d99 call 0x0d99 // ???
03ee 0000 nop
03ef 1b5f srri @$AR2, $AC1.M
03f0 000a iar $AR2
03f1 8e00 set16
03f2 8100 clr $ACC0
03f3 00de 0407 lr $AC0.M, @0x0407
03f5 b100 tst $ACC0
03f6 0295 0407 jz 0x0407
03f8 00c3 038f lr $AR3, @0x038f
03fa 0087 004f lri $IX3, #0x004f
03fc 001f addarn $AR3, $IX3
03fd 0080 0477 lri $AR0, #0x0477
03ff 0084 ffff lri $IX0, #0xffff
0401 0087 ffff lri $IX3, #0xffff
0403 19fa lrrn $AX0.H, @$AR3
0404 6557 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR3
0405 005e loop $AC0.M
0406 65af movr'slnm $ACC1, $AX0.H : $AC1.M, $AX0.H
0407 00da 0406 lr $AX0.H, @0x0406
0409 8600 tstaxh $AX0.H
040a 0294 040f jnz 0x040f // skip zeroing of Mem[0x0404] if Mem[0x0406] is nonzero
040c 8100 clr $ACC0
040d 00fe 0404 sr @0x0404, $AC0.M // Mem[0x0404] = 0x0000;
040f 02bf 00d5 call 0x00d5 // write back PB
0411 00de 0354 lr $AC0.M, @0x0354
0413 7400 incm $AC0.M // increment some counter
0414 00fe 0354 sr @0x0354, $AC0.M
// end of inner loop
0416 0e00 lris $AC0.M, #0x00
0417 00fe 034e sr @0x034e, $AC0.M
0419 0e04 lris $AC0.M, #0x04
041a 02bf 079b call 0x079b // SendMail_DCD1(0x0004)
041c 00de 0355 lr $AC0.M, @0x0355
041e 0260 ff00 ori $AC0.M, #0xff00
0420 02bf 07a5 call 0x07a5 // SendMail_F355(0xFF00 | Mem[0x0355])
0422 02bf 0d1f call 0x0d1f // ???
0424 02bf 0d31 call 0x0d31 // ???
0426 02bf 0d86 call 0x0d86 // perform mults on buffer #1
0428 00de 0341 lr $AC0.M, @0x0341
042a 7800 decm $AC0.M // decrement some counter
042b 00fe 0341 sr @0x0341, $AC0.M
042d 0080 09a0 lri $AR0, #0x09a0
042f 0083 0d00 lri $AR3, #0x0d00
0431 0f50 lris $AC1.M, #0x50
0432 0098 5a82 lri $AX0.L, #0x5a82
0434 02bf 00ff call 0x00ff // operations on right buffer
0436 0080 09a0 lri $AR0, #0x09a0
0438 0083 0d60 lri $AR3, #0x0d60
043a 0f50 lris $AC1.M, #0x50
043b 02bf 00ff call 0x00ff // operations on left buffer
043d 0083 0d00 lri $AR3, #0x0d00
043f 02bf 0db1 call 0x0db1 // operations on right buffer
0441 0081 0388 lri $AR1, #0x0388
0443 009f 0d00 lri $AC1.M, #0x0d00
0445 0080 0050 lri $AR0, #0x0050
0447 02bf 05f3 call 0x05f3 // DmaCopy(Dword[0x0388], 0x0D00, 80); Copy the final right buffer to main memory
0449 0080 0fa0 lri $AR0, #0x0fa0
044b 0083 0d60 lri $AR3, #0x0d60
044d 0f50 lris $AC1.M, #0x50
044e 0098 8000 lri $AX0.L, #0x8000
0450 02bf 00ff call 0x00ff // operations on left buffer (uh? again?)
0452 0083 0d60 lri $AR3, #0x0d60
0454 02bf 0db1 call 0x0db1 // operations on left buffer
0456 0081 038a lri $AR1, #0x038a
0458 009f 0d60 lri $AC1.M, #0x0d60
045a 0080 0050 lri $AR0, #0x0050
045c 02bf 05f3 call 0x05f3 // DmaCopy(Dword[0x038A], 0x0D60, 80); Copy the final left buffer to main memory
045e 009a 0000 lri $AX0.H, #0x0000
0460 0098 00a0 lri $AX0.L, #0x00a0
0462 0080 0388 lri $AR0, #0x0388
0464 02bf 028d call 0x028d // Increment right buffer address
0466 0080 038a lri $AR0, #0x038a
0468 02bf 028d call 0x028d // Increment left buffer address
046a 02bf 023f call 0x023f // call that other mixer
046c 02bf 04b1 call 0x04b1
046e 02bf 0488 call 0x0488 // copy other buffers to main memory
0470 0000 nop
0471 0000 nop
// end of outer loop
0472 0080 002b lri $AR0, #0x002b
0474 029f 0734 jmp 0x0734
// copy the message body to 0x0374
0476 0080 0374 lri $AR0, #0x0374
0478 0e02 lris $AC0.M, #0x02
0479 02bf 0067 call 0x0067
047b 00de 0374 lr $AC0.M, @0x0374
047d 0240 7fff andi $AC0.M, #0x7fff
047f 00fe 0374 sr @0x0374, $AC0.M
0481 00de 0376 lr $AC0.M, @0x0376
0483 0240 7fff andi $AC0.M, #0x7fff
0485 00fe 0376 sr @0x0376, $AC0.M
0487 02df ret
// copy other buffers to main memory
// that's probably why the mail body of cmd 0x02 is copied
// to two locations...
0488 00da 0374 lr $AX0.H, @0x0374
048a 8600 tstaxh $AX0.H // Return immediately if right buffer address is zero
048b 02d5 retz // But what happens if the left buffer address is zero?
048c 0083 0f40 lri $AR3, #0x0f40
048e 02bf 0db1 call 0x0db1 // copy right buffer
0490 0083 0ca0 lri $AR3, #0x0ca0
0492 02bf 0db1 call 0x0db1 // copy left buffer
0494 0081 0374 lri $AR1, #0x0374
0496 009f 0f40 lri $AC1.M, #0x0f40
0498 0080 0050 lri $AR0, #0x0050
049a 02bf 05f3 call 0x05f3 // DmaCopy(Dword[0x0374], 0x0F40, 80); Right buffer
049c 0081 0376 lri $AR1, #0x0376
049e 009f 0ca0 lri $AC1.M, #0x0ca0
04a0 0080 0050 lri $AR0, #0x0050
04a2 02bf 05f3 call 0x05f3 // DmaCopy(Dword[0x0376], 0x0CA0, 80); Left buffer
04a4 009a 0000 lri $AX0.H, #0x0000
04a6 0098 00a0 lri $AX0.L, #0x00a0
04a8 0080 0374 lri $AR0, #0x0374
04aa 02bf 028d call 0x028d // Increment right buffer address
04ac 0080 0376 lri $AR0, #0x0376
04ae 02bf 028d call 0x028d // Increment left buffer address
04b0 02df ret
//
04b1 00da 0374 lr $AX0.H, @0x0374
04b3 8600 tstaxh $AX0.H
04b4 02d5 retz
04b5 009f 0be0 lri $AC1.M, #0x0be0
04b7 00ff 03a1 sr @0x03a1, $AC1.M
04b9 00df 03ca lr $AC1.M, @0x03ca
04bb 00ff 0392 sr @0x0392, $AC1.M
04bd 00df 03cb lr $AC1.M, @0x03cb
04bf 00ff 0393 sr @0x0393, $AC1.M
04c1 009f 03a6 lri $AC1.M, #0x03a6
04c3 00ff 03a0 sr @0x03a0, $AC1.M
04c5 00df 03c9 lr $AC1.M, @0x03c9
04c7 00ff 0391 sr @0x0391, $AC1.M
04c9 02bf 0225 call 0x0225
04cb 009f 0c40 lri $AC1.M, #0x0c40
04cd 00ff 03a1 sr @0x03a1, $AC1.M
04cf 00df 03da lr $AC1.M, @0x03da
04d1 00ff 0392 sr @0x0392, $AC1.M
04d3 00df 03db lr $AC1.M, @0x03db
04d5 00ff 0393 sr @0x0393, $AC1.M
04d7 009f 03a7 lri $AC1.M, #0x03a7
04d9 00ff 03a0 sr @0x03a0, $AC1.M
04db 00df 03d9 lr $AC1.M, @0x03d9
04dd 00ff 0391 sr @0x0391, $AC1.M
04df 02bf 0225 call 0x0225
04e1 02df ret
// mixer?
04e2 00da 0374 lr $AX0.H, @0x0374 // Check if right buffer address is zero
04e4 8600 tstaxh $AX0.H
04e5 02d5 retz
04e6 00da 03d8 lr $AX0.H, @0x03d8 // uh?
04e8 8600 tstaxh $AX0.H
04e9 02d5 retz
04ea 0083 0be0 lri $AR3, #0x0be0
04ec 0080 0c30 lri $AR0, #0x0c30
04ee 0f04 lris $AC1.M, #0x04
04ef 02bf 00ec call 0x00ec // memcpy(0x0BE0, 0x0C30, 4);
04f1 0083 0c40 lri $AR3, #0x0c40
04f3 0080 0c90 lri $AR0, #0x0c90
04f5 0f04 lris $AC1.M, #0x04
04f6 02bf 00ec call 0x00ec // memcpy(0x0C40, 0x0C90, 4);
04f8 00df 03ca lr $AC1.M, @0x03ca
04fa 00ff 0392 sr @0x0392, $AC1.M
04fc 00df 03cb lr $AC1.M, @0x03cb
04fe 00ff 0393 sr @0x0393, $AC1.M
0500 00df 03a6 lr $AC1.M, @0x03a6
0502 7500 incm $AC1.M
0503 1f5f mrr $AX0.H, $AC1.M
0504 009f 0be8 lri $AC1.M, #0x0be8
0506 02bf 016c call 0x016c
0508 00df 03da lr $AC1.M, @0x03da
050a 00ff 0392 sr @0x0392, $AC1.M
050c 00df 03db lr $AC1.M, @0x03db
050e 00ff 0393 sr @0x0393, $AC1.M
0510 00df 03a7 lr $AC1.M, @0x03a7
0512 7500 incm $AC1.M
0513 1f5f mrr $AX0.H, $AC1.M
0514 009f 0c48 lri $AC1.M, #0x0c48
0516 02bf 016c call 0x016c
0518 00de 03c8 lr $AC0.M, @0x03c8
051a 02a0 0001 andf $AC0.M, #0x0001
051c 029d 0525 jlz 0x0525
051e 0080 03d0 lri $AR0, #0x03d0
0520 0e08 lris $AC0.M, #0x08
0521 0081 0be0 lri $AR1, #0x0be0
0523 02bf 0c43 call 0x0c43
0525 00de 03d8 lr $AC0.M, @0x03d8
0527 02a0 0001 andf $AC0.M, #0x0001
0529 029d 0532 jlz 0x0532
052b 0080 03e0 lri $AR0, #0x03e0
052d 0e08 lris $AC0.M, #0x08
052e 0081 0c40 lri $AR1, #0x0c40
0530 02bf 0c43 call 0x0c43
0532 0f50 lris $AC1.M, #0x50
0533 0080 0be0 lri $AR0, #0x0be0
0535 0083 0f40 lri $AR3, #0x0f40
0537 00d8 03cd lr $AX0.L, @0x03cd
0539 02bf 00ff call 0x00ff
053b 0f50 lris $AC1.M, #0x50
053c 0080 0c40 lri $AR0, #0x0c40
053e 0083 0ca0 lri $AR3, #0x0ca0
0540 00d8 03df lr $AX0.L, @0x03df
0542 02bf 00ff call 0x00ff
0544 00de 03c8 lr $AC0.M, @0x03c8
0546 02a0 0002 andf $AC0.M, #0x0002
0548 029d 0551 jlz 0x0551
054a 0080 03d0 lri $AR0, #0x03d0
054c 0e08 lris $AC0.M, #0x08
054d 0081 0be0 lri $AR1, #0x0be0
054f 02bf 0c43 call 0x0c43
0551 00de 03d8 lr $AC0.M, @0x03d8
0553 02a0 0002 andf $AC0.M, #0x0002
0555 029d 055e jlz 0x055e
0557 0080 03e0 lri $AR0, #0x03e0
0559 0e08 lris $AC0.M, #0x08
055a 0081 0c40 lri $AR1, #0x0c40
055c 02bf 0c43 call 0x0c43
055e 02df ret
// Opcode_07() -
055f 0080 0346 lri $AR0, #0x0346
0561 02bf 0065 call 0x0065
0563 02bf 0065 call 0x0065
0565 0081 0346 lri $AR1, #0x0346
0567 193e lrri $AC0.M, @$AR1
0568 193c lrri $AC0.L, @$AR1
0569 009f 0400 lri $AC1.M, #0x0400
056b 00c0 0345 lr $AR0, @0x0345
056d 02bf 05e8 call 0x05e8
056f 0081 0348 lri $AR1, #0x0348
0571 193e lrri $AC0.M, @$AR1
0572 193c lrri $AC0.L, @$AR1
0573 009f 0800 lri $AC1.M, #0x0800
0575 00c0 0345 lr $AR0, @0x0345
0577 02bf 05e8 call 0x05e8
0579 0081 0346 lri $AR1, #0x0346
057b 193e lrri $AC0.M, @$AR1
057c 193c lrri $AC0.L, @$AR1
057d 009f 0800 lri $AC1.M, #0x0800
057f 00c0 0345 lr $AR0, @0x0345
0581 02bf 05f5 call 0x05f5
0583 0081 0348 lri $AR1, #0x0348
0585 193e lrri $AC0.M, @$AR1
0586 193c lrri $AC0.L, @$AR1
0587 009f 0400 lri $AC1.M, #0x0400
0589 00c0 0345 lr $AR0, @0x0345
058b 02bf 05f5 call 0x05f5
058d 029f 0041 jmp 0x0041
// Opcode_09() -
058f 0080 0346 lri $AR0, #0x0346
0591 02bf 0065 call 0x0065
0593 02bf 0065 call 0x0065
0595 0081 0346 lri $AR1, #0x0346
0597 193e lrri $AC0.M, @$AR1
0598 193c lrri $AC0.L, @$AR1
0599 009f 0400 lri $AC1.M, #0x0400
059b 00c0 0345 lr $AR0, @0x0345
059d 02bf 05e8 call 0x05e8
059f 0081 0348 lri $AR1, #0x0348
05a1 193e lrri $AC0.M, @$AR1
05a2 193c lrri $AC0.L, @$AR1
05a3 009f 0400 lri $AC1.M, #0x0400
05a5 00c0 0345 lr $AR0, @0x0345
05a7 02bf 05f5 call 0x05f5
05a9 029f 0041 jmp 0x0041
// Opcode_08() -
05ab 0080 0346 lri $AR0, #0x0346
05ad 02bf 0065 call 0x0065
05af 02bf 0065 call 0x0065
05b1 0081 0346 lri $AR1, #0x0346
05b3 193e lrri $AC0.M, @$AR1
05b4 193c lrri $AC0.L, @$AR1
05b5 009f 0400 lri $AC1.M, #0x0400
05b7 00c0 0344 lr $AR0, @0x0344
05b9 02bf 05e8 call 0x05e8
05bb 0081 0348 lri $AR1, #0x0348
05bd 193e lrri $AC0.M, @$AR1
05be 193c lrri $AC0.L, @$AR1
05bf 009f 0800 lri $AC1.M, #0x0800
05c1 00c0 0344 lr $AR0, @0x0344
05c3 02bf 05e8 call 0x05e8
05c5 0080 0400 lri $AR0, #0x0400
05c7 0083 0800 lri $AR3, #0x0800
05c9 0084 0000 lri $IX0, #0x0000
05cb 00da 0345 lr $AX0.H, @0x0345
05cd 00df 0344 lr $AC1.M, @0x0344
05cf 8f00 set40
05d0 197b lrri $AX1.H, @$AR3
05d1 b800 mulx $AX0.H, $AX1.H
05d2 197b lrri $AX1.H, @$AR3
05d3 007f 05d8 bloop $AC1.M, 0x05d8
05d5 199e lrrn $AC0.M, @$AR0
05d6 bc00 mulxac $AX0.H, $AX1.H, $ACC0
05d7 80b2 nx'sl : $AC0.M, $AX1.H
05d8 0000 nop
05d9 8e00 set16
05da 0081 0346 lri $AR1, #0x0346
05dc 193e lrri $AC0.M, @$AR1
05dd 193c lrri $AC0.L, @$AR1
05de 009f 0400 lri $AC1.M, #0x0400
05e0 00c0 0344 lr $AR0, @0x0344
05e2 02bf 05f5 call 0x05f5
05e4 029f 0041 jmp 0x0041
// DmaCopy(destination, source, len)
// AR1 = source: pointer to the main memory (32-bit) address
// AC1.M = destination: DSP memory address
// AR0 = len: length in words
05e6 193e lrri $AC0.M, @$AR1
05e7 193c lrri $AC0.L, @$AR1
05e8 2fcd srs @DSPA, $AC1.M
05e9 0f00 lris $AC1.M, #0x00
05ea 2fc9 srs @DSCR, $AC1.M
05eb 2ece srs @DSMAH, $AC0.M
05ec 2ccf srs @DSMAL, $AC0.L
05ed 1fe0 mrr $AC1.M, $AR0
05ee 1501 lsl $ACC1, #1
05ef 2fcb srs @DSBL, $AC1.M
05f0 02bf 05f9 call 0x05f9
05f2 02df ret
// DmaCopy(destination, source, len)
// AR1 = destination: pointer to the main memory (32-bit) address
// AC1.M = source: DSP memory address
// AR0 = len: length in words
05f3 193e lrri $AC0.M, @$AR1
05f4 193c lrri $AC0.L, @$AR1
05f5 2fcd srs @DSPA, $AC1.M
05f6 0f01 lris $AC1.M, #0x01
05f7 029f 05ea jmp 0x05ea
// wait for dma completion?
05f9 26c9 lrs $AC0.M, @DSCR
05fa 02a0 0004 andf $AC0.M, #0x0004
05fc 029c 05f9 jlnz 0x05f9
05fe 02df ret
// unused dma routine
05ff 193e lrri $AC0.M, @$AR1
0600 193c lrri $AC0.L, @$AR1
0601 00ff ffcd sr @DSPA, $AC1.M
0603 0f00 lris $AC1.M, #0x00
0604 00ff ffc9 sr @DSCR, $AC1.M
0606 00fe ffce sr @DSMAH, $AC0.M
0608 00fc ffcf sr @DSMAL, $AC0.L
060a 1fe0 mrr $AC1.M, $AR0
060b 1501 lsl $ACC1, #1
060c 00ff ffcb sr @DSBL, $AC1.M
060e 02df ret
//
060f 00de ffc9 lr $AC0.M, @DSCR
0611 02a0 0004 andf $AC0.M, #0x0004
0613 029c 060f jlnz 0x060f
0615 02df ret
// Opcode_04() -
0616 0080 0346 lri $AR0, #0x0346
0618 02bf 0065 call 0x0065
061a 02bf 0065 call 0x0065 // wtf?
061c 0081 0346 lri $AR1, #0x0346
061e 00df 0349 lr $AC1.M, @0x0349
0620 0340 ffff andi $AC1.M, #0xffff
0622 00c0 0345 lr $AR0, @0x0345
0624 02bf 05e6 call 0x05e6 // DmaCopy(0x0349, Dword[0x0346], Mem[0x0345])
0626 029f 0041 jmp 0x0041
// Opcode_05() -
0628 0080 0346 lri $AR0, #0x0346
062a 02bf 0065 call 0x0065
062c 02bf 0065 call 0x0065 // wtf?
062e 0081 0346 lri $AR1, #0x0346
0630 00df 0349 lr $AC1.M, @0x0349
0632 0340 ffff andi $AC1.M, #0xffff
0634 00c0 0345 lr $AR0, @0x0345
0636 02bf 05f3 call 0x05f3
0638 029f 0041 jmp 0x0041
// ReadSoundData(addr)
// AC0.M:AC0.L = main memory address
// read 128 samples of PCM8 sound from main memory to DSP memory at 0x0B00
063a 1ffc mrr $AC1.M, $AC0.L
063b 0340 001f andi $AC1.M, #0x001f
063d 00ff 037f sr @0x037f, $AC1.M
063f 1ffc mrr $AC1.M, $AC0.L
0640 0340 ffe0 andi $AC1.M, #0xffe0
0642 1f9f mrr $AC0.L, $AC1.M
0643 00df 037d lr $AC1.M, @0x037d
0645 00dd 037e lr $AC1.L, @0x037e
0647 4c00 add $ACC0, $AC1.L
0648 00fe ffce sr @DSMAH, $AC0.M
064a 00fc ffcf sr @DSMAL, $AC0.L
064c 0f00 lris $AC1.M, #0x00
064d 00ff ffc9 sr @DSCR, $AC1.M
064f 009f 0b20 lri $AC1.M, #0x0b20
0651 00ff ffcd sr @DSPA, $AC1.M
0653 0f40 lris $AC1.M, #0x40
0654 00ff ffcb sr @DSBL, $AC1.M
0656 00de ffc9 lr $AC0.M, @DSCR
0658 02a0 0004 andf $AC0.M, #0x0004
065a 029c 0656 jlnz 0x0656
065c 1fe1 mrr $AC1.M, $AR1
065d 0081 0b00 lri $AR1, #0x0b00 // Dst = 0x0B00;
065f 0080 0b20 lri $AR0, #0x0b20 // Src = 0x0B20;
// for(i = 0; i < 32; i++)
0661 1120 066a bloopi #0x20, 0x066a
0663 8100 clr $ACC0
0664 191e lrri $AC0.M, @$AR0
0665 1478 lsr $ACC0, #-8
0666 1b3e srri @$AR1, $AC0.M // Dst[i*2] = Src[i] >> 8;
0667 1408 lsl $ACC0, #8
0668 0240 00ff andi $AC0.M, #0x00ff
066a 1b3e srri @$AR1, $AC0.M // Dst[i*2 + 1] = Src[i] & 0xFF;
066b 1c3f mrr $AR1, $AC1.M // Keep AR1 value to 0x0B00
066c 029f 092b jmp 0x092b
066e 02df ret
// dma?
066f 1fc3 mrr $AC0.M, $AR3
0670 043f addis $ACC0, #0x3f
0671 0240 fff0 andi $AC0.M, #0xfff0
0673 00fe ffcd sr @DSPA, $AC0.M
0675 1c1a mrr $AR0, $AX0.H
0676 00da 037f lr $AX0.H, @0x037f
0678 4400 addr $ACC0, $AX0.H
0679 1f40 mrr $AX0.H, $AR0
067a 1c1e mrr $AR0, $AC0.M
067b 1fda mrr $AC0.M, $AX0.H
067c 041f addis $ACC0, #0x1f
067d 0240 fff0 andi $AC0.M, #0xfff0
067f 1401 lsl $ACC0, #1
0680 00fe ffcb sr @DSBL, $AC0.M
0682 00de ffc9 lr $AC0.M, @DSCR
0684 02a0 0004 andf $AC0.M, #0x0004
0686 029c 0682 jlnz 0x0682
0688 007a 068b bloop $AX0.H, 0x068b
068a 191e lrri $AC0.M, @$AR0
068b 1b7e srri @$AR3, $AC0.M
068c 02df ret
// setup DSMAH, DSMAL and DSCR (RAM -> DSP memory)
068d 8900 clr $ACC1
068e 1ffc mrr $AC1.M, $AC0.L
068f 0340 001f andi $AC1.M, #0x001f
0691 00ff 037f sr @0x037f, $AC1.M
0693 1ffc mrr $AC1.M, $AC0.L
0694 0340 ffe0 andi $AC1.M, #0xffe0 // addr &= 0xFFFFFFE0;
0696 1f9f mrr $AC0.L, $AC1.M
0697 00df 037d lr $AC1.M, @0x037d // 0x1000
0699 00dd 037e lr $AC1.L, @0x037e // 0x0800
069b 4c00 add $ACC0, $AC1.L // addr += 0x10000800;
069c 00fe ffce sr @DSMAH, $AC0.M
069e 00fc ffcf sr @DSMAL, $AC0.L
06a0 0f00 lris $AC1.M, #0x00
06a1 00ff ffc9 sr @DSCR, $AC1.M
06a3 02df ret
// setup DSPA and DSBL (and thus complete DMA transfer)
// memory transferred is stored (temporarily) to 0x0780
// then it's copied to the address specified by AR3
06a4 00df 037f lr $AC1.M, @0x037f
06a6 157f lsr $ACC1, #-1
06a7 00ff 037f sr @0x037f, $AC1.M
06a9 02df ret
06aa 8600 tstaxh $AX0.H
06ab 02d5 retz
06ac 1f1a mrr $AX0.L, $AX0.H
06ad 009e 0780 lri $AC0.M, #0x0780
06af 00fe ffcd sr @DSPA, $AC0.M
06b1 1fda mrr $AC0.M, $AX0.H
06b2 043f addis $ACC0, #0x3f
06b3 0240 ffe0 andi $AC0.M, #0xffe0
06b5 00fe ffcb sr @DSBL, $AC0.M
06b7 00de ffc9 lr $AC0.M, @DSCR
06b9 02a0 0004 andf $AC0.M, #0x0004
06bb 029c 06b7 jlnz 0x06b7
06bd 8100 clr $ACC0
06be 00de 037f lr $AC0.M, @0x037f
06c0 147f lsr $ACC0, #-1
06c1 0200 0780 addi $AC0.M, #0x0780
06c3 1c1e mrr $AR0, $AC0.M
06c4 00de 037f lr $AC0.M, @0x037f
06c6 02a0 0001 andf $AC0.M, #0x0001
06c8 029d 06d1 jlz 0x06d1
06ca 8100 clr $ACC0
06cb 191e lrri $AC0.M, @$AR0
06cc 1488 asl $ACC0, #8
06cd 1b7e srri @$AR3, $AC0.M
06ce 1fda mrr $AC0.M, $AX0.H
06cf 7800 decm $AC0.M
06d0 1f5e mrr $AX0.H, $AC0.M
06d1 8100 clr $ACC0
06d2 1fda mrr $AC0.M, $AX0.H
06d3 147f lsr $ACC0, #-1
06d4 007e 06dd bloop $AC0.M, 0x06dd
06d6 8100 clr $ACC0
06d7 181e lrr $AC0.M, @$AR0
06d8 0240 ff00 andi $AC0.M, #0xff00
06da 1b7e srri @$AR3, $AC0.M
06db 191e lrri $AC0.M, @$AR0
06dc 1488 asl $ACC0, #8
06dd 1b7e srri @$AR3, $AC0.M
06de 1fda mrr $AC0.M, $AX0.H
06df 1f58 mrr $AX0.H, $AX0.L
06e0 02a0 0001 andf $AC0.M, #0x0001
06e2 02dd retlz
06e3 8100 clr $ACC0
06e4 181e lrr $AC0.M, @$AR0
06e5 0240 ff00 andi $AC0.M, #0xff00
06e7 1b7e srri @$AR3, $AC0.M
06e8 02df ret
// Exception_0E()
06e9 1205 sbclr #0x05
06ea 8e00 set16
06eb 00f0 03fd sr @0x03fd, $AC0.H
06ed 00fc 03ff sr @0x03ff, $AC0.L
06ef f400 lsr16 $ACC0
06f0 00fc 03fe sr @0x03fe, $AC0.L
06f2 00fa 03fa sr @0x03fa, $AX0.H
06f4 8100 clr $ACC0
06f5 00de fffe lr $AC0.M, @CMBH // check for new mail
06f7 02c0 8000 andcf $AC0.M, #0x8000
06f9 029c 07ea jlnz 0x07ea // If we received no mail
06fb 00da ffff lr $AX0.H, @CMBL
06fd 8600 tstaxh $AX0.H
06fe 0294 07c3 jnz 0x07c3 // If we received a mail beginning a list, WaitForNextMails()
0700 00de fffe lr $AC0.M, @CMBH // if we received an empty mail, wait for the next mail
0702 02c0 8000 andcf $AC0.M, #0x8000
0704 029c 0700 jlnz 0x0700
0706 0240 000f andi $AC0.M, #0x000f // get the number in the high part of the mail
0708 1f5e mrr $AX0.H, $AC0.M
0709 7400 incm $AC0.M // number++;
070a 0c00 lris $AC0.L, #0x00
070b 1404 lsl $ACC0, #4 // number <<= 4;
070c 00fe 034e sr @0x034e, $AC0.M
070e 1fda mrr $AC0.M, $AX0.H
070f 1f40 mrr $AX0.H, $AR0
0710 0200 04fc addi $AC0.M, #0x04fc
0712 1c1e mrr $AR0, $AC0.M
0713 00de ffff lr $AC0.M, @CMBL
0715 1a1e srr @$AR0, $AC0.M
0716 1c1a mrr $AR0, $AX0.H
0717 00de 03fe lr $AC0.M, @0x03fe
0719 00dc 03ff lr $AC0.L, @0x03ff
071b 00d0 03fd lr $AC0.H, @0x03fd
071d 00da 03fa lr $AX0.H, @0x03fa
071f 1305 sbset #0x05
0720 02ff rti
// DoYield()
0721 009a 0002 lri $AX0.H, #0x0002
0723 00fa 03a3 sr @0x03a3, $AX0.H
0725 00e0 03f9 sr @0x03f9, $AR0
0727 02bf 07ad call 0x07ad
0729 16fc dcd1 si @DMBH, #0xdcd1
072b 16fd 0002 si @DMBL, #0x0002
072d 16fb 0001 si @DIRQ, #0x0001
072f 0021 halt
// Function jump table
0730 0748 cmpis $ACC1, #0x48 // Function 0: halt
0731 0749 cmpis $ACC1, #0x49 // Function 1: dump memory? and halt
0732 0789 cmpis $ACC1, #0x89 // Function 2: jump to 0x8000 and halt
0733 078c cmpis $ACC1, #0x8c // Function 3: return to MessageLoop()
// Execute function according to mail received (0xCDD1000X)
// Warning: any function number above 3 will likely crash
// as no range check is performed.
// AR0 = 0x002B
0734 00e0 03f9 sr @0x03f9, $AR0
0736 009e 0005 lri $AC0.M, #0x0005
0738 02bf 079b call 0x079b // SendMail_DCD1(0x0005)
073a 8e00 set16
073b 8100 clr $ACC0
073c 8900 clr $ACC1
073d 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0()
073f 27ff lrs $AC1.M, @CMBL
0740 009e 0730 lri $AC0.M, #0x0730
0742 4c00 add $ACC0, $AC1.L
0743 1c7e mrr $AR3, $AC0.M
0744 0313 ilrr $AC1.M, @$AR3
0745 1c7f mrr $AR3, $AC1.M
0746 176f jmpr $AR3
0747 0021 halt
// Function 0
0748 0021 halt
// Function 1
0749 009a 0002 lri $AX0.H, #0x0002
074b 00fa 03a3 sr @0x03a3, $AX0.H
074d 8100 clr $ACC0
074e 8900 clr $ACC1
074f 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0()
0751 24ff lrs $AC0.L, @CMBL
0752 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1()
0754 25ff lrs $AC1.L, @CMBL
0755 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1()
0757 27ff lrs $AC1.M, @CMBL
0758 2ece srs @DSMAH, $AC0.M
0759 2ccf srs @DSMAL, $AC0.L
075a 16c9 0001 si @DSCR, #0x0001
075c 2fcd srs @DSPA, $AC1.M
075d 2dcb srs @DSBL, $AC1.L
075e 8100 clr $ACC0
075f 8900 clr $ACC1
0760 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0()
0762 24ff lrs $AC0.L, @CMBL
0763 1c9e mrr $IX0, $AC0.M
0764 1cbc mrr $IX1, $AC0.L
0765 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1()
0767 25ff lrs $AC1.L, @CMBL
0768 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1()
076a 27ff lrs $AC1.M, @CMBL
076b 1cdf mrr $IX2, $AC1.M
076c 1cfd mrr $IX3, $AC1.L
076d 8100 clr $ACC0
076e 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0()
0770 26ff lrs $AC0.M, @CMBL
0771 1c1e mrr $AR0, $AC0.M
0772 8900 clr $ACC1
0773 02bf 0795 call 0x0795 // WaitUntilCPUMailboxIsFull_AC1()
0775 20ff lrs $AX0.L, @CMBL
0776 1f5f mrr $AX0.H, $AC1.M
0777 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0()
0779 21ff lrs $AX1.L, @CMBL
077a 02bf 078f call 0x078f // WaitUntilCPUMailboxIsFull_AC0()
077c 23ff lrs $AX1.H, @CMBL
077d 26c9 lrs $AC0.M, @DSCR
077e 02a0 0004 andf $AC0.M, #0x0004
0780 029c 077d jlnz 0x077d
0782 1206 sbclr #0x06
0783 1203 sbclr #0x03
0784 1204 sbclr #0x04
0785 1205 sbclr #0x05
0786 029f 80b5 jmp 0x80b5
0788 0021 halt
// Function 2
0789 029f 8000 jmp 0x8000
078b 0021 halt
// Function 3
078c 00c0 03f9 lr $AR0, @0x03f9
078e 170f jmpr $AR0
// WaitUntilCPUMailboxIsFull_AC0()
078f 26fe lrs $AC0.M, @CMBH
0790 02c0 8000 andcf $AC0.M, #0x8000
0792 029c 078f jlnz 0x078f
0794 02df ret
// WaitUntilCPUMailboxIsFull_AC1()
0795 27fe lrs $AC1.M, @CMBH
0796 03c0 8000 andcf $AC1.M, #0x8000
0798 029c 0795 jlnz 0x0795
079a 02df ret
// SendMail_DCD1() // seems to additionally trigger an IRQ
079b 02bf 07b3 call 0x07b3
079d 16fc dcd1 si @DMBH, #0xdcd1
079f 2efd srs @DMBL, $AC0.M
07a0 16fb 0001 si @DIRQ, #0x0001
07a2 02bf 07b3 call 0x07b3
07a4 02df ret
// SendMail_F355()
07a5 02bf 07b3 call 0x07b3
07a7 16fc f355 si @DMBH, #0xf355
07a9 2efd srs @DMBL, $AC0.M
07aa 02bf 07b3 call 0x07b3
07ac 02df ret
// WaitUntilMailboxIsReady_AC0()
07ad 26fc lrs $AC0.M, @DMBH
07ae 02c0 8000 andcf $AC0.M, #0x8000
07b0 029d 07ad jlz 0x07ad
07b2 02df ret
// WaitUntilMailboxIsReady_AC1()
07b3 27fc lrs $AC1.M, @DMBH
07b4 03c0 8000 andcf $AC1.M, #0x8000
07b6 029d 07b3 jlz 0x07b3
07b8 02df ret
// InitGlobalVars()
07b9 009a 0280 lri $AX0.H, #0x0280
07bb 00fa 0350 sr @0x0350, $AX0.H
07bd 00fa 0351 sr @0x0351, $AX0.H
07bf 0a00 lris $AX0.H, #0x00
07c0 00fa 0352 sr @0x0352, $AX0.H
07c2 02df ret
// WaitForNextMails()
// AX0.H: low part of current mail (num of mails to wait for)
07c3 00e0 03fb sr @0x03fb, $AR0
07c5 00e8 03fc sr @0x03fc, $WR0
07c7 00c0 0350 lr $AR0, @0x0350
07c9 0088 002f lri $WR0, #0x002f
07cb 1b1a srri @$AR0, $AX0.H
07cc 00de fffe lr $AC0.M, @CMBH
07ce 02c0 8000 andcf $AC0.M, #0x8000
07d0 029c 07cc jlnz 0x07cc
07d2 00dc ffff lr $AC0.L, @CMBL
07d4 1b1e srri @$AR0, $AC0.M
07d5 1b1c srri @$AR0, $AC0.L
07d6 1fda mrr $AC0.M, $AX0.H
07d7 7800 decm $AC0.M
07d8 1f5e mrr $AX0.H, $AC0.M
07d9 8600 tstaxh $AX0.H
07da 0294 07cc jnz 0x07cc
07dc 8100 clr $ACC0
07dd 00de 0352 lr $AC0.M, @0x0352
07df 7400 incm $AC0.M
07e0 00fe 0352 sr @0x0352, $AC0.M
07e2 00e0 0350 sr @0x0350, $AR0
07e4 00c0 03fb lr $AR0, @0x03fb
07e6 00c8 03fc lr $WR0, @0x03fc
07e8 029f 0717 jmp 0x0717
// noMail()
07ea 00e0 03fb sr @0x03fb, $AR0
07ec 00e8 03fc sr @0x03fc, $WR0
07ee 00c0 0350 lr $AR0, @0x0350
07f0 0088 002f lri $WR0, #0x002f
07f2 0a00 lris $AX0.H, #0x00
07f3 1b1a srri @$AR0, $AX0.H
07f4 029f 07dc jmp 0x07dc
// MessageLoop()
07f6 00c0 0351 lr $AR0, @0x0351
07f8 0088 002f lri $WR0, #0x002f
07fa 00da 0352 lr $AX0.H, @0x0352
07fc 8600 tstaxh $AX0.H
07fd 0295 081e jz 0x081e // jump back to MessageLoop
07ff 1205 sbclr #0x05
0800 00da 0352 lr $AX0.H, @0x0352
0802 1fda mrr $AC0.M, $AX0.H
0803 7800 decm $AC0.M
0804 00fe 0352 sr @0x0352, $AC0.M
0806 1305 sbset #0x05
0807 0081 0356 lri $AR1, #0x0356
0809 191e lrri $AC0.M, @$AR0
080a 02c0 8000 andcf $AC0.M, #0x8000
080c 029d 0822 jlz 0x0822 // ???
080e 1f5e mrr $AX0.H, $AC0.M
080f 8600 tstaxh $AX0.H
0810 0295 0826 jz 0x0826 // Yield()
0812 007a 0817 bloop $AX0.H, 0x0817
0814 191e lrri $AC0.M, @$AR0
0815 1b3e srri @$AR1, $AC0.M
0816 191e lrri $AC0.M, @$AR0
0817 1b3e srri @$AR1, $AC0.M
0818 00e0 0351 sr @0x0351, $AR0
081a 0088 ffff lri $WR0, #0xffff
081c 029f 002d jmp 0x002d // jump to OpcodeHandler()
081e 0088 ffff lri $WR0, #0xffff
0820 029f 002b jmp 0x002b // jump back to MessageLoop()
//
0822 00e0 0351 sr @0x0351, $AR0
0824 029f 07fa jmp 0x07fa
// Yield()
0826 0080 07f6 lri $AR0, #0x07f6
0828 029f 0721 jmp 0x0721 // DoYield() (halts)
// interesting - writes value(s) to output
082a 8100 clr $ACC0
082b 0e10 lris $AC0.M, #0x10
082c 2232 lrs $AX0.H, @0x0032
082d 8600 tstaxh $AX0.H
082e 02d5 retz
082f 5400 subr $ACC0, $AX0.H
0830 0200 0458 addi $AC0.M, #0x0458 // source addr = (0x10 - Mem[0x0032]) + 0x0458
0832 1c1e mrr $AR0, $AC0.M
0833 1fda mrr $AC0.M, $AX0.H
0834 04fe addis $ACC0, #0xfe
0835 1f1e mrr $AX0.L, $AC0.M // AX0.L = Mem[0x0032] - 2;
0836 191e lrri $AC0.M, @$AR0
0837 0291 083d js 0x083d
0839 191a lrri $AX0.H, @$AR0
083a 0058 loop $AX0.L
083b 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
083c 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M
083d 1b7e srri @$AR3, $AC0.M // store value to output
083e 02df ret
//
083f 02bf 082a call 0x082a
0841 8100 clr $ACC0
0842 2632 lrs $AC0.M, @0x0032
0843 5c00 sub $ACC0, $AC1.L
0844 2e32 srs @0x0032, $AC0.M
0845 0092 00ff lri $CR, #0x00ff
0847 02df ret
// increment one value, then zero out other values
0848 00de 04fb lr $AC0.M, @0x04fb
084a 7400 incm $AC0.M
084b 00fe 04fb sr @0x04fb, $AC0.M
084d 8100 clr $ACC0
084e 2e32 srs @0x0032, $AC0.M
084f 2e66 srs @0x0066, $AC0.M
0850 2e67 srs @0x0067, $AC0.M
0851 268a lrs $AC0.M, @0xff8a
0852 248b lrs $AC0.L, @0xff8b
0853 2e3a srs @0x003a, $AC0.M
0854 2c3b srs @0x003b, $AC0.L
0855 268c lrs $AC0.M, @0xff8c
0856 248d lrs $AC0.L, @0xff8d
0857 2e38 srs @0x0038, $AC0.M
0858 2c39 srs @0x0039, $AC0.L
0859 02df ret
//
085a 8100 clr $ACC0
085b 2689 lrs $AC0.M, @0xff89
085c 0240 000f andi $AC0.M, #0x000f
085e 1f5e mrr $AX0.H, $AC0.M
085f 8100 clr $ACC0
0860 0e10 lris $AC0.M, #0x10
0861 5400 subr $ACC0, $AX0.H
0862 2e32 srs @0x0032, $AC0.M
0863 268a lrs $AC0.M, @0xff8a
0864 248b lrs $AC0.L, @0xff8b
0865 2288 lrs $AX0.H, @0xff88
0866 2089 lrs $AX0.L, @0xff89
0867 5800 subax $ACC0, $AX0.L
0868 0a00 lris $AX0.H, #0x00
0869 2032 lrs $AX0.L, @0x0032
086a 5800 subax $ACC0, $AX0.L
086b 2e3a srs @0x003a, $AC0.M
086c 2c3b srs @0x003b, $AC0.L
086d 02df ret
// mixer for sound types 5 and 9
// AR3 = 0x0580 (out address)
// AC1.M = 0x0043, AC1.L = 0x0000
086e 0092 0004 lri $CR, #0x0004
0870 8100 clr $ACC0
0871 2604 lrs $AC0.M, @0x0004
0872 b100 tst $ACC0
0873 02b4 0848 callne 0x0848 // nothing much interesting
0875 8100 clr $ACC0
0876 2601 lrs $AC0.M, @0x0001
0877 b100 tst $ACC0
0878 0294 0916 jnz 0x0916 // end
087a 2232 lrs $AX0.H, @0x0032
087b c900 cmpar $ACC0, $AX1.H
087c 0293 083f jle 0x083f // direct return (calls 0x082A though)
087e 5500 subr $ACC1, $AX0.H
087f 02bf 082a call 0x082a // interesting: stores value(s) to Mem[AR3] (output)
0881 223a lrs $AX0.H, @0x003a
0882 8600 tstaxh $AX0.H
0883 0294 088a jnz 0x088a
0885 8100 clr $ACC0
0886 263b lrs $AC0.M, @0x003b
0887 8200 cmp
0888 0291 08dc js 0x08dc
088a 8100 clr $ACC0
088b 1fdf mrr $AC0.M, $AC1.M
088c 040f addis $ACC0, #0x0f
088d 147c lsr $ACC0, #-4
088e 1f7e mrr $AX1.H, $AC0.M
088f 0c00 lris $AC0.L, #0x00
0890 1404 lsl $ACC0, #4
0891 1f1e mrr $AX0.L, $AC0.M
0892 0a00 lris $AX0.H, #0x00
0893 8100 clr $ACC0
0894 263a lrs $AC0.M, @0x003a
0895 243b lrs $AC0.L, @0x003b
0896 5800 subax $ACC0, $AX0.L
0897 0290 08a2 jns 0x08a2
0899 8100 clr $ACC0
089a 263b lrs $AC0.M, @0x003b
089b 5c00 sub $ACC0, $AC1.L
089c 2e32 srs @0x0032, $AC0.M
089d 8100 clr $ACC0
089e 2e3a srs @0x003a, $AC0.M
089f 2e3b srs @0x003b, $AC0.M
08a0 029f 08a8 jmp 0x08a8
08a2 2e3a srs @0x003a, $AC0.M
08a3 2c3b srs @0x003b, $AC0.L
08a4 0c00 lris $AC0.L, #0x00
08a5 1fd8 mrr $AC0.M, $AX0.L
08a6 5c00 sub $ACC0, $AC1.L
08a7 2e32 srs @0x0032, $AC0.M
08a8 8100 clr $ACC0
08a9 1fdb mrr $AC0.M, $AX1.H
08aa 02bf 091c call 0x091c // afc decoder
08ac 2232 lrs $AX0.H, @0x0032
08ad 8600 tstaxh $AX0.H
08ae 0295 08d9 jz 0x08d9 // end
08b0 0a10 lris $AX0.H, #0x10
08b1 8100 clr $ACC0
08b2 1fc3 mrr $AC0.M, $AR3
08b3 5400 subr $ACC0, $AX0.H
08b4 1c7e mrr $AR3, $AC0.M
08b5 0080 0458 lri $AR0, #0x0458
08b7 197e lrri $AC0.M, @$AR3
08b8 197a lrri $AX0.H, @$AR3
08b9 100e loopi #0x0e
08ba 64a2 movr'sl $ACC0, $AX0.H : $AC0.M, $AX0.H
08bb 1b1e srri @$AR0, $AC0.M
08bc 1b1a srri @$AR0, $AX0.H
08bd 8100 clr $ACC0
08be 263a lrs $AC0.M, @0x003a
08bf 243b lrs $AC0.L, @0x003b
08c0 b100 tst $ACC0
08c1 0294 08d9 jnz 0x08d9 // end
08c3 2232 lrs $AX0.H, @0x0032
08c4 8600 tstaxh $AX0.H
08c5 0295 08d9 jz 0x08d9 // end
08c7 0080 0467 lri $AR0, #0x0467
08c9 8100 clr $ACC0
08ca 268b lrs $AC0.M, @0xff8b
08cb b100 tst $ACC0
08cc 0295 08d9 jz 0x08d9 // end
08ce 0200 000f addi $AC0.M, #0x000f
08d0 0240 000f andi $AC0.M, #0x000f
08d2 0200 0458 addi $AC0.M, #0x0458
08d4 1c7e mrr $AR3, $AC0.M
08d5 007a 08d8 bloop $AX0.H, 0x08d8
08d7 18fe lrrd $AC0.M, @$AR3
08d8 1a9e srrd @$AR0, $AC0.M
08d9 0092 00ff lri $CR, #0x00ff
08db 02df ret
//
08dc b100 tst $ACC0
08dd 0295 08ec jz 0x08ec
08df 5d00 sub $ACC1, $AC0.L
08e0 040f addis $ACC0, #0x0f
08e1 147c lsr $ACC0, #-4
08e2 0c00 lris $AC0.L, #0x00
08e3 00e3 0363 sr @0x0363, $AR3
08e5 02bf 091c call 0x091c
08e7 00de 0363 lr $AC0.M, @0x0363
08e9 223b lrs $AX0.H, @0x003b
08ea 4400 addr $ACC0, $AX0.H
08eb 1c7e mrr $AR3, $AC0.M
08ec 8100 clr $ACC0
08ed 2681 lrs $AC0.M, @0xff81
08ee b100 tst $ACC0
08ef 0295 0914 jz 0x0914
08f1 2380 lrs $AX1.H, @0xff80
08f2 2688 lrs $AC0.M, @0xff88
08f3 2489 lrs $AC0.L, @0xff89
08f4 1408 lsl $ACC0, #8
08f5 14f4 asr $ACC0, #-12
08f6 2380 lrs $AX1.H, @0xff80
08f7 8d00 set15
08f8 c810 mulc'mv $AC0.M, $AX1.H : $AX0.L, $AC0.L
08f9 ae00 mulxmv $AX0.L, $AX1.H, $ACC0
08fa 8c00 clr15
08fb f000 lsl16 $ACC0
08fc 4e00 addp $ACC0
08fd 238c lrs $AX1.H, @0xff8c
08fe 218d lrs $AX1.L, @0xff8d
08ff 4a00 addax $ACC0, $AX1.L
0900 2e38 srs @0x0038, $AC0.M
0901 2c39 srs @0x0039, $AC0.L
0902 2682 lrs $AC0.M, @0xff82
0903 2e67 srs @0x0067, $AC0.M
0904 2683 lrs $AC0.M, @0xff83
0905 2e66 srs @0x0066, $AC0.M
0906 00e3 0363 sr @0x0363, $AR3
0908 0083 0458 lri $AR3, #0x0458
090a 8100 clr $ACC0
090b 0e01 lris $AC0.M, #0x01
090c 02bf 091c call 0x091c
090e 00c3 0363 lr $AR3, @0x0363
0910 02bf 085a call 0x085a
0912 029f 087a jmp 0x087a
0914 0e01 lris $AC0.M, #0x01
0915 2e01 srs @0x0001, $AC0.M
0916 8100 clr $ACC0
0917 005f loop $AC1.M
0918 1b7e srri @$AR3, $AC0.M
0919 0092 00ff lri $CR, #0x00ff
091b 02df ret
// afc decoder (for sound formats 5 and 9)
// AC0.M = num of blocks to do? (0x4)
// AC1.M =
091c 00ff 0360 sr @0x0360, $AC1.M
091e 00fe 0361 sr @0x0361, $AC0.M
0920 8100 clr $ACC0
0921 00de 0361 lr $AC0.M, @0x0361
0923 007e 099c bloop $AC0.M, 0x099c
0925 2638 lrs $AC0.M, @0x0038
0926 2439 lrs $AC0.L, @0x0039
0927 0092 00ff lri $CR, #0x00ff
0929 029f 063a jmp 0x063a // ReadSoundData(Dword[0x0038])
092b 0092 0004 lri $CR, #0x0004
092d 2638 lrs $AC0.M, @0x0038
092e 2439 lrs $AC0.L, @0x0039
092f 8900 clr $ACC1
0930 2580 lrs $AC1.L, @0xff80
0931 4c00 add $ACC0, $AC1.L
0932 2e38 srs @0x0038, $AC0.M
0933 2c39 srs @0x0039, $AC0.L
0934 00de 037f lr $AC0.M, @0x037f
0936 0200 0b00 addi $AC0.M, #0x0b00 // buffer where read sound data is stored (128 bytes)
0938 1c1e mrr $AR0, $AC0.M // AR0 = AC0.M = 0x0B00 + Mem[0x037F]; (Mem[0x037F] seems to be the offset in buffer to the actual block...)
0939 0084 0001 lri $IX0, #0x0001 // IX0 = 0x0001;
093b 199e lrrn $AC0.M, @$AR0 // AC0.M = Mem[AR0]; AR0++; read first byte in buffer
093c 8900 clr $ACC1
093d 1ffe mrr $AC1.M, $AC0.M // AC1.M = AC0.M = first_byte;
093e 1401 lsl $ACC0, #1
093f 0240 001e andi $AC0.M, #0x001e
0941 0200 0300 addi $AC0.M, #0x0300
0943 1c3e mrr $AR1, $AC0.M // AR1 = ((first_byte << 1) & 0x1E) + 0x0300;
0944 157c lsr $ACC1, #-4
0945 0340 000f andi $AC1.M, #0x000f
0947 0a11 lris $AX0.H, #0x11
0948 5500 subr $ACC1, $AX0.H // AC1.M = ((first_byte >> 4) & 0xF) - 0x11;
0949 8100 clr $ACC0
094a 2680 lrs $AC0.M, @0xff80
094b 0605 cmpis $ACC0, #0x05
094c 0295 0965 jz 0x0965 // skip loop below (execute another loop) for sound format 5
094e 009a 00f0 lri $AX0.H, #0x00f0 // these masks... for adpcm sound surely
0950 0b0f lris $AX1.H, #0x0f
0951 0082 0364 lri $AR2, #0x0364 // AR2 = 0x0364;
0953 1998 lrrn $AX0.L, @$AR0 // AX0.L = Mem[AR0]; AR0++;
0954 6000 movr $ACC0, $AX0.L // AC0.HM = AX0; AC0.L = 0x0000;
// loop for sound format 9 (looks like adpcm)
// decompose sound data into nibbles and store it to 0x0364 (again a temp buffer!)
// for(i = 0; i < 7; i++)
0955 1107 095c bloopi #0x07, 0x095c
0957 3400 andr $AC0.M, $AX0.H // AC0.M &= 0x00F0;
0958 1408 lsl $ACC0, #8 // ACC0 <<= 8;
0959 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M // AC0.HM = AX0; AC0.L = 0; Mem[AR2] = AC0.M; AR2++;
095a 3644 andr'ln $AC0.M, $AX1.H : $AX0.L, @$AR0 // AC0.M &= 0x000F; AX0.L = Mem[AR0]; AR0++;
095b 140c lsl $ACC0, #12 // ACC0 <<= 12;
095c 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M // AC0.HM = AX0; AC0.L = 0; Mem[AR2] = AC0.M; AR2++;
095d 3400 andr $AC0.M, $AX0.H
095e 1408 lsl $ACC0, #8
095f 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M
0960 3600 andr $AC0.M, $AX1.H
0961 140c lsl $ACC0, #12
0962 1b5e srri @$AR2, $AC0.M
0963 029f 0985 jmp 0x0985
// below for sound format 5 only
0965 009a c000 lri $AX0.H, #0xc000
0967 0082 0364 lri $AR2, #0x0364
0969 1998 lrrn $AX0.L, @$AR0
096a 6000 movr $ACC0, $AX0.L
// loop for sound format 5
096b 1103 0978 bloopi #0x03, 0x0978
096d 1408 lsl $ACC0, #8
096e 3400 andr $AC0.M, $AX0.H
096f 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M
0970 140a lsl $ACC0, #10
0971 3400 andr $AC0.M, $AX0.H
0972 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M
0973 140c lsl $ACC0, #12
0974 3400 andr $AC0.M, $AX0.H
0975 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M
0976 140e lsl $ACC0, #14
0977 3444 andr'ln $AC0.M, $AX0.H : $AX0.L, @$AR0
0978 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M
0979 1408 lsl $ACC0, #8
097a 3400 andr $AC0.M, $AX0.H
097b 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M
097c 140a lsl $ACC0, #10
097d 3400 andr $AC0.M, $AX0.H
097e 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M
097f 140c lsl $ACC0, #12
0980 3400 andr $AC0.M, $AX0.H
0981 6032 movr's $ACC0, $AX0.L : @$AR2, $AC0.M
0982 140e lsl $ACC0, #14
0983 3400 andr $AC0.M, $AX0.H
0984 1b5e srri @$AR2, $AC0.M
0985 8f00 set40
0986 1f7f mrr $AX1.H, $AC1.M // AX1.H = AC1.M = ((first_byte >> 4) & 0xF) - 0x11;
0987 2066 lrs $AX0.L, @0x0066 // AX0.L = Mem[0x0066];
0988 2767 lrs $AC1.M, @0x0067 // AC1.M = Mem[0x0067];
0989 193a lrri $AX0.H, @$AR1 // AX0.H = Mem[AR1]; AR1++; load coefs from 0x0300+
098a 1939 lrri $AX1.L, @$AR1 // AX1.L = Mem[AR1]; AR1++;
098b 0080 0364 lri $AR0, #0x0364 // AR0 = 0x0364;
098d a000 mulx $AX0.L, $AX1.L // prod = AX0.L * AX1.L;
098e ea70 maddc'l $AC1.M, $AX1.L : $AC0.M, @$AR0 // prod += AC1.M * AX1.L; AC0.M = Mem[AR0]; AR0++;
098f 1108 0998 bloopi #0x08, 0x0998
0991 3a93 orr'sl $AC0.M, $AX1.H : $AC1.M, $AX1.L // AC0.M |= AX1.H; Mem[AR3] = AC1.M; AR3++; AX1.L = Mem[AR0]; AR0++;
0992 a478 mulxac'l $AX0.L, $AX1.L, $ACC0 : $AC1.M, @$AR0 // ACC0 += prod; prod = AX0.L * AX1.L; AC1.M = Mem[AR0]; AR0++;
0993 1485 asl $ACC0, #5 // ACC0 <<= 5;
0994 e833 maddc's $AC0.M, $AX1.L : @$AR3, $AC0.M // prod += AC0.M * AX1.L; Mem[AR3] = AC0.M; AR3++;
0995 3b92 orr'sl $AC1.M, $AX1.H : $AC0.M, $AX1.L // AC1.M |= AX1.H; Mem[AR3] = AC0.M; AR3++; AX1.L = Mem[AR0]; AR0++;
0996 a570 mulxac'l $AX0.L, $AX1.L, $ACC1 : $AC0.M, @$AR0 // ACC1 += prod; prod = AX0.L * AX1.L; AC1.M = Mem[AR0]; AR0++;
0997 1585 asl $ACC1, #5 // ACC1 <<= 5;
0998 ea3b maddc's $AC1.M, $AX1.L : @$AR3, $AC1.M // prod += AC1.M * AX1.L; Mem[AR3] = AC1.M; AR3++;
0999 2f67 srs @0x0067, $AC1.M
099a 8e00 set16
099b 1ff8 mrr $AC1.M, $AX0.L
099c 2f66 srs @0x0066, $AC1.M
// end of outer loop
099d 8900 clr $ACC1
099e 00df 0360 lr $AC1.M, @0x0360
09a0 02df ret
//
09a1 b100 tst $ACC0
09a2 02d5 retz
09a3 04fe addis $ACC0, #0xfe
09a4 1f1e mrr $AX0.L, $AC0.M
09a5 191e lrri $AC0.M, @$AR0
09a6 0291 09ac js 0x09ac
09a8 191a lrri $AX0.H, @$AR0
09a9 0058 loop $AX0.L
09aa 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
09ab 6433 movr's $ACC0, $AX0.H : @$AR3, $AC0.M
09ac 1b7e srri @$AR3, $AC0.M
09ad 02df ret
// decode audio?
09ae 8100 clr $ACC0
09af 1f5e mrr $AX0.H, $AC0.M
09b0 00d8 0402 lr $AX0.L, @0x0402
09b2 00dc 0430 lr $AC0.L, @0x0430
09b4 0080 0520 lri $AR0, #0x0520
09b6 00df 0480 lr $AC1.M, @0x0480 // sound format???
09b8 1501 lsl $ACC1, #1
09b9 0340 007e andi $AC1.M, #0x007e
09bb 0300 09c3 addi $AC1.M, #0x09c3
09bd 1c5f mrr $AR2, $AC1.M
09be 175f callr $AR2 // jump to one of the functions
09bf 00fc 0430 sr @0x0430, $AC0.L
09c1 029f 0336 jmp 0x0336 // return to SyncFrame func
// jump table
09c3 029f 09e4 jmp 0x09e4 // 0x0:
09c5 029f 0a1f jmp 0x0a1f // 0x1:
09c7 029f 0a07 jmp 0x0a07 // 0x2:
09c9 029f 09f4 jmp 0x09f4 // 0x3:
09cb 029f 0a2d jmp 0x0a2d // 0x4:
09cd 029f 09e3 jmp 0x09e3 // 0x5: dummy
09cf 029f 0a4b jmp 0x0a4b // 0x6:
09d1 029f 0a4e jmp 0x0a4e // 0x7:
09d3 029f 09e3 jmp 0x09e3 // 0x8: dummy
09d5 029f 09e3 jmp 0x09e3 // 0x9: dummy
09d7 029f 0a6c jmp 0x0a6c // 0xA:
09d9 029f 0a25 jmp 0x0a25 // 0xB:
09db 029f 0a29 jmp 0x0a29 // 0xC:
09dd 029f 09e3 jmp 0x09e3 // 0xD: dummy
09df 029f 09e3 jmp 0x09e3 // 0xE: dummy
09e1 029f 09e3 jmp 0x09e3 // 0xF: dummy
09e3 02df ret // direct return for dummy funcs
// Func_00()
09e4 1401 lsl $ACC0, #1
09e5 009b c000 lri $AX1.H, #0xc000
09e7 0099 4000 lri $AX1.L, #0x4000
09e9 1150 09f1 bloopi #0x50, 0x09f1
09eb 02c0 0001 andcf $AC0.M, #0x0001
09ed 027c iflnz
09ee 1b1b srri @$AR0, $AX1.H
09ef 027d iflz
09f0 1b19 srri @$AR0, $AX1.L
09f1 4800 addax $ACC0, $AX0.L
09f2 147f lsr $ACC0, #-1
09f3 02df ret
09f4 1402 lsl $ACC0, #2
09f5 8900 clr $ACC1
09f6 1fb8 mrr $AC1.L, $AX0.L
09f7 1501 lsl $ACC1, #1
09f8 009b c000 lri $AX1.H, #0xc000
09fa 0099 4000 lri $AX1.L, #0x4000
09fc 1150 0a04 bloopi #0x50, 0x0a04
09fe 02c0 0003 andcf $AC0.M, #0x0003
0a00 027c iflnz
0a01 1b1b srri @$AR0, $AX1.H
0a02 027d iflz
0a03 1b19 srri @$AR0, $AX1.L
0a04 4c00 add $ACC0, $AC1.L
0a05 147e lsr $ACC0, #-2
0a06 02df ret
0a07 1401 lsl $ACC0, #1
0a08 0081 0ca0 lri $AR1, #0x0ca0
0a0a 009b c000 lri $AX1.H, #0xc000
0a0c 0099 4000 lri $AX1.L, #0x4000
0a0e 8900 clr $ACC1
0a0f 0082 0000 lri $AR2, #0x0000
0a11 1150 0a1c bloopi #0x50, 0x0a1c
0a13 02c0 0001 andcf $AC0.M, #0x0001
0a15 027c iflnz
0a16 1b1b srri @$AR0, $AX1.H
0a17 027d iflz
0a18 1b19 srri @$AR0, $AX1.L
0a19 183d lrr $AC1.L, @$AR1
0a1a 4900 addax $ACC1, $AX0.L
0a1b 1fe2 mrr $AC1.M, $AR2
0a1c 4c39 add's $ACC0, $AC1.L : @$AR1, $AC1.M
0a1d 147f lsr $ACC0, #-1
0a1e 02df ret
0a1f 8900 clr $ACC1
0a20 1fb8 mrr $AC1.L, $AX0.L
0a21 157f lsr $ACC1, #-1
0a22 1050 loopi #0x50
0a23 4c20 add's $ACC0, $AC1.L : @$AR0, $AC0.L
0a24 02df ret
0a25 0082 0180 lri $AR2, #0x0180
0a27 029f 0a2f jmp 0x0a2f
0a29 0082 01c0 lri $AR2, #0x01c0
0a2b 029f 0a2f jmp 0x0a2f
0a2d 0082 0140 lri $AR2, #0x0140
0a2f 008a 003f lri $WR2, #0x003f
0a31 0086 0000 lri $IX2, #0x0000
0a33 1406 lsl $ACC0, #6
0a34 8900 clr $ACC1
0a35 1fb8 mrr $AC1.L, $AX0.L
0a36 1505 lsl $ACC1, #5
0a37 009b 003f lri $AX1.H, #0x003f
0a39 009a 0000 lri $AX0.H, #0x0000
0a3b 3600 andr $AC0.M, $AX1.H
0a3c 1cde mrr $IX2, $AC0.M
0a3d 001a addarn $AR2, $IX2
0a3e 3400 andr $AC0.M, $AX0.H
0a3f 1150 0a45 bloopi #0x50, 0x0a45
0a41 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2
0a42 3606 andr'dr $AC0.M, $AX1.H : $AR2
0a43 1cde mrr $IX2, $AC0.M
0a44 340e andr'nr $AC0.M, $AX0.H : $AR2
0a45 1b19 srri @$AR0, $AX1.L
0a46 1fc2 mrr $AC0.M, $AR2
0a47 147a lsr $ACC0, #-6
0a48 008a ffff lri $WR2, #0xffff
0a4a 02df ret
0a4b 1050 loopi #0x50
0a4c 1b18 srri @$AR0, $AX0.L
0a4d 02df ret
0a4e 0082 0100 lri $AR2, #0x0100
0a50 008a 003f lri $WR2, #0x003f
0a52 0086 0000 lri $IX2, #0x0000
0a54 1406 lsl $ACC0, #6
0a55 8900 clr $ACC1
0a56 1fb8 mrr $AC1.L, $AX0.L
0a57 1505 lsl $ACC1, #5
0a58 009b 003f lri $AX1.H, #0x003f
0a5a 009a 0000 lri $AX0.H, #0x0000
0a5c 3600 andr $AC0.M, $AX1.H
0a5d 1cde mrr $IX2, $AC0.M
0a5e 001a addarn $AR2, $IX2
0a5f 3400 andr $AC0.M, $AX0.H
0a60 1150 0a66 bloopi #0x50, 0x0a66
0a62 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2
0a63 3606 andr'dr $AC0.M, $AX1.H : $AR2
0a64 1cde mrr $IX2, $AC0.M
0a65 340e andr'nr $AC0.M, $AX0.H : $AR2
0a66 1b19 srri @$AR0, $AX1.L
0a67 1fc2 mrr $AC0.M, $AR2
0a68 147a lsr $ACC0, #-6
0a69 008a ffff lri $WR2, #0xffff
0a6b 02df ret
//
0a6c 0082 0100 lri $AR2, #0x0100
0a6e 008a 003f lri $WR2, #0x003f
0a70 0086 0000 lri $IX2, #0x0000
0a72 0081 0ca0 lri $AR1, #0x0ca0
0a74 1406 lsl $ACC0, #6
0a75 8900 clr $ACC1
0a76 1fb8 mrr $AC1.L, $AX0.L
0a77 1505 lsl $ACC1, #5
0a78 009b 003f lri $AX1.H, #0x003f
0a7a 009a 0000 lri $AX0.H, #0x0000
0a7c 3600 andr $AC0.M, $AX1.H
0a7d 1cde mrr $IX2, $AC0.M
0a7e 001a addarn $AR2, $IX2
0a7f 3400 andr $AC0.M, $AX0.H
0a80 1150 0a8b bloopi #0x50, 0x0a8b
0a82 1939 lrri $AX1.L, @$AR1
0a83 a000 mulx $AX0.L, $AX1.L
0a84 140a lsl $ACC0, #10
0a85 4e00 addp $ACC0
0a86 1476 lsr $ACC0, #-10
0a87 4c4a add'l $ACC0, $AC1.L : $AX1.L, @$AR2
0a88 3606 andr'dr $AC0.M, $AX1.H : $AR2
0a89 1cde mrr $IX2, $AC0.M
0a8a 340e andr'nr $AC0.M, $AX0.H : $AR2
0a8b 1b19 srri @$AR0, $AX1.L
0a8c 1fc2 mrr $AC0.M, $AR2
0a8d 147a lsr $ACC0, #-6
0a8e 008a ffff lri $WR2, #0xffff
0a90 02df ret
//
0a91 0080 01be lri $AR0, #0x01be
0a93 1918 lrri $AX0.L, @$AR0
0a94 191a lrri $AX0.H, @$AR0
0a95 0080 0180 lri $AR0, #0x0180
0a97 0083 0180 lri $AR3, #0x0180
0a99 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0
0a9a 1ffe mrr $AC1.M, $AC0.M
0a9b 1120 0aa2 bloopi #0x20, 0x0aa2
0a9d 7c00 neg $ACC0
0a9e d450 mulcac'l $AC1.M, $AX0.H, $ACC0 : $AX0.H, @$AR0
0a9f 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M
0aa0 c550 mulcac'l $AC0.M, $AX0.H, $ACC1 : $AX0.H, @$AR0
0aa1 1501 lsl $ACC1, #1
0aa2 643b movr's $ACC0, $AX0.H : @$AR3, $AC1.M
0aa3 0080 01fe lri $AR0, #0x01fe
0aa5 191a lrri $AX0.H, @$AR0
0aa6 1918 lrri $AX0.L, @$AR0
0aa7 0080 01c0 lri $AR0, #0x01c0
0aa9 0083 01c0 lri $AR3, #0x01c0
0aab 1ff8 mrr $AC1.M, $AX0.L
0aac 9070 mul'l $AX0.L, $AX0.H : $AC0.M, @$AR0
0aad f800 addpaxz $ACC0, $AX0.H
0aae 0240 01ff andi $AC0.M, #0x01ff
0ab0 0260 2000 ori $AC0.M, #0x2000
0ab2 02bf 0ab5 call 0x0ab5
0ab4 02df ret
0ab5 b900 tst $ACC1
0ab6 0272 ifg
0ab7 7c00 neg $ACC0
0ab8 1f7e mrr $AX1.H, $AC0.M
0ab9 4700 addr $ACC1, $AX1.H
0aba 1110 0abf bloopi #0x10, 0x0abf
0abc 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M
0abd 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M
0abe 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M
0abf 473b addr's $ACC1, $AX1.H : @$AR3, $AC1.M
0ac0 02df ret
//
0ac1 02bf 0b2e call 0x0b2e
0ac3 2201 lrs $AX0.H, @0x0001
0ac4 8600 tstaxh $AX0.H
0ac5 0294 0ad6 jnz 0x0ad6
0ac7 2204 lrs $AX0.H, @0x0004
0ac8 8600 tstaxh $AX0.H
0ac9 02b4 0b1d callne 0x0b1d
0acb 8100 clr $ACC0
0acc 2605 lrs $AC0.M, @0x0005
0acd b100 tst $ACC0
0ace 0295 0ae3 jz 0x0ae3
0ad0 8100 clr $ACC0
0ad1 2e05 srs @0x0005, $AC0.M
0ad2 2281 lrs $AX0.H, @0xff81
0ad3 8600 tstaxh $AX0.H
0ad4 0294 0add jnz 0x0add
0ad6 8100 clr $ACC0
0ad7 005f loop $AC1.M
0ad8 1b7e srri @$AR3, $AC0.M
0ad9 7400 incm $AC0.M
0ada 2e01 srs @0x0001, $AC0.M
0adb 029f 0b16 jmp 0x0b16
0add 2688 lrs $AC0.M, @0xff88
0ade 2489 lrs $AC0.L, @0xff89
0adf 2e34 srs @0x0034, $AC0.M
0ae0 2c35 srs @0x0035, $AC0.L
0ae1 02bf 0b1d call 0x0b1d
0ae3 00ff 0360 sr @0x0360, $AC1.M
0ae5 2638 lrs $AC0.M, @0x0038
0ae6 2439 lrs $AC0.L, @0x0039
0ae7 02bf 068d call 0x068d
0ae9 00df 0360 lr $AC1.M, @0x0360
0aeb 8100 clr $ACC0
0aec 263a lrs $AC0.M, @0x003a
0aed b100 tst $ACC0
0aee 0294 0afd jnz 0x0afd
0af0 263b lrs $AC0.M, @0x003b
0af1 5c00 sub $ACC0, $AC1.L
0af2 0290 0afd jns 0x0afd
0af4 223b lrs $AX0.H, @0x003b
0af5 02bf 06aa call 0x06aa
0af7 5500 subr $ACC1, $AX0.H
0af8 0a01 lris $AX0.H, #0x01
0af9 00fa 0405 sr @0x0405, $AX0.H
0afb 029f 0ad0 jmp 0x0ad0
0afd 1f5f mrr $AX0.H, $AC1.M
0afe 02bf 06aa call 0x06aa
0b00 00fa 0362 sr @0x0362, $AX0.H
0b02 8100 clr $ACC0
0b03 263a lrs $AC0.M, @0x003a
0b04 243b lrs $AC0.L, @0x003b
0b05 1570 lsr $ACC1, #-16
0b06 0a01 lris $AX0.H, #0x01
0b07 0081 0405 lri $AR1, #0x0405
0b09 5c00 sub $ACC0, $AC1.L
0b0a b100 tst $ACC0
0b0b 0275 ifz
0b0c 1a3a srr @$AR1, $AX0.H
0b0d 2e3a srs @0x003a, $AC0.M
0b0e 2c3b srs @0x003b, $AC0.L
0b0f 2638 lrs $AC0.M, @0x0038
0b10 2439 lrs $AC0.L, @0x0039
0b11 00d8 0362 lr $AX0.L, @0x0362
0b13 7000 addaxl $ACC0, $AX0.L
0b14 2c39 srs @0x0039, $AC0.L
0b15 2e38 srs @0x0038, $AC0.M
0b16 0092 00ff lri $CR, #0x00ff
0b18 029f 032e jmp 0x032e
0b1a 8100 clr $ACC0
0b1b 2e34 srs @0x0034, $AC0.M
0b1c 2e35 srs @0x0035, $AC0.M
0b1d 2334 lrs $AX1.H, @0x0034
0b1e 2135 lrs $AX1.L, @0x0035
0b1f 268a lrs $AC0.M, @0xff8a
0b20 248b lrs $AC0.L, @0xff8b
0b21 5a00 subax $ACC0, $AX1.L
0b22 2e3a srs @0x003a, $AC0.M
0b23 2c3b srs @0x003b, $AC0.L
0b24 2634 lrs $AC0.M, @0x0034
0b25 2435 lrs $AC0.L, @0x0035
0b26 238c lrs $AX1.H, @0xff8c
0b27 218d lrs $AX1.L, @0xff8d
0b28 4a00 addax $ACC0, $AX1.L
0b29 2e38 srs @0x0038, $AC0.M
0b2a 2c39 srs @0x0039, $AC0.L
0b2b 8100 clr $ACC0
0b2c 2e05 srs @0x0005, $AC0.M
0b2d 02df ret
//
0b2e 0092 0004 lri $CR, #0x0004
0b30 2002 lrs $AX0.L, @0x0002
0b31 8100 clr $ACC0
0b32 8900 clr $ACC1
0b33 2430 lrs $AC0.L, @0x0030
0b34 8d00 set15
0b35 0950 lris $AX1.L, #0x50
0b36 a000 mulx $AX0.L, $AX1.L
0b37 a400 mulxac $AX0.L, $AX1.L, $ACC0
0b38 1404 lsl $ACC0, #4 // ACC0 = (Mem[0x0002] * 80) << 4;
0b39 8c00 clr15
0b3a 1ffe mrr $AC1.M, $AC0.M // AC1.M = AC0.M;
0b3b 0083 0580 lri $AR3, #0x0580
0b3d 02df ret
// process sound format 0x10 (smg)
// read data stored at 0x0000 by DsetupTable
// stores the output to 0x0580
0b3e 02bf 0b2e call 0x0b2e // prepare regs
0b40 2201 lrs $AX0.H, @0x0001
0b41 8600 tstaxh $AX0.H
0b42 0294 0b53 jnz 0x0b53
0b44 2204 lrs $AX0.H, @0x0004
0b45 8600 tstaxh $AX0.H
0b46 02b4 0b9d callne 0x0b9d
0b48 8100 clr $ACC0
0b49 2605 lrs $AC0.M, @0x0005
0b4a b100 tst $ACC0
0b4b 0295 0b60 jz 0x0b60
0b4d 8100 clr $ACC0
0b4e 2e05 srs @0x0005, $AC0.M
0b4f 2281 lrs $AX0.H, @0xff81
0b50 8600 tstaxh $AX0.H
0b51 0294 0b5a jnz 0x0b5a
0b53 8100 clr $ACC0
0b54 005f loop $AC1.M
0b55 1b7e srri @$AR3, $AC0.M // store zero to output
0b56 7400 incm $AC0.M
0b57 2e01 srs @0x0001, $AC0.M
0b58 029f 0b96 jmp 0x0b96
0b5a 2688 lrs $AC0.M, @0xff88
0b5b 2489 lrs $AC0.L, @0xff89
0b5c 2e34 srs @0x0034, $AC0.M
0b5d 2c35 srs @0x0035, $AC0.L
0b5e 02bf 0b9d call 0x0b9d
0b60 00ff 0360 sr @0x0360, $AC1.M
0b62 2638 lrs $AC0.M, @0x0038
0b63 2439 lrs $AC0.L, @0x0039
// DMA transfer from main memory address Dword[0x0038] to 0x0580
// Dword[0x0038] = Dword[0xFF8C]
0b64 02bf 068d call 0x068d
0b66 02bf 06a4 call 0x06a4
0b68 00df 0360 lr $AC1.M, @0x0360
0b6a 8100 clr $ACC0
0b6b 263a lrs $AC0.M, @0x003a
0b6c b100 tst $ACC0
0b6d 0294 0b7c jnz 0x0b7c
0b6f 263b lrs $AC0.M, @0x003b
0b70 5c00 sub $ACC0, $AC1.L
0b71 0290 0b7c jns 0x0b7c
0b73 223b lrs $AX0.H, @0x003b
0b74 02bf 066f call 0x066f // dma?
0b76 5500 subr $ACC1, $AX0.H
0b77 0a01 lris $AX0.H, #0x01
0b78 00fa 0405 sr @0x0405, $AX0.H
0b7a 029f 0b4d jmp 0x0b4d
0b7c 1f5f mrr $AX0.H, $AC1.M
0b7d 02bf 066f call 0x066f // dma?
0b7f 00fa 0362 sr @0x0362, $AX0.H
0b81 8100 clr $ACC0
0b82 263a lrs $AC0.M, @0x003a
0b83 243b lrs $AC0.L, @0x003b
0b84 1570 lsr $ACC1, #-16
0b85 0a01 lris $AX0.H, #0x01
0b86 0081 0405 lri $AR1, #0x0405
0b88 5c00 sub $ACC0, $AC1.L
0b89 b100 tst $ACC0
0b8a 0275 ifz
0b8b 1a3a srr @$AR1, $AX0.H
0b8c 2e3a srs @0x003a, $AC0.M
0b8d 2c3b srs @0x003b, $AC0.L
0b8e 2638 lrs $AC0.M, @0x0038
0b8f 2439 lrs $AC0.L, @0x0039
0b90 00d8 0362 lr $AX0.L, @0x0362
0b92 7000 addaxl $ACC0, $AX0.L
0b93 7000 addaxl $ACC0, $AX0.L
0b94 2c39 srs @0x0039, $AC0.L
0b95 2e38 srs @0x0038, $AC0.M
0b96 0092 00ff lri $CR, #0x00ff
0b98 029f 032e jmp 0x032e
//
0b9a 8100 clr $ACC0
0b9b 2e34 srs @0x0034, $AC0.M
0b9c 2e35 srs @0x0035, $AC0.M
0b9d 2334 lrs $AX1.H, @0x0034
0b9e 2135 lrs $AX1.L, @0x0035
0b9f 268a lrs $AC0.M, @0xff8a
0ba0 248b lrs $AC0.L, @0xff8b
0ba1 5a00 subax $ACC0, $AX1.L
0ba2 2e3a srs @0x003a, $AC0.M
0ba3 2c3b srs @0x003b, $AC0.L
0ba4 2634 lrs $AC0.M, @0x0034
0ba5 2435 lrs $AC0.L, @0x0035
0ba6 1401 lsl $ACC0, #1
0ba7 238c lrs $AX1.H, @0xff8c
0ba8 218d lrs $AX1.L, @0xff8d
0ba9 4a00 addax $ACC0, $AX1.L
0baa 2e38 srs @0x0038, $AC0.M
0bab 2c39 srs @0x0039, $AC0.L
0bac 8100 clr $ACC0
0bad 2e05 srs @0x0005, $AC0.M
0bae 02df ret
//
0baf 8900 clr $ACC1
0bb0 0f50 lris $AC1.M, #0x50
0bb1 0083 0520 lri $AR3, #0x0520
0bb3 02bf 0bc8 call 0x0bc8
0bb5 029f 0336 jmp 0x0336
0bb7 00d8 0402 lr $AX0.L, @0x0402
0bb9 8100 clr $ACC0
0bba 8900 clr $ACC1
0bbb 00dc 0430 lr $AC0.L, @0x0430
0bbd 0a50 lris $AX0.H, #0x50
0bbe 9000 mul $AX0.L, $AX0.H
0bbf 9400 mulac $AX0.L, $AX0.H, $ACC0
0bc0 1404 lsl $ACC0, #4
0bc1 1ffe mrr $AC1.M, $AC0.M
0bc2 0083 0580 lri $AR3, #0x0580
0bc4 02bf 0bc8 call 0x0bc8
0bc6 029f 032e jmp 0x032e
//
0bc8 0092 0004 lri $CR, #0x0004
0bca 8100 clr $ACC0
0bcb 263a lrs $AC0.M, @0x003a
0bcc 243b lrs $AC0.L, @0x003b
0bcd 1f1f mrr $AX0.L, $AC1.M
0bce 0a00 lris $AX0.H, #0x00
0bcf 5800 subax $ACC0, $AX0.L
0bd0 0292 0be6 jg 0x0be6
0bd2 8900 clr $ACC1
0bd3 00c0 043b lr $AR0, @0x043b
0bd5 02bf 0c0b call 0x0c0b
0bd7 8100 clr $ACC0
0bd8 1fd8 mrr $AC0.M, $AX0.L
0bd9 223b lrs $AX0.H, @0x003b
0bda 5400 subr $ACC0, $AX0.H
0bdb 0007 dar $AR3
0bdc 1979 lrri $AX1.L, @$AR3
0bdd 005e loop $AC0.M
0bde 1b79 srri @$AR3, $AX1.L
0bdf 0f01 lris $AC1.M, #0x01
0be0 2f01 srs @0x0001, $AC1.M
0be1 8900 clr $ACC1
0be2 2f3b srs @0x003b, $AC1.M
0be3 0092 00ff lri $CR, #0x00ff
0be5 02df ret
//
0be6 2e3a srs @0x003a, $AC0.M
0be7 2c3b srs @0x003b, $AC0.L
0be8 8100 clr $ACC0
0be9 8900 clr $ACC1
0bea 268a lrs $AC0.M, @0xff8a
0beb 2734 lrs $AC1.M, @0x0034
0bec 5c00 sub $ACC0, $AC1.L
0bed 2e36 srs @0x0036, $AC0.M
0bee 5000 subr $ACC0, $AX0.L
0bef 0290 0c05 jns 0x0c05
0bf1 00c0 0436 lr $AR0, @0x0436
0bf3 02bf 0c0b call 0x0c0b
0bf5 8100 clr $ACC0
0bf6 1fd8 mrr $AC0.M, $AX0.L
0bf7 2236 lrs $AX0.H, @0x0036
0bf8 5400 subr $ACC0, $AX0.H
0bf9 1c1e mrr $AR0, $AC0.M
0bfa 8100 clr $ACC0
0bfb 2e34 srs @0x0034, $AC0.M
0bfc 2688 lrs $AC0.M, @0xff88
0bfd 2489 lrs $AC0.L, @0xff89
0bfe 2e8c srs @0xff8c, $AC0.M
0bff 2c8d srs @0xff8d, $AC0.L
0c00 02bf 0c0b call 0x0c0b
0c02 0092 00ff lri $CR, #0x00ff
0c04 02df ret
//
0c05 1c18 mrr $AR0, $AX0.L
0c06 02bf 0c0b call 0x0c0b
0c08 0092 00ff lri $CR, #0x00ff
0c0a 02df ret
//
0c0b 8100 clr $ACC0
0c0c 1fc0 mrr $AC0.M, $AR0
0c0d b100 tst $ACC0
0c0e 02d5 retz
0c0f 8900 clr $ACC1
0c10 2734 lrs $AC1.M, @0x0034
0c11 0340 0001 andi $AC1.M, #0x0001
0c13 0b00 lris $AX1.H, #0x00
0c14 1f3f mrr $AX1.L, $AC1.M
0c15 268c lrs $AC0.M, @0xff8c
0c16 248d lrs $AC0.L, @0xff8d
0c17 8900 clr $ACC1
0c18 2534 lrs $AC1.L, @0x0034
0c19 1501 lsl $ACC1, #1
0c1a 4c00 add $ACC0, $AC1.L
0c1b 5a00 subax $ACC0, $AX1.L
0c1c 5a00 subax $ACC0, $AX1.L
0c1d 1c20 mrr $AR1, $AR0
0c1e 1fe0 mrr $AC1.M, $AR0
0c1f 0502 addis $ACC1, #0x02
0c20 1c1f mrr $AR0, $AC1.M
0c21 009f 0b00 lri $AC1.M, #0x0b00
0c23 0092 00ff lri $CR, #0x00ff
0c25 02bf 05e8 call 0x05e8
0c27 0092 0004 lri $CR, #0x0004
0c29 2734 lrs $AC1.M, @0x0034
0c2a 1f61 mrr $AX1.H, $AR1
0c2b 4700 addr $ACC1, $AX1.H
0c2c 2f34 srs @0x0034, $AC1.M
0c2d 0080 0b00 lri $AR0, #0x0b00
0c2f 8900 clr $ACC1
0c30 1ff9 mrr $AC1.M, $AX1.L
0c31 b900 tst $ACC1
0c32 0274 ifnz
0c33 0008 iar $AR0
0c34 8900 clr $ACC1
0c35 1fe1 mrr $AC1.M, $AR1
0c36 191e lrri $AC0.M, @$AR0
0c37 0701 cmpis $ACC1, #0x01
0c38 0293 0c41 jle 0x0c41
0c3a 191a lrri $AX0.H, @$AR0
0c3b 05fe addis $ACC1, #0xfe
0c3c 005f loop $AC1.M
0c3d 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
0c3e 1b7e srri @$AR3, $AC0.M
0c3f 1b7a srri @$AR3, $AX0.H
0c40 02df ret
// uh?
0c41 1b7e srri @$AR3, $AC0.M
0c42 02df ret
// ???
// AR0 = some count??? address???
// AC0.M =
// AR1 =
0c43 0083 03e8 lri $AR3, #0x03e8
0c45 191e lrri $AC0.M, @$AR0
0c46 191a lrri $AX0.H, @$AR0
0c47 1006 loopi #0x06
0c48 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
0c49 1b7e srri @$AR3, $AC0.M
0c4a 1b7a srri @$AR3, $AX0.H
0c4b 0080 03e8 lri $AR0, #0x03e8
0c4d 8a00 m2
0c4e 0088 0007 lri $WR0, #0x0007
0c50 1150 0c5d bloopi #0x50, 0x0c5d
0c52 1c61 mrr $AR3, $AR1
0c53 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3
0c54 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0c55 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0c56 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0c57 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0c58 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0c59 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0c5a f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0c5b f200 madd $AX0.L, $AX0.H
0c5c fe00 movpz $ACC0
0c5d 1b3e srri @$AR1, $AC0.M
0c5e 0088 ffff lri $WR0, #0xffff
0c60 8b00 m0
0c61 02df ret
//
0c62 8a00 m2
0c63 05fe addis $ACC1, #0xfe
0c64 0083 03e8 lri $AR3, #0x03e8
0c66 191e lrri $AC0.M, @$AR0
0c67 191a lrri $AX0.H, @$AR0
0c68 005f loop $AC1.M
0c69 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
0c6a 1b7e srri @$AR3, $AC0.M
0c6b 1b7a srri @$AR3, $AX0.H
0c6c 0080 03e8 lri $AR0, #0x03e8
0c6e 0501 addis $ACC1, #0x01
0c6f 1d1f mrr $WR0, $AC1.M
0c70 1150 0c78 bloopi #0x50, 0x0c78
0c72 1c61 mrr $AR3, $AR1
0c73 84c3 clrp'ld : $AX0.L, $AX1.L, @$AR3
0c74 005f loop $AC1.M
0c75 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0c76 f200 madd $AX0.L, $AX0.H
0c77 fe00 movpz $ACC0
0c78 1b3e srri @$AR1, $AC0.M
0c79 0088 ffff lri $WR0, #0xffff
0c7b 8b00 m0
0c7c 02df ret
0c7d 0083 03e8 lri $AR3, #0x03e8
0c7f 191e lrri $AC0.M, @$AR0
0c80 191a lrri $AX0.H, @$AR0
0c81 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
0c82 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
0c83 1b7e srri @$AR3, $AC0.M
0c84 1b7a srri @$AR3, $AX0.H
0c85 0080 03e8 lri $AR0, #0x03e8
0c87 0088 0003 lri $WR0, #0x0003
0c89 0085 0000 lri $IX1, #0x0000
0c8b 0087 0000 lri $IX3, #0x0000
0c8d 1fc2 mrr $AC0.M, $AR2
0c8e 195b lrri $AX1.H, @$AR2
0c8f 1959 lrri $AX1.L, @$AR2
0c90 195f lrri $AC1.M, @$AR2
0c91 195a lrri $AX0.H, @$AR2
0c92 1c5e mrr $AR2, $AC0.M
0c93 1fda mrr $AC0.M, $AX0.H
0c94 1c61 mrr $AR3, $AR1
0c95 8a00 m2
0c96 8f00 set40
0c97 191a lrri $AX0.H, @$AR0
0c98 b850 mulx'l $AX0.H, $AX1.H : $AX0.H, @$AR0
0c99 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0
0c9a ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0
0c9b e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0
0c9c b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0
0c9d 1127 0ca8 bloopi #0x27, 0x0ca8
0c9f e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M
0ca0 197e lrri $AC0.M, @$AR3
0ca1 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0
0ca2 eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0
0ca3 bf50 mulxmv'l $AX0.H, $AX1.H, $ACC1 : $AX0.H, @$AR0
0ca4 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M
0ca5 197f lrri $AC1.M, @$AR3
0ca6 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0
0ca7 e8e8 maddc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0
0ca8 b650 mulxmv'l $AX0.H, $AX1.L, $ACC0 : $AX0.H, @$AR0
0ca9 e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M
0caa 197e lrri $AC0.M, @$AR3
0cab e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0
0cac eaf8 maddc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0
0cad bf00 mulxmv $AX0.H, $AX1.H, $ACC1
0cae 1bff srrn @$AR3, $AC1.M
0caf 197f lrri $AC1.M, @$AR3
0cb0 8e00 set16
0cb1 8b00 m0
0cb2 0088 ffff lri $WR0, #0xffff
0cb4 1b5b srri @$AR2, $AX1.H
0cb5 1b59 srri @$AR2, $AX1.L
0cb6 1b5f srri @$AR2, $AC1.M
0cb7 1b5e srri @$AR2, $AC0.M
0cb8 02df ret
0cb9 0083 03e8 lri $AR3, #0x03e8
0cbb 191e lrri $AC0.M, @$AR0
0cbc 191a lrri $AX0.H, @$AR0
0cbd 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
0cbe 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M
0cbf 1b7e srri @$AR3, $AC0.M
0cc0 1b7a srri @$AR3, $AX0.H
0cc1 0080 03e8 lri $AR0, #0x03e8
0cc3 0088 0003 lri $WR0, #0x0003
0cc5 0085 0000 lri $IX1, #0x0000
0cc7 0087 0000 lri $IX3, #0x0000
0cc9 1fc2 mrr $AC0.M, $AR2
0cca 195b lrri $AX1.H, @$AR2
0ccb 1959 lrri $AX1.L, @$AR2
0ccc 195f lrri $AC1.M, @$AR2
0ccd 195a lrri $AX0.H, @$AR2
0cce 1c5e mrr $AR2, $AC0.M
0ccf 1fda mrr $AC0.M, $AX0.H
0cd0 1c61 mrr $AR3, $AR1
0cd1 8a00 m2
0cd2 8f00 set40
0cd3 191a lrri $AX0.H, @$AR0
0cd4 b800 mulx $AX0.H, $AX1.H
0cd5 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0
0cd6 e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0
0cd7 ea00 maddc $AC1.M, $AX1.L
0cd8 ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0
0cd9 e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3
0cda ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0
0cdb b200 mulxmvz $AX0.H, $AX1.L, $ACC0
0cdc 1127 0ced bloopi #0x27, 0x0ced
0cde e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0
0cdf e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M
0ce0 197e lrri $AC0.M, @$AR3
0ce1 e800 maddc $AC0.M, $AX1.L
0ce2 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0
0ce3 ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3
0ce4 eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0
0ce5 bb00 mulxmvz $AX0.H, $AX1.H, $ACC1
0ce6 e350 maddx'l $AX0.H, $AX1.H : $AX0.H, @$AR0
0ce7 e2a9 maddx'lsm $AX0.H, $AX1.L : $AX0.H, $AC1.M
0ce8 197f lrri $AC1.M, @$AR3
0ce9 ea00 maddc $AC1.M, $AX1.L
0cea ea50 maddc'l $AC1.M, $AX1.L : $AX0.H, @$AR0
0ceb e877 maddc'ln $AC0.M, $AX1.L : $AC0.M, @$AR3
0cec ece8 msubc'ldm $AC0.M, $AX1.L : $AX0.H, $AX1.L, @$AR0
0ced b200 mulxmvz $AX0.H, $AX1.L, $ACC0
0cee e250 maddx'l $AX0.H, $AX1.L : $AX0.H, @$AR0
0cef e3a8 maddx'lsm $AX0.H, $AX1.H : $AX0.H, $AC0.M
0cf0 197e lrri $AC0.M, @$AR3
0cf1 e800 maddc $AC0.M, $AX1.L
0cf2 e850 maddc'l $AC0.M, $AX1.L : $AX0.H, @$AR0
0cf3 ea7f maddc'ln $AC1.M, $AX1.L : $AC1.M, @$AR3
0cf4 eef8 msubc'ldm $AC1.M, $AX1.L : $AX0.H, $AX1.H, @$AR0
0cf5 bb00 mulxmvz $AX0.H, $AX1.H, $ACC1
0cf6 1bff srrn @$AR3, $AC1.M
0cf7 197f lrri $AC1.M, @$AR3
0cf8 8e00 set16
0cf9 8b00 m0
0cfa 0088 ffff lri $WR0, #0xffff
0cfc 1b5b srri @$AR2, $AX1.H
0cfd 1b59 srri @$AR2, $AX1.L
0cfe 1b5f srri @$AR2, $AC1.M
0cff 1b5e srri @$AR2, $AC0.M
0d00 02df ret
// stores an offset table??? called by DsetupTable
// Mem[0x03F0] = 0x0000;
// Mem[0x03F1] = 0x0096;
// Mem[0x03F2] = 0x00FF;
// Mem[0x03F3] = 0x0030;
// Mem[0x03F4] = 0x0010;
// Mem[0x03F5] = 0x7F00;
// Mem[0x03F6] = 0x0000;
// Mem[0x03F7] = 0x0100;
0d01 0eff lris $AC0.M, #0xff
0d02 00fe 03f2 sr @0x03f2, $AC0.M
0d04 8100 clr $ACC0
0d05 00fe 03f0 sr @0x03f0, $AC0.M
0d07 00fe 03f6 sr @0x03f6, $AC0.M
0d09 009e 0100 lri $AC0.M, #0x0100
0d0b 00fe 03f7 sr @0x03f7, $AC0.M
0d0d 00da 03f7 lr $AX0.H, @0x03f7
0d0f 009e 8000 lri $AC0.M, #0x8000
0d11 5400 subr $ACC0, $AX0.H
0d12 00fe 03f5 sr @0x03f5, $AC0.M
0d14 0e30 lris $AC0.M, #0x30
0d15 00fe 03f3 sr @0x03f3, $AC0.M
0d17 0e10 lris $AC0.M, #0x10
0d18 00fe 03f4 sr @0x03f4, $AC0.M
0d1a 009e 0096 lri $AC0.M, #0x0096
0d1c 00fe 03f1 sr @0x03f1, $AC0.M
0d1e 02df ret
//
0d1f 0080 0a00 lri $AR0, #0x0a00
0d21 8100 clr $ACC0
0d22 00de 03f0 lr $AC0.M, @0x03f0
0d24 8900 clr $ACC1
0d25 b100 tst $ACC0
0d26 0275 ifz
0d27 0550 addis $ACC1, #0x50
0d28 00ff 03f0 sr @0x03f0, $AC1.M
0d2a 0200 0a60 addi $AC0.M, #0x0a60
0d2c 1c7e mrr $AR3, $AC0.M
0d2d 0f4e lris $AC1.M, #0x4e
0d2e 02bf 00e5 call 0x00e5
0d30 02df ret
//
0d31 00de 03f1 lr $AC0.M, @0x03f1
0d33 0200 0a60 addi $AC0.M, #0x0a60
0d35 1c7e mrr $AR3, $AC0.M
0d36 8100 clr $ACC0
0d37 8900 clr $ACC1
0d38 009f 00a0 lri $AC1.M, #0x00a0
0d3a 00de 03f1 lr $AC0.M, @0x03f1
0d3c 5d00 sub $ACC1, $AC0.L
0d3d 0e50 lris $AC0.M, #0x50
0d3e 0750 cmpis $ACC1, #0x50
0d3f 0270 ifns
0d40 5d00 sub $ACC1, $AC0.L
0d41 00da 03f2 lr $AX0.H, @0x03f2
0d43 8600 tstaxh $AX0.H
0d44 0290 0d62 jns 0x0d62
0d46 00de 03f3 lr $AC0.M, @0x03f3
0d48 5c00 sub $ACC0, $AC1.L
0d49 0293 0d4d jle 0x0d4d
0d4b 029f 0d67 jmp 0x0d67
0d4d 00db 03f7 lr $AX1.H, @0x03f7
0d4f 009e 8000 lri $AC0.M, #0x8000
0d51 4600 addr $ACC0, $AX1.H
0d52 029f 0d59 jmp 0x0d59
0d54 00db 03f7 lr $AX1.H, @0x03f7
0d56 009e 8000 lri $AC0.M, #0x8000
0d58 5600 subr $ACC0, $AX1.H
0d59 00fe 03f5 sr @0x03f5, $AC0.M
0d5b 1fda mrr $AC0.M, $AX0.H
0d5c 7c00 neg $ACC0
0d5d 1f5e mrr $AX0.H, $AC0.M
0d5e 00fe 03f2 sr @0x03f2, $AC0.M
0d60 029f 0d67 jmp 0x0d67
0d62 00de 03f4 lr $AC0.M, @0x03f4
0d64 5d00 sub $ACC1, $AC0.L
0d65 0293 0d54 jle 0x0d54
0d67 8900 clr $ACC1
0d68 00dd 03f5 lr $AC1.L, @0x03f5
0d6a 1501 lsl $ACC1, #1
0d6b 8100 clr $ACC0
0d6c 00dc 03f6 lr $AC0.L, @0x03f6
0d6e 008b 009f lri $WR3, #0x009f
0d70 0080 0a00 lri $AR0, #0x0a00
0d72 0900 lris $AX1.L, #0x00
// fill buffer at 0x0A00 with buffer at (0x0A60 + Mem[0x03F1])
0d73 1150 0d7a bloopi #0x50, 0x0d7a
0d75 1878 lrr $AX0.L, @$AR3
0d76 4c00 add $ACC0, $AC1.L
0d77 1cfe mrr $IX3, $AC0.M
0d78 001f addarn $AR3, $IX3
0d79 1fd9 mrr $AC0.M, $AX1.L
0d7a 1b18 srri @$AR0, $AX0.L
0d7b 009f 0a60 lri $AC1.M, #0x0a60
0d7d 1fc3 mrr $AC0.M, $AR3
0d7e 5c00 sub $ACC0, $AC1.L
0d7f 00fe 03f1 sr @0x03f1, $AC0.M
0d81 00fc 03f6 sr @0x03f6, $AC0.L
0d83 008b ffff lri $WR3, #0xffff
0d85 02df ret
// copy buffer at 0x0A00 to right & left buffers
0d86 0f50 lris $AC1.M, #0x50
0d87 0080 0a00 lri $AR0, #0x0a00
0d89 0083 0d60 lri $AR3, #0x0d60
0d8b 0098 3fff lri $AX0.L, #0x3fff
0d8d 02bf 00ff call 0x00ff
0d8f 0f50 lris $AC1.M, #0x50
0d90 0080 0a00 lri $AR0, #0x0a00
0d92 0083 0d00 lri $AR3, #0x0d00
0d94 0098 3fff lri $AX0.L, #0x3fff
0d96 02bf 00ff call 0x00ff
0d98 02df ret
// ???
// ACC1: ???
0d99 b900 tst $ACC1
0d9a 0294 0d9f jnz 0x0d9f
0d9c 6800 movax $ACC0, $AX0.L
0d9d b100 tst $ACC0
0d9e 02d5 retz
0d9f 1c23 mrr $AR1, $AR3
0da0 197e lrri $AC0.M, @$AR3
0da1 191b lrri $AX1.H, @$AR0
0da2 d858 mulc'l $AC1.M, $AX1.H : $AX1.H, @$AR0
0da3 1120 0da9 bloopi #0x20, 0x0da9
0da5 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3
0da6 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M
0da7 dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3
0da8 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M
0da9 4900 addax $ACC1, $AX0.L
0daa 1108 0daf bloopi #0x08, 0x0daf
0dac dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3
0dad 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M
0dae dcd3 mulcac'ld $AC1.M, $AX1.H, $ACC0 : $AX0.L, $AX1.H, @$AR3
0daf 6231 movr's $ACC0, $AX1.L : @$AR1, $AC0.M
0db0 02df ret
// interleave two buffers
0db1 8f00 set40
0db2 8d00 set15
0db3 1c03 mrr $AR0, $AR3
0db4 00d9 038e lr $AX1.L, @0x038e // (0x0040) set by DsetupTable
0db6 0b04 lris $AX1.H, #0x04
0db7 197a lrri $AX0.H, @$AR3
0db8 b053 mulx'l $AX0.H, $AX1.L : $AX0.H, @$AR3
0db9 b600 mulxmv $AX0.H, $AX1.L, $ACC0
0dba 1128 0dbf bloopi #0x28, 0x0dbf
0dbc 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3
0dbd b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M
0dbe 3ad3 orr'ld $AC0.M, $AX1.H : $AX0.L, $AX1.H, @$AR3
0dbf b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M
0dc0 8c00 clr15
0dc1 8e00 set16
0dc2 02df ret
// ???
0dc3 00da 0485 lr $AX0.H, @0x0485
0dc5 8600 tstaxh $AX0.H
0dc6 0295 0dd4 jz 0x0dd4
0dc8 8100 clr $ACC0
0dc9 00de 042a lr $AC0.M, @0x042a
0dcb 147f lsr $ACC0, #-1
0dcc 00fe 042b sr @0x042b, $AC0.M
0dce b100 tst $ACC0
0dcf 0294 0dd4 jnz 0x0dd4
0dd1 0a01 lris $AX0.H, #0x01
0dd2 00fa 0401 sr @0x0401, $AX0.H
0dd4 8f00 set40
0dd5 8100 clr $ACC0
0dd6 00de 0428 lr $AC0.M, @0x0428
0dd8 1478 lsr $ACC0, #-8
0dd9 00df 0428 lr $AC1.M, @0x0428
0ddb 0340 007f andi $AC1.M, #0x007f
0ddd 1f1e mrr $AX0.L, $AC0.M
0dde 1f5f mrr $AX0.H, $AC1.M
0ddf 0220 007f xori $ACC0, #0x007f
0de1 1f3e mrr $AX1.L, $AC0.M
0de2 0320 007f xori $ACC1, #0x007f
0de4 1f7f mrr $AX1.H, $AC1.M
0de5 8100 clr $ACC0
0de6 8900 clr $ACC1
0de7 009f 0200 lri $AC1.M, #0x0200
0de9 1fd8 mrr $AC0.M, $AX0.L
0dea 4c00 add $ACC0, $AC1.L
0deb 1c1e mrr $AR0, $AC0.M
0dec 1818 lrr $AX0.L, @$AR0
0ded 1fda mrr $AC0.M, $AX0.H
0dee 4c00 add $ACC0, $AC1.L
0def 1c1e mrr $AR0, $AC0.M
0df0 181a lrr $AX0.H, @$AR0
0df1 1fd9 mrr $AC0.M, $AX1.L
0df2 4c00 add $ACC0, $AC1.L
0df3 1c1e mrr $AR0, $AC0.M
0df4 1819 lrr $AX1.L, @$AR0
0df5 1fdb mrr $AC0.M, $AX1.H
0df6 4c00 add $ACC0, $AC1.L
0df7 1c1e mrr $AR0, $AC0.M
0df8 181b lrr $AX1.H, @$AR0
0df9 8a00 m2
0dfa 0080 0b00 lri $AR0, #0x0b00
0dfc 9800 mul $AX1.L, $AX1.H
0dfd ae00 mulxmv $AX0.L, $AX1.H, $ACC0
0dfe b630 mulxmv's $AX0.H, $AX1.L, $ACC0 : @$AR0, $AC0.M
0dff 9630 mulmv's $AX0.L, $AX0.H, $ACC0 : @$AR0, $AC0.M
0e00 6e30 movp's $ACC0 : @$AR0, $AC0.M
0e01 1b1e srri @$AR0, $AC0.M
0e02 8b00 m0
0e03 0080 0b00 lri $AR0, #0x0b00
0e05 0081 0b04 lri $AR1, #0x0b04
0e07 00da 042a lr $AX0.H, @0x042a
0e09 02bf 0e54 call 0x0e54
0e0b 0081 0b08 lri $AR1, #0x0b08
0e0d 0080 0b00 lri $AR0, #0x0b00
0e0f 00da 042a lr $AX0.H, @0x042a
0e11 00de 0429 lr $AC0.M, @0x0429
0e13 8a00 m2
0e14 c000 mulc $AC0.M, $AX0.H
0e15 8b00 m0
0e16 6e00 movp $ACC0
0e17 1f5e mrr $AX0.H, $AC0.M
0e18 02bf 0e54 call 0x0e54
0e1a 0080 0b00 lri $AR0, #0x0b00
0e1c 0081 0b0c lri $AR1, #0x0b0c
0e1e 8100 clr $ACC0
0e1f 8900 clr $ACC1
0e20 00de 042b lr $AC0.M, @0x042b
0e22 00df 042a lr $AC1.M, @0x042a
0e24 00fe 042a sr @0x042a, $AC0.M
0e26 5c00 sub $ACC0, $AC1.L
0e27 1f5e mrr $AX0.H, $AC0.M
0e28 02bf 0e5f call 0x0e5f
0e2a 0080 0b0c lri $AR0, #0x0b0c
0e2c 0081 0b10 lri $AR1, #0x0b10
0e2e 00da 0429 lr $AX0.H, @0x0429
0e30 02bf 0e54 call 0x0e54
0e32 0081 0b04 lri $AR1, #0x0b04
0e34 0082 0b0c lri $AR2, #0x0b0c
0e36 0083 0e6d lri $AR3, #0x0e6d
0e38 1108 0e51 bloopi #0x08, 0x0e51
0e3a 195f lrri $AC1.M, @$AR2
0e3b 15fb asr $ACC1, #-5
0e3c 1f1d mrr $AX0.L, $AC1.L
0e3d 1f5f mrr $AX0.H, $AC1.M
0e3e 193f lrri $AC1.M, @$AR1
0e3f 00e1 0b24 sr @0x0b24, $AR1
0e41 00e2 0b25 sr @0x0b25, $AR2
0e43 021b ilrri $AC0.M, @$AR3
0e44 00e3 0b26 sr @0x0b26, $AR3
0e46 1c7e mrr $AR3, $AC0.M
0e47 00c0 038f lr $AR0, @0x038f
0e49 02bf 0d99 call 0x0d99
0e4b 00c1 0b24 lr $AR1, @0x0b24
0e4d 00c2 0b25 lr $AR2, @0x0b25
0e4f 00c3 0b26 lr $AR3, @0x0b26
0e51 0000 nop
0e52 8e00 set16
0e53 02df ret
//
0e54 8a00 m2
0e55 191f lrri $AC1.M, @$AR0
0e56 d078 mulc'l $AC1.M, $AX0.H : $AC1.M, @$AR0
0e57 d678 mulcmv'l $AC1.M, $AX0.H, $ACC0 : $AC1.M, @$AR0
0e58 d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M
0e59 191f lrri $AC1.M, @$AR0
0e5a d631 mulcmv's $AC1.M, $AX0.H, $ACC0 : @$AR1, $AC0.M
0e5b 6e31 movp's $ACC0 : @$AR1, $AC0.M
0e5c 1b3e srri @$AR1, $AC0.M
0e5d 8b00 m0
0e5e 02df ret
0e5f 8a00 m2
0e60 8d00 set15
0e61 1f7e mrr $AX1.H, $AC0.M
0e62 1918 lrri $AX0.L, @$AR0
0e63 a840 mulx'l $AX0.L, $AX1.H : $AX0.L, @$AR0
0e64 ae40 mulxmv'l $AX0.L, $AX1.H, $ACC0 : $AX0.L, @$AR0
0e65 ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M
0e66 1918 lrri $AX0.L, @$AR0
0e67 ae31 mulxmv's $AX0.L, $AX1.H, $ACC0 : @$AR1, $AC0.M
0e68 6e31 movp's $ACC0 : @$AR1, $AC0.M
0e69 1b3e srri @$AR1, $AC0.M
0e6a 8c00 clr15
0e6b 8b00 m0
0e6c 02df ret
0e6d 0d00 lris $AC1.L, #0x00
0e6e 0d60 lris $AC1.L, #0x60
0e6f 0f40 lris $AC1.M, #0x40
0e70 0ca0 lris $AC0.L, #0xa0
0e71 0e80 lris $AC0.M, #0x80
0e72 0ee0 lris $AC0.M, #0xe0
0e73 0be0 lris $AX1.H, #0xe0
0e74 0c40 lris $AC0.L, #0x40
// store ramp???
// AR0 = 0x0580 (left buffer?)
// AR1 = 0x0520 (right buffer?)
0e75 00f9 0361 sr @0x0361, $AX1.L
0e77 1fc0 mrr $AC0.M, $AR0
0e78 0200 fffc addi $AC0.M, #0xfffc // AC0.M = AR0 - 4;
0e7a 1c1e mrr $AR0, $AC0.M // AR0 = AC0.M = 0x057C;
0e7b 1c5e mrr $AR2, $AC0.M // AR2 = AC0.M = 0x057C;
0e7c 0083 043c lri $AR3, #0x043c // AR3 = 0x043C;
0e7e 197e lrri $AC0.M, @$AR3 // AC0.M = Mem[AR3]; AR3++;
0e7f 197f lrri $AC1.M, @$AR3 // AC1.M = Mem[AR3]; AR3++;
0e80 80a2 nx'sl : $AC0.M, $AX0.H // AX0.H = Mem[AR3]; AR3++; Mem[AR0] = AC0.M; AR0++;
0e81 64a3 movr'sl $ACC0, $AX0.H : $AC1.M, $AX0.H
0e82 6530 movr's $ACC1, $AX0.H : @$AR0, $AC0.M
0e83 1b1f srri @$AR0, $AC1.M
0e84 1c02 mrr $AR0, $AR2 // AR0 = AR2; (0x0580)
0e85 8100 clr $ACC0
0e86 00de 0402 lr $AC0.M, @0x0402 // AC0.M = Mem[0x0402]; (0x0FFC) (ACC0 = 0x0FFC0000)
0e88 00fe 0362 sr @0x0362, $AC0.M // Mem[0x0362] = AC0.M;
0e8a 1474 lsr $ACC0, #-12 // ACC0 >>= 12;
0e8b 1f7e mrr $AX1.H, $AC0.M // AX1.H = AC0.M; (0x0000)
0e8c 1f3c mrr $AX1.L, $AC0.L // AX1.L = AC0.L; (0xFFC0)
0e8d 8900 clr $ACC1
0e8e 00dd 0430 lr $AC1.L, @0x0430 // AC1.L = Mem[0x0430];
0e90 1504 lsl $ACC1, #4 // ACC1 <<= 4;
0e91 0604 cmpis $ACC0, #0x04
0e92 0290 0ee9 jns 0x0ee9
0e94 1fdd mrr $AC0.M, $AC1.L
0e95 0082 02b0 lri $AR2, #0x02b0 // AR2 = 0x02B0; temp buffer?
// store a ramp. for example, the ramp is 0xFFC0, 0xFF80, 0xFF40, 0xFF00, 0xFEC0 and so on... if start value (Mem[0x0402]) is 0x0FFC.
0e97 1050 loopi #0x50 // for(i = 0; i < 80; i++)
0e98 4b2a addax's $ACC1, $AX1.L : @$AR2, $AC1.L // ACC1 += AX1.L; Mem[AR2] = AC1.L; AR2++;
0e99 1fbe mrr $AC1.L, $AC0.M
0e9a 00fe 0360 sr @0x0360, $AC0.M
0e9c 8900 clr $ACC1
0e9d 1fbe mrr $AC1.L, $AC0.M
0e9e 0af8 lris $AX0.H, #0xf8 // AX0.H = 0x00F8;
0e9f 009b 00fc lri $AX1.H, #0x00fc // AX1.H = 0x00FC;
0ea1 00d8 0361 lr $AX0.L, @0x0361 // AX0.L = Mem[0x0361];
0ea3 0082 02b0 lri $AR2, #0x02b0 // AR2 = 0x02B0;
0ea5 0083 02b0 lri $AR3, #0x02b0 // AR3 = 0x02B0;
0ea7 195e lrri $AC0.M, @$AR2 // AC0.M = Mem[AR2];
0ea8 3480 andr'ls $AC0.M, $AX0.H : $AX0.L, $AC0.M // AC0.M &= 0x00F8; AX0.L = Mem[AR0]; AR0++; Mem[AR3] = AC0.M; AR3++;
// do some processing on the ramp we just made, and merge it to the buffer at 0x0580
0ea9 1128 0eae bloopi #0x28, 0x0eae //
0eab 367a andr'l $AC0.M, $AX1.H : $AC1.M, @$AR2 // AC0.M &= AX1.H; AC1.M = Mem[AR2]; AR2++;
0eac 35b3 andr'sl $AC1.M, $AX0.H : $AC1.M, $AX1.H // AC1.M &= 0x00F8; Mem[AR0] = AC1.M; AR0++; AX1.H = Mem[AR3]; AR3++;
0ead 3772 andr'l $AC1.M, $AX1.H : $AC0.M, @$AR2 // ...
0eae 34bb andr'slm $AC0.M, $AX0.H : $AC1.M, $AX1.H
0eaf 8a00 m2 // multiply by 2
0eb0 0082 02b0 lri $AR2, #0x02b0
0eb2 00dd 0430 lr $AC1.L, @0x0430
0eb4 1504 lsl $ACC1, #4
0eb5 1fe0 mrr $AC1.M, $AR0
0eb6 8100 clr $ACC0
0eb7 00de 0362 lr $AC0.M, @0x0362
0eb9 1474 lsr $ACC0, #-12
0eba 1f7e mrr $AX1.H, $AC0.M // AX1.H = 0x0000
0ebb 1f3c mrr $AX1.L, $AC0.L // AX1.L = 0xFFC0
0ebc 8f00 set40
0ebd 1943 lrri $AR3, @$AR2
0ebe 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3
0ebf 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0ec0 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0ec1 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0ec2 f200 madd $AX0.L, $AX0.H
0ec3 fe00 movpz $ACC0
0ec4 1c1f mrr $AR0, $AC1.M
0ec5 1943 lrri $AR3, @$AR2
0ec6 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3
0ec7 90c3 mul'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0ec8 114e 0ed0 bloopi #0x4e, 0x0ed0 // uh? 0x4E? skip two samples?
0eca f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0ecb f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0ecc f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M
0ecd 1c1f mrr $AR0, $AC1.M
0ece 1943 lrri $AR3, @$AR2
0ecf 4bc3 addax'ld $ACC1, $AX1.L : $AX0.L, $AX1.L, @$AR3
0ed0 92c3 mulmvz'ld $AX0.L, $AX0.H, $ACC0 : $AX0.L, $AX1.L, @$AR3
0ed1 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0ed2 f2c3 madd'ld $AX0.L, $AX0.H : $AX0.L, $AX1.L, @$AR3
0ed3 f231 madd's $AX0.L, $AX0.H : @$AR1, $AC0.M
0ed4 fe00 movpz $ACC0
0ed5 1b3e srri @$AR1, $AC0.M
0ed6 8b00 m0 // don't multiply by 2
0ed7 8e00 set16
0ed8 00fe 0433 sr @0x0433, $AC0.M
0eda 1c1f mrr $AR0, $AC1.M
0edb 150c lsl $ACC1, #12
0edc 0340 0fff andi $AC1.M, #0x0fff
0ede 00ff 0430 sr @0x0430, $AC1.M
0ee0 0083 043c lri $AR3, #0x043c
0ee2 191e lrri $AC0.M, @$AR0
0ee3 191f lrri $AC1.M, @$AR0
0ee4 80a0 nx'ls : $AX0.H, $AC0.M
0ee5 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M
0ee6 6533 movr's $ACC1, $AX0.H : @$AR3, $AC0.M
0ee7 1b7f srri @$AR3, $AC1.M
0ee8 02df ret
//
0ee9 1fe0 mrr $AC1.M, $AR0
0eea 1c1f mrr $AR0, $AC1.M
// copy buffer at 0x0580 to buffer at 0x0520?
0eeb 1128 0ef2 bloopi #0x28, 0x0ef2
0eed 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0
0eee 1b3e srri @$AR1, $AC0.M
0eef 1c1f mrr $AR0, $AC1.M
0ef0 4b70 addax'l $ACC1, $AX1.L : $AC0.M, @$AR0
0ef1 1b3e srri @$AR1, $AC0.M
0ef2 1c1f mrr $AR0, $AC1.M
0ef3 029f 0ed8 jmp 0x0ed8
//
0ef5 0083 0520 lri $AR3, #0x0520
0ef7 00de 0433 lr $AC0.M, @0x0433
0ef9 1050 loopi #0x50
0efa 1b7e srri @$AR3, $AC0.M
0efb 029f 0336 jmp 0x0336
//
0efd 1c20 mrr $AR1, $AR0
0efe 185f lrr $AC1.M, @$AR2
0eff 1f7f mrr $AX1.H, $AC1.M
0f00 193a lrri $AX0.H, @$AR1
0f01 6400 movr $ACC0, $AX0.H
0f02 0078 0f07 bloop $AX0.L, 0x0f07
0f04 5659 subr'l $ACC0, $AX1.H : $AX1.H, @$AR1
0f05 6730 movr's $ACC1, $AX1.H : @$AR0, $AC0.M
0f06 5551 subr'l $ACC1, $AX0.H : $AX0.H, @$AR1
0f07 6438 movr's $ACC0, $AX0.H : @$AR0, $AC1.M
0f08 1a5b srr @$AR2, $AX1.H
0f09 02df ret
// InitUnkTable()
0f0a 0098 8240 lri $AX0.L, #0x8240
0f0c 00f8 04e8 sr @0x04e8, $AX0.L
0f0e 0098 7fff lri $AX0.L, #0x7fff
0f10 00f8 04e9 sr @0x04e9, $AX0.L
0f12 0098 7dbf lri $AX0.L, #0x7dbf
0f14 00f8 04ea sr @0x04ea, $AX0.L
0f16 0098 843f lri $AX0.L, #0x843f
0f18 00f8 04eb sr @0x04eb, $AX0.L
0f1a 0098 b23b lri $AX0.L, #0xb23b
0f1c 00f8 04f0 sr @0x04f0, $AX0.L
0f1e 0098 7fff lri $AX0.L, #0x7fff
0f20 00f8 04f1 sr @0x04f1, $AX0.L
0f22 0098 4dc4 lri $AX0.L, #0x4dc4
0f24 00f8 04f2 sr @0x04f2, $AX0.L
0f26 0098 d808 lri $AX0.L, #0xd808
0f28 00f8 04f3 sr @0x04f3, $AX0.L
0f2a 0098 0000 lri $AX0.L, #0x0000
0f2c 0080 04ec lri $AR0, #0x04ec
0f2e 1004 loopi #0x04
0f2f 1b18 srri @$AR0, $AX0.L
0f30 0080 04f4 lri $AR0, #0x04f4
0f32 1004 loopi #0x04
0f33 1b18 srri @$AR0, $AX0.L
0f34 02df ret
// mixer?
0f35 0080 0f40 lri $AR0, #0x0f40
0f37 0083 0b00 lri $AR3, #0x0b00
0f39 8900 clr $ACC1
0f3a 0f50 lris $AC1.M, #0x50
0f3b 0098 6784 lri $AX0.L, #0x6784
0f3d 02bf 010e call 0x010e
0f3f 0080 04e8 lri $AR0, #0x04e8
0f41 0082 04ec lri $AR2, #0x04ec
0f43 0081 0b00 lri $AR1, #0x0b00
0f45 8900 clr $ACC1
0f46 0f50 lris $AC1.M, #0x50
0f47 0080 0b00 lri $AR0, #0x0b00
0f49 0083 0d00 lri $AR3, #0x0d00
0f4b 0098 7fff lri $AX0.L, #0x7fff
0f4d 02bf 00ff call 0x00ff
0f4f 8900 clr $ACC1
0f50 0f50 lris $AC1.M, #0x50
0f51 0080 0b00 lri $AR0, #0x0b00
0f53 0083 0d60 lri $AR3, #0x0d60
0f55 0098 b820 lri $AX0.L, #0xb820
0f57 02bf 00ff call 0x00ff
0f59 0080 0ca0 lri $AR0, #0x0ca0
0f5b 0083 0b00 lri $AR3, #0x0b00
0f5d 8900 clr $ACC1
0f5e 0f50 lris $AC1.M, #0x50
0f5f 0098 6784 lri $AX0.L, #0x6784
0f61 02bf 010e call 0x010e
0f63 0080 04e8 lri $AR0, #0x04e8
0f65 0082 04f4 lri $AR2, #0x04f4
0f67 0081 0b00 lri $AR1, #0x0b00
0f69 8900 clr $ACC1
0f6a 0f50 lris $AC1.M, #0x50
0f6b 0080 0b00 lri $AR0, #0x0b00
0f6d 0083 0d00 lri $AR3, #0x0d00
0f6f 0098 47e0 lri $AX0.L, #0x47e0
0f71 02bf 00ff call 0x00ff
0f73 8900 clr $ACC1
0f74 0f50 lris $AC1.M, #0x50
0f75 0080 0b00 lri $AR0, #0x0b00
0f77 0083 0d60 lri $AR3, #0x0d60
0f79 0098 8001 lri $AX0.L, #0x8001
0f7b 02bf 00ff call 0x00ff
0f7d 02df ret
0f7e 0000 nop
0f7f 0000 nop