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.
 
 
 
 
 
 

144 lines
3.0 KiB

;
;==================================================================================================
; S100 TRION SERIAL DRIVER
;==================================================================================================
;
; THIS SERIAL DRIVER SUPPORTS THE SERIAL INTERFACE OF THE TRION FPGA.
;
; TODO:
;
TSER_STAT .EQU $34
TSER_DATA .EQU $35
;
DEVECHO "TSER: IO="
DEVECHO TSER_DATA
DEVECHO "\n"
;
;--------------------------------------------------------------------------------------------------
; HBIOS MODULE HEADER
;--------------------------------------------------------------------------------------------------
;
ORG_TSER .EQU $
;
.DW SIZ_TSER ; MODULE SIZE
.DW TSER_INITPHASE ; ADR OF INIT PHASE HANDLER
;
TSER_INITPHASE:
; INIT PHASE HANDLER, A=PHASE
CP HB_PHASE_PREINIT ; PREINIT PHASE?
JP Z,TSER_PREINIT ; DO PREINIT
CP HB_PHASE_INIT ; INIT PHASE?
JP Z,TSER_INIT ; DO INIT
RET ; DONE
;
;
;
TSER_PREINIT:
;
; ADD OURSELVES TO CIO DISPATCH TABLE
;
LD D,0 ; PHYSICAL UNIT IS ZERO
LD E,CIODEV_TSER ; DEVICE TYPE
LD BC,TSER_FNTBL ; BC := FUNCTION TABLE ADDRESS
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
;
XOR A
RET
;
;
;
TSER_INIT:
CALL NEWLINE
PRTS("TSER:$")
PRTS(" IO=0x$") ; FORMATTING
LD A,TSER_DATA
CALL PRTHEXBYTE
;
XOR A ; SIGNAL SUCCESS
RET
;
; DRIVER FUNCTION TABLE
;
TSER_FNTBL:
.DW TSER_IN
.DW TSER_OUT
.DW TSER_IST
.DW TSER_OST
.DW TSER_INITDEV
.DW TSER_QUERY
.DW TSER_DEVICE
#IF (($ - TSER_FNTBL) != (CIO_FNCNT * 2))
.ECHO "*** INVALID TSER FUNCTION TABLE ***\n"
#ENDIF
;
;
;
TSER_IN:
CALL TSER_IST ; CHECK FOR CHAR PENDING
JR Z,TSER_IN ; WAIT FOR IT IF NECESSARY
IN A,(TSER_DATA) ; READ THE CHAR
LD E,A
RET
;
;
;
TSER_IST:
IN A,(TSER_STAT) ; READ LINE STATUS REGISTER
AND %00000001 ; ISOLATE DATA READY
JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING
OR $FF ; SET A=$FF TO SIGNAL READY
RET ; RETURN
;
;
;
TSER_OUT:
CALL TSER_OST ; CHECK FOR OUTPUT READY
JR Z,TSER_OUT ; WAIT IF NECESSARY
LD A,E ; RECOVER THE CHAR TO WRITE
OUT (TSER_DATA),A ; WRITE THE CHAR
RET
;
;
;
TSER_OST:
IN A,(TSER_STAT) ; READ LINE STATUS REGISTER
CPL
AND %00000010 ; ISOLATE OUTPUT RDY
JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING
OR $FF ; SET A=$FF TO SIGNAL READY
RET ; RETURN
;
;
;
TSER_INITDEV:
SYSCHKERR(ERR_NOTIMPL)
RET
;
;
;
TSER_QUERY:
LD DE,TSERCFG
XOR A
RET
;
;
;
TSER_DEVICE:
LD D,CIODEV_TSER ; D := DEVICE TYPE
LD E,0 ; E := DEVICE NUM, ALWAYS 0
LD C,$00 ; C := DEVICE TYPE, 0x00 IS RS-232
LD H,0 ; H := 0, DRIVER HAS NO MODES
LD L,TSER_DATA ; L := BASE I/O ADDRESS
XOR A ; SIGNAL SUCCESS
RET
;
;--------------------------------------------------------------------------------------------------
; HBIOS MODULE TRAILER
;--------------------------------------------------------------------------------------------------
;
END_TSER .EQU $
SIZ_TSER .EQU END_TSER - ORG_TSER
;
MEMECHO "TSER occupies "
MEMECHO SIZ_TSER
MEMECHO " bytes.\n"