⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mac_timer.s51

📁 zigbee location examples
💻 S51
📖 第 1 页 / 共 3 页
字号:
//   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 + -