📄 instphy4.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 0 ; Interrupt Vector offset if MONITOR 166
INT_ADR_OFF EQU 8000H ; 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
BFLDL SYSCON,#080H,#SYS_L
; Initialization for BUSCON1-4 or ADDRSEL1-4 when additional RAM is
; connected to CS1-4
; Example1:
; 2 * 1 MBit * 8 EPROM's are connected to CS#0 (40000H - 7FFFFH)
; 2 * 1 MBit * 8 RAM's are connected to CS#1 (00000H - 3FFFFH)
; ---> BUSCON1 and ADDRSEL1 must be initialized
; MOV ADDRSEL1,#0007H ; 512KB RAM from 00000H - 7FFFFH, no FLASH
; 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 ; 256KB RAM from 40000H - 7FFFFH,
; 256KB FLASH from 00000H - 3FFFFH
; 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 ,#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
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 + -