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.
 
 
 
 
 
 

103 lines
2.5 KiB

;___XIO________________________________________________________________________________________________________________
;
; DIRECT SERIAL I/O
;
; PROVIDES INTERFACE TO PLATFORM BASE SERIAL I/O DEVICE
; ALLOWS USER MESSAGING/INTERACTION PRIOR TO AND DURING HBIOS INIT
;______________________________________________________________________________________________________________________
;
XIO_INIT: ; MINIMAL UART INIT
#IF (PLATFORM == PLT_UNA)
; SHOULD UNA SERIAL I/O BE RESET HERE???
#ENDIF
#IFNDEF UNALOAD
;
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
; ASCI0
LD A,66H
OUT0 (CPU_ASEXT0),A
LD A,64H
OUT0 (CPU_CNTLA0),A
LD A,Z180_CNTLB0
OUT0 (CPU_CNTLB0),A
#ENDIF
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_S2I))
XIO_DIV .EQU (1843200 / (16 * CONBAUD))
LD A,$80 ; LCR := DLAB ON
OUT (SIO_LCR),A ; SET LCR
LD A,XIO_DIV % $100 ; BAUD RATE DIVISOR (LSB)
OUT (SIO_DLL),A ; SET DIVISOR (LSB)
LD A,XIO_DIV / $100 ; BAUD RATE DIVISOR (MSB)
OUT (SIO_DLM),A ; SET DIVISOR (MSB)
LD A,03H ; VALUE FOR LCR AND MCR
OUT (SIO_LCR),A ; LCR := 3, DLAB OFF, 8 DATA, 1 STOP, NO PARITY
OUT (SIO_MCR),A ; MCR := 3, DTR ON, RTS ON
LD A,6 ; DISABLE & RESET FIFO'S
OUT (SIO_FCR),A ; DO IT
#ENDIF
#ENDIF
RET
;
XIO_CRLF: ; OUTPUT A NEWLINE
LD A,13 ; A = CR
CALL XIO_OUTC ; WRITE IT
LD A,10 ; A = LF
JR XIO_OUTC ; WRITE IT
;
XIO_SPACE: ; OUTPUT A SPACE CHARACTER
LD A,' '
JR XIO_OUTC
;
XIO_DOT: ; OUTPUT A DOT (MARK PROGRESS)
LD A,'.'
;
XIO_OUTC: ; OUTPUT BYTE IN A
#IF (PLATFORM == PLT_UNA)
PUSH DE ; PRESERVE DE
LD BC,$0012 ; UNA UNIT = 0, FUNC = WRITE CHAR
LD E,A ; CHAR TO E
CALL $FFFD ; DO IT (RST 08 NOT SETUP YET)
POP DE ; RESTORE DE
RET ; DONE
#ENDIF
#IF ((PLATFORM == PLT_N8) | (PLATFORM == PLT_MK4))
PUSH AF ; SAVE INCOMING BYTE
XIO_OUTC1:
IN0 A,(CPU_STAT0)
AND $02
JR Z,XIO_OUTC1
POP AF
OUT0 (CPU_TDR0),A
RET
#ENDIF
#IF ((PLATFORM == PLT_N8VEM) | (PLATFORM == PLT_ZETA) | (PLATFORM == PLT_S2I))
PUSH AF ; SAVE INCOMING BYTE
XIO_OUTC1:
IN A,(SIO_LSR) ; READ LINE STATUS REGISTER
AND $20 ; ISOLATE THRE
JR Z,XIO_OUTC1 ; LOOP TILL READY (EMPTY)
POP AF ; RECOVER BYTE TO WRITE
OUT (SIO_THR),A ; WRITE THE CHAR TO UART
RET
#ENDIF
;
XIO_OUTS: ; OUTPUT '$' TERMINATED STRING AT ADDRESS IN HL
LD A,(HL) ; GET NEXT BYTE
CP '$' ; END OF STRING?
RET Z ; YES, GET OUT
CALL XIO_OUTC ; OTHERWISE, WRITE IT
INC HL ; POINT TO NEXT BYTE
JR XIO_OUTS ; AND LOOP