mirror of https://github.com/wwarthen/RomWBW.git
23 changed files with 184 additions and 43 deletions
@ -0,0 +1,126 @@ |
|||||
|
; |
||||
|
;================================================================================================== |
||||
|
; 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 |
||||
Loading…
Reference in new issue