/* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// BIG Questions: - Who resets the 0x0350 to the beginning of the command block? - What does 00eb_Unk_BufferMultWithDest?? - Why is a PB-Transfer from RAM to DMEM 0xC0 shorts long but DMEM to RAM just 0x80 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// */ // // memory map // // 0x0280 // command queue /////////////////////////////////////////// 0x0300 to 0x0320 // AFC COEF table 0x0342 // low part of the DSetupTable /(Luigi2us) thinks it is the number of PBs 0x0343 // current command code (the code for the switch - casement table) seems to be for debug... nobody loads it 0x0344 // high part of the (command & 0xFF) ... prolly some kind of paramter 0x0345 // low part of the command 0x034e (0x0000) /////////////////////////////////////////// /////////////////////////////////////////// // Initialized at 0688_InitCommandBlock() 0x0350 (0x0280) // address to end of the command queue 0x0351 (0x0280) // address to start of the command queue 0x0352 (0x0000) // number of commands 0x0356[] // current command queue... eg: 0x81000040 for DsetupTable 0x0358 // first parameter of the command ... 0x0364 // Temp Buffer for AFC Decoder /////////////////////////////////////////// 0x0380 // RAM Address of the PBs 0x0381 // 0x038e // used by COMMAND_02 copies the low part of the command to this place 0x03a8 // COMMAND_02 copies a struct with the size of 0x40 to the place /////////////////////////////////////////// // used by 05b8_NewMail() exception to store register and restore registers 0x03fa to 0x03ff // shared and used by COMMAND_01 (DSetupTable) 0x03f0 // 0x00 0x03f1 // 0x96 0x03f2 // 0xFF 0x03f3 // 0x30 0x03f5 // 0x10 0x03f6 // 0x00 0x03f7 // 0x100 ... got some more math... have to recheck it 0x03f9 // used by COMMAND_02... if the program decides to continue the UCode it stores the continue address... ////////////////////////////////////////////// // current PB in DSyncFrame 0x0400 . . . 0x04C0 /// 0x0400 - must be != 0 to be a valid block 0x0401 - must be != 0 to be a valid block 0x0402 - Sample Decode Offset ?? Offset = (*0x402 * 0x50) 0x0404 - Initialize Sample Decoder 0x0406 - Direct Stream ... no sample decoder is needed. At the end of the PB Handling 0x0404 is set to 0 if it is NOT a direct stream 0x0430 - Base Address ?? (0x0430 + Offset) << 4 0x042c flag if > 0 033d_unk() does something 0x0433 stored to 0x03f8 ... i think that is the current sample buffer 0x0480 if 0x0406 is zero check how we have to decode this data... 0x0484 & 0x1f -> (02ed to 030f) 0x0484 & 0x20 0x04a8 if != zero sample is modified with function at 0x0c84.. perhaps an filter //////////////////////////////////////// 0x04d3 "offset to sample data" ???? /////////////////////////////////////////// // Initialized at 0e14_Unk() 0x04e8 (0x8240) 0x04e9 (0x7FFF) 0x04ea (0x7DBF) 0x04eb (0x843f) 0x04ec (0x0000) 0x04ed (0x0000) 0x04ee (0x0000) 0x04ef (0x0000) 0x04f0 (0xb23b) 0x04f1 (0x7FFF) 0x04f2 (0x4dc4) 0x04f3 (0xd808) 0x04f4 (0x0000) 0x04f5 (0x0000) 0x04f6 (0x0000) 0x04f7 (0x0000) /////////////////////////////////////////// 0x04fc... // used for some kind of data exchange between SyncFrame and MailExceptionHanlder // it is like this: // (0x04fc + lastRenderedFrame) must be "something" :) /////////////////////////////////////////// // Initialized at 04c0_Unk()... used by SyncFrame 0x0B00 to 0x0C00 ////////////////////////////////////////// 0x0dc0 -- ?????????? // // exception vector // 0000 029f 0012 jmp 0x0012 -> ResetVector() 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 05b8 jmp 0x05b8 -> 05b8_NewMail() 0010 029f 004e jmp 0x004e -> 004e_ContinueUCode() ??? // reset vector void 0012_ResetVector() { # 0012 1205 sbclr #0x05 // 0013 02bf 0057 call 0x0057 0057_InitHardware() /* 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 Clear memory */ { short ACC0 = 0; short AR0 = 0x0000; for (int i=0; i<0x1000; i++) { *AR0 = ACC0; AR0++; } } // 001c 02bf 0688 call 0x0688 0688_InitCommandBlock(); // 001e 02bf 04c0 call 0x04c0 04c0_Unk(); // 0020 02bf 0e14 call 0x0e14 0e14_Unk(); // Init from 0x04e8 to 0x04f8 // 0022 0e00 lris $AC0.M, #0x00 // 0023 02bf 066a call 0x066a SendMB_DCD1(0x0000) // 0025 009e 1111 lri $AC0.M, #0x1111 // 0027 02bf 0674 call 0x0674 SendMB_F355(0x1111) // 0029 0e00 lris $AC0.M, #0x00 // 002a 00fe 034e sr @0x034e, $AC0.M *0x034e = 0x00 # 002c 1305 sbset #0x05 // 002d 029f 06c5 jmp 0x06c5 // // an exception will be raised if a new mail is inside the mailbox // the exception handler will copy the command to an address and the // 06c5_CopyCommandBlock creates a copy of the command to 0x0356 // :WaitForNewCommandBlock while (06c5_CopyCommandBlock() == 0x002d); // 002f 00df 0357 lr $AC1.M, @0x0357 // 0031 00ff 0345 sr @0x0345, $AC1.M *0x0345 = *0x0357 // 0033 00de 0356 lr $AC0.M, @0x0356 // 0035 1ffe mrr $AC1.M, $AC0.M // 0036 0340 00ff andi $AC1.M, #0x00ff // 0038 00ff 0344 sr @0x0344, $AC1.M short upperCommand = *0x0356 // AC0 = upperCommand *0x0344 = upperCommand & 0x00FF // 003a 1479 lsr $ACC0, #-7 // 003b 0240 007e andi $AC0.M, #0x007e // 003d 00fe 0343 sr @0x0343, $AC0.M upperCommand = (upperCommand >> 7) & 0x7e // F|RES: i think duddy is wrong here ... a negative must be a shift right *0x0343 = upperCommand /* 003f 0200 0075 addi $AC0.M, #0x0075 0041 1c1e mrr $AR0, $AC0.M 0042 170f jmpr $AR0 switch casement of the commands.. jump table is at 0075 */ switch(upperCommand >> 1) // command must be shift >> 1 in our source code because the jump table is aligned with 2 Bytes { // case 0x00: 0x0043 case 0x01: 0095_COMMAND_01(); break; case 0x02: 0243_COMMAND_02(); break; case 0x03: 0x0073 case 0x04: 0095_COMMAND_04(); break; case 0x05: 0x0592 case 0x06: 0x0469 case 0x07: 0x041d case 0x08: 0x0485 case 0x09: 0x044d // case 0x0A: 0x0043 // case 0x0B: 0x0043 // case 0x0C: 0x0043 case 0x0D: 0x00b2 // case 0x0E: 0x0043 // case 0x0F: 0x0043 } # 0043 0092 00ff lri $CR, #0x00ff // 0045 0e04 lris $AC0.M, #0x04 // 0046 02bf 066a call 0x066a SendMB_DCD1(0x0004) // 0048 00de 0356 lr $AC0.M, @0x0356 // 004a 02bf 0674 call 0x0674 SendMB_F355(@0x0356) // 004c 029f 002d jmp 0x002d GOTO :WaitForNewCommandBlock } void 004e_ContinueUCode??() { # 004e 1205 sbclr #0x05 // 004f 02bf 0057 call 0x0057 0057_InitHardware() // 0051 0e01 lris $AC0.M, #0x01 // 0052 02bf 066a call 0x066a SendMB_DCD1(0x0001) # 0054 1305 sbset #0x05 // 0055 029f 002d jmp 0x002d GOTO :WaitForNewCommandBlock } void 0057_InitHardware() { 0057 1202 sbclr #0x02 0058 1203 sbclr #0x03 0059 1204 sbclr #0x04 005a 1306 sbset #0x06 005b 8e00 set16 005c 8c00 clr15 005d 8b00 m0 005e 009e ffff lri $AC0.M, #0xffff 0060 1d1e mrr $WR0, $AC0.M 0061 1d3e mrr $WR1, $AC0.M 0062 1d5e mrr $WR2, $AC0.M 0063 1d7e mrr $WR3, $AC0.M 0064 0092 00ff lri $CR, #0x00ff 0066 02df ret } void 0067_CopyCommand(_destAddr($AR0), _loopCount($AC0.M)) { // 0067 0090 0000 lri $AC0.H, #0x0000 // 0069 0c00 lris $AC0.L, #0x00 // 006a 0081 0358 lri $AR1, #0x0358 AC0.H = 0x0000 AC0.L = 0x00 AR1 = 0x0358 // 006c 007e 0071 bloop $AC0.M, 0x0071 // 006e 193e lrri $AC0.M, @$AR1 // 006f 1b1e srri @$AR0, $AC0.M // 0070 193e lrri $AC0.M, @$AR1 // 0071 1b1e srri @$AR0, $AC0.M for (int i=0; i<_loopCount; i++) { *_destAddr++ = *AR1.M++ *_destAddr++ = *AR1.M++ } // 0072 02df ret } /* 0073 029f 0043 jmp 0x0043 0075 029f 0043 jmp 0x0043 0077 029f 0095 jmp 0x0095 0079 029f 0243 jmp 0x0243 007b 029f 0073 jmp 0x0073 007d 029f 0580 jmp 0x0580 007f 029f 0592 jmp 0x0592 0081 029f 0469 jmp 0x0469 0083 029f 041d jmp 0x041d 0085 029f 0485 jmp 0x0485 0087 029f 044d jmp 0x044d 0089 029f 0043 jmp 0x0043 008b 029f 0043 jmp 0x0043 008d 029f 0043 jmp 0x0043 008f 029f 00b2 jmp 0x00b2 0091 029f 0043 jmp 0x0043 0093 029f 0043 jmp 0x0043 jump table for command code decoding */ // DsetupTable void 0095_COMMAND_01() { // 0095 0080 0380 lri $AR0, #0x0380 // 0097 0e04 lris $AC0.M, #0x04 // 0098 02bf 0067 call 0x0067 0067_CopyCommand(0x0380, 0x04) // 009a 0081 0382 lri $AR1, #0x0382 // 009c 009f 0000 lri $AC1.M, #0x0000 // 009e 0080 0280 lri $AR0, #0x0280 // 00a0 02bf 0523 call 0x0523 0523_CopyRAMtoDMEM(0x0382, 0x0000, 0x0280) // 00a2 0081 0384 lri $AR1, #0x0384 // 00a4 009f 0300 lri $AC1.M, #0x0300 // 00a6 0080 0020 lri $AR0, #0x0020 // 00a8 02bf 0523 call 0x0523 0523_CopyRAMtoDMEM(0x0384, 0x0300, 0x0020) // 00aa 00de 0345 lr $AC0.M, @0x0345 // 00ac 00fe 0342 sr @0x0342, $AC0.M *0x0342 = *0x0345 // 00ae 02bf 0bec call 0x0bec 0bec_Unk() // 00b0 029f 0043 jmp 0x0043 } 00b2 0080 0374 lri $AR0, #0x0374 00b4 0e01 lris $AC0.M, #0x01 00b5 00fe 0377 sr @0x0377, $AC0.M 00b7 00fe 037c sr @0x037c, $AC0.M 00b9 02bf 0067 call 0x0067 00bb 00de 0345 lr $AC0.M, @0x0345 00bd 00fe 0376 sr @0x0376, $AC0.M 00bf 029f 0043 jmp 0x0043 void 00c1_CopyPBToDMEM() { // 00c1 0081 034c lri $AR1, #0x034c // 00c3 009f 0400 lri $AC1.M, #0x0400 // 00c5 0080 00c0 lri $AR0, #0x00c0 // 00c7 02bf 0523 call 0x0523 // 00c9 02df ret 0523_CopyRAMtoDMEM(0x034c, 0x0400, 0x00c0); } void 00ca_CopyPBToRAM() { // 00ca 0081 034c lri $AR1, #0x034c // 00cc 009f 0400 lri $AC1.M, #0x0400 // 00ce 0080 0080 lri $AR0, #0x0080 // 00d0 0081 034c lri $AR1, #0x034c AR1 = 0x034c AC1.M = 0x0400 AR0 = 0x0080 // 00d2 193e lrri $AC0.M, @$AR1 // 00d3 193c lrri $AC0.L, @$AR1 AC0.M = *0x034c AC0.L = *0x034d // 00d4 0098 0000 lri $AX0.L, #0x0000 // 00d6 7000 addaxl $ACC0, $AX0.L // 00d7 02bf 0532 call 0x0532 0532_DMEMtoRAM(0x0400, ACC0, 0x0080) // 00d9 02df ret } void 00da_CopyBuffer(_src($AR0), _dest($AR3), _LenInDWORDs(_AC1.M)) { 00da 191e lrri $AC0.M, @$AR0 00db 191a lrri $AX0.H, @$AR0 00dc 005f loop $AC1.M 00dd 64a0 movr'ls $ACC0, $AX0.H : $AX0.H, $AC0.M 00de 1b7e srri @$AR3, $AC0.M 00df 1b7a srri @$AR3, $AX0.H // 00e0 02df ret } 00e1 191e lrri $AC0.M, @$AR0 00e2 191a lrri $AX0.H, @$AR0 00e3 007f 00e8 bloop $AC1.M, 0x00e8 00e5 32b2 xorr'sl $AC0.M, $AX1.H : $AC0.M, $AX1.H 00e6 65a0 movr'ls $ACC1, $AX0.H : $AX0.H, $AC0.M 00e7 33ba xorr'slm $AC1.M, $AX1.H : $AC0.M, $AX1.H 00e8 64a1 movr'ls $ACC0, $AX0.H : $AX0.H, $AC1.M 00e9 0000 nop 00ea 02df ret // // --- the disasm looks buggy... AR3 seems to be the destination but it isnt used at all... no idea // void 00eb_Unk_BufferMultWithDest(_Src=($AR0), _Dest($AR3), _size($AC1.M), _factor($AX0.L)) { 00eb 8a00 m2 00ec 157f lsr $ACC1, #-1 00ed 1c20 mrr $AR1, $AR0 00ee 1c03 mrr $AR0, $AR3 00ef 193a lrri $AX0.H, @$AR1 00f0 9051 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR1 00f1 925b mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX1.H, @$AR3 00f2 007f 00f7 bloop $AC1.M, 0x00f7 00f4 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 00f5 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H 00f6 4651 addr'l $ACC0, $AX1.H : $AX0.H, @$AR1 00f7 92b2 mulmvz'sl $AX0.L, $AX0.H, $ACC0 : $AC0.M, $AX1.H 00f8 8b00 m0 //00f9 02df ret return } 00fa 8a00 m2 00fb 191a lrri $AX0.H, @$AR0 00fc 9050 mul'l $AX0.L, $AX0.H : $AX0.H, @$AR0 00fd 9250 mulmvz'l $AX0.L, $AX0.H, $ACC0 : $AX0.H, @$AR0 00fe 005f loop $AC1.M 00ff 92a0 mulmvz'ls $AX0.L, $AX0.H, $ACC0 : $AX0.H, $AC0.M 0100 8b00 m0 0101 02df ret void 0102_PrepareFrameBuffers() { // 0102 8100 clr $ACC0 // 0103 8900 clr $ACC1 // 0104 0e50 lris $AC0.M, #0x50 ACC0 = 0 ACC1 = 0 AC0.M = 0x50 // 0105 0080 0d00 lri $AR0, #0x0d00 // 0107 005e loop $AC0.M // 0108 1b1f srri @$AR0, $AC1.M for (int i=0; i<0x50; i++) *0x0d00++ = 0x00 // 0109 0080 0d60 lri $AR0, #0x0d60 // 010b 005e loop $AC0.M // 010c 1b1f srri @$AR0, $AC1.M for (int i=0; i<0x50; i++) *0x0d60++ = 0x00 // 10d 02bf 0e3f call 0x0e3f 0e3f_Unk() // it seems to set up some tables with data from 0x0b00 // 010f 8100 clr $ACC0 // 0110 8900 clr $ACC1 // 0111 0e50 lris $AC0.M, #0x50 ACC0 = 0 ACC1 = 0 AC0.M = 0x50 // 0112 0080 0ca0 lri $AR0, #0x0ca0 // 0114 005e loop $AC0.M // 0115 1b1f srri @$AR0, $AC1.M for (int i=0; i<0x50; i++) *0x0ca0++ = 0x00 // 0116 0080 0f40 lri $AR0, #0x0f40 // 0118 005e loop $AC0.M // 0119 1b1f srri @$AR0, $AC1.M for (int i=0; i<0x50; i++) *0x0f40++ = 0x00 // 011a 0080 0fa0 lri $AR0, #0x0fa0 // 011c 005e loop $AC0.M // 011d 1b1f srri @$AR0, $AC1.M for (int i=0; i<0x50; i++) *0x0fa0++ = 0x00 // 011e 0080 0a00 lri $AR0, #0x0a00 // 0120 005e loop $AC0.M // 0121 1b1f srri @$AR0, $AC1.M for (int i=0; i<0x50; i++) *0x0a00++ = 0x00 // 0122 0080 09a0 lri $AR0, #0x09a0 // 0124 005e loop $AC0.M // 0125 1b1f srri @$AR0, $AC1.M for (int i=0; i<0x50; i++) *0x09a0++ = 0x00 // 0126 02df ret } 0127 00c0 03a0 lr $AR0, @0x03a0 0129 191a lrri $AX0.H, @$AR0 012a 00df 03a1 lr $AC1.M, @0x03a1 012c 009b 00a0 lri $AX1.H, #0x00a0 012e 0081 0393 lri $AR1, #0x0393 0130 18bc lrrd $AC0.L, @$AR1 0131 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 0132 bc00 mulxac $AX0.H, $AX1.H, $ACC0 0133 0080 0050 lri $AR0, #0x0050 0135 0508 addis $ACC1, #0x08 0136 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM 0138 00de 0390 lr $AC0.M, @0x0390 013a 02a0 0001 andf $AC0.M, #0x0001 013c 029d 0145 jlz 0x0145 013e 0080 0398 lri $AR0, #0x0398 0140 0e08 lris $AC0.M, #0x08 0141 00c1 03a1 lr $AR1, @0x03a1 0143 02bf 0b2e call 0x0b2e 0145 0f50 lris $AC1.M, #0x50 0146 00c0 03a1 lr $AR0, @0x03a1 0148 00da 0394 lr $AX0.H, @0x0394 014a 8600 tstaxh $AX0.H 014b 0295 0152 jz 0x0152 014d 1c7a mrr $AR3, $AX0.H 014e 00d8 0395 lr $AX0.L, @0x0395 0150 02bf 00eb call 0x00eb 0152 0f50 lris $AC1.M, #0x50 0153 00c0 03a1 lr $AR0, @0x03a1 0155 00da 0396 lr $AX0.H, @0x0396 0157 8600 tstaxh $AX0.H 0158 0295 015f jz 0x015f 015a 1c7a mrr $AR3, $AX0.H 015b 00d8 0397 lr $AX0.L, @0x0397 015d 02bf 00eb call 0x00eb 015f 00de 0390 lr $AC0.M, @0x0390 0161 02a0 0002 andf $AC0.M, #0x0002 0163 02dd retlz 0164 0080 0398 lri $AR0, #0x0398 0166 0e08 lris $AC0.M, #0x08 0167 00c1 03a1 lr $AR1, @0x03a1 0169 02bf 0b2e call 0x0b2e 016b 02df ret void 016c_Unk_SetupMemAt_0c00() { 016c 8900 clr $ACC1 016d 009f 0dc0 lri $AC1.M, #0x0dc0 016f 00ff 03a1 sr @0x03a1, $AC1.M 0171 009f 03a8 lri $AC1.M, #0x03a8 0173 00ff 03a2 sr @0x03a2, $AC1.M 0175 009f 03a4 lri $AC1.M, #0x03a4 0177 00ff 03a0 sr @0x03a0, $AC1.M 0179 1104 019f bloopi #0x04, 0x019f { // 017b 00c0 03a2 lr $AR0, @0x03a2 // 017d 0083 0390 lri $AR3, #0x0390 // 017f 0f0e lris $AC1.M, #0x0e // 0180 02bf 00da call 0x00da 00da_CopyBuffer(@0x03a2, 0x0390, 0x0e) 0182 00da 0390 lr $AX0.H, @0x0390 0184 8600 tstaxh $AX0.H 0185 0295 0191 jz 0x0191 0187 00df 03a1 lr $AC1.M, @0x03a1 0189 1c7f mrr $AR3, $AC1.M 018a 0550 addis $ACC1, #0x50 // 018b 1c1f mrr $AR0, $AC1.M // 018c 0f06 lris $AC1.M, #0x06 // 018d 02bf 00da call 0x00da 00da_CopyBuffer($AC1.M, $AR3, 0x06) 018f 02bf 0127 call 0x0127 0191 00de 03a2 lr $AC0.M, @0x03a2 0193 0410 addis $ACC0, #0x10 0194 00fe 03a2 sr @0x03a2, $AC0.M 0196 00de 03a1 lr $AC0.M, @0x03a1 0198 0460 addis $ACC0, #0x60 0199 00fe 03a1 sr @0x03a1, $AC0.M 019b 00de 03a0 lr $AC0.M, @0x03a0 019d 7400 incm $AC0.M 019e 00fe 03a0 sr @0x03a0, $AC0.M } 01a0 0f50 lris $AC1.M, #0x50 01a1 0080 0c00 lri $AR0, #0x0c00 01a3 0083 0e80 lri $AR3, #0x0e80 01a5 0098 7fff lri $AX0.L, #0x7fff 01a7 02bf 00eb call 0x00eb 01a9 0f50 lris $AC1.M, #0x50 01aa 0080 0c00 lri $AR0, #0x0c00 01ac 0083 0ee0 lri $AR3, #0x0ee0 01ae 0098 b820 lri $AX0.L, #0xb820 01b0 02bf 00eb call 0x00eb 01b2 0f28 lris $AC1.M, #0x28 01b3 0080 0c78 lri $AR0, #0x0c78 01b5 0083 0e80 lri $AR3, #0x0e80 01b7 0098 b820 lri $AX0.L, #0xb820 01b9 02bf 00eb call 0x00eb 01bb 0f28 lris $AC1.M, #0x28 01bc 0080 0c78 lri $AR0, #0x0c78 01be 0083 0ee0 lri $AR3, #0x0ee0 01c0 0098 7fff lri $AX0.L, #0x7fff 01c2 02bf 00eb call 0x00eb 01c4 8100 clr $ACC0 01c5 8900 clr $ACC1 01c6 0e50 lris $AC0.M, #0x50 01c7 0080 0c00 lri $AR0, #0x0c00 01c9 005e loop $AC0.M 01ca 1b1f srri @$AR0, $AC1.M 01cb 0080 0c50 lri $AR0, #0x0c50 01cd 005e loop $AC0.M 01ce 1b1f srri @$AR0, $AC1.M 01cf 02df ret } 01d0 00c0 03a0 lr $AR0, @0x03a0 01d2 181a lrr $AX0.H, @$AR0 01d3 8100 clr $ACC0 01d4 181e lrr $AC0.M, @$AR0 01d5 00db 0391 lr $AX1.H, @0x0391 01d7 7400 incm $AC0.M 01d8 d100 cmpar $ACC1, $AX0.H 01d9 0270 ifns 01da 8100 clr $ACC0 01db 1b1e srri @$AR0, $AC0.M 01dc 00df 03a1 lr $AC1.M, @0x03a1 01de 009b 00a0 lri $AX1.H, #0x00a0 01e0 0081 0393 lri $AR1, #0x0393 01e2 18bc lrrd $AC0.L, @$AR1 01e3 b871 mulx'l $AX0.H, $AX1.H : $AC0.M, @$AR1 01e4 bc00 mulxac $AX0.H, $AX1.H, $ACC0 01e5 0080 0050 lri $AR0, #0x0050 01e7 02bf 0532 call 0x0532 01e9 02df ret 01ea 8900 clr $ACC1 01eb 0f28 lris $AC1.M, #0x28 01ec 0080 0c50 lri $AR0, #0x0c50 01ee 0083 0ea8 lri $AR3, #0x0ea8 01f0 0098 b820 lri $AX0.L, #0xb820 01f2 02bf 00eb call 0x00eb 01f4 8900 clr $ACC1 01f5 0f28 lris $AC1.M, #0x28 01f6 0080 0c50 lri $AR0, #0x0c50 01f8 0083 0f08 lri $AR3, #0x0f08 01fa 0098 7fff lri $AX0.L, #0x7fff 01fc 02bf 00eb call 0x00eb 01fe 009f 0dc0 lri $AC1.M, #0x0dc0 0200 00ff 03a1 sr @0x03a1, $AC1.M 0202 009f 03a8 lri $AC1.M, #0x03a8 0204 00ff 03a2 sr @0x03a2, $AC1.M 0206 009f 03a4 lri $AC1.M, #0x03a4 0208 00ff 03a0 sr @0x03a0, $AC1.M 020a 1104 0228 bloopi #0x04, 0x0228 020c 00c0 03a2 lr $AR0, @0x03a2 020e 0083 0390 lri $AR3, #0x0390 0210 0f0e lris $AC1.M, #0x0e 0211 02bf 00da call 0x00da 00da_CopyBuffer() 0213 00da 0390 lr $AX0.H, @0x0390 0215 8600 tstaxh $AX0.H 0216 0295 021a jz 0x021a 0218 02bf 01d0 call 0x01d0 021a 00de 03a2 lr $AC0.M, @0x03a2 021c 0410 addis $ACC0, #0x10 021d 00fe 03a2 sr @0x03a2, $AC0.M 021f 00de 03a1 lr $AC0.M, @0x03a1 0221 0460 addis $ACC0, #0x60 0222 00fe 03a1 sr @0x03a1, $AC0.M 0224 00de 03a0 lr $AC0.M, @0x03a0 0226 7400 incm $AC0.M 0227 00fe 03a0 sr @0x03a0, $AC0.M 0229 02df ret void 022a_Copy_XXX_From_RAM_To_0x03a8() { // 022a 0081 0386 lri $AR1, #0x0386 // 022c 009f 03a8 lri $AC1.M, #0x03a8 // 022e 0080 0040 lri $AR0, #0x0040 // 0230 02bf 0523 call 0x0523 0523_CopyRAMtoDMEM(0x0386, 0x03a8, 0x0040); // 0232 02df ret } void 0233_Increase_32BitAddress_InMem(_MemAddr(AR0), _Bytes(AX0.L)) { 0233 191e lrri $AC0.M, @$AR0 0234 189c lrrd $AC0.L, @$AR0 0235 4800 addax $ACC0, $AX0.L 0236 1b1e srri @$AR0, $AC0.M 0237 1b1c srri @$AR0, $AC0.L // 0238 02df ret } void 0239_WaitUntilLastFrameGotSynced() { 0239 8100 clr $ACC0 023a 8900 clr $ACC1 023b 00df 0354 lr $AC1.M, @0x0354 023d 00de 034e lr $AC0.M, @0x034e 023f 8200 cmp 0240 0293 0239 jle 0x0239 // 0242 02df ret } ///////////////////////// // // // 0x0341: Number of Frames to render ... // 0x034c + 0x034d: RAM address of the current PB block // 0x034e: Last Sync message for rendered frame // 0x0354: Number of rendered frames // 0x0355: Current Frame // 0x0388: RAM Address of Output Buffer1 // 0x038a: RAM Address of Output Buffer2 // // 0x038f: Output Buffer Address (0x0520 most of the time) // // 0x0520: Some kind of sample buffer void 0243_COMMAND_02() // sync frame { // 0243 0080 0388 lri $AR0, #0x0388 // 0245 0081 0067 lri $AR1, #0x0067 // 0247 0e02 lris $AC0.M, #0x02 // 0248 173f callr $AR1 0067_CopyCommand(0x0388, 0x02) // 0249 00de 0344 lr $AC0.M, @0x0344 // 024b 00fe 0341 sr @0x0341, $AC0.M *0x0341 = *0x0344 // 024d 00de 0345 lr $AC0.M, @0x0345 // 024f 00fe 038e sr @0x038e, $AC0.M *0x038e = *0x0345 // 0251 8100 clr $ACC0 // 0252 00fe 0355 sr @0x0355, $AC0.M *0x0355 = 0x00 // 0254 02bf 022a call 0x022a 022a_Copy_XXX_From_RAM_To_0x03a8() // perhaps an PB ?? // 0256 02bf 05a4 call 0x05a4 05A4_ResetAccelerator() // 0258 00de 0341 lr $AC0.M, @0x0341 // 025a 007e 0418 bloop $AC0.M, 0x0418 for (int j=0; j< *0x0341; j++) // 0x0341 = high part of the (command & 0xFF) ... perhaps number of frames to render?? { // 025c 02bf 0102 call 0x0102 0102_PrepareFrameBuffers() // 025e 02bf 016c call 0x016c 016c_Unk_SetupMemAt_0c00() // 0260 02bf 095f call 0x095f 095f_Unk_SetupMemAt0_0180() // 0262 00de 0355 lr $AC0.M, @0x0355 // 0264 7400 incm $AC0.M // 0265 00fe 0355 sr @0x0355, $AC0.M *0x0355 = *0x0355++ // 0267 8100 clr $ACC0 // 0268 00fe 0354 sr @0x0354, $AC0.M *0x0354 = 0 // 026a 00de 0342 LR $AC0.M, @0x0342 // 026c 007e 03c0 bloop $AC0.M, 0x03c0 for (int i=0; i<*0x0342; i++) // 0x0342 - low part of the DSetupTable Command? Some kind of number of PBs? { // 026a 00de 0342 lr $AC0.M, @0x0342 // 026e 02bf 0239 call 0x0239 0239_WaitUntilLastFrameGotSynced() // 0270 8100 clr $ACC0 // 0271 8900 clr $ACC1 ACC0 = 0 ACC1 = 0 // this block is for masking out PBs... the lower part of the sync messages are updating this mask // but i am not 100 percent sure how it works { // 0272 00de 0354 lr $AC0.M, @0x0354 // 0274 147c lsr $ACC0, #-4 // 0275 0200 04fc addi $AC0.M, #0x04fc // 0277 1c1e mrr $AR0, $AC0.M AC0.M = *0x0354 >> 4 AR0 = AC0.M + 0x04fc 0278 181f lrr $AC1.M, @$AR0 0279 00de 0354 lr $AC0.M, @0x0354 027b 0240 000f andi $AC0.M, #0x000f 027d 3d80 andc'ls $AC1.M : $AX0.L, $AC0.M 027e 03c0 8000 andcf $AC1.M, #0x8000 //0280 029c 03bc jlnz 0x03bc GOTO NEXT_BLOCK: } // 0282 00d8 0354 lr $AX0.L, @0x0354 // 0284 009a 0180 lri $AX0.H, #0x0180 // 0286 8100 clr $ACC0 // 0287 00de 0380 lr $AC0.M, @0x0380 // 0289 00dc 0381 lr $AC0.L, @0x0381 // 028b 9000 mul $AX0.L, $AX0.H // 028c 9400 mulac $AX0.L, $AX0.H, $ACC0 // 028d 00fe 034c sr @0x034c, $AC0.M // 028f 00fc 034d sr @0x034d, $AC0.L AX0.L = *0x0354 // number of rendered frames AX0.H = 0x0180 // PB Size with dummy buffer ACC0 = (*0x0380 << 16) | *0x0381 ACC0 += AX0.L * AX0.H *0x034C = AC0.M *0x034D = AC0.L // 0291 02bf 00c1 call 0x00c1 00c1_CopyPBToDMEM() // 0293 00da 0400 lr $AX0.H, @0x0400 // 0295 8600 tstaxh $AX0.H // 0296 0295 03bc jz 0x03bc if (*0x0400 == 0x00) GOTO NEXT_BLOCK: // 0298 00da 0401 lr $AX0.H, @0x0401 // 029a 8600 tstaxh $AX0.H // 029b 0294 03bc jnz 0x03bc if (*0x0401 != 0x00) GOTO NEXT_BLOCK: // 029d 00da 0433 lr $AX0.H, @0x0433 // 029f 00fa 03f8 sr @0x03f8, $AX0.H *0x03f8 = *0x0433 // 02a1 00da 0406 lr $AX0.H, @0x0406 // 02a3 8600 tstaxh $AX0.H // 02a4 0294 0dff jnz 0x0dff if (*0x0406 != 0x00) { The Code at 0x0dff copies from *0x0433 0x50 shorts to 0x0520 } else { // 02a6 8100 clr $ACC0 // 02a7 00de 0480 lr $AC0.M, @0x0480 // 02a9 0609 cmpis $ACC0, #0x09 // 02aa 0295 02bd jz 0x02bd // 02ac 0605 cmpis $ACC0, #0x05 // 02ad 0295 02bd jz 0x02bd // 02af 0608 cmpis $ACC0, #0x08 // 02b0 0295 098f jz 0x098f // 02b2 0610 cmpis $ACC0, #0x10 // 02b3 0295 0a14 jz 0x0a14 // 02b5 0620 cmpis $ACC0, #0x20 // 02b6 0295 0a9a jz 0x0a9a // 02b8 0621 cmpis $ACC0, #0x21 // 02b9 0295 0aa2 jz 0x0aa2 // 02bb 029f 087c jmp 0x087c switch(*0x0480) { case 0x05: case 0x09: GOTO 02BD: case 0x08: GOTO 098f: case 0x10: GOTO 0a14: case 0x20: GOTO 0a9a: case 0x21: GOTO 0aa2: default: GOTO 087C: } // 02bd 00d8 0402 lr $AX0.L, @0x0402 // 02bf 8100 clr $ACC0 // 02c0 8900 clr $ACC1 // 02c1 00dc 0430 lr $AC0.L, @0x0430 // 02c3 8d00 set15 // 02c4 0950 lris $AX1.L, #0x50 // 02c5 a000 mulx $AX0.L, $AX1.L // 02c6 a400 mulxac $AX0.L, $AX1.L, $ACC0 // 02c7 1404 lsl $ACC0, #4 // 02c8 8c00 clr15 AX0.L = *0x0402 ACC0 = *0x430 + (AX0.L * 0x50) ACC0 >>= 4 // 02c9 1ffe mrr $AC1.M, $AC0.M // 02ca 0083 0580 lri $AR3, #0x0580 // 02cc 02bf 073d call 0x073d 073d_DECODE_0x05_0x09(0x0580, AC1.M, 0x50) // 02ce 029f 02d0 jmp 0x02d0 } MixFrom_0580_to_0520: // 02d0 0080 0580 lri $AR0, #0x0580 // 02d2 0081 0520 lri $AR1, #0x0520 // 02d4 0099 0000 lri $AX1.L, #0x0000 // 02d6 02bf 0d7f call 0x0d7f 0d7f_Unk(0x0580, 0x0520, 0x0000); ContinueWithBlock: // 02d8 00da 04a8 lr $AX0.H, @0x04a8 // 02da 8600 tstaxh $AX0.H // 02db 0295 02e1 jz 0x02e1 // 02dd 0080 0520 lri $AR0, #0x0520 // 02df 02bf 0c84 call 0x0c84 if (0x04a8 != 0) 0c84_ModifySample(0x0520) // 02e1 009e 0520 lri $AC0.M, #0x0520 // 02e3 00fe 038f sr @0x038f, $AC0.M *0x038f = 0x0520 // 02e5 8900 clr $ACC1 // 02e6 00df 0484 lr $AC1.M, @0x0484 // 02e8 0340 001f andi $AC1.M, #0x001f ACC1 = 0x00 AC1.M = *0x0484 & 0x1f // 02ea b900 tst $ACC1 // 02eb 0295 0311 jz 0x0311 if ((*0x0484 & 0x1f) != 0x00) { 02ed 00de 038f lr $AC0.M, @0x038f 02ef 5c00 sub $ACC0, $AC1.L 02f0 00fe 038f sr @0x038f, $AC0.M 02f2 1c7e mrr $AR3, $AC0.M // 02f3 0080 0440 lri $AR0, #0x0440 02f5 05fe addis $ACC1, #0xfe // 02f6 02bf 00da call 0x00da 00da_CopyBuffer(0x0440, $AR3, ACC1) 02f8 0080 0490 lri $AR0, #0x0490 02fa 00c1 038f lr $AR1, @0x038f 02fc 8900 clr $ACC1 02fd 00df 0484 lr $AC1.M, @0x0484 02ff 0340 001f andi $AC1.M, #0x001f 0301 02bf 0b4d call 0x0b4d 0303 00de 038f lr $AC0.M, @0x038f 0305 0450 addis $ACC0, #0x50 0306 1c1e mrr $AR0, $AC0.M // 0307 0083 0440 lri $AR3, #0x0440 0309 8900 clr $ACC1 030a 00df 0484 lr $AC1.M, @0x0484 030c 0340 001f andi $AC1.M, #0x001f 030e 05fe addis $ACC1, #0xfe // 030f 02bf 00da call 0x00da 00da_CopyBuffer(, 0x0440) } // 0311 00de 0484 lr $AC0.M, @0x0484 // 0313 0240 0020 andi $AC0.M, #0x0020 // 0315 0295 0333 jz 0x0333 if ((*0x0484 & 0x0020) != 0) { 0317 0080 04a4 lri $AR0, #0x04a4 0319 00c1 038f lr $AR1, @0x038f 031b 0082 0454 lri $AR2, #0x0454 031d 0083 04a7 lri $AR3, #0x04a7 031f 18fa lrrd $AX0.H, @$AR3 0320 8600 tstaxh $AX0.H 0321 0294 0331 jnz 0x0331 0323 18fa lrrd $AX0.H, @$AR3 0324 8600 tstaxh $AX0.H 0325 0294 0331 jnz 0x0331 0327 18fa lrrd $AX0.H, @$AR3 0328 8600 tstaxh $AX0.H 0329 0294 0331 jnz 0x0331 032b 8100 clr $ACC0 032c 18fe lrrd $AC0.M, @$AR3 032d 0280 7fff cmpi $AC0.M, #0x7fff 032f 0295 0333 jz 0x0333 0331 02bf 0b68 call 0x0b68 } 0333 8100 clr $ACC0 0334 00de 042c lr $AC0.M, @0x042c 0336 b100 tst $ACC0 0337 0295 033d jz 0x033d if (*0x042c != 0) { // 0339 02bf 0cd3 call 0x0cd3 // 033b 029f 03b2 jmp 0x03b2 0cd3_Unk() } else { 033d 8100 clr $ACC0 033e 1c9e mrr $IX0, $AC0.M 033f 1cde mrr $IX2, $AC0.M 0340 7400 incm $AC0.M 0341 1cfe mrr $IX3, $AC0.M 0342 8100 clr $ACC0 // 0343 00de 0407 lr $AC0.M, @0x0407 // 0345 b100 tst $ACC0 // 0346 0295 0355 jz 0x0355 if (*0x0407 != 0) { 0348 00c3 038f lr $AR3, @0x038f 034a 0007 dar $AR3 034b 0080 0477 lri $AR0, #0x0477 034d 0084 ffff lri $IX0, #0xffff 034f 0087 ffff lri $IX3, #0xffff 0351 199a lrrn $AX0.H, @$AR0 0352 6554 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR0 0353 005e loop $AC0.M 0354 65ad movr'lsnm $ACC1, $AX0.H : $AX0.H, $AC1.M } // 0355 00da 0485 lr $AX0.H, @0x0485 // 0357 8600 tstaxh $AX0.H // 0358 0295 036b jz 0x036b if (*0x0485 != 0) { 035a 8900 clr $ACC1 035b 0086 0005 lri $IX2, #0x0005 035d 0082 040a lri $AR2, #0x040a 035f 1106 0363 bloopi #0x06, 0x0363 0361 18de lrrd $AC0.M, @$AR2 0362 147f lsr $ACC0, #-1 0363 4d36 add'sn $ACC1, $AC0.L : @$AR2, $AC0.M 0364 b900 tst $ACC1 0365 0294 036b jnz 0x036b 0367 009a 0001 lri $AX0.H, #0x0001 0369 00fa 0401 sr @0x0401, $AX0.H } # 036b 8f00 set40 036c 0086 0002 lri $IX2, #0x0002 036e 0082 0408 lri $AR2, #0x0408 // 0370 1106 039b bloopi #0x06, 0x039b for (int i=0; i<6; i++) { 0372 8100 clr $ACC0 0373 195e lrri $AC0.M, @$AR2 0374 1200 sbclr #0x00 0375 b100 tst $ACC0 0376 0275 ifz 0377 1300 sbset #0x00 0378 1c7e mrr $AR3, $AC0.M 0379 195e lrri $AC0.M, @$AR2 037a 195f lrri $AC1.M, @$AR2 037b 5c00 sub $ACC0, $AC1.L 037c 14fb asr $ACC0, #-5 037d 1f5e mrr $AX0.H, $AC0.M 037e 1f1c mrr $AX0.L, $AC0.L 037f 185e lrr $AC0.M, @$AR2 0380 0240 00ff andi $AC0.M, #0x00ff 0382 1f7e mrr $AX1.H, $AC0.M 0383 185e lrr $AC0.M, @$AR2 0384 1478 lsr $ACC0, #-8 0385 009c 0000 lri $AC0.L, #0x0000 0387 d100 cmpar $ACC1, $AX0.H 0388 0295 0390 jz 0x0390 038a 185e lrr $AC0.M, @$AR2 038b 0272 ifg 038c 7400 incm $AC0.M 038d 0271 ifs 038e 7800 decm $AC0.M 038f 1a5e srr @$AR2, $AC0.M 0390 0006 dar $AR2 0391 00de 038f lr $AC0.M, @0x038f 0393 5600 subr $ACC0, $AX1.H 0394 029d 0399 jlz 0x0399 0396 1c1e mrr $AR0, $AC0.M 0397 02bf 0ca9 call 0x0ca9 0399 0000 nop 039a 1b5f srri @$AR2, $AC1.M 039b 000a iar $AR2 } # 039c 8e00 set16 // 039d 8100 clr $ACC0 // 039e 00de 0407 lr $AC0.M, @0x0407 // 03a0 b100 tst $ACC0 // 03a1 0295 03b2 jz 0x03b2 if (*0x0407 != 0) { 03a3 00c3 038f lr $AR3, @0x038f 03a5 0087 004f lri $IX3, #0x004f 03a7 001f addarn $AR3, $IX3 03a8 0080 0477 lri $AR0, #0x0477 03aa 0084 ffff lri $IX0, #0xffff 03ac 0087 ffff lri $IX3, #0xffff 03ae 19fa lrrn $AX0.H, @$AR3 03af 6557 movr'ln $ACC1, $AX0.H : $AX0.H, @$AR3 03b0 005e loop $AC0.M 03b1 65af movr'slnm $ACC1, $AX0.H : $AC1.M, $AX0.H } } // 03b2 00da 0406 lr $AX0.H, @0x0406 // 03b4 8600 tstaxh $AX0.H // 03b5 0294 03ba jnz 0x03ba if (*0x0406 == 0) { // 03b7 8100 clr $ACC0 // 03b8 00fe 0404 sr @0x0404, $AC0.M *0x0404 = 0x0000 } // 03ba 02bf 00ca call 0x00ca 00ca_CopyPBToRAM() NEXT_BLOCK: 03bc 00de 0354 lr $AC0.M, @0x0354 03be 7400 incm $AC0.M 03bf 00fe 0354 sr @0x0354, $AC0.M } // 03c1 0e00 lris $AC0.M, #0x00 // 03c2 00fe 034e sr @0x034e, $AC0.M *0x034e = 0x00 // 03c4 0e04 lris $AC0.M, #0x04 // 03c5 02bf 066a call 0x066a SendMB_DCD1(0x0004) // 03c7 00de 0355 lr $AC0.M, @0x0355 // 03c9 0260 ff00 ori $AC0.M, #0xff00 // 03cb 02bf 0674 call 0x0674 SendMB_F355(*0x0355 | 0xFF00) // *0x0355 - current frame // 03cd 02bf 0c0a call 0x0c0a 0c0a_Unk() // free buffer at 0x0A00 ?? // 03cf 02bf 0c1c call 0x0c1c 0c1c_Unk() // 03d1 02bf 0c71 call 0x0c71 0c71_Unk() // copy/mix/math 0x0D00 and 0x0D60 together to 0x0A00 // 03d3 00de 0341 lr $AC0.M, @0x0341 // 03d5 7800 decm $AC0.M // 03d6 00fe 0341 sr @0x0341, $AC0.M *0x0341 = *0x0341-- // 03d8 0080 09a0 lri $AR0, #0x09a0 // 03da 0083 0d00 lri $AR3, #0x0d00 // 03dc 0f50 lris $AC1.M, #0x50 // 03dd 0098 5a82 lri $AX0.L, #0x5a82 // 03df 02bf 00eb call 0x00eb 00eb_Unk_BufferMultWithDest(0x09a0, 0x0d00, 0x50, 0x5a82) // 03e1 0080 09a0 lri $AR0, #0x09a0 // 03e3 0083 0d60 lri $AR3, #0x0d60 // 03e5 0f50 lris $AC1.M, #0x50 // 03e6 02bf 00eb call 0x00eb 00eb_Unk_BufferMultWithDest(0x09a0, 0x0d60, 0x50, 0x5a82) // 03e8 0083 0d00 lri $AR3, #0x0d00 // 03ea 02bf 0cc1 call 0x0cc1 0cc1_UnkFilter(0x0d00) // 03ec 0081 0388 lri $AR1, #0x0388 // 03ee 009f 0d00 lri $AC1.M, #0x0d00 // 03f0 0080 0050 lri $AR0, #0x0050 // 03f2 02bf 0530 call 0x0530 0530_DMEMtoRAM_Ind(0x0d00, 0x0388, 0x050) // 03f4 0080 0fa0 lri $AR0, #0x0fa0 // 03f6 0083 0d60 lri $AR3, #0x0d60 // 03f8 0f50 lris $AC1.M, #0x50 // 03f9 0098 8000 lri $AX0.L, #0x8000 // 03fb 02bf 00eb call 0x00eb 00eb_Unk_BufferMultWithDest(0x0fa0, 0x0d60, 0x50, 0x8000) // 03fd 0083 0d60 lri $AR3, #0x0d60 // 03ff 02bf 0cc1 call 0x0cc1 0cc1_UnkFilter(0x0d60) // 0401 0081 038a lri $AR1, #0x038a // 0403 009f 0d60 lri $AC1.M, #0x0d60 // 0405 0080 0050 lri $AR0, #0x0050 // 0407 02bf 0530 call 0x0530 0530_DMEMtoRAM_Ind(0x0d60, 0x038a, 0x050) // 0409 009a 0000 lri $AX0.H, #0x0000 // 040b 0098 00a0 lri $AX0.L, #0x00a0 // 040d 0080 0388 lri $AR0, #0x0388 // 040f 02bf 0233 call 0x0233 0233_Increase_32BitAddress_InMem(0x0388, 0x0a) // 0411 0080 038a lri $AR0, #0x038a // 0413 02bf 0233 call 0x0233 0233_Increase_32BitAddress_InMem(0x038a, 0x0a) 0415 02bf 01ea call 0x01ea 0417 0000 nop 0418 0000 nop } // 0419 0080 002d lri $AR0, #0x002d // 041b 029f 0603 jmp 0x0603 0603_Unk(0x02d) } 041d 0080 0346 lri $AR0, #0x0346 041f 02bf 0067 call 0x0067 0421 02bf 0067 call 0x0067 0423 0081 0346 lri $AR1, #0x0346 0425 193e lrri $AC0.M, @$AR1 0426 193c lrri $AC0.L, @$AR1 0427 009f 0400 lri $AC1.M, #0x0400 0429 00c0 0345 lr $AR0, @0x0345 042b 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM 042d 0081 0348 lri $AR1, #0x0348 042f 193e lrri $AC0.M, @$AR1 0430 193c lrri $AC0.L, @$AR1 0431 009f 0800 lri $AC1.M, #0x0800 0433 00c0 0345 lr $AR0, @0x0345 0435 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM 0437 0081 0346 lri $AR1, #0x0346 0439 193e lrri $AC0.M, @$AR1 043a 193c lrri $AC0.L, @$AR1 043b 009f 0800 lri $AC1.M, #0x0800 043d 00c0 0345 lr $AR0, @0x0345 043f 02bf 0532 call 0x0532 0441 0081 0348 lri $AR1, #0x0348 0443 193e lrri $AC0.M, @$AR1 0444 193c lrri $AC0.L, @$AR1 0445 009f 0400 lri $AC1.M, #0x0400 0447 00c0 0345 lr $AR0, @0x0345 0449 02bf 0532 call 0x0532 044b 029f 0043 jmp 0x0043 044d 0080 0346 lri $AR0, #0x0346 044f 02bf 0067 call 0x0067 0451 02bf 0067 call 0x0067 0453 0081 0346 lri $AR1, #0x0346 0455 193e lrri $AC0.M, @$AR1 0456 193c lrri $AC0.L, @$AR1 0457 009f 0400 lri $AC1.M, #0x0400 0459 00c0 0345 lr $AR0, @0x0345 045b 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM 045d 0081 0348 lri $AR1, #0x0348 045f 193e lrri $AC0.M, @$AR1 0460 193c lrri $AC0.L, @$AR1 0461 009f 0400 lri $AC1.M, #0x0400 0463 00c0 0345 lr $AR0, @0x0345 0465 02bf 0532 call 0x0532 0467 029f 0043 jmp 0x0043 0469 0080 0346 lri $AR0, #0x0346 046b 02bf 0067 call 0x0067 046d 02bf 0067 call 0x0067 046f 0081 0346 lri $AR1, #0x0346 0471 193e lrri $AC0.M, @$AR1 0472 193c lrri $AC0.L, @$AR1 0473 009f 0400 lri $AC1.M, #0x0400 0475 00c0 0345 lr $AR0, @0x0345 0477 02bf 0555 call 0x0555 0479 0081 0348 lri $AR1, #0x0348 047b 193e lrri $AC0.M, @$AR1 047c 193c lrri $AC0.L, @$AR1 047d 009f 0400 lri $AC1.M, #0x0400 047f 00c0 0345 lr $AR0, @0x0345 0481 02bf 0532 call 0x0532 0483 029f 0043 jmp 0x0043 0485 0080 0346 lri $AR0, #0x0346 0487 02bf 0067 call 0x0067 0489 02bf 0067 call 0x0067 048b 0081 0346 lri $AR1, #0x0346 048d 193e lrri $AC0.M, @$AR1 048e 193c lrri $AC0.L, @$AR1 048f 009f 0400 lri $AC1.M, #0x0400 0491 00c0 0344 lr $AR0, @0x0344 0493 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM 0495 0081 0348 lri $AR1, #0x0348 0497 193e lrri $AC0.M, @$AR1 0498 193c lrri $AC0.L, @$AR1 0499 009f 0800 lri $AC1.M, #0x0800 049b 00c0 0344 lr $AR0, @0x0344 049d 02bf 0525 call 0x0525 // 0525_CopyRAMtoDMEM 049f 0080 0400 lri $AR0, #0x0400 04a1 0083 0800 lri $AR3, #0x0800 04a3 0084 0000 lri $IX0, #0x0000 04a5 00da 0345 lr $AX0.H, @0x0345 04a7 00df 0344 lr $AC1.M, @0x0344 04a9 8f00 set40 04aa 197b lrri $AX1.H, @$AR3 04ab b800 mulx $AX0.H, $AX1.H 04ac 197b lrri $AX1.H, @$AR3 04ad 007f 04b2 bloop $AC1.M, 0x04b2 04af 199e lrrn $AC0.M, @$AR0 04b0 bc00 mulxac $AX0.H, $AX1.H, $ACC0 04b1 80b2 nx'sl : $AC0.M, $AX1.H 04b2 0000 nop 04b3 8e00 set16 04b4 0081 0346 lri $AR1, #0x0346 04b6 193e lrri $AC0.M, @$AR1 04b7 193c lrri $AC0.L, @$AR1 04b8 009f 0400 lri $AC1.M, #0x0400 04ba 00c0 0344 lr $AR0, @0x0344 04bc 02bf 0532 call 0x0532 04be 029f 0043 jmp 0x0043 void 04c0_Unk() { 04c0 0092 00ff lri $CR, #0x00ff 04c2 8100 clr $ACC0 04c3 0080 0b00 lri $AR0, #0x0b00 04c5 10ff loopi #0xff 04c6 1b1e srri @$AR0, $AC0.M 04c7 1b1e srri @$AR0, $AC0.M 04c8 8100 clr $ACC0 04c9 009f 0b00 lri $AC1.M, #0x0b00 04cb 0080 0100 lri $AR0, #0x0100 04cd 02bf 0573 call 0x0573 04cf 02df ret } 04d0 02bf 04e1 call 0x04e1 04d2 00df 04fb lr $AC1.M, @0x04fb 04d4 009e 0b00 lri $AC0.M, #0x0b00 04d6 4c00 add $ACC0, $AC1.L 04d7 1c1e mrr $AR0, $AC0.M 04d8 181e lrr $AC0.M, @$AR0 04d9 7400 incm $AC0.M 04da 1a1e srr @$AR0, $AC0.M 04db 02bf 04ea call 0x04ea 04dd 8100 clr $ACC0 04de 00fe 04fb sr @0x04fb, $AC0.M 04e0 02df ret 04e1 0092 00ff lri $CR, #0x00ff 04e3 8100 clr $ACC0 04e4 009f 0b00 lri $AC1.M, #0x0b00 04e6 0080 0040 lri $AR0, #0x0040 04e8 029f 0555 jmp 0x0555 04ea 8100 clr $ACC0 04eb 009f 0b00 lri $AC1.M, #0x0b00 04ed 0080 0050 lri $AR0, #0x0050 04ef 029f 0573 jmp 0x0573 04f1 02bf 04e1 call 0x04e1 04f3 8900 clr $ACC1 04f4 0080 04fc lri $AR0, #0x04fc 04f6 8100 clr $ACC0 04f7 1104 0505 bloopi #0x04, 0x0505 04f9 0000 nop 04fa 191e lrri $AC0.M, @$AR0 04fb 0000 nop 04fc 1110 0503 bloopi #0x10, 0x0503 04fe 02c0 0001 andcf $AC0.M, #0x0001 0500 027d iflz 0501 7500 incm $AC1.M 0502 147f lsr $ACC0, #-1 0503 0000 nop 0504 0000 nop 0505 0000 nop 0506 00de 04fc lr $AC0.M, @0x04fc 0508 00fe 0b48 sr @0x0b48, $AC0.M 050a 00de 04fd lr $AC0.M, @0x04fd 050c 00fe 0b49 sr @0x0b49, $AC0.M 050e 00de 04fe lr $AC0.M, @0x04fe 0510 00fe 0b4a sr @0x0b4a, $AC0.M 0512 00de 04ff lr $AC0.M, @0x04ff 0514 00fe 0b4b sr @0x0b4b, $AC0.M 0516 009e 0b00 lri $AC0.M, #0x0b00 0518 4c00 add $ACC0, $AC1.L 0519 1c1e mrr $AR0, $AC0.M 051a 181e lrr $AC0.M, @$AR0 051b 7400 incm $AC0.M 051c 1a1e srr @$AR0, $AC0.M 051d 02bf 04ea call 0x04ea 051f 02df ret 0520 02bf 04ea call 0x04ea 0522 02df ret // the first parameter is a pointer to the real RAM addr void 0523_CopyRAMtoDMEM(&_srcRAM($AR1), _destDMEM($AC1.M), _len($AR0)) { // 0523 193e lrri $AC0.M, @$AR1 // 0524 193c lrri $AC0.L, @$AR1 AC0 = *AR1++ << 16 | *AR1 void 0525_CopyRAMtoDMEM(_srcRAM($AR1), _destDMEM($AC1.M), _len($AR0)) { 0525 2fcd srs @DSPA, $AC1.M 0526 0f00 lris $AC1.M, #0x00 // ugly jump to share code... i am not going to document it ^^ 0527 2fc9 srs @DSCR, $AC1.M 0528 2ece srs @DSMAH, $AC0.M 0529 2ccf srs @DSMAL, $AC0.L 052a 1fe0 mrr $AC1.M, $AR0 052b 1501 lsl $ACC1, #1 052c 2fcb srs @DSBL, $AC1.M // 052d 02bf 0536 call 0x0536 0536_WaitForDMATransfer() // 052f 02df ret } void 0530_DMEMtoRAM_Ind(_DMEM(AC1.M), _pMemAddr(AR1), _len(AR0)) { // 0530 193e lrri $AC0.M, @$AR1 // 0531 193c lrri $AC0.L, @$AR1 AC0 = *AR1++ << 16 | *AR1 void 0532_DMEMtoRAM(_DMEM(AC1.M), _pMemAddr(ACC0), _len(AR0)) { 0532 2fcd srs @DSPA, $AC1.M 0533 0f01 lris $AC1.M, #0x01 0534 029f 0527 jmp 0x0527 } void 0536_WaitForDMATransfer() { 0536 26c9 lrs $AC0.M, @DSCR 0537 02a0 0004 andf $AC0.M, #0x0004 0539 029c 0536 jlnz 0x0536 053b 02df ret } 053c 193e lrri $AC0.M, @$AR1 053d 193c lrri $AC0.L, @$AR1 053e 00ff ffcd sr @DSPA, $AC1.M 0540 0f00 lris $AC1.M, #0x00 0541 00ff ffc9 sr @DSCR, $AC1.M 0543 00fe ffce sr @DSMAH, $AC0.M 0545 00fc ffcf sr @DSMAL, $AC0.L 0547 1fe0 mrr $AC1.M, $AR0 0548 1501 lsl $ACC1, #1 0549 00ff ffcb sr @DSBL, $AC1.M 054b 02df ret 054c 00de ffc9 lr $AC0.M, @DSCR 054e 02a0 0004 andf $AC0.M, #0x0004 0550 029c 054c jlnz 0x054c 0552 02df ret 0553 193e lrri $AC0.M, @$AR1 0554 193c lrri $AC0.L, @$AR1 0555 0240 7fff andi $AC0.M, #0x7fff 0557 02bf 0561 call 0x0561 0559 007a 055f bloop $AX0.H, 0x055f 055b 26d3 lrs $AC0.M, @Unk Zelda 055c 1b3e srri @$AR1, $AC0.M 055d 0000 nop 055e 0000 nop 055f 0000 nop 0560 02df ret 0561 1c3f mrr $AR1, $AC1.M 0562 0f0a lris $AC1.M, #0x0a 0563 2fd1 srs @SampleFormat, $AC1.M 0564 1f5e mrr $AX0.H, $AC0.M 0565 1f1c mrr $AX0.L, $AC0.L 0566 009e ffff lri $AC0.M, #0xffff 0568 2ed6 srs @ACEAH, $AC0.M 0569 2ed7 srs @ACEAL, $AC0.M 056a 1fda mrr $AC0.M, $AX0.H 056b 1f98 mrr $AC0.L, $AX0.L 056c 147f lsr $ACC0, #-1 056d 2ed8 srs @ACCAH, $AC0.M 056e 2cd9 srs @ACCAL, $AC0.L 056f 1f40 mrr $AX0.H, $AR0 0570 02df ret 0571 193e lrri $AC0.M, @$AR1 0572 193c lrri $AC0.L, @$AR1 0573 0090 0001 lri $AC0.H, #0x0001 0575 02bf 0561 call 0x0561 0577 007a 057e bloop $AX0.H, 0x057e 0579 193e lrri $AC0.M, @$AR1 057a 2ed3 srs @Unk Zelda, $AC0.M 057b 0000 nop 057c 0000 nop 057d 0000 nop 057e 0000 nop 057f 02df ret void 0095_COMMAND_04() { // commando looks buggy... // it copies data to the switch casement data address... sounds like BS 0580 0080 0346 lri $AR0, #0x0346 0582 02bf 0067 call 0x0067 0584 02bf 0067 call 0x0067 0067_CopyCommand(0x0346, mssing AC0.M??) 0586 0081 0346 lri $AR1, #0x0346 0588 00df 0349 lr $AC1.M, @0x0349 058a 0340 ffff andi $AC1.M, #0xffff 058c 00c0 0345 lr $AR0, @0x0345 058e 02bf 0523 call 0x0523 0590 029f 0043 jmp 0x0043 0592 0080 0346 lri $AR0, #0x0346 0594 02bf 0067 call 0x0067 0596 02bf 0067 call 0x0067 // 0598 0081 0346 lri $AR1, #0x0346 // 059a 00df 0349 lr $AC1.M, @0x0349 // 059c 0340 ffff andi $AC1.M, #0xffff // 059e 00c0 0345 lr $AR0, @0x0345 // 05a0 02bf 0530 call 0x0530 0530_DMEMtoRAM_Ind((*0x0349)&0xFFFF, 0x0346, *0x0345) // 05a2 029f 0043 jmp 0x0043 // jumps back to send sync messages .... } void 05A4_ResetAccelerator() { 05a4 0092 00ff lri $CR, #0x00ff 05a6 009e ffff lri $AC0.M, #0xffff 05a8 2ed4 srs @ACSAH, $AC0.M 05a9 2ed5 srs @ACSAL, $AC0.M 05aa 2ed6 srs @ACEAH, $AC0.M 05ab 2ed7 srs @ACEAL, $AC0.M 05ac 02df ret } void 05ad_SetupAcclerator(_accleratorH(AC0.M), _accleratorL(AC0.L), _format(AC1.M)) { 05ad 00ff ffd1 sr @SampleFormat, $AC1.M 05af 0340 0003 andi $AC1.M, #0x0003 05b1 7900 decm $AC1.M 05b2 02ca cw 0x02ca ; *** UNKNOWN OPCODE *** 05b3 00fe ffd8 sr @ACCAH, $AC0.M 05b5 00fc ffd9 sr @ACCAL, $AC0.L 05b7 02df ret } void 05b8_NewMail() { # 05b8 1205 sbclr #0x05 # 05b9 8e00 set16 /* 05ba 00f0 03fd sr @0x03fd, $AC0.H 05bc 00fc 03ff sr @0x03ff, $AC0.L 05be f400 lsr16 $ACC0 05bf 00fc 03fe sr @0x03fe, $AC0.L 05c1 00fa 03fa sr @0x03fa, $AX0.H 05c3 8100 clr $ACC0 save AC0 register */ *0x03fd = AC0.H *0x03fF = AC0.L ACC0 >>= 16 *0x03fe = AC0.L *0x03fa = AX0.H // 05c4 00de fffe lr $AC0.M, @CMBH // 05c6 02c0 8000 andcf $AC0.M, #0x8000 // 05c8 029c 06b9 jlnz 0x06b9 if (@CMBH & 0x8000 > 0) { !MISSING! } // 05ca 00da ffff lr $AX0.H, @CMBL // 05cc 8600 tstaxh $AX0.H // 05cd 0294 0692 jnz 0x0692 if (*CMBL != 0) { !MISSING! } // 05cf 00de fffe lr $AC0.M, @CMBH // 05d1 02c0 8000 andcf $AC0.M, #0x8000 // 05d3 029c 05cf jlnz 0x05cf while(@CMBH & 0x8000 > 0); // 05d5 0240 000f andi $AC0.M, #0x000f // 05d7 1f5e mrr $AX0.H, $AC0.M // 05d8 7400 incm $AC0.M // 05d9 0c00 lris $AC0.L, #0x00 // 05da 1404 lsl $ACC0, #4 // 05db 00fe 034e sr @0x034e, $AC0.M AC0.M = *CMBH & 0x000F AX0.H = AC0.M *0x034e = (AC0.M++) << 4 // 05dd 1fda mrr $AC0.M, $AX0.H // 05de 1f40 mrr $AX0.H, $AR0 // 05df 0200 04fc addi $AC0.M, #0x04fc // 05e1 1c1e mrr $AR0, $AC0.M AX0.H = AR0 // save AR0 AC0.M = *CMBH & 0x000F AC0.M += 0x04fc AR0 = AC0.M // 05e2 00de ffff lr $AC0.M, @CMBL // 05e4 1a1e srr @$AR0, $AC0.M // 05e5 1c1a mrr $AR0, $AX0.H AC0.M = *CMBL *AR0 = AC0.M AR0 = AX.H // restore AR0 EndOfMailException: /* 05e6 00de 03fe lr $AC0.M, @0x03fe 05e8 00dc 03ff lr $AC0.L, @0x03ff 05ea 00d0 03fd lr $AC0.H, @0x03fd 05ec 00da 03fa lr $AX0.H, @0x03fa restore AC0 register */ AC0.M = *0x03fe AC0.L = *0x03ff AC0.H = *0x03fd AX0.H = *0x03fa # 05ee 1305 sbset #0x05 05ef 02ff rti } void 05f0_HaltUCode() { 05f0 009a 0002 lri $AX0.H, #0x0002 05f2 00fa 03a3 sr @0x03a3, $AX0.H 05f4 00e0 03f9 sr @0x03f9, $AR0 05f6 02bf 067c call 0x067c 05f8 16fc dcd1 si @DMBH, #0xdcd1 05fa 16fd 0002 si @DMBL, #0x0002 05fc 16fb 0001 si @DIRQ, #0x0001 05fe 0021 halt } // Sync Table 05ff 0617 cmpis $ACC0, #0x17 0600 0618 cmpis $ACC0, #0x18 0601 0658 cmpis $ACC0, #0x58 0602 065b cmpis $ACC0, #0x5b void 0603_Unk(_returnAddr($AR0)) { // 0603 00e0 03f9 sr @0x03f9, $AR0 0x03f9 = _returnAddr // 0605 009e 0005 lri $AC0.M, #0x0005 // 0607 02bf 066a call 0x066a SendMB_DCD1(0x0005) # 0609 8e00 set16 // 060a 8100 clr $ACC0 // 060b 8900 clr $ACC1 ACC0 = 0 ACC1 = 0 // 060c 02bf 065e call 0x065e 065e_WaitForCPUMailBox_AC0() // 060e 27ff lrs $AC1.M, @CMBL // 060f 009e 05ff lri $AC0.M, #0x05ff // 0611 4c00 add $ACC0, $AC1.L AC0.M = 0x05ff + *CMBL // 0612 1c7e mrr $AR3, $AC0.M // 0613 0313 ilrr $AC1.M, @$AR3 // 0614 1c7f mrr $AR3, $AC1.M AR3 = *AC0.M <- "BUT FROM Instrcution Memory (look at sync table about)" // 0615 176f jmpr $AR3 switch(AR3 - 0x05FF) { case 0x00: HALT(); break; case 0x00: HALT(); break; case 0x01: 0658_SoftReset(); break; case 0x02: 065b_ContinueWithUCode(); break; } } 0616 0021 halt 0617 0021 halt 0618 009a 0002 lri $AX0.H, #0x0002 061a 00fa 03a3 sr @0x03a3, $AX0.H 061c 8100 clr $ACC0 061d 8900 clr $ACC1 061e 02bf 065e call 0x065e 0620 24ff lrs $AC0.L, @CMBL 0621 02bf 0664 call 0x0664 0623 25ff lrs $AC1.L, @CMBL 0624 02bf 0664 call 0x0664 0626 27ff lrs $AC1.M, @CMBL 0627 2ece srs @DSMAH, $AC0.M 0628 2ccf srs @DSMAL, $AC0.L 0629 16c9 0001 si @DSCR, #0x0001 062b 2fcd srs @DSPA, $AC1.M 062c 2dcb srs @DSBL, $AC1.L 062d 8100 clr $ACC0 062e 8900 clr $ACC1 062f 02bf 065e call 0x065e 0631 24ff lrs $AC0.L, @CMBL 0632 1c9e mrr $IX0, $AC0.M 0633 1cbc mrr $IX1, $AC0.L 0634 02bf 0664 call 0x0664 0636 25ff lrs $AC1.L, @CMBL 0637 02bf 0664 call 0x0664 0639 27ff lrs $AC1.M, @CMBL 063a 1cdf mrr $IX2, $AC1.M 063b 1cfd mrr $IX3, $AC1.L 063c 8100 clr $ACC0 063d 02bf 065e call 0x065e 063f 26ff lrs $AC0.M, @CMBL 0640 1c1e mrr $AR0, $AC0.M 0641 8900 clr $ACC1 0642 02bf 0664 call 0x0664 0644 20ff lrs $AX0.L, @CMBL 0645 1f5f mrr $AX0.H, $AC1.M 0646 02bf 065e call 0x065e 0648 21ff lrs $AX1.L, @CMBL 0649 02bf 065e call 0x065e 064b 23ff lrs $AX1.H, @CMBL 064c 26c9 lrs $AC0.M, @DSCR 064d 02a0 0004 andf $AC0.M, #0x0004 064f 029c 064c jlnz 0x064c 0651 1206 sbclr #0x06 0652 1203 sbclr #0x03 0653 1204 sbclr #0x04 0654 1205 sbclr #0x05 0655 029f 80b5 jmp 0x80b5 0657 0021 halt void 0658_SoftReset() { 0658 029f 8000 jmp 0x8000 065a 0021 halt } void 065b_ContinueWithUCode() { GOTO *0x03f9; } void 065e_WaitForCPUMailBox_AC0() { 065e 26fe lrs $AC0.M, @CMBH 065f 02c0 8000 andcf $AC0.M, #0x8000 0661 029c 065e jlnz 0x065e 0663 02df ret } 0664 27fe lrs $AC1.M, @CMBH 0665 03c0 8000 andcf $AC1.M, #0x8000 0667 029c 0664 jlnz 0x0664 0669 02df ret void SendMB_DCD1(_low) { // 066a 02bf 0682 call 0x0682 WaitForEmptyDSPMailBox_ovAC1(); // 066c 16fc dcd1 si @DMBH, #0xdcd1 // 066e 2efd srs @DMBL, $AC0.M // 066f 16fb 0001 si @DIRQ, #0x0001 *DMBH = 0xDCD1 *DMBL = _low *DIRQ = 0x0001 // 0671 02bf 0682 call 0x0682 WaitForEmptyDSPMailBox_ovAC1() // 0673 02df ret } void SendMB_F355(_low) { // 0674 02bf 0682 call 0x0682 WaitForEmptyDSPMailBox_ovAC1(); // 0676 16fc f355 si @DMBH, #0xf355 // 0678 2efd srs @DMBL, $AC0.M *DMBH = 0xf355 *DMBL = _low // 0679 02bf 0682 call 0x0682 WaitForEmptyDSPMailBox_ovAC1(); // 067b 02df ret } 067c 26fc lrs $AC0.M, @DMBH 067d 02c0 8000 andcf $AC0.M, #0x8000 067f 029d 067c jlz 0x067c 0681 02df ret void WaitForEmptyDSPMailBox_ovAC1.M() { // 0682 27fc lrs $AC1.M, @DMBH // 0683 03c0 8000 andcf $AC1.M, #0x8000 // 0685 029d 0682 jlz 0x0682 while (*DMBH & 0x8000); // 0687 02df ret } void 0688_InitCommandBlock() { // 0688 009a 0280 lri $AX0.H, #0x0280 // 068a 00fa 0350 sr @0x0350, $AX0.H // 068c 00fa 0351 sr @0x0351, $AX0.H *0x0350 = 0x0280 *0x0351 = 0x0280 // 068e 0a00 lris $AX0.H, #0x00 // 068f 00fa 0352 sr @0x0352, $AX0.H *0x0352 = 0x00 // 0691 02df ret } // // this block is called by the new mail exception // it seems to copy a new command to the address @0x0350 and increase the // number of commands at 0x0352 // { 0692 00e0 03fb sr @0x03fb, $AR0 0694 00e8 03fc sr @0x03fc, $WR0 0696 00c0 0350 lr $AR0, @0x0350 0698 0088 002f lri $WR0, #0x002f 069a 1b1a srri @$AR0, $AX0.H 069b 00de fffe lr $AC0.M, @CMBH 069d 02c0 8000 andcf $AC0.M, #0x8000 069f 029c 069b jlnz 0x069b 06a1 00dc ffff lr $AC0.L, @CMBL 06a3 1b1e srri @$AR0, $AC0.M 06a4 1b1c srri @$AR0, $AC0.L 06a5 1fda mrr $AC0.M, $AX0.H 06a6 7800 decm $AC0.M 06a7 1f5e mrr $AX0.H, $AC0.M 06a8 8600 tstaxh $AX0.H 06a9 0294 069b jnz 0x069b /* 06ab 8100 clr $ACC0 06ac 00de 0352 lr $AC0.M, @0x0352 06ae 7400 incm $AC0.M 06af 00fe 0352 sr @0x0352, $AC0.M increase number of commands */ *0x0352 = *0x0352++ 06b1 00e0 0350 sr @0x0350, $AR0 06b3 00c0 03fb lr $AR0, @0x03fb 06b5 00c8 03fc lr $WR0, @0x03fc // 06b7 029f 05e6 jmp 0x05e6 GOTO EndOfMailException // return values and leave exception 06b9 00e0 03fb sr @0x03fb, $AR0 06bb 00e8 03fc sr @0x03fc, $WR0 06bd 00c0 0350 lr $AR0, @0x0350 06bf 0088 002f lri $WR0, #0x002f 06c1 0a00 lris $AX0.H, #0x00 06c2 1b1a srri @$AR0, $AX0.H 06c3 029f 06ab jmp 0x06ab } void 06c5_CopyCommandBlock() { // 06c5 00c0 0351 lr $AR0, @0x0351 short srcCommandQueueAddr = *0x0351 // 06c7 0088 002f lri $WR0, #0x002f $WR0 = #0x002f :start /* 06c9 00da 0352 lr $AX0.H, @0x0352 06cb 8600 tstaxh $AX0.H 06cc 0295 06ed jz 0x06ed check how much commands are inside the "queue" */ if (*0x352 == 0) { $WR0 = #0xffff return 0x2d; } /* 06ce 1205 sbclr #0x05 06cf 00da 0352 lr $AX0.H, @0x0352 06d1 1fda mrr $AC0.M, $AX0.H 06d2 7800 decm $AC0.M 06d3 00fe 0352 sr @0x0352, $AC0.M 06d5 1305 sbset #0x05 decrement number of commands in queue */ *0x352--; // 06d6 0081 0356 lri $AR1, #0x0356 short destCommandQueueAddr = 0x0356 /* 06d8 191e lrri $AC0.M, @$AR0 06d9 02c0 8000 andcf $AC0.M, #0x8000 06db 029d 06f1 jlz 0x06f1 06dd 1f5e mrr $AX0.H, $AC0.M 06de 8600 tstaxh $AX0.H 06df 0295 06f5 jz 0x06f5 // check if command is valid */ short numCommands = *srcCommandQueueAddr++ numCommands &= 0x8000 if (numCommands < 0) { *0x0351 = srcCommandQueueAddr GOTO :start } if (numCommands == 0) { 05f0_HaltUCode() } /* 06e1 007a 06e6 bloop $AX0.H, 0x06e6 06e3 191e lrri $AC0.M, @$AR0 06e4 1b3e srri @$AR1, $AC0.M 06e5 191e lrri $AC0.M, @$AR0 06e6 1b3e srri @$AR1, $AC0.M copy command queue */ for (int i=0; i