;**************************************************************************
;*
;* 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
	
	;
	
loop
	
	;Wait VBlank

?WaitVC0
        lda	VCOUNT		
        beq	?WaitVC0   	
?WaitVCnot0
        lda	VCOUNT		
        bne	?WaitVCnot0   
	
	;clear
	
	lda	#<charData
	sta	ZA0
	lda	#>charData
	sta	ZA0+1
	jsr	clearMemory40
	
.define BAR_COUNT   8 	
	
	;draw bars
	
	.rept	BAR_COUNT
	lda	#<charData
	sta	ZA0
	lda	#>charData
	sta	ZA0+1
	
	ldy	barOffsets+#
	lda	xTable,y
	tay
	jsr	drawBar
	.endr
	
	;
	
	.rept	BAR_COUNT
	lda	barOffsets+#
	clc
	adc	#1
	and	#$3f
	sta	barOffsets+#
	.endr
	
	jmp loop			;end
	
barOffsets	.rept	BAR_COUNT
		.byte	#*6
		.endr
	
xTable		.byte   12,13,14,16,17,18,19,20,21,22,22,23,24,24,24,24,24,24,24,24,24,23,22,22,21,20,19,18,17,16,14,13,12,11,9,8,7,6,5,4,3,2,2,1,0,0,0,0,0,0,0,0,0,1,2,2,3,4,5,6,7,8,10,11	
		
;************************************************
;*
;* dummy
;*
;************************************************
	
noKeyRead	
	rts
	
;************************************************
;*
;* clearMemory40
;* 
;* ZA0 = adr
;*
;************************************************	
	
clearMemory40

	ldy	#0
	lda	#0
	
	.rept	39
	sta	(ZA0),y
	iny	
	.endr
	sta	(ZA0),y

	rts

;************************************************
;*
;* drawBar (14 byte)
;* 
;* ZA0 = adr
;* y = offset 
;*
;************************************************
	
drawBar

	lda	#$01
	sta	(ZA0),y
	iny
	lda	#$23
	sta	(ZA0),y
	iny
	lda	#$45
	sta	(ZA0),y
	iny
	lda	#$89
	sta	(ZA0),y
	iny
	lda	#$ab
	sta	(ZA0),y
	iny
	lda	#$cd
	sta	(ZA0),y
	iny
	lda	#$ef
	sta	(ZA0),y
	iny
	lda	#$dc
	sta	(ZA0),y
	iny
	lda	#$ba
	sta	(ZA0),y
	iny
	lda	#$98
	sta	(ZA0),y
	iny
	lda	#$76
	sta	(ZA0),y
	iny
	lda	#$54
	sta	(ZA0),y
	iny
	lda	#$32
	sta	(ZA0),y
	iny
	lda	#$10
	sta	(ZA0),y
	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
	asl
	sta	HSCROL		;pixel scroll (2 bit offset because 4 color clks) (0,4,8,12)
	asl	
	asl
	;sta	WSYNC	
	sta	COLBK	;color to modify luminance

	;
	
	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)

	.rept 16
	.byte $df,<charData,>charData   	;Mode 1 + LMS + DLI
	.byte $5f,<charData+1,>charData   	
	.byte $5f,<charData+1,>charData   	
	.byte $5f,<charData+1,>charData 
	.byte $5f,<charData+2,>charData
	.byte $5f,<charData+2,>charData   	
	.byte $5f,<charData+2,>charData   	
	.byte $5f,<charData+1,>charData
	.byte $5f,<charData+1,>charData
	.byte $5f,<charData+1,>charData   	
	.byte $5f,<charData,>charData   	
	.byte $5f,<charData,>charData       	
	.endr

	.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

	;80 pixel (nibble is color luminance) so 40 bytes

	;a nibble is the luminance based on hue of colbk (so always same hue)
		
	.rept	40+16
	.byte	0
	.endr
			