📄 mac_timer.lst
字号:
98 // BOOL
99 // TRUE: OK
100 // FALSE: Too many active callbacks (>MAC_CALLBACK_COUNT) or invalid timeout value
101 //-------------------------------------------------------------------------------------------------------
\ In segment NEAR_CODE, align 1, keep-with-next
102 ROOT BOOL mtimSetCallback(VFPTR pFunc, INT32 timeout) {
\ mtimSetCallback:
\ 000000 74F1 MOV A,#-0xf
\ 000002 12.... LCALL ?FUNC_ENTER_XDATA
\ 000005 ; Saved register size: 15
\ 000005 ; Auto size: 5
\ 000005 74FB MOV A,#-0x5
\ 000007 12.... LCALL ?ALLOC_XSTACK8
\ 00000A 7402 MOV A,#0x2
\ 00000C 12.... LCALL ?XSTACK_DISP0_8
\ 00000F E9 MOV A,R1
\ 000010 F0 MOVX @DPTR,A
\ 000011 A3 INC DPTR
\ 000012 EA MOV A,R2
\ 000013 F0 MOVX @DPTR,A
\ 000014 A3 INC DPTR
\ 000015 EB MOV A,R3
\ 000016 F0 MOVX @DPTR,A
\ 000017 7414 MOV A,#0x14
\ 000019 12.... LCALL ?XSTACK_DISP0_8
\ 00001C 78.. MOV R0,#?V0 + 4
\ 00001E 12.... LCALL ?L_MOV_X
103 UINT8 newCallback, prevCallback, n;
104 MAC_CALLBACK_INFO __xdata *pNewCallback;
105
106 // Special timeout values
107 if (timeout < 0) {
\ 000021 90.... MOV DPTR,#__Constant_0
\ 000024 78.. MOV R0,#?V0 + 0
\ 000026 12.... LCALL ?L_MOV_X
\ 000029 78.. MOV R0,#?V0 + 0
\ 00002B 79.. MOV R1,#?V0 + 4
\ 00002D 12.... LCALL ?SL_GT
\ 000030 5005 JNC ??mtimSetCallback_0
108 return FALSE;
\ ??mtimSetCallback_1:
\ 000032 7900 MOV R1,#0x0
\ 000034 02.... LJMP ??mtimSetCallback_2
109 } else if (timeout == 0) {
\ ??mtimSetCallback_0:
\ 000037 90.... MOV DPTR,#__Constant_0
\ 00003A 78.. MOV R0,#?V0 + 4
\ 00003C 12.... LCALL ?L_EQ_X
\ 00003F 7018 JNZ ??mtimSetCallback_3
110 pFunc();
\ 000041 ; Setup parameters for indirect call
\ 000041 7402 MOV A,#0x2
\ 000043 12.... LCALL ?XSTACK_DISP0_8
\ 000046 E0 MOVX A,@DPTR
\ 000047 F9 MOV R1,A
\ 000048 A3 INC DPTR
\ 000049 E0 MOVX A,@DPTR
\ 00004A FA MOV R2,A
\ 00004B A3 INC DPTR
\ 00004C E0 MOVX A,@DPTR
\ 00004D 8982 MOV DPL,R1
\ 00004F 8A83 MOV DPH,R2
\ 000051 12.... LCALL ?BCALL ; Banked call to: DPTR()
111 return TRUE;
\ 000054 7901 MOV R1,#0x1
\ 000056 02.... LJMP ??mtimSetCallback_2
112 }
113
114 DISABLE_GLOBAL_INT();
\ ??mtimSetCallback_3:
\ 000059 C2AF CLR 0xa8.7
115
116 // Locate an available entry in the callback table
117 for (newCallback = 0; newCallback < MAC_CALLBACK_COUNT; newCallback++) {
\ 00005B 7B00 MOV R3,#0x0
118 if (!pMtimCallbacks[newCallback].occupied) goto foundIndex;
\ ??mtimSetCallback_4:
\ 00005D EB MOV A,R3
\ 00005E 75F009 MOV B,#0x9
\ 000061 A4 MUL AB
\ 000062 2400 ADD A,#0x0
\ 000064 FE MOV R6,A
\ 000065 E5F0 MOV A,B
\ 000067 34E0 ADDC A,#-0x20
\ 000069 FF MOV R7,A
\ 00006A 8E82 MOV DPL,R6
\ 00006C 8F83 MOV DPH,R7
\ 00006E A3 INC DPTR
\ 00006F A3 INC DPTR
\ 000070 A3 INC DPTR
\ 000071 A3 INC DPTR
\ 000072 A3 INC DPTR
\ 000073 E0 MOVX A,@DPTR
\ 000074 7015 JNZ ??mtimSetCallback_5
119 }
120
121 // None available :(
122 ENABLE_GLOBAL_INT();
123 return FALSE;
124
125 foundIndex:
126 pNewCallback = &pMtimCallbacks[newCallback];
127
128 // No other active callbacks...
129 if (firstCallback == NO_CALLBACK) {
\ 000076 74FF MOV A,#-0x1
\ 000078 65.. XRL A,firstCallback
\ 00007A 701A JNZ ??mtimSetCallback_6
130 firstCallback = newCallback;
\ 00007C 8B.. MOV firstCallback,R3
131 pNewCallback->nextCallback = NO_CALLBACK;
\ 00007E 74FF MOV A,#-0x1
\ 000080 8E82 MOV DPL,R6
\ 000082 8F83 MOV DPH,R7
\ 000084 A3 INC DPTR
\ 000085 A3 INC DPTR
\ 000086 A3 INC DPTR
\ 000087 A3 INC DPTR
\ 000088 02.... LJMP ??mtimSetCallback_7
132
133 // Locate insertion point...
134 } else {
\ ??mtimSetCallback_5:
\ 00008B 0B INC R3
\ 00008C EB MOV A,R3
\ 00008D C3 CLR C
\ 00008E 940C SUBB A,#0xc
\ 000090 40CB JC ??mtimSetCallback_4
\ 000092 D2AF SETB 0xa8.7
\ 000094 809C SJMP ??mtimSetCallback_1
\ ??mtimSetCallback_6:
\ 000096 E5.. MOV A,firstCallback
\ 000098 75F009 MOV B,#0x9
\ 00009B A4 MUL AB
\ 00009C F8 MOV R0,A
\ 00009D AAF0 MOV R2,B
\ 00009F EA MOV A,R2
\ 0000A0 F9 MOV R1,A
\ 0000A1 E8 MOV A,R0
\ 0000A2 2400 ADD A,#0x0
\ 0000A4 E9 MOV A,R1
\ 0000A5 34E0 ADDC A,#-0x20
\ 0000A7 F9 MOV R1,A
\ 0000A8 88.. MOV ?V0 + 0,R0
\ 0000AA 8882 MOV DPL,R0
\ 0000AC F583 MOV DPH,A
\ 0000AE 78.. MOV R0,#?V0 + 4
\ 0000B0 12.... LCALL ?UL_GT_X
\ 0000B3 E5.. MOV A,firstCallback
\ 0000B5 4024 JC ??mtimSetCallback_8
135
136 // First timeout?
137 if (timeout <= pMtimCallbacks[firstCallback].timeout) {
138
139 // Insert before!
140 pNewCallback->nextCallback = firstCallback;
\ 0000B7 8E82 MOV DPL,R6
\ 0000B9 8F83 MOV DPH,R7
\ 0000BB A3 INC DPTR
\ 0000BC A3 INC DPTR
\ 0000BD A3 INC DPTR
\ 0000BE A3 INC DPTR
\ 0000BF F0 MOVX @DPTR,A
141 pMtimCallbacks[firstCallback].timeout -= timeout;
\ 0000C0 75F009 MOV B,#0x9
\ 0000C3 A4 MUL AB
\ 0000C4 F8 MOV R0,A
\ 0000C5 EA MOV A,R2
\ 0000C6 F9 MOV R1,A
\ 0000C7 E8 MOV A,R0
\ 0000C8 2400 ADD A,#0x0
\ 0000CA F582 MOV DPL,A
\ 0000CC E9 MOV A,R1
\ 0000CD 34E0 ADDC A,#-0x20
\ 0000CF F583 MOV DPH,A
\ 0000D1 78.. MOV R0,#?V0 + 4
\ 0000D3 12.... LCALL ?L_SUB_FROM_X
142 firstCallback = newCallback;
\ 0000D6 8B.. MOV firstCallback,R3
\ 0000D8 02.... LJMP ??mtimSetCallback_9
143
144 // Search through the linked list...
145 } else {
146 prevCallback = firstCallback;
\ ??mtimSetCallback_8:
\ 0000DB FC MOV R4,A
147 n = pMtimCallbacks[prevCallback].nextCallback;
\ 0000DC 85..82 MOV DPL,?V0 + 0
\ 0000DF 8983 MOV DPH,R1
\ 0000E1 A3 INC DPTR
\ 0000E2 A3 INC DPTR
\ 0000E3 A3 INC DPTR
\ 0000E4 A3 INC DPTR
\ 0000E5 E0 MOVX A,@DPTR
\ 0000E6 FA MOV R2,A
148 timeout -= pMtimCallbacks[prevCallback].timeout;
\ 0000E7 85..82 MOV DPL,?V0 + 0
\ 0000EA 8983 MOV DPH,R1
\ 0000EC 78.. MOV R0,#?V0 + 4
\ 0000EE 12.... LCALL ?L_SUB_X
\ 0000F1 801D SJMP ??mtimSetCallback_10
149
150 while ((timeout > pMtimCallbacks[n].timeout) && (n != NO_CALLBACK)) {
151 timeout -= pMtimCallbacks[n].timeout;
\ ??mtimSetCallback_11:
\ 0000F3 78.. MOV R0,#?V0 + 4
\ 0000F5 79.. MOV R1,#?V0 + 0
\ 0000F7 12.... LCALL ?L_SUB
152 prevCallback = n;
\ 0000FA EA MOV A,R2
\ 0000FB FC MOV R4,A
153 n = pMtimCallbacks[prevCallback].nextCallback;
\ 0000FC 85..82 MOV DPL,?XSP + 0
\ 0000FF 85..83 MOV DPH,?XSP + 1
\ 000102 E0 MOVX A,@DPTR
\ 000103 F8 MOV R0,A
\ 000104 A3 INC DPTR
\ 000105 E0 MOVX A,@DPTR
\ 000106 F583 MOV DPH,A
\ 000108 8882 MOV DPL,R0
\ 00010A A3 INC DPTR
\ 00010B A3 INC DPTR
\ 00010C A3 INC DPTR
\ 00010D A3 INC DPTR
\ 00010E E0 MOVX A,@DPTR
\ 00010F FA MOV R2,A
154 }
\ ??mtimSetCallback_10:
\ 000110 EA MOV A,R2
\ 000111 75F009 MOV B,#0x9
\ 000114 A4 MUL AB
\ 000115 F8 MOV R0,A
\ 000116 2400 ADD A,#0x0
\ 000118 E5F0 MOV A,B
\ 00011A 34E0 ADDC A,#-0x20
\ 00011C F9 MOV R1,A
\ 00011D 85..82 MOV DPL,?XSP + 0
\ 000120 85..83 MOV DPH,?XSP + 1
\ 000123 E8 MOV A,R0
\ 000124 F0 MOVX @DPTR,A
\ 000125 A3 INC DPTR
\ 000126 E9 MOV A,R1
\ 000127 F0 MOVX @DPTR,A
\ 000128 F583 MOV DPH,A
\ 00012A 8882 MOV DPL,R0
\ 00012C 78.. MOV R0,#?V0 + 0
\ 00012E 12.... LCALL ?L_MOV_X
\ 000131 78.. MOV R0,#?V0 + 4
\ 000133 79.. MOV R1,#?V0 + 0
\ 000135 12.... LCALL ?UL_GT
\ 000138 5005 JNC ??mtimSetCallback_12
\ 00013A 74FF MOV A,#-0x1
\ 00013C 6A XRL A,R2
\ 00013D 70B4 JNZ ??mtimSetCallback_11
155
156 if (n != NO_CALLBACK) {
\ ??mtimSetCallback_12:
\ 00013F 74FF MOV A,#-0x1
\ 000141 6A XRL A,R2
\ 000142 6013 JZ ??mtimSetCallback_13
157 pMtimCallbacks[n].timeout -= timeout;
\ 000144 85..82 MOV DPL,?XSP + 0
\ 000147 85..83 MOV DPH,?XSP + 1
\ 00014A E0 MOVX A,@DPTR
\ 00014B F8 MOV R0,A
\ 00014C A3 INC DPTR
\ 00014D E0 MOVX A,@DPTR
\ 00014E F583 MOV DPH,A
\ 000150 8882 MOV DPL,R0
\ 000152 78.. MOV R0,#?V0 + 4
\ 000154 12.... LCALL ?L_SUB_FROM_X
158 }
159 pNewCallback->nextCallback = n;
\ ??mtimSetCallback_13:
\ 000157 EA MOV A,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -