;**************************************************************************
;
; Filename : RELAIS.ASM
; ---------------------
;
; (c) 1990/91 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; verschiedene Relais ein/ausschalten
;
;
;**************************************************************************

MODUL_START	set	*	; Größe des Moduls berechnen

	; NSI-Relais einschalten
	; ----------------------
nsi_on	sei
	lda Via_portb	; Zustand der VIA einlesen
	ora #NSI	; NSI BIT setzen
	sta Via_portb	; und NSI-Relais einschalten

	lda interrupt	; ist IRQ aktiv ?
	bne nsi_on_1	; ja, IRQ nicht freigeben

	cli
nsi_on_1
	if RELTEST
	lda #$ff
	sta led_ram+YL4+11
	endif

	rts

	; NSI-Relais ausschalten
	; ----------------------
nsi_off	sei
	lda Via_portb	; Zustand der VIA einlesen
	and #$ff^NSI	; NSI BIT austragen
	sta Via_portb	; und NSI-Relais ausschalten

	lda interrupt	; ist IRQ aktiv ?
	bne nsi_off_1	; ja, IRQ nicht freigeben

	cli
nsi_off_1

	if RELTEST
	stz led_ram+YL4+11
	endif

	rts

; **********

	; NSA-Relais einschalten
	; ----------------------
nsa_on	sei
	lda Via_portb	; Zustand der VIA einlesen
	ora #NSA	; NSA BIT setzen
	sta Via_portb	; und NSA-Relais einschalten

	lda interrupt	; ist IRQ aktiv ?
	bne nsa_on_1	; ja, IRQ nicht freigeben

	cli
nsa_on_1

	if RELTEST
	lda #$ff
	sta led_ram+YL4+9
	endif

	rts

	; NSA-Relais ausschalten
	; ----------------------
nsa_off	sei
	lda Via_portb	; Zustand der VIA einlesen
	and #$ff^NSA	; NSA BIT austragen
	sta Via_portb	; und NSA-Relais ausschalten

	lda interrupt	; ist IRQ aktiv ?
	bne nsa_off_1	; ja, IRQ nicht freigeben

	cli
nsa_off_1

	if RELTEST
	stz led_ram+YL4+9
	endif

	rts

; **********

	; a/b-Relais einschalten
	; ----------------------
ab_on	lda #$ff
	sta led_ram+LD_AB	; a/b Relais einschalten
	rts

	; a/b-Relais ausschalten
	; ----------------------
ab_off	stz led_ram+LD_AB	; a/b Relais auschalten
	rts

; **********

	; Halten-Relais einschalten
	; -------------------------
ha_on	lda #$ff
	sta led_ram+LD_HALT
	rts

	; Halten-Relais ausschalten
	; -------------------------
ha_off	stz led_ram+LD_HALT
	rts

; **********

	; Postapparat anschalten
	; ----------------------
post_on	stz led_ram+LD_POST	; Postapparat einschalten
	ldy #LD_L|LD_R|LD_OFF	; LED Status laden
	lda #KEY_POST		; Tastenwert laden
	jmp set_prgled

	; Postapparat abschalten
	; ----------------------
post_off	lda #$ff
	sta led_ram+LD_POST	
	ldy #LD_L|LD_ON	; LED Status laden
	bbs ST_POST,feap_stat,post_off_1	; Postapparat ist abgeschaltet

	ldy #LD_L|LD_N	; LED Status laden
post_off_1	lda #KEY_POST	; Tastenwert laden
	jmp set_prgled


; **********

	; Modem anschalten
	; ----------------
mod_on	lda #$ff
	sta led_ram+LD_MODEM
	ldy #LD_L|LD_R|LD_ON	; LED Status laden
	lda #KEY_MOD	; Tastenwert laden
	jmp set_prgled

	; Modem abschalten
	; ----------------
mod_off	stz led_ram+LD_MODEM
	ldy #LD_L|LD_R|LD_OFF	; LED Status laden
	lda #KEY_MOD	; Tastenwert laden
	jmp set_prgled

; **********

	; Anrufbeantworter anschalten
	; ---------------------------
beantw_on	lda #$ff
	sta led_ram+LD_BEANTW
	ldy #LD_L|LD_R|LD_OFF	; LED Status laden
	lda #KEY_BEA	; Tastenwert laden
	jmp set_prgled

	; Anrufbeantworter abschalten
	; ---------------------------
beantw_off	stz led_ram+LD_BEANTW
	ldy #LD_L|LD_ON	; LED Status laden
	bbr ST_BEANTW,feap_stat,bea_off_1	; Beantw. ist abgeschaltet

	ldy #LD_L|LD_N	; LED Status laden
bea_off_1	lda #KEY_BEA	; Tastenwert laden
	jmp set_prgled

; **********

	; frei Programierbares Relais 1 einschalten
	; -----------------------------------------
rel1_on	lda #$ff
	sta led_ram+LD_REL1
	rts

	; frei Programierbares Relais 1 ausschalten
	; -----------------------------------------
rel1_off	stz led_ram+LD_REL1
	rts

; **********

	; frei Programierbares Relais 2 einschalten
	; -----------------------------------------
rel2_on	lda #$ff
	sta led_ram+LD_REL2
	rts

	; frei Programierbares Relais 2 ausschalten
	; -----------------------------------------
rel2_off	stz led_ram+LD_REL2
	rts

; **********

	; frei Programierbares Relais 3 einschalten
	; -----------------------------------------
rel3_on	lda #$ff
	sta led_ram+LD_REL3
	rts

	; frei Programierbares Relais 3 ausschalten
	; -----------------------------------------
rel3_off	stz led_ram+LD_REL3
	rts

; **********

	; frei Programierbaren Port RL2 einschalten
	; -----------------------------------------
rl2_on
	if RELTEST
	lda #$ff
	sta led_ram+LD_RL2
	endif

	lda #RL2	; BIT für RL2 laden
	ora txen_rl23	; Zustand RL3 dazu
	sta txen_rl23	; und eintragen
	bra set_rl_port	; Port einschalten


	; frei Programierbaren Port RL2 ausschalten
	; -----------------------------------------
rl2_off
	if RELTEST
	stz led_ram+LD_RL2
	endif

	lda txen_rl23	; Zustand TX-Enable und RL2/3 laden
	and #$ff^RL2	; BIT für Relais austragen
	sta txen_rl23	; bei Tastabfr. ausschalten
	lda #$ff^RL2	; BIT für Relais austragen
	bra clr_rl_port	; Port zurücksetzen


; **********

	; frei Programierbaren Port RL3 einschalten
	; -----------------------------------------
rl3_on
	if RELTEST
	lda #$ff
	sta led_ram+LD_RL3
	endif

	lda #RL3	; BIT für RL3 laden
	ora txen_rl23	; Zustand TX-Enable und RL2 dazu
	sta txen_rl23	; und eintragen

set_rl_port	ora Port_rl23	; Zustand des Ports dazu, (! Tastaturabfr. !)
	sta Port_rl23	; Relais einschalten

	rts

	; frei Programierbaren Port RL3 ausschalten
	; -----------------------------------------
rl3_off
	if RELTEST
	stz led_ram+LD_RL3
	endif

	lda txen_rl23	; Zustand TX-Enable und RL2/3 laden
	and #$ff^RL3	; BIT für Relais austragen
	sta txen_rl23	; bei Tastabfr. ausschalten

	lda #$ff^RL3	; BIT für Relais austragen
clr_rl_port	and Port_rl23	; Zustand des Ports dazu
	sta Port_rl23	; Relais ausschalten
	rts

; **********

	; frei Programmierbares Relais REL3 auf STR1 einschalten
	; ------------------------------------------------------
str_rel_on	sei
	lda Via_portb	; Zustand der VIA einlesen
	ora #STR_REL3	; Relais-BIT setzen
	sta Via_portb	; und Relais einschalten
	cli
	rts

	; frei Programmierbares Relais REL3 auf STR1 ausschalten
	; ------------------------------------------------------
str_rel_off	sei
	lda Via_portb	; Zustand der VIA einlesen
	and #$ff^STR_REL3	; Relais-BIT austragen
	sta Via_portb	; und Relais ausschalten
	cli
	rts

; **********

	; Freisprech-Relais einschalten
	; -----------------------------
fs_on	sei
	lda Via_portb	; Zustand der VIA einlesen
	ora #FS		; FS BIT setzen
	sta Via_portb	; und Freisprech-Relais einschalten
	cli
	rts


	; Freisprech-Relais ausschalten
	; -----------------------------
fs_off	sei
	lda Via_portb	; Zustand der VIA einlesen
	and #$ff^FS	; FS BIT austragen
	sta Via_portb	; und Freisprech-Relais ausschalten
	cli
	stz fs_stat	; bei FS-Taste erstmal nur LH aktivieren
	rts

; **********

	; Summer-Relais einschalten
	; -------------------------
su_on	sei
	lda Via_portb	; Zustand der VIA einlesen
	ora #SU		; Summer BIT setzen
	sta Via_portb	; und Summer-Relais einschalten
	cli
	rts

	; Freisprech-Relais ausschalten
	; -----------------------------
su_off	sei
	lda Via_portb	; Zustand der VIA einlesen
	and #$ff^SU	; Summer BIT austragen
	sta Via_portb	; und Summer-Relais ausschalten
	cli
	rts


; **********

	; Hörton Port einschalten
	; -----------------------
htport_on	lda ht_port	; Port für Hörtonrelais laden
	jmp port_on	; Port setzen


	; Hörton Port ausschalten
	; -----------------------
htport_off	lda ht_port	; Port für Hörtonrelais laden
	jmp port_off	; Port löschen

; **********












; =========================================================================
;
; Type	: Unterprg.
;
; Eingang	: bei Endetaste
;
; Ausgang	: Relais und LED von Post und Anrufbeantw. entsprechend dem
;	: Status geschaltet
;
; Register	: ------
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

set_postbea	bbs LTG_BEL,ltg_stat,postbea_e	; Ltg. ist belegt, Ende

	bbs ST_BEANTW,feap_stat,postbea_1	; Beantworter war eingesch.
	jsr beantw_off	; Beantworter ausschalten
	bra set_zweit	; Zweitapparat schalten

postbea_1	jsr beantw_on	; Beantworter wieder einschalten


	; Zustand des Zweitapp. nach Zustand der Abschalte-Taste
	; ------------------------------------------------------
set_zweit	bbr ST_POST,feap_stat,set_zweit_1	; Postapp. war eingeschaltet
	jmp post_off	; Postapparat ausschalten

set_zweit_1	jmp post_on	; Postapp. wieder einschalten

postbea_e	rts



; =========================================================================
;
; Funktion	: setzen und löschen der frei programmierbaren Ports
;
; Eingang	: Portnr. im Accu
;	: originale Relaisnr.  = Relais einschalten
;	: Relaisnr. + PRG_PORT = Relais ausschalten
;
; Ausgang	: ---------
;
; Register	: ACCU, X
;
; (c) by Thomas Lehmann Mai 1990
;
; =========================================================================

prgport_tab	word	rel1_on	; Relais 1 einschalten
	word	rel2_on	; Relais 2 einschalten
	word	rel3_on	; Relais 3 einschalten
	word	str_rel_on	; Relais 3 auf STR1 einschalten
	word	rl2_on	; Port RL2 einschalten
	word	rl3_on	; Port RL3 einschalten

PSET_LEN	equ	*-prgport_tab	; Tabellenlänge für Port setzen

	word	rel1_off	; Relais 1 ausschalten
	word	rel2_off	; Relais 2 ausschalten
	word	rel3_off	; Relais 3 ausschalten
	word	str_rel_off	; Relais 3 auf STR1 ausschalten
	word	rl2_off	; Port RL2 ausschalten
	word	rl3_off	; Port RL3 ausschalten

PCLR_LEN	equ	*-prgport_tab	; Tabellenlänge für Port löschen


set_prgport	asl		; Portnr. mal 2 == Offs auf Tabelle
	cmp #PSET_LEN	; Port gültig ?
	bcc sc_prgport	; ja, Port setzen

prgport_end	rts


clr_prgport	clc
	adc #PRG_PORT	; Wert für ausschalten zur Portnr.
	asl		; Portnr. mal 2 == Offs auf Tabelle
	cmp #PCLR_LEN	; Port gültig ?
	bcs prgport_end	; nein, Ende

sc_prgport	tax		; Offset nach RX
	jmp (prgport_tab,x)	; Port-Programm ausführen



; =========================================================================
;
; Funktion	: frei programmierbare Ports ein/ausschalten
;
; Eingang	: Portnr. im ACCU
;
; Ausgang	: -------
;
; Register	: -------
;
; (c) by Thomas Lehmann August 1991
;
; =========================================================================

