📄 inst167.a66
字号:
$TITLE ('Configuration for MONITOR-167 (C) 1993 KEIL')
$SEGMENTED
$MOD167
$INCLUDE(REG167.INC)
ASSUME DPP3:SYSTEM
;***********************************************************************
;* *
;* MONITOR C167 Configuration *
;* COPYRIGHT KEIL ELEKTRONIK GmbH 1993 - 1999 *
;* *
;* 27.11.00 A. Lichte: MUX / DEMUX Anpassung *
;* Initialisierung Reset Vektor *
;* Baudratenanpassung optimiert *
;* 25.01.01 A. Lichte: Korrektur der Baudratenkalibrierung der *
;* Software-Schnittstelle *
;* Gemeinsame Sourcen f黵 alle Monitore *
;* 05.11.01 A. Lichte: Anpassung an C165 UTAH + 36 MHz CPU *
;***********************************************************************
$IF RUN_FLASH
MONBCON EQU BUSCON0 ; BUSCON0 for ROM Monitor; BUSCON1 for RAM-Monitor
$ENDIF
$IF RUN_RAM
MONBCON EQU BUSCON1 ; BUSCON0 for ROM Monitor; BUSCON1 for RAM-Monitor
$ENDIF
; Erweiterungen f黵 C165UTAH
S0FDV DEFR 0xFEB6
S0PWM DEFR 0xFEAA
S0CLC DEFR 0xFFBA
ABS0CON DEFR 0xFEF8
ABSTAT DEFR 0xFEFE
; Definitions for MONITOR 167 Configuration:
;
%SET(BRK_T_ADR,2) ; Trap which is used for Breakpoints
; ; 2 = NMI Trap (default)
;
;
;
$IF BOOTSTRAP
$SET (SERIAL0)
$ENDIF
; Definitions for SYSCON and BUSCON0 Register:
; --------------------------------------------
$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,4K)) THEN (%SET (adr, (%adr AND 0FFF0H) + 0)) FI
%IF (%EQS (%Range,8K)) THEN (%SET (adr, (%adr AND 0FFE0H) + 1)) FI
%IF (%EQS (%Range,16K)) THEN (%SET (adr, (%adr AND 0FFC0H) + 2)) FI
%IF (%EQS (%Range,32K)) THEN (%SET (adr, (%adr AND 0FF80H) + 3)) FI
%IF (%EQS (%Range,64K)) THEN (%SET (adr, (%adr AND 0FF00H) + 4)) FI
%IF (%EQS (%Range,128K)) THEN (%SET (adr, (%adr AND 0FE00H) + 5)) FI
%IF (%EQS (%Range,256K)) THEN (%SET (adr, (%adr AND 0FC00H) + 6)) FI
%IF (%EQS (%Range,512K)) THEN (%SET (adr, (%adr AND 0F800H) + 7)) FI
%IF (%EQS (%Range,1024K)) THEN (%SET (adr, (%adr AND 0F000H) + 8)) FI
%IF (%EQS (%Range,1M)) THEN (%SET (adr, (%adr AND 0F000H) + 8)) FI
%IF (%EQS (%Range,2048K)) THEN (%SET (adr, (%adr AND 0E000H) + 9)) FI
%IF (%EQS (%Range,2M)) THEN (%SET (adr, (%adr AND 0E000H) + 9)) FI
%IF (%EQS (%Range,4096K)) THEN (%SET (adr, (%adr AND 0C000H) +10)) FI
%IF (%EQS (%Range,4M)) THEN (%SET (adr, (%adr AND 0C000H) +10)) FI
%IF (%EQS (%Range,8192K)) THEN (%SET (adr, (%adr AND 08000H) +11)) FI
%IF (%EQS (%Range,8M)) THEN (%SET (adr, (%adr AND 08000H) +11)) FI
%Val EQU %adr
)
_STKSZ SET 0
_STKSZ1 SET 0 ; size is 512 Words
$IF (STK_SIZE = 0)
_STKSZ1 SET 1 ; size is 256 Words
$ENDIF
$IF (STK_SIZE = 1)
_STKSZ SET 1
_STKSZ1 SET 2 ; size is 128 Words
$ENDIF
$IF (STK_SIZE = 2)
_STKSZ SET 2
_STKSZ1 SET 3 ; size is 64 Words
$ENDIF
$IF (STK_SIZE = 3)
_STKSZ SET 3
_STKSZ1 SET 4 ; size is 32 Words
$ENDIF
$IF (STK_SIZE = 4)
_STKSZ SET 4
$ENDIF
$IF (STK_SIZE = 5)
_STKSZ SET 5
$ENDIF
$IF (STK_SIZE = 6)
_STKSZ SET 6
$ENDIF
$IF (STK_SIZE = 7)
_STKSZ SET 7
$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
BRK_TRAP EQU %BRK_T_ADR ; Trap which is used for Breakpoints
CODE_START_ADR EQU %CODE_START ; Code Start Address
DATA_START_ADR EQU %DATA_START ; Data Start Address
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
; Start Monitor after Reset from ROM:
; -----------------------------------
STARTSEC SECTION CODE AT 0
STARTPROC PROC FAR
JMP FAR INITSEC
STARTPROC ENDP
STARTSEC ENDS
INIT_CODE SECTION CODE AT %CODE_START
INITSEC PROC NEAR
;INITSEC PROC TASK C_STARTUP INTNO RESET = 0
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 (INIT_XPERCON = 1)
; Improtant XPERCON must be set before SYSCON.XPEN is enabled
XPERCON DEFR 0F024H
_V_XPERCON SET _V_CAN1 OR (_V_CAN2 << 1) OR (_V_XRAM2 << 10)
_V_XPERCON SET _V_XPERCON OR (_V_XRAM6 << 11) OR (_V_XFLASH << 14)
EXTR #1
MOV XPERCON,#_V_XPERCON
$ENDIF
BCON0L SET (_MTTC0 << 5) OR (_RWDC0 << 4)
BCON0L SET BCON0L OR ((NOT _MCTC0) AND 0FH)
BCON0L SET BCON0L AND (NOT (_RDYEN0 << 3))
BCON0L SET BCON0L OR (_RDY_AS0 << 3)
BCON0H SET (_ALECTL0 << 1) OR (_RDYEN0 << 4)
BCON0H SET BCON0H OR (_CSREN0 << 6) OR (_CSWEN0 << 7)
$IF (BTYP_ENABLE == 1)
BCON0L SET BCON0L OR (_BTYP0 << 6)
BCON0H SET BCON0H OR (_BUSACT0 << 2)
$ENDIF
$IF (BTYP_ENABLE == 0)
BFLDL BUSCON0,#03FH,#BCON0L
BFLDH BUSCON0,#0D2H,#BCON0H
$ELSE
BFLDL BUSCON0,#0FFH,#BCON0L
BFLDH BUSCON0,#0D6H,#BCON0H
$ENDIF
SYS_BITS SET 0FF6FH
SYS_H SET (_STKSZ << 5) OR (_ROMS1 << 4) OR (_SGTDIS << 3)
SYS_H SET SYS_H OR (_ROMEN << 2) OR (_BYTDIS << 1) OR _CLKEN
SYS_L SET _XPERSHARE OR (_VISIBLE << 1) OR (_XPEN << 2)
SYS_L SET SYS_L OR (_BDRSTEN << 3)
SYS_L SET SYS_L OR (_PWDCFG << 5) OR (_CSCFG << 6)
$IF (WRCFG_ENABLE == 1)
SYS_L SET SYS_L OR (_WRCFG << 7)
SYS_BITS SET SYS_BITS OR 00080H
$ENDIF
$IF (OWDDIS_ENABLE == 1)
SYS_L SET SYS_L OR (_OWDDIS << 4)
SYS_BITS SET SYS_BITS OR 00010H
$ENDIF
; Setup SYSCON Register
BFLDH SYSCON,#HIGH SYS_BITS,#SYS_H
BFLDL SYSCON,#LOW SYS_BITS,#SYS_L
;
$IF (ADVANCED_SYSCON = 1)
SYS_2 SET (_PDCON << 4) OR (_RTS << 6) OR (_SCS << 7)
SYS_2 SET SYS_2 OR (_CLKCON << 8) OR (_CLKREL << 10)
SYS_3 SET _ADCDIS OR (_ASC0DIS << 1) OR (_SSCDIS << 2)
SYS_3 SET SYS_3 OR (_GPTDIS << 3)
SYS_3 SET SYS_3 OR (_FMDIS << 5) OR (_CC1DIS << 6) OR (_CC2DIS << 7)
SYS_3 SET SYS_3 OR (_CC6DIS << 8) OR (_PWMDIS << 9)
SYS_3 SET SYS_3 OR (_ASC1DIS << 10) OR (_I2CDIS << 11)
SYS_3 SET SYS_3 OR (_CAN1DIS << 13) OR (_CAN2DIS << 14)
SYS_3 SET SYS_3 OR (_PCDDIS << 15)
EXTR #2
MOV SYSCON2,#SYS_2
MOV SYSCON3,#SYS_3
$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_AS1 << 3) OR (_BTYP1 << 6)
BCON1 SET BCON1 OR (_ALECTL1 << 9) OR (_BUSACT1 << 10)
BCON1 SET BCON1 OR (_RDYEN1 << 12) OR (_CSREN1 << 14)
BCON1 SET BCON1 OR (_CSWEN1 << 15)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -