 **************************************************************************
;
; Filename : TERMIN.ASM
; ---------------------
;
; (c) 1990/91 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Termineinrichtung
;
;
;**************************************************************************

MODUL_START	set	*	; Größe des Moduls berechnen



; =========================================================================
;
; Funktion	: Termin speichern/kontrollieren
;
; Eingang	: Auswahl bei Speichern/Kontrolle
;
; Ausgang	: Wähltastatur auf Terminauswahl umgeleitet
;	: belegte Termine ausgegeben
;
; Register	: X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

spko_term	ldx #WTA_TERMWHL	; Terminauswahl Prg. Nr. laden
	stx wta_prg	; und bei Wähltaste ausführen

	jmp put_termnr	; Terminnr. und Belegtzustände ausgeben



; =========================================================================
;
; Funktion	: Terminnr. auswählen
; 	  Termin ausgewählt
;	  Terminzeit ausgegeben
;	  Terminnr. in "term_nr" eingetragen
;	  Wähltasten auf Termin-Eingabe umgeleitet wenn speichern aktiv
;	  sonst auf Terminkontrolle
;
; Eingang	: bei Wähltaste und eingeschaltetem Termin-Auswahl-Modus
;	: Tastenwert (1 bis ...) im Accu
;
; Ausgang	: -----------
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

wta_termwhl	dec a		; Terminnr. 0-7 erzeugen
	cmp #MAX_TERM	; ist Auswahl gültig ?
	bcs wta_twhl_e	; nein, Ende

	; Einsprung bei Beantworter und Postapparat Termin
	; ------------------------------------------------
term_beapo	sta term_nr	; Terminnr. eintragen
term_beapo1	ldx #MENU_TERM	; Untermenu Termin ist aktiv
	stx menu	; und bei Speicher/Kontrolltaste umleiten
	stz term_dat	; Termin Datenausgabe == Terminzeit
	jsr term_out	; Terminzeit ausgeben

	bbr MOD_SP,modus,wta_twhl_e	; Speichern nicht aktiv

	lda #WTA_TERMEIN	; Termin-Zeit-Eingabe Prg. Nr. laden
	sta wta_prg	; und bei Wähltaste ausführen
	stz input_po	; Offset auf akt. Eingabe
wta_twhl_e	rts




; =========================================================================
;
; Funktion	: ausgewählten Termin löschen
; 	  Termin als frei gekennzeichnet
;
; Eingang	: bei Löschentaste und entsprechendem Wta-Prg.
;
; Ausgang	: -----------
;
; Register	: X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

term_clr	ldx term_nr	; ausgewählte Terminnr. laden
	stz term_days,x	; Termin als nicht belegt kennzeichnen
	cpx #MAX_TERM	; ist es Anrufbeantw. oder Zweitapp. Termin ?
	bcc spko_term	; erneute Terminauswahl für Term 1-8 starten

	stz term_days+1,x	; 2. Sondertermin ebenfalls löschen
	bra term_beapo1	; erneute Terminauswahl für Bea/Post starten



; =========================================================================
;
; Funktion	: weitere Termin Speicher Auswahlen ermöglichen
;
; Eingang	: bei Speicher Taste und entsprechendem Wta-Prg.
;
; Ausgang	: -----------
;
; Register	: X
;
; (c) by Thomas Lehmann März 1993
;
; =========================================================================

term_spkey	ldx wta_prg
	cpx #WTA_TERMDAY	; werden gerade Termin Tage eingegeben ?
	beq set_text	; ja, jetzt Texteingabe ermöglichen

	cpx #WTA_TERMTXT	; wird Termintext eingegeben ?
	beq spko_term	; erneut Temine zeigen

	rts


; =========================================================================
;
; Funktion	: Terminzeit eingeben
;
; Eingang	: bei Wähltaste und eingeschaltetem Terminzeit-Eingabe-Modus
;	: Tastenwert (1 bis ...) im Accu
;
; Ausgang	: Terminzeit eingetragen
;	: Wähltasten auf Termintext-Eingabe umgeleitet
;	: bzw. wenn Dauertage gewählt auf Termintage-Eingabe
;
;	: Format der Terminstruktur: Monat, Tag, Minute, Stunde
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

wta_termein
	block
	jsr check_wta	; Taste im Gültigkeitsbereich ?
	bcs end		; nein, Ende

	ldx input_po	; Offset auf akt. Eingabe
	jsr input	; Tastenwert eintragen

	cpx #7		; Eingabe komplett ?
	beq set_time	; ja, Eingabe in Terminstruktur eintragen

	txa
	bit #1		; ist die 2. Ziffer eingegeben ?
	beq end		; nein, Cursor nicht weiterschalten

	ldx dp_bu_po	; Cursorposition laden
	inx		; nächste Eingabe einstellen
	txa		; Cursorpos. kopieren
	jmp curs_set	; und Cursor setzen


	; Terminzeit eintragen
	; --------------------
set_time	ldx #$00	; erste Eingabe holen
	ldy #$03	; Terminzeit rückwärts eintragen

loop	jsr get_input	; Zeitwert holen
	sta (term_iadr),y	; und in Terminstruktur eintragen
	inx		; nächste Eingabe holen
	dey		; Offset auf Terminstruktur
	bpl loop	; noch nicht alle Eingaben geholt

	; Termin belegt eintragen
	; -----------------------
	ldy term_nr	; aktuelle Terminnr. laden
	lda term_days,y	; Termintage laden
	ora #TERM_BEL	; Wert für Termin belegt dazu
	sta term_days,y	; und Termin belegt eintragen

	ldy #1		; Offset auf Termintag laden
	lda (term_iadr),y	; Termintag laden
	cmp #99		; soll Termin jeden Tag kommen ?
	bne set_text	; nein, Termintext eingeben

	; Termintage-Eingabe vorbereiten
	; ------------------------------
	ldx #WTA_TERMDAY	; Termintage Prg. Nr. laden
	stx wta_prg	; und bei Wähltaste ausführen

	jmp put_tday	; Termintage mit Belegtkennzeichnung ausgeben

end	rts
	bend


	; Termintext-Eingabe vorbereiten
	; ------------------------------
set_text	lda term_nr
	cmp #MAX_TERM	; Spezial Termin (Anrufbea. / Zweitapp) ?
	bcc set_txt_1       ; nein, normalen Termin 1-8 behandeln

            and #01             ; ist es 2. Termin Eingabe ?
	beq beapo_1	; nein, 2. Termin Zeit eingeben
	jmp key_ende	; Termin Eingabe komplett

beapo_1	inc term_nr	; 2. Termin einstellen
	jmp term_beapo1	; und Eingabe ermöglichen


	; Text für Standard Termin eingeben
	; ---------------------------------
set_txt_1	ldx #WTA_TERMTXT	; Termintext Prg. Nr. laden
	stx wta_prg	; und bei Wähltaste ausführen

	stz ttxt_count	; Anzahl der eingegeben Zeichen löschen
	smb MOD_TXT,modus	; Tasten haben Textfunktion eintragen
	ldy #KEYTXT_TERM	; Prg. Nr. für Textfunktion
	stz keytxt_prg	; und bei Text Taste ausführen

	ldy term_nr	; Terminnr. laden
	jsr set_ttxtadr	; Terminadresse holen
	stx term_iadr	; low byte der Adr. eintragen
	sta term_iadr+1	; dito high Byte

	lda #$00	; Text Ende kennzeichnen
	sta (term_iadr)	; Zeichen im Textspeicher ablegen
	jmp termtxt_out	; Text > 1234...



; =========================================================================
;
; Funktion	: Termin Tage eingeben
;
; Eingang	: bei Wähltaste und eingeschaltetem Termintage-Eingabe-Modus
;	: Tastenwert (1 bis ...) im Accu
;
; Ausgang	: Termintage aktuallisiert
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

wta_termday
	block
	jsr check_wta	; Taste im Gültigkeitsbereich ?
	bcs end		; nein, Ende

	cmp #7		; ist Wahl ok ?, So=0, Sa=6 
	bcs end		; nein, Ende

	jsr mk_bit	; BIT 0-7 erzeugen
	ldy term_nr	; akt. Termin laden
	eor term_days,y	; BIT für Tag ein/ausblenden
	sta term_days,y	; und zurückschreiben
	jmp put_tday	; Termintage mit Belegtkennzeichnung ausgeben

