;**************************************************************************
;*
;* show all text modes
;*
;**************************************************************************
	
	org $2000			   ;prg start
	
	icl "custom.i"

START:

	
	;

	sei				  ;disable irqs
	lda	#$00
	sta	NMIEN			  ;NMIEN all off 
	sta	DMACTL			  ;DMACTL all off

	;set display list (use shadow regs)
	
	lda	#<displayList
	sta	DLISTL	
	lda	#>displayList
	sta	DLISTH
	
	;set display list interrupt
	  
	lda	#<dli_irq
        sta	VDSLSTL           
        lda	#>dli_irq
        sta	VDSLSTH    
	
	;vertical blank interrupt 
	
	lda 	#>vbi_irq
	sta	VVBLKIH	
	lda 	#<vbi_irq
	sta	VVBLKIL	
	
	;os key remove
	
	lda	#<noKeyRead
        sta	VSERINL        
        lda	#>noKeyRead
        sta	VSERINH        
	
	;chbase
	
	lda	#>font8x8_4c	
	lda	#$E0
	sta	CHBASE
	
	;color setup
	
	lda	#$0	
	sta	COLBK
	lda	#$a	
	sta	COLPF0
	lda	#$e	
	sta	COLPF1
	lda	#$8	
	sta	COLPF2
	lda	#$88				
	sta	COLPF3
		
	;convertText
	
	jsr	convertText
		
	;disable player/missile dma
	
	lda	#$00
	sta	GRACTL
	
	;setup displays
	   
	lda	#DMACTL_DL|DMACTL_PF_NORMAL		
		
		;enable display list dma 			
		;playfield normal display (40)
			
	sta	DMACTL	;DMACTL
	
	lda	#0
	sta	HSCROL
	
	;enable dli
	
	lda	#NMIEN_VBI|NMIEN_DLI
	sta	NMIEN	;VBI + DLI enbable
	
	;
	
	cli		;irq enable

loop
	
	;Wait VBlank

?WaitVC0
        lda	VCOUNT		
        beq	?WaitVC0   	
?WaitVCnot0
        lda	VCOUNT		
        bne	?WaitVCnot0   
	
	
	jmp loop			;end
	
	
;************************************************
;*
;* dummy
;*
;************************************************
	
noKeyRead	
	rts
	
;************************************************
;*
;* vertical blank interrupt (immidiate, x,y regs save bei os rom)
;*
;************************************************

vbi_irq

	;
	
	lda	#0
	sta	dliCounter
	
	;prolog (like XITVBL)
	
	pla					  
	tay
	pla					  
	tax
	pla					  
	rti
			
;************************************************
;*
;* display list interrupt
;*
;************************************************

dli_irq

	;prolog

        pha 
	txa	
	pha
	tya	
	pha
	
	lda	dliCounter
	
	cmp	#0
	beq	standardFont
	;4 colors
	lda	#$0	
	sta	COLBK
	lda	#$a	
	sta	COLPF0
	lda	#$e	
	sta	COLPF1
	lda	#$8	
	sta	COLPF2
	lda	#$88				
	sta	COLPF3
	lda	#>font8x8_4c
	sta	CHBASE
	
standardFontRet	
	
	sta	WSYNC

	inc	dliCounter
	
	;epilog
	
        pla					  
	tay
	pla					  
	tax
	pla
        rti   	;direct (no stack used)
	
standardFont

	lda	#$0	;black
	sta	COLBK
	lda	#$34	;red		
	sta	COLPF0
	lda	#$b6	;green	
	sta	COLPF1
	lda	#$1a	;yellow		
	sta	COLPF2
	lda	#$70	;blue		
	sta	COLPF3
	lda	#$E0
	sta	CHBASE
	jmp	standardFontRet
	
	
dliCounter	.byte	0	

convertText	

	ldx	#0
	ldy	#0
?loop
	lda	textMode6,x
	cmp	#$ff
	beq	?loopEnd
	asl	
	sta	m45,y
	clc
	adc	#1
	sta	m45+1,y
	iny
	iny
	inx
	jmp	?loop
	
