📄 mac_indirect_queue.s51
字号:
DS 3
// 31 //-------------------------------------------------------------------------------------------------------
// 32
// 33
// 34
// 35
// 36 /*******************************************************************************************************
// 37 *******************************************************************************************************
// 38 ************************** QUEUE MANAGEMENT **************************
// 39 *******************************************************************************************************
// 40 *******************************************************************************************************/
// 41
// 42
// 43
// 44
// 45 //-------------------------------------------------------------------------------------------------------
// 46 // void miqInit(void)
// 47 //
// 48 // DESCRIPTION:
// 49 // Initializes the indirect packet queue
// 50 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 51 ROOT void miqInit(void) {
miqInit:
CFI Block cfiBlock0 Using cfiCommon0
CFI Function miqInit
PUSH DPL
CFI DPL0 Frame(CFA_SP, 3)
CFI CFA_SP SP+-3
PUSH DPH
CFI DPH0 Frame(CFA_SP, 4)
CFI CFA_SP SP+-4
; Saved register size: 2
; Auto size: 0
// 52 miqInfo.firstIndirectPacket = NO_PACKET;
MOV A,#-0x1
MOV DPTR,#miqInfo
MOVX @DPTR,A
// 53 miqInfo.lastIndirectPacket = NO_PACKET;
MOV DPTR,#(miqInfo + 1)
MOVX @DPTR,A
// 54 miqInfo.requestedCounter = 0;
CLR A
MOV DPTR,#(miqInfo + 2)
MOVX @DPTR,A
CFI EndBlock cfiBlock0
// 55 } // miqInit
REQUIRE ?Subroutine0
; // Fall through to label ?Subroutine0
RSEG NEAR_CODE:CODE:NOROOT(0)
?Subroutine0:
CFI Block cfiBlock1 Using cfiCommon0
CFI NoFunction
CFI CFA_SP SP+-4
CFI DPL0 Frame(CFA_SP, 3)
CFI DPH0 Frame(CFA_SP, 4)
POP DPH
CFI CFA_SP SP+-3
CFI DPH0 SameValue
POP DPL
CFI CFA_SP SP+-2
CFI DPL0 SameValue
RET
CFI EndBlock cfiBlock1
// 56
// 57
// 58
// 59
// 60 //-------------------------------------------------------------------------------------------------------
// 61 // void miqAddIndirectPacket(MAC_TASK_INFO *pTask)
// 62 //
// 63 // DESCRIPTION:
// 64 // This task adds a packet to the indirect queue.
// 65 //
// 66 // TASK DATA:
// 67 // A pointer to the MAC_TX_PACKET to be added
// 68 //-------------------------------------------------------------------------------------------------------
// 69 void miqAddIndirectPacket(MAC_TASK_INFO *pTask) NEAR {
// 70 MAC_TX_PACKET *pPacket = (MAC_TX_PACKET *) pTask->taskData;
// 71 MAC_TX_PACKET *pIndirectPacket;
// 72 UINT8 temp;
// 73 BYTE destAddrMode;
// 74 ADDRESS *pDestAddr;
// 75
// 76 switch (pTask->state) {
// 77 case MIQ_STATE_FIND_FIRST_PACKET_FROM_NODE:
// 78 // Start by determining whether or not this is the first indirect packet to this node.
// 79 pPacket->isFirstPacket = TRUE;
// 80 destAddrMode = (BYTE)(pPacket->pHeader[1] & DEST_ADDR_BM);
// 81 pDestAddr = (ADDRESS*) (pPacket->pHeader + 5);
// 82
// 83 // Go through the whole packet queue, and clear the isFirstPacket flag if a match is found
// 84 temp = miqInfo.firstIndirectPacket;
// 85 while (temp != NO_PACKET) {
// 86 pIndirectPacket = &pMtxPacketPool[temp];
// 87 if (destAddrMode == (pIndirectPacket->pHeader[1] & DEST_ADDR_BM)) {
// 88 if (destAddrMode == DEST_ADDR_SHORT) {
// 89 if (pDestAddr->Short == *((WORD *) (pIndirectPacket->pHeader + 5))) {
// 90 pPacket->isFirstPacket = FALSE;
// 91 break;
// 92 }
// 93 } else {
// 94 if (msupCompareExtendedAddress((ADDRESS *) pDestAddr, (ADDRESS *) (pIndirectPacket->pHeader + 5))) {
// 95 pPacket->isFirstPacket = FALSE;
// 96 break;
// 97 }
// 98 }
// 99 }
// 100 temp = pIndirectPacket->nextPacket;
// 101 }
// 102 pTask->state = MIQ_STATE_INSERT_INTO_QUEUE;
// 103 break;
// 104
// 105 case MIQ_STATE_INSERT_INTO_QUEUE:
// 106
// 107 // Find the index of the new packet
// 108 temp = pPacket->poolIndex;
// 109
// 110 // Add the packet to the queue
// 111 if (miqInfo.lastIndirectPacket != NO_PACKET)
// 112 pMtxPacketPool[miqInfo.lastIndirectPacket].nextPacket = temp;
// 113
// 114 pPacket->prevPacket = miqInfo.lastIndirectPacket;
// 115 pPacket->nextPacket = NO_PACKET;
// 116 pPacket->timeToLive = mpib.macTransactionPersistenceTime;
// 117 pPacket->purgeRequest = FALSE;
// 118 pPacket->requested = FALSE;
// 119 pPacket->transmissionStarted = FALSE;
// 120
// 121 // Update the global indexes
// 122 miqInfo.lastIndirectPacket = temp;
// 123 if (miqInfo.firstIndirectPacket == NO_PACKET) miqInfo.firstIndirectPacket = temp;
// 124
// 125 // Remove the task
// 126 mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
// 127 break;
// 128 }
// 129
// 130 } // miqAddIndirectPacket
// 131
// 132
// 133
// 134
// 135 //-------------------------------------------------------------------------------------------------------
// 136 // void miqRemoveIndirectPacket(MAC_TASK_INFO *pTask)
// 137 //
// 138 // DESCRIPTION:
// 139 // This task removes a packet from the indirect queue. Note that the "requested flag" must have been
// 140 // cleared before this task is created. To make sure that the packet is not requested again before
// 141 // this task completes, the timeToLive counter should be set to < 1.
// 142 //
// 143 // TASK DATA:
// 144 // A pointer to the MAC_TX_PACKET to be removed.
// 145 //-------------------------------------------------------------------------------------------------------
// 146 void miqRemoveIndirectPacket(MAC_TASK_INFO *pTask) NEAR {
// 147 MAC_TX_PACKET *pPacket = (MAC_TX_PACKET *) pTask->taskData;
// 148 MAC_TX_PACKET *pIndirectPacket;
// 149 BYTE temp;
// 150 BYTE destAddrMode;
// 151 ADDRESS *pDestAddr;
// 152
// 153 switch (pTask->state) {
// 154 case MIQ_STATE_REMOVE_PACKET:
// 155
// 156 // Update the link on the previous packet
// 157 if (pPacket->prevPacket != NO_PACKET) {
// 158 pMtxPacketPool[pPacket->prevPacket].nextPacket = pPacket->nextPacket;
// 159 }
// 160
// 161 // Update the link on the next packet
// 162 if (pPacket->nextPacket != NO_PACKET) {
// 163 pMtxPacketPool[pPacket->nextPacket].prevPacket = pPacket->prevPacket;
// 164 }
// 165
// 166 // Update the "head" and "tail" indexes of the queue
// 167 temp = pPacket->poolIndex;
// 168 if (temp == miqInfo.firstIndirectPacket) miqInfo.firstIndirectPacket = pPacket->nextPacket;
// 169 if (temp == miqInfo.lastIndirectPacket) miqInfo.lastIndirectPacket = pPacket->prevPacket;
// 170
// 171 pTask->state = MIQ_STATE_MOVE_FIRST_PACKET_FLAG;
// 172 break;
// 173
// 174 case MIQ_STATE_MOVE_FIRST_PACKET_FLAG:
// 175
// 176 // If set here, then move the isFirstPacket flag to the next packet with same destination in the queue
// 177 if (pPacket->isFirstPacket) {
// 178 pPacket->isFirstPacket = FALSE;
// 179 temp = pPacket->nextPacket;
// 180 destAddrMode = (BYTE)(pPacket->pHeader[1] & DEST_ADDR_BM);
// 181 pDestAddr = (ADDRESS *) (pPacket->pHeader + 5);
// 182
// 183 // For each packet in the queue ...
// 184 while (temp != NO_PACKET) {
// 185 pIndirectPacket = &pMtxPacketPool[temp];
// 186 if (destAddrMode == (pIndirectPacket->pHeader[1] & DEST_ADDR_BM)) {
// 187 if (destAddrMode == DEST_ADDR_SHORT) {
// 188 if (pDestAddr->Short == *((WORD *) (pIndirectPacket->pHeader + 5))) {
// 189 pIndirectPacket->isFirstPacket = TRUE;
// 190 break;
// 191 }
// 192 } else {
// 193 if (msupCompareExtendedAddress((ADDRESS *) pDestAddr, (ADDRESS *) (pIndirectPacket->pHeader + 5))) {
// 194 pIndirectPacket->isFirstPacket = TRUE;
// 195 break;
// 196 }
// 197 }
// 198 }
// 199 temp = pIndirectPacket->nextPacket;
// 200 }
// 201 }
// 202
// 203 // Clean up
// 204 mschRemoveTask(pTask->priority, MSCH_KEEP_TASK_IN_PROGRESS_BM);
// 205 mtxpReleasePacket(pPacket);
// 206 break;
// 207 }
// 208 } // miqRemoveIndirectPacket
// 209
// 210 //-------------------------------------------------------------------------------------------------------
// 211 // BOOL miqFindIndirectPacket(ADDRESS *pDestAddr, BOOL isExtAddr)
// 212 //
// 213 // DESCRIPTION:
// 214 // Searches through the indirect packet queue for a match on the given address.
// 215 //
// 216 // ARGUMENTS:
// 217 // ADDRESS *pDestAddr
// 218 // A pointer to the address to search for
// 219 // BOOL isExtAddr
// 220 // TRUE if pDestAddr points to an extended address
// 221 //
// 222 // RETURN VALUE:
// 223 // MAC_TX_PACKET
// 224 // A packet was found a packet pointer is returned, if no packet is found NULL is returned
// 225 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 226 ROOT MAC_TX_PACKET *miqFindIndirectPacket(ADDRESS *pDestAddr, BOOL isExtAddr) {
miqFindIndirectPacket:
CFI Block cfiBlock2 Using cfiCommon0
CFI Function miqFindIndirectPacket
FUNCALL miqFindIndirectPacket, msupCompareExtendedAddress
LOCFRAME XSTACK, 10, STACK
ARGFRAME XSTACK, 10, STACK
MOV A,#-0xa
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 V2 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 10)
; Saved register size: 10
; Auto size: 0
MOV ?V0 + 0,R2
MOV ?V0 + 1,R3
// 227 UINT8 temp;
// 228 BYTE destAddrMode = isExtAddr ? DEST_ADDR_EXT : DEST_ADDR_SHORT;
MOV A,R1
JZ ??miqFindIndirectPacket_0
MOV ?V0 + 2,#0xc
SJMP ??miqFindIndirectPacket_1
??miqFindIndirectPacket_0:
MOV ?V0 + 2,#0x8
// 229 MAC_TX_PACKET *pIndirectPacket;
// 230
// 231 // For each packet in the queue ...
// 232 temp = miqInfo.firstIndirectPacket;
??miqFindIndirectPacket_1:
MOV DPTR,#miqInfo
SJMP ??miqFindIndirectPacket_2
// 233 while (temp != NO_PACKET) {
// 234 pIndirectPacket = &pMtxPacketPool[temp];
// 235
// 236 // ... return the packet index if there's a match on the address mode ...
// 237 if ((destAddrMode == (pIndirectPacket->pHeader[1] & DEST_ADDR_BM)) && (pIndirectPacket->transmissionStarted != TRUE)) {
// 238
// 239 // ... and the address itself
// 240 if (destAddrMode == DEST_ADDR_SHORT) {
// 241 if (pDestAddr->Short == *((WORD *) (pIndirectPacket->pHeader + 5))) {
// 242 return pIndirectPacket;
// 243 }
// 244 } else {
// 245 if (msupCompareExtendedAddress((ADDRESS *) pDestAddr, (ADDRESS *) (pIndirectPacket->pHeader + 5))) {
??miqFindIndirectPacket_3:
; Setup parameters for call to function msupCompareExtendedAddress
MOV R2,?V0 + 0
MOV R3,?V0 + 1
LCALL msupCompareExtendedAddress
MOV A,R1
JNZ ??miqFindIndirectPacket_4
// 246 return pIndirectPacket;
// 247 }
// 248 }
// 249 }
// 250
// 251
// 252 // Move to the next packet in the queue
// 253 temp = pIndirectPacket->nextPacket;
??miqFindIndirectPacket_5:
MOV A,R6
ADD A,#-0x73
MOV DPL,A
MOV A,R7
ADDC A,#0x0
MOV DPH,A
??miqFindIndirectPacket_2:
MOVX A,@DPTR
MOV R2,A
MOV A,#-0x1
XRL A,R2
JZ ??miqFindIndirectPacket_6
MOV A,R2
MOV B,#-0x6d
MUL AB
ADD A,#(pMtxPacketPool & 0xff)
MOV R6,A
MOV A,B
ADDC A,#((pMtxPacketPool >> 8) & 0xff)
MOV R7,A
MOV DPL,R6
MOV DPH,R7
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX A,@DPTR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -