N TA21
;
; TASTATUREINGABE K 7659
;
;
; MAKRODEFINITIONEN FUER AUFBAU KODETABELLE
DBM:	MACR	D1,D2,D3,D4,D5,D6,D7,D8
	DB	D1
	DB	D2
	DB	D3
	DB	D4
	DB	D5
	DB	D6
	DB	D7
	DB	D8
	ENDM
;
; TASTATURUEBERNAHMEUNTERPROGRAMM
; A-REG.  CY  Z     BEDEUTUNG
;    00    0  1     KEINE TASTE BETAETIGT
;  KODE    X  0     ERSTMALIGE ABFRAGE
;  KODE    X  1     TASTE BEREITS ABGEFRAGT
;  KODE    1  X     TASTE LAENGER ALS 640 MILLISEK.
;
TAS:	PUSH	HL	;REGISTER RETTEN
	LD	HL,(RM.TASTA+7)	;KODE UND STATUS NACH HL
	BIT	6,L	;TEST: TASTE NEU BETAETIGT?
	JRNZ	TS1-#	;NEIN
	SET	6,L	;JA, ABFRAGEKENNZEICHEN SETZEN
	LD	(RM.TASTA+7),HL	;UND IN STATUSWORT EINTRAGEN
	RES	6,L	;WIEDER RUECKSETZEN
TS1:	EX	(SP),HL	;REGISTER RUECKSPEICHERN, WERTE AUF STACK
	POP	AF	;UEBERGABE IN AF
	RET		;RUECKKEHR
;
; INTERRUPTSERVICEROUTINE FUER TASTATUR-IO.TACTC
TST:	EI		;INTERRUPT FREIGEBEN
	PUSH	AF	;REGISTER RETTEN
	PUSH	HL	;
	LD	HL,(RM.TASTA)	;ANSPRUNGADRESSE NACH HL
	JMP	(HL)	;SPRUNG ZUM EINTRITTSPUNKT
; ABFRAGE FESTSTELLER UND UMSCHALTTASTE UND DER MATRIX
TA0:	LD	HL,RM.TASTA+7	;ADR. TASTATURSTATUS NACH HL
	LD	A,00FH	;SPALTE 0
	OUT	IO.TAPIO	;SPALTENWERT AUSGEBEN
	IN	IO.TBPIO	;ZEILE ABFRAGEN
	BIT	7,A	;TEST: FESTSTELLTASTE ?
	JRNZ	M3015-#	;NEIN
	SET	3,(HL)	;JA, KENNZEICHEN SETZEN
M3015:	BIT	6,A	;TEST: UMSCHALTTASTE ?
	JRNZ	M3020-#	;
	RES	3,(HL)	;JA, KENNZ. FESTSTELLER RUECKSETZEN
M301B:	LD	HL,RM.LPU	;ADR. DIODENBELEGUNG NACH HL
	SET	4,(HL)	;ANZEIGE FESTSTELLER RUECKSETZEN
	LD	HL,TK2	;ADR. KODETABELLE 2 NACH HL
	JR	M3027-#	;
M3020:	BIT	3,(HL)	;TEST: KENNZEICHEN FESTSTELLER ?
	LD	HL,RM.LPU	;ADR. DIODENBELEGUNG NACH HL
	RES	4,(HL)	;ANZEIGE FESTSTELLER
	LD	HL,TK1	;ADR. KODETABELLE 1 NACH HL
	JRNZ	M301B-#	;JA
M3027:	PUSH	HL	;ADR KODETABELLE AUF STACK RETTEN
	CALL	LED	;AUSGABE LEUCHTDIODEN
	LD	A,3	;
M3029:	INC	A	;SPALTENWERT ERHOEHEN
	LD	L,A	;UND IN L RETTEN
	CMP	00FH	;TEST: ALLE SPALTEN ABGEFRAGT ?
	JPNC	MA4	;JA
	OUT	IO.TAPIO	;NEIN, SPALTENAUSGABE
	IN	IO.TBPIO	;ZEILE EINLESEN
	CMP	0FFH	;TEST: TASTE BETAETIGT ?
	LD	H,A	;ZEILENWERT NACH H
	LD	A,L	;SPALTENWERT NACH A
	JRZ	M3029-#	;KEINE TASTE, ZYKLUS
	LD	(RM.TASTA+2),HL	;ZEILEN- UND SPALTENWERT EINTRAGEN
	XOR	00FH	;SPALTE MASKIEREN UND CY=0
	RLA		;SPALTE * 8
	RLA		;
	RLA		;
M3041:	DEC	A	;SPALTE - 1
	SLA	H	;ZEILENWERTE NACH CY SCHIEBEN
	JRC	M3041-#	;ZYKLUS, BIS CY=0
	POP	HL	;ADR. KODETABELLE ZURUECK
	ADD	L	;ANFANG KODETABELLE + RELATIVE TASTE
	LD	L,A	;
	JRNC	M304C-#	;
	INC	H	;
M304C:	LD	(RM.TASTA+4),HL	;ADR. TASTATURKODE EINTRAGEN
	LD	A,002H	;ABFRAGEZAEHLER SETZEN
	LD	(RM.TASTA+6),A	;UND EINTRAGEN
	LD	HL,TA1	;NEUEN EINTRITTSPUNKT EINTRAGEN
	LD	(RM.TASTA),HL	;
	JR	MA5-#	;
; ABFRAGE EINER ALS BETAETIGT ERKANNTEN TASTE, WARTEN AUF LOSLASSEN
TA1:	LD	HL,(RM.TASTA+2)	;ZEILEN- UND SPALTENWERT NACH HL
	LD	A,L	;SPALTE NACH A
	OUT	IO.TAPIO	;SPALTENAUSGABE
	IN	IO.TBPIO	;ZEILENABFRAGE
	CMP	H	;TEST: NOCH GLEICHE TASTE
	JRNZ	M307A-#	;NEIN
	LD	HL,RM.TASTA+6	;JA, ADR. ABFRAGEZAEHLER NACH HL
	DEC	(HL)	;ZAEHLER ERNIEDRIGEN
	JRNZ	MA5-#	;ZAEHLER >< 0
	INC	HL	;ADR. STATUS NACH HL
	BIT	5,(HL)	;TEST: FUNKTION GUELTIG?
	JRNZ	MA3-#	;JA
	DEC	HL	;ADR. ZAEHLER NACH HL
	LD	(HL),20H	;NEIN, VOREINSTELLUNG 640 MILLISEK.
	LD	HL,(RM.TASTA+4)	;ADR. TASTENKODE NACH HL
	LD	A,(HL)	;KODE NACH A
	CMP	0FDH	;TEST: RESET?
	JPZ	RES	;JA
	LD	HL,RM.TASTA+8	;ADR. FUER KODEEINTRAGUNG NACH HL
	LD	(HL),A	;KODE EINTRAGEN
	DEC	HL	;ADR. TASTATURSTATUS
	CMP	0FEH	;TEST: TASTE CONTROL?
	JRNZ	MA0-#	;NEIN
	SET	4,(HL)	;JA, KENNZEICHEN SETZEN
	JR	MA5-#	;
MA0:	BIT	4,(HL)	;TEST: VORHER TASTE CONTROL?
	JRZ	MA2-#	;NEIN
	CMP	'A'	;TEST: GROSSBUCHSTABE?
	JRC	MA1-#	;NEIN
	CMP	'['	;
	JRNC	MA1-#	;NEIN
	AND	1FH	;JA, MASKIEREN
	LD	(RM.TASTA+8),A	;
MA1:	RES	4,(HL)	;KENNZEICHEN CONTROL RUECKSETZEN
MA2:	RES	6,(HL)	;KENNZEICHEN, TASTE BETAETIGT
	SET	5,(HL)	;KENNZEICHEN, FUNKTION GUELTIG
	JR	MA5-#	;
MA3:	SET	0,(HL)	;KENNZEICHEN, DAUERFUNKTION
	RES	6,(HL)	;KENNZEICHEN, TASTE BETAETIGT (40 MILLISEK.)
	DEC	HL	;ADR. ZAEHLER NACH HL
	LD	(HL),2	;ZAEHLER FUER 40 MILLISEK.
	JR	MA5-#	;
M307A:	LD	HL,RM.TASTA+7	;TASTATUR RUECKSETZEN
	LD	A,018H	;KENNZEICHEN FESTSTELLER MASKIEREN
	AND	(HL)	;KENNZ. DAUERFKT., GUELTIGK. RUECKSETZEN
	OR	040H	;KENNZ. TASTE NICHT BETAETIGT
	LD	(HL),A	;WERTE EINTRAGEN
	INC	HL	;ADR. KODE
	LD	(HL),0	;KODE=0 EINTRAEN
	LD	HL,TA0	;NEUEN EINTRITTSPUNKT EINTRAGEN
	LD	(RM.TASTA),HL	;
	JR	MA5-#	;
MA4:	POP	HL	;STACKKORREKTUR
	LD	A,00FH	;TEST: SPALTE 0 BELEGT ?
	OUT	IO.TAPIO	;
	IN	IO.TBPIO	;
	CMP	0FFH	;
	JRNZ	MA5-#	;JA
	DI		;NEIN, INTERRUPT SPERREN
	LD	A,3	;IO.TACTC INTERRUPT SPERREN
	OUT	IO.TACTC	;
	OUT	IO.TAPIO	;WIEDERSTAENDE AUF L-POTENTIAL
	LD	A,0B7H	;PIO KANAL B RUECKSETZEN
	OUT	IO.TBPIO+2	;UND INTERRUPT FREIGEBEN
	SUB	A	;
	OUT	IO.TBPIO+2	;
	EI		;INTERRUPTFREIGABE
MA5:	POP	HL	;REGISTER RUECKSPEICHERN
MA7:	POP	AF	;
	RETI		;RUECKKEHR VOM INTERRUPT
; RESET AUSLOESEN
RES:	LD	A,1	;MONOFLOP TRIGGERN
	OUT	IO.TAPIO
RES1:	JR	RES1-#	;
;
; INTERRUPTSERVICEROUTINE FUER PIO KANAL B
TSU:	EI		;INTERRUPT FREIGABE
	PUSH	AF	;REGISTER RETTEN
	LD	A,3	;INTERRUPT KANAL B SPERREN
	OUT	IO.TBPIO+2	;
	LD	A,00FH	;SPALTE 0 ANWAEHLEN
	OUT	IO.TAPIO	;
	LD	A,0A7H	;IO.TACTC ALS ZEITGEBER INITIALISIEREN
	OUT	IO.TACTC	;
	LD	A,0C0H	;ZEITKONSTANTE 20 MILLISEK.
	OUT	IO.TACTC	;
	JR	MA7-#	;
;
; LED-ANSTEUERUNG
LED:	LD	A,(RM.LPU)	;DIODENANSTEUERWERTE NACH A
	AND	00FH	;BIT 0-3 AUSGEBEN
	OR	080H	;SPALTENDEKODER SPERREN
	OUT	IO.TAPIO	;
	OR	020H	;UBERNAHME IN REGISTER (D195)
	OUT	IO.TAPIO	;
	AND	08FH	;FLANKE
	OUT	IO.TAPIO	;
	LD	A,(RM.LPU)	;BIT 4-7 AUSGEBEN
	RLCA		;
	RLCA		;
	RLCA		;
	RLCA		;
	AND	00FH	;
	OR	080H	;
	OUT	IO.TAPIO	;
	OR	040H	;
	OUT	IO.TAPIO	;
	AND	08FH	;
	OUT	IO.TAPIO	;
	RET		;RUECKKEHR
