;**************************************************************************
;
; Filename : LEITUNG.ASM
; ----------------------
;
; (c) 1990 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Leitungs Funktionen
;
;
;**************************************************************************

MODUL_START	set	*	; Größe des Moduls berechnen

; =========================================================================
;
; Type	: Hauptprg.
;
; Eingang	: bei Leitungstaste oder Leitungsbelegung durch andere Routinen
;	: Tastenwert in "tw"
;
; Ausgang	: Leitung belegt
;
; Register	: Accu
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

key_ltg	bbs LTG_DURCH,ltg_stat,set_gspr	; nur Gesprächsd. zurücksetzen
	bbs LTG_MARK,ltg_stat,key_ltg_end	; Ltg. ist bereits makiert
						; Routine nicht mehrmals bei
						; WW, Merker oder Comfortwahl
						; aufrufen

	; Leitung zur Belegung makieren
	; -----------------------------
key_ltgbel	smb LTG_MARK,ltg_stat	; Leitungsbelegung markieren
	phy			; Register retten
	ldy #LD_L|LD_R|LD_ON	; LED Status laden
	lda #KEY_LTG		; Tastenwert für Leitung laden
	jsr set_prgled		; und beide LED`s einschalten

	bbs ST_GU,feap_stat,key_ltg_1	; GU ist ausgehangen

	smb ST_FSLH,feap_stat	; Freisprech-Relais einschalten

key_ltg_1	ply			; Register zurück


	; Gesprächsdauer zurücksetzten
	; ----------------------------
set_gspr	jsr key_ende	; Ende Speichern/Kontrolle ...
	lda whl_zcnt	; Anzahl gewählte Ziffern
	bne gspr_clr	; Ltg. bereits bewählt

	stz geb_cnt	; Anzahl Gebührenimpulse löschen
	stz geb_cnt+1

gspr_clr	bbs LTG_HLT,ltg_stat,key_ltg_end	; Leitung nur neu belegen
	bbr DIP_GEB,dip_stat,key_ltg_end	; Gebührenauswertung inst.

	stz gesprd	; Gesprächsdauer auf NULL setzen
	stz gesprd+1
key_ltg_end	rts


; =========================================================================
;
; Funktion	: testen ob Anforderung auf Ltg. Belegung besteht
;	: Routine wird zyklisch von Hauptprg.-Schleife aufgerufen
;
;	: Leitung belegt wenn Anforderung bestand und der
;	: Wiederbelegungstimer abgelaufen ist
;
; Eingang	: -------
;
; Ausgang	: -------
;
; Register	: Accu
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

ltg_bel
	block
	bbr LTG_MARK,ltg_stat,end	; keine Anforderung, Ende

	lda struct_tim+BEL_TIM_O	; ist Wiederbelg. Timer abgelaufen ?
	bne end			; nein, Leitung noch nicht belegen

	; Leitungs-Relais schalten
	; ------------------------
	jsr nsa_off		; NSA-Relais abschalten
	jsr nsi_on		; NSI-Relais einschalten
	jsr ha_off		; Leitung aus Halten holen
	jsr ab_on		; a/b durchschalten
	jsr beantw_off		; Anrufbeantworter abschalten
	jsr post_off		; Postapp. abschalten
	jsr mod_off		; Modem abschalten

	stz ltg_stat		; Ltg. nicht mehr belegt, Wahlende usw.
	smb LTG_BEL,ltg_stat	; Leitung belegt eintragen
	smb LTG_DURCH,ltg_stat	; Leitung bis zum Hörer durchgeschaltet
	rmb ST_SU,su_stat		; Summer ausschalten

	bbs ST_ANRLED,su_stat,bel_1	; Abfrage eines Anrufs

	; Ltg. für Wahl vorbereiten
	; -------------------------
	jsr hton_on	; Hörtonauswertung einschalten
	bbr ST_BABY,no_ini_flag,bel_1	; normale Ltg. Belegung

	stz whl_zcnt	; keine Wahlziffern im Buffer
	jsr put_baby_nr	; Babyruf auto Wahl ausführen

bel_1	inc struct_stat+STAT_GSPR	; Dummy Funktion, Anzahl Gespräche+1
end	rts
	bend


; =========================================================================
;
; Type	: Hauptprg.
;
; Eingang	: bei Trennentaste
;	: Offset auf Tastaturtabelle in X-Reg.
;	: Tastenwert in "tw"
;
; Ausgang	:
;
; Register	:
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

key_trenn
	block
	lda ltg_stat	; ist Ltg. trennbar ?
	beq end		; nein, nicht belegt, Ende

	; Ltg. Status eintragen
	; ---------------------
	stz hgeb_stat	; Status Hörton und Gebühren clr
	stz ltg_stat	; Leitung getrennt eintragen
	stz wahl_po	; Pointer auf 1.Zeichen im Wahlbuffer setzen
	stz whl_cu_po	; Wahlablauf Cursor erst bei Wahl setzen

	; Ltg.-Relais in Ruhezustand bringen
	; ----------------------------------
 	jsr nsi_off	; NSI-Relais abschalten
	jsr nsa_off	; NSA-Relais abschalten
	jsr mod_off	; Modem abschalten
	jsr ab_off	; a/b abschalten
	jsr ha_off	; Halten Relais abschalten
	jsr htport_off	; Hörton Port löschen
	jsr set_postbea	; Post und Beantworter-Relais + LED zurück

	; Wiederbelegungs Timer aufziehen
	; -------------------------------
	lda #BEL_TIM	; Timerwert für Wiederbelegung laden
	sta struct_tim+BEL_TIM_O	; und Timer starten

	; sonstige Funktionen in Ruhezustand bringen
	; ------------------------------------------
	ldy #LD_L|LD_R|LD_OFF	; LED Status laden
	lda #KEY_LTG	; Tastenwert für Leitung laden
	jsr set_prgled	; und beide LED`s ausschalten
	rmb ST_FSLH,feap_stat	; Freisprechen ausschalten

	; Gesamt Gebühren nachführen
	; --------------------------
	lda whl_zcnt	; Anzahl gewählte Ziffern
	beq trenn_1	; abgefragtes Gespräch, keine Gebühren

	jsr geb_stat	; Daten eintragen

trenn_1	stz whl_zcnt	; keine Ziffer gewählt eintragen
	lda modus	; Speichern, Kontr, ... aktiv ?
	bne end		; ja, Modus beibehalten

	jsr zwsp_off	; 2.Speicher ausschalten
	stz displ_prg	; Display Reset
end	rts
	bend


; =========================================================================
;
; Type	: Hauptprg.
;
; Eingang	: bei Haltentaste
;	: Offset auf Tastaturtabelle in X-Reg.
;	: Tastenwert in "tw"
;
; Ausgang	: Leitung in Halten gelegt
;	: LED`s eingeschaltet
;
; Register	: Accu, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

key_halten
	block
	bbs LTG_DURCH,ltg_stat,halt	; Halten Status setzen

	rts		; keine Ltg. belegt, Ende

halt	stz ltg_stat	; Ltg. nicht mehr belegt, Wahlende usw.
	smb LTG_HLT,ltg_stat	; Leitung in Halten eintragen
	smb LTG_BEL,ltg_stat	; Leitung immer noch belegt

	jsr ha_on	; Halten-Relais einschalten
	jsr ab_off	; a/b abschalten
	jsr nsa_off	; NSA-Relais abschalten
	jsr set_zweit	; Zweitapp. ggf. wieder einschalten

	ldy #LD_L|LD_S	; LED Status laden
	lda #KEY_LTG	; Tastenwert für Leitung laden
	jmp set_prgled	; und LED schalten
	bend


; =========================================================================
;
; Funktion	: Wahlwiederholung
;
; Eingang	: bei WW-Taste
;	: Offset auf Tastaturtabelle in X-Reg.
;	: Tastenwert in "tw"
;
; Ausgang	: die Ltg. wird getrennt, und die letzte gewählte Rufnr. wird
;	: erneut gewählt
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

key_ww
	block
	bbs LTG_BEL,ltg_stat,ww_trn	; Ltg. ist belegt

	bbr LTG_MARK,ltg_stat,ww_get_ziff	; Ltg. ist getrennt
	smb LTG_BEL,ltg_stat	; Trennen Prg. ausführen

ww_trn	jsr key_trenn	; Leitung trennen

ww_get_ziff	ldx #00
loop	lda wahl_buff+1,x	; 2. Ziffer aus Wahlbuffer holen
	tay		; und Ziffer retten
	lda wahl_buff,x	; Ziffer aus Wahlbuffer holen
	beq end		; alle Ziffern kopiert

	jsr whl_ziff	; Wahlziffer eintragen
	inx		; nächste Ziffer einstellen
	tya
	sta  wahl_buff,x	; Endekennz. durch vorherige Ziffer ersetzen
	bra loop	; und kopieren

end	rts
	bend


; =========================================================================
;
; Type	: Hauptprg.
;
; Eingang	: bei Merkertaste
;	: Offset auf Tastaturtabelle in X-Reg.
;	: Tastenwert in "tw"
;
; Ausgang	: wenn Ltg. belegt wird die gewählte Rufnr. im Merker-Buffer
;	: gespeichert.
;	: andernfalls wird die gemerkte Rufnr. gewählt
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

key_merker
	block
	bbs LTG_BEL,ltg_stat,merk_sp	; Ltg. belegt, Rufnummer speichern

	; Ziffern aus Merker-Buffer wählen
	; --------------------------------
merk_wahl	ldx #$00
loop	lda merk_buff,x	; Ziffer aus Merker-Buffer holen
	beq end		; alle Ziffern ausgegeben

	jsr whl_ziff	; Ziffer wählen
	inx		; nächste Ziffer einstellen
	bra loop	; und neuer Durchlauf


	; gewählte Ziffern im Merker-Buffer eintragen
	; -------------------------------------------
merk_sp	lda wahl_buff	; 1. gewählte Ziffer laden
	beq merk_wahl	; noch nicht gewählt, gemerkte Ziffern wählen

	ldx #$ff	; 1. Ziffer holen
loop_1	inx
	lda wahl_buff,x	; Ziffer laden
	sta merk_buff,x	; und im Merker Buffer ablegen
	bne loop_1	; noch nicht alle Ziffern kopiert

end	rts
	bend


; =========================================================================
;
; Type	: Hauptprg.
;
; Eingang	: bei Modemtaste
;	: Offset auf Tastaturtabelle in X-Reg.
;	: Tastenwert in "tw"
;
; Ausgang	: 
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

key_modem
	block
	bbs LTG_BEL,ltg_stat,mod_1	; Ltg. ist belegt

	rts		; Ltg. ist nicht belegt, Ende

mod_1	bbs ST_MODEM,feap_stat,mod_2	; Modem abschalten

	smb ST_MODEM,feap_stat	; Status eintragen
	jmp mod_on	; Modem anschalten

mod_2	rmb ST_MODEM,feap_stat	; Status austragen
	jmp mod_off	; Modem abschalten
	bend








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

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

