	.PREL
	.IDENT	KB
	.INSERT	BBEQU.ASM
; UART EQUATES
UARTD=0E0H
UARTS=0E1H
; KEYBOARD SCANNER
KBSCAN:: CALL	CHROME	; CHECK CHROMERICS
	JRNZ	..GOTK
; COMMENT OUT THIS NEXT INSTRUCTION TO ENABLE UART SCANNING
;	RET		; ** DISABLE ICE UART FOR NOW **
	IN	UARTS	; CHECK STATUS
	ANI	2	; IS A CHAR THERE?
	RZ
	IN	UARTD	; GRAB A CHAR
..GOTK:	ANI	7FH	; ZAP PARITY
	CPI	20H	; CONTROL CHARACTER?
	JRNC	..STUF	; JUMP IF NOT
; WE GOT A CONTROL CHARACTER - LOOKUP IN TRANSLATE TABLE
	MOV	C,A
	MVI	B,0
	LXI	H,CTRLTBL
	DAD	B
	MOV	A,M
	ANA	A	; A HALT CHAR?
	JRNZ	..STUF	; JUMP IF NOT
	INR	A	; SET THE HALT FLAG
	STA	HLTFLG#
	RET
..STUF:	MOV	E,A	; SAVE CHAR
	LHLD	KBBPC#	; GET BUFFER POINTERS
	MOV	A,L	; A=PRODUCER
	CALL	BUMPKB
	CMP	H	; IS THE BUFFER FULL
	RZ		; IF SO - IGNORE THE CHAR
	STA	KBPRO#	; ELSE UPDATE THE POINTER
	MVI	H,0	; AND STORE AT OLD PTR VAL
	LXI	B,KEYBUF#
	DAD	B
	MOV	M,E
	RET
; SUBROUTINE TO INCREMENT POINTER TO KEYBOARD BUFFER
BUMPKB:: INR	A	; BUMP KEYBOARD PTR
	CPI	KEYBSZ	; PAST LIMIT?
	RNZ		; NO SIR
	XRA	A	; YES - RESET
	RET
; CHROMERICS KEYBOARD SCAN ROUTINE
CHROME::
	LXI	B,0FE98H	; BC=MASK,PORT
	LXI	D,0		; DE=BIT,COL
..CHR:	OUTP	B	; OUTPUT MASK
	INP	A	; GRAB SOME DATA
	CMA		; UPSIDE DOWN (OF COURSE)
	ANA	A	; GET ANY?
	JRNZ	..KEYH	; YES SIR
	INR	E	; NO - BUMP COL
	RLCR	B	; SHIFT MASK
	JM	..CHR	; SCAN AWAY
	DCR	A	; ZAP LAST KEY
	STA	OLDKEY#
	XRA	A	; ZERO FOR NOTHIN
	RET
..KEYH:	RRC		; SCAN FOR BIT HIT
	JRC	..BITF
	INR	D	; BUMP BIT CTR
	JMPR	..KEYH	; KEEP SCANIN
..BITF:	MOV	A,E	; A=COL
	RLC
	RLC
	RLC		; *8+
	ADD	D	; BIT #
	MOV	E,A	; E=KEYCODE
	LXI	H,OLDKEY#
	CMP	M	; COMPARE TO LAST TIME THRU
	RZ		; KICKOUT IF SAME
	MOV	M,A	; ELSE UPDATE
	MVI	B,7FH	; READ CONTROL AND SHIFT
	OUTP	B
	INP	A
	CMA		; UPSIDE DOWN
	MOV	B,A	; PUT IN B
	LXI	H,NORTBL	; ASSUME NORMAL
	BIT	7,B		; SHIFT DOWN?
	JRZ	..NOSH
	LXI	H,SHFTBL	; YEP - CHANGE MIND
..NOSH:	MVI	D,0
	DAD	D
; CHECK FOR CONTROL KEY
	MOV	A,B
	ANI	28H
	MOV	A,M	; CHAR TRANSLATED TO A
	JRZ	..GOTK	; JUMP IF NO CTRL
	CPI	40H	; SEE IF IN RANGE
	JRC	..GOTK	; FOR CONTROL KEY
	CPI	60H
	JRNC	..GOTK
	ANI	1FH	; YES SIR - ZAP BITS
..GOTK:	MOV	B,A	; SET NONZERO STATUS
	MVI	A,1
	ANA	A
	MOV	A,B
	RET
; NORMAL CHARACTER LOOKUP TABLE
NORTBL:
	.BYTE	'1','2','Q',1BH,'[','=','A','Z'
	.BYTE	'4','3','E','W','C','S','D','X'
	.BYTE	'6','5','T','R','B','F','G','V'
	.BYTE	'8','7','U','Y',' ','H','J','N'
	.BYTE	'0','9','O','I','M','K','L',','
	.BYTE	')','(','+','P','.',';',5FH,'/'
	.BYTE	8,']',61H,5EH,66H,0DH,67H,60H
; SHIFTED CHARACTERS
SHFTBL:
	.BYTE	'!','"','Q',1BH,'{','=','A','Z'
	.BYTE	'$','#','E','W','C','S','D','X'
	.BYTE	'&','%','T','R','B','F','G','V'
	.BYTE	'@',27H,'U','Y',' ','H','J','N'
	.BYTE	5EH,':','O','I','M','K','L','<'
	.BYTE	63H,62H,'-','P','>','*',5FH,'?'
	.BYTE	8,'}',61H,5EH,66H,0DH,67H,60H
; CONTROL CHARACTER TRANSLATE TABLE
CTRLTBL:
	.BYTE	0	; NULL
	.BYTE	76H	; A - RND
	.BYTE	71H	; B - BOX
	.BYTE	69H	; C - CLEAR
	.BYTE	78H	; D - DATA
	.BYTE	66H	; E - EDIT KEY
	.BYTE	72H	; F - FOR
	.BYTE	6FH	; G - GOSUB
	.BYTE	RUBOUT	; H - RUBOUT
	.BYTE	73H	; I - INPUT
	.BYTE	67H	; j - go+10
	.BYTE	6DH	; K - IF
	.BYTE	68H	; L - LIST
	.BYTE	CR	; CARRIAGE RETURN
	.BYTE	6BH	; N - NEXT
	.BYTE	79H	; O - CIRCLE
	.BYTE	74H	; P - PRINT
	.BYTE	7DH	; Q - SNAP
	.BYTE	70H	; R - RETURN
	.BYTE	75H	; S - STEP
	.BYTE	77H	; T - TO
	.BYTE	7AH	; U - POINT
	.BYTE	7BH	; V - DEFAULT
	.BYTE	7CH	; W - SHOW
	.BYTE	6AH	; X - RUN
	.BYTE	7FH	; Y - SCROLL
	.BYTE	7EH	; Z - ZERO
	.BYTE	0	; ESCAPE - HALT
	.BYTE	6CH	; BACKSLASH - LINE
	.BYTE	67H	; CLOSE SQUARE BKT - GO + 10
	.BYTE	62H	; CARAT - MULTIPLY
	.BYTE	63H	; UNDERLINE - DIVIDE
	.END
                                                                                                        