;**************************************************************************
;*
;* text mode char test
;*
;**************************************************************************
	
	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	#>stoneTiles
	sta	CHBASE
	
	;color setup
	
	lda	#$0	
	sta	COLBK
	lda	#$4	
	sta	COLPF0
	lda	#$2	
	sta	COLPF1
	lda	#$6	
	sta	COLPF2
	lda	#$88				
	sta	COLPF3
				
	;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
	beq	?first
	
	;second
	
	lda	#$f
	sta	HSCROL
	
	lda	#$0
?firstBack
	sta	COLBK
	sta	WSYNC

	inc	dliCounter	
		
	;epilog
	
        pla					  
	tay
	pla					  
	tax
	pla
        rti   	;direct (no stack used)
	
?first	
	lda	#$0
	sta	HSCROL

	lda	#$33
	jmp	?firstBack
	
dliCounter	.byte	0
testCounter	.byte	0

;************************************************
;*
;* copyChars
;*
;* za0 = src map data
;* za1 = dest map data
;* zd0 = width
;* zd1 = width modulo
;* zd2 = height
;*
;************************************************

copyChars

	ldx	zd0
?xc	
	dex
	bne	?xc

	rts
	
	
	ldy	#0
	
	
;unrolled copy 5 bytes 	
	.rept	16
	lda	(za0),y		;2 bytes 5/6 cycles
	sta	(za1),y		;2 bytes 6 cyles
	iny			;1 byte  2 cycles
	.endr
	rts
	
?mul5	.rept	16
	.byte	#*5
	.endr

;	.struct	stoneConfig_s
;		srcGfx		.word
;		gfxClr		.word
;		dest		.word
;		xpos		.byte
;		ypos		.byte
;		ypos_old	.byte
;		hposOffset	.byte
;	.ends

;************************************************
;*
;* display list interrupt
;*
;************************************************


; 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 $70|DL_DLI 	;8 blank lines + DLI
	.byte $5|DL_LMS,<charData,>charData   	;Mode 5 + LMS	 
	.byte $5   
	.byte $5
	.byte $5
	.byte $5
	.byte $5   
	.byte $5
	.byte $5
	.byte $00|DL_DLI	;1 blank lines + DLI
	.byte $5|DL_HSCROLL
	.byte $5|DL_HSCROLL
	.byte $5|DL_HSCROLL
	.byte $5|DL_HSCROLL
	.byte DL_JUMPVB,<displayList,>displayList ; wait vblank, restart same display list on next frame	
	
	org	$4000
	 
	;
	
charData

	;        --------------------////////////////////

	.rept	16
	.byte	#
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16*2
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16*3
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16*4
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16*5
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16*6
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16*7
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	
	;
	
charData2	
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16*2
	.endr
	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.rept	16
	.byte	#+16*3
	.endr
	
	
	
	org	$6000

stoneTiles	ins	"gfx/stones2_4x8x2.raw"		;3072 (64 x 64*3)
