;**************************************************************************
;
; Filename : UTIL.ASM
; -------------------
;
; (c) 1990 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; verschiedene Utility Routinen
;
;
;**************************************************************************


; =========================================================================
;
; Type	: Unterprg.
;	: RAM füllen
;
; Eingang	: Füllwert im Accu
;	: Startadresse in ind_adr
;	: Endadr. low in X-Reg.
;	: Endadr. high in Y-Reg.
;
; Ausgang	: Bereich zwischen Start und Endadr. mit Wert beschrieben
;
; Register	: ------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

fill_ram	sta (ind_adr)	; RAM mit Füllwert beschreiben
	cpx ind_adr	; low Byte der Adresse erreicht ?	
	bne fill_1	; nein

	cpy ind_adr+1	; high Byte der Adresse erreicht ?	
	bne fill_1	; nein
	rts

fill_1	inc ind_adr	; nächste Adresse einstellen
	bne fill_ram	; kein Überlauf
	inc ind_adr+1	; nächste Bank einstellen
	bra fill_ram



; =========================================================================
;
; Type	: Unterprg.
;	: Wähltaste checken
;
; Eingang	: Tastenwert im Accu
;
; Ausgang	: clc wenn Tastenwert 1-9
;	: Accu 0 wenn es Taste "0" war
;	: Tastenwert im Accu
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

check_wta	cmp #11		; Taste im Gültigkeitsbereich ?
	bcs check_wta_e	; nein, Ende

	cmp #10		; ist es "0" ?
	bne check_wta_1	; nein, Taste gültig

	lda #00		; Tastenwert korrigieren
check_wta_1	clc		; Taste liegt im Gültigkeitbereich
check_wta_e	rts


; =========================================================================
;
; Type	: Unterprg.
;	: Wähltaste eintragen
;
; Eingang	: Tastenwert im Accu
;
; Ausgang	: Taste im Input-Buffer abgelegt und im Display ausgegeben
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

input	phx		; Register retten
	ldx input_po	; Pointer auf Buffer laden
	sta input_buff,x	; Tastenwert ablegen
	inc input_po	; Pointer auf Buffer+1
	clc
	adc #48		; ASCII zur Taste addieren
	jsr putchar	; und ins Display
	plx		; Register zurück
	rts


; =========================================================================
;
; Type	: Unterprg.
;	: Wert aus Inputbuffer holen
;
; Eingang	: Pointer auf Eingabe in X-Reg.
;
; Ausgang	: Wert im Accu
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

get_input	phy		; Register retten
	phx
	txa		; Pointer auf Eingabe
	asl		; 2 Byte Eingaben
	tax
	lda input_buff,x	; Wert high laden
	ldy input_buff+1,x	; dito low
	jsr merge_val	; 1 Byte erzeugen
	plx		; Register zurück
	ply
	jmp deztohex	; dezimal in Hex wandeln


; =========================================================================
;
; Type	: Unterprg.
;	: 1 Byte erzeugen
;
; Eingang	: high Byte im Accu
;	: low Byte in Y-Reg.
;
; Ausgang	: merged Byte im Accu
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

merge_val	asl		; high Byte ins obere Nibble schieben
	asl
	asl
	asl
	sty hlp_reg	; low Byte merken
	ora hlp_reg	; low Byte ins untere Nibble
	rts



; =========================================================================
;
; Type	: Unterprg.
;	: dezimal Wert in Hex wandeln
;
; Eingang	: dezimaler Wert im Accu
;
; Ausgang	: hex Byte im Accu
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

deztohex	stz hlp_reg	; Hilfsregister

dezhex_lp	cmp #16		; Wert ok ?
	bcc dezhex_end	; ja, Hex dazu

	sec
	sbc #16		; Hex abziehen
	pha
	lda hlp_reg	; Dezimalwert laden
	clc
	adc #10		; Hexwert erzeugen
	sta hlp_reg	; und wieder ablegen
	pla
	bra dezhex_lp	; neuer Durchlauf

dezhex_end	clc
	adc hlp_reg	; errechneten Hexwert zum Rest addieren
	rts


; =========================================================================
;
; Type	: Unterprg.
;	: Hexwert nach dezimal wandeln
;
; Eingang	: Hexwert im Accu
;
; Ausgang	: Dezimalwert im Accu, maximal 99
;
; Register	: Accu
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

hextodez	stz hlp_reg	; Hilfsregister

hexdez_lp	cmp #10		; Wert ok ?
	bcc hexdez_end	; ja

	sec
	sbc #10		; Hex abziehen
	inc hlp_reg	; Dezimalwert high erhöhen
	bra hexdez_lp	; neuer Durchlauf

hexdez_end	phy		; Y-Reg. retten
	tay		; low Byte in Y-Reg.
	lda hlp_reg	; high Byte laden
	jsr merge_val	; 1 Byte erzeugen
	ply
	rts






	.ifequ	TEST
show_byte	pha
	phx
	phy
	ldx #07		; Offset auf LED-RAM
	jsr show_b
	ply
	plx
	pla
	rts

show_byte_1	pha
	phx
	phy
	ldx #YL1+7	; Offset auf LED-RAM
	jsr show_b
	ply
	plx
	pla
	rts

show_byte_2	pha
	phx
	phy
	ldx #YL2+7	; Offset auf LED-RAM
	jsr show_b
	ply
	plx
	pla
	rts


show_b	ldy #07		; 7 BIT

show_lp	stz led_ram,x
	asl
	bcc show_1

	dec led_ram,x

show_1	dex
	dey
	bpl show_lp

	rts


uhr_hlp	lda struct_tim100+VERS_TIM_O
	bne uhr_hlp_end

	inc sekunde
	lda #10
	sta struct_tim100+VERS_TIM_O
uhr_hlp_end	rts

	.endif
