;------------------------------------------------------------------------------ ; This file is part of the C-51 Compiler package ; Copyright (c) KEIL ELEKTRONIK GmbH and Franklin Software, Inc.,1991-1994 ; ; Customized for the Blue Earth Micro hardware: TMB 05/03/95 ; Support for the Blue Earth Micro-485 hardware: TMB 01/26/96 ; All modifications have '***' comments near the new source line ; ;------------------------------------------------------------------------------ ; 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 ; L51 invocation: ; ; L51 , STARTUP.OBJ ; ;------------------------------------------------------------------------------ ; ; 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 100H ; the length of IDATA memory in bytes. ; XDATASTART EQU 5000H ; the absolute start-address of XDATA memory XDATALEN EQU 0H ; the length of XDATA memory in bytes. ; PDATASTART EQU 4000H ; the absolute start-address of PDATA memory PDATALEN EQU 0H ; the length of PDATA memory in bytes. ; ; *** The PDATA memory is assigned to 4000H. This allows the User Reset option ; to autoexecute the C51 program (Refer to the Blue Earth BASIC Manual). ; *** The XDATA memory is assigned to 5000H, an open area in the Micro memory ; that is above the Monitor-51 Scratch Pad area (4E00H-4FFFH) ; ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the ; 8051 CPU. At minimum the memory space occupied from the C-51 ; run-time routines must be set to zero. ;------------------------------------------------------------------------------ ; ; 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. ; ;------------------------------------------------------------------------------ NAME ?C_STARTUP ?C_C51STARTUP SEGMENT CODE ?STACK SEGMENT IDATA RSEG ?STACK DS 1 EXTRN CODE (?C_START) PUBLIC ?C_STARTUP CSEG AT PDATASTART ?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 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 MOV SP,#?STACK+1 ; *** Bump up the Stack Pointer to ; leave room for return address $IF Micro485 ; *** Include the following code by specifying "SET Micro485" in the ; A51 command line when compiling this file for use with the Micro-485 ; when the BASIC interpreter is not used to initialize the hardware. BANK_AR CODE 0FD00H ; Select RAM bank 0 BANK_SP CODE 0FE00H ; Select RAM bank 1 PORT_B XDATA 0FD01H ; SET A0 ONLY CONTROL XDATA 0FD03H ; SET BOTH A0 & A1 ; Set PortA and PortC to input, PortB output ; This will enable the standard serial port drivers. ; PortB output functions: ; ÚÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄÂÄÄÄÄÄÄ¿ ; ³ Z2 ³ CS ³ SK ³ DI ³ RE2 ³ RE1 ³ DE2 ³ DE1 ³ ; ÀÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÁÄÄÄÄÄÄÙ ; 0 0 0 0 0 1 1 0 ControlWord EQU 1001$1001B DefaultPortB EQU 0000$0110B ; Wait for about 300 milliseconds for reset to properly terminate. InitMicro485: CLR A MOV R2,#6 Nest2: MOV R1,A Nest1: MOV R0,A DJNZ R0,$ DJNZ R1,Nest1 DJNZ R2,Nest2 ; Initialize 82C55A Port B outputs MOV DPTR,#CONTROL ; Point to Control Reg MOV A,#ControlWord ; All outputs MOVX @DPTR,A MOV DPTR,#PORT_B ; Point to 82C55A PortB MOV A,#DefaultPortB ; Only turn RS422 ON MOVX @DPTR,A ; Select the lower 64K Bank of RAM LCALL Select_Bank0 SJMP ContinueReset ; Continue with reset routine PUBLIC Select_Bank0 PUBLIC Select_Bank1 Select_Bank0: MOV DPTR,#BANK_AR ; POINT TO THE RAM ADDR MOVC A,@A+DPTR ; TOGGLE PSEN LINE RET ; Additional code to select the upper 64K Bank of RAM Select_Bank1: MOV DPTR,#BANK_SP ; POINT TO THE RAM ADDR MOVC A,@A+DPTR ; TOGGLE PSEN LINE RET ContinueReset: $ELSE ; *** Reserve the bits that BASIC uses to take over the interrupts. BSEG AT 12H INTBIT: DBIT 1 BSEG AT 2EH C_BIT: DBIT 1 RSEG ?C_C51STARTUP CLR INTBIT CLR C_BIT $ENDIF LJMP ?C_START END