;**************************************************************************
;
; Filename : DISPLAY.ASM
; ----------------------
;
; (c) 1990 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Display Handling
;
;**************************************************************************



; =========================================================================
;
; Type	: Unterprg.
;	: String im Display ausgeben, letztes Zeichen geshiftet
;
; Eingang	: Stringadresse  : ind_adr
;	: letztes Zeichen im String geshiftet
;
; Ausgang	: String ab Cursorposition im Display ausgegeben
;
; Register	: ------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

puts	pha		; Register retten
	phy
	ldy #$00	; Pointer auf aktuellen Character

	.block
loop	lda (ind_adr),y	; Character laden
	pha		; Char. merken
	and #$7f	; Shift BIT ausblenden
	jsr putchar	; und ins Display
	iny		; Pointer auf nächstes Zeichen 
	pla		; Character zurück
	and #$80	; geshiftet ?
	beq loop	; nein, nicht der letzte Character
	.bend
	ply		; Register zurück
	pla
	rts


; =========================================================================
;
; Type	: Unterprg.
;	: Zahl ausgeben
;
; Eingang	: Wert im Accu
;
; Ausgang	: Wert 2stellig im Display ausgeben
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

putzahl	pha		; Wert retten
	lsr		; oberes Nibble in unteres schieben
	lsr
	lsr
	lsr
	jsr putzahl_1	; und ASCII ausgeben
	pla
	and #%00001111	; oberes Nibble ausblenden

putzahl_1	clc
	cmp #$0a	; ist Wert <9
	bcc putzahl_asc	; ja
	adc #6		; Hex A-F erzeugen
putzahl_asc	adc #48		; ASCII dazu
	jmp putchar	; und ins Display


; =========================================================================
;
; Type	: Unterprg.
;	: Wähltaste ausgeben
;
; Eingang	: Tastenwert im Accu
;
; Ausgang	: Wähltaste im Display ausgeben
;	: "*" und "#" gegen "/" und "-" ausgetauscht
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

wta_displ	jsr wta_to_asc	; Wtastenwert in ASCII wandeln
	cmp #"0"	; ist es 0-9 ?
	bcs wta_displ_3	; ja, Zeichen direkt ausgeben

	cmp #"*"	; ist es "*"
	beq wta_displ_2	; ja

	lda #"-"	; "#" gegen "-" austauschen
	bra wta_displ_3	; und ausgeben

wta_displ_2	lda #"/"	; "*" gegen "/" austauschen
wta_displ_3	jmp putchar	; und ins Display schreiben


; =========================================================================
;
; Type	: Unterprg.
;	: Wähltastenwert in ASCII wandeln
;
; Eingang	: Tastenwert im Accu
;
; Ausgang	: ASCII-Wert im Accu
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

wta_to_asc	jsr check_wta	; Wähltaste 1-9 ?
	cmp #11		; ist es "#"
	bcc wta_asc_1	; nein, Ziffer 0-9

	bne wta_asc_2	; es ist "*"

	lda #"#"	; ASCII-Wert laden
	bra wta_asc_3	; und Ende

wta_asc_2	lda #"*"	; ASCII-Wert laden
	bra wta_asc_3	; und Ende	

wta_asc_1	clc
	adc #48		; ASCII dazugeben
wta_asc_3	rts



; =========================================================================
;
; Type	: Unterprg.
;	: Zeichen im Display ausgeben
;
; Eingang	: auszugebener Character im Accu
;
; Ausgang	: Character im Displaybuffer abgelegt
;	: im Display an Cursorposition ausgegeben
;
; Register	: ------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

putchar	phx		; Register retten
	phy

	ldx dp_bu_po	; akt. Pointer im Displaybuffer laden
	cpx #DP_BU_LA	; noch Platz frei
	bcc putchar_1	; ja, Zeichen anhängen

	; Character im Displaybuffer nach links rausschieben
	; --------------------------------------------------
	pha		; Character retten
	ldy #00		; 1. Character im Buffer einstellen
	tya		; Cursor auf 1. Position im Display setzen
	jsr curs_set	; Cursor setzen

dp_schieb	lda dp_buff+1,y	; 2.Character holen
	sta dp_buff,y	; und einen vorher ablegen
	jsr char_out	; Character ausgeben
	iny
	cpy #DP_BU_LA-1	; alle Character geschoben ?
	bcc dp_schieb	; nein, nächsten Character schieben
	pla		; auszugebenen Character zurückholen
	dex		; auf letze Position im Display stellen