end	rts
	bend


; =========================================================================
;
; Funktion	: Wähltasten in Termin Text eingeben
;
; Eingang	: bei Wähltaste und eingeschaltetem Termintext-Eingabe-Modus
;	: Tastenwert (1 bis ...) im Accu
;
; Ausgang	: Termintext in Terminstruktur gespeichert
;
; Register	: -------
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

wta_termtxt	jsr wta_to_asc	; Tastenwert nach ASCII wandeln
	jmp ttxt_ein	; und in Termintext-Buffer eintragen



; =========================================================================
;
; Funktion	: Textzeichen in der Textstruktur eintragen
;
; Eingang	: Character im Accu
;
; Ausgang	: Termintext im Termin Buffer eingetragen wenn Platz frei
;
; Register	: Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

ttxt_ein
	block
	ldy ttxt_count	; Anzahl der eingegeben Textzeichen laden
	cpy #TTXT_LEN-1	; ist noch Platz im Termintext-Buffer ?
	bcs end		; nein, Zeichen nicht eintragen

	sta (term_iadr),y	; Zeichen im Textspeicher ablegen
	inc ttxt_count	; Anz. Textzeichen+1
	iny
	lda #$00	; Endekennung laden
	sta (term_iadr),y	; und im Textspeicher ablegen
	jmp termtxt_out	; Text > 1234...

end	rts
	bend


	; Einsprung bei Löschtaste
	; ------------------------
ttxt_clr
	block
	ldy ttxt_count	; Anzahl der eingegeben Textzeichen laden
	beq end		; keine Zeichen eingegeben

	dec ttxt_count	; Anz. Textzeichen-1
	dey
	lda #00
	sta (term_iadr),y	; letztes Zeichen löschen
	jmp termtxt_out	; Text > 1234...

end	rts
	bend



; =========================================================================
;
; Funktion	: alle 60 Sekunden prüfen ob ein Termin erreicht ist
;
; Eingang	: von Hauptprg.-Schleife
;
; Ausgang	: BIT für erreichten Termin in "err_term" eingetragen
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

term_tst
	block
	lda uhr_buff+SEK	; akt. Sekunde laden
	bne end		; kein Minuten Überlauf, Termin nicht testen

	ldy #MAX_TERM+3	; zu prüfende Terminnr. laden
tst_1	phy		; Terminnr. retten
	lda term_days,y	; ist Termin belegt ?
	beq tst_nxt	; nein, nächsten Termin einstellen

	jsr set_tti_adr	; Adr. der Terminzeit-Struktur holen
	stx ind_adr	; low Byte eintragen
	sta ind_adr+1	; dito high


	; Terminzeit mit akt. Uhrzeit vergleichen
	; ---------------------------------------
tst_2	ldy #03		; Offset auf Zeitwert laden

loop	lda (ind_adr),y	; Termin Wert laden
	ldx term_uhr_f,y	; Offset auf Uhr-Wert laden
	cmp uhr_buff,x	; akt. Uhrwert eingestellt ?
	beq tst_3	; ja, nächsten Termin Wert testen

	cmp #99		; Wildcard für Zeitangabe ?
	bne tst_nxt	; nein, nächsten Termin testen

	cpy #1		; ist es täglicher Termin ?
	bne tst_3	; nö, Zeit ok

	lda uhr_buff+WTAG	; akt. Wochentag holen
	jsr mk_bit	; BIT 0-7 erzeugen
	plx		; akt. Termin Nr.
	phx
	and term_days,x	; ist BIT für Tag gesetzt
	beq tst_nxt	; nein, nächsten Termin testen

tst_3	dey		; alle Zeiten verglichen ?
	bpl loop	; nein

	; BIT für erreichten Termin eintragen
	; -----------------------------------
	pla		; Terminnr. holen
	pha		; Stack wieder richten
	cmp #MAX_TERM	; Sonder Termin ?
	bcc tst_4	; nein

            ; Beantworter und Postapp. Termin behandeln
	; -----------------------------------------
	jsr beapo_term	; Sonderfunktion ausführen
	bra tst_nxt

tst_4	ldx #err_term	; Zustand der erreichten Termine
	jsr set_bit	; BIT für erreichten Termin setzen


	; programmierbaren Port bei Termin 7 und 8 schalten
	; -------------------------------------------------
	cmp #6			; Termin 7 ?
	bcc tst_nxt		; nö kleiner also Term 1-6
	bne tst_5		; wenn nicht 7 dann Termin 8

            ; Port für Termin 7 setzen
	lda rel_tab+TERM7_REL	; Relais aus Ber. holen
	jsr port_on		; Port setzen
	bra tst_nxt

            ; Port für Termin 8 löschen
tst_5	lda rel_tab+TERM8_REL	; Relais aus Ber. holen
	jsr port_off		; Port löschen


	; nächsten Termin einstellen
	; --------------------------
tst_nxt	ply		; Terminnr. zurück
	dey		; nächsten Termin einstellen
	bpl tst_1	; und Terminzeit testen

end	rts
	bend


; =========================================================================
;
; Funktion	: erreichten Termin ins Display schreiben
;
; Eingang	: wird von Uhrausgabe aufgerufen wenn "err_term" != 0
;
; Ausgang	: SEC == Text des erreichten Termins im Display
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

put_errterm
	block

	; akt. Zeit für nächsten Termin Zyklus berechnen
	; -----------------------------------------
	lda #0
	ldx uhr_buff+STD	; akt. Stunde laden
	ldy #60		; Stunden in Minuten wandeln
	jsr mul16_8	; ( MSB ACCU, LSB X ) * Y
	ldy uhr_buff+MIN	; akt. Minute laden
	jsr add16_8	; akt. Minute dazu
	pha		; akt. Zeit in Minuten
	phx
	ldy #$ff
	cmp nxt_tzykl	; Zeit der nächsten Wiederholung erreicht ?
	bne put_1
	cpx nxt_tzykl+1
	bne put_1

	sty term_nr	; Termin erneut ausgeben

put_1	cpy term_nr	; Termin Text erneut ausgegeben ?
	bne loop	; nein, weiteren Termin testen

	stz term_su	; Termin-Summer bringen
loop	iny		; nächste Terminnr. einstellen
	cpy #MAX_TERM	; alle Termine getestet ?
	bcc loop_1	; nö

	plx		; Stack richten
	pla
	clc		; kein Text ausgegeben CLC
	rts

loop_1      ldx #err_term	; Adr. für BIT_TST
	tya		; Termin Nr. nach Y
	jsr tst_bit	; teste Adr. in X mit BIT Nr. im Accu
	bcc loop	; nicht erreicht, nächsten Termin testen

	jsr set_ttxtadr	; Termin Textadr. nach ACCU / X holen
	stx term_iadr	; low byte der Adr. eintragen
	sta term_iadr+1	; dito high Byte
            lda (term_iadr)	; 1. Text Zeichen holen
	beq loop	; kein Text für Termin vorhanden

	plx		; akt. Zeit zurück
	pla
	cpy term_nr	; wird Termintext bereits ausgegeben ?
	beq end		; ja, Ende

	sty term_nr	; Terminnr. für Ausgabe eintragen

	; Zeit für nächsten Termin Zyklus berechnen
	; -----------------------------------------
	ldy term_zykl	; eingestellter Termin Zyklus dazu
	jsr add16_8
	sta nxt_tzykl	; Zeit der nächsten Termin-Wiederholung
	stx nxt_tzykl+1

	jsr ttxt_out	; Termintext ausgeben, Nr. in "term_nr"
end	jsr st_dp_tim	; Display Timer aufziehen
	jsr set_term_su	; Termin-Summer bringen
	sec                 ; Textausgabe ist erfolgt
	rts
	bend


; =========================================================================
;
; Funktion	: Summer bei erreichtem Termin bringen
;
; Eingang	: bei erreichtem Termin und Terminausgabe
;
; Ausgang	: Summer für Termin ein/aus
;
; Register	: Accu, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

set_term_su	lda term_su	; Anzahl der Termin-Summer-Töne
	cmp #ANZ_TERMSU	; alle Töne ausgegeben ?
	bcs term_su_end	; ja, Summer nicht schalten

	lda struct_tim+TERMSU_TIM_O	; Termin-Summer schalten ?
	bne term_su_end	; nein, Ende

	lda #TERMSU_TIM	; Timerwert für Summer ein/aus laden
	sta struct_tim+TERMSU_TIM_O	; Summer Timer aufziehen

	bbs ST_SU,su_stat,termsu_off	; Summer wieder ausschalten
	smb ST_SU,su_stat	; Summer einschalten
	rts

termsu_off	inc term_su	; Anzahl der Termin-Summer-Töne +1
	rmb ST_SU,su_stat	; Summer ausschalten
	
term_su_end	rts



; =========================================================================
;
; Type	: Hauptprg.
;	: erreichten Termin oder Anzahl Anrufe löschen
;
; Eingang	: bei Löschtaste und entsprechendem Wta-Prg.
;
; Ausgang	: Summer für Termin aus
;	: Termin-BIT ausgetragen
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

err_ter_clr
	block
	lda err_term	; ist ein Termin erreicht ?
	bne term_clr	; ja, Termin austragen

	; Anzahl nicht abgefragte Anrufe löschen
	; --------------------------------------
	stz struct_stat+STAT_NANR	; Anzahl nicht abgefr. Anrufe clr
	rmb 7,sekunde	; und direktes Update
	rts



	; Termin löschen
	; --------------
term_clr	lda term_nr	; akt. ausgegebene Terminnr. holen
	ldx #err_term	; Adr. der Termin BITS laden
	jsr clr_bit 	; Termin austragen


	; testen ob Termin komplett gelöscht werden kann
	; ----------------------------------------------
	tay		; set_tti_adr erwartet Terminnr. in Y
	phy		; Terminnr. retten
	jsr set_tti_adr	; Adr. der Terminzeit-Struktur holen
	stx ind_adr	; low Byte eintragen
	sta ind_adr+1	; dito high

	; testen ob Wildcard angegeben ist 
	; --------------------------------
	ldy #03		; Offset auf Zeitwert laden

loop	lda (ind_adr),y	; Termin Wert laden
	cmp #99		; Wildcard für Zeitangabe ?
	beq end		; ja, Termin nicht löschen

	dey		; alle Zeiten verglichen ?
	bpl loop	; nein

	plx		; Terminnr. holen
	phx		; Stack richten
	stz term_days,x	; Termin ist nicht mehr belegt

end	ply		; Stack richten
	jmp key_ende	; Ende Taste ausführen
	bend









; =========================================================================
;
; Funktion	: Termin Wiederholung speichern
;
; Eingang	: Auswahl bei Speichern
;
; Ausgang	: Wähltastatur auf Termin Wiederholung Eingabe umgeleitet
;
; Register	: X, Y
;
; (c) by Thomas Lehmann März 1993
;
; =========================================================================

sp_termzykl	ldx #WTA_SPTZYKL	; Prg. Nr. für Wähltaste laden
	stx wta_prg	; und bei Wähltaste ausführen

	lda term_zykl	; aktuellen Termin Zyklus laden
	bra tzykl_out	; und ausgeben


; =========================================================================
;
; Funktion	: Termin Zyklus eingeben
;
; Eingang	: bei Wähltaste und eingeschaltetem Termin Zyklus Modus
;	: Tastenwert (1 bis ...) im Accu
;
; Ausgang	: --------
;
; Register	: Accu
;
; (c) by Thomas Lehmann März 1993
;
; =========================================================================

wta_sptzykl	jsr check_wta	; Taste im Gültigkeitsbereich ?
	bcs wta_zykl_e	; nein, Ende

	jsr input	; Wert eintragen
	ldx input_po	; Offset auf akt. Eingabe
	cpx #2		; Wert komplett eingegeben ?
	bcc wta_zykl_e	; nein

	ldx #00		; 2-stellige Eingabe holen (ACCU)
	jsr get_input
	sta term_zykl	; Terminzyklus eintragen


	; Termin Zyklus Text ausgeben
	; ---------------------------
tzykl_out	stz input_po	; Offset auf akt. Eingabe
	ldx #<tzykl_txt	; Text ausgeben
	ldy #>tzykl_txt
	jsr puttxt
	jsr putdez99	; Termin Zyklus dezimal ausgeben
	jmp space

wta_zykl_e	rts


tzykl_txt	byte	DSP_CLR | CURS_ON
	shift "Terminzyklus Min: "











;		============
;		Textausgaben
;		============


; =========================================================================
;
; Funktion	: Terminnr. und Belegtzustände ausgeben
;
; Eingang	: -------
;
; Ausgang	: Ausgabe der Terminnr. 1-8 und der dazugehörigen Belegtzustände
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

put_termnr
	block
	ldx #<termnr_txt	; Text ausgeben
	ldy #>termnr_txt
	jsr puttxt

	ldx #01		; Terminnr. 1 laden
loop	txa		; für Displayausgabe kopieren
	jsr wta_displ	; und Ziffer ins Display schreiben

	lda #SPACE	; SPACE laden
	dex		; Offset auf Termin erzeugen
	ldy term_days,x	; ist der Termin belegt ?
	beq loop_1	; nein, Space ausgeben

	lda #"*"	; Belegt-Kennzeichnung laden
	
loop_1	jsr putchar	; Belegtzustand ausgeben
	inx		; nächsten Termin einstellen
	inx
	cpx #MAX_TERM+1	; alle Termine ausgegeben ?
	bcc loop	; nein, nächsten ausgeben

	bend

	rts

termnr_txt	byte DSP_CLR
	shift "Termin: "


; =========================================================================
;
; Funktion	: Termindaten ausgeben
;
; Eingang	: -------
;
; Ausgang	: aktuelle Termindaten im Display angezeigt
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

termdat_tab	word put_t_art	; Terminzeit ausgeben
	word put_tday	; Termintage mit Belegtkennzeichnung ausgeben
	word ttxt_out	; Termintext ausgeben

TAB_LEN	set	*-termdat_tab	; Tabellenlänge


	; Einsprung auch bei Kontroll-Taste
	; ---------------------------------
term_out	lda term_dat	; welche Ausgabe findet statt ?
	inc term_dat	; nächste Ausgabe einstellen

	ldx term_nr	; akt. Termin Nr.
	cpx #MAX_TERM	; Sonder Termin Anrufbea. / Zweitapp. ?
	bcc term_out_1	; nö, normaler Termin
	cmp #2		; Termin Tage bereits ausgegeben ?
	bcc term_out_1	; nö

	stz term_dat	; von vorne beginnen
	txa		; Termin Nr.
            eor #1		; Partner Termin einstellen
	sta term_nr
	bra term_out

term_out_1	cmp #1		; Termin Tage (nur bei täglichen Term ausgeben)
	bne term_out_2

	pha
	ldy #1		; Offset auf Termintag laden
	lda (term_iadr),y	; Termintag laden
	cmp #99		; soll Termin jeden Tag kommen ?
	pla
	bcc term_out	; nein, Termintext eingeben


	; zu Termin Ausgabe springen
	; --------------------------
term_out_2	asl a		; mal 2 = Offset auf Programmtabelle
	tax
	cpx #TAB_LEN	; sind alle Termindaten ausgegeben ?
	bcc term_out_3	; nein, akt. Termindaten anzeigen

	stz term_dat	; erste Ausgabe einstellen
	bra term_out	; und Prg. Adresse laden

term_out_3	jmp (termdat_tab,x)	; Programm ausführen











; =========================================================================
;
; Funktion	: Termin oder Beantw./Post Text ausgeben
;
; Eingang	: Terminnr. in "term_nr"
;
; Ausgang	: -------
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann August 1991
;
; =========================================================================

put_t_art
	block
	lda term_nr	; standard Termin oder Post/Bea ?
	sec
	sbc #MAX_TERM	; standart == 0-7
	pha		; Terminart retten
	bpl put_1	; Sonder Termin, Post / Beantworter

	lda #$ff	; standard Termin == 0

put_1	inc a		; Sondertermin == 1-4
	asl		; Offset auf Text Tabelle
	tay

	lda t_art_tab,y	; Text für Termin ausgeben
	tax
	lda t_art_tab+1,y
	tay
	jsr puttxt

	jsr put_ttime	; Terminzeit ausgeben

	pla		; Terminart zurück
	bpl put_2	; Post / Beantworter Termin

	; Terminnr. ausgeben
	; ------------------
	lda #7		; Cursorposition laden
	jsr curs_set	; und setzen
	lda term_nr	; Terminnr. laden
	inc a		; Terminnr. 1-8 erzeugen
	jsr wta_displ	; und Ziffer ins Display schreiben


put_2	bbs MOD_SP,modus,put_3	; Speichern ist aktiv, Cursor ein

	rts		; bei Kontrolle nur Zeit anzeigen, Cursor aus


	; Cursor auf Eingabe setzen
	; -------------------------
put_3	lda #11		; Cursorposition laden
	jsr curs_set	; und auf Terminzeit setzen
	jmp curs_on	; Cursor einschalten

	bend


t_art_tab	word termin_txt
	word bea_ein_txt
	word bea_aus_txt
	word zw_aus_txt
	word zw_ein_txt


termin_txt	byte	DSP_CLR
	shift "Termin   >"

bea_ein_txt	byte	DSP_CLR
	shift "Bea. ein >"

bea_aus_txt	byte	DSP_CLR
	shift "Bea. aus >"

zw_aus_txt	byte	DSP_CLR
	shift "Zweit aus>"

zw_ein_txt	byte	DSP_CLR
	shift "Zweit ein>"



; =========================================================================
;
; Funktion	: Terminzeit und Datum ausgeben
;
; Eingang	: Terminnr. in "term_nr"
;
; Ausgang	: Ausgabe der Terminzeit bei belegten Terminen
;	: Ausgabe der aktuellen Uhrzeit bei freien Terminen
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

put_ttime
	block
	ldy term_nr	; Terminnr. laden
	jsr set_tti_adr	; Adr. der Terminzeit-Struktur holen
	stx term_iadr	; low Byte eintragen
	sta term_iadr+1	; dito high

	; Terminzeit ausgeben
	; -------------------
	lda #11		; Cursorposition für Terminzeit laden
	jsr curs_set	; und setzen
	ldy #03

	ldx term_nr	; Terminnr. laden
loop	lda term_days,x	; ist Termin belegt ?
	bne put_time	; ja, Terminzeit ausgeben

	phx		; Terminnr. retten
	ldx term_uhr_f,y	; Offset auf Uhr-Ausgabe laden
	lda uhr_buff,x	; Uhrzeit laden
	plx		; Terminnr. zurück
	bra put_time_1	; und ausgeben

put_time	lda (term_iadr),y	; Termin-Zeitwert laden
put_time_1	jsr putdez99	; und dezimal ausgeben, max. 99
	lda term_trnz,y	; Trennzeichen laden
	jsr putchar	; und ausgeben
	dey		; alle Zeichen ausgegeben ?
	bpl loop	; nein

	rts
	bend


term_trnz	text " . :"	; Trennzeichen
term_uhr_f	byte MON,TAG,MIN,STD	; Ausg. der Uhrzeit für Termin, rückwärts




; =========================================================================
;
; Funktion	: Tage an denen der Termin erscheint ausgeben
;
; Eingang	: ---------
;
; Ausgang	: Ausgabe der Termintage und der dazugehörigen Belegtzustände
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

put_tday
	block
	ldx #<termday_txt	; Text ausgeben
	ldy #>termday_txt
	jsr puttxt

	lda #1		; Position des Cursors laden
	jsr curs_set	; und setzen

	ldy term_nr	; Terminnr. laden
	ldx #6		; Anzahl der Tage laden
	lda term_days,y	; Zustand der Tage (ein/aus) laden
	sta hlp_reg	; und ins Hilfregister schreiben

loop	lda dp_bu_po	; Cursorpos. laden
	clc
	adc #2		; auf akt. Tag stellen
	jsr curs_set	; und Cursor setzen

	lda #SPACE	; Char. für nicht belegt laden
	lsr hlp_reg	; BIT ins Carry schieben
	bcc free	; Tag ist nicht eingeschaltet

	lda #"*"	; Belegtkennzeichnung laden

free	jsr putchar	; Kennzeichnung ausgeben
	dex		; nächsten Tag einstellen
	bpl loop	; und Tag testen

	rts
	bend


termday_txt	byte	DSP_CLR
	shift "0So 1M 2D 3M 4D 5F 6Sa"




; =========================================================================
;
; Funktion	: Text>.... im Display ausgeben
;
; Eingang	: ---------
;
; Ausgang	: ---------
;
; Register	: X, Y
;
; (c) by Thomas Lehmann März 1993
;
; =========================================================================

termtxt_out
	block
	ldx #<termtxt_txt	; Text ausgeben
	ldy #>termtxt_txt
	jsr puttxt
	ldx term_iadr	; low byte der Adr. eintragen
	ldy term_iadr+1	; dito high Byte
	stx ind_adr	; Textadr. ablegen
	sty ind_adr+1
	jmp puts

termtxt_txt	byte	DSP_CLR | CURS_ON
	shift "Text>"
	bend


; =========================================================================
;
; Funktion	: Termintext im Display zentriert ausgeben
;
; Eingang	: Terminnr. in "term_nr" eingetragen
;
; Ausgang	: Termintext des in "term_nr" eingestellten Termins ausgegeben
;
; Register	: Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

ttxt_out
	block
	pha
	phx
	ldy term_nr	; Terminnr. laden
	jsr set_ttxtadr	; Terminadresse einstellen
	stx term_iadr	; low byte der Adr. eintragen
	sta term_iadr+1	; dito high Byte

	jsr dp_clr	; Display löschen
	lda #23		; Cursor auf letztes Zeichen im Display stellen
	jsr curs_set	; Cursor setzen

	ldy #TTXT_LEN-1	; Ptr. auf Textbuffer Ende
	lda #$00
	sta (term_iadr),y	; Termintext sicherheitshalber begrenzen

	ldy #$00	; Offset auf akt. Zeichen im Textbuffer
loop	lda (term_iadr),y	; Zeichen aus Textspeicher holen
	beq center	; es war das letzte Zeichen, Text zentrieren

	jsr putchar	; und im Display anzeigen
	iny
	cpy #TTXT_LEN	; sind alle Zeichen geholt ?
	bcc loop	; nein, nächstes Zeichen holen


	; Text zentrieren
	; ---------------
center	sty hlp_reg	; Anzahl der Zeichen merken
	lda #24		; max. Anzahl der Zeichen im Display laden
	sec
	sbc hlp_reg	; Anzahl der Zeichen im Display abziehen
	beq end		; Display komplett mit Text gefüllt, Ende

	lsr a		; restliche Zeichen (Space`s) halbieren
center_1	jsr space	; Text nach links schieben
	dec a		; Anzahl der Space-1
	bpl center_1	; Text noch nicht mittig im Display

end	plx
	pla
	rts
	bend







; =========================================================================
;
; Funktion	: Adr. der Terminstruktur für die Zeit holen
;
; Eingang	: Terminnr. in Y-Reg.
;
; Ausgang	: low Adr. der Terminzeit-Struktur des Termins im Accu
;	: high in X-Reg
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann August 1991
;
; =========================================================================

set_tti_adr	ldx #<term_time	; low Byte der Termin Zeit Struktur
	lda #>term_time	; dito, high Byte
	sta hlp_reg	; für add eintragen

	lda #4		; 4 Zeiteinträge pro Termin * Termnr.
	jmp mul_add	; (Accu * Y) + (hlp_reg, X) == (Accu, X)


; =========================================================================
;
; Funktion	: Adr. der Termintextstruktur holen
;
; Eingang	: Terminnr. in Y-Reg.
;
; Ausgang	: high Adr. der Termintext-Struktur des Termins im Accu
;	: low in X-Reg
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann August 1991
;
; =========================================================================

set_ttxtadr phy
	ldx #<term_text	; low Byte der Termintext Struktur
	lda #>term_text	; dito, high Byte
	sta hlp_reg	; für add eintragen

	lda #TTXT_LEN	; Anzahl der Textzeichen pro Termin * Termnr.
	jsr mul_add	; (Accu * Y) + (hlp_reg, X) == (Accu, X)
	ply
	rts




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

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

