;**************************************************************************
;*
;* hbars
;*
;**************************************************************************
	
	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
	
	;
	
	lda	#$40		;GTIA Mode 1
	sta	PRIOR
		
	;
	
	cli		;irq enable
	
	;
	
	jsr	genGfx
	
	;
	
loop
	
	;Wait VBlank

?WaitVC0
        lda	VCOUNT		
        beq	?WaitVC0   	
?WaitVCnot0
        lda	VCOUNT		
        bne	?WaitVCnot0   
	
	jmp loop			;
	
;************************************************
;*
;* genGfx
;*
;************************************************	

genGfx
	
	;pass 1
	
	lda	#<gfxData
        sta	ZA0           
        lda	#>gfxData
        sta	ZA0+1
	
	ldx	#20	;40+1
?l2
	stx	ZD3
	ldy	#0
?l1	
	;AXBY
	;A
	; B <4
	; Y
	;X  <4
	;ABXY

	lda	(ZA0),y
	tax
	and	#$f0
	sta	ZD1			;A-
	lda	nibbleSwitch,x	
	and	#$f0
	sta	ZD2			;X-
	
	iny
	
	lda	(ZA0),y
	tax
	and	#$0f			;-Y
	ora	ZD2			;-Y | X- -> XY
	sta	(ZA0),y
	lda	nibbleSwitch,x		
	;				;YB
	
	dey
	
	and	#$0f			;-B
	ora	ZD1			;A- | -B -> AB
	sta	(ZA0),y
	
	iny
	iny
	bne	?l1
	
		
	lda	ZA0+1
	clc	
	adc	#2
	sta	ZA0+1
	
	ldx	ZD3 
	dex
	bne	?l2
	
	;pass 2
	
	;##TRACE "A=%02X X=%02X >=%02X" @a x y
	
	lda	#<gfxData
        sta	ZA0           
        lda	#>gfxData
        sta	ZA0+1
	
	lda	#<(gfxData+10240/2)
        sta	ZA1           
        lda	#>(gfxData+10240/2)
        sta	ZA1+1
	
	ldx	#20	;40+1
?l2p2
	stx	ZD3
	ldy	#0
?l1p2	
	lda	(ZA0),y
	sta	ZD0
	iny
	lda	(ZA0),y
	dey	
	sta	(ZA1),y
	iny
	lda	ZD0
	sta	(ZA1),y
	
	iny
	bne	?l1p2
		
	lda	ZA0+1
	clc	
	adc	#2
	sta	ZA0+1
	
	ldx	ZD3 
	dex
	bne	?l2p2
	
        rts
	
nibbleSwitch	
	.byte $00,$10,$20,$30,$40,$50,$60,$70,$80,$90,$a0,$b0,$c0,$d0,$e0,$f0,$01,$11,$21,$31,$41,$51,$61,$71,$81,$91,$a1,$b1,$c1,$d1,$e1,$f1,$02,$12,$22,$32,$42,$52,$62,$72,$82,$92,$a2,$b2,$c2,$d2,$e2,$f2,$03,$13,$23,$33,$43,$53,$63,$73,$83,$93,$a3,$b3,$c3,$d3,$e3,$f3,$04,$14,$24,$34,$44,$54,$64,$74,$84,$94,$a4,$b4,$c4,$d4,$e4,$f4,$05,$15,$25,$35,$45,$55,$65,$75,$85,$95,$a5,$b5,$c5,$d5,$e5,$f5,$06,$16,$26,$36,$46,$56,$66,$76,$86,$96,$a6,$b6,$c6,$d6,$e6,$f6,$07,$17,$27,$37,$47,$57,$67,$77,$87,$97,$a7,$b7,$c7,$d7,$e7,$f7,$08,$18,$28,$38,$48,$58,$68,$78,$88,$98,$a8,$b8,$c8,$d8,$e8,$f8,$09,$19,$29,$39,$49,$59,$69,$79,$89,$99,$a9,$b9,$c9,$d9,$e9,$f9,$0a,$1a,$2a,$3a,$4a,$5a,$6a,$7a,$8a,$9a,$aa,$ba,$ca,$da,$ea,$fa,$0b,$1b,$2b,$3b,$4b,$5b,$6b,$7b,$8b,$9b,$ab,$bb,$cb,$db,$eb,$fb,$0c,$1c,$2c,$3c,$4c,$5c,$6c,$7c,$8c,$9c,$ac,$bc,$cc,$dc,$ec,$fc,$0d,$1d,$2d,$3d,$4d,$5d,$6d,$7d,$8d,$9d,$ad,$bd,$cd,$dd,$ed,$fd,$0e,$1e,$2e,$3e,$4e,$5e,$6e,$7e,$8e,$9e,$ae,$be,$ce,$de,$ee,$fe,$0f,$1f,$2f,$3f,$4f,$5f,$6f,$7f,$8f,$9f,$af,$bf,$cf,$df,$ef,$ff

	
;************************************************
;*
;* 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
	
	;
	
	inc	dliCounter
	
	;epilog
	
        pla					  
	tay
	pla					  
	tax
	pla
        rti   	;direct (no stack used)
	
dliCounter	.byte	0	
	
; 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)		

	;192 (16*12)

	
	.byte $cf,<charData,>charData   	;Mode 1 + LMS + DLI
	
	.rept	128-1
	.byte $f
	.endr
		
	.byte $41,<displayList,>displayList ; wait vblank, restart same display list on next frame	
	
	org	$4000
	 
	;note here its a 8x16 pixel mode
	
charData

	;80 pixel (nibble is color luminance) so 40 bytes

	;a nibble is the luminance based on hue of colbk (so always same hue)
		
;evenGfx	.rept	40*128
;	.byte	0xfe
;	.endr
	
;oddGfx	.rept	40*128
;	.byte	0
;	.endr	
	
	;10240 Byte

gfxData	
	icl	"gfx/mono16C_160x128.raw.s"
	
	
			
