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


; =========================================================================
;
; Type	: Hauptprg.
;
; Eingang	: bei Wähltaste
;	: Tastenwert im Accu
;
; Ausgang	: Wähltaste in Wahlbuffer legen
;	: Passwort für BTA testen und wenn korrekt BTA-Modus einschalten
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

passwort	.byte 2,5,8,10,11,0	; BTA Passwort : "2", "5", "8", "#"

	; ================
	; BTA-Modus testen
	; ================

wta_wahl	bbs LTG_BEL,ltg_stat,whl_ziff	; Ltg. ist belegt, Ziffer wählen

	ldx passw_offs	; ist BTA-Modus vorbereitet
	beq wta_whl_1	; nein, BTA einleiten ?

	dex		; Offset auf Tabelle
	cmp passwort,x	; stimmt Zeichen mit Passwort überein ?
	bne wta_whl_2	; nein, BTA nicht mehr vorbereitet

	inc passw_offs	; nächstes Zeichen im Passwort einstellen
	lda passwort+1,x	; komplettes Passwort eingegeben ?
	bne wta_whl_end	; nein, Ende

	jmp bta_mod_whl	; BTA-Wahl einschalten

wta_whl_2	stz passw_offs	; BTA-Modus neu starten

wta_whl_1	cmp #BTA_START	; soll BTA eingeleitet werden ?
	bne whl_ziff	; nein, Wahlziffer eintragen

	lda #01		; Offset auf Passwort laden
	sta passw_offs
wta_whl_end	rts



; =========================================================================
;
; Type	: Hauptprg.
;	: Wahlziffern eintragen, Wahl starten
;
; Eingang	: Wahlziffer im Accu
;
; Ausgang	: Wahlziffer im Wahlbuffer eingetragen
;	: Comfortanschaltung
;
; Register	: ------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

whl_ziff	phx		; Register retten
	ldx wahl_bu_po	; Pointer auf Wahlbuffer laden
	cpx #MAX_WHL_ZIFF-1	; max. Anzahl der Wahlziffern erreicht ?
	bcs whl_z_end	; ja, Wahlbuffer voll, Ende

	sta wahl_buff,x	; Ziffer in Buffer eintragen	
	stz wahl_buff+1,x	; letzte Ziffer kennzeichnen
	cpx #00		; ist es die erste Ziffer ?
	bne whl_out	; nein

	jsr dp_clr	; Display löschen
whl_out	pha		; Wahlziffer retten
	txa		; Cursorposition in Accu
	jsr curs_set	; Cursor setzen
	pla		; Wahlziffer zurück
	jsr wta_displ	; Ziffer im Display anzeigen
	inc wahl_bu_po	; Pointer auf Wahlbuffer nachführen
	stz whl_cu_po	; Wahlablauf Cursor neu setzen
	bbs LTG_BEL,ltg_stat,whl_z_end	; Ltg. ist belegt

	jsr key_ltg	; Leitung belegen
whl_z_end	plx		; Register zurück
	rts


; =========================================================================
;
; Type	: Unterprg.
;	: Wahlziffern erneut im Display anzeigen
;
; Eingang	: bei Ende Taste
;
; Ausgang	: Wahlziffern im Display
;
; Register	: Accu, Y
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

whl_displ	ldy #00		; Offset auf Wahlziffer laden
whl_dp_lp	cpy wahl_bu_po	; alle Ziffern ausgegeben ?
	bcs whl_displ_e	; ja, Ende

	lda wahl_buff,y	; Ziffer aus Buffer holen
	cpy #00		; ist es die erste Ziffer ?
	bne whl_dp_out	; nein

	jsr dp_clr	; Display löschen
whl_dp_out	jsr wta_displ	; Ziffer im Display anzeigen
	iny
	bne whl_dp_lp	; nächste Ziffer ausgeben

whl_displ_e	rts


; =========================================================================
;
; Type	: Interrupprg.
;	: Ziffern wählen
;
; Eingang	: alle 10mS
;
; Ausgang	: die im Wahlbuffer eingetragenen Wahlziffer(n) gewählt
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

wahl	bbs LTG_WHL,ltg_stat,ziff_whl	; Wahl läuft, Ziffer zu Ende wählen

	ldx wahl_po	; Wahlpointer laden
	cpx wahl_bu_po	; sind Ziffern im Wahlbuffer ?
	bcs wahl_end	; nein, Ende

	inc wahl_po	; Wahlpointer auf nächste Ziffer stellen
	lda wahl_buff,x	; Ziffer aus Wahlbuffer holen
	beq wahl_end	; alle Ziffern gewählt, Wahlende

	cmp #11		; ist Zeichen Wahlziffer ?
	bcs wahl_end_1	; nein, Wahlziffer nicht eintragen

	sta ziffer	; Anzahl der Impulse eintragen
	smb LTG_WHL,ltg_stat	; Wahl läuft eintragen
	cpx #00		; ist es 1. Ziffer ?
	bne wahl_zw_t	; nein, Zwischenwahlzeit setzen

	ldx #VORWHL_TIM	; Timerwert Vorwahlzeit laden
	stx struct_tim+WHL_TIM_O	; und Wahl-Timer starten
	bra ziff_whl	; und Ziffer wählen

wahl_zw_t	ldx #ZWWHL_TIM	; Timerwert Zwischenwahlzeit laden
	stx struct_tim+WHL_TIM_O	; und Wahl-Timer starten
	bra ziff_whl	; und Ziffer wählen

wahl_end	jsr nsa_off	; Wahlende, NSA-Relais ausschalten
ziff_end	rmb LTG_WHL,ltg_stat	; komplette Ziffer gewählt eintragen
wahl_end_1	rts


	; Ziffer wählen
	; -------------
ziff_whl	lda struct_tim+WHL_TIM_O	; Wahltimer abgelaufen ?
	bne wahl_end_1	; nein, Ende

	lda Via_portb	; Zustand der VIA einlesen
	bit #NSA	; ist NSA eingeschaltet ?
	bne whl_0	; ja, NSI schalten

	lda #NSION_TIM	; Timerwert "NSI ein" laden
	sta struct_tim+WHL_TIM_O	; und Wahl-Timer starten
	jmp nsa_on	; NSA-Relais für Wahldauer einschalten

whl_0	bit #NSI	; ist NSI eingeschaltet ?
	bne whl_1	; ja, NSI ausschalten

	jsr nsi_on	; NSI-Relais für 60mS anziehen lassen
	dec ziffer	; Anzahl der Impulse für Wahlziffer
	beq ziff_end	; komplette Ziffer gewählt

	lda #NSION_TIM	; Timerwert "NSI ein" laden
	sta struct_tim+WHL_TIM_O	; und Wahl-Timer starten
	rts		; Ende


whl_1	jsr nsi_off	; NSI-Relais für 40mS abfallen lassen
	lda #NSIOFF_TIM	; Timerwert "NSI aus" laden
	sta struct_tim+WHL_TIM_O	; und Wahl-Timer starten
	bra wahl_end_1	; Ende



; =========================================================================
;
; Type	: Hauptprg.
;	: Wahlablauf Cursor zeigen
;
; Eingang	: wird vom Displayprg.-Verteiler aufgerufen
;
; Ausgang	: Wahlablauf Cursor auf aktuelle Ziffer gesetzt
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

whl_abl	bbs LTG_WHL,ltg_stat,whl_abl_1	; Wahl läuft
	jmp curs_off	; Wahlablauf Cursor ausschalten

whl_abl_1	ldx wahl_po	; Wahlpointer auf akt. Ziffer laden
	cpx whl_cu_po	; ist Cursor auf akt. Ziffer ?
	beq whl_abl_end	; ja, nicht neu setzen

	stx whl_cu_po	; Wahlablauf Cursorposition merken
	dex
	txa
	ldy dp_bu_po	; aktuelle Cursorposition laden
	jsr curs_set	; Cursor auf Wahl-Ziffer setzen
	jsr curs_on	; Cursor einschalten, Cursor blinkt
	sty dp_bu_po	; alte Cursorposition zurückschreiben
whl_abl_end	rts


