;**************************************************************************
;*
;* move stars (missiles)
;*
;**************************************************************************

	;.define	DEBUG

	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	
	
	;chbase
	
	lda	#$e0	
	sta	CHBASE
	
	;color setup
	
	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
	
	;color player/missile
	
	lda 	#$04
        sta 	COLPM0
        lda 	#$08
        sta 	COLPM1
        lda 	#$0a
        sta 	COLPM2
        lda 	#$0f
        sta 	COLPM3
	
	;hpos missile
        
	lda	#100
        sta	HPOSM0
        lda	#0
        sta	HPOSM1
        lda	#0
        sta	HPOSM2
        lda	#0
        sta	HPOSM3
	
	;width/size play 0
	
	lda	#0		;x1 missile
	sta	SIZEM
	
	;pmbase
        
        lda	#>playerMissleBlock
        sta	PMBASE
	
	;enable missile

	lda	#GRACTL_MISSILES
	sta	GRACTL
		
	;setup displays
	   	
	lda	#DMACTL_DL|DMACTL_PF_NORMAL|DMACTL_MISSILE|DMACTL_X1_PM
		
		;pm single line
		;enable display list dma 			
		;playfield normal display (40)
		;missile dma
		
			
	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
		
;************************************************
;*
;* vertical blank interrupt (immidiate, x,y regs save bei os rom)
;*
;************************************************

vbi_irq

	; reset dli counter
	
	lda	#0
	sta	dliCounter
	
	; M0
	
	.rept	4
	lda	HPosTotalM0+1+#*4
	sec
	sbc	HPosTotalM0+2+#*4
	sta	HPosTotalM0+1+#*4
	
	lda	HPosTotalM0+#*4
	sbc	HPosTotalM0+3+#*4
	sta	HPosTotalM0+#*4
	.endr

	;

	;prolog (like XITVBL)
	
	pla					  
	tay
	pla					  
	tax
	pla					  
	rti
	
;************************************************
;*
;* display list interrupt
;*
;************************************************

dli_irq

	;prolog
       
	pha
	tya	
	pha
	
	;
	
	lda	dliCounter
	tay
	lda	HPosesM0,y
	add	HPosTotalM0
	sta	WSYNC
	sta	HPOSM0
	
	lda	HPosesM1,y
	add	HPosTotalM1
	sta	HPOSM1
	
	lda	HPosesM2,y
	add	HPosTotalM2
	sta	HPOSM2
	
	lda	HPosesM3,y
	add	HPosTotalM3
	sta	HPOSM3
	
	
	inc	dliCounter
			
	;epilog
	
        pla					  
	tay	
	pla
        rti   	;direct
	
HPosTotalM0	.word	0,$0080	;value and adder (high byte is used for HPOS)
HPosTotalM1	.word	0,$0100
HPosTotalM2	.word	0,$0180
HPosTotalM3	.word	0,$0200
	
HPosesM0	.byte	143, 27, 212, 86, 59, 191, 8, 132
		.byte	244, 71, 18, 99, 203, 167, 34, 251
		.byte	60, 122, 5, 176, 219, 11, 93, 140
		.byte	200, 48, 162, 184, 76, 229, 107, 253

HPosesM1	.byte	3, 198, 117, 25, 240, 69, 154, 41
		.byte	222, 130, 6, 90, 163, 109, 58, 176
		.byte	12, 205, 88, 33, 247, 102, 196, 79
		.byte	186, 17, 135, 250, 121, 0, 66, 159
	
HPosesM2	.byte	147, 63, 209, 12, 38, 172, 95, 254
		.byte	19, 84, 228, 107, 5, 139, 66, 201
		.byte	121, 33, 179, 240, 7, 112, 153, 44
		.byte	220, 186, 30, 251, 76, 10, 199, 160

HposesM3	.byte	58, 127, 0, 214, 39, 103, 248, 85
		.byte	196, 173, 144, 17, 235, 71, 190, 93
		.byte	28, 166, 142, 109, 37, 223, 183, 13
		.byte	120, 52, 210, 8, 115, 70, 156, 249
	
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
	.rept	29	;232
	.byte 	$f0	; 8 blank lines (mode 0) + DLI
	.endr
	.byte $41,<displayList,>displayList ; wait vblank, restart same display list on next frame	
		
	org	$4800	

playerMissleBlock

	org	$4800+768
	.rept	32		;M0-M3 Missile height 8 pixel 32 times (256y)
	.byte	%00000001
	.byte	%00000000
	.byte	%00000100
	.byte	%00110000
	.byte	%00110000
	.byte	%11000000
	.byte	%11000000
	.byte	%11000000
	.endr
	
	
;+--------+--------------------+--------------------+
;| Offset | Double Line        | Single Line        |
;+--------+--------------------+--------------------+
;| +128   | unused             | unused             |
;+--------+--------------------+--------------------+
;| +256   |                    |                    |
;+--------+--------------------+--------------------+
;| +384   | M3   M2   M1   M0  |                    |
;+--------+--------------------+--------------------+
;| +512   | Player 0           |                    |
;+--------+--------------------+--------------------+
;| +640   | Player 1           |                    |
;+--------+--------------------+--------------------+
;| +768   | Player 2           | M3   M2   M1   M0  |
;+--------+--------------------|                    |
;| +896   | Player 3           |                    |
;+--------+--------------------+--------------------+
;| +1024  |                    | Player 0           |
;|        |                    |                    |
;+--------+--------------------+--------------------+
;| +1280  |                    | Player 1           |
;|        |                    |                    |
;+--------+--------------------+--------------------+
;| +1536  |                    | Player 2           |
;|        |                    |                    |
;+--------+--------------------+--------------------+
;| +1792  |                    | Player 3           |
;|        |                    |                    |
;+--------+--------------------+--------------------+
	
