	.PREL
	.IDENT	EZKP
	.INSERT	HVG.LIB
	.INSERT	MACRO.LIB
	.INSERT	MUSIC.LIB
	.INSERT	BBEQU.ASM
	.RELOC
; KB - FUNCTION TO RETURN NEXT CHARACTER FROM KEYBOARD
GETKB::	PUSH	B
	PUSH	D
	CALL	CHKIO#
	POP	D
	POP	B
	MOV	L,A
	MVI	H,0
	RET
; NEW KEYBOARD HANDLER
; WITH SHIFT KEY ROLLOVER
CKIOLA:: LDA	TAPEST#	; TAPE INPUT WANTED?
	DCR	A
	JRNZ	CHKIOQ	; NO - SKIP IT THEN
; YES - CHECK FOR ABORT KEYSTROKE
	CALL	KEYSCN
	JNZ	INIT0#
	LDA	HLTFLG#	; NOW CHECK FOR HALT
	ANA	A
	JNZ	INIT0#
; GET CHARACTER FROM THE BUFFER
	LHLD	CONPRO#
	MOV	A,H
	CMP	L	; ARE POINTERS EQUAL?
	JRZ	CKIOLA	; YEP - LOOP WAITING
	LXI	H,TAPBUF#
	MOV	L,A	; MAKE OFFICIAL POINTER
	MOV	C,M
	CALL	BUMPTR#
	STA	CONPTR#	; UPDATE MY POINTER
	MOV	A,C	; PASS BACK THE CHARACTER
	RET
CHKIOQ:	CALL	KEYSCN	; MAKE SURE PREVIOUS KEY RELEASED
	JRNZ	CHKIOQ
; AWAIT DEBOUNCE TIMER COUNTDOWN
CHKIO0:	LXI	H,KEYTMR#
	MVI	M,6	; SET IT
LOOPER:	MOV	A,M
	ANA	A
	JRNZ	LOOPER
; SAVE BACKGROUND COLOR
	LDA	DEVCL0#
	PUSH	PSW
; ASSUME FIRST	LEVEL KEYCODE
	LXI	H,FIRSTL
GETK1:	PUSH	H	; SAVE TABLE PTR
	LDA	HLTFLG#	; CHECK FOR HALT
	ANA	A
	JNZ	INIT#
; SCAN ONLY FOR SHIFT KEYS
	LXI	H,KTBL4
	LXI	D,-21	; ** SIZE OF LOOKUP TABLE
	LXI	B,0414H
GETK2:	INP	A	; INPUT FROM PORT
	ANI	20H	; SHIFT KEY DOWN?
	JRNZ	GETK3	; JUMP IF YEP
	DAD	D	; ELSE TO NEXT TABLE
	INR	C	; AND PORT
	DJNZ	GETK2
; NO SHIFT KEY IS DOWN - USE WHATEVER WE HAD BEFORE
	POP	H
	JMPR	GETK5
; A SHIFT KEY IS DOWN - SAME OLD STORY?
GETK3:	POP	D	; DISCARD OLD BELIEFS
	LDA	DEVCL0#	; IS CURRENT SCREEN COLOR
	CMP	M	; THE SAME AS WHAT WE WOULD SET?
	JRZ	GETK4	; YEP - DON'T BOTHER WITH FEEDBACK
	MOV	A,M	; ELSE SET NEW COLOR
	STA	DEVCL0#
	CALL	WCLICK	; AND GO CLICK
GETK4:	INX	H	; SKIP COLOR BYTE
; NOW SCAN FOR ANY 'NORMAL' KEY DEPRESSION
GETK5:	PUSH	H
	LHLD	KBBPC#	; GET KEYBOARD BUFFER POINTERS
	MOV	A,H
	CMP	L	; ANYONE HOME?
	JRZ	GETK6
	MOV	E,H	; YEP - POINT AT EM
	MVI	D,0
	LXI	H,KEYBUF#
	DAD	D
	MOV	D,M	; GET AND SAVE
	CALL	BUMPKB	; BUMP THE CONSUMER PTR
	STA	KBCON#	; AND UPDATE
	POP	PSW	; FORGET PUSHED HL
	POP	PSW	; RESTORE COLOR
	STA	DEVCL0#
	MOV	A,D	; CHAR BACK TO AC
	JMPR	KBRENT	; JOIN IN LATER
GETK6:	POP	H
	CALL	KEYSCN
	JRZ	GETK1	; JUMP IF NO KEY DOWN
; WE GOT ONE - CONVERT TO ASCII
	DCR	A	; BY TABLE LOOKUP
	MOV	C,A
	MVI	B,0
	DAD	B
	POP	PSW	; RESTORE COLOR
	STA	DEVCL0#
	MOV	A,M	; GET CODE
	ANA	A	; A HLT PERCHANCE?
	JRZ	INIJMP	; YEP - RESET
	CPI	1	; AN ERROR?
	JZ	CKIOLA	; YEP - GO DOIT AGAIN
; GOOD KEY...
CHKIO2:	PUSH	PSW	; NEED WE GO 'CLICK'?
	CPI	NLLN	; REJECT TOKENS
	JRNC	NOCLK
	INDEXB	1
	.WORD	NOTES#-CR
	INR	A
	JRNZ	NOCLK
	CALL	WCLICK
NOCLK:	POP	PSW
KBRENT:	CPI	NLLN
	RNZ	
	LXI	H,5
	SHLD	NLLNCT#	; SET FLAG AND ZERO SUPRESS
	MVI	A,CR	; PASS BACK CR AS FIRST	CHAR
	RET
WCLICK:	LDA	NEWTMR#
	ANA	A
	JRNZ	WCLICK
	MVI	A,G0
	STA	MUZTON#
	LDA	DEVTEM#	; DON'T CLICK IF NT=0
	ANA	A
	RZ	
	MVI	A,1
	STA	NEWTMR#
	RET
;
; SUBROUTINE TO CHECK FOR HLT KEY WHILE PGM RUNNING
WHATSU::
	CALL	HKHCHK#		; CALL HALT CHECK HOOK
	PUSH	B
	PUSH	D
	LDA	HLTFLG#	; HALT FLAG SET?
	ANA	A
	JNZ	INIT#	; YEP - BLAST OFF
	CALL	KEYSCN	; GET KEY CODE
	SUI	2	; FREEZE?
	JRZ	FRZKEY
	DCR	A
	JRZ	INIJMP
	CPI	1	; RETURN Z STATUS FOR LIST KEY
	JMPR	FRZGBK	; ELSE GO BACK TO CALLER
FRZKEY:	CALL	KEYSCN	; SCAN FOR NONZERO KEY TO REL
	JRZ	FRZKEY
	CPI	3	; HLT NAILED?
INIJMP:	JZ	INIT#
FRZGBK:	POP	D
	POP	B
	RET
; SUBROUTINE TO SCAN TINY BASIC KEYBOARD
KEYSCN:	LXI	B,0414H	; B = CNT, C = PORT #
	LXI	D,KEYTRK#	; DE = KEYBOARD MEMORY
	PUSH	B
	PUSH	D
	PUSH	H
	CALL	RND32#
	POP	H
	POP	D
	POP	B
KYSCN1:	INP	A	; LOOK AT COLUMN
	ANI	1FH	; ISOLATE THE RELEVANT
	JRNZ	KYSCN2	; JUMP IF BITS HIGH
	INR	C	; BUMP PORT #
	DJNZ	KYSCN1
	XRA	A	; SET ZERO STATUS
	STAX	D	; NOTHIN - SAY ZIP
	RET
; DEPRESSION FOUND - JUMP UP AND DOWN
KYSCN2:	DCR	B
	MVI	C,0	; COME UP WITH BIT #
KYSCN4:	RRC	; SHIFT BIT OVER
	JRC	KYSCN3	; JUMP IF THE ONE
	INR	C	; ELSE COUNT UP
	JMPR	KYSCN4	; AND TRY AGAIN
; FOUND BIT - ASSEMBLE KEYCODE
KYSCN3:	MOV	A,C	; BIT # TO A
	RLC		; * 4
	RLC	
	ORA	B	; COMBINE WITH COL #
	INR	A
	MOV	B,A
	LDAX	D
	XRA	B
	MOV	A,B
	RZ		; QUIT IF THE SAME
	STAX	D	; ELSE UPDATE TRACKER
	RET
; BUMP KEYBOARD BUFFER POINTER
BUMPKB:: INR	A
	CPI	KEYBSZ
	RNZ
	XRA	A
	RET
; TABLE OF FIRST	LEVEL KEYCODES
FIRSTL:	
	.BYTE	CR
	.BYTE	EDKEY
	.BYTE	0
	.BYTE	63H
	.BYTE	'7'
	.BYTE	'8'
	.BYTE	'9'
	.BYTE	62H
	.BYTE	'4'
	.BYTE	'5'
	.BYTE	'6'
	.BYTE	'-'
	.BYTE	'1'
	.BYTE	'2'
	.BYTE	'3'
	.BYTE	'+'
	.BYTE	' '
	.BYTE	'0'
	.BYTE	RUBOUT
	.BYTE	'='
; FIRST	SHIFT KEY
KTBL1:
	.BYTE	0A7H	; FIRST	SHIFT KEY COLOR
	.BYTE	CR
	.BYTE	1
	.BYTE	0
	.BYTE	1
	.BYTE	'A'
	.BYTE	'D'
	.BYTE	'G'
	.BYTE	'J'
	.BYTE	'M'
	.BYTE	'P'
	.BYTE	'S'
	.BYTE	'V'
	.BYTE	'Y'
	.BYTE	5FH
	.BYTE	5EH
	.BYTE	'&'
	.BYTE	'$'
	.BYTE	'<'
	.BYTE	'('
	.BYTE	'#'
; SECOND SHIFT KEY
KTBL2:
	.BYTE	05FH	; SECOND SHIFT KEY COLOR
	.BYTE	CR
	.BYTE	2FH
	.BYTE	0
	.BYTE	5BH
	.BYTE	'B'
	.BYTE	'E'
	.BYTE	'H'
	.BYTE	'K'
	.BYTE	'N'
	.BYTE	'Q'
	.BYTE	'T'
	.BYTE	'W'
	.BYTE	'Z'
	.BYTE	27H
	.BYTE	'.'
	.BYTE	'@'
	.BYTE	','
	.BYTE	22H
	.BYTE	';'
	.BYTE	'%'
; TABLE THE THIRD
KTBL3:
	.BYTE	0FH	; THIRD SHIFT KEY COLOR
	.BYTE	CR
	.BYTE	5CH
	.BYTE	0
	.BYTE	5DH
	.BYTE	'C'
	.BYTE	'F'
	.BYTE	'I'
	.BYTE	'L'
	.BYTE	'O'
	.BYTE	'R'
	.BYTE	'U'
	.BYTE	'X'
	.BYTE	'!'
	.BYTE	61H
	.BYTE	60H
	.BYTE	'*'
	.BYTE	'?'
	.BYTE	'>'
	.BYTE	')'
	.BYTE	':'
; TOKEN KEY
KTBL4:
	.BYTE	77H	; WORDS KEY COLOR
	.BYTE	NLLN
	.BYTE	EDKEY
	.BYTE	6AH
	.BYTE	68H
	.BYTE	72H
	.BYTE	77H
	.BYTE	75H
	.BYTE	6BH
	.BYTE	6FH
	.BYTE	70H
	.BYTE	76H
	.BYTE	6DH
	.BYTE	69H
	.BYTE	6CH
	.BYTE	71H
	.BYTE	6EH
	.BYTE	EDKEY
	.BYTE	73H
	.BYTE	1
	.BYTE	74H
	.END
                                                                              