Compucolor.org – Virtual Media

Listing of file='INPUTR.SRC;01' on disk='vmedia/mazes_2-sector.ccvf'

;INPUT ROUTINES: V1.1 	7/17/81		GREG ALLEN

;	THESE ROUTINES MAKE INPUT FROM THE KEYBOARD INTERUPT
;	RATHER THEN WAIT FOR THE TIME THE INPUT IS NEEDED.

;	SEVERAL ROUTINES ARE USE TO MAKE INPUT MORE EFFECENT

;INITINPUT:	NO INPUT OR OUTPUT
;		PRESERVE THE OLD INPUT VECTOR AND SETUP THE NEW

;RESTOREINPUT:	RESTORE THE OLD INPUT JMP VECTOR

;GETCHAR:	INPUTS - NONE
;		OUTPUT - ACC = INPUT CHARACTER
;		THIS ROUTINE RETURN THE INPUT CHARACTER AND
;		UPDATES THE INPUT BUFFER AND POINTERS

;INPUTINTERUPT:	THE ROUTINE THAT GRABS THE INPUT CHAR.
;		AND STORES IT IN THE INPUT BUFFER.
;		<CONTROL D> EXITS THE PROGRAM.

;CLEARBUF:	CLEARS THE OLD INPUT CHARACTERS FROM THE BUFFER

KEYFLAG		EQU	81DFH
INPCRT		EQU	81C5H
KEYCHAR		EQU	81FEH
GOTOFCS		EQU	32C9H

ENDCHAR	EQU	254

		ORG	8F10H
INITINPUT:	PUSH	PSW
		PUSH	H

		LDA	KEYFLAG	;SAVE THE OLD INPUT STATUSES
		STA	OLDKEYFLAG
		LDA	INPCRT
		STA	OLDJMP
		LHLD	INPCRT+1
		SHLD	OLDVECTOR

		LXI	H,INPUTBUFFER
		MVI	M,ENDCHAR
		SHLD	ENDPOINTER

		DI

		MVI	A,31	;SET THE KEYBOARD FLAG
		STA	KEYFLAG

		MVI	A,0C3H	;SET THE INPUT INTERUPT VECTOR
		STA	INPCRT	;TO  JMP	INPUTINTERUPT
		LXI	H,INPUTINTERUPT
		SHLD	INPCRT+1

		EI
		POP	H
		POP	PSW
		RET

		ORG	8F42H
RESTOREINPUT:	PUSH	PSW
		PUSH	H

		LDA	OLDKEYFLAG
		STA	KEYCHAR
		LDA	OLDJMP
		STA	INPCRT
		LHLD	OLDVECTOR
		SHLD	INPCRT+1

		POP	H
		POP	PSW
		RET

INPUTINTERUPT:	PUSH	PSW
		PUSH	H

		LDA	KEYCHAR
		CPI	4	;IF INPUT CHAR = <CONTROL D>
		JZ	GOTOFCS	;   THEN JMP TO FCS

		ANI	127	;ONLY ASCII INPUT EXCEPTED
		LHLD	ENDPOINTER
		MOV	M,A

		INX	H
		MOV	A,M
		MVI	M,ENDCHAR
		SHLD	ENDPOINTER

		;NOW CHECK AND SEE WHAT WAS IN THE MEM SLOT.
		CPI	255
		JNZ	DONEINPUT

		;THE END OF BUFFER WAS ENCOUNTERED.
		;RESTORE THE OLD VALUES.
		;HL->THE END OF THE BUFFER
		;ACC = 255

		MOV	M,A
		DCX	H
		MVI	M,ENDCHAR
		SHLD	ENDPOINTER

DONEINPUT:	POP	H
		POP	PSW
		EI
		RET

		ORG	8F81H
GETCHAR:	PUSH	D
		PUSH	H

		LXI	H,INPUTBUFFER
CHECK1STCHAR:	MOV	A,M
		CPI	ENDCHAR
		JZ	CHECK1STCHAR

		DI		;I DON'T WANT TO HAVE CHARS
				;INPUT WHILE CONDENSING BUFFER
		STA	OUTCHAR
		LXI	D,INPUTBUFFER
MOVEUP:		INX	H
		MOV	A,M
		STAX	D
		INX	D
		CPI	ENDCHAR
		JNZ	MOVEUP

		DCX	H
		SHLD	ENDPOINTER
		LDA	OUTCHAR
		EI
		POP	H
		POP	D
		RET


INPUTBUFFER:	DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ENDBUFFER:	DB	255
ENDPOINTER:	DS	2

OUTCHAR:	DS	1

OLDKEYFLAG:	DS	1
OLDJMP:		DS	1
OLDVECTOR:	DS	2
		END