;**************************************************************************
;
; Filename : INIT.ASM
; -------------------
;
; (c) 1990/91 by Thomas Lehmann
;
;
; Jackophone V5.00
;
;
; Initialisierungs Routinen
;
;
;**************************************************************************

MODUL_START	set	*	; Größe des Moduls berechnen

; =========================================================================
;
; Funktion	: RESET, Prg. Start
;
; Eingang	: --------
;
; Ausgang	: --------
;
; Register	: 
;
; (c) by Thomas Lehmann Feb. 1990
;
; =========================================================================

init_stk	sei		; jetzt ist es vorbei mit den Unterbrechungen
	ldx #STK_INIT	; Stackstart laden, Page1 + X-Reg. = $01xx
	txs		; Stackpointer initialisieren
;	cld		; Prozessormodus einstellen (R65C02==default)


	; ==================
	; RAM initialisieren
	; ==================

	lda #<INIT_START	; low Byte des Init RAM`s
	sta ind_adr	; setzen
	lda #>INIT_START	; high Byte des Init RAM`s
	sta ind_adr+1	; setzen
	ldx #<INIT_END	; low Byte RAM Ende
	ldy #>INIT_END	; dito high
	lda #$00	; Füllwert laden
 	jsr fill_ram	; RAM füllen


; Stack Init für Size Ckeck
; lda #STK_INIT+2
; sta ind_adr
; lda #1
; sta ind_adr+1
; ldx #$ff
; ldy #$1
; lda #"-"
; jsr fill_ram


	; ===========================================
	; LED Matrix initialisieren
	; akt. MB für Wähltastatur-Abfrage einstellen
	; ===========================================

	lda #$01
	sta blink_bit	; Bitzähler für LED ein/aus
	sta led_yl	; aktueller YL

	lda #<led_ram	; Startadresse des LED-RAM setzen
	sta led_po
	lda #>led_ram
	sta led_po+1
	lda #00		; Füllwert laden
	jsr fill_ledram	; LED-RAM initialisieren

	lda #MB4	; MB4 einstellen, set=0
	sta akt_mb	; aktueller MB für Wähltastaturabfrage


	; =======================
	; VIA 6522 initialisieren
	; =======================

	ldx #$00	; Tabellen Index
via_init	ldy via_tab,x	; Via Register Adresse
	cpy #$ff	; Tabellen Ende ?
	beq via_init_e

	lda via_tab+1,x	; Register Wert
	sta Via,y	; Register setzen
	inx		; Index auf nächsten Eintrag
	inx
	bra via_init

via_init_e	stz Via_porta	; Port A clear
	stz Via_portb	; Port B clear
			

	; =======================
	;  Display initialisieren
	; =======================

	ldx dsp_tab	; Tabellen Index
dsp_init	jsr dp_busy	; Display für Befehl vorbereiten

	lda dsp_tab,x	; Display Wert
	sta Display	; Display Register setzen
	dex		; Index auf nächsten Eintrag
	bne dsp_init


	; ==========================
	; Flag für Zusatz-RAM setzen
	; ==========================

	stz ZRAM_TST	; Byte im Zusatz-RAM clr
	lda ZRAM_TST	; ist RAM installiert ?
	bne init_1	; nein

	smb ST_ZRAM,allg_stat	; Flag für vorhandenes Zusatz-RAM setzen


	; =======================
	; Flag für Eprom 2 setzen
	; =======================

init_1	ldx #0
epr2_chk	lda EPR1_PAGE1,x	; Version aus Eprom 1 holen
	cmp EPR2_PAGE1,x
	bne init_2	; Eprom 2 nicht vorhanden
	and #$80	; Text Ende ?
	beq epr2_chk	; nö, weiter testen

	smb ST_EPR2,allg_stat	; Eprom 2 vorhanden

init_2	jsr acia_init	; ACIA 6551 initialisieren
	jsr beantw_off	; Anrufbeantworter LED einschalten
	jsr put_vers	; Version anzeigen
	bbr ST_BABY,no_ini_flag,init_3
	jsr baby_led	; BabyFkt. LED`s schalten

	; ====================
	; Taskwechsler starten
	; ====================

init_3	jsr task_def	; Task`s definieren
	ldx task_sp	; Stackptr. der 1. Task holen
	txs		; Stackpointer setzten
	cli		; Interrupt freigeben
	rts		; und 1. Task ausführen




	; =====================================================
	; Tabelle mit Init Daten für die VIA 65C22
	; 1. Byte = Offset auf Register, 2. Byte = Registerwert
	; =====================================================

	; Data Direction Register Port A + B
	; ----------------------------------
via_tab	byte DDRB,%00011111	; PB0-4=Ausgang(1), PB5-7=Eingang(0)
	byte DDRA,%00001111	; PA0-3=Ausgang, PA4-7=Eingang, MB0-3, MA0-2
			; PA7 = Hörtonauswertung

	; Auxiliary Control Register
	; --------------------------
	byte ACR,%01000000	; Timer 1 free run mode

	; Pheripheral Control Register
	; ----------------------------
 	byte PCR,%11101110	; CA2 und CB2 = Ausgang, X0, X1
			; CA1 und CB1 = immer Eingang, negative Flanke

	; Timer
	; -----
	byte T1C_L,<IRQ_TIM1	; Timer 1 low
	byte T1C_H,>IRQ_TIM1	; Timer 1 high
	byte T2C_L,<IRQ_TIM2	; Timer 2 low
	byte T2C_H,>IRQ_TIM2	; Timer 2 high

	; Interrupt Enable Register
	; -------------------------
	byte IER,IFR_CA1|IFR_CB1|IFR_TIM2|IFR_TIM1|IFR_IRQ


	byte $ff,$ff		; Ende der Tabelle



	; ======================================================
	; Tabelle mit Init Daten für das Display
	; !!! die Tabelle wird von hinten nach vorne gelesen !!!
	; ======================================================

dsp_tab	byte 5		; Anzahl der Einträge

	byte DSP_CONTR
	byte DSP_EMS
	byte DSP_FS,$30,$30



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

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

