mirror of https://github.com/wwarthen/RomWBW.git
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.
116 lines
2.1 KiB
116 lines
2.1 KiB
;
|
|
;==================================================================================================
|
|
; SIMPLE SERIAL DRIVER
|
|
;==================================================================================================
|
|
;
|
|
; TODO:
|
|
;
|
|
DEVECHO "SSER: IO="
|
|
DEVECHO SSERSTATUS
|
|
DEVECHO "\n"
|
|
;
|
|
;
|
|
;
|
|
SSER_PREINIT:
|
|
;
|
|
; ADD OURSELVES TO CIO DISPATCH TABLE
|
|
;
|
|
LD D,0 ; PHYSICAL UNIT IS ZERO
|
|
LD E,CIODEV_SSER ; DEVICE TYPE
|
|
LD BC,SSER_FNTBL ; BC := FUNCTION TABLE ADDRESS
|
|
CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED
|
|
;
|
|
XOR A
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
SSER_INIT:
|
|
CALL NEWLINE
|
|
PRTS("SSER:$")
|
|
PRTS(" IO=0x$") ; FORMATTING
|
|
LD A,SSERSTATUS
|
|
CALL PRTHEXBYTE
|
|
;
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
;
|
|
; DRIVER FUNCTION TABLE
|
|
;
|
|
SSER_FNTBL:
|
|
.DW SSER_IN
|
|
.DW SSER_OUT
|
|
.DW SSER_IST
|
|
.DW SSER_OST
|
|
.DW SSER_INITDEV
|
|
.DW SSER_QUERY
|
|
.DW SSER_DEVICE
|
|
#IF (($ - SSER_FNTBL) != (CIO_FNCNT * 2))
|
|
.ECHO "*** INVALID SSER FUNCTION TABLE ***\n"
|
|
#ENDIF
|
|
;
|
|
;
|
|
;
|
|
SSER_IN:
|
|
CALL SSER_IST ; CHECK FOR CHAR PENDING
|
|
JR Z,SSER_IN ; WAIT FOR IT IF NECESSARY
|
|
IN A,(SSERDATA) ; READ THE CHAR
|
|
LD E,A
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
SSER_IST:
|
|
IN A,(SSERSTATUS) ; READ LINE STATUS REGISTER
|
|
#IF (SSERIINV)
|
|
CPL
|
|
#ENDIF
|
|
AND SSERIRDY ; ISOLATE DATA READY
|
|
JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING
|
|
OR $FF ; SET A=$FF TO SIGNAL READY
|
|
RET ; RETURN
|
|
;
|
|
;
|
|
;
|
|
SSER_OUT:
|
|
CALL SSER_OST ; CHECK FOR OUTPUT READY
|
|
JR Z,SSER_OUT ; WAIT IF NECESSARY
|
|
LD A,E ; RECOVER THE CHAR TO WRITE
|
|
OUT (SSERDATA),A ; WRITE THE CHAR
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
SSER_OST:
|
|
IN A,(SSERSTATUS) ; READ LINE STATUS REGISTER
|
|
#IF (SSEROINV)
|
|
CPL
|
|
#ENDIF
|
|
AND SSERORDY ; ISOLATE OUTPUT RDY
|
|
JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING
|
|
OR $FF ; SET A=$FF TO SIGNAL READY
|
|
RET ; RETURN
|
|
;
|
|
;
|
|
;
|
|
SSER_INITDEV:
|
|
SYSCHKERR(ERR_NOTIMPL)
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
SSER_QUERY:
|
|
LD DE,SSERCFG
|
|
XOR A
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
SSER_DEVICE:
|
|
LD D,CIODEV_SSER ; 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,SSERSTATUS ; L := BASE I/O ADDRESS
|
|
XOR A ; SIGNAL SUCCESS
|
|
RET
|
|
|