				org	$8000

				; ---------------------------- Bildschirm-Setup ----------------------------

dlist:			.by	$70,$70,$70			; 3× leere Zeile (Mode 0 = LMS)
				.by	$42,$00,$20			; LMS auf $2000 (MODE 4)
:20				.by	$02					; 20 Zeilen Mode 4
				
:3				.by	$02
				.by	$41					; JVB (Jump to DLIST)
				.word	dlist

				; --------------------------- Systemvariablen ------------------------------

				icl	'hardware.txt'			
				icl	'vbxe.txt'	
			
				; Speicher reservieren
PMB				dta "0123456789"	


vbxeind			.by	$00
cnt				.by	$00

				;----- Definition der Page0 Variablen -----
		

VBXE_BaseAddr	= $E0
VBXE_Addr1		= $E2
VBXE_Addr2		= $E4
ATARI_Addr		= $E6



text			dta	"H","a","l","l","o"," ","W","e","l","t",$FF
farbe			dta	$01,$02,$03,$04,$05,$06,$07,$08,$09,$0A
				
				;------- Definition Farbpalette -----------------

rot		 		.by  $00, $FF, $00, $FF, $00, $FF, $FF, $80, $00, $00, $80, $80, $FF, $A0, $FF, $FF				
gruen		  	.by  $00, $00, $FF, $FF, $00, $00, $40, $FF, $80, $40, $FF, $40, $FF, $00, $60, $30				
blau		  	.by  $00, $00, $00, $00, $FF, $FF, $80, $FF, $FF, $f0, $FF, $80, $FF, $00, $C0, $60	
				
			
				; --------------------------- Hauptprogramm -------------------------------
	
				.proc	main

				mwa	#dlist SDLSTL			; Standard-ANTIC-DLIST setzen
			
				jsr	checkvbxe			; VBXE erkennen und Basisadresse setzen
				jsr clearvbxe
			
				lda	#%00000000			; XDL deaktivieren (Bit 0 löschen)
				jsr	xdlstartstop
			
				jsr	copychvbxe			; Zeichensatz in VBXE kopieren
				jsr palettevbxe			; Farbpalette definieren
				jsr	setxdl				; Adresse der XDL setzen ($F000)
			
				lda	#%00000011			; XDL aktivieren + xcolor setzen (Bits 0 + 2)
				jsr	xdlstartstop

				jsr printtxt			; den Text "Hallo Welt" ins VBXE schreiben

				
				; ---------------------- ab hier steht dann die Hauptschleife ------
@	
				inc 712			; nur zur Demo
				jsr wartes		; Warteschleife
				jmp	@-				

				.endp
				.proc wartes
			
			lda RTCLOK+2
wa   
			cmp RTCLOK+2
        		beq wa 
        	
        		rts
     			.endp
				
				; -------------------------------- VBXE SUBROUTINEN ---------------------
				  
				.proc palettevbxe 	; ------------ Farbpalette erzeugen -----------------	
				ldy #VBXE_PSEL
				lda #0						; Palette 1
				sta (VBXE_BaseAddr),Y

				ldx #0
				txa
				ldy #VBXE_CSEL
				sta (VBXE_BaseAddr),Y			; Farbindex setzen

@		
				ldy #VBXE_CR
				lda rot,X				; Rot
				sta (VBXE_BaseAddr),Y

				ldy #VBXE_CG
				lda gruen,X			; Grün
				sta (VBXE_BaseAddr),Y

				ldy #VBXE_CB
				lda blau,X				; Blau = Lauf
				sta (VBXE_BaseAddr),Y		; Schreiben triggert Auto-CSEL++
		
				inx
				cpx #16			; nur 16 Farben nötig
				bne @-
			
				rts
	
				.endp
				.proc checkvbxe 	; ------------ VBXE prüfen --------------------------
	
				mva	#1 vbxeind
				mwa	#$D600 VBXE_BaseAddr

				jsr	major
				bne	@+
				jsr	minor
				beq	exitdetect
@				inc	VBXE_BaseAddr+1
				jsr	major
				bne	@+
				jsr	minor
				beq	exitdetect
@				mva	#0 vbxeind
exitdetect		rts

major			LDY	#CORE_VERSION
				LDA	(VBXE_BaseAddr),Y
				CMP	#$10
				RTS

minor			ldy	#MINOR_VERSION
				lda	(VBXE_BaseAddr),Y
				and	#$70
				cmp	#$20
				rts

				.endp
				.proc setxdl 		; ------------ XDL-Adresse setzen -------------------

				lda	#0				; Adresse $F000 → Low Byte = $00
				ldy	#XDL_ADR0
				sta	(VBXE_BaseAddr),Y

				lda	#$F0				; High Byte = $F0
				ldy	#VBXE_XDL_ADR1
				sta	(VBXE_BaseAddr),Y

				lda	#0				; Bit 16–18 = 0
				ldy	#VBXE_XDL_ADR2
				sta	(VBXE_BaseAddr),Y

				rts

				.endp
				.proc xdlstartstop	; ------------ XDL aktivieren/deaktivieren ----------
				

				; vorher lda: start #1 / stop #0
				ldy	#VIDEO_CONTROL
				sta	(VBXE_BaseAddr),Y
				rts

				.endp
				.proc memacaini		; ------------ VBXE MEMAC konfigurieren -------------

				ldy	#VBXE_MEMAC_CTRL
				lda	#0
				sta	(VBXE_BaseAddr),Y
				rts

				.endp
				.proc clearvbxe		; ------------ VBXE RAM löschen ---------------------
			
				lda #$00
				sta	cnt

