;**************************************************************************
;
; Filename : NAMTAST.ASM
; ----------------------
;
; (c) 1990/91 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Namentasten Handling
;
;
;**************************************************************************

MODUL_START	set	*	; Größe des Moduls berechnen



; =========================================================================
;
; Funktion	: Namentaste auswerten
;	  der NT Speicher ist folgendermaßen aufgeteilt:
;	  NT 0 	   : Babyphone Rufnr.
;	  NT 1-?   : NT Rufnr. im 1. RAM
;	  NT ?-100 : NT Rufnr. im 2. RAM
;	  NT 101-? : Rufnr. für Telefonbuch
;
; Eingang	: Offset auf Tastaturtabelle in X-Reg.
;	: Tastenwert im Accu
;
; Ausgang	: LED in Namentaste eingeschaltet
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

namsp_tab	word put_nt	; standard Namentaste speichern/kontrollieren
	word put_notruf	; Notruf Namentaste speichern/kontrollieren
	word put_telnt	; TeleBuch Namentaste speichern/kontrollieren


key_namen	jsr curs_off	; Cursor ausschalten
	pha		; Tastenwert retten
	lda tast_tab+1,x	; NT Nr. holen
	tax		; Tastennr.
	pla		; Tastenwert holen

	; LED in vorheriger NT ausschalten
	; --------------------------------
	ldy #LD_L|LD_R|LD_OFF	; LED-Wert laden
	jsr set_prgled	; LED in allen NT ausschalten

	; LED in gedrückter NT einschalten
	; --------------------------------
	ldy #LD_L|LD_T	; LED-Wert für 1.Speicher laden
	bbr ST_2SP,feap_stat,key_nam_1sp	; 2.Speicher nicht aktiv

	ldy #LD_R|LD_T	; LED-Wert für 2.Speicher laden
key_nam_1sp	jsr set_twnrled	; LED in NT einschalten


	txa		; NT Nr. -> Accu
	clc
	adc #NT_NAMTAST	; 1. gültige NT (10-...) generieren
	rmb NT_OUT,allg_stat		; Rufnr. auf NT wählen

	bbs MOD_SP,modus,keynam_sp	; Rufnr. auf Namentaste speichern
	bbr MOD_KO,modus,keynam_whl	; Rufnummer auf NT wählen

	; NT kontrollieren
	; ----------------
keynam_out	jsr dp_clr			; Display löschen
	smb NT_OUT,allg_stat		; Rufnr. auf NT nur ausgeben
	ldx namsp_fkt	; akt. Funktion für Namen Speicher
	jmp (namsp_tab,x)	; und ausführen

	; Rufnr. auf Namentaste wählen/ausgeben
	; =====================================
keynam_whl	jmp put_nt	; Rufnummer der NT ausgeben/wählen



	; Rufnummer der gedrückten NT ausgeben
	; ====================================
last_nt_out	lda last_nt	; NT Nr. laden
	jsr keynam_out	; und Rufnummer erneut ausgeben
	sty ziff_offs	; Offset auf NT Buffer für nächste Ziffer
key_nam_end	rts






	; Auswahl der NT für Rufnr. speichern (NT Nr. im Accu)
	; Einsprung auch von Babyphone, Notruf, Telefonbuch !!!
	; ====================================================
keynam_sp
	block
	ldx #WTA_SPNAM	; WTA Prg. für Speichern NT
	stx wta_prg	; und bei Wähltaste ausführen

	jsr getnam_adr	; Adr. der NT nach (nam_sp) holen
	bcc key_nam_end	; Speicherbereich ist nicht gültig

	cmp last_nt	; gleiche Taste erneut gedrückt ?
	sta last_nt	; letzte NT merken
	bne nam_aktiv	; nein

	; Rufnr. zum editieren anzeigen
	; -----------------------------
	bbs EDIT_NT,allg_stat,nam_aktiv	; Eingabe toggeln

	smb EDIT_NT,allg_stat	; Rufnr. ist zum editieren ausgegeben
	bra last_nt_out		; Rufnr. ausgeben


	; Rufnr. Eingabe aktivieren
	; -------------------------
nam_aktiv	rmb EDIT_NT,allg_stat	; komplette Rufnr. eingeben
	lda #MAX_NAM_ZIFF-1		; 1. Ziffer einstellen
	sta ziff_offs
	jmp put_rufnr		; "Rufnummer ?" ausgeben
	bend




	; =====================================================
	; nächste Spezial NT einstellen und im ACCU zurückgeben
	; =====================================================
nt_nxt_spec
	block
	lda last_nt	; akt. NT Speicher holen
	bbr ST_2SP,feap_stat,set	; 2.SP ist nicht aktiv

	rmb ST_2SP,feap_stat	; 2.SP ist nicht aktiv
	inc a               ; nächsten NT Speicherplatz einstellen
	inc last_nt
            rts

set	smb ST_2SP,feap_stat
	rts
	bend




; =========================================================================
;
; Funktion	: Rufnummer auf einer Namentaste speichern/kontrollieren
;
; Eingang	: Auswahl bei Speichern/Kontrolle
;
; Ausgang	: Wähltastatur abgeschaltet, wird durch NT Druck aktiviert
;
; Register	: X
;
; (c) by Thomas Lehmann März 1990
;
; =========================================================================

spko_namkey
	block
	ldx #WTA_NOPRG	; kein WTA-Programm ausführen
	stx wta_prg	; und bei Wähltaste ausführen

	ldx #<nt_txt	; Text ausgeben
	ldy #>nt_txt
	jmp puttxt


nt_txt	byte	DSP_CLR
	shift "Namentaste ?"

	bend


; =========================================================================
;
; Funktion	: Ziffer auf NT speichern
;
; Eingang	: bei Wähltaste und eingeschaltetem Namentasten-Speicher-Modus
;	: Tastenwert (1 bis ...) im Accu
;
; Ausgang	: eingegebene Rufnummer auf der Namentaste gespeichert
;
; Register	: Accu, Y
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================

wta_spnam
	block
	smb EDIT_NT,allg_stat	; Rufnr. ist zum editieren ausgegeben
	ldy ziff_offs	; Offset auf akt. Ziffer laden
	bmi end		; max. Anzahl Ziffern eingegeben

	pha		; Ziffer retten
	lda (nam_sp),y	; Ziffer für 1. und 2. Speicher laden
	bbs ST_2SP,feap_stat,nam_2sp	; 2.SP ist aktiv

	; Rufnummer für 1.Speicher ermitteln
	; ----------------------------------
	and #%11110000	; unteres Nibble = 1.Speicher ausblenden
	sta hlp_reg
	pla		; Ziffer zurück
	bra nam_write	; und Ziffernwert eintragen

	; Rufnummer für 2.Speicher ermitteln
	; ----------------------------------
nam_2sp	and #%00001111	; oberes Nibble = 2.Speicher ausblenden
	sta hlp_reg
	pla		; Ziffer zurück
	asl		; unteres Nibble ins obere schieben
	asl		; Rufnr. des 2.Speichers steht im high Nibble
	asl
	asl

nam_write	ora hlp_reg	; Ziffer vom anderen (1.oder 2.Speicher) dazu
	sta (nam_sp),y	; neue Ziffer speichern

	; Ende der Rufnr. kennzeichnen
	; ----------------------------
	dey		; nächste Ziffer ist Ende Kennung
	bra nam_clr	; Ende Kennung eintragen

end	rts
	bend


; =========================================================================
;
; Funktion	: einzelne Ziffer auf Namentaste löschen
;	  !! Vergleich ob Y negativ ist == kein Löschen (letzte Ziffer)
;
; Eingang	: Offset auf Ziffernbuffer in Y
;
; Ausgang	: -------
;
; Register	: Accu
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================

nam_clr
	block
	bmi end		; keine Ende Kennung notwendig

	lda (nam_sp),y	; Ende-kennung für 1. und 2. Speicher laden
	bbs ST_2SP,feap_stat,nam_clr_2sp	; 2.SP ist aktiv

	and #%11110000	; unteres Nibble ausblenden, letzte Ziffer 1.SP
	bra nam_clr_1	; und Endekennzeichnung speichern

nam_clr_2sp	and #%00001111	; oberes Nibble ausblenden, letzte Ziffer 2.SP
nam_clr_1	sta (nam_sp),y	; letzte Ziffer kennzeichnen
end	jmp last_nt_out	; und Rufnummer erneut ausgeben
	bend






; =========================================================================
;
; Funktion	: letzte Ziffer auf Namentaste löschen
;
; Eingang	: bei Löschtaste und eingeschaltetem Namentasten-Speicher-Modus
;
; Ausgang	: letzte eingegebene Ziffer clr wenn bereits Eingabe erfolgt ist
;	  sonst wird die komplette Rufnr. gelöscht
;
; Register	: Accu, Y
;
; (c) by Thomas Lehmann Mai 1990
;
; =========================================================================

namziff_clr	smb EDIT_NT,allg_stat	; Rufnr. ist zum editieren ausgegeben
	ldy ziff_offs	; akt. Ziffer laden
	cpy #MAX_NAM_ZIFF-1
	beq nam_clr	; noch keine Ziffer eingegeben, alles löschen

	iny		; vorherige Ziffer einstellen
	bra nam_clr	; und Ziffer löschen







; =========================================================================
;
; Funktion	: Rufnummer einer Namentaste ausgeben
;	  die Rufnummer wird von hinten nach vorne gespeichert.
;	  Das vorzeitige Ende der Rufnr. wird durch NUL gekennzeichnet.
;
; Eingang	: NT Nr. im Accu
;	: BIT NT_OUT in allg_stat == 1, Rufnr. auf NT nur ausgeben
;
; Ausgang	: Offset auf nächste Ziffer hinter Ausgabe in Y
;	  Anzahl ausgegebene Ziffern in X
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================

put_nt
	block
	jsr getnam_adr	; Adr. der Namentaste in (nam_sp) eintragen
	bcc end		; Speicherbereich ist nicht gültig

	; Rufnr. auf Namentaste ausgeben
	; ------------------------------
	ldy #MAX_NAM_ZIFF-1	; Ptr. auf erste Ziffer stellen
	ldx #$00	; Ziffern Counter
loop	lda (nam_sp),y	; Ziffer laden

	bbr ST_2SP,feap_stat,nam_out_1sp	; 2.SP ist nicht aktiv

	; Ziffer für 2.Speicher ermitteln
	; -------------------------------
	lsr		; oberes Nibble ins untere schieben
	lsr		; Rufnr. des 2.Speichers steht im high Nibble
	lsr
	lsr

	; Ziffer für 1.Speicher ermitteln
	; -------------------------------
nam_out_1sp	and #%00001111	; oberes Nibble ausblenden
	beq nam_end	; alle Ziffern ausgegeben

	bbs NT_OUT,allg_stat,nam_out	; Rufnummer nur anzeigen

	; Ziffer auf Namentaste wählen
	; ----------------------------
	jsr whl_ziff	; Ziffer wählen
	bra nxt_nam

nam_out	jsr wta_displ	; Ziffer ins Display schreiben
nxt_nam	inx		; Anzahl ausgegebener Ziffern
	dey		; nächste Ziffer einstellen
	bpl loop	; nächste Ziffer holen


nam_end	bbr EDIT_NT,allg_stat,nam_end_1	; Edit Modus nicht aktiv
	jsr curs_on	; Cursor für Editier Modus einschalten

nam_end_1	cpx #$00	; wurden Ziffern ausgegeben
	bne end		; ja, Ende

	bbs MOD_NT_SPEC,modus,end	; Sonder Funktion für NT-Speicher

	phy		; Offset auf NT Buffer retten
	jsr curs_off	; Cursor ausschalten
	ldx #<nbel_txt	; "NT nicht belegt" ausgeben
	ldy #>nbel_txt
	jsr puttxt
	ply
end	rts


nbel_txt	byte	DSP_CLR
	shift "Namentaste nicht belegt"

	bend



; =========================================================================
;
; Funktion	: Adr. für Speicherbereich einer Namentaste ermitteln
;
; Eingang	: NT Nr. im Accu
;
; Ausgang	: Adr. auf Namenspeicher der Taste in "nam_sp"
;	: SEC == Adr. eingestellt, CLC == kein Zusatz RAM
;
; Register	: ------
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================

getnam_adr
	block
	pha		; Register retten
	phx
	phy

	; Start-Adr. für Namenspeicher on Board (RAM 1)
	; ---------------------------------------------
	ldx #<nam_buff1
	ldy #>nam_buff1

	cmp #MAX_NAM1	; Speicherbereich für NT im 1.RAM ?
	bcc nam_adr	; ja, Adresse berrechnen

	sbc #MAX_NAM1	; 1. NT im Zusatz RAM einstellen

	; Adr. für Namenspeicher im Zusatz RAM (RAM 2)
	; --------------------------------------------
	bbr ST_ZRAM,allg_stat,nam_adr_err	; Zusatz-RAM nicht vorhanden

	; Start-Adr. für Namenspeicher im Zusatz-RAM
	; ------------------------------------------
	ldx #<nam_buff2
	ldy #>nam_buff2


	; Adresse der Namentaste im RAM berechnen
	; ---------------------------------------
nam_adr	sty hlp_reg	; high Byte der Startadr.
	ldy #MAX_NAM_ZIFF	; Multiplikator, Anz. der Ziffern je Namentaste

	; (NT Nr. (accu) * Anz. Ziffern je NT) + Startadr. (hlp_reg, X)
	jsr mul_add	; (Accu * Y) + (hlp_reg, X) == (Accu, X)
	stx nam_sp	; low Adr. des Namespeichers
	sta nam_sp+1	; dito high
	sec		; Adr. eingestellt
	bra nam_adr_ok

	; Zusatz-RAM ist nicht installiert, Fehlertext ausgeben
	; -----------------------------------------------------
nam_adr_err	jsr put_kzram	; Text "Zusatz RAM fehlt" ausgeben
	clc		; kein Zusatz RAM vorhanden
nam_adr_ok	ply		; Register zurück
	plx
	pla
	rts
	bend




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

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