port_on	phx
	ldx #prg_port	; Adr. der Port Zustände
	jsr set_bit	; BIT für Port setzen
	plx
	rts

port_off	phx
	ldx #prg_port	; Adr. der Port Zustände
	jsr clr_bit	; BIT für Port löschen
	plx
	rts

port_tst	phx
	ldx #prg_port	; Adr. der Port Zustände
	jsr tst_bit	; BIT für Port testen
	plx
	rts		; SEC == Port ein, sonst CLC


; =========================================================================
;
; Funktion	: frei programmierbare Ports speichern
;
; Eingang	: Auswahl bei Speichern
;
; Ausgang	: Wähltastatur auf Relaisspeicherung umgeleitet
;
; Register	: X
;
; (c) by Thomas Lehmann Mai 1990
;
; =========================================================================

sp_rel	ldx #MENU_REL	; Untermenu Relais ist aktiv
	stx menu	; und bei Speicher/Kontrolltaste umleiten
	stz offs_relber	; 1. Relaisnr. einstellen
	ldx #WTA_SPREL	; Prg. Nr. für Wähltaste laden
	stx wta_prg	; und bei Wähltaste ausführen

	ldx #<rel_txt	; Textadr. laden
	ldy #>rel_txt
	lda #ANZ_RELTXT	; Anzahl der Texte laden
	jsr init_dsptxt	; Textwahl initialisieren

	bra rel_out_fst	; Relais ausgeben


rel_txt	byte	DSP_CLR | CURS_ON
	shift "Port bei Anruf: "

	byte	DSP_CLR | CURS_ON
	shift "Port ein (Termin 7): "

	byte	DSP_CLR | CURS_ON
	shift "Port aus (Termin 8): "


; =========================================================================
;
; Funktion	: Portfunktion speichern
;
; Eingang	: bei Wähltaste und eingeschaltetem Relais speichern Modus
;	: Tastenwert (1 bis ...) im Accu
;
; Ausgang	: --------
;
; Register	: Accu
;
; (c) by Thomas Lehmann Mai 1990
;
; =========================================================================

wta_sprel	bbs MOD_KO,modus,rel_out_end	; Kontrollmodus ist aktiv

	jsr check_wta	; Wähltaste 0-9 erzeugen
	cmp #PRG_PORT	; ist eingegebenes Port gültig ?
	bcs rel_out_end	; nein, Ende

	ldx offs_relber	; Offset auf Relaisber laden
	sta rel_tab,x	; Relais in Ber. eintragen


	; Einsprung bei Speicher Taste
	; ----------------------------
rel_out	jsr nxt_dsptxt	; nächsten Text anzeigen
	lda offs_relber	; Offset auf Relaisber. laden
	inc a		; nächste Relaisnr. einstellen
	cmp #ANZ_RELTXT	; alle Relais eingegeben ?
	bcc rel_out_1	; nein

	lda #00		; Offset auf 1. Relaiseintrag stellen
rel_out_1	sta offs_relber	; nächste Relaisber. einstellen

	; nur Relaistext im Display anzeigen, nicht weiterschalten
	; --------------------------------------------------------
rel_out_fst	ldx offs_relber	; Offset auf Relaisber laden
	lda rel_tab,x	; Relais aus Ber laden
	cmp #PRG_PORT	; ist Port gültig ?
	bcc rel_out_2	; ja, Relaisnr. ausgeben

	lda #253	; "-"-48 == Char für kein Relais gespeichert laden
rel_out_2	clc
	adc #48		; ASCII erzeugen
	jsr putchar	; Relais ausgeben
	jmp curs_left

rel_out_end	rts


; =========================================================================
;
; Type	: Hauptprg.
;
; Eingang	: bei Löschtaste und eingeschaltetem Relais speichern Modus
;
; Ausgang	: akt. Relaiswert clr
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann Mai 1990
;
; =========================================================================

rel_clr	bbs MOD_KO,modus,rel_out_end	; Kontrollmodus ist aktiv

	ldx offs_relber	; Offset auf Relaisber laden
	lda #$ff	; Relaiswert für ungültig laden
	sta rel_tab,x	; Relais aus Ber clr
	bra rel_out_fst	; Relais erneut ausgeben





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

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

