⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inst167.a66

📁 TQ公司的STK16x开发系统的源码
💻 A66
📖 第 1 页 / 共 2 页
字号:
$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           *
;***********************************************************************

$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

; 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)

%ADDR (ADDR1,%ADDRESS1,%RANGE1)
$IF (RUN_FLASH)     ; ADDRSEL1 wegen Bug im C167 nicht reinitialisieren, wenn Betrieb im RAM
		MOV	ADDRSEL1,#ADDR1 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -