📄 midiplay.lst
字号:
00008EC3 C3 92 < r1 = [r3] //get key_code
<
00008EC4 12 95 C8 00 < r2 = [KeyQueueBufPtr]
00008EC6 0A C5 00 08 < test r2,0x0800
00008EC8 19 4E < jnz ?L_ReStartScanKey //KeyQueueBuf is full
< ?L_KeyBufNotFull:
00008EC9 7A 95 < r2 = r2 lsr 4
00008ECA 47 B4 < r2&= 0x0007 //write pointer
00008ECB 62 97 < r3 = r2 lsr 1
00008ECC 0B 07 C9 00 < r3+= KeyQueueBuf
00008ECE C3 98 < r4 = [r3]
00008ECF 41 C4 < test r2,0x0001
00008ED0 05 5E < jz ?L_SaveKeyLowByte
00008ED1 0C B9 FF 00 < r4&= 0x00FF
00008ED3 59 93 < r1 = r1 LSL 4
00008ED4 59 93 < r1 = r1 LSL 4
00008ED5 02 EE < jmp ?L_KeyValueIsOk
< ?L_SaveKeyLowByte:
00008ED6 0C B9 00 FF < r4&= 0xFF00
< ?L_KeyValueIsOk:
00008ED8 04 A3 < r1|= r4
00008ED9 C3 D2 < [r3] = r1 //store key
00008EDA 11 93 C8 00 < r1 = [KeyQueueBufPtr]
00008EDC 09 03 10 01 < r1+= 0x0110 //increase writer pointer & size
00008EDE 09 B3 7F FF < r1&= 0xFF7F
00008EE0 19 D3 C8 00 < [KeyQueueBufPtr] = r1
< ?L_ReStartScanKey:
00008EE2 40 F0 25 8F < call F_ClrKeyStatusBuf
00008EE4 40 92 < r1 = S_ReadKeyBeforeBounce //initialize KeyScanFlag
00008EE5 19 D3 C2 00 < [KeyScanFlag] = r1 //scan from R-option line
00008EE7 09 93 8C 8E < r1 = TW_ScanLine
00008EE9 C1 92 < r1 = [r1]
00008EEA 40 F1 < int off
00008EEB 12 95 06 70 < r2 = [P_IOB_Buf]
00008EED 0A B5 E0 00 < r2&= 0x00E0
00008EEF 01 A5 < r2|= r1
00008EF0 1A D5 05 70 < [P_IOB_Data] = r2 //Set scan line
00008EF2 43 F1 < int fiq,irq
00008EF3 90 9A < retf
< //-------------------------------------------------------------------------------
< TB_KeyNumber:
00008EF4 05 00 < .DW 5
00008EF5 0A 00 < .DW 10
00008EF6 0F 00 < .DW 15
00008EF7 14 00 < .DW 20
00008EF8 19 00 < .DW 25
< //-------------------------------------------------------------------------------
< TB_KeyCode:
00008EF9 01 00 02 00 < .DW C_One, C_Two, C_Three, C_Redial, C_Check;
03 00 20 00
32 00
00008EFE 04 00 05 00 < .DW C_Four, C_Five, C_Six, C_Pause, C_Vip;
06 00 0D 00
2C 00
00008F03 07 00 08 00 < .DW C_Seven, C_Eight, C_Nine, C_Store, C_Hold;
09 00 21 00
28 00
00008F08 0B 00 0A 00 < .DW C_Star, C_Zero, C_Pound, C_Flash, C_Review;
0C 00 1F 00
27 00
00008F0D 29 00 23 00 < .DW C_HandFree, C_Up, C_Down, C_Delete, C_Dummy;
24 00 2A 00
00 00
< //-------------------------------------------------------------------------------
< // IOB0 IOB1 IOB2 IOB3 IOB4
< // +----------+--------+--------+-----------+-----------+
< // IOA0 | 1 | 2 | 3 |Redial/Auto| Check |
< // +----------+--------+--------+-----------+-----------+
< // IOA1 | 4 | 5 | 6 |Pause/Inhib| VIP |
< // +----------+--------+--------+-----------+-----------+
< // IOA2 | 7 | 8 | 9 | Store |Hold |
< // +----------+--------+--------+-----------+-----------+
< // IOA3 | * / P->T | 0 | # |Flash/Clear|Review/Next|
< // +----------+--------+--------+-----------+-----------+
< // IOA4 | HandFree | Up | Down | Delete | Dummy |
< // +----------+--------+--------+-----------+-----------+
< //
< //-------------------------------------------------------------------------------
< F_StartKeyScan: //initialize key scan
00008F12 40 92 < r1 = 0 //clear KeyStatusBuf
00008F13 19 D3 C8 00 < [KeyQueueBufPtr] = r1 //clear KeyQueueBufPtr
00008F15 40 F0 25 8F < call F_ClrKeyStatusBuf
00008F17 40 92 < r1 = S_ReadKeyBeforeBounce //initialize KeyScanFlag
00008F18 19 D3 C2 00 < [KeyScanFlag] = r1 //scan from R-option line
00008F1A 09 93 8C 8E < r1 = TW_ScanLine
00008F1C C1 92 < r1 = [r1]
00008F1D 12 95 06 70 < r2 = [P_IOB_Buf]
00008F1F 0A B5 E0 00 < r2&= 0x00E0
00008F21 01 A5 < r2|= r1
00008F22 1A D5 05 70 < [P_IOB_Data] = r2 //Set scan line
00008F24 90 9A < retf
< //-------------------------------------------------------------------------------
< F_ClrKeyStatusBuf:
00008F25 0D 9B C3 00 < bp = KeyStatusBuf
00008F27 09 93 FF 00 < r1 = 0x00FF
< ?L_ClrBufLoop:
00008F29 C5 94 < r2 = [bp]
00008F2A 01 B5 < r2&= r1
00008F2B D5 D4 < [bp++] = r2
00008F2C 0D 4B C8 00 < cmp bp,KeyStatusBuf+5
00008F2E 46 0E < jb ?L_ClrBufLoop
00008F2F 90 9A < retf
< //-----------------------------------------------------------------------
< //Key code constants
< .const C_Dummy =0x0000;
< .const C_One =0x0001;
< .const C_Two =0x0002;
< .const C_Three =0x0003;
< .const C_Four =0x0004;
< .const C_Five =0x0005;
< .const C_Six =0x0006;
< .const C_Seven =0x0007;
< .const C_Eight =0x0008;
< .const C_Nine =0x0009;
< .const C_Zero =0x000A;
< .const C_Star =0x000B;
< .const C_Pound =0x000C;
<
< .const C_Pause =0x000D;
< .const C_Flash =0x001F;
<
< .const C_Redial =0x0020;
< .const C_Store =0x0021;
< .const C_Up =0x0023;
< .const C_Down =0x0024;
< .const C_Recall =0x0026;
< .const C_Review =0x0027;
< .const C_Hold =0x0028;
< .const C_HandFree =0x0029;
< .const C_Delete =0x002A;
< .const C_Vip =0x002C;
< .const C_Check =0x0032;
< //-----------------------------------------------------------------------
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
.const C_SongTotal = 8
.const C_TopVolume = 0x0003
.const C_KeyVolumeUp = C_Delete
.const C_KeyVolumeDown = C_Dummy
//----------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------
00008F30 .Code
//----------------------------------------------------------------------------------------
.public _main;
.public _FIQ;
.public _IRQ0;
.public _IRQ1;
.public _IRQ2;
.public _IRQ3;
.public _IRQ4;
.public _IRQ5;
.public _IRQ6;
.public _IRQ7;
.public _BREAK;
_main:
00008F30 40 F1 int off
00008F31 09 93 AA 55 r1 = 0x55aa
00008F33 19 D3 16 70 [P_Watchdog_Clr] = r1 //Reset watchdog
00008F35 08 91 FF 05 sp = StackBottom //Initialize stack
00008F37 09 93 1C 80 r1 = B_128Hz+B_512Hz+B_Enable32768
00008F39 19 D3 18 70 [P_TimeBaseSet] = r1 //Initialize timebase for key scan
00008F3B 40 92 r1 = 0x0000
00008F3C 19 D3 02 70 [P_IOA_Dir] = r1 //Set IOA as input port
00008F3E 5F 92 r1 = 0x001f
00008F3F 19 D3 07 70 [P_IOB_Dir] = r1 //Set IOB0~IOB4 as output ports
// IOB5~IOB7 as input ports
00008F41 09 93 00 1F r1 = 0x1f00
00008F43 19 D3 03 70 [P_IOA_PullR] = r1 //Enable the pull-up resistor for IOA0~IOA4
00008F45 60 92 r1 = B_512HzInt
00008F46 19 D3 10 70 [P_Int] = r1
00008F48 43 F1 int fiq,irq
00008F49 40 F0 12 8F call F_StartKeyScan //Start key scan
00008F4B 42 92 r1 = 0x0002
00008F4C 19 D3 C1 00 [Volume] = r1
00008F4E 41 92 r1 = 0x0001
00008F4F 19 D3 C0 00 [SongIndex] = r1
00008F51 19 D3 BF 00 [PhoneMode] = r1
00008F53 69 92 R1 = C_HandFree; // Play the first song after CPU Power-on
00008F54 40 F0 9F 8F CALL F_ModeSelectKeyDeal;
//----------------------------------------------------------------------------------------
?L_MainLoop:
00008F56 09 93 AA 55 r1 = 0x55aa
00008F58 19 D3 16 70 [P_Watchdog_Clr] = r1
00008F5A 40 F0 32 8E call F_KeyScan
00008F5C 40 F0 7A 8F call F_KeyDeal
00008F5E 40 F0 61 8F call F_PlayMidi
00008F60 4B EE jmp ?L_MainLoop
//----------------------------------------------------------------------------------------
F_PlayMidi:
00008F61 11 93 BF 00 r1 = [PhoneMode]
00008F63 09 C3 00 80 test r1,Flag_PlayMidi
00008F65 13 5E jz ?L_PlayMidiOver
00008F66 40 F0 F2 8C call F_SACM_MS02_ServiceLoop
00008F68 40 F0 F0 8C call F_SACM_MS02_Status
00008F6A 41 C2 test r1, 0x0001 //Is song over?
00008F6B 0D 4E jnz ?L_PlayMidiOver //No, function return
00008F6C 40 F0 19 90 call F_StopPlay //Yes, stop play
00008F6E 09 93 00 00 r1 = C_ModeSelectMode //Set select mode for key deal
00008F70 09 B3 01 00 r1&= C_ModeRelatedBits
00008F72 12 95 BF 00 r2= [PhoneMode]
00008F74 0A B5 FE FF r2&= 0xffff-C_ModeRelatedBits
00008F76 01 A5 r2|= r1
00008F77 1A D5 BF 00 [PhoneMode] = r2
?L_PlayMidiOver:
00008F79 90 9A retf
//----------------------------------------------------------------------------------------
F_KeyDeal:
00008F7A 12 95 C8 00 R2 = [KeyQueueBufPtr]
00008F7C 0A C5 00 0F test r2,0x0f00 //Check if have key in key buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -