$MOD_MX51
;------------------------------------------------------------------------------
;  This file is part of the PK51 Professional Developers Kit
;  Startup Code for the Philips 80C51MX architecture
;  Copyright (c) 2000-2005 Keil Elektronik GmbH and Keil Software, Inc.
;  Version 1.03
;------------------------------------------------------------------------------
;  START_MX.A51:  This code is executed after processor reset.
;  You may add this file to a uVision2 project.
;
;  To translate this file manually use AX51 with the following invocation:
;
;     AX51 START_MX.A51  
;
;  To link the modified START_MX.OBJ file to your application use the
;  following LX51 invocation:
;
;     LX51 START_MX.OBJ, <your object file list> <controls>
;
;------------------------------------------------------------------------------
;
;  Setup 80C51MX Configuration Register (MXCON)
;
; Extended Call Return Mode (intermixed subroutine call with ECALL/LCALL/ACALL)
; ECRM       Val  Description
; ---        ---  -----------
ECRM EQU 1  ; 0 = classic CALL/RET instructions with 2-byte stack frame
;           ; 1 = CALL/RET save and restore the full 3-byte program counter
; NOTE: ECRM is only available on some devices, check your chip specification
;
; Extended Addressing Mode (enable upper address multiplex on Port 2)
; EAM        Val  Description
; ---        ---  -----------
EAM EQU  0  ; 0 = do not change configuration state of the CPU
;           ; 1 = enable extended addressing mode (multiplex A16..A22 on Port 2)
;
; Extended Stack Memory Mode (16-bit Stack Pointer)
; ESMM       Val  Description
; ----       ---  -----------
ESMM EQU 0  ; 0 = classic 8051 stack pointer (8-bit) addressing IDATA space
;           ; 1 = extended 16-bit stack pointer addressing EDATA space
;
; Extended Interrupt Frame
; EIFM       Val  Description
; --         ---  -----------
EIFM EQU 0  ; 0 = classic 8051 interrupt frame (16-bit address pushed)
;           ; 1 = extended 24-bit interrupt frame (3 bytes pushed on interrupt)
;
;
;
;  Setup Additional Features (AUXR, AUXR1)
;
; XDATA access (External XDATA space)
; EXTRAM     Val  Description
; ---        ---  -----------
EXTRAM EQU 0; 0 = access on-chip XDATA RAM 
;           ; 1 = disable on-chip XDATA and access off-chip XDATA space
;
; ALE (Address Latch Enable) Output Signal 
; AO         Val  Description
; --         ---  -----------
AO   EQU 0  ; 0 = ALE signal is generate at a constant rate 
;           ; 1 = ALE signal is active only during a MOVX or MOVC instruction
;
; Low Volatage (Vcc) configuration
; LPEP       Val  Description
; ----       ---  -----------
LPEP EQU 0  ; 0 = chip supply volatage (Vcc) is above 4V
;           ; 1 = chip supply volatage (Vcc) is below 4V
;------------------------------------------------------------------------------
;
;  CPU Stack Size Definition 
;
;  The following EQU statement defines the stack space available in extended
;  stack mode (ESMM set to 1) for the application program.  It should be noted
;  that the stack space must be adjusted according the actual requirements of 
;  the application.
;
STACKSIZE	EQU	100H	; set to 100H Bytes.
;
;------------------------------------------------------------------------------
;
;  User-defined Power-On Initialization of Memory
;
;  With the following EQU statements the initialization of memory
;  at processor reset can be defined:
;
;		; the absolute start-address of IDATA memory is always 0
IDATALEN	EQU	0FFH	; the length of IDATA memory in bytes.
;
XDATASTART	EQU	0H	; the absolute start-address of XDATA memory
XDATALEN	EQU	0H	; the length of XDATA memory in bytes.
;
PDATASTART	EQU	0H	; the absolute start-address of PDATA memory
PDATALEN	EQU	0H	; the length of PDATA memory in bytes.
;
;  Notes:  The IDATA space overlaps physically the DATA and BIT areas of the
;          80C51MX CPU.
;------------------------------------------------------------------------------
;
;  Reentrant Stack Initilization
;
;  The following EQU statements define the stack pointer for reentrant
;  functions and initialized it:
;
;  Stack Space for reentrant functions in the SMALL model.
IBPSTACK	EQU	0	; set to 1 if small reentrant is used.
IBPSTACKTOP	EQU	0FFH+1	; set top of stack to highest location+1.
;
;  Stack Space for reentrant functions in the LARGE model.	
XBPSTACK	EQU	0	; set to 1 if large reentrant is used.
XBPSTACKTOP	EQU	0FFFFH+1; set top of stack to highest location+1.
;
;  Stack Space for reentrant functions in the COMPACT model.	
PBPSTACK	EQU	0	; set to 1 if compact reentrant is used.
PBPSTACKTOP	EQU	0FFFFH+1; set top of stack to highest location+1.
;
;------------------------------------------------------------------------------
;
;  Page Definition for Using the Compact Model with 64 KByte xdata RAM
;
;  The following EQU statements define the xdata page used for pdata
;  variables. The EQU PPAGE must conform with the PPAGE control used
;  in the linker invocation.
;
PPAGEENABLE	EQU	0	; set to 1 if pdata object are used.
PPAGE		EQU	0	; define PPAGE number.
;
;------------------------------------------------------------------------------

; Define CPU Symbols
sfr SP     = 0x81;
sfr SPE    = 0x1FB;
sfr AUXR   = 0x8E;
sfr AUXR1  = 0xA2;
sfr MXCON  = 0x1FF;

		NAME	?C_STARTUP

?C_C51STARTUP	SEGMENT   CODE

IF ESMM == 1

?STACK		SEGMENT   EDATA
		RSEG	?STACK
		DS	STACKSIZE	; Stack Space 100H Bytes

ELSE

?STACK		SEGMENT   IDATA
		RSEG	?STACK
		DS	1

ENDIF


		EXTRN CODE (?C_START)
		PUBLIC	?C_STARTUP

		CSEG	AT	0
?C_STARTUP:	LJMP	STARTUP1

		RSEG	?C_C51STARTUP

STARTUP1:


IF ECRM               ; Define Symbols for LX51 Linker/Locater
PUBLIC ?L?_CALL3_
?L?_CALL3_  EQU  1    ; 3 bytes stack frame for CALL/RET
ENDIF

; Init MXCON
_VMXCON EQU (ECRM SHL 4) OR (EAM SHL 2) OR (ESMM SHL 1) OR (EIFM)
IF _VMXCON
                MOV     MXCON,#_VMXCON
ENDIF

; Init AUXR
_VAUXR  EQU (EXTRAM SHL 1) OR (AO)
IF _VAUXR
                MOV     AUXR,#_VAUXR
ENDIF

; Init AUXR1
_VAUXR1 EQU (LPEP SHL 4)
IF _VAUXR1
               MOV     AUXR1,#_VAUXR1
ENDIF

IF IDATALEN <> 0
		MOV	R0,#IDATALEN - 1
		CLR	A
IDATALOOP:	MOV	@R0,A
		DJNZ	R0,IDATALOOP
ENDIF

IF XDATALEN <> 0
		MOV	R1,#BYTE0 XDATASTART
		MOV	R2,#BYTE1 XDATASTART
		MOV	R3,#BYTE2 XDATASTART
		MOV	R7,#BYTE0 (XDATALEN)
  IF (BYTE0 (XDATALEN)) <> 0
		MOV	R6,#(BYTE1 (XDATALEN)) +1
  ELSE
		MOV	R6,#BYTE1 (XDATALEN)
  ENDIF
  IF (WORD0 (XDATALEN)) <> 0
                MOV     R5,#(BYTE2 (XDATALEN)) + 1
  ELSE
                MOV     R5,#BYTE2 (XDATALEN)
  ENDIF
		CLR	A
XDATALOOP:	EMOV	@PR0,A
		ADD	PR0,#1
		DJNZ	R7,XDATALOOP
		DJNZ	R6,XDATALOOP
		DJNZ	R5,XDATALOOP
ENDIF

IF PPAGEENABLE <> 0
		MOV	P2,#PPAGE
ENDIF

IF PDATALEN <> 0
		MOV	R0,#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

IF (ESMM)
		MOV	SP,#BYTE0 (?STACK-1)    ; Initilize Extended Stack Pointer
		MOV     SPE,#BYTE1 (?STACK-1)
ELSE
		MOV	SP,#?STACK-1            ; Initilize Classic 8051 Stack
ENDIF

IF (EIFM)
		EJMP	?C_START
ELSE
		LJMP	?C_START
ENDIF


		END
