;**************************************************************************
;*
;* gtia modes 1..3 tests
;*
;**************************************************************************
	
	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	#$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
				
	;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
	asl
	tax
	
	lda 	dliAddress,x
        sta 	dliJmpTarget
        lda 	dliAddress+1,x
        sta 	dliJmpTarget+1
	jmp	(dliJmpTarget)
dliJmpBack
	
	;increment

	lda	dliCounter
	clc	
	adc	#1
	and	#$7
	sta	dliCounter
	
	
	;epilog
	
        pla					  
	tay
	pla					  
	tax
	pla
        rti   	;direct (no stack used)
	
gtiaMode1	lda	#$40		;GTIA Mode 1
		sta	PRIOR

		lda	#$10		;color to modify luminance
		sta	COLBK		
		
		jmp	dliJmpBack
		
gtiaMode2	;9 regs 
		;color (hue) 0..7 = COLPM0,COLPM1,COLPM2,COLPM3,COLPF0,COLPF1,COLPF2,COLPF3
		;luminance COLBK
		
		lda	#$80
		sta	PRIOR
		
		lda	#$0
		sta	COLPM0	;is also background
		
		lda	#$d0
		sta	COLPM1
		
		lda	#$b0
		sta	COLPM2
		
		lda	#$90
		sta	COLPM3
		
		lda	#$70
		sta	COLPF0
		
		lda	#$60
		sta	COLPF1
		
		lda	#$50
		sta	COLPF2
		
		lda	#$30
		sta	COLPF3
		
		lda	#$70		;half luminance
		sta	COLBK
		
		
		jmp	dliJmpBack
		
gtiaMode3	;color colbk set the base hue

		lda	#$c0
		sta	PRIOR
		
		lda	#$04	;low		
		sta	COLBK
		
		jmp	dliJmpBack

gtiaOff		lda	#$0
		sta	PRIOR

		lda	#$a	;white
		sta	COLPF0
		lda	#$10	
		sta	COLBK
		
		jmp	dliJmpBack
	
dliCounter	.byte	0
dliJmpTarget	.word	0

dliAddress
	.word	gtiaOff		;0
	.word	gtiaMode1       ;1
	.word	gtiaOff         ;2
	.word	gtiaMode2       ;3
	.word	gtiaOff         ;4
	.word	gtiaMode3       ;5
	.word	gtiaOff         ;6
	.word	gtiaOff         ;7
	
	
	
		
; 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  		;DLI 8 blank lines (Mode OFF)		;0
	.byte $47,<charData,>charData   	;Mode 7 + LMS	
	.byte $7
	.byte $7
	
	.byte $80	;Mode 1						;1
	.rept	16
	.byte $f
	.endr
	
	.byte $80	;Mode OFF					;2
	.byte $10	;cool down
	.byte $7
	
	
	.byte $80	;Mode 2						;3
	
	.rept	16
	.byte $f
	.endr
	
	.byte $80	;Mode OFF					;4
	.byte $10	;cool down
	.byte $7
	
	.byte $80	;Mode 3						;5
	
	.rept	16
	.byte $f
	.endr
	
	.byte $80	;Mode OFF					;6
	.byte $10	;cool down
	.byte $7
	
	.byte $80	;Mode OFF					;7
	.byte $7
	.byte $7
	.byte $7
		
	.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	">------------------<"
	.byte	"                    "
	.byte	" GTIA M1 (4B LUM)   "
	
	;a nibble is the luminance based on hue of colbk (so always same hue)
	
	.rept	16	
	.byte	$01,$23,$45,$67,$89,$ab,$cd,$ef,$dc,$ba,$98,$76,$54,$32,$10
	.byte	$01,$23,$45,$67,$89,$ab,$cd,$ef,$dc,$ba,$98,$76,$54,$32,$10
	.byte	0,0,0,0,0,0,0,0,0,0	
	.endr
	
	.byte	" GTIA M2 (4B 9COLS) "
	
	;a nibble selection of 9 color (hue) on luminance of colbk (more or less mode 3)
	
	.rept	16	
	.byte	$01,$23,$45,$67,$01,$23,$45,$67,$01,$23,$45,$67,$01,$23,$45,$67
	.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	
	.endr
	
	.byte	" GTIA M3 (4B HUE)   "
	
	;a nibble set the color hue of a luminance on colbk
	;so is a base luminance and color is 0..15 will set the hue (so always same luminance)
	
	.rept	16	
	.byte	$01,$23,$45,$67,$89,$ab,$cd,$ef,$dc,$ba,$98,$76,$54,$32,$10
	.byte	$01,$23,$45,$67,$89,$ab,$cd,$ef,$dc,$ba,$98,$76,$54,$32,$10
	.byte	0,0,0,0,0,0,0,0,0,0	
	.endr
	
	.byte	" NORMAL             "
	.byte	"                    "	
	.byte	"                    "
	.byte	">------------------<"
	
