;**************************************************************************
;
; Filename : TAST_AUSW.ASM
; ------------------------
;
; (c) 1990 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Programmverteiler für Tasten in der X/Y-Matrix
;
;
;**************************************************************************

MODUL_START	set	*	; Größe des Moduls berechnen




; =========================================================================
;
; Funktion	: Task für Tastaturabfrage
;
; Eingang	: ---------
;
; Ausgang	: ---------
;
; Register	: ---------
;
; (c) by Thomas Lehmann Januar 1991
;
; =========================================================================

tast_task	jsr wta_abfr	; Wähltastatur abfragen
	bcc tast_task_1	; keine Taste erkannt

	jsr st_dp_tim	; Taste gedrückt, Display Timer aufziehen
	jsr wta_ausw	; Taste auswerten, Prg. ausführen

tast_task_1	jsr tast_abfr	; Tasten in X/Y-Matrix abfragen
	bcc tast_task_2	; keine Taste erkannt

	jsr st_dp_tim	; Taste gedrückt, Display Timer aufziehen
	jsr tast_ausw	; Taste auswerten, Prg. ausführen

tast_task_2	jsr nxt_task	; nächste Task aktivieren
	bra tast_task	; neuer Durchlauf




; =========================================================================
;
; Funktion	: gedrückte Taste auswerten, Programmverteiler für Tasten
;
; Eingang	: Offset auf Tastatur-Matrix im Accu (Tastenwert 1-...)
;
; Ausgang	: entsprechendes Programm ausgewählt
;	: Offset auf Tastaturtabelle in X-Reg.
;	: Tastenwert in "tw"
;	: Tastenwert im Accu wenn BTA-MODUS ein
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

KEY_NR	set *


t_prg_tab	rta t_ausw_end	; TW 00, Taste nicht berrechtigt


HLP	set	*-KEY_NR
KEY_LTG	equ	HLP/2	; Tastenwert
	rta key_ltg	; Leitung

HLP	set	*-KEY_NR
KEY_TRN	equ	HLP/2
	rta key_trenn	; Trennen

HLP	set	*-KEY_NR
KEY_HLT	equ	HLP/2
	rta key_halten	; Halten
	rta key_ww	; Wahlwiederholung
	rta key_merker	; Merker

HLP	set	*-KEY_NR
KEY_FSLH	equ	HLP/2
	rta key_fslh	; Freisprechen/Lauthören ein/aus

	rta key_su	; Summer ein/aus

HLP	set	*-KEY_NR
KEY_BEA	equ	HLP/2
	rta key_beantw	; Anrufbeantworter ein/aus

HLP	set	*-KEY_NR
KEY_POST	equ	HLP/2
	rta key_post	; Postapparat ein/aus

HLP	set	*-KEY_NR
KEY_MOD	equ	HLP/2
	rta key_modem	; Modem ein/aus

HLP	set	*-KEY_NR
KEY_ERDE	equ	HLP/2
	rta key_erde	; Erd-Taste

HLP	set	*-KEY_NR
KEY_KO	equ	HLP/2
	rta key_kontr	; Kontrolle

HLP	set	*-KEY_NR
KEY_SP	equ	HLP/2
	rta key_sp	; Speicher

HLP	set	*-KEY_NR
KEY_2SP	equ	HLP/2
	rta key_2sp	; 2.Speicher

HLP	set	*-KEY_NR
KEY_ENDE	equ	HLP/2
	rta key_ende	; Ende

	rta key_loesch	; löschen

HLP	set	*-KEY_NR
KEY_UHR	equ	HLP/2
	rta key_uhr	; Uhr stellen

HLP	set	*-KEY_NR
KEY_TELBUCH	equ	HLP/2
	rta key_telbuch	; Telefonbuch

HLP	set	*-KEY_NR
KEY_NAM	equ	HLP/2
	rta key_namen	; Namentasten

HLP	set	*-KEY_NR
KEY_BABY	equ	HLP/2
	rta key_baby	; Babyruf Funktion

HLP	set	*-KEY_NR
KEY_TASTER	equ	HLP/2
	rta key_taster	; Taster
	rta key_schalt	; Schalter

	rta key_stat	; Statistik anzeigen
	rta bta	; BTA
	rta key_vers	; Version anzeigen
	rta init_stk	; Reset

HLP	set	*-KEY_NR
KEY_TMODE	equ	HLP/2
	rta key_tmode	; Terminal Mode



TAB_LEN	set	*-t_prg_tab	; Tabellenlänge
ANZ_TAST	equ	TAB_LEN/2		; Anzahl der zu programmierenden Tasten




tast_ausw	dec a		; Offset auf Tastatur-Matrix 0-...
	asl		; je zwei Bytes pro Taste, TW und Tastennr.
	tax		; Offset auf Tasteneintrag in Tabelle laden
	lda tast_tab,x	; Tastenwert aus Berechtigung holen
	sta tw		; Tastenwert ablegen


	; Sonderfunktion wenn "SS off" testen
	; -----------------------------------
	jsr key_ss_off	; testen ob Taste erlaubt ist
	bcc t_ausw_end	; Taste ist nicht zugelassen bei SS off


t_ausw_1	bbs MOD_NO_KEY,modus,t_ausw_end	; Tastaturausw. gesperrt
	bbs MOD_KEYSPEC,modus,key_spec	; Spezialfunktion ausführen

	jsr tst_key_txt	; testen ob Textmodus für Taste eingeschaltet
	bcs t_ausw_end	; Taste hatte Textfunktion, Ende


	; Prg. für Taste ausführen
	; ------------------------
tast_ausw_2	asl		; TW, Offset auf Programmtabelle erzeugen
	cmp #TAB_LEN	; Taste außerhalb des Gültigkeitsbereichs ?
	bcs t_ausw_end	; ja, nicht ausführen

	tay
	lda t_prg_tab+1,y	; high Byte der Programmadr. laden
	pha
	lda t_prg_tab,y	; dito low Byte
	pha
	lda tw		; Tastenwert laden

t_ausw_end	rts		; und Programm ausführen



