;**************************************************************************
;
; Filename : LED_UPDATE.ASM
; -------------------------
;
; (c) 1990 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Zyklisches Update der LED Matrix
;
;
;**************************************************************************


; =========================================================================
;
; Type	: Hauptprg. IRQ
;	: zyklisches Update der LED Matrix
;
; Eingang	: ------
;
; Ausgang	: Refresh einer YL-Achse und 16 X-Achsen
;
; Register	: Accu, Y, X
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

led_update	lda #$ff
	sta Port_yl	; YL0-7 Achsen auschalten

	; =============
	; Refresh XL8-F
	; =============

	ldy #$0f	; Offset auf LED-RAM laden
	ldx #$08	; Schleifenzähler
	phx

refresh	stz led_xl	; XL-Achsen clr

refresh_1	lda (led_po),y	; LED-Blinkfrequenz aus LED-RAM holen
	clc
	and blink_bit	; ist Bit gesetzt ?
	beq refresh_2	; nein, LED aus
	sec		; BIT setzen
refresh_2	rol led_xl	; und LED eingeschaltet setzen

	dey		; nächste X-Achse einstellen
	dex		; alle Achsen getestet ?
	bne refresh_1	; nein, nächste testen

	plx
	lda #00		; 2. Durchgang einstellen
	pha

	lda led_xl	; LED zustand laden
	cpx #00		; war es XL0-7 ?
	beq refresh_3	; ja, XL0-7 setzen
	sta Port_xl2	; XL8-F Achsen setzen
	bra refresh	; 2. Durchgang

refresh_3	sta Port_xl1	; XL0-7 Achsen setzen
	pla		; Stack korrigieren


	; ========================================
	; YL-Achse einschalten, LED`s ein bzw. aus
	; ========================================

	lda led_yl	; aktuelle YL-Achse laden
	eor #$ff	; 0=einschalten
	sta Port_yl	; und Port einschalten

	; ===================================================
	; Pointer auf LED-RAM für nächste YL-Achse einstellen
	; ===================================================

	lda led_po	; zeigt auf LED-RAM
	clc
	adc #16		; Offset auf nächste YL-Achse addieren
	sta led_po	; und ablegen
	bcc next_yl	; kein überlauf
	inc led_po+1	; Überlauf, high Byte +1

	; ===========================
	; nächste YL-Achse einstellen
	; ===========================

next_yl	asl led_yl	; YL=YL+1
	bcc led_upd_end	; letzte Achse war nicht YL7

	rol led_yl	; aktuelle Achse = YL1, carry=1
	lda #<led_ram	; Pointer auf LED-RAM für YL0 einstellen
	sta led_po
	lda #>led_ram
	sta led_po+1

led_upd_end
	rts
