You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

193 lines
3.4 KiB

;
;==================================================================================================
; ASCI DRIVER (Z180 SERIAL PORTS)
;==================================================================================================
;
; CHARACTER DEVICE DRIVER ENTRY
; A: RESULT (OUT), CF=ERR
; B: FUNCTION (IN)
; C: CHARACTER (IN/OUT)
; E: DEVICE/UNIT (IN)
;
;
ASCI_DISPATCH:
LD A,C ; GET DEVICE/UNIT
AND $0F ; ISOLATE UNIT
JP Z,ASCI0
DEC A
JP Z,ASCI1
CALL PANIC
;
ASCI0:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JP Z,ASCI0_IN
DEC A
JP Z,ASCI0_OUT
DEC A
JP Z,ASCI0_IST
DEC A
JP Z,ASCI0_OST
CALL PANIC
;
;
;
ASCI_INIT:
; ASCI0
PRTS("ASCI0: IO=0x$")
LD A,CPU_TDR0
CALL PRTHEXBYTE
CALL PC_COMMA
LD A,CPU_RDR0
CALL PRTHEXBYTE
; PRTS(" BAUD=$")
; LD HL,ASCI0BAUD / 10
; CALL PRTDEC
; PRTC('0')
#IF (PLATFORM != PLT_MK4)
LD A,66H
OUT0 (CPU_ASEXT0),A
LD A,64H
OUT0 (CPU_CNTLA0),A
LD A,Z180_CNTLB0
OUT0 (CPU_CNTLB0),A
#ENDIF
; ASCI1
CALL NEWLINE
PRTS("ASCI1: IO=0x$")
LD A,CPU_TDR1
CALL PRTHEXBYTE
CALL PC_COMMA
LD A,CPU_RDR1
CALL PRTHEXBYTE
; PRTS(" BAUD=$")
; LD HL,ASCI1BAUD / 10
; CALL PRTDEC
; PRTC('0')
#IF (PLATFORM != PLT_MK4)
LD A,66H
OUT0 (CPU_ASEXT1),A
LD A,64H
OUT0 (CPU_CNTLA1),A
LD A,Z180_CNTLB1
OUT0 (CPU_CNTLB1),A
#ENDIF
RET
;
;
;
ASCI0_IN:
CALL ASCI0_IST
OR A
JR Z,ASCI0_IN
IN0 A,(CPU_RDR0) ; READ THE CHAR FROM THE ASCI
LD E,A
RET
;
;
;
ASCI0_IST:
; CHECK FOR ERROR FLAGS
IN0 A,(CPU_STAT0)
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR
JR Z,ASCI0_IST1 ; ALL IS WELL, CHECK FOR DATA
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!!
IN0 A,(CPU_CNTLA0)
RES 3,A ; CLEAR EFR (ERROR FLAG RESET)
OUT0 (CPU_CNTLA0),A
ASCI0_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
IN0 A,(CPU_STAT0) ; READ LINE STATUS REGISTER
AND $80 ; TEST IF DATA IN RECEIVE BUFFER
JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN
XOR A
INC A ; SIGNAL CHAR READY, A = 1
RET
;
;
;
ASCI0_OUT:
CALL ASCI0_OST
OR A
JR Z,ASCI0_OUT
LD A,E
OUT0 (CPU_TDR0),A
RET
;
ASCI0_OST:
IN0 A,(CPU_STAT0)
AND $02
JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN
XOR A
INC A ; SIGNAL BUFFER EMPTY, A = 1
RET
;
;
;
ASCI1:
LD A,B ; GET REQUESTED FUNCTION
AND $0F ; ISOLATE SUB-FUNCTION
JR Z,ASCI0_IN
DEC A
JR Z,ASCI0_OUT
DEC A
JR Z,ASCI0_IST
DEC A
JR Z,ASCI0_OST
CALL PANIC
;
;
;
ASCI1_IN:
CALL ASCI1_IST
OR A
JR Z,ASCI1_IN
IN0 A,(CPU_RDR1) ; READ THE CHAR FROM THE ASCI
LD E,A
RET
;
;
;
ASCI1_IST:
; CHECK FOR ERROR FLAGS
IN0 A,(CPU_STAT1)
AND 70H ; PARITY, FRAMING, OR OVERRUN ERROR
JR Z,ASCI1_IST1 ; ALL IS WELL, CHECK FOR DATA
; CLEAR ERROR(S) OR NOTHING FURTHER CAN BE RECEIVED!!!
IN0 A,(CPU_CNTLA1)
RES 3,A ; CLEAR EFR (ERROR FLAG RESET)
OUT0 (CPU_CNTLA1),A
ASCI1_IST1: ; CHECK FOR STAT0.RDRF (DATA READY)
IN0 A,(CPU_STAT1) ; READ LINE STATUS REGISTER
AND $80 ; TEST IF DATA IN RECEIVE BUFFER
JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN
XOR A
INC A ; SIGNAL CHAR READY, A = 1
RET
;
;
;
ASCI1_OUT:
CALL ASCI1_OST
OR A
JR Z,ASCI1_OUT
LD A,E
OUT0 (CPU_TDR1),A
RET
;
ASCI1_OST:
IN0 A,(CPU_STAT1)
AND $02
JR Z,ASCI1_OST
JP Z,CIO_IDLE ; DO IDLE PROCESSING AND RETURN
XOR A
INC A ; SIGNAL BUFFER EMPTY, A = 1
RET