199 lines
6.0 KiB
Plaintext
199 lines
6.0 KiB
Plaintext
$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 0 ; 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
|