2 changed files with 199 additions and 0 deletions
@ -0,0 +1,198 @@ |
|||||
|
$NOMOD51 |
||||
|
;------------------------------------------------------------------------------ |
||||
|
; This file is part of the C51 Compiler package |
||||
|
; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc. |
||||
|
; Version 8.01 |
||||
|
; |
||||
|
; *** <<< Use Configuration Wizard in Context Menu >>> *** |
||||
|
;------------------------------------------------------------------------------ |
||||
|
; STARTUP.A51: This code is executed after processor reset. |
||||
|
; |
||||
|
; To translate this file use A51 with the following invocation: |
||||
|
; |
||||
|
; A51 STARTUP.A51 |
||||
|
; |
||||
|
; To link the modified STARTUP.OBJ file to your application use the following |
||||
|
; Lx51 invocation: |
||||
|
; |
||||
|
; Lx51 your object file list, STARTUP.OBJ controls |
||||
|
; |
||||
|
;------------------------------------------------------------------------------ |
||||
|
; |
||||
|
; User-defined <h> Power-On Initialization of Memory |
||||
|
; |
||||
|
; With the following EQU statements the initialization of memory |
||||
|
; at processor reset can be defined: |
||||
|
; |
||||
|
; <o> IDATALEN: IDATA memory size <0x0-0x100> |
||||
|
; <i> Note: The absolute start-address of IDATA memory is always 0 |
||||
|
; <i> The IDATA space overlaps physically the DATA and BIT areas. |
||||
|
IDATALEN EQU 80H |
||||
|
; |
||||
|
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF> |
||||
|
; <i> The absolute start address of XDATA memory |
||||
|
XDATASTART EQU 0 |
||||
|
; |
||||
|
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF> |
||||
|
; <i> The length of XDATA memory in bytes. |
||||
|
XDATALEN EQU 0 |
||||
|
; |
||||
|
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF> |
||||
|
; <i> The absolute start address of PDATA memory |
||||
|
PDATASTART EQU 0H |
||||
|
; |
||||
|
; <o> PDATALEN: PDATA memory size <0x0-0xFF> |
||||
|
; <i> The length of PDATA memory in bytes. |
||||
|
PDATALEN EQU 0H |
||||
|
; |
||||
|
;</h> |
||||
|
;------------------------------------------------------------------------------ |
||||
|
; |
||||
|
;<h> Reentrant Stack Initialization |
||||
|
; |
||||
|
; The following EQU statements define the stack pointer for reentrant |
||||
|
; functions and initialized it: |
||||
|
; |
||||
|
; <h> Stack Space for reentrant functions in the SMALL model. |
||||
|
; <q> IBPSTACK: Enable SMALL model reentrant stack |
||||
|
; <i> Stack space for reentrant functions in the SMALL model. |
||||
|
IBPSTACK EQU 0 ; set to 1 if small reentrant is used. |
||||
|
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF> |
||||
|
; <i> Set the top of the stack to the highest location. |
||||
|
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 |
||||
|
; </h> |
||||
|
; |
||||
|
; <h> Stack Space for reentrant functions in the LARGE model. |
||||
|
; <q> XBPSTACK: Enable LARGE model reentrant stack |
||||
|
; <i> Stack space for reentrant functions in the LARGE model. |
||||
|
XBPSTACK EQU 1 ; set to 1 if large reentrant is used. |
||||
|
; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF> |
||||
|
; <i> Set the top of the stack to the highest location. |
||||
|
XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1 |
||||
|
; </h> |
||||
|
; |
||||
|
; <h> Stack Space for reentrant functions in the COMPACT model. |
||||
|
; <q> PBPSTACK: Enable COMPACT model reentrant stack |
||||
|
; <i> Stack space for reentrant functions in the COMPACT model. |
||||
|
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used. |
||||
|
; |
||||
|
; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF> |
||||
|
; <i> Set the top of the stack to the highest location. |
||||
|
PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1 |
||||
|
; </h> |
||||
|
;</h> |
||||
|
;------------------------------------------------------------------------------ |
||||
|
; |
||||
|
; Memory Page for Using the Compact Model with 64 KByte xdata RAM |
||||
|
; <e>Compact Model Page Definition |
||||
|
; |
||||
|
; <i>Define the XDATA page used for PDATA variables. |
||||
|
; <i>PPAGE must conform with the PPAGE set in the linker invocation. |
||||
|
; |
||||
|
; Enable pdata memory page initalization |
||||
|
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used. |
||||
|
; |
||||
|
; <o> PPAGE number <0x0-0xFF> |
||||
|
; <i> uppermost 256-byte address of the page used for PDATA variables. |
||||
|
PPAGE EQU 0 |
||||
|
; |
||||
|
; <o> SFR address which supplies uppermost address byte <0x0-0xFF> |
||||
|
; <i> most 8051 variants use P2 as uppermost address byte |
||||
|
PPAGE_SFR DATA 0A0H |
||||
|
; |
||||
|
; </e> |
||||
|
;------------------------------------------------------------------------------ |
||||
|
|
||||
|
; Standard SFR Symbols |
||||
|
ACC DATA 0E0H |
||||
|
B DATA 0F0H |
||||
|
SP DATA 81H |
||||
|
DPL DATA 82H |
||||
|
DPH DATA 83H |
||||
|
|
||||
|
NAME ?C_STARTUP |
||||
|
|
||||
|
|
||||
|
?C_C51STARTUP SEGMENT CODE |
||||
|
?STACK SEGMENT IDATA |
||||
|
|
||||
|
RSEG ?STACK |
||||
|
DS 1 |
||||
|
|
||||
|
EXTRN CODE (?C_START) |
||||
|
PUBLIC ?C_STARTUP |
||||
|
|
||||
|
CSEG AT 0 |
||||
|
?C_STARTUP: LJMP STARTUP1 |
||||
|
|
||||
|
RSEG ?C_C51STARTUP |
||||
|
|
||||
|
STARTUP1: |
||||
|
|
||||
|
IF IDATALEN <> 0 |
||||
|
MOV R0,#IDATALEN - 1 |
||||
|
CLR A |
||||
|
IDATALOOP: MOV @R0,A |
||||
|
DJNZ R0,IDATALOOP |
||||
|
ENDIF |
||||
|
|
||||
|
IF XDATALEN <> 0 |
||||
|
MOV DPTR,#XDATASTART |
||||
|
MOV R7,#LOW (XDATALEN) |
||||
|
IF (LOW (XDATALEN)) <> 0 |
||||
|
MOV R6,#(HIGH (XDATALEN)) +1 |
||||
|
ELSE |
||||
|
MOV R6,#HIGH (XDATALEN) |
||||
|
ENDIF |
||||
|
CLR A |
||||
|
XDATALOOP: MOVX @DPTR,A |
||||
|
INC DPTR |
||||
|
DJNZ R7,XDATALOOP |
||||
|
DJNZ R6,XDATALOOP |
||||
|
ENDIF |
||||
|
|
||||
|
IF PPAGEENABLE <> 0 |
||||
|
MOV PPAGE_SFR,#PPAGE |
||||
|
ENDIF |
||||
|
|
||||
|
IF PDATALEN <> 0 |
||||
|
MOV R0,#LOW (PDATASTART) |
||||
|
MOV R7,#LOW (PDATALEN) |
||||
|
CLR A |
||||
|
PDATALOOP: MOVX @R0,A |
||||
|
INC R0 |
||||
|
DJNZ R7,PDATALOOP |
||||
|
ENDIF |
||||
|
|
||||
|
IF IBPSTACK <> 0 |
||||
|
EXTRN DATA (?C_IBP) |
||||
|
|
||||
|
MOV ?C_IBP,#LOW IBPSTACKTOP |
||||
|
ENDIF |
||||
|
|
||||
|
IF XBPSTACK <> 0 |
||||
|
EXTRN DATA (?C_XBP) |
||||
|
|
||||
|
MOV ?C_XBP,#HIGH XBPSTACKTOP |
||||
|
MOV ?C_XBP+1,#LOW XBPSTACKTOP |
||||
|
ENDIF |
||||
|
|
||||
|
IF PBPSTACK <> 0 |
||||
|
EXTRN DATA (?C_PBP) |
||||
|
MOV ?C_PBP,#LOW PBPSTACKTOP |
||||
|
ENDIF |
||||
|
|
||||
|
MOV SP,#?STACK-1 |
||||
|
|
||||
|
; This code is required if you use L51_BANK.A51 with Banking Mode 4 |
||||
|
;<h> Code Banking |
||||
|
; <q> Select Bank 0 for L51_BANK.A51 Mode 4 |
||||
|
#if 0 |
||||
|
; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4. |
||||
|
EXTRN CODE (?B_SWITCH0) |
||||
|
CALL ?B_SWITCH0 ; init bank mechanism to code bank 0 |
||||
|
#endif |
||||
|
;</h> |
||||
|
LJMP ?C_START |
||||
|
|
||||
|
END |
Loading…
Reference in new issue