loop:			lda	cnt
				ora #%10000000		; CPU-Zugruff
				ldy #VBXE_MEMAC_B_CONTROL
				sta	(VBXE_BaseAddr),Y
			
				mwa #$4000 VBXE_Addr1
				ldy #$00
				ldx	#$40
			
				lda #$00
loop2:			sta	(VBXE_Addr1),Y
				iny
				bne	loop2
				inc	VBXE_Addr1+1
				dex
				bne	loop2
			
				inc	cnt
				lda	cnt
				cmp	#$2
				bne	loop
			
				rts
				.endp		
				.proc copychvbxe	; ------------ Zeichensatz nach VBXE kopieren -------

				ldy	#VBXE_MEMAC_B_CONTROL
				lda	#%10000011			; Bank3 für CPU
				sta	(VBXE_BaseAddr),Y

				mwa	#$E000 ATARI_Addr		; ATARI ROM Zeichensatz
				mwa	#$4000 VBXE_Addr1		; VBXE Ziel: $C000
				mwa	#$4400 VBXE_Addr2		; VBXE Ziel: $C000

				ldx	#4
				ldy	#0
@
				lda	(ATARI_Addr),Y
				sta	(VBXE_Addr1),Y			; Zeichen normal
				eor	#$FF
				sta	(VBXE_Addr2),Y			; Zeichen invers
				iny
				bne @-
				inc	ATARI_Addr+1
				inc	VBXE_Addr1+1
				inc	VBXE_Addr2+1
				dex
				bne @-
				rts

				.endp
				.proc printtxt		; ------------ Text ins VBXE schreiben --------------
				ldy	#VBXE_MEMAC_B_CONTROL
				lda	#%10000000			; Bank0 für CPU
				sta	(VBXE_BaseAddr),y
			
				ldx	#0
				ldy	#0

@
				lda	text,x
				cmp	#$FF
				beq	@+

				sta	$4000,y			; Zeichen in Overlay-RAM schreiben
				iny

				lda	farbe,x
				sta $4000,y				; Farb-Attribut schreiben
				iny

				inx
				jmp	@-
@
				rts
				.endp

				run	main


 						
								;------------------------- Bank 0 Screen 1 -------------
				org PMB	
				lda #%11000000   ; CPU + Antic / Bank 0
				sta $d65d
				sta $d75d
				rts
			
			
				ini PMB
			
				org $4000

			
				; Screen Overlay #1
			
			
			
				org PMB				;------------------------- Bank 1 Screen 2 --------------
				lda #%11000001   ; CPU + Antic / Bank 0
				sta $d65d
				sta $d75d
				rts
		
				ini PMB
		
				org $4000 
				
				dta 1,1
			
			
				; Screen Overlay #2
			
				org PMB				;------------------------- Bank 2 Screen 3 --------------
				lda #%11000010   ; CPU + Antic / Bank 0
				sta $d65d
				sta $d75d
				rts
		
				ini PMB
		
				org $4000 
			
				
			
				; Screen Overlay #3
			
				org PMB				;------------------------- Bank 3 Screen 4 --------------
				lda #%11000011   
				sta $d65d
				sta $d75d
				rts
			
		
				ini PMB
		
				org $4000 
			
			
			
				; Screen Overlay #4
	
				org $7000   	; müsste dann im VBXE Speicher bei $00f000 sein !!

				; Start der XDL – VBXE Displayliste ab $F000

				dta XDLC_OVOFF | XDLC_MAPOFF | XDLC_RPTL ; erstes byte - Overscan
  				dta $0                  ; zweites byte, wird hier nicht mit Inhalt gebraucht
  				dta $17 				; Zeilen für den Overscan

				dta	%01101001			;XDLC_TMON + XDLC_GMON + XDLC_OVADR + XDLC_CHBASE
				dta	%10001011			;+ XDLC_OVATT + XDLC_END

				dta	191					; RPTL = 24 Zeilen

				dta	$00,$00,$00			; OVADR = $000000 (Bildschirmdaten)
				dta	160,$00				; Step = $00A0 = 160 Bytes pro Zeile

				dta	$18					; CHBASE = $18 → $18 * $800 = $C000

				dta	$00,$02,$00			; MAPADR = $002000 (Bildschirmdaten)
				dta	160,$00				; Step = $00A0 = 160 Bytes pro Zeile

				dta	%00010001
				dta	$FF


				org PMB				;------------------------- Bank 4  --------------
				lda #%11000100  
				sta $d65d
				sta $d75d
				rts
		
				ini PMB
			
				org $4000 
			
			
			
				.proc testbank4
				inc 708
				inc 709
			
			
				rts
				.endp