📄 halstack.lst
字号:
36 IO_PER_LOC_UART0_AT_PORT0_PIN2345();
\ 000000 53F1FE ANL 0xf1,#0xfe
37 UTX0IF = 1;
\ 000003 D2E9 SETB 0xe8.1
38 }
\ 000005 22 RET
39
40 //get a character from serial port
\ In segment NEAR_CODE, align 1, keep-with-next
41 char halGetch(void){
\ halGetch:
\ 000000 ; Saved register size: 0
\ 000000 ; Auto size: 0
42 char c;
43 // Turning on reception
44 U0CSR |= UART_ENABLE_RECEIVE;
\ 000000 438640 ORL 0x86,#0x40
45
46 while (!URX0IF);
\ ??halGetch_0:
\ 000003 A28B MOV C,0x88.3
\ 000005 50FC JNC ??halGetch_0
47 c = U0DBUF;
\ 000007 E5C1 MOV A,0xc1
\ 000009 F9 MOV R1,A
48 URX0IF = FALSE;
\ 00000A C28B CLR 0x88.3
49
50 return c;
\ 00000C 22 RET
51 }
52
\ In segment NEAR_CODE, align 1, keep-with-next
53 void halUtilMemCopy(BYTE *dst, BYTE *src, BYTE len) {
\ halUtilMemCopy:
\ 000000 74F8 MOV A,#-0x8
\ 000002 12.... LCALL ?FUNC_ENTER_XDATA
\ 000005 ; Saved register size: 8
\ 000005 ; Auto size: 0
54 while (len) {
\ ??halUtilMemCopy_0:
\ 000005 E9 MOV A,R1
\ 000006 601F JZ ??halUtilMemCopy_1
55 *dst = *src;
\ 000008 8C82 MOV DPL,R4
\ 00000A 8D83 MOV DPH,R5
\ 00000C E0 MOVX A,@DPTR
\ 00000D 8A82 MOV DPL,R2
\ 00000F 8B83 MOV DPH,R3
\ 000011 F0 MOVX @DPTR,A
56 dst++;src++;
\ 000012 8A82 MOV DPL,R2
\ 000014 8B83 MOV DPH,R3
\ 000016 A3 INC DPTR
\ 000017 AA82 MOV R2,DPL
\ 000019 AB83 MOV R3,DPH
\ 00001B 8C82 MOV DPL,R4
\ 00001D 8D83 MOV DPH,R5
\ 00001F A3 INC DPTR
\ 000020 AC82 MOV R4,DPL
\ 000022 AD83 MOV R5,DPH
57 len--;
\ 000024 19 DEC R1
\ 000025 80DE SJMP ??halUtilMemCopy_0
58 }
59 }
\ ??halUtilMemCopy_1:
\ 000027 7F01 MOV R7,#0x1
\ 000029 02.... LJMP ?FUNC_LEAVE_XDATA
60
61 // assuming 16us period, have 1/16us = 62500 tics per seocnd
62 #define T2CMPVAL (62500/SLOWTICKS_PER_SECOND)
63
64 //use timer2, will set it up for one tick per symbol
65 //assuming 2.4GHZ and a 32 MHZ clock.
66 // this is a 20 bit counter, will overflow in ~16 seconds
67 //should be long enough for MAC timeout cases
\ In segment NEAR_CODE, align 1, keep-with-next
68 void halInitMACTimer(void) {
\ halInitMACTimer:
\ 000000 ; Saved register size: 0
\ 000000 ; Auto size: 0
69
70 T2CNF = 0x00; //ensure timer is idle
\ 000000 75C300 MOV 0xc3,#0x0
71
72 T2CAPHPH = 0x02; // setting for 16 u-second periods
\ 000003 75A502 MOV 0xa5,#0x2
73 T2CAPLPL = 0x00; // (0x0200) / 32 = 16 u-seconds
\ 000006 75A400 MOV 0xa4,#0x0
74 //set the interrupt compare to its maximum value
75
76 #ifdef LRWPAN_ENABLE_SLOW_TIMER
77 T2PEROF0 = (BYTE) (T2CMPVAL);
78 T2PEROF1 = (BYTE) (T2CMPVAL>>8);
79 //enable overflow count compare interrupt
80 T2PEROF2 = ((BYTE) (T2CMPVAL>>16)) | 0x20;
81 #endif
82
83 //turn on timer
84 //configure timer
85 T2CNF = 0x03; //start timer
\ 000009 75C303 MOV 0xc3,#0x3
86
87 INT_SETFLAG_T2(INT_CLR); //clear processor interrupt flag
\ 00000C C2C2 CLR 0xc0.2
88 //enable T2 processor interrupt
89 #ifdef LRWPAN_ENABLE_SLOW_TIMER
90 INT_ENABLE_T2(INT_ON);
91 #endif
92
93 }
\ 00000E 22 RET
94
\ In segment NEAR_CODE, align 1, keep-with-next
95 UINT32 halGetMACTimer(void){
\ halGetMACTimer:
\ 000000 74F5 MOV A,#-0xb
\ 000002 12.... LCALL ?FUNC_ENTER_XDATA
\ 000005 ; Saved register size: 11
\ 000005 ; Auto size: 4
\ 000005 74FC MOV A,#-0x4
\ 000007 12.... LCALL ?ALLOC_XSTACK8
96 UINT32_UNION t;
97 BOOL gie_status;
98
99 SAVE_AND_DISABLE_GLOBAL_INTERRUPT(gie_status);
\ 00000A A2AF MOV C,0xa8.7
\ 00000C E4 CLR A
\ 00000D 92E0 MOV 0xE0 /* A */.0,C
\ 00000F FE MOV R6,A
\ 000010 C2AF CLR 0xa8.7
100 t.bytes[UINT32_LOWORD_LSB] = T2OF0;
\ 000012 E5A1 MOV A,0xa1
\ 000014 85..82 MOV DPL,?XSP + 0
\ 000017 85..83 MOV DPH,?XSP + 1
\ 00001A F0 MOVX @DPTR,A
101 t.bytes[UINT32_LOWORD_MSB] = T2OF1;
\ 00001B E5A2 MOV A,0xa2
\ 00001D C0E0 PUSH A
\ 00001F 7401 MOV A,#0x1
\ 000021 12.... LCALL ?XSTACK_DISP0_8
\ 000024 D0E0 POP A
\ 000026 F0 MOVX @DPTR,A
102 t.bytes[UINT32_HIWORD_LSB] = T2OF2 & 0x0F;
\ 000027 740F MOV A,#0xf
\ 000029 55A3 ANL A,0xa3
\ 00002B C0E0 PUSH A
\ 00002D 7402 MOV A,#0x2
\ 00002F 12.... LCALL ?XSTACK_DISP0_8
\ 000032 D0E0 POP A
\ 000034 F0 MOVX @DPTR,A
103 t.bytes[UINT32_HIWORD_MSB] = 0;
\ 000035 7400 MOV A,#0x0
\ 000037 C0E0 PUSH A
\ 000039 7403 MOV A,#0x3
\ 00003B 12.... LCALL ?XSTACK_DISP0_8
\ 00003E D0E0 POP A
\ 000040 F0 MOVX @DPTR,A
104 RESTORE_GLOBAL_INTERRUPT(gie_status);
\ 000041 EE MOV A,R6
\ 000042 A2E0 MOV C,0xE0 /* A */.0
\ 000044 92AF MOV 0xa8.7,C
105 return (t.val);
\ 000046 85..82 MOV DPL,?XSP + 0
\ 000049 85..83 MOV DPH,?XSP + 1
\ 00004C 78.. MOV R0,#?V0 + 0
\ 00004E 12.... LCALL ?L_MOV_X
\ 000051 AA.. MOV R2,?V0 + 0
\ 000053 AB.. MOV R3,?V0 + 1
\ 000055 AC.. MOV R4,?V0 + 2
\ 000057 AD.. MOV R5,?V0 + 3
\ 000059 7404 MOV A,#0x4
\ 00005B 12.... LCALL ?DEALLOC_XSTACK8
\ 00005E 7F04 MOV R7,#0x4
\ 000060 02.... LJMP ?FUNC_LEAVE_XDATA
106 }
107
108
109
110 //only works as long as SYMBOLS_PER_MAC_TICK is not less than 1
\ In segment NEAR_CODE, align 1, keep-with-next
111 UINT32 halMacTicksToUs(UINT32 ticks){
\ halMacTicksToUs:
\ 000000 74F1 MOV A,#-0xf
\ 000002 12.... LCALL ?FUNC_ENTER_XDATA
\ 000005 ; Saved register size: 15
\ 000005 ; Auto size: 8
\ 000005 74F8 MOV A,#-0x8
\ 000007 12.... LCALL ?ALLOC_XSTACK8
\ 00000A 7404 MOV A,#0x4
\ 00000C 12.... LCALL ?XSTACK_DISP0_8
\ 00000F EA MOV A,R2
\ 000010 F0 MOVX @DPTR,A
\ 000011 A3 INC DPTR
\ 000012 EB MOV A,R3
\ 000013 F0 MOVX @DPTR,A
\ 000014 A3 INC DPTR
\ 000015 EC MOV A,R4
\ 000016 F0 MOVX @DPTR,A
\ 000017 A3 INC DPTR
\ 000018 ED MOV A,R5
\ 000019 F0 MOVX @DPTR,A
112
113 UINT32 rval;
114
115 rval = (ticks/SYMBOLS_PER_MAC_TICK())* (1000000/LRWPAN_SYMBOLS_PER_SECOND);
\ 00001A 7404 MOV A,#0x4
\ 00001C 12.... LCALL ?XSTACK_DISP0_8
\ 00001F 78.. MOV R0,#?V0 + 0
\ 000021 12.... LCALL ?L_MOV_X
\ 000024 90.... MOV DPTR,#__Constant_1
\ 000027 78.. MOV R0,#?V0 + 4
\ 000029 12.... LCALL ?L_MOV_X
\ 00002C 78.. MOV R0,#?V0 + 0
\ 00002E 79.. MOV R1,#?V0 + 4
\ 000030 12.... LCALL ?UL_DIV_MOD
\ 000033 90.... MOV DPTR,#__Constant_10
\ 000036 78.. MOV R0,#?V0 + 4
\ 000038 12.... LCALL ?L_MOV_X
\ 00003B 78.. MOV R0,#?V0 + 0
\ 00003D 79.. MOV R1,#?V0 + 4
\ 00003F 12.... LCALL ?L_MUL
\ 000042 85..82 MOV DPL,?XSP + 0
\ 000045 85..83 MOV DPH,?XSP + 1
\ 000048 78.. MOV R0,#?V0 + 0
\ 00004A 12.... LCALL ?L_MOV_TO_X
116 return(rval);
\ 00004D 85..82 MOV DPL,?XSP + 0
\ 000050 85..83 MOV DPH,?XSP + 1
\ 000053 78.. MOV R0,#?V0 + 0
\ 000055 12.... LCALL ?L_MOV_X
\ 000058 AA.. MOV R2,?V0 + 0
\ 00005A AB.. MOV R3,?V0 + 1
\ 00005C AC.. MOV R4,?V0 + 2
\ 00005E AD.. MOV R5,?V0 + 3
\ 000060 7408 MOV A,#0x8
\ 000062 12.... LCALL ?DEALLOC_XSTACK8
\ 000065 7F08 MOV R7,#0x8
\ 000067 02.... LJMP ?FUNC_LEAVE_XDATA
117 }
118
119 //assumes that Timer2 has been initialized and is running
\ In segment NEAR_CODE, align 1, keep-with-next
120 UINT8 halGetRandomByte(void) {
\ halGetRandomByte:
\ 000000 ; Saved register size: 0
\ 000000 ; Auto size: 0
121 return(T2OF0);
\ 000000 A9A1 MOV R1,0xa1
\ 000002 22 RET
122 }
123
124 //write a character to serial port
125 // Uses UART initialized by halInitUart
126
\ In segment NEAR_CODE, align 1, keep-with-next
127 void halPutch(char c){
\ halPutch:
\ 000000 ; Saved register size: 0
\ 000000 ; Auto size: 0
128 while (!UTX0IF);
\ ??halPutch_0:
\ 000000 A2E9 MOV C,0xe8.1
\ 000002 50FC JNC ??halPutch_0
129 UTX0IF = 0;
\ 000004 C2E9 CLR 0xe8.1
130 U0DBUF = c;
\ 000006 89C1 MOV 0xc1,R1
131 }
\ 000008 22 RET
132
133
134 //set the radio frequency
\ In segment NEAR_CODE, align 1, keep-with-next
135 LRWPAN_STATUS_ENUM halSetRadioIEEEFrequency(PHY_FREQ_ENUM frequency, BYTE channel)
\ halSetRadioIEEEFrequency:
136 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -