Compucolor.org – Virtual Media

Listing of file='READ.MAC;02' on disk='vmedia/asm_utility_routines-sideB-sector.ccvf'

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;	READ - READS A SINGLE INPUT LINE
;
	TITLE	READ

	PUBLIC	READ

;
;	VALUES ON ENTRY:
;	   HL => BUFFER FOR INPUT LINE
;		 THE BUFFER MUST HAVE MARKERS BEFORE AND AFTER
;		 IT CONSISTING OF A BYTE WITH 0FFH, I.E.
;
;	      FF,XX,XX,XX,XX, ... ,XX,XX,XX,FF
;		 ^
;
;	NOTE: ON ENTRY, HL SHOULD POINT TO THE FIRST BYTE
;	      AFTER THE BEGINNING MARKER AS INDICATED BY THE
;	      ARROW ABOVE.
;
;	RETURNS:
;	   FILLS THE BUFFER AND MARKS THE AND OF LINE WITH
;	   A ZERO BYTE. THE CR AND LF ARE NOT INSERTED IN
;	   THE BUFFER.
;

;
;	SYSTEM ADDRESSES - V6.78
;

CRLF	EQU	338BH	;PRINT CR LF
LO	EQU	3392H	;PRINT A SINGLE CHARACTER
OSTR	EQU	33F4H	;PRINT A STRING
SAVE	EQU	3FD0H	;SAVE THE REGISTERS

INPCRT	EQU	81C5H	;KEYBOARD JUMP VECTOR
KBDFL	EQU	81DFH	;KEYBOARD INPUT FLAG
KBCHA	EQU	81FEH	;KEYBOARD CHARACTER
READY	EQU	81FFH	;KEYBOARD READY FLAG

;

CR	EQU	13	;CARRIAGE RETURN

READ:	SHLD	PNTR
	LHLD	INPCRT+1	;SET UP THE INTERRUPT VECTOR
	SHLD	STORE+1		;(SAVE OLD VECTOR)
	LXI	H,RDINT
	SHLD	INPCRT+1
	LDA	INPCRT
	STA	STORE
	MVI	A,0C3H
	STA	INPCRT
	LDA	KBDFL
	STA	TEMP
	MVI	A,31	;SETUP KEYBOARD INPUT FLAG
	STA	KBDFL
	XRA	A
	STA	FLAG
READ10:	LDA	FLAG	;WAIT UNTIL CR IS HIT
	ORA	A
	JZ	READ10
	LDA	TEMP	;RESTORE THE JUMP VECTOR AND FLAG
	STA	KBDFL
	LHLD	STORE+1
	SHLD	INPCRT+1
	LDA	STORE
	STA	INPCRT
	RET

;
;	KEYBOARD INTERRUPT ROUTINE
;

RDINT:	CALL	SAVE
	LHLD	PNTR
	MOV	A,E
	ANI	7FH	;MAKE SURE IT'S ASCII
	CPI	32	;SEE IF IT IS A CONTROL CHARACTER
	JNC	RD10
	CPI	CR	;CR TERMINATES LINE
	JZ	ENDLIN
	CPI	26	;LEFT ARROW
	JZ	RUBOUT
	RET		;IGNORE CONTROL CHARACTERS
RD10:	CPI	127	;DELETE KEY
	JZ	RUBOUT
	MOV	E,A	;SAVE CHR
	INX	H
	MOV	A,M	;CHECK FOR END OF BUFFER
	DCX	H
	CPI	0FFH
	RZ		;IGNORE CHR IF BUFFER FULL
	MOV	A,E
	MOV	M,A	;PUT CHR INTO BUFFER ...
	CALL	LO	; ... PRINT IT ...
	INX	H
	SHLD	PNTR
	RET		; ... AND READ ANOTHER

ENDLIN:	CALL	CRLF	;OUTPUT CR LF FOR END OF LINE
	MVI	M,0	;MARK END IN BUFFER
	INX	H
	SHLD	PNTR	;POINTER IS MOVED PAST END OF LINE
	MVI	A,0FFH
	STA	FLAG
	RET

RUBOUT:	DCX	H	;CHECK FOR BEGINNING OF BUFFER ...
	MOV	A,M
	CPI	0FFH
	JZ	RUB10	; ... AND IGNORE DELETE IF AT START
	SHLD	PNTR
	LXI	H,DELMSG	;ERASE THE BAD CHR FROM SCREEN
	CALL	OSTR
	RET
RUB10:	INX	H	;SIMPLY SKIP TO READ A NEW CHR
	SHLD	PNTR
	RET

FLAG:	DB	0
PNTR:	DS	2

STORE:	DS	3
TEMP:	DS	1

DELMSG:	DB	26,' ',26,239	;MESSAGE TO ERASE A CHR

	END