;**************************************************************************
;
; Filename : IRQ.ASM
; -------------------
;
; (c) 1990 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Interrupt Routine
;
;
;**************************************************************************


; =========================================================================
;
; Type	: IRQ
;	: Interruptroutine
;
; Eingang	: bei Timer oder CA1 Interrupt
;
; Ausgang	: Interruptprogramme abgelaufen
;
; Register	: ------
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

irq	pha		; Register retten
	phx
	phy
	lda Via+$0d	; IRQ Flag Register
	pha		; IRQ Auslöser merken
	and #$02	; CA1 Interrupt ?
	beq irq_1	; nein, Timerinterrupt testen
	pla		; Stack korrigieren
	lda Via+1	; clear CA1 Interrupt
	bra irq_end	; IRQ Ende

irq_1	pla		; IRQ Auslöser holen
	and #$40	; Timer1 Interrupt ?
	beq time2_irq	; nein, Timer2 testen


	; ================
	; Timer1 IRQ 800uS
	; ================

	lda #<IRQ_TIM1	; Timer1 Reload
	sta Via+4
	lda #>IRQ_TIM1	; 800uS
	sta Via+5

	jsr led_update	; Refresh der LED-Matrix

	; ========================
	; Uhr Port, 100Hz abfragen
	; ========================

	lda #UHR	; Port für 100Hz Uhr Impuls, (10mS)
	bit Via_portb	; positive Flanke ?
	bne t1_irq_1	; ja, kein Impuls

	lda stat_uhrp	; war negative Flanke erkannt ?
	bne t1_irq_2	; ja

	inc stat_uhrp	; Flanke ist erkannt
	dec uhr_tim	; Uhrtimer nachführen
	bne t1_irq_2	; Sekunde noch nicht erreicht

	inc sekunde	; Sekunde +1
	lda #UHR_TIM	; Timerwert laden
	sta uhr_tim	; Timer aufziehen
	bra t1_irq_2

t1_irq_1	stz stat_uhrp	; positive Flanke eintragen

t1_irq_2

	bra irq_end





	; ===============
	; Timer2 IRQ 10mS
	; ===============

time2_irq	lda #<IRQ_TIM2	; Timer2 Reload
	sta Via+8
	lda #>IRQ_TIM2	; 10mS
	sta Via+9


	; ======================
	; 100mS Timer nachführen
	; ======================
	inc tim_100ms_t
	lda tim_100ms_t	; Timerwert laden
	cmp #10		; Anzahl der 10mS IRQ`s bis 100mS erreicht
	bcc t2_irq	; nicht abgelaufen

	stz tim_100ms_t	; Timer neu starten

	; ======================================
	; 100mS Timer in der Struktur nachführen
	; ======================================

	ldx #ANZ_TIM100-1	; Anzahl der 100mS Timer laden
t2_irq100_0	lda struct_tim100,x	; Timer abgelaufen ?
	beq t2_irq100_1	; ja, nächsten Timer testen
	dec struct_tim100,x	; Timer nachführen
t2_irq100_1	dex		; nächsten Timer einstellen
	bpl t2_irq100_0	; und Timer testen


	; =====================================
	; 10mS Timer in der Struktur nachführen
	; =====================================

t2_irq	ldx #ANZ_TIM-1	; Anzahl der Timer laden
t2_irq_0	lda struct_tim,x	; Timer abgelaufen ?
	beq t2_irq_1	; ja, nächsten Timer testen
	dec struct_tim,x	; Timer nachführen
t2_irq_1	dex		; nächsten Timer einstellen
	bpl t2_irq_0	; und Timer testen


	jsr wahl	; Ziffern wählen


	; ==================================
	; Blink BIT für LED`s weiterschalten
	; ==================================

	lda struct_tim+BLK_TIM_O	; Blinkfrequenz Timer für LED`s
	bne irq_end	; noch nicht abgelaufen

	lda #BLINK_TIM	; Timerwert laden
	sta struct_tim+BLK_TIM_O	; und neu starten
	asl blink_bit	; nächstes BIT einstellen
	bcc irq_end	; noch nicht alle durchlaufen, Ende
	rol blink_bit	; 1.Bit setzen, Carry=1

irq_end	cli		; Interrupt freigeben
	ply		; Register zurück
	plx
	pla
	rti		; Interrupt Routine verlassen

