📄 mac_timer.s51
字号:
// 86 // DESCRIPTION:
// 87 // Activates a timed callback. The callback will happen at [timeout] backoff slots from now.
// 88 // Note: There can only be MAC_CALLBACK_COUNT active callbacks.
// 89 //
// 90 // PARAMETERS:
// 91 // VFPTR pFunc
// 92 // A pointer to the callback function
// 93 // INT32 timeout
// 94 // The number of backoff slots to count before calling pFunc(). If this value is negative, the
// 95 // function will not be executed.
// 96 //
// 97 // RETURN VALUE:
// 98 // BOOL
// 99 // TRUE: OK
// 100 // FALSE: Too many active callbacks (>MAC_CALLBACK_COUNT) or invalid timeout value
// 101 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 102 ROOT BOOL mtimSetCallback(VFPTR pFunc, INT32 timeout) {
mtimSetCallback:
CFI Block cfiBlock1 Using cfiCommon0
CFI Function mtimSetCallback
MOV A,#-0xf
LCALL ?FUNC_ENTER_XDATA
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI V7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V6 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V5 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-12)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-13)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-14)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-15)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 15)
; Saved register size: 15
; Auto size: 5
MOV A,#-0x5
LCALL ?ALLOC_XSTACK8
CFI CFA_XSP16 add(XSP16, 20)
MOV A,#0x2
LCALL ?XSTACK_DISP0_8
MOV A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
MOV A,#0x14
LCALL ?XSTACK_DISP0_8
MOV R0,#?V0 + 4
LCALL ?L_MOV_X
// 103 UINT8 newCallback, prevCallback, n;
// 104 MAC_CALLBACK_INFO __xdata *pNewCallback;
// 105
// 106 // Special timeout values
// 107 if (timeout < 0) {
MOV DPTR,#__Constant_0
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
MOV R0,#?V0 + 0
MOV R1,#?V0 + 4
LCALL ?SL_GT
JNC ??mtimSetCallback_0
// 108 return FALSE;
??mtimSetCallback_1:
MOV R1,#0x0
LJMP ??mtimSetCallback_2
// 109 } else if (timeout == 0) {
??mtimSetCallback_0:
MOV DPTR,#__Constant_0
MOV R0,#?V0 + 4
LCALL ?L_EQ_X
JNZ ??mtimSetCallback_3
// 110 pFunc();
; Setup parameters for indirect call
MOV A,#0x2
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV DPL,R1
MOV DPH,R2
LCALL ?BCALL ; Banked call to: DPTR()
// 111 return TRUE;
MOV R1,#0x1
LJMP ??mtimSetCallback_2
// 112 }
// 113
// 114 DISABLE_GLOBAL_INT();
??mtimSetCallback_3:
CLR 0xa8.7
// 115
// 116 // Locate an available entry in the callback table
// 117 for (newCallback = 0; newCallback < MAC_CALLBACK_COUNT; newCallback++) {
MOV R3,#0x0
// 118 if (!pMtimCallbacks[newCallback].occupied) goto foundIndex;
??mtimSetCallback_4:
MOV A,R3
MOV B,#0x9
MUL AB
ADD A,#0x0
MOV R6,A
MOV A,B
ADDC A,#-0x20
MOV R7,A
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX A,@DPTR
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) {
MOV A,#-0x1
XRL A,firstCallback
JNZ ??mtimSetCallback_6
// 130 firstCallback = newCallback;
MOV firstCallback,R3
// 131 pNewCallback->nextCallback = NO_CALLBACK;
MOV A,#-0x1
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
LJMP ??mtimSetCallback_7
// 132
// 133 // Locate insertion point...
// 134 } else {
??mtimSetCallback_5:
INC R3
MOV A,R3
CLR C
SUBB A,#0xc
JC ??mtimSetCallback_4
SETB 0xa8.7
SJMP ??mtimSetCallback_1
??mtimSetCallback_6:
MOV A,firstCallback
MOV B,#0x9
MUL AB
MOV R0,A
MOV R2,B
MOV A,R2
MOV R1,A
MOV A,R0
ADD A,#0x0
MOV A,R1
ADDC A,#-0x20
MOV R1,A
MOV ?V0 + 0,R0
MOV DPL,R0
MOV DPH,A
MOV R0,#?V0 + 4
LCALL ?UL_GT_X
MOV A,firstCallback
JC ??mtimSetCallback_8
// 135
// 136 // First timeout?
// 137 if (timeout <= pMtimCallbacks[firstCallback].timeout) {
// 138
// 139 // Insert before!
// 140 pNewCallback->nextCallback = firstCallback;
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
// 141 pMtimCallbacks[firstCallback].timeout -= timeout;
MOV B,#0x9
MUL AB
MOV R0,A
MOV A,R2
MOV R1,A
MOV A,R0
ADD A,#0x0
MOV DPL,A
MOV A,R1
ADDC A,#-0x20
MOV DPH,A
MOV R0,#?V0 + 4
LCALL ?L_SUB_FROM_X
// 142 firstCallback = newCallback;
MOV firstCallback,R3
LJMP ??mtimSetCallback_9
// 143
// 144 // Search through the linked list...
// 145 } else {
// 146 prevCallback = firstCallback;
??mtimSetCallback_8:
MOV R4,A
// 147 n = pMtimCallbacks[prevCallback].nextCallback;
MOV DPL,?V0 + 0
MOV DPH,R1
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R2,A
// 148 timeout -= pMtimCallbacks[prevCallback].timeout;
MOV DPL,?V0 + 0
MOV DPH,R1
MOV R0,#?V0 + 4
LCALL ?L_SUB_X
SJMP ??mtimSetCallback_10
// 149
// 150 while ((timeout > pMtimCallbacks[n].timeout) && (n != NO_CALLBACK)) {
// 151 timeout -= pMtimCallbacks[n].timeout;
??mtimSetCallback_11:
MOV R0,#?V0 + 4
MOV R1,#?V0 + 0
LCALL ?L_SUB
// 152 prevCallback = n;
MOV A,R2
MOV R4,A
// 153 n = pMtimCallbacks[prevCallback].nextCallback;
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV DPH,A
MOV DPL,R0
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX A,@DPTR
MOV R2,A
// 154 }
??mtimSetCallback_10:
MOV A,R2
MOV B,#0x9
MUL AB
MOV R0,A
ADD A,#0x0
MOV A,B
ADDC A,#-0x20
MOV R1,A
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
MOV A,R0
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
MOV DPH,A
MOV DPL,R0
MOV R0,#?V0 + 0
LCALL ?L_MOV_X
MOV R0,#?V0 + 4
MOV R1,#?V0 + 0
LCALL ?UL_GT
JNC ??mtimSetCallback_12
MOV A,#-0x1
XRL A,R2
JNZ ??mtimSetCallback_11
// 155
// 156 if (n != NO_CALLBACK) {
??mtimSetCallback_12:
MOV A,#-0x1
XRL A,R2
JZ ??mtimSetCallback_13
// 157 pMtimCallbacks[n].timeout -= timeout;
MOV DPL,?XSP + 0
MOV DPH,?XSP + 1
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV DPH,A
MOV DPL,R0
MOV R0,#?V0 + 4
LCALL ?L_SUB_FROM_X
// 158 }
// 159 pNewCallback->nextCallback = n;
??mtimSetCallback_13:
MOV A,R2
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
// 160 pMtimCallbacks[prevCallback].nextCallback = newCallback;
MOV A,R4
MOV B,#0x9
MUL AB
ADD A,#0x4
MOV DPL,A
MOV A,B
ADDC A,#-0x20
MOV DPH,A
MOV A,R3
??mtimSetCallback_7:
MOVX @DPTR,A
// 161 }
// 162 }
// 163
// 164 // Always set...
// 165 pNewCallback->pFunc = pFunc;
??mtimSetCallback_9:
MOV A,#0x2
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R1,A
INC DPTR
MOVX A,@DPTR
MOV R2,A
INC DPTR
MOVX A,@DPTR
MOV R3,A
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOV A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R2
MOVX @DPTR,A
INC DPTR
MOV A,R3
MOVX @DPTR,A
// 166 pNewCallback->timeout = timeout;
MOV DPL,R6
MOV DPH,R7
MOV R0,#?V0 + 4
LCALL ?L_MOV_TO_X
// 167 pNewCallback->occupied = TRUE;
MOV A,#0x1
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
// 168
// 169 ENABLE_GLOBAL_INT();
SETB 0xa8.7
// 170 return TRUE;
MOV R1,A
??mtimSetCallback_2:
MOV A,#0x5
LCALL ?DEALLOC_XSTACK8
CFI EndBlock cfiBlock1
REQUIRE ?Subroutine0
; // Fall through to label ?Subroutine0
// 171
// 172 } // mtimSetCallback
RSEG NEAR_CODE:CODE:NOROOT(0)
?Subroutine0:
CFI Block cfiBlock2 Using cfiCommon0
CFI NoFunction
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 15)
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-14)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-15)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-13)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-12)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V5 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V6 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V7 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-4)))
MOV R7,#0x8
LJMP ?FUNC_LEAVE_XDATA
CFI EndBlock cfiBlock2
// 173
// 174
// 175
// 176
// 177 //-------------------------------------------------------------------------------------------------------
// 178 // void mtimeCancelCallback(void *pFunc)
// 179 //
// 180 // DESCRIPTION:
// 181 // Cancels a callback. One entry of pFunc will be removed.
// 182 //
// 183 // PARAMETERS:
// 184 // void *pFunc
// 185 // A pointer to the callback function to be removed
// 186 //
// 187 // RETURN VALUE:
// 188 // BOOL
// 189 // A match was found and removed
// 190 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 191 ROOT BOOL mtimCancelCallback(void (*pFunc)()) {
mtimCancelCallback:
CFI Block cfiBlock3 Using cfiCommon0
CFI Function mtimCancelCallback
MOV A,#-0xc
LCALL ?FUNC_ENTER_XDATA
CFI DPH0 load(1, XDATA, add(CFA_XSP16, literal(-1)))
CFI DPL0 load(1, XDATA, add(CFA_XSP16, literal(-2)))
CFI ?RET_HIGH load(1, XDATA, add(CFA_XSP16, literal(-3)))
CFI ?RET_LOW load(1, XDATA, add(CFA_XSP16, literal(-4)))
CFI R7 load(1, XDATA, add(CFA_XSP16, literal(-5)))
CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-7)))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -