;**************************************************************************
;
; Filename : TAST_ABFR.ASM
; ------------------------
;
; (c) 1990 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Tastaturabfrage
;
;
;**************************************************************************

MODUL_START	set	*	; Größe des Moduls berechnen

; =========================================================================
;
; Type	: Hauptprg.
;	: Wähltastatur abfragen
;
; Eingang	: -------
;
; Ausgang	: carry=1 Taste erkannt
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

wta_abfr	lda akt_mb	; gibt die MB-Achse an, welche gesetzt wird
	sta Wta_port	; aktuelle MB-Achse einschalten, set=0

	; gedrückte Taste einlesen
	; ------------------------
	lda Wta_port	; Verbindung zu MA-Achsen laden
	and #$FF^HTON	; Hörton-BIT ausblenden
	sta wta_merk	; Zustand merken
	eor #$ff	; entsprechender MA=0 wenn Verbindung vorhanden
	and #%01110000	; MB0-3 und PA7 ausblenden
	beq nxt_mb	; keine Taste gedrückt, nächsten MB einstellen

	lda wtast	; Taste noch gedrückt ?
	beq wta_1	; nein, direkt auswerten

	; Tasten Repeat ermöglichen
	; -------------------------
	dec wta_repeat	; Repeat Counter runterzählen
	bne wta_end	; kein Überlauf
	dec wta_repeat+1	; high Byte nachführen
	bne wta_end	; noch nicht erreicht, Ende


	; Taste entprellen
	; ----------------
wta_1	lda #WTA_PR_TIM	; Timerwert laden
	jsr task_delay	; Taste entprellen

	lda Wta_port	; Zustand des Ports laden
	and #$FF^HTON	; Hörton-BIT ausblenden
	cmp wta_merk	; Zustand vor Entprellung,Taste noch gedrückt ?
	beq wta_ber	; ja, Tastenwert berrechnen

	; nächste MB-Achse einstellen
	; ---------------------------
nxt_mb	stz wtast	; Taste wurde losgelassen, keine Taste gedrückt
	sec		; 1 nachschieben
	ror akt_mb	; nächste MB-Achse einstellen
	bcs wta_end	; nicht alle Achsen getestet
	lda #MB4	; MB4 einstellen, set=0
	sta akt_mb

wta_end	clc		; keine Taste erkannt
	rts



; =========================================================================
;
; Type	: Unterprg.
;	: gedrückte Wähltaste berrechnen
;
; Eingang	: Zustand MA/MB Port im Accu
;	: zB.: Taste auf MA0 und MB0 = X1101110
;
; Ausgang	: carry=1 Taste erkannt
;	: Tastenwert 1-12 in "wtast"
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

wta_ber	eor #$ff	; gesetzter Port =1
	sta wtast	; Zustand des Ports ablegen
	lda #01		; Offset auf MA0/MB0, 1-12
	ldx #3		; Anzahl der MB
	sec		; nur falls kein MA oder MB gefunden wird

wta_ber_0	ror wtast	; gesetzen MB ermitteln
	bcs wta_ber_1	; MB gefunden, set=0
	adc #3		; Offset pro MB
	dex		; Anzahl der getesteten MB-1
	bra wta_ber_0	; nächsten MB testen

wta_ber_1	dex		; auf MA einstellen
	bmi wta_ber_2	; steht bereits auf MA
	ror wtast	; MB ausblenden
	bra wta_ber_1	; alle MB ausblenden

wta_ber_2	ror wtast	; gesetzten MA ermitteln
	bcs wta_ber_3	; MA gefunden
	inc a		; Offset auf MA
	bra wta_ber_2	; nächsten MA testen


; ---------------------------------------------------------------
; Tastenreihenfolge erzeugen : 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, #, *
; ---------------------------------------------------------------

wta_ber_3	tax		; Tastennr. 1-12 kopieren
	cpx #10		; ist es Taste 1-9
	bcc wta_ber_4	; ja, Taste ok
	bne wta_ber_5	; Taste ist "0" oder "#"

	inx		; Taste ist "*", TW=11
	inx
	bra wta_ber_4

wta_ber_5	dex		; TW "0"=10, TW "#"=11

wta_ber_4	stx wtast	; gedrückte Taste zur Auswertung ablegen
	stz wta_repeat	; WTasten Repeat aufziehen 
	lda #2
	sta wta_repeat+1
	txa		; Wähltaste im Accu
	sec		; Taste erkannt
	rts


; =========================================================================
;
; Funktion	: Tasten in X/Y-Matrix abfragen
;
; Eingang	: -------
;
; Ausgang	: Offset auf Tastatur-Matrix der gedrückten Taste in "taste"
;	: clc = keine Taste gedrückt
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================


	; ================
	; X0 und X1 testen
	; ================

tast_abfr	lda akt_x	; aktuelle X-Achse
	beq tast_1	; X0 setzen
	cmp #2		; X0 und X1 schon getestet ?
	bcs tast_2	; ja, X2-E setzen

	; X1 einschalten
	; --------------
	lda #$ce	; CB2=0 / CA2=1
	sta Tout_1	; X1 einschalten
	bra get_y	; Y-Achsen testen

	; X0 einschalten
	; --------------
tast_1	lda #$ec	; CB2=1 / CA2=0
	sta Tout_1	; X0 einschalten
	bra get_y	; Y-Achsen testen


	; ================
	; X2 bis XE testen
	; ================
tast_2	lda #$ee	; CB2=1 / CA2=1
	sta Tout_1	; X0 und X1 ausschalten
	lda akt_x	; aktuelle X-Achse laden
	cmp #2		; X2 testen ?
	beq tast_03	; ja, X2 einstellen
	cmp #$0a	; XA testen ?
	bne tast_3	; nein, XA nicht einstellen

tast_03	ldx #%11111110	; X2 bzw. XA einstellen
	stx x_achse


	; X2-X9 einschalten
	; -----------------
tast_3	cmp #$0a	; X2-X9 schon getestet ?
	bcs tast_4	; ja, XA-XE testen
	
	lda #00		; XA-XE zurücksetzen
	ora txen_rl23	; Zustand TX-Enable und RL2/3 nicht verändern
	sta Tout_3	; X-Achse ausschalten, set=1
	
	lda x_achse	; gibt die aktuelle X-Achse an
	sta Tout_2	; X-Achse einschalten, set=0
	sta x2_9_merk	; Zustand X2-X9 laden, Display RS-Flag
	bra get_y	; Y-Achsen testen

	; XA-XE einschalten
	; -----------------
tast_4	lda #$ff	; X2-X9 zurücksetzen
	sta x2_9_merk	; Zustand X2-X9 laden, Display RS-Flag
	sta Tout_2	; X-Achse ausschalten, set=0

	lda x_achse	; gibt die aktuelle X-Achse an
	eor #$ff	; set=1
	ora txen_rl23	; Zustand TX-Enable und RL2/3 nicht verändern
	sta Tout_3	; X-Achse einschalten, set=1


	; Y-Achsen einlesen
	; -----------------
get_y	lda Tin		; Y-Achsen einlesen
	sta tast_merk	; Zustand merken
	eor #$ff	; wenn Verbindung vorhanden, entspr. Y-Achse=0
	beq nxt_x	; keine Taste gedrückt, nächste X-Achse einst.

	lda taste	; Taste noch gedrückt ?
	beq tast_5	; nein, direkt auswerten

	; Tasten Repeat ermöglichen
	; -------------------------
	dec key_repeat	; Repeat Counter runterzählen
	bne tast_end	; kein Überlauf
	dec key_repeat+1	; high Byte nachführen
	bne tast_end	; noch nicht erreicht, Ende


	; Taste entprellen
	; ----------------
tast_5	lda #TA_PR_TIM	; Timerwert laden
	jsr task_delay	; Taste entprellen

	lda x2_9_merk	; Zustand X2-X9 laden, Display RS-Flag
	sta Tout_2	; und entsprechend schalten

	lda tast_merk	; Zustand vor Entprellung laden
	cmp Tin		; ist Taste noch gedrückt ?
	beq tast_ber	; Tastenwert berrechnen


	; nächste X-Achse einstellen
	; ---------------------------
nxt_x	stz taste	; Taste wurde losgelassen, keine Taste gedrückt
	stz tw		; Tastenwert löschen
	inc akt_x	; nächste X-Achse testen
	sec		; 1 nachschieben
	rol x_achse	; nächste X-Achse einstellen

	ldx akt_x	; aktuelle X-Achse laden
	cpx #$10	; alle Achsen getestet ?, und Port clr
	bcc tast_end	; nein
	stz akt_x	; X0 einstellen

tast_end	clc		; keine Taste erkannt
	rts





; =========================================================================
;
; Type	: Unterprg.
;	: Offset auf Tastaturtabelle in X/Y-Matrix berrechnen
;
; Eingang	: Zustand Y-Port im Accu
;	: aktuelle X-Achse in akt_x
;
; Ausgang	: carry=1 Taste erkannt
;	: Tastenwert 1-... in "taste"
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

tast_ber	sta taste	; Zustand des Y-Ports ablegen
	lda #01		; Offset auf Tastaturtabelle, 1-...

ta_ber_0	lsr taste	; Y-Achse ermitteln
	bcc ta_ber_1	; Achse gefunden, set=0
	clc
	adc #MAX_X	; Offset pro Y-Achse
	bra ta_ber_0	; nächste Achse testen

ta_ber_1	stz key_repeat	; Tasten Repeat aufziehen 
	ldx #3
	stx key_repeat+1
	adc akt_x	; aktuelle X-Achse dazu
	sta taste	; Tastenwert ablegen
	sec		; Taste erkannt
	rts




; --------------------------------------------------------------------------

HLP	set	*
_TAST_ABFR	equ	HLP-MODUL_START		; Größe des Moduls

