; Auxiliary I/O for MS-DOS 2.0

	INCLUDE	IODEF.ASM

IO	GROUP	CODE,INITSEG,LASTSEG

INITSEG	SEGMENT	BYTE PUBLIC 'IOSYS'
	ASSUME	CS:IO, DS:IO

	IF	SERIAL
	MOV	CX,4
	MOV	SI,OFFSET IO:SERTAB
SERINIT:
	LODSB
	OUT	SIOBASE+1,AL
	OUT	SIOBASE+3,AL
	LOOP	SERINIT
	LODSB			;Baud rate for channel 0
	OUT	SIOBASE+8,AL
	LODSB			;Baud rate for channel 1
	OUT	SIOBASE+9,AL
	ENDIF

INITSEG	ENDS


LASTSEG	SEGMENT BYTE PUBLIC 'IOSYS'

	IF	SERIAL
SERTAB	DB	0B7H, 77H, 4EH, 37H, PRNBAUD, AUXBAUD
	ENDIF

LASTSEG	ENDS


CODE	SEGMENT BYTE PUBLIC 'IOSYS'
	ASSUME	CS:IO, DS:IO

	PUBLIC	AUXTBL

	EXTRN	EXIT:NEAR, CMDERR:NEAR, BUS$EXIT:NEAR, RDNDEXIT:NEAR

AUXTBL:
	DW	EXIT
	DW	EXIT
	DW	EXIT
	DW	CMDERR
	DW	AUX$READ
	DW	AUX$RDND
	DW	EXIT
	DW	AUX$FLSH
	DW	AUX$WRIT
	DW	AUX$WRIT
	DW	AUX$WRST

AUX$RDND:
	CALL	AUXISTAT
	JZ	BUS$EXITJ
	JMP	RDNDEXIT

AUXISTAT:
	MOV	AL,[AUXCHAR]
	TEST	[AUXBST],1
	JNZ	RET2
	IN	AL,AUXSTAT
	AND	AL,DAV
	JZ	RET2
	IN	AL,AUXDATA
	MOV	[AUXCHAR],AL
	MOV	[AUXBST],1
RET2:	RET

BUS$EXITJ:JMP	BUS$EXIT

AUX$READ:
	CALL	AUXIN
	STOSB
	LOOP	AUX$READ
	JMP	EXIT

AUXIN:
	CALL	AUXISTAT
	JZ	AUXIN
AUXFLUSH:
	MOV	[AUXBST],0
	RET

AUX$FLSH:
	CALL	AUXFLUSH
	JMP	EXIT

AUX$WRST:
	IN	AL,AUXSTAT
	AND	AL,TBMT
	JZ	BUS$EXITJ
	JMP	EXIT

AUX$WRIT:
	MOV	SI,DI
AUXOUTLP:
	LODS	BYTE PTR ES:[SI]
	CALL	AUXOUT
	LOOP	AUXOUTLP
	JMP	EXIT

AUXOUT:
	PUSH	AX
AUXLP:
	IN	AL,AUXSTAT
	AND	AL,TBMT
	JZ	AUXLP
	POP	AX
	OUT	AUXDATA,AL
	RET

AUXCHAR DB	0
AUXBST  DB	0

CODE	ENDS
	END
