;**************************************************************************
;
; Filename : GEBUEHREN.ASM
; ------------------------
;
; (c) 1991 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Gebühren bzw. Gesprächsdauer Anzeige
;
;
;**************************************************************************

MODUL_START	set	*	; Größe des Moduls berechnen

; =========================================================================
;
; Funktion	: Gebühren bzw. Gesprächsdauer nachführen
;
; Eingang	: zyklisch von Hauptprg. Schleife
;
; Ausgang	: ------
;
; Register	: Accu
;
; (c) by Thomas Lehmann Mai 1990
;
; =========================================================================

inc_geb	bbr GEB_OUT,hgeb_stat,inc_geb_end	; Anzeige ausgeschaltet
	bbs DIP_GEB,dip_stat,inc_gspr_tim	; keine Gebührenauswertung

	; ==================
	; Gebühren errechnen
	; ==================

	bbr GEB_IMP,hgeb_stat,inc_geb_end	; keine Gebühren erkannt

	sei
	rmb GEB_IMP,hgeb_stat	; und neu auswerten
	cli

	ldx geb_cnt	; Anzahl erkannter Gebührenimpulse low
	lda geb_cnt+1	; dito high
	jsr calc_geb_dm	; in DM umrechnen, DM:Accu, X,  Pf.:Y
	stx gesprd+1	; DM Betrag low
	sty gesprd	; Pfennige
	rts


	; =========================
	; Gesprächsdauer nachführen
	; =========================

inc_gspr_tim lda uhr_buff+SEK	; aktuelle Sekunde laden
	cmp gesprd_sek	; ist Sekunde vorbei ?
	beq inc_geb_end	; nein, noch gleich, Ende

	sta gesprd_sek	; Sekunde eintragen

	lda gesprd	; Gesprächsdauer Sekunde laden
	inc a		; Sekunde nachführen
	cmp #60		; Überlauf ?
	bcc inc_gspr_1	; nein

	lda #00		; Sekunde Null laden
	inc gesprd+1	; Gesprächsdauer Minute nachführen
inc_gspr_1	sta gesprd	; Gesprächsdauer low Byte nachführen

inc_geb_end	rts



; =========================================================================
;
; Funktion	: Gesprächsdauer bzw. Gebühren ausgeben
;
; Eingang	: von Routine "Wahlablauf-Cursor aus"
;
; Ausgang	: -------
;
; Register	: Accu, X
;
; (c) by Thomas Lehmann Mai 1990
;
; =========================================================================

put_gesprd
	block
	bbr GEB_OUT,hgeb_stat,gesprd_end	; Anzeige ausgeschaltet
	bbs ST_BABY,no_ini_flag,gesprd_end	; Babyruf aktiv

	lda #18		; Cursorposition laden
	jsr curs_set	; Cursor setzen
	jsr space	; Trennung zwischen Rufnr. und Anzeige
	lda gesprd+1	; high Byte der Gesprächsdauer/Gebühren
	jsr putdez99	; und 2-stellig ausgeben

	lda #":"	; Trennzeichen für Gesprächsdauer
	bbs DIP_GEB,dip_stat,gesprd_1	; keine Gebührenauswertung

	lda #"."	; Trennzeichen für Gebühren
gesprd_1	jsr putchar	; und ausgeben
	lda gesprd	; low Byte der Gesprächsdauer/Gebühren
	jmp putdez99	; und 2-stellig ausgeben

gesprd_end	rts
	bend


; =========================================================================
;
; Funktion	: DM Betrag für Gebühreneinheiten * Faktor berrechnen
;
; Eingang	: Anzahl Gebühreneinheiten MSB Accu, LSB X
;
; Ausgang	: DM Betrag MSB Accu, LSB X, Pfennige in Y
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================

calc_geb_dm	ldy #100
	jsr div16_8	; Einheiten / 100 == Betrag in DM, Rest in Y
	phy		; restliche Einheiten, max. 99 retten

	; DM Betrag für Einheiten ohne Rest berrechnen
	; --------------------------------------------
	ldy geb_fakt	; Gebührenfaktor laden, Multiplikant
	jsr mul16_8	; Wert in DM, (ACCU, X) * Y = (Accu, X)
	sta hlp_reg	; DM Betrag retten
	stx hlp_reg+1

	; Rest Betrag für Einheiten in Pf. berrechnen
	; -------------------------------------------
	lda #$00	; high
	plx		; Restliche Einheiten
	jsr mul16_8	; Wert in Pfennigen, (ACCU, X) * Y = (Accu, X)

	; Rest Betrag in DM umrechnen
	; ---------------------------
	ldy #100
	jsr div16_8	; rest. Einh. / 100 == Betrag in DM, Pf. in Y
	phy		; Pfennige retten


	; beide DM Beträge addieren
	; -------------------------
	ldy hlp_reg+1	; low Byte des DM Betrags
	jsr add16_16	; Betrag + Rest DM (ACCU und X) + hlp_reg und Y

	ply		; Pfennige holen
	rts

	

; =========================================================================
;
; Funktion	: Gebührenfaktor speichern
;
; Eingang	: Auswahl bei Speichern
;
; Ausgang	: Wähltastatur auf Faktoreingabe umgeleitet
;
; Register	: X
;
; (c) by Thomas Lehmann Mai 1991
;
; =========================================================================

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

	lda geb_fakt	; aktuellen Gebührenfaktor laden
	bra geb_out	; aktuellen Gebührenfaktor ausgeben


; =========================================================================
;
; Funktion	: Gebührenfaktor eingeben
;
; Eingang	: bei Wähltaste und eingeschaltetem Gebührenfaktor Modus
;	: Tastenwert (1 bis ...) im Accu
;
; Ausgang	: --------
;
; Register	: Accu
;
; (c) by Thomas Lehmann Mai 1991
;
; =========================================================================

wta_spgeb	jsr check_wta	; Taste im Gültigkeitsbereich ?
	bcs wta_spgeb_e	; nein, Ende

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

	ldx #00		; 2-stellige Eingabe holen (ACCU)
	jsr get_input
	sta geb_fakt	; Gebührenfaktor eintragen

	; Gebühren Text ausgeben
	; ----------------------
geb_out	stz input_po	; Offset auf akt. Eingabe
	ldx #<geb_txt	; Text ausgeben
	ldy #>geb_txt
	jsr puttxt

	jsr putdez99	; Gebührenfaktor dezimal ausgeben
	jmp space

wta_spgeb_e	rts


geb_txt	byte DSP_CLR|CURS_ON
	shift "Gebuehrenfaktor: "





; =========================================================================
;
; Funktion	: angefallene Gesprächsgebühren eintragen
;	  nach Trennen des Gesprächs
;
; Eingang	: ------
;
; Ausgang	: --------
;
; Register	: Accu, X, Y
;
; (c) by Thomas Lehmann Oktober 1991
;
; =========================================================================

geb_stat	ldx geb_cnt	; Anzahl Gebührenimpulse des Gesprächs laden
	lda geb_cnt+1
	phx		; zur weiteren Addition retten
	pha

	; Gesamt Gebührenimpulse eintragen
	; --------------------------------
	ldy struct_stat+STAT_GEB+1	; Gesamt Gebühren high
	sty hlp_reg			; für add eintragen
	ldy struct_stat+STAT_GEB	; Gesamt Gebühren low
	
	jsr add16_16			; (ACCU und X) + (hlp_reg und Y)
	sta struct_stat+STAT_GEB+1	; Gesamt Gebühren high
	stx struct_stat+STAT_GEB	; Gesamt Gebühren low

	
	; Monats Gebührenimpulse eintragen
	; --------------------------------
	ldx uhr_buff+MON			; aktuellen Monat laden (1-12)
	dex

	ldy struct_stat+STAT_GEB+1,x	; Monats Gebühren high
	sty hlp_reg			; für add eintragen
	ldy struct_stat+STAT_GEB,x	; Monats Gebühren low
	pla				; Anzahl Gesprächs-Gebührenimpulse
	plx
	jsr add16_16			; (ACCU und X) + (hlp_reg und Y)

	ldy uhr_buff+MON			; aktuellen Monat laden
	sta struct_stat+STAT_GEB+1,y	; Monats Gebühren high
	txa
	sta struct_stat+STAT_GEB,y	; Monats Gebühren low
	rts


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

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