putchar_1	sta dp_buff,x	; Char. im Displaybuffer ablegen
	jsr char_out	; und ins Display schreiben

	ply		; Register zurück
	plx
	rts


; =========================================================================
;
; Type	: Unterprg.
;	: einzelnes Zeichen ins Display schreiben
;
; Eingang	: auszugebenes Zeichen : Accu
;
; Ausgang	: Character im Display an Cursorposition ausgegeben
;
; Register	: -------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

char_out	jsr dp_busy	; warten bis Display für Daten bereit
	pha		; Char. retten
	lda #RS_FLAG	; Display für ASCII-Character vorbereiten
	tsb Dp_rs	; BIT setzen
	pla		; Character zurück
	sta Display+1	; und ausgeben
	inc dp_bu_po	; Pointer auf akt. Char im Buffer +1
	rts


; =========================================================================
;
; Type	: Unterprg.
;	: einzelnes Zeichen ins Display schreiben, SPACE hinterher
;
; Eingang	: auszugebenes Zeichen im Accu
;
; Ausgang	: Character und SPACE im Display an Cursorposition ausgegeben
;
; Register	: ------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

putchar_sp	jsr putchar	; Zeichen ausgeben
	bra putspace	; SPACE ausgeben


; =========================================================================
;
; Type	: Unterprg.
;	: SPACE ausgeben
;
; Eingang	: ------
;
; Ausgang	: SPACE im Display an Cursorposition ausgegeben
;
; Register	: ------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

putspace	pha		; Accu retten
	lda #SPACE	; Characterwert für SPACE laden	
	jsr putchar	; und ausgeben
	pla
	rts

; =========================================================================
;
; Type	: Unterprg.
;	: Cursor setzen
;
; Eingang	: Cursorposition im Accu
;
; Ausgang	: Cursor an angegebene Position gesetzt
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

curs_set	jsr dp_busy	; Display für Befehl vorbereiten
	sta dp_bu_po	; Pointer auf Character im Display setzen
	ora #$80	; Offset des 1. Characters im Display dazu
	sta Display	; und Cursor setzen
	rts

; =========================================================================
;
; Type	: Unterprg.
;	: Cursor einschalten
;
; Eingang	: ------
;
; Ausgang	: Cursor angeschaltet, Zeichen unter Cursor blinkt
;
; Register	: -----
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

curs_on	pha		; Accu retten
	jsr dp_busy	; Display für Befehl vorbereiten
	lda #$0f	; Befehl laden
	sta Display	; und ans Display weitergeben
	pla		; Accu zurück                   
	rts

; =========================================================================
;
; Type	: Unterprg.
;	: Cursor ausschalten
;
; Eingang	: ------
;
; Ausgang	: Cursor ausgeschaltet
;
; Register	: -----
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

curs_off	pha		; Accu retten
	jsr dp_busy	; Display für Befehl vorbereiten
	lda #12		; Befehl laden
	sta Display	; und ans Display weitergeben
	pla		; Accu zurück                   
	rts


; =========================================================================
;
; Type	: Hauptprg.
;	: Display löschen, Cursor aus
;
; Eingang	: ------
;
; Ausgang	: Display clr
;	: Cursor an 1. Position gesetzt und ausgeschaltet
;
; Register	: -----
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

dpclr_cuoff	jsr dp_clr	; Display clr
	bra curs_off	; Cursor ausschalten


; =========================================================================
;
; Type	: Hauptprg.
;	: Display löschen
;
; Eingang	: ------
;
; Ausgang	: Display und Displaybuffer mit SPACE beschrieben
;	: Cursor an 1. Position gesetzt
;
; Register	: -----
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

dp_clr	pha		; Register retten
	phx
	lda #$00	; 1. Cursorposition
	jsr curs_set	; Cursor setzen
	ldx #DP_BU_LA	; Displaybuffer Länge laden

	.block
loop	lda #SPACE	; Space laden
	jsr putchar	; und ins Display schreiben
	dex		; alle Zeichen überschrieben ?
	bne loop	; nein, weiter
	.bend

	txa		; 1. Cursorposition
	jsr curs_set	; Cursor setzen

	plx		; Register zurück
	pla
	rts


; =========================================================================
;
; Type	: Hauptprg.
;	: 40 uS warten bis Display für neue Zeichen bereit ist
;
; Eingang	: ------
;
; Ausgang	: Display im Befehlsmodus
;
; Register	: -----
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