; =========================================================================
;
; Funktion	: Tastendruck während Tasten Spezialfunktion haben
;	  beide LED`s in der Taste werden eingeschaltet
;
; Eingang	: Tastenwert im Accu
;	: Offset auf Tastaturtabelle in X-Reg.
;
; Ausgang	: -------
;
; Register	: Accu, Y
;
; (c) by Thomas Lehmann Januar 1991
;
; =========================================================================

key_spec	bbs MOD_KO,modus,put_keyval	; Tastenwert ausgeben

	pha		; Tastenwert retten
	lda #LD_L|LD_R|LD_ON	; LED-Wert laden
	jsr set_led	; und beide LED einschalten
	pla		; TW zurück
	bbs MOD_TXT,modus,key_spec_1	; ASCII-Text auf Taste berechtigen

	jmp keyber	; Taste berechtigen
key_spec_1	jmp key_ascii	; ASCII-Text auf Taste berechtigen


; =========================================================================
;
; Funktion	: testen ob Tastendruck bei SS off zugelassen
;
; Eingang	: Tastenwert im Accu
;	: Offset auf Tastaturtabelle in X-Reg.
;
; Ausgang	: clc == Taste nicht zugelassen bei SS off
;	  sec == Taste zugelassen
;
; Register	: --------
;
; (c) by Thomas Lehmann Juni 1991
;
; =========================================================================

key_ss_tab	byte KEY_ENDE
	byte KEY_LTG
	byte KEY_HLT
	byte KEY_TRN

TAB_LEN	set *-key_ss_tab


key_ss_off
	block
	pha		; Tastenwert retten
	phx		; Offset auf Tastenber. retten

	sec		; Taste erstmal zugelassen
	bbs SS_STAT,allg_stat,key_ok	; SS ist eingeschaltet, Taste OK

	; alle zugelassenen Tasten testen
	; -------------------------------
	ldx #TAB_LEN-1	; Tabellen Offset
loop	cmp key_ss_tab,x	; Taste zugelassen ?
	beq key_ok	; ja, Ende (SEC)

	dex
	bpl loop

	clc		; Taste nicht zugelassen
key_ok	plx		; Register zurück
	pla
	rts
	bend


; =========================================================================
;
; Funktion	: testen ob Taste Textfunktion hat
;
; Eingang	: Tastenwert im Accu
;	: Offset auf Tastaturtabelle in X-Reg.
;
; Ausgang	: sec == Taste nicht weiter bearbeiten
;	  clc == Taste auswerten
;
; Register	: --------
;
; (c) by Thomas Lehmann August 1991
;
; =========================================================================

keytxt_tab	word ttxt_ein	; Text in Termintext-Buffer eintragen
	word telb_name	; Name für Telefonbuch eingeben

keytxt_jmp	ldx keytxt_prg	; Prg. für Tastentext Funktion laden
	jmp (keytxt_tab,x)	; Programm ausführen


tst_key_txt
	block
	clc		; Taste hat keine Textfunktion
	bbr MOD_TXT,modus,end_1	; Textmodus ist ausgeschaltet

	; testen ob Textzeichen auf Taste berechtigt ist
	; ----------------------------------------------
	pha		; Tastenwert retten
	phx		; Offset auf Tastenber. retten
	txa		; Offset auf Tastenberechtigung kopieren
	lsr		; Offs. auf Text, CLC da immer modulo 2
	tax
	lda tast_txt,x	; Textwert aus Berechtigung laden
	beq end		; Taste hat keine Textfunktion, CLC

	jsr keytxt_jmp	; Funktion für Tasten Text ausführen
	sec		; Taste hat Textf., kein Tastenprg. ausführen

end	plx		; Register zurück
	pla
end_1	rts
	bend



; =========================================================================
;
; Funktion	: Tastenwert und Text einer gedrückten Taste ausgeben
;	  Funktion wird durch "#" verlassen
;
; Eingang	: Tastenwert im Accu
;	: Offset auf Tastaturtabelle in X-Reg.
;
; Ausgang	: -------
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann Januar 1991
;
; =========================================================================

show_key	lda #WTA_SHOWKEY	; Wähltasten umleiten
	sta wta_prg
	smb MOD_KEYSPEC,modus	; aktuellen Modus einleiten
	ldx #<key_txt	; Text ausgeben
	ldy #>key_txt
	jmp puttxt

key_txt	byte DSP_CLR
	shift	"Taste ?   #=Ende"



	; Einsprung wenn Taste gedrückt
	; Tastentext und Tastenwert und Text ausgeben
	; "A" 1600 loesch/quittier
	; -------------------------------------------
put_keyval	phx		; Tasten Offset retten
	txa
	lsr a		; Offset auf Textber. erzeugen
	tax

	jsr dp_clr	; Display löschen
	lda tast_txt,x	; ASCII-Zeichen für Taste aus Ber. holen
	beq put_kval_1

	jsr putchar	; Tasten Text Zeichen ausgeben
	jsr space
put_kval_1	plx

	; Berechtigungs Wert und Name ausgeben
	; ------------------------------------
	lda tast_tab+1,x	; Tastennr. laden
	pha
	lda tast_tab,x	; Tastenfunktion laden
	tax
	jsr get_keyber	; Adr. der Tastenberechtigung ermitteln
	plx		; Tastennr. zurück
	jmp put_keyber	; Tastenwert und Text ausgeben



	; =======================
	; Einsprung bei Wähltaste
	; =======================
wta_showkey	cmp #SHOWKEY_END	; Ende ?
	bne showkey_e	; nein, weiter Tastenwerte zeigen

	jmp key_ende	; Key Ende ausführen

showkey_e	ldx #<keywta_txt	; Text ausgeben
	ldy #>keywta_txt
	jsr puttxt
	jsr wta_to_asc	; Wtastenwert in ASCII wandeln
	jmp putchar	; Tasten Nr. ausgeben

keywta_txt	byte DSP_CLR
	shift "Waehltaste "





; =========================================================================
;
; Funktion	: gedrückte Wähltaste auswerten, Programmverteiler für Wähltasten
;
; Eingang	: Tastenwert (1-12) im Accu
;
; Ausgang	: ---------
;
; Register	: X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

wta_ausw	ldx wta_prg	Programmnr. bei Wähltaste
	jmp (wta_prg_tab,x)	Programm ausführen


	; ====================================
	; Tabelle der Funktionen bei Wähltaste
	; ====================================
wta_prg_tab	word wta_wahl	00, Wahl auf Leitung
	word wta_funkt	Funktion der Wähltaste über Tabelle
	word wta_bta_whl	BTA Modus auswählen
	word wta_keyber	BTA Modus Tastenberechtigung
	word wta_ascii	BTA Modus Textberechtigung
	word wta_uhrst	Uhr stellen
	word wta_showkey	Tastenwert zeigen
	word wta_spnam	Namentasten speichern
	word wta_termwhl	Terminnr. auswählen
	word wta_termein	Terminzeit eingeben
	word wta_termtxt	Termintext eingeben
	word wta_termday	Termintage eingeben
	word wta_stat	Statistik Menu auswählen
	word wta_berclr	Tastenberechtigung löschen ?
	word wta_sprel	Relais speichern
	word wta_spgeb	Gebührenfaktor speichern
	word wta_setup	Setup Routine
	word wta_sptzykl	Termin Zyklus
	word wta_tmode	Terminal Mode aktiv

	word _rts	kein Programm ausführen



_rts	rts


; =========================================================================
;
; Funktion	: Funktionstabelle für Wähltasten installieren
;	  die Wähltasten werden automatisch auf "wta_funkt" umgeleitet
;
; Eingang	: Tabellenlänge (2-Byte Länge) im Accu
;	  Adr. der Tabelle in X/Y
;
; Ausgang	: ---------
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

set_wta_fkt	sta wta_tab_len	; Größe der Tabelle
	stx wta_fkt	; Adresse der Funktions-Tabelle eintragen
	sty wta_fkt+1
	lda #WTA_FUNKT	; Wähltasten auf Funktionsauswertung umleiten
	sta wta_prg
	rts


; =========================================================================
;
; Funktion	: Funktion für betätigte Wähltaste über Tabelle ausführen
;
; Eingang	: Tastenwert (1-12) im Accu
;
; Ausgang	: ---------
;
; Register	: Accu, Y
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

wta_funkt	dec a		; Tastenwert 0-... erzeugen
	asl		; mal 2 = Offset auf Programm
	tay
	cpy wta_tab_len	; ist Wähltaste gültig ?
	bcs _rts	; nein, Ende

	lda (wta_fkt),y	; Adr. der Funktion für Wähltaste laden
	sta hlp_reg
	iny
	lda (wta_fkt),y
	sta hlp_reg+1
	jmp (hlp_reg)	; Programm für gedrückte Wähltaste ausführen




; =========================================================================
;
; Funktion	: Taste in Tasten-Berechtigung suchen
;
; Eingang	: TW im Accu
;	  Tastennr. in Y, nur TW Y == $ff
;	  Offset ab wo gesucht wird in X, (vom Beginn an == 00)
;
; Ausgang	: SEC == Taste gefunden
;	  Offset auf Tastenber. der gefundenen Taste in X
;
; Register	: X
;
; (c) by Thomas Lehmann August 1991
;
; =========================================================================

search_key
	block
loop	inx		; nächste Taste einstellen
	inx
	cpx #TAST_BER	; alle Tasten getestet ?
	bcs no_key	; ja, Ende

	cmp tast_tab,x	; TW mit Taste aus Ber. vergleichen
	bne loop	; nächste Taste testen

	; Tastennr. testen
	; ----------------
	pha		; TW retten
	tya		; Tastennr. laden
	cmp #$ff	; Tastennr. ebenfalls testen ?
	beq found_key	; nein, Taste gefunden (SEC), Offset in X

	cmp tast_tab+1,x	; Tastennr. auch gleich ?
	beq found_key	; TW ist gleich (SEC), Offset in X

	pla		; TW zurück
	bra loop	; nein, nächsten Tastenwert testen


no_key	clc		; Taste nicht gefunden
	rts

found_key	pla		; TW zurück
	rts
	bend



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

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