?loopEnd	

	rts

		
; display list

	;7	6	5	4	3	2	1	0
	;DLI	LMS	VSCROLL	HSCOLL	Mode
	;
	;Mode 0 Blank lines 7..4 is count+1 of blank lines
	;Mode 1 JMP (use with LMS to set destination)
	;Mode $2-$f is ANTIC mode

	.align $400
	
displayList	 
	.byte 0			;Mode 0
	.byte $70		;8 blank lines	
	.byte $70		;8 blank lines
	.byte $c0  		;8 DLI  blank lines
	.byte $42,<charData,>charData  ;Mode 2 + LMS
	.byte $2                       ;Mode 2
	.byte $43,<m2,>m2  	       ;Mode 3 + LMS
	.byte $3		       ;Mode 3
	.byte $46,<m6,>m6   ;Mode 6 + LMS
	.byte $6
	.byte $6
	.byte $47,<m7,>m7   ;Mode 7 + LMS
	.byte $7   
	.byte $7   
	.byte $90	     ;1 blank line + dli
	.byte $44,<m45,>m45  ;Mode 4 + LMS
	.byte $4
	.byte $4
	.byte $5  ;Mode 5
	.byte $5	
	.byte $5
	.byte $41,<displayList,>displayList ; wait vblank, restart same display list on next frame	
	
	org	$4000
	 
	;note here its a 8x16 pixel mode
	
charData

	;20 chars per screen width (20*8 = 160Pixel)
	;12 char height (12*16 = 192 (/2))

	;        --------------------////////////////////
	.byte	"Mode 2 40x24 1c ",129," invertable by map     " 
	.byte	" -> 320x192 pixel tile size 8x8               " 
m2	.byte	"MODE 3 40x19 1c col invert per char     " 
	.byte	" -> 320x190 pixel tile size 8x10!       "

m6	.byte	"MODE 6 20x24 1c mux4"	;color mux by map
	.byte	" -> 160x192 pixel   "
	.byte	" -> tile size 8x8   "
	.byte	"                    "
m7	.byte	"MODE 7 20x12 1c mux4"	;color mux by map
	.byte	" -> 160x96 pixel    "
	.byte	" -> tile size 8x16  "
	.byte	"    y doubled       "
	.byte	"                    "
	.byte	"                    "
m45	.byte	"                    "
	.byte	"                    "	
	.byte	"                    "		
m5	.byte	"                    "
	.byte	"                    "	
	.byte	"                    "	
	
textMode6	.byte	"MODE 4 20X24 5C     "
		.byte	" -> 160X192 PIXEL   " ;4 two color pixel per line (4rd color selectable by map MSB)
		.byte	" -> TILE SIZE 4X8   "
		.byte	"MODE 5 20X12 5C     "
		.byte	" -> 160X96  PIXEL   " ;4 two color pixel per line (4rd color selectable by map MSB)
		.byte	" -> TILE SIZE 4X16  "
		.byte	$ff	
	
	org	$4400
	
font8x8_4c

	.byte	$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	.byte	$03,$01,$01,$01,$00,$02,$02,$00,$C0,$40,$40,$80,$00,$80,$80,$00
	.byte	$3C,$14,$14,$00,$00,$00,$00,$00,$34,$18,$28,$00,$00,$00,$00,$00
	.byte	$3C,$D5,$14,$14,$14,$DA,$28,$00,$F0,$58,$60,$A0,$A0,$A8,$A0,$00
	.byte	$03,$15,$D1,$15,$02,$DA,$02,$00,$00,$58,$00,$A0,$28,$A0,$00,$00
	.byte	$00,$00,$00,$30,$0C,$30,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	.byte	$00,$00,$00,$0C,$30,$0C,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	.byte	$03,$01,$01,$00,$00,$00,$00,$00,$C0,$40,$40,$00,$00,$00,$00,$00
	.byte	$03,$05,$14,$14,$14,$0A,$02,$00,$C0,$00,$00,$00,$00,$00,$80,$00
	.byte	$0F,$01,$00,$00,$00,$02,$0A,$00,$00,$40,$60,$A0,$A0,$80,$00,$00
	.byte	$00,$11,$05,$15,$06,$12,$00,$00,$00,$10,$40,$A0,$80,$20,$00,$00
	.byte	$00,$01,$01,$15,$16,$02,$02,$00,$00,$40,$40,$A8,$A8,$80,$80,$00
	.byte	$00,$00,$00,$00,$00,$02,$02,$0A,$00,$00,$00,$00,$00,$80,$80,$00
	.byte	$00,$00,$00,$15,$00,$00,$00,$00,$00,$00,$00,$A8,$00,$00,$00,$00
	.byte	$00,$00,$00,$00,$00,$02,$02,$00,$00,$00,$00,$00,$00,$80,$80,$00
	.byte	$00,$00,$00,$00,$02,$0A,$28,$00,$00,$0A,$28,$A0,$80,$00,$00,$00
	.byte	$3F,$D5,$D0,$D1,$D4,$DA,$2A,$00,$F0,$58,$68,$28,$28,$A8,$A0,$00
	.byte	$0F,$15,$05,$05,$06,$DA,$6A,$00,$00,$00,$00,$00,$00,$A0,$A0,$00
	.byte	$FF,$D5,$00,$05,$D6,$DA,$6A,$00,$F0,$58,$68,$A0,$00,$A8,$A8,$00
	.byte	$FF,$D5,$00,$15,$00,$DA,$6A,$00,$F0,$58,$28,$A0,$28,$A8,$A0,$00
	.byte	$F0,$D0,$D0,$D0,$D6,$DA,$00,$00,$00,$00,$60,$A0,$A8,$A8,$A0,$00
	.byte	$FF,$D5,$D0,$D5,$00,$DA,$6A,$00,$F4,$58,$00,$A0,$A8,$A8,$A0,$00
	.byte	$3F,$D5,$D0,$D5,$D0,$DA,$2A,$00,$F4,$58,$00,$A0,$28,$A8,$A0,$00
	.byte	$FF,$D5,$00,$01,$06,$0A,$0A,$00,$F4,$58,$68,$A0,$80,$80,$80,$00
	.byte	$3F,$D5,$D0,$15,$D0,$DA,$2A,$00,$F0,$58,$28,$A0,$28,$A8,$A0,$00
	.byte	$3F,$D5,$D0,$D5,$00,$DA,$2A,$00,$F0,$58,$28,$A8,$28,$A8,$A0,$00
	.byte	$00,$05,$05,$00,$06,$0A,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	.byte	$00,$01,$01,$00,$02,$02,$0A,$00,$00,$40,$40,$00,$80,$80,$00,$00
	.byte	$00,$01,$05,$14,$06,$02,$00,$00,$F4,$40,$00,$00,$00,$80,$A8,$00
	.byte	$00,$00,$15,$00,$16,$00,$00,$00,$00,$00,$68,$00,$A8,$00,$00,$00
	.byte	$3F,$01,$00,$00,$00,$02,$2A,$00,$00,$40,$60,$28,$A0,$80,$00,$00
	.byte	$0F,$14,$00,$00,$02,$00,$02,$00,$F0,$18,$28,$A0,$80,$00,$80,$00
	.byte	$0F,$14,$14,$14,$14,$18,$0A,$00,$F0,$18,$68,$A8,$00,$08,$A0,$00
	.byte	$00,$05,$05,$14,$16,$D0,$60,$00,$F0,$58,$28,$28,$A8,$28,$28,$00
	.byte	$FF,$D5,$00,$D5,$D0,$DA,$6A,$00,$F0,$58,$28,$A0,$28,$A8,$A0,$00
	.byte	$3F,$D5,$D0,$D0,$D0,$DA,$2A,$00,$F0,$58,$28,$00,$28,$A8,$A0,$00
	.byte	$FF,$D5,$00,$D0,$D0,$DA,$6A,$00,$F0,$58,$28,$28,$28,$A8,$A0,$00
	.byte	$3F,$D5,$D0,$D5,$D0,$DA,$2A,$00,$F4,$58,$00,$A8,$00,$A8,$A8,$00
	.byte	$FF,$D5,$00,$D5,$D0,$D0,$60,$00,$F4,$58,$00,$A0,$00,$00,$00,$00
	.byte	$3F,$D5,$D0,$D0,$D0,$DA,$2A,$00,$F0,$58,$00,$A8,$28,$A8,$A0,$00
	.byte	$F0,$D0,$D0,$D5,$D0,$D0,$60,$00,$34,$18,$28,$28,$28,$28,$28,$00
	.byte	$3F,$15,$01,$01,$02,$1A,$2A,$00,$F4,$58,$40,$80,$80,$A8,$A8,$00
	.byte	$3F,$15,$00,$D0,$D0,$DA,$2A,$00,$F4,$58,$60,$A0,$A0,$A0,$80,$00
	.byte	$F0,$D1,$D5,$D5,$D2,$D0,$60,$00,$F0,$40,$00,$00,$80,$A0,$28,$00
	.byte	$F0,$D0,$D0,$D0,$D0,$DA,$2A,$00,$00,$00,$00,$00,$00,$A8,$A8,$00
	.byte	$F0,$D4,$D5,$D5,$D2,$D0,$60,$00,$34,$58,$68,$A8,$28,$28,$28,$00
	.byte	$F0,$D4,$D5,$D5,$D2,$D0,$60,$00,$F0,$50,$60,$A0,$A0,$A0,$A0,$00
	.byte	$3F,$D5,$D0,$D0,$D0,$DA,$2A,$00,$F0,$58,$28,$28,$28,$A8,$A0,$00
	.byte	$FF,$D5,$00,$D5,$D0,$D0,$60,$00,$F0,$58,$28,$A0,$00,$00,$00,$00
	.byte	$3F,$D5,$D0,$D0,$D0,$DA,$2A,$00,$F0,$58,$28,$28,$28,$A8,$8A,$00
	.byte	$FF,$D5,$00,$D5,$D0,$D0,$60,$00,$C0,$58,$28,$A0,$28,$28,$28,$00
	.byte	$3F,$D5,$D0,$15,$00,$DA,$6A,$00,$F4,$58,$00,$A0,$28,$A8,$A0,$00
	.byte	$FF,$D5,$00,$00,$00,$00,$00,$00,$C0,$50,$60,$A0,$A0,$A0,$A0,$00
	.byte	$F0,$D0,$D0,$D0,$D0,$DA,$2A,$00,$34,$18,$28,$28,$28,$A8,$A0,$00
	.byte	$F0,$D0,$D0,$D0,$D4,$1A,$0A,$00,$34,$18,$28,$28,$A8,$A0,$80,$00
	.byte	$F0,$D0,$D1,$D5,$D6,$D8,$60,$00,$34,$18,$28,$A8,$A8,$A8,$28,$00
	.byte	$F0,$D4,$15,$05,$16,$D8,$60,$00,$34,$58,$60,$80,$A0,$A8,$28,$00
	.byte	$3C,$14,$14,$05,$02,$02,$02,$00,$34,$18,$28,$A0,$80,$80,$80,$00
	.byte	$FF,$D5,$01,$05,$16,$DA,$6A,$00,$F4,$58,$60,$80,$00,$A8,$A8,$00
	.byte	$AA,$AA,$AA,$55,$55,$55,$FF,$00,$A8,$A8,$A8,$54,$54,$54,$FC,$00
	.byte	$D5,$D5,$D5,$D5,$D5,$D5,$D5,$00,$A8,$A8,$A8,$A8,$A8,$A8,$A8,$00
	.byte	$FF,$55,$55,$55,$AA,$AA,$AA,$00,$FC,$54,$54,$54,$A8,$A8,$A8,$00
	.byte	$A9,$A9,$A9,$A9,$A9,$A9,$A9,$00,$5C,$5C,$5C,$5C,$5C,$5C,$5C,$00
	.byte	$D5,$55,$55,$55,$AA,$AA,$AA,$00,$A8,$A8,$A8,$A8,$A8,$A8,$A8,$00


