📄 inst166.a66
字号:
$TITLE ('Configuration for MONITOR-166 (C) 1994 KEIL')
$SEGMENTED
ASSUME DPP3:SYSTEM
;***********************************************************************
;* *
;* MONITOR 80C166 Configuration *
;* COPYRIGHT KEIL ELEKTRONIK GmbH 1994 - 1999 *
;* *
;***********************************************************************
;***********************************************************************
; Definitions for MONITOR 8xC166 Configuration:
;
%SET(BRK_T_ADR,2) ; Trap which is used for Breakpoints
; ; 2 = NMI Trap (default)
;
;
;
$IF BOOTSTRAP
$SET (SERIAL0)
$ENDIF
; Definitions for SYSCON Register (System Configuration):
; -------------------------------------------------------
$INCLUDE(CONFIG.INC)
INT_ADR_SEG EQU %VECTAB >> 16 ; Interrupt Vector offset if MONITOR 166
INT_ADR_OFF EQU %VECTAB AND 0FFFFH ; is installed at address 0000H
%*DEFINE (ADDR (Val, Start, Range)) (
%SET (adr, %SUBSTR(%Start,1,(%LEN(%Start)- 3))%SUBSTR(%Start,%LEN(%Start),1))
%IF (%EQS (%Range,2K)) THEN (%SET (adr, (%adr AND 0FFF8H) + 0)) FI
%IF (%EQS (%Range,16K)) THEN (%SET (adr, (%adr AND 0FFC0H) + 1)) FI
%IF (%EQS (%Range,32K)) THEN (%SET (adr, (%adr AND 0FF80H) + 2)) FI
%IF (%EQS (%Range,64K)) THEN (%SET (adr, (%adr AND 0FF00H) + 3)) FI
%IF (%EQS (%Range,128K)) THEN (%SET (adr, (%adr AND 0FE00H) + 4)) FI
%Val EQU %adr
)
; Setup SYSCON Register
SYS_L SET (_MTTC << 5) OR (_RWDC << 4) OR ((NOT _MCTC) AND 0FH)
SYS_L SET SYS_L AND (NOT (_RDYEN << 2))
SYS_L SET SYS_L OR (_RDY_AS << 2)
SYS_H SET (_STKSZ << 5) OR (_RDYEN << 4) OR (_SGTDIS << 3)
SYS_H SET SYS_H OR (_BYTDIS << 1) OR _CLKEN
$IF (BTYP_ENABLE == 1)
SYS_L SET SYS_L OR (_BTYP << 6)
SYS_H SET SYS_H OR (_BUSACT << 2)
$ENDIF
; Public Functions
PUBLIC INCHAR ; CHARACTER INPUT-ROUTINE
PUBLIC OUTCHAR ; CHARACTER OUTPUT-ROUTINE
PUBLIC INSTAT ; INPUT STATUS OF SERIAL INTERFACE
PUBLIC OUTSTAT ; OUTPUT STATUS OF SERIAL INTERFACE
PUBLIC CLR_TI ; CLEAR SERIAL TRANSMIT INTERRUPT FLAG
PUBLIC SET_TI ; SET SERIAL TRANSMIT INTERRUPT FLAG
PUBLIC CLR_RI ; CLEAR SERIAL RECEIVE INTERRUPT FLAG
PUBLIC CLR_SER_IE ; CLEAR SERIAL INTERRUPT ENABLE FLAG
PUBLIC SET_SER_IE ; SET SERIAL INTERRUPT ENABLE FLAG
PUBLIC RD_RIE ; READ RECEIVE INTERRUPT ENABLE FLAG
PUBLIC RD_TIE ; READ TRANSMIT INTERRUPT ENABLE FLAG
PUBLIC WR_RIE ; WRITE RECEIVE INTERRUPT ENABLE FLAG
PUBLIC WR_TIE ; WRITE TRANSMIT INTERRUPT ENABLE FLAG
PUBLIC WR_RIR ; WRITE RECEIVE INTERRUPT REQUEST FLAG
PUBLIC WR_TIR ; WRITE TRANSMIT INTERRUPT REQUEST FLAG
PUBLIC BEFORE_GO ; THIS FUNCTION IS CALLED BEFORE A GO COMMAND
PUBLIC AFTER_GO ; THIS FUNCTION IS CALLED AFTER A GO COMMAND
PUBLIC CODE_START_ADR ; Code Start Address
PUBLIC DATA_START_ADR ; Data Start Address
PUBLIC RESET_ADR ; Reset IP value
; Public data and numbers
PUBLIC BRK_TRAP ; TRAP WHICH IS USED FOR BREAKPOINTS
PUBLIC SER_INT_TRAP ; TRAP WHICH IS USED FOR SERIAL RECEPTION
PUBLIC SER_INT_JMP
EXTERN MON166 :NEAR ; START OF MONITOR-166
EXTERN BRKP :NEAR ; JUMP TO MONITOR AFTER A BREAKPOINT IS REACHED
EXTERN SER_ISR:NEAR ; SERIAL INTERRUPT SERVICE ROUTINE
$IF (SERIAL0)
SER_INT_TRAP EQU 2BH ; Trap which is used for serial reception
$ENDIF
$IF (SERIAL1)
SER_INT_TRAP EQU 2EH ; Trap which is used for serial reception
$ENDIF
$IF (SERIAL2)
SER_INT_TRAP EQU 00H ; Trap which is used for serial reception
$ENDIF
CODE_START_ADR EQU %CODE_START ; Code Start Address
DATA_START_ADR EQU %DATA_START ; Data Start Address
BRK_TRAP EQU %BRK_T_ADR ; Trap which is used for Breakpoints
IF (%CODE_START = 0)
RESET_ADR EQU %VECTAB ; RESET IP value
ELSE
RESET_ADR EQU 0
ENDIF
MON166_DATA_START SECTION DATA AT %DATA_START 'M_DATA'
MON166_DATA_START ENDS
$IF SERIAL2
MON166_W_DATA SECTION DATA WORD PUBLIC 'M_DATA'
C_VAR1 DSW 1
C_VAR2 DSW 1
C_VAR3 DSW 1
MON166_W_DATA ENDS
$ENDIF
INIT_CODE SECTION CODE AT %CODE_START
INITSEC PROC NEAR
JMP FAR InitSerial
$IF (SERIAL0)
%IF (%CODE_START EQ 0) THEN (
%SET(COUNT,4) ; SET UP INTERRUPT TABLE
%WHILE(%COUNT LE 01FCH)
(%IF (%COUNT EQ (%BRK_T_ADR*4)) THEN (JMP FAR BRKP
) ELSE (%IF (%COUNT EQ (2BH*4)) THEN (JMP FAR SER_ISR
) ELSE (JMPS INT_ADR_SEG,INT_ADR_OFF + %COUNT ) FI ) FI
%SET(COUNT,%COUNT + 4)
)
) FI
$ENDIF
$IF (SERIAL1)
%IF (%CODE_START EQ 0) THEN (
%SET(COUNT,4) ; SET UP INTERRUPT TABLE
%WHILE(%COUNT LE 01FCH)
(%IF (%COUNT EQ (%BRK_T_ADR*4)) THEN (JMP FAR BRKP
) ELSE (%IF (%COUNT EQ (2EH*4)) THEN (JMP FAR SER_ISR
) ELSE (JMPS INT_ADR_SEG,INT_ADR_OFF + %COUNT ) FI ) FI
%SET(COUNT,%COUNT + 4)
)
) FI
$ENDIF
$IF (SERIAL2)
%IF (%CODE_START EQ 0) THEN (
%SET(COUNT,4) ; SET UP INTERRUPT TABLE
%WHILE(%COUNT LE 01FCH)
(%IF (%COUNT EQ (%BRK_T_ADR*4)) THEN (JMP FAR BRKP
) ELSE (JMPS INT_ADR_SEG,INT_ADR_OFF + %COUNT ) FI
%SET(COUNT,%COUNT + 4)
)
) FI
$ENDIF
SER_INT_JMP: JMPS INT_ADR_SEG,(INT_ADR_OFF + SER_INT_TRAP*4)
INITSEC ENDP
INSTALLCODE PROC NEAR
InitSerial:
$IF NOT (BOOTSTRAP) ; skip initialization when using bootstrap loader
$IF PROMCHECK
;********************************************************************
;* Check whether a PROM or a RAM is at Address 0. *
;* If a PROM is detected -> Jump to Program in PROM (Address 0) *
;* If a RAM is detected -> Jump to Monitor *
;********************************************************************
MOV DPP0,#0 ; Check if PROM in System
MOV R0,#0
MOV R1,[R0]
CPL R1
MOV [R0],R1
CMP R1,[R0]
JMP CC_EQ,Ram
JMPS 0,0
Ram: CPL R1
MOV [R0],R1
$ENDIF
DISWDT
$IF (BTYP_ENABLE == 0)
BFLDL SYSCON,#03FH,#SYS_L
BFLDH SYSCON,#07BH,#SYS_H
$ELSE
BFLDL SYSCON,#0FFH,#SYS_L
BFLDH SYSCON,#07FH,#SYS_H
$ENDIF
$IF (BUSCON1 = 1)
BCON1 SET (_MTTC1 << 5) OR (_RWDC1 << 4)
BCON1 SET BCON1 OR ((NOT _MCTC1) AND 0FH)
BCON1 SET BCON1 AND (NOT (_RDYEN1 << 3))
BCON1 SET BCON1 OR (_RDY_AS << 3) OR (_BTYP1 << 6)
BCON1 SET BCON1 OR (_ALECTL1 << 9) OR (_BUSACT1 << 10)
BCON1 SET BCON1 OR (_RDYEN1 << 12)
%ADDR (ADDR1,%ADDRESS1,%RANGE1)
MOV ADDRSEL1,#ADDR1
MOV BUSCON1,#BCON1
$ENDIF
BSET P3.13 ; ENABLE WR/ OUTPUT
BSET DP3.13
EINIT
$ENDIF
$IF SERIAL0
;********************************************************************
;* Initialization of Serial Interface 0 *
;********************************************************************
$IF NOT (BOOTSTRAP) ; skip initialization when using bootstrap loader
BSET P3.10 ; SET PORT 3.10 OUTPUT LATCH (TXD)
BSET DP3.10 ; SET PORT 3.10 DIRECTION CONTROL (TXD OUTPUT)
BCLR DP3.11 ; RESET PORT 3.11 DIRECTION CONTROL (RXD INPUT)
MOVB S0TIC,#080H ; SET TRANSMIT INTERRUPT FLAG
MOVB S0RIC,#000H ; DELETE RECEIVE INTERRUPT FLAG
IF (BAUDRATE = 0)
; Auto adjust Baudrate
WStrtB:
JB P3.11,WStrtB ; wait for start bit at RXD0
BSET T3R ; start timer T3
WStpB: JNB P3.11,WStpB ; wait for stop bit at RXD0
BCLR T3R ; stop timer T3
MOV MDL,T3
SUB MDL,#18 ; rounding & adjustment
MOV R1,#36 ; baudrate = (T3 / 36) - 1
DIVU R1
MOV S0BG,MDL ; load baudrate generator
MOV S0CON,#8011H ; SET SERIAL MODE
MOV T3,#0 ; Clear timer 3 register
MOV S0TBUF,#0FFH ; Send acknoledge byte for monitor
ELSE
; Fixed Baudrate
BG_RLOAD EQU (CPU_CLOCK / (32 * BAUDRATE)) - 1
MOV S0BG ,#BG_RLOAD ; SET BAUDRATE
MOV S0CON,#8011H ; SET SERIAL MODE
ENDIF
$ENDIF
JMP CC_UC,MON166
;********************************************************************
;* Basic Input Output Functions for serial Interface 0 *
;********************************************************************
INSTAT: BMOV R4.0,S0RIR ; INPUT STATUS OF SERIAL INTERFACE
RET
OUTSTAT: BMOV R4.0,S0TIR ; OUTPUT STATUS OF SERIAL INTERFACE
RET
INCHAR: MOV R4,S0RBUF ; CHARACTER INPUT-ROUTINE
RET
OUTCHAR: MOV S0TBUF,R4 ; CHARACTER OUTPUT-ROUTINE
RET
CLR_TI: BCLR S0TIR ; CLEAR SERIAL TRANSMIT INTERRUPT FLAG
RET
SET_TI: BSET S0TIR ; SET SERIAL TRANSMIT INTERRUPT FLAG
RET
CLR_RI: BCLR S0RIR ; CLEAR SERIAL RECEIVE INTERRUPT FLAG
RET
CLR_SER_IE: MOV S0RIC,#0000 ; CLR S0RIE AND ILVL=0
RET
SET_SER_IE: MOV S0RIC,#007CH ; SET S0RIE AND ILVL=15
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -