; Display fancy Fireworks

; HGR plus 40x48d page1/page2 every-1-scanline pageflip mode

; Zero Page
;FRAMEBUFFER	= $00	; $00 - $0F
;YPOS		= $10
;FRAME		= $60
;WAITING	= $62
;LETTERL 	= $63
;LETTERH 	= $64
;LETTERX 	= $65
;LETTERY 	= $66
;LETTERD 	= $67
;LETTER  	= $68
;BLARGH		= $69
;HGR_COLOR	= $E4
;STATE		= $ED
;DRAW_PAGE	= $EE
;LASTKEY	= $F1
;PADDLE_STATUS	= $F2


	;==================================
	;==================================
fireworks:


setup_background:

	;===================
	; init screen
	jsr	TEXT
	jsr	HOME
	jsr	hgr
	bit	KEYRESET

;gom:
;	jmp gom


	;===================
	; init vars

	lda	#0
	sta	DRAW_PAGE
	sta	STATE
	sta	WAITING
init_letters:
	lda	#<fw_letters
	sta	LETTERL
	lda	#>fw_letters
	sta	LETTERH
	lda	#39
	sta	LETTERX
	lda	#22
	sta	LETTERY
	lda	#25
	sta	LETTERD



	;=============================
	; Load graphic page0

	lda	#$0c
	sta	BASH
	lda	#$00
	sta	BASL                    ; load image to $c00

	lda	#<bg_final_low
	sta	GBASL
	lda	#>bg_final_low
	sta	GBASH
	jsr	load_rle_gr

	lda	#4
	sta	DRAW_PAGE

	jsr	gr_copy_to_current	; copy to page1

	; GR part
	bit	PAGE1
	bit	LORES							; 4
	bit	SET_GR							; 4
	bit	FULLGR							; 4

;	jsr	wait_until_keypressed


	;=============================
	; Load graphic page1

	lda	#$0c
	sta	BASH
	lda	#$00
	sta	BASL                    ; load image to $c00

	lda	#<bg_final_high
	sta	GBASL
	lda	#>bg_final_high
	sta	GBASH
	jsr	load_rle_gr

	lda	#0
	sta	DRAW_PAGE

	jsr	gr_copy_to_current

	; GR part
	bit	PAGE0

;	jsr	wait_until_keypressed

	sei	; disable interrupt music

	;==============================
	; setup graphics for vapor lock
	;==============================

	jsr	vapor_lock				; 6

	; vapor lock returns with us at beginning of hsync in line
	; 114 (7410 cycles), so with 5070 lines to go

	; so we have 5070 + 4550 = 9620 to kill

	jsr	gr_copy_to_current		; 6+ 9292

	; now we have 322 left

	; GR part
	bit	LORES							; 4
	bit	SET_GR							; 4
	bit	FULLGR							; 4

	; 322 - 12 = 310
	; - 3 for jmp
	; 307

	; Try X=9 Y=6 cycles=307

        ldy	#6							; 2
fwloopA:ldx	#9							; 2
fwloopB:dex								; 2
        bne	fwloopB							; 2nt/3
	dey								; 2
	bne	fwloopA							; 2nt/3

        jmp     fw_display_loop						; 3
.align  $100


	;================================================
	; Display Loop
	;================================================
	; each scan line 65 cycles
	;       1 cycle each byte (40cycles) + 25 for horizontal
	;       Total of 12480 cycles to draw screen
	; Vertical blank = 4550 cycles (70 scan lines)
	; Total of 17030 cycles to get back to where was

	; We want to alternate between page1 and page2 every 65 cycles
        ;       vblank = 4550 cycles to do scrolling


	; 2 + 48*(  (4+2+25*(2+3)) + (4+2+23*(2+3)+4+5)) + 9)
	;     48*[(6+125)-1] + [(6+115+10)-1]

fw_display_loop:

	;===================================
	; HIRES PAGE0 for the top 152 lines
	;===================================

	; 152 * 65 = 9880
	;	      -12 for HIRES/PAGE0 at top
	;	       -5 for LORES+ldy+br fallthrough at bottom
	;	     -132 for move_letters
	;           -1038 for music
	;===================================
	;	     8693

	bit	HIRES						; 4
	bit	PAGE0						; 4
	bit	FULLGR						; 4
							;===========
							;	 12
	jsr	move_letters					; 6+126

	jsr	play_music					; 6+1032

	; Try X=242 Y=8 cycles=9729 R2
	; Try X=20 Y=82 cycles=8693

	ldy	#82							; 2
hgloop1:ldx	#20							; 2
hgloop2:dex								; 2
	bne	hgloop2							; 2nt/3
	dey								; 2
	bne	hgloop1							; 2nt/3

	bit	LORES						; 4


	;====================================================
	; LORES PAGE0/PAGE1 alternating for the next 24 lines
	;====================================================


	ldy	#12		; *2=24 lines			; 2

	; we set PAGE0 (4) then want to NOP (61) for a total of 65
bouter_loop:
	bit	PAGE0						; 4
	ldx	#12		; 65 cycles with PAGE0		; 2
bpage0_loop:			; delay 61+bit
	dex							; 2
	bne	bpage0_loop					; 2/3
							;=============
							; 6+(12*5)-1=65

	; we set PAGE1 (4) as well as dey (2) and bne (3) then nop (55)
	;

	bit	PAGE1						; 4
	ldx	#11		; 65 cycles with PAGE1		; 2
bpage1_loop:
	dex							; 2
	bne	bpage1_loop					; 2/3
							;=============
							; 6+(11*5)-1=60

	dey							; 2
	bne	bouter_loop					; 2/3
							;==============
							; 5 to make 65



	;=========================================================
	; LORES PAGE0/PAGE1+TEXT alternating for the next 16 lines
	;=========================================================


	ldy	#8		; *2=16 lines			; 2

	; we set PAGE0 (4) then want to NOP (61) for a total of 65
couter_loop:
	bit	FULLGR						; 4
	bit	PAGE0						; 4
	ldx	#5						; 2
cpage0_loop:
	dex							; 2
	bne	cpage0_loop					; 2/3
							;=============
							; 10+(5*5)-1=34
	bit	$1000						; 4
	bit	$1000						; 4
	bit	TEXTGR						; 4
	bit	$1000						; 4
	bit	$1000						; 4
	bit	$1000						; 4
	bit	$1000						; 4
	lda	DRAW_PAGE					; 3

	; we set PAGE1 (4) as well as dey (2) and bne (3) then nop (55)
	;

	bit	FULLGR						; 4
	bit	PAGE1						; 4
	ldx	#5						; 2
cpage1_loop:
	dex							; 2
	bne	cpage1_loop					; 2/3
							;=============
							; 10+(5*5)-1=34

	bit	$1000						; 4
	bit	$1000						; 4
	bit	TEXTGR						; 4

	bit	$1000						; 4
	lda	DRAW_PAGE					; 3
	nop							; 2
	lda	DRAW_PAGE					; 3
	nop							; 2

	dey							; 2
	bne	couter_loop					; 2/3
							;==============
							; 5 to make 65



	;======================================================
	; We have 4550 cycles in the vblank, use them wisely
	;======================================================
	;			4550
	;			  +1  fallthrough
	;			  -2  for ldy in previous
	;			 -35  call through jumptable
	;			  -7  keyboard
	;			  -3  jmp
	;			========
	;			4504
	;========================
	; each subunit should take 4504 cycles

firework_state_machine:

	; if killing time, 16+19 = 35
	; if not, 	   16+19 = 35

	ldy	STATE						; 3
	inc     FRAME                                           ; 5
        lda     FRAME                                           ; 3
	and	#$3						; 2
	beq	kill_time					; 3
							;===========
							;	 16


	; Set up jump table that runs same speed on 6502 and 65c02
								;-1
	lda	jump_table+1,y                                  ; 4
	pha                                                     ; 3
	lda	jump_table,y                                    ; 4
	pha                                                     ; 3
	rts                                                     ; 6

							;=============
							;	 19

kill_time:

	; need 16 cycles nop
	ldy	STATE	; (nop)					; 3
	ldy	STATE	; (nop)					; 3
	ldy	STATE	; (nop)					; 3
	ldy	STATE	; (nop)					; 3
	nop							; 2
	nop							; 2
	jmp	action_stars					; 3

							;=============
							;	19

fw_check_keyboard:

	lda	KEYPRESS				; 4
	bpl	fw_no_keypress				; 3
	jmp	restart
fw_no_keypress:

	jmp	fw_display_loop				; 3


	; Restart and toggle sound
restart:
	; self mofifying code, flip from bit C030 to bit 0030
	lda	sound1+2
	eor	#$C0
	sta	sound1+2

;	lda	sound2+2
;	eor	#$C0
;	sta	sound2+2

	lda	sound3+2
	eor	#$C0
	sta	sound3+2

	jmp	setup_background


jump_table:
        .word   (action_launch_firework-1)
        .word   (action_move_rocket-1)
        .word   (action_start_explosion-1)
        .word   (action_continue_explosion-1)
        .word   (action_stall_rocket-1)



.include "fw_state_machine.s"
.include "fw.s"

;.include "gr_hline.s"
;.include "../asm_routines/gr_unrle.s"
;.include "../asm_routines/keypress.s"
;.include "gr_copy.s"
;.include "random16.s"

;.include "hgr.s"
;.include "vapor_lock.s"
;.include "move_letters.s"
;.include "delay_a.s"

;background:
;.include "fw_background.inc"