;
; INITIALISIERUNG VON TASTATUR-PIO UND IO.TACTC
TAINI:	DI		;INTERRUPT SPERREN
	SUB	A	;LEUCHTDIODENPUFFER RUECKSETZEN
	LD	(RM.LPU),A	;
	LD	HL,TA0	;ANSPRUNGADRESSE EINTRAGEN
	LD	(RM.TASTA),HL	;
	LD	HL,00040H	;TASTATUR RUECKSETZEN
	LD	(RM.TASTA+7),HL	;
	LD	HL,TST	;INTERRUPTVERBINDUNGSADRESSEN
	LD	(IV.TACTC),HL	;EINTRAGEN
	LD	HL,TSU	;
	LD	(IV.TBPIO),HL	;
	LD	HL,INIDA	;ADR. INITIALISIERUNGSDATEN
	LD	BC,202H+IO.TAPIO	;ANZAHL UND KANAL
	OTIR		;
	LD	BC,502H+IO.TBPIO	;
	OTIR		;
	LD	A,3	;WIDERSTANDSNETZWERK AUF LOW
	OUT	IO.TAPIO	;
	LD	A,L(IV.TACTC)	;INTERRUPTVEKTOR
	OUT	IO.TACTC	;
	EI		;INTERRUPT FREIGABE
	RET		;
; INITIALISIERUNGSDATEN
INIDA:	DB	0CFH	;MODE 3
	DB	010H	;EA-STEUERWORT
	DB	L(IV.TBPIO)	;INTERRUPTVEKTOR KANAL B
	DB	0CFH	;MODE 3
	DB	0FFH	;EA-STEUERWORT
	DB	0B7H	;INTERRUPTSTEUERWORT
	DB	000H	;INTERRUPTMASKE
;
; TASTATURKODETABELLEN
TK1:	DBM	031H,051H,041H,059H,032H,057H,053H,058H	;
	DBM	033H,045H,044H,043H,034H,052H,046H,056H	;
	DBM	035H,054H,047H,042H,036H,05AH,048H,04EH	;
	DBM	037H,055H,04AH,04DH,038H,049H,04BH,02CH	;
	DBM	039H,04FH,04CH,02EH,030H,050H,05CH,02DH	;
	DBM	07EH,05DH,05BH,03CH,02BH,023H,000H,000H	;
	DBM	000H,00AH,009H,000H,020H,01FH,01FH,00AH	;
	DBM	0FFH,0FEH,01DH,00CH,01EH,001H,002H,000H	;
	DBM	000H,000H,000H,000H,000H,000H,000H,01CH	;
	DBM	000H,0FFH,019H,01AH,018H,008H,0FFH,0FDH	;
	DBM	000H,0FFH,0FFH,0FFH,000H,0FFH,000H,0FFH	;
TK2:	DBM	021H,071H,061H,079H,022H,077H,073H,078H	;
	DBM	040H,065H,064H,063H,024H,072H,066H,076H	;
	DBM	025H,074H,067H,062H,026H,07AH,068H,06EH	;
	DBM	02FH,075H,06AH,06DH,028H,069H,06BH,03BH	;
	DBM	029H,06FH,06CH,03AH,03DH,070H,07CH,05FH	;
	DBM	03FH,07DH,07BH,03EH,02AH,027H,000H,000H	;
	DBM	000H,00AH,009H,000H,020H,01FH,01FH,00AH	;
	DBM	0FFH,0FEH,01DH,00CH,01EH,001H,002H,000H	;
	DBM	000H,000H,000H,000H,000H,000H,000H,01CH	;
	DBM	000H,0FFH,019H,01AH,018H,008H,0FFH,0FDH	;
	DBM	000H,0FFH,0FFH,0FFH,000H,0FFH,000H,0FFH	;
;
	END

