; ;================================================================================================== ; S100 PROPELLER CONSOLE DRIVER ;================================================================================================== ; ; TODO: ; SCON_IOBASE .EQU $00 ; SCON_STATUS .EQU SCON_IOBASE SCON_DATA .EQU SCON_IOBASE + 1 ; SCON_KBDRDY .EQU %00000010 SCON_DSPRDY .EQU %00000100 ; SCON_COLS .EQU 80 SCON_ROWS .EQU 40 ; ; ; SCON_PREINIT: XOR A RET ; ; ; SCON_INIT: CALL NEWLINE PRTS("SCON:$") ; ; DISPLAY CONSOLE DIMENSIONS CALL PC_SPACE LD A,SCON_COLS CALL PRTDECB LD A,'X' CALL COUT LD A,SCON_ROWS CALL PRTDECB CALL PRTSTRD .TEXT " TEXT (ANSI)$" ; ; ADD OURSELVES TO CIO DISPATCH TABLE ; LD D,0 ; PHYSICAL UNIT IS ZERO LD E,CIODEV_SCON ; DEVICE TYPE LD BC,SCON_FNTBL ; BC := FUNCTION TABLE ADDRESS CALL CIO_ADDENT ; ADD ENTRY, A := UNIT ASSIGNED LD (HCB + HCB_CRTDEV),A ; SET OURSELVES AS THE CRT DEVICE ; XOR A ; SIGNAL SUCCESS RET ; ; DRIVER FUNCTION TABLE ; SCON_FNTBL: .DW SCON_IN .DW SCON_OUT .DW SCON_IST .DW SCON_OST .DW SCON_INITDEV .DW SCON_QUERY .DW SCON_DEVICE #IF (($ - SCON_FNTBL) != (CIO_FNCNT * 2)) .ECHO "*** INVALID SCON FUNCTION TABLE ***\n" #ENDIF ; ; ; SCON_IN: CALL SCON_IST ; CHECK FOR CHAR PENDING JR Z,SCON_IN ; WAIT FOR IT IF NECESSARY IN0 A,(SCON_DATA) ; READ THE CHAR FROM PROPIO LD E,A RET ; ; ; SCON_IST: IN0 A,(SCON_STATUS) ; READ LINE STATUS REGISTER AND SCON_KBDRDY ; ISOLATE KBDRDY JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING OR $FF ; SET A=$FF TO SIGNAL READY RET ; RETURN ; ; ; SCON_OUT: CALL SCON_OST ; CHECK FOR OUTPUT READY JR Z,SCON_OUT ; WAIT IF NECESSARY LD A,E ; RECOVER THE CHAR TO WRITE OUT0 (SCON_DATA),A ; WRITE THE CHAR TO PROPIO RET ; ; ; SCON_OST: IN0 A,(SCON_STATUS) ; READ LINE STATUS REGISTER AND SCON_DSPRDY ; ISOLATE DSPRDY JP Z,CIO_IDLE ; RETURN VIA IDLE PROCESSING OR $FF ; SET A=$FF TO SIGNAL READY RET ; RETURN ; ; ; SCON_INITDEV: SYSCHKERR(ERR_NOTIMPL) RET ; ; ; SCON_QUERY: LD DE,0 LD HL,0 XOR A RET ; ; ; SCON_DEVICE: LD D,CIODEV_SCON ; D := DEVICE TYPE LD E,0 ; E := DEVICE NUM, ALWAYS 0 LD C,$BF ; C := DEVICE TYPE, 0xBF IS PROP TERM LD H,0 ; H := 0, DRIVER HAS NO MODES LD L,SCON_IOBASE ; L := BASE I/O ADDRESS XOR A ; SIGNAL SUCCESS RET