📄 mac_support.s51
字号:
LCALL DisableRfInterrupts
// 303 ENABLE_GLOBAL_INT();
SETB 0xa8.7
// 304 mrxResetRxEngine();
; Setup parameters for call to function mrxResetRxEngine
LCALL mrxResetRxEngine
// 305 EnableRfInterrupts();
; Setup parameters for call to function EnableRfInterrupts
LCALL EnableRfInterrupts
// 306
// 307 // Change the PIB attribute (?) and update the frequency register
// 308 DISABLE_GLOBAL_INT();
CLR 0xa8.7
// 309 if (changePib) ppib.phyCurrentChannel = logicalChannel;
MOV A,?V0 + 1
JZ ??msupSetChannel_2
MOV A,?V0 + 0
MOV DPTR,#ppib
MOVX @DPTR,A
// 310 WRITE_RFR16(FSCTRL, newFreq);
??msupSetChannel_2:
MOV A,R7
MOV DPTR,#-0x20f0
MOVX @DPTR,A
MOV A,R6
MOV DPTR,#-0x20ef
MOVX @DPTR,A
// 311
// 312 // Return to the previous RX state
// 313 if (mrxInfo.onCounter) {
MOV DPTR,#(mrxInfo + 13)
MOVX A,@DPTR
JZ ??msupSetChannel_3
// 314 ISRXON;
MOV 0xe1,#-0x1e
// 315 }
// 316 ENABLE_GLOBAL_INT();
??msupSetChannel_3:
SETB 0xa8.7
// 317 }
// 318
// 319 } // msupSetChannel
??msupSetChannel_1:
MOV R7,#0x2
LJMP ?FUNC_LEAVE_XDATA
CFI EndBlock cfiBlock12
// 320
// 321
// 322
// 323
// 324 /*******************************************************************************************************
// 325 *******************************************************************************************************
// 326 ************************** TX PACKET GENERATION **************************
// 327 *******************************************************************************************************
// 328 *******************************************************************************************************/
// 329
// 330
// 331
// 332
// 333 //-------------------------------------------------------------------------------------------------------
// 334 // msupPrepareHeader(MAC_TX_PACKET *pPacket, BYTE type, BYTE addrModes, WORD srcPanId, ADDRESS ...)
// 335 //
// 336 // DESCRIPTION:
// 337 // Packet header assembly function, used for beacon, data and command frames.
// 338 //
// 339 // PARAMETERS:
// 340 // MAC_TX_PACKET *pPacket
// 341 // The packet structure to update (this function affects the header part)
// 342 // BYTE type
// 343 // FT_BEACON, FT_DATA or FT_COMMAND
// 344 // BYTE addrModes
// 345 // Address mode for source and destination
// 346 // (SRC_ADDR_SHORT, SRC_ADDR_EXT or 0) | (DEST_ADDR_SHORT, DEST_ADDR_EXT or 0)
// 347 // WORD srcPanId
// 348 // Source PAN identifier
// 349 // ADDRESS *pSrcAddr
// 350 // Pointer to the source address (short or extended)
// 351 // WORD destPanId,
// 352 // Destination PAN identifier
// 353 // ADDRESS *pDestAddr,
// 354 // Pointer to the destination address (short or extended)
// 355 // BYTE txOptions
// 356 // (TX_OPT_SECURITY_ENABLE | TX_OPT_INDIRECT | TX_OPT_GTS | TX_OPT_ACK_REQ) or TX_OPT_NONE
// 357 //-------------------------------------------------------------------------------------------------------
RSEG NEAR_CODE:CODE:NOROOT(0)
// 358 ROOT __xdata_reentrant void msupPrepareHeader(MAC_TX_PACKET *pPacket, BYTE type, BYTE addrModes, WORD srcPanId,
msupPrepareHeader:
CFI Block cfiBlock13 Using cfiCommon1
CFI Function msupPrepareHeader
// 359 ADDRESS *pSrcAddr, WORD destPanId, ADDRESS *pDestAddr, BYTE txOptions)
// 360 {
FUNCALL msupPrepareHeader, memcpy
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
FUNCALL msupPrepareHeader, msupCompareExtendedAddress
LOCFRAME XSTACK, 14, STACK
ARGFRAME XSTACK, 14, STACK
FUNCALL msupPrepareHeader, memcpy
LOCFRAME XSTACK, 16, STACK
ARGFRAME XSTACK, 16, STACK
MOV A,#-0xe
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 V6 load(1, XDATA, add(CFA_XSP16, literal(-6)))
CFI V5 load(1, XDATA, add(CFA_XSP16, literal(-7)))
CFI V4 load(1, XDATA, add(CFA_XSP16, literal(-8)))
CFI V3 load(1, XDATA, add(CFA_XSP16, literal(-9)))
CFI V2 load(1, XDATA, add(CFA_XSP16, literal(-10)))
CFI V1 load(1, XDATA, add(CFA_XSP16, literal(-11)))
CFI V0 load(1, XDATA, add(CFA_XSP16, literal(-12)))
CFI VB load(1, XDATA, add(CFA_XSP16, literal(-13)))
CFI R6 load(1, XDATA, add(CFA_XSP16, literal(-14)))
CFI CFA_SP SP+0
CFI CFA_XSP16 add(XSP16, 14)
; Saved register size: 14
; Auto size: 0
MOV ?V0 + 2,R2
MOV ?V0 + 3,R3
MOV ?V0 + 0,R1
MOV ?V0 + 6,R4
MOV A,#0xe
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R6,A
INC DPTR
MOVX A,@DPTR
MOV R7,A
MOV A,#0x12
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV R1,A
// 361 BYTE temp;
// 362 UINT8 length = 0;
// 363
// 364 // Packet type and options
// 365 pPacket->type = type;
MOV A,R2
ADD A,#-0x80
MOV DPL,A
MOV A,R3
ADDC A,#0x0
MOV DPH,A
MOV A,?V0 + 0
MOVX @DPTR,A
// 366 pPacket->txOptions = txOptions;
MOV A,R2
ADD A,#-0x7f
MOV DPL,A
MOV A,R3
ADDC A,#0x0
MOV DPH,A
MOV A,R5
MOVX @DPTR,A
// 367
// 368 // Frame control field
// 369 temp = (BYTE)(type & FRAME_TYPE_BM);
MOV A,#0x7
ANL A,?V0 + 0
MOV ?V0 + 1,A
// 370 #if MAC_OPT_SECURITY
// 371 pPacket->securitySetup.micLength = 0;
// 372
// 373 if (txOptions & TX_OPT_SECURITY_ENABLE) {
// 374 temp |= SECURITY_ENABLED_BM;
// 375 // Set securitySuite or securityStatus (UNAVAILABLE_KEY)
// 376 msecFindTxSecurityMaterial(pPacket, TRUE, ((addrModes & DEST_ADDR_BM) >> 2), destPanId, pDestAddr);
// 377
// 378 } else {
// 379 pPacket->securitySuite = MAC_SECURITY_NONE;
// 380 }
// 381 #else
// 382 pPacket->securitySuite = MAC_SECURITY_NONE;
MOV A,R2
ADD A,#-0x6e
MOV DPL,A
MOV A,R3
ADDC A,#0x0
MOV DPH,A
CLR A
MOVX @DPTR,A
// 383 #endif
// 384 if (txOptions & TX_OPT_ACK_REQ) temp |= ACK_REQ_BM;
MOV A,R5
MOV C,0xE0 /* A */.0
JNC ??msupPrepareHeader_0
MOV A,?V0 + 1
SETB 0xE0 /* A */.5
MOV ?V0 + 1,A
// 385 if (((addrModes & BOTH_ADDR_USED) == BOTH_ADDR_USED) && (srcPanId == destPanId)) temp |= INTRA_PAN_BM;
??msupPrepareHeader_0:
MOV A,#-0x78
ANL A,?V0 + 6
XRL A,#0x88
JNZ ??msupPrepareHeader_1
MOV A,R0
XRL A,R6
JNZ ??msupPrepareHeader_2
MOV A,R1
XRL A,R7
??msupPrepareHeader_2:
JNZ ??msupPrepareHeader_1
MOV A,?V0 + 1
SETB 0xE0 /* A */.6
MOV ?V0 + 1,A
// 386 pPacket->pHeader[length++] = temp;
??msupPrepareHeader_1:
MOV DPL,R2
MOV DPH,R3
INC DPTR
INC DPTR
INC DPTR
MOV A,?V0 + 1
MOVX @DPTR,A
// 387 pPacket->pHeader[length++] = addrModes;
MOV DPL,R2
MOV DPH,R3
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOV A,R4
MOVX @DPTR,A
// 388
// 389 // Sequence number
// 390 if (type == FT_BEACON) {
MOV A,R2
ADD A,#0x5
MOV R2,A
MOV A,R3
ADDC A,#0x0
MOV R3,A
MOV A,?V0 + 0
JNZ ??msupPrepareHeader_3
// 391 pPacket->pHeader[length++] = mpib.macBSN++;
MOV DPTR,#(mpib + 13)
MOVX A,@DPTR
MOV DPL,R2
MOV DPH,R3
MOVX @DPTR,A
MOV DPTR,#(mpib + 13)
SJMP ??msupPrepareHeader_4
// 392 } else {
// 393 pPacket->pHeader[length++] = mpib.macDSN++;
??msupPrepareHeader_3:
MOV DPTR,#(mpib + 24)
MOVX A,@DPTR
MOV DPL,R2
MOV DPH,R3
MOVX @DPTR,A
MOV DPTR,#(mpib + 24)
??msupPrepareHeader_4:
MOVX A,@DPTR
INC A
MOVX @DPTR,A
MOV ?V0 + 0,#0x3
MOV A,#0xc
ANL A,?V0 + 6
MOV R4,A
JNZ $+5
LJMP ??msupPrepareHeader_5
MOV A,R0
MOV DPL,?V0 + 2
MOV DPH,?V0 + 3
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
// 394 }
// 395
// 396 // Destination PAN ID
// 397 if (addrModes & DEST_ADDR_BM) {
// 398 pPacket->pHeader[length++] = LOBYTE(destPanId);
// 399 pPacket->pHeader[length++] = HIBYTE(destPanId);
MOV A,R1
MOV DPL,?V0 + 2
MOV DPH,?V0 + 3
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
MOV ?V0 + 0,#0x5
// 400 pPacket->toCoord = mpib.macPANId == destPanId;
MOV DPTR,#(mpib + 28)
MOVX A,@DPTR
XRL A,R0
JNZ ??msupPrepareHeader_6
INC DPTR
MOVX A,@DPTR
XRL A,R1
??msupPrepareHeader_6:
JNZ ??msupPrepareHeader_7
MOV R5,#0x1
SJMP ??msupPrepareHeader_8
??msupPrepareHeader_7:
MOV R5,#0x0
??msupPrepareHeader_8:
MOV A,?V0 + 2
ADD A,#-0x7c
MOV DPL,A
MOV A,?V0 + 3
ADDC A,#0x0
MOV DPH,A
MOV A,R5
MOVX @DPTR,A
// 401 } else {
// 402 pPacket->toCoord = FALSE;
// 403 }
// 404
// 405 // Destination address
// 406 if ((addrModes & DEST_ADDR_BM) == DEST_ADDR_SHORT) {
MOV A,R2
ADD A,#0x3
INC R2
INC R2
INC R2
MOV A,R3
ADDC A,#0x0
MOV R3,A
MOV A,#0x8
XRL A,R4
JNZ ??msupPrepareHeader_9
// 407 pPacket->pHeader[length++] = LOBYTE(pDestAddr->Short);
MOV A,#0x14
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV DPH,A
MOV DPL,R0
MOVX A,@DPTR
MOV DPL,R2
MOV DPH,R3
MOVX @DPTR,A
// 408 pPacket->pHeader[length++] = HIBYTE(pDestAddr->Short);
MOV A,#0x14
LCALL ?XSTACK_DISP0_8
MOVX A,@DPTR
MOV R0,A
INC DPTR
MOVX A,@DPTR
MOV DPH,A
MOV DPL,R0
INC DPTR
MOVX A,@DPTR
MOV DPL,?V0 + 2
MOV DPH,?V0 + 3
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
INC DPTR
MOVX @DPTR,A
MOV ?V0 + 0,#0x7
// 409 pPacket->toCoord &= (mpib.macCoordShortAddress == pDestAddr->Short);
MOV DPTR,#(mpib + 22)
MOVX A,@DPTR
MOV R2,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -