提交 | 用户 | age
|
5dd1b7
|
1 |
$NOMOD51 |
Q |
2 |
;------------------------------------------------------------------------------ |
|
3 |
; This file is part of the C51 Compiler package |
|
4 |
; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc. |
|
5 |
; Version 8.01 |
|
6 |
; |
|
7 |
; *** <<< Use Configuration Wizard in Context Menu >>> *** |
|
8 |
;------------------------------------------------------------------------------ |
|
9 |
; STARTUP.A51: This code is executed after processor reset. |
|
10 |
; |
|
11 |
; To translate this file use A51 with the following invocation: |
|
12 |
; |
|
13 |
; A51 STARTUP.A51 |
|
14 |
; |
|
15 |
; To link the modified STARTUP.OBJ file to your application use the following |
|
16 |
; Lx51 invocation: |
|
17 |
; |
|
18 |
; Lx51 your object file list, STARTUP.OBJ controls |
|
19 |
; |
|
20 |
;------------------------------------------------------------------------------ |
|
21 |
; |
|
22 |
; User-defined <h> Power-On Initialization of Memory |
|
23 |
; |
|
24 |
; With the following EQU statements the initialization of memory |
|
25 |
; at processor reset can be defined: |
|
26 |
; |
|
27 |
; <o> IDATALEN: IDATA memory size <0x0-0x100> |
|
28 |
; <i> Note: The absolute start-address of IDATA memory is always 0 |
|
29 |
; <i> The IDATA space overlaps physically the DATA and BIT areas. |
|
30 |
IDATALEN EQU 80H |
|
31 |
; |
|
32 |
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> |
|
33 |
; <i> The absolute start address of XDATA memory |
|
34 |
XDATASTART EQU 0 |
|
35 |
; |
|
36 |
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> |
|
37 |
; <i> The length of XDATA memory in bytes. |
|
38 |
XDATALEN EQU 0 |
|
39 |
; |
|
40 |
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> |
|
41 |
; <i> The absolute start address of PDATA memory |
|
42 |
PDATASTART EQU 0H |
|
43 |
; |
|
44 |
; <o> PDATALEN: PDATA memory size <0x0-0xFF> |
|
45 |
; <i> The length of PDATA memory in bytes. |
|
46 |
PDATALEN EQU 0H |
|
47 |
; |
|
48 |
;</h> |
|
49 |
;------------------------------------------------------------------------------ |
|
50 |
; |
|
51 |
;<h> Reentrant Stack Initialization |
|
52 |
; |
|
53 |
; The following EQU statements define the stack pointer for reentrant |
|
54 |
; functions and initialized it: |
|
55 |
; |
|
56 |
; <h> Stack Space for reentrant functions in the SMALL model. |
|
57 |
; <q> IBPSTACK: Enable SMALL model reentrant stack |
|
58 |
; <i> Stack space for reentrant functions in the SMALL model. |
|
59 |
IBPSTACK EQU 0 ; set to 1 if small reentrant is used. |
|
60 |
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF> |
|
61 |
; <i> Set the top of the stack to the highest location. |
|
62 |
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 |
|
63 |
; </h> |
|
64 |
; |
|
65 |
; <h> Stack Space for reentrant functions in the LARGE model. |
|
66 |
; <q> XBPSTACK: Enable LARGE model reentrant stack |
|
67 |
; <i> Stack space for reentrant functions in the LARGE model. |
|
68 |
XBPSTACK EQU 0 ; set to 1 if large reentrant is used. |
|
69 |
; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF> |
|
70 |
; <i> Set the top of the stack to the highest location. |
|
71 |
XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1 |
|
72 |
; </h> |
|
73 |
; |
|
74 |
; <h> Stack Space for reentrant functions in the COMPACT model. |
|
75 |
; <q> PBPSTACK: Enable COMPACT model reentrant stack |
|
76 |
; <i> Stack space for reentrant functions in the COMPACT model. |
|
77 |
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. |
|
78 |
; |
|
79 |
; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF> |
|
80 |
; <i> Set the top of the stack to the highest location. |
|
81 |
PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 |
|
82 |
; </h> |
|
83 |
;</h> |
|
84 |
;------------------------------------------------------------------------------ |
|
85 |
; |
|
86 |
; Memory Page for Using the Compact Model with 64 KByte xdata RAM |
|
87 |
; <e>Compact Model Page Definition |
|
88 |
; |
|
89 |
; <i>Define the XDATA page used for PDATA variables. |
|
90 |
; <i>PPAGE must conform with the PPAGE set in the linker invocation. |
|
91 |
; |
|
92 |
; Enable pdata memory page initalization |
|
93 |
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. |
|
94 |
; |
|
95 |
; <o> PPAGE number <0x0-0xFF> |
|
96 |
; <i> uppermost 256-byte address of the page used for PDATA variables. |
|
97 |
PPAGE EQU 0 |
|
98 |
; |
|
99 |
; <o> SFR address which supplies uppermost address byte <0x0-0xFF> |
|
100 |
; <i> most 8051 variants use P2 as uppermost address byte |
|
101 |
PPAGE_SFR DATA 0A0H |
|
102 |
; |
|
103 |
; </e> |
|
104 |
;------------------------------------------------------------------------------ |
|
105 |
|
|
106 |
; Standard SFR Symbols |
|
107 |
ACC DATA 0E0H |
|
108 |
B DATA 0F0H |
|
109 |
SP DATA 81H |
|
110 |
DPL DATA 82H |
|
111 |
DPH DATA 83H |
|
112 |
|
|
113 |
NAME ?C_STARTUP |
|
114 |
|
|
115 |
|
|
116 |
?C_C51STARTUP SEGMENT CODE |
|
117 |
?STACK SEGMENT IDATA |
|
118 |
|
|
119 |
RSEG ?STACK |
|
120 |
DS 1 |
|
121 |
|
|
122 |
EXTRN CODE (?C_START) |
|
123 |
PUBLIC ?C_STARTUP |
|
124 |
|
|
125 |
CSEG AT 0 |
|
126 |
?C_STARTUP: LJMP STARTUP1 |
|
127 |
|
|
128 |
RSEG ?C_C51STARTUP |
|
129 |
|
|
130 |
STARTUP1: |
|
131 |
|
|
132 |
IF IDATALEN <> 0 |
|
133 |
MOV R0,#IDATALEN - 1 |
|
134 |
CLR A |
|
135 |
IDATALOOP: MOV @R0,A |
|
136 |
DJNZ R0,IDATALOOP |
|
137 |
ENDIF |
|
138 |
|
|
139 |
IF XDATALEN <> 0 |
|
140 |
MOV DPTR,#XDATASTART |
|
141 |
MOV R7,#LOW (XDATALEN) |
|
142 |
IF (LOW (XDATALEN)) <> 0 |
|
143 |
MOV R6,#(HIGH (XDATALEN)) +1 |
|
144 |
ELSE |
|
145 |
MOV R6,#HIGH (XDATALEN) |
|
146 |
ENDIF |
|
147 |
CLR A |
|
148 |
XDATALOOP: MOVX @DPTR,A |
|
149 |
INC DPTR |
|
150 |
DJNZ R7,XDATALOOP |
|
151 |
DJNZ R6,XDATALOOP |
|
152 |
ENDIF |
|
153 |
|
|
154 |
IF PPAGEENABLE <> 0 |
|
155 |
MOV PPAGE_SFR,#PPAGE |
|
156 |
ENDIF |
|
157 |
|
|
158 |
IF PDATALEN <> 0 |
|
159 |
MOV R0,#LOW (PDATASTART) |
|
160 |
MOV R7,#LOW (PDATALEN) |
|
161 |
CLR A |
|
162 |
PDATALOOP: MOVX @R0,A |
|
163 |
INC R0 |
|
164 |
DJNZ R7,PDATALOOP |
|
165 |
ENDIF |
|
166 |
|
|
167 |
IF IBPSTACK <> 0 |
|
168 |
EXTRN DATA (?C_IBP) |
|
169 |
|
|
170 |
MOV ?C_IBP,#LOW IBPSTACKTOP |
|
171 |
ENDIF |
|
172 |
|
|
173 |
IF XBPSTACK <> 0 |
|
174 |
EXTRN DATA (?C_XBP) |
|
175 |
|
|
176 |
MOV ?C_XBP,#HIGH XBPSTACKTOP |
|
177 |
MOV ?C_XBP+1,#LOW XBPSTACKTOP |
|
178 |
ENDIF |
|
179 |
|
|
180 |
IF PBPSTACK <> 0 |
|
181 |
EXTRN DATA (?C_PBP) |
|
182 |
MOV ?C_PBP,#LOW PBPSTACKTOP |
|
183 |
ENDIF |
|
184 |
|
|
185 |
MOV SP,#?STACK-1 |
|
186 |
|
|
187 |
; This code is required if you use L51_BANK.A51 with Banking Mode 4 |
|
188 |
;<h> Code Banking |
|
189 |
; <q> Select Bank 0 for L51_BANK.A51 Mode 4 |
|
190 |
#if 0 |
|
191 |
; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4. |
|
192 |
EXTRN CODE (?B_SWITCH0) |
|
193 |
CALL ?B_SWITCH0 ; init bank mechanism to code bank 0 |
|
194 |
#endif |
|
195 |
;</h> |
|
196 |
LJMP ?C_START |
|
197 |
|
|
198 |
END |