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

📄 inst166.a66

📁 keilc pic的版本 才搞到的 希望对大家有帮助
💻 A66
📖 第 1 页 / 共 2 页
字号:
$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 + -