📄 install.a51
字号:
$TITLE ('Configuration for MON390 (C) 2002 KEIL')
;------------------------------------------------------------------------------
;
; MON390 CONFIGURATION FOR DALLAS CONTIGIOUS MODE
; COPYRIGHT KEIL ELEKTRONIK GmbH 2001 - 2002 *
;
;------------------------------------------------------------------------------
;
; Chip Specific Options (MCON needs to be set before ACON)
; ========================================================
;
; IDM1, IDM0: Internal Data Memory Configuration Bits (MCON.7, MCON.6)
IDM EQU 0 ; 0 = 4KB on-chip SRAM location X:0x00F000 - X:0x00FFFF
; ; 1 = 4KB on-chip SRAM location X:0x000000 - X:0x000FFF
; ; 2 = 4KB on-chip SRAM location X:0x400000 - X:0x400FFF
; ; 3 = 4KB on-chip SRAM location X:0x400000 - X:0x400FFF
; and code memory C:0x400000 - C:0x400FFF
;
; CMA: CAN Data Memory Assignment (MCON.5)
CMA EQU 0 ; 0 = CAN0 X:0x00EE00 - X:0x00EEFF, CAN1 X:0x00EF00 - X:0x00EFFF
; 1 = CAN0 X:0x401000 - X:0x4010FF, CAN1 X:0x401100 - X:0x4011FF
;
;
; SA: Extend Stack Address Mode Enable (ACON.2)
SA EQU 0 ; 0 = 8051 compatible stack in IDATA memory
; ; 1 = Use 1KB stack in on-chip XDATA space
;
;
; Port 4 Function Control (P4CNT)
; ===============================
; Port 4 Pin Function (P4CNT.2-0)
P4PF EQU 7 ; 0 : all pin used as I/O pin (P4.0 - P4.3)
; ; 4 : P4.0 is CE0
; ; 5 : P4.0 is CE0, P4.1 is CE1
; ; 6 : P4.0 is CE0, P4.1 is CE1, P4.2 is CE2
; ; 7 : P4.0 is CE0, P4.1 is CE1, P4.2 is CE2, P4.3 is CE3
;
; Program Memory Chip Enable Window Size (P4CNT.5-3)
PCES EQU 6 ; 0 = 32KB address window (0 - 0x7FFF)
; ; 4 = 128KB address window (0 - 0x1FFFF)
; ; 5 = 256KB address window (0 - 0x3FFFF)
; ; 6 = 512KB address window (0 - 0x7FFFF)
; ; 7 = 1MB address window (0 - 0xFFFFF)
;
; PDCE3 .. PDCE0: Program/Data Chip Enable (MCON.3, MCON.2, MCON.1, MCON.0)
; refer to the Dallas Data Sheet for more information
PDCE3 EQU 0
PDCE2 EQU 0
PDCE1 EQU 0
PDCE0 EQU 1
;
;
;------------------------------------------------------------------------------
; Serial interface settings
;
$SET (SERIAL = 0) ; 0 = use SERIAL PORT0 for Monitor Communcation
; 1 = use SERIAL PORT1 for Monitor Communcation
;
;------------------------------------------------------------------------------
; Memory Mapping
;
; Monitor Code and Data Memory
MON_CODE_START EQU 0000000H ; start address of Monitor code area in CODE memory
MON_RAM_START EQU 001FFE0H ; start address of Monitor data area in XDATA memory
; User Code Memory (von-Neumann mapped)
CODE_RAM_START EQU 0001000H ; start address of user CODE space in XDATA memory
; (von Neumann mapping)
INT_ADR_OFF EQU 0001000H ; Interrupt Vector Offset if MON390 is installed at
; address 0000H
CODE_RAM_END EQU 001EFFFH ; end address of user CODE space in XDATA memory
;------------------------------------------------------------------------------
;
; Extended Stack Mapping
STK_BASE0 EQU 000DC00H ; Stack Start for: IDM1=0, IDM0=0
STK_BASE1 EQU 0002000H ; Stack Start for: IDM1=0, IDM0=1
STK_BASE2 EQU 0FFDC00H ; Stack Start for: IDM1=1, IDM0=0
STK_BASE3 EQU 0FFDC00H ; Stack Start for: IDM1=1, IDM0=1 (invalid)
;
;------------------------------------------------------------------------------
NAME CONFIG
PUBLIC RECEIVEBYTE ; CHARACTER INPUT-ROUTINE
PUBLIC SENDBYTE ; CHARACTER OUTPUT-ROUTINE
PUBLIC SENDCHECK ; CHECK OUTPUT STATUS OF SERIAL INTERFACE
PUBLIC SERINT_ENABLE ; ENABLE SERIAL INTERRUPT
PUBLIC SERINT_DISABLE ; DISABLE SERIAL INTERRUPT
PUBLIC IDENT_STRING ; IDENTIFIER STRING
PUBLIC INT_ADR_OFF ; OFFSET FOR INTERRUPT VECTORS
PUBLIC SER_INT_OFF ; ADDRESS OFFSET OF SERIAL INTERRUPT VECTOR
PUBLIC CODE_RAM_START ; USER CODE START
PUBLIC CODE_RAM_END ; USER CODE END
PUBLIC MON_CODE_START ; MON390 CODE START
PUBLIC BEFORE_GO ; DO SOME THINGS BEFORE STARTING USER PROGRAM
PUBLIC AFTER_GO ; DO SOME THINGS AFTER TERMINATION OF USER PROGRAM
PUBLIC WR_CODE ; WRITE CODE BYTE
PUBLIC WR_XDATA ; WRITE XDATA BYTE
PUBLIC STK_BASE ; RETURN EXTENDED STACK BASE (DEVICE DEPENDANT)
EXTRN ECODE:FAR (MONSTART) ; START OF MONITOR-51
EXTRN ECODE:FAR (MONBREAK) ; BREAK RESTART OF MONITOR-251
EXTRN ECODE:FAR (SERBREAK) ; SERIAL INTERRUPT ENTRY OF MONITOR-251
SINTENABLE LIT '(MONDATA+ 30)'
; SFR SYMBOLS
TMOD DATA 89H
TH1 DATA 8DH
SCON0 DATA 98H
CKCON DATA 8EH
TCON DATA 88H
TR1 BIT 8EH
SBUF DATA 99H
TI BIT 99H
RI BIT 98H
ACC DATA 0E0H
ES BIT 0ACH
EX0 BIT 0A8H
PSW1 DATA 0D1H
PCON DATA 087H
EA BIT 0AFH
IPH0 DATA 0B7H
IPL0 DATA 0B8H
P1 DATA 090H
sfr ACON = 0x9D
sfr TA = 0xC7
sfr MCON = 0xC6
sfr P4CNT = 0x92
FILLGAP MACRO
NOP
NOP
NOP
NOP
ENDM
?PR?INITSEG SEGMENT ECODE AT MON_CODE_START
RSEG ?PR?INITSEG
DB 02H ; LJMP in Classic 8051 Mode
DW WORD0 STARTUP1
LJMP INT_ADR_OFF + 03H
FILLGAP
LJMP INT_ADR_OFF + 0BH
FILLGAP
LJMP INT_ADR_OFF + 13H
FILLGAP
LJMP INT_ADR_OFF + 1BH
FILLGAP
$IF (SERIAL = 0 OR SERIAL = 1 OR SERIAL = 2)
SER_INT_OFF EQU 23H ; OFFSET OF SERIAL INTERRUPT VECTOR
LJMP SERBREAK ; On-chip UART Device Interrupt
$ELSE
LJMP INT_ADR_OFF + 23H
$ENDIF
FILLGAP
LJMP INT_ADR_OFF + 2BH
FILLGAP
LJMP INT_ADR_OFF + 33H
FILLGAP
LJMP INT_ADR_OFF + 3BH
FILLGAP
LJMP INT_ADR_OFF + 43H
FILLGAP
LJMP INT_ADR_OFF + 4BH
FILLGAP
LJMP INT_ADR_OFF + 53H
FILLGAP
LJMP INT_ADR_OFF + 5BH
FILLGAP
LJMP INT_ADR_OFF + 63H
FILLGAP
LJMP INT_ADR_OFF + 6BH
FILLGAP
LJMP INT_ADR_OFF + 73H
FILLGAP
LJMP INT_ADR_OFF + 7BH
FILLGAP
LJMP INT_ADR_OFF + 83H
FILLGAP
LJMP INT_ADR_OFF + 8BH
FILLGAP
LJMP INT_ADR_OFF + 93H
FILLGAP
LJMP INT_ADR_OFF + 9BH
FILLGAP
LJMP INT_ADR_OFF + 0A3H
FILLGAP
LJMP INT_ADR_OFF + 0ABH
FILLGAP
LJMP INT_ADR_OFF + 0B3H
FILLGAP
LJMP INT_ADR_OFF + 0BBH
FILLGAP
LJMP INT_ADR_OFF + 0C3H
FILLGAP
LJMP INT_ADR_OFF + 0CBH
FILLGAP
LJMP INT_ADR_OFF + 0D3H
FILLGAP
LJMP INT_ADR_OFF + 0DBH
FILLGAP
LJMP INT_ADR_OFF + 0E3H
FILLGAP
LJMP INT_ADR_OFF + 0F3H
FILLGAP
LJMP INT_ADR_OFF + 0FBH
STARTUP1: MOV TA,#0xAA ; Enable access to MCON
MOV TA,#0x55
MCON_VAL SET (IDM SHL 6) OR (CMA SHL 5) OR (PDCE3 SHL 3) OR (PDCE2 SHL 2)
MCON_VAL SET MCON_VAL OR (PDCE1 SHL 1) OR (PDCE0)
MOV MCON,#MCON_VAL
MOV TA,#0xAA ; Enable access to ACON
MOV TA,#0x55
ACON_VAL EQU (2 OR (SA SHL 2)) ; 22-bit contigious mode, SA bit
MOV ACON,#ACON_VAL
; Set Port 4 Function Control (P4CNT)
P4_VAL EQU P4PF OR (PCES SHL 3)
MOV P4CNT,#P4_VAL
MonitorStart: MOV R0,#0 ;Der Monitor meldet sich mit `n
MOV R1,#0
MOV A,#01H
Flashloop: MOV P1,A
RL A
FWait_State: NOP
NOP
NOP
DJNZ R0,FWait_State
DJNZ R1,FWait_State
RL A
ADD A,ACC
JNZ Flashloop
MOV P1,#0FFH
/*
* Work-Around for SerInit on int. S0 19200@40Mhz
*/
LJMP InitSerial
;---- Setup for Serial Interfaces.
$IF (SERIAL = 0)
;********************************************************************
;* Using TIMER 1 to Generate Baud Rates *
;* Oscillator frequency = 40.000 MHz *
;* Set Baudrate to 38400 Baud *
;********************************************************************
InitSerial: ORL PCON, #080H
MOV SCON0,#050H
ORL TMOD, #021H
MOV TH1, #0F8H
ORL CKCON,#010H
MOV TCON, #050H
ORL SCON0,#002H
JMP MONSTART
IDENT_STRING: DB 'MONITOR-390 USING TIMER 1 FOR BAUDRATES',0
$ENDIF
$IF (SERIAL = 1)
;********************************************************************
;* Using TIMER 2 to Generate Baud Rates *
;********************************************************************
RCAP2L DATA 0CAH
RCAP2H DATA 0CBH
T2CON DATA 0C8H
RCAPVAL EQU (65536 - ((XTAL / BAUDRATE)/16))
InitSerial: LABEL FAR
LJMP Next
Next: MOV T2CON,#30H
MOV RCAP2H,#HIGH (RCAPVAL)
MOV RCAP2L,#LOW (RCAPVAL)
SETB T2CON.2 ; start timer
MOV SCON,#01011010B ; Init Serial Interface
LJMP MONSTART
IDENT_STRING: DB 'MONITOR-390 USING TIMER 2 FOR BAUDRATES',0
$ENDIF
$IF (SERIAL = 0 OR SERIAL = 1)
;********************************************************************
;* Interface via standard on-chip UART *
;********************************************************************
SENDBYTE PROC NEAR
ORL P1,#1
CLR TI ; Only A & PSW can be destroyed!
MOV SBUF,A
ORL P1,#1
RET
ENDP
SENDCHECK PROC NEAR
JNB TI,$ ; Only A & PSW can be destroyed!
RET
ENDP
RECEIVEBYTE PROC NEAR
ORL P1,#2
JNB RI,$ ; Only A & PSW can be destroyed!
MOV A,SBUF
CLR RI
ORL P1,#2
RET
ENDP
SERINT_ENABLE PROC NEAR
CLR TI ; No Transmitter Interrupt yet
SETB ES ; Enable Serial Interrupt
RET
ENDP
SERINT_DISABLE PROC NEAR
CLR ES ; Disable Serial Interrupt
SETB TI ; Set Transmitter Interrupt Flag
RET
ENDP
$ENDIF
;-----------------------------------------------------------------------------
BEFORE_GO: ; this code is executed before a
RET ; a go or proc step is executed
AFTER_GO: ; this code is executed after a go
RET ; command (when a breakpoint was set)
WR_XDATA: MOVX @DPTR,A ; insert different code here, but
RET ; do not change any other register
; without saving it
WR_CODE: MOVX @DPTR,A ; insert different code here, but
RET ; do not change any other register
; without saving it
STK_BASE: ; RETURN STACK BASE (DEVICE DEPENDANT)
MOV A,MCON
ANL A,#0C0H
CJNE A,#000H,N_STK_BASE0
MOV R1,#BYTE0 STK_BASE0 ; IDM1=0, IDM0=0
MOV R2,#BYTE1 STK_BASE0
MOV R3,#BYTE2 STK_BASE0
RET
N_STK_BASE0: CJNE A,#040H,N_STK_BASE1
MOV R1,#BYTE0 STK_BASE1 ; IDM1=0, IDM0=1
MOV R2,#BYTE1 STK_BASE1
MOV R3,#BYTE2 STK_BASE1
RET
N_STK_BASE1: CJNE A,#040H,N_STK_BASE2
MOV R1,#BYTE0 STK_BASE2 ; IDM1=1, IDM0=0
MOV R2,#BYTE1 STK_BASE2
MOV R3,#BYTE2 STK_BASE2
RET
N_STK_BASE2: MOV R1,#BYTE0 STK_BASE3 ; IDM1=1, IDM0=1
MOV R2,#BYTE1 STK_BASE3
MOV R3,#BYTE2 STK_BASE3
RET
;-----------------------------------------------------------------------------
PUBLIC MONDATA
?FD?MON_DATA SEGMENT HDATA AT MON_RAM_START
RSEG ?FD?MON_DATA
MONDATA: DS 32 ; Monitor data area; DO NOT CHANGE SIZE
MONDATA_CODE EQU MON_RAM_START
PUBLIC MONDATA_CODE
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -