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

📄 instphy7.a66

📁 keilc pic的版本 才搞到的 希望对大家有帮助
💻 A66
字号:
$TITLE ('Configuration for MONITOR-167   (C) 1993 KEIL')
$SEGMENTED
$MOD167
$INCLUDE(REG167.INC)
ASSUME	DPP3:SYSTEM
$INCLUDE(MONITOR.INC)
;***********************************************************************
;*                                                                     *
;* MONITOR 80C167  Configuration                                       *
;* COPYRIGHT KEIL ELEKTRONIK GmbH 1993                                 *
;*                                                                     *
;***********************************************************************
;***********************************************************************
; Definitions for MONITOR 80167  Configuration:
; 
%SET(BRK_T_ADR,2)		; Trap which is used for Breakpoints
;				; 2 = NMI Trap (default)
;
INT_ADR_SEG	EQU	4	; Interrupt Vector offset if MONITOR 166
INT_ADR_OFF	EQU	0000H	; is installed at address 0000H
;
;
; Definitions for SYSCON and BUSCON0 Register:
; --------------------------------------------
$INCLUDE(CONFIG.INC)


; 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 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 (%SERIAL EQ 0) THEN ( %SET(SER_TRAP, 2BH) ) FI
%IF (%SERIAL EQ 1) THEN ( %SET(SER_TRAP, 2EH) ) FI
%IF (%SERIAL EQ 2) THEN ( %SET(SER_TRAP, 00H) ) FI

SER_INT_TRAP	EQU	%SER_TRAP   ; Trap which is used for serial reception
BRK_TRAP	EQU	%BRK_T_ADR  ; Trap which is used for Breakpoints


%IF (%SERIAL EQ 2) THEN (
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
)FI

INIT_CODE	SECTION CODE
INITSEC		PROC	NEAR

		JMP	FAR InitSerial

%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 (%SER_TRAP*4)) THEN (JMP	FAR SER_ISR
    ) ELSE (JMPS	INT_ADR_SEG,INT_ADR_OFF + %COUNT ) FI ) FI
  %SET(COUNT,%COUNT + 4)
)

SER_INT_JMP:	JMPS	INT_ADR_SEG,(INT_ADR_OFF + SER_INT_TRAP*4)

INITSEC		ENDP


;********************************************************************
;* This Macro checks 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                         *
;********************************************************************
%*DEFINE (CHECKPROM) LOCAL ram (
  %IF (%PROMCHECK NE 0) THEN (
	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
  ) FI
)

INSTALLCODE	PROC	NEAR


InitSerial:	

$IF NOT (BOOTSTRAP)	; skip initialization when using bootstrap loader

	%CHECKPROM	; Check if PROM is at Address 0H
	DISWDT
$IF (BTYP_ENABLE == 0)
	BFLDL	BUSCON0,#03FH,#BCON0L
	BFLDH	BUSCON0,#012H,#BCON0H
$ELSE
	BFLDL	BUSCON0,#0FFH,#BCON0L
	BFLDH	BUSCON0,#016H,#BCON0H
$ENDIF
	BFLDH	SYSCON,#0FFH,#SYS_H
$IF (WRCFG_ENABLE == 1)
        BFLDL   SYSCON,#084H,#SYS_L
$ELSE
        BFLDL   SYSCON,#004H,#SYS_L
$ENDIF
; Initialization for BUSCON1-4 or ADDRSEL1-4 when additional RAM is 
; connected to CS1-4
; Example1:
;   2 *  4 MBit * 8 RAM's are connected to CS#1 (000000H - 0FFFFFH)
;   2 *  4 MBit * 8 RAM's are connected to CS#2 (100000H - 1FFFFFH)
;   ---> BUSCON1/2 and ADDRSEL1/2 must be initialized
	MOV	ADDRSEL1,#0008H	; 1MB from 0 up to 1MB
	MOV	BUSCON1,BUSCON0
	MOV	ADDRSEL2,#1008H	; 1MB from 1MB up to 2MB
	MOV	BUSCON1,BUSCON0
; Example2:
;   2 *  1 MBit * 8 RAM's are connected to CS#0 (00000H - 3FFFFH)
;   2 *  1 MBit * 8 RAM's are connected to CS#1 (40000H - 7FFFFH)
;   ---> BUSCON1 and ADDRSEL1 must be initialized
;	MOV	ADDRSEL1,#0406H	; 18 bit -> 256KB up to 512KB
;	MOV	BUSCON1,BUSCON0

	EINIT
$ENDIF

%IF (%SERIAL EQ 0) THEN (
;********************************************************************
;*  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
;	MOV	S0BG ,#003AH	; SET BAUDRATE TO 9600 BAUD  @ 18MHz (C167CW)
	MOV	S0BG ,#0040H	; SET BAUDRATE TO 9600 BAUD  @ 40MHz
;	MOV	S0BG ,#0020H	; SET BAUDRATE TO 19200 BAUD @ 40MHz
;	MOV	S0BG ,#000FH	; SET BAUDRATE TO 38400 BAUD @ 40MHz
;	MOV	S0BG ,#000AH	; SET BAUDRATE TO 57600 BAUD @ 40MHz
	MOV	S0CON,#8011H	; SET SERIAL MODE
$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

RD_RIE:		BMOV	R4.0,S0RIE	; READ RECEIVE INTERRUPT ENABLE FLAG
		RET

RD_TIE:		BMOV	R4.0,S0TIE	; READ TRANSMIT INTERRUPT ENABLE FLAG
		RET

WR_RIE:		BMOV	S0RIE,R4.0	; WRITE RECEIVE INTERRUPT ENABLE FLAG
		RET

WR_TIE:		BMOV	S0TIE,R4.0	; WRITE TRANSMIT INTERRUPT ENABLE FLAG
		RET

WR_RIR:		BMOV	S0RIR,R4.0	; WRITE RECEIVE INTERRUPT ENABLE FLAG
		RET

WR_TIR:		BMOV	S0TIR,R4.0	; WRITE TRANSMIT INTERRUPT ENABLE FLAG
		RET

BEFORE_GO:				; IS NOT USED
		RET

AFTER_GO:				; IS NOT USED
		RET
)FI


%IF (%SERIAL EQ 2) THEN (
;********************************************************************
;*  Initialization of simulated Serial Interface 2                  *
;********************************************************************

XTAL            EQU     40000000        ; Oszillator frequency = 5MHz with PLL
BAUDRATE        EQU     9600   ; Baudrate for serial transmission (max 38400)

T_LINE          BIT     P2.0            ; Transmit Data Line TxD
T_OUT           BIT     DP2.0           ; Port direction register for TxD
R_LINE          BIT     P2.1            ; Receive Data Line RxD
R_IN            BIT     DP2.1           ; Port direction register for RxD


STATES_PER_BIT	EQU	(XTAL / BAUDRATE) / 2

         	BSET    T_LINE          ;          
        	BSET    T_OUT           ; set TxD to output
        	BCLR    R_IN            ; set RxD to input
		CALL    AFTER_GO

		JMP	CC_UC,MON166


INSTAT:		BSET	R4.0		; INPUT STATUS OF SERIAL INTERFACE
		RET

OUTSTAT:	BSET	R4.0		; OUTPUT STATUS OF SERIAL INTERFACE
		RET




;*************** CHARACTER INPUT-ROUTINE ************************

INCHAR:		PUSH	R2		
                PUSH    R3
                MOV     R3,#8           ; Bit counter
              
STARTBIT:	BMOV	R2.0,R_LINE	; Wait for startbit ?
		JMPR	CC_NZ,STARTBIT	;
		MOV	R2,DPP0:C_VAR1	; Startbit valid, begin sampling !
WAIT1:   	SUB	R2,#1           ;
		JMPR	CC_NZ,WAIT1     ;  
RECEIVE:	BMOV	R4.8,R_LINE     ; Bit input
		SHR	R4,#1
		SUB	R3,#1
		JMPR	CC_Z,LASTBIT    ; Last bit ?

		MOV     R2,DPP0:C_VAR2  ; Sample period generation
WAIT2:		SUB	R2,#1
		JMPR	CC_NZ,WAIT2
		JMPR	CC_UC,RECEIVE

LASTBIT:        MOV	R2,DPP0:C_VAR2
		SHR	R2,#1
WAIT3:          SUB     R2,#1            
		JMPR	CC_NZ,WAIT3

                POP     R3              
		POP	R2
		RET



;*************** CHARACTER OUTPUT-ROUTINE *******************

OUTCHAR:	PUSH	R2
                PUSH    R3
                PUSH    R4
		OR	R4,#0100H	; Insert stopbit 
		SHL	R4,#1           ; Insert startbit
                MOV     R3,#10          ; Bit counter

NEXTBIT:	ASHR	R4,#1
		BMOV	T_LINE,C	; Bit output

		MOV	R2,DPP0:C_VAR3
WAIT:		SUB	R2,#1
		JMPR	CC_NZ,WAIT	; Baud rate generation

                SUB     R3,#1
                JMPR    CC_NZ,NEXTBIT   ; Last bit ? 

                POP     R4              ; Yes  
                POP     R3
		POP	R2
		RET

CLR_TI:		RET			; IS NOT USED

SET_TI:		RET			; IS NOT USED

CLR_RI:		RET			; IS NOT USED

CLR_SER_IE:	RET			; IS NOT USED

SET_SER_IE:	RET			; IS NOT USED

RD_RIE:		RET			; IS NOT USED

RD_TIE:		RET			; IS NOT USED

WR_RIE:		RET			; IS NOT USED

WR_TIE:		RET			; IS NOT USED

WR_RIR:		RET			; IS NOT USED

WR_TIR:		RET			; IS NOT USED

BEFORE_GO:	RET			; IS NOT USED


AFTER_GO:	MOV	DPP0,#PAG MON166_W_DATA
 		MOV	R1,DPP3:BUSCON0       ; Programmed number of waitstates
		AND	R1,#000FH         
		MOV	R2,#15
		SUB	R2,R1                 ; ACT = State times for one
		ADD	R2,#3                 ; external memory access
		MOV	R1,DPP3:BUSCON0
		SHR	R1,#5
		AND	R1,#0001H
		SUB	R2,R1
		JNB	BUSCON0.6,NMBUS
		ADD	R2,#1                 ; Multiplexed bus
 
NMBUS:		MOV	R3,#14                ; Non-multiplexed bus 
		JB	BUSCON0.7,BIT_16_1
		ADD	R3,#13                ; 8-Bit bus    (16 ACTs)
BIT_16_1:	MOV	R13,#STATES_PER_BIT   ; 16-Bit bus   (8  ACTs) 
		MUL	R3,R2                 ;
		SUB	R13,MDL
		SUB	R13,#4     
		SHR	R13,#2                ; Remaining states for loop
		MOV	DPP0:C_VAR2,R13

		MOV	R13,#STATES_PER_BIT   ; Multiply by 1.5
		MOV	R3,R13
		SHR	R3,#1
		ADD	R13,R3

		MOV	R3,#11
		JB	BUSCON0.7,BIT_16_2
		ADD	R3,#14;               ; 8-Bit Bus
BIT_16_2:	MUL	R3,R2
		SUB	R13,MDL
		SUB	R13,#2
		SHR	R13,#2
		MOV	DPP0:C_VAR1,R13

		MOV	R13,#STATES_PER_BIT
		MOV	R3,#13
		JB	BUSCON0.7,BIT_16_3
		ADD	R3,#10                ; 8-Bit Bus
BIT_16_3:	MUL	R3,R2
		SUB	R13,MDL
		SUB	R13,#4
		SHR	R13,#2
		MOV	DPP0:C_VAR3,R13		
		RET

)FI

INSTALLCODE	ENDP
INIT_CODE	ENDS

		END

⌨️ 快捷键说明

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