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

MODUL_START	set	*	; Größe des Moduls berechnen

; =========================================================================
;
; 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", "0", "#"

	; ================
	; 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 ?

	bbr SS_STAT,allg_stat,wta_whl_2	; SS ist ausgeschaltet, kein BTA

	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		; BTA-Menu 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

	inc passw_offs
wta_whl_end	rts



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

whl_ziff
	block
	phx		; Register retten
	ldx whl_zcnt	; Anzahl Wahlziffern laden
	cpx #MAX_WHL_ZIFF	; max. Anzahl der Wahlziffern erreicht ?
	bcc whl_ziff_1	; nein, Ziffer in Wahlbuffer eintragen

	; einzelne Ziffern können noch gewählt werden
	; -------------------------------------------
	cpx wahl_po	; sind noch Ziffern zu wählen ?
	bne end		; ja, erst Ende der Wahl abwarten, Ende
	bbs LTG_WHL,ltg_stat,end	; Wahl läuft, Ziffer zu Ende wählen

	dex		; letzte Ziffer in Wahlbuffer überschreiben
	sei
	dec whl_zcnt	; Anzahl Wahlziffern bleibt gleich
	dec wahl_po	; einzelne Wahl-Ziffer zulassen
	cli

	; Wahl Buffer füllen
	; ------------------
whl_ziff_1	sta wahl_buff,x	; Ziffer in Wahl-Buffer eintragen
	stz wahl_buff+1,x	; letzte Ziffer kennzeichnen
	bbs SS_STAT,allg_stat,whlz_ok	; SS ist eingeschaltet, Wahl OK

	jsr notruf_chk	; Notruf testen
	stz wahl_buff,x	; letzte Ziffer erstmal löschen
            bcc end		; Ziffer nicht zugelassen

whlz_ok	sta wahl_buff,x	; Ziffer in Wahl-Buffer eintragen
	rmb WHL_START,hgeb_stat	; Wahl noch nicht gestartet
	rmb GEB_OUT,hgeb_stat	; Gebührenanzeige ausschalten
	bbs LTG_DURCH,ltg_stat,ziff_cnt	; Ltg. ist belegt

	jsr key_ltg	; Leitung belegen (Comfort, aus Halten)

ziff_cnt	sei
	inc whl_zcnt	; Anzahl Wahlziffern nachführen
end	jsr key_ende	; Display Prg. für Wahl einschalten
	cli
	plx		; Register zurück
	rts

	bend


; =========================================================================
;
; Funktion	: Wahlziffern im Display anzeigen
;
; Eingang	: ---------
;
; Ausgang	: ---------
;
; Register	: Accu, Y
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================

whl_displ
	block
	ldy #00		; Offset auf Wahlziffer laden
loop	lda wahl_buff,y	; Ziffer aus Buffer holen
	beq end		; alle Ziffern ausgegeben, Ende

	dec whl_cu_po	; Wahlablauf Cursor neu setzen
	jsr wta_displ	; Ziffer im Display anzeigen
	iny
	bra loop	; nächste Ziffer ausgeben

end	bbr ST_BABY,no_ini_flag,end_1	; Babyruf nicht aktiv

	jmp put_babyruf	; "Baybyruf" ausgeben

end_1	rts
	bend


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

wahl	bbr LTG_DURCH,ltg_stat,wahl_end_1	; Ltg. nicht belegt, Ende
	bbs LTG_WHL,ltg_stat,ziff_whl	; Wahl läuft, Ziffer zu Ende wählen
	bbs WHL_ERDE,ltg_stat,wahl_end_1	; Erde wir gewählt

	ldx wahl_po	; Wahlpointer laden
	cpx whl_zcnt	; sind noch Ziffern zu wählen ?
	bcs wahl_end	; alle Ziffern gewählt, Wahlende

	lda wahl_buff,x	; Ziffer aus Wahlbuffer holen
	inc wahl_po	; Wahlpointer auf nächste Ziffer stellen
	cmp #ERD_ZIFF	; ist es Erdtaste ?
	bne wahl_1	; nein, normale Wähltaste

	; Erde wählen
	; -----------
	jmp wahl_erde	; Erde wählen


wahl_1	bbr HTON_OK,hgeb_stat,wahl_end_1	; auf Hörton warten

	; Wahlziffer wählen
	; -----------------
	cmp #HTON_ZIFF	; ist Zeichen Hörtonziffer ?
	bne wahl_2	; nein

	jmp hton_on	; Hörtonauswert. einschalten und auf Ton warten

wahl_2	cmp #11		; ist Zeichen Wahlziffer ?
	bcs wahl_end_1	; nein, Ziffer nicht wählen

	smb WHL_START,hgeb_stat	; Wahl wurde gestartet
	sta ziffer	; Anzahl der Impulse eintragen
	smb LTG_WHL,ltg_stat	; Wahl läuft eintragen

	ldy #ZWWHL_TIM	; Timerwert Zwischenwahlzeit laden
	cpx #00		; ist es 1. Ziffer ?
	bne wahl_tim	; nein, Zwischenwahlzeit setzen

	ldy vorwahl_tim	; Timerwert Vorwahlzeit laden
wahl_tim	sty struct_tim+WHL_TIM_O	; und Wahl-Timer starten
	bra ziff_whl	; und Ziffer wählen



wahl_end	bbr WHL_START,hgeb_stat,ziff_end	; Wahl noch nicht gestartet

	smb GEB_OUT,hgeb_stat	; Gebührenanzeige einschalten, Wahlende
ziff_end	rmb LTG_WHL,ltg_stat	; komplette Ziffer gewählt eintragen

	ldx wahl_po	; Wahlpointer laden
	cpx whl_zcnt	; sind weitere Ziffern im Wahlbuffer ?
	bcc wahl_end_1	; ja, Ende

	jmp nsa_off	; Wahlende, NSA-Relais ausschalten (SPIKE)

wahl_end_1	rts


	; Ziffer wählen
	; -------------
ziff_whl	jsr nsa_on	; NSA-Relais für Wahldauer einschalten
	lda struct_tim+WHL_TIM_O	; Wahltimer abgelaufen ?
	bne wahl_end_1	; nein, Ende

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

	jsr nsi_on	; Ltg. durchschalten
	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

whl_0	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
	rts



; =========================================================================
;
; Funktion	: 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	jsr st_dp_tim	; Wahlziffern werden angezeigt, Timer aufziehen
	bbs WHL_ERDE,ltg_stat,whl_abl_1	; Erde wir gewählt

	bbr HTON_OK,hgeb_stat,whl_abl_1	; auf Hörton warten, Cursor
						; auf Ziffer stehen lassen
	bbs LTG_WHL,ltg_stat,whl_abl_1	; Wahl läuft, Cursor pos.

	jsr curs_off	; Wahlablauf Cursor ausschalten
	jmp put_gesprd	; Gesprächsdauer anzeigen


	; Wahlablauf-Cursor positionieren
	; -------------------------------
whl_abl_1	ldx wahl_po	; Wahlpointer auf akt. Ziffer
	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





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

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

