; Figure 5-18
;
;	GETC
;	This subroutine gets the next character from a
;	Sequential disk file. It assumes that the file has
;	already been opened.
;
;>>>	Note : this subroutine changes CP/M's DMA Address.
;
;	Entry Parameters
;
;		DE -> File Control Block.
;
;	Exit Parameters
;
;		A = next character from file.
;		    (= 0FFH on physical End of File).
;		    Note : 1AH is normal EOF character for
;			   ASCII Files.
;
;	Calling sequence
;
;		LXI	DE,FCB
;		CALL	GETC
;		CPI	1AH
;		JZ	EOFCHAR
;		CPI	0FFH
;		JZ	ACTUALEOF
;
B$READSEQ	EQU	20	;Read Sequential
B$SETDMA	EQU	26	;Set DMA Address
BDOS		EQU	5	;BDOS Entry Point
;
GETCBS	EQU	128		;Buffer Size
GETCBF:	DS	GETCBS		;Declare buffer
GETCCC:	DB	0		;Char. count (initially 'empty')
;
GETC:
	LDA	GETCCC		;Check if buffer is empty
	ORA	A
	JZ	GETCFB		;Yes, fill buffer
GETCRE:				;Re-entry point after buffer filled
	DCR	A		;No, downdate count
	STA	GETCCC		;Save downdated count

	MOV	B,A		;Compute offset of next character
	MVI	A,GETCBS-1	;By subtracting
	SUB	B		;(buffer size - downdated count)
	MOV	E,A		;Make result into word value
	MVI	D,0
	LXI	H,GETCBF	;HL -> Base of Buffer
	DAD	D		;HL -> Next character in buffer
	MOV	A,M		;Get next character
	RET
;
GETCFB:				;Fill Buffer
	PUSH	D		;Save FCB Pointer
	LXI	D,GETCBF	;Set DMA Address to Buffer
	MVI	C,B$SETDMA	;Function Code
	CALL	BDOS
	POP	D		;Recover FCB Pointer
	MVI	C,B$READSEQ	;Read Sequential 'record' (sector)
	CALL	BDOS
	ORA	A		;Check if read unsuccessful (A = NZ)
	JNZ	GETCX		;Yes
	MVI	A,GETCBS	;Reset count
	STA	GETCCC
	JMP	GETCRE		;Re-enter subroutine
;
GETCX:				;Physical end of file
	MVI	A,0FFH		;Indicate such
	RET