dp_busy	pha		; Accu retten
	phx

	ldx #10		; Schleifenanzahl
dp_busy_1	dex		; 2 Cycles
	bne dp_busy_1	; 3 Cycles

	lda #RS_FLAG	; Display für Befehl vorbereiten
	trb Dp_rs	; BIT löschen
	plx
	pla		; Accu zurück
	rts


; =========================================================================
;
; Type	: Hauptprg.
;	: Prg. für aktuelle Displayausgaben ausführen
;
; Eingang	: wird von Haup-Schleife zyklisch aufgerufen
;
; Ausgang	: aktuelles Displayprg. angesprungen
;
; Register	: X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

displ_out	lda displ_prg	; Programmnr. laden
	bne displ_out_1	; Uhranzeige ist nicht eingeschaltet

	jsr st_dp_tim	; Display Timer aufziehen, Uhranzeige ist ein
	bra displ_out_3	; Uhr wird angezeigt

displ_out_1	rmb 7,sekunde	; Uhr direkt anzeigen wenn Prg. beendet

displ_out_3	jsr displ_res	; testen ob Anzeige wieder in Uhrmodus schalten

displ_out_2	asl		; Offset auf Prg. Tabelle erzeugen
	tax
	lda displ_tab+1,x	; low Byte laden
	pha		; und auf den Stack
	lda displ_tab,x	; high Byte laden
	pha
no_prg	rts		; Programm ausführen


displ_tab	.rta put_uhr	; Uhranzeige
	.rta put_vers	; Version anzeigen
	.rta whl_abl	; Wahlablauf-Cursor
	.rta no_prg	; kein Displayprg. ausführen


; =========================================================================
;
; Type	: Unterprg.
;	: Timer für Displayanzeige ohne Tastendruck aufziehen
;
; Eingang	: -------
;
; Ausgang	: Display-Timer neu gestartet
;
; Register	: -------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

st_dp_tim	pha		; Register retten
	lda #DISPL_TIM	; Zeit bis Uhranzeige wieder einge. wird laden
	sta struct_tim100+DISPL_TIM_O	; Display-Timer starten
	pla		; Register zurück
	rts


; =========================================================================
;
; Type	: Unterprg.
;	: testen ob Displayanzeige wieder in den Uhrmodus geschaltet wird
;
; Eingang	: -------
;
; Ausgang	: Displayanzeige auf Uhr-Modus geschaltet, Ende Taste ausgeführt
;
; Register	: -------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

displ_res	pha		; Register retten
	lda struct_tim100+DISPL_TIM_O	; Display in Uhranzeige schalten ?
	bne displ_res_e	; nein, Timer nicht abgelaufen

	bbs LTG_BEL,ltg_stat,displ_res_e	; Leitung ist belegt

	jsr wta_bta_off	; BTA-Modus verlassen, LED-RAM clr
	jsr key_ende	; Uhranzeige wieder einschalten, Modus Reset

displ_res_e	pla		; Register zurück
	rts


; =========================================================================
;
; Type	: Unterprg.
;	: Texte ausgeben
;
; Eingang	: letzte Textnr. in X-Reg
;	: erste Textnr. in Y-Reg
;
; Ausgang	: Text ausgegeben
;	: nächste bzw. erste Textnr. eingestellt
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

show_txtnr	lda txtnr	; aktuelle Textnr. laden
	stx hlp_reg	; letzte Textnr. ablegen
	tax		; Textnr. für Ausgabe kopieren
	sec
	sbc hlp_reg	; Textnr. abziehen
	bpl show_ok	; noch nicht alle Texte ausgegeben

	sty txtnr	; ersten Text einstellen
	bra show_txtnr	; und ausgeben

show_ok	dec txtnr	; nächsten Text einstellen
	bra puttxt	; und Text ausgeben


; =========================================================================
;
; Type	: Unterprg.
;	: verschiedene Texte über Tabelle ausgeben
;
; Eingang	: Textnr. in X-Reg.
;
; Ausgang	: Display wenn angegeben clr
;	: Cursor gesetzt
;	: Text im Display ausgegeben
;
; Register	: X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

puttxt	pha		; Register retten
	lda #$fd	; Text 0 einstellen
puttxt_lp	clc
	adc #3		; 3 Bytes pro Texteintrag
	dex		; Textnr. gefunden ?
	bne puttxt_lp	; nein
	tax		; Offset auf Texttabelle laden

puttxt_0	lda txt_tab,x	; Statusbyte laden
	bit #$80	; Display clr ?
	beq puttxt_1	; nein
	jsr dp_clr	; Display löschen

puttxt_1	bit #$20	; Cursor einschalten ?
	beq puttxt_01	; nein, Cursor aus
	jsr curs_on	; Cursor einschalten
	bra puttxt_2

puttxt_01	jsr curs_off	; Cursor ausschalten

puttxt_2	bit #$40	; Cursor setzen ?
	bne puttxt_3	; nein
	and #%00011111 	; Cursorposition
	jsr curs_set	; Cursor setzen

puttxt_3	lda #NO_DISPL	; kein Display-Prg. ausführen
	sta displ_prg	; Prg.Nr. für Displayausgabe eintragen
	lda txt_tab+1,x	; Adresse des Textes, low Byte
	sta ind_adr	; low Byte Textadr. setzen
	lda txt_tab+2,x	; Adresse des Textes, high Byte
	sta ind_adr+1	; high Byte Textadr. setzen
	pla		; Register zurück
	jmp puts	; Text ins Display


	; ========================================
	; Tabelle der Texte
	;
	; Aufbau des Statusbytes:
	; -----------------------
	; Display clr	: BIT 7 = 1
	; Cursor setzen	: BIT 6 = 0
	; Cursor ein	: BIT 5 = 1
	; Cursorposition	: BIT 0-4, (0-23)
	; ========================================

txt_tab	.byte 00	; Cursor setzen
	.word version	; Type und Version

	.byte 00	; Cursor setzen
	.word vers_date	; Versionsdatum

	.byte 00|$80	; Cursor setzen, Display clr
	.word btawhl_txt	; BTA-Wahl

	.byte 00|$80	; Cursor setzen, Display clr
	.word btatast_txt	; BTA Tastenberechtigung wurde eingeleitet

	.byte 00|$80|$20	; Cursor setzen, Display clr, Cursor ein
	.word twert_txt	; Tastenwert anzeigen

	.byte 00|$80|$20	; Cursor setzen, Display clr, Cursor ein
	.word aendjn_txt	; ändern ja/nein

	.byte 00|$80|$20	; Cursor setzen, Display clr, Cursor ein
	.word btatxt_txt	; BTA Textberechtigung wurde eingeleitet

	.byte 00|$80|$20	; Cursor setzen, Display clr, Cursor ein
	.word txtclr_txt	; BTA Textberechtigung löschen

	.byte 00|$80|$20	; Cursor setzen, Display clr, Cursor ein
	.word usttime_txt	; Uhr stellen, Zeit

	.byte 00|$80|$20	; Cursor setzen, Display clr, Cursor ein
	.word ustdate_txt	; Uhr stellen, Datum

	.byte 00|$80	; Cursor setzen, Display clr
	.word sp_txt3	; Speichern Text3

	.byte 00|$80	; Cursor setzen, Display clr
	.word sp_txt2	; Speichern Text2

	.byte 00|$80	; Cursor setzen, Display clr
	.word spko_txt1	; Speichern/Kontrolle Text1

	.byte 00|$80	; Cursor setzen, Display clr
	.word ko_txt3	; Kontroll Text3

	.byte 00|$80	; Cursor setzen, Display clr
	.word ko_txt2	; Kontroll Text2

	.byte 00|$80	; Cursor setzen, Display clr
	.word spko_txt1	; Speichern/Kontrolle Text1

	.byte 00|$80	; Cursor setzen, Display clr
	.word namtast_txt	; Namentaste ?

	.byte 06|$80	; Cursor setzen, Display clr
	.word nbel_txt	; Namentaste nicht belegt

	.byte 00|$80	; Cursor setzen, Display clr
	.word rufnr_txt	; Rufnummer

	.byte $40	; Cursor nicht setzen
	.word ss_txt	; Schlüsselschalter Zustand

	.byte 00|$80	; Cursor setzen, Display clr
	.word termwhl_txt	; Terminauswahl

	.byte 06	; Cursor setzen
	.word termein_txt	; Terminzeit eingeben

	.byte 00|$80	; Cursor setzen, Display clr
	.word termtxt_txt	; Termintext eingeben

	.byte 00|$80	; Cursor setzen, Display clr
	.word termday_txt	; Termintage eingeben



	; ================
	; allgemeine Texte
	; ================

aendjn_txt	.shift "aendern ? (1=J, 2=N) : "

