From fc617299a767d12d96a85721ef88f68edb98df53 Mon Sep 17 00:00:00 2001 From: luigi2us Date: Thu, 18 Jun 2009 10:56:29 +0000 Subject: [PATCH] Add a disassembly of SMG ucode. TODO: move it? I can't commit it to docs/DSP because I only checked out trunk :( git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@3489 8ced0084-cf51-0410-be5f-012b33b47a6e --- DSP_UC_SuperMarioGalaxy.txt | 3174 +++++++++++++++++++++++++++++++++++ 1 file changed, 3174 insertions(+) create mode 100644 DSP_UC_SuperMarioGalaxy.txt diff --git a/DSP_UC_SuperMarioGalaxy.txt b/DSP_UC_SuperMarioGalaxy.txt new file mode 100644 index 0000000000..5dea255728 --- /dev/null +++ b/DSP_UC_SuperMarioGalaxy.txt @@ -0,0 +1,3174 @@ + // 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 \ No newline at end of file