;
;	Ride the bird past the mountain
;		by Vince Weaver
;


	TREE1X	= $E1
	TREE2X	= $E2

bird_mountain:

	;===================
	; init screen

	jsr	TEXT
	jsr	HOME

	;==================
	; Init vars

	lda	#0
	sta	FRAME
	sta	FRAMEH

	lda	#28
	sta	TREE1X
	lda	#37
	sta	TREE2X

	;=========================
	; setup scrolling letters
	;=========================

	; Patch the inverse values out (as used by check_email)
	lda	#39
	sta	ml_patch_dest+1
	lda	#$80
	sta	ml_patch_or+1
	lda	#$09
	sta	ml_patch_or
	lda	#' '|$80
	sta	ml_patch_space+1

	lda	#<letters_bm
	sta	LETTERL
	lda	#>letters_bm
	sta	LETTERH
	lda	#39
	sta	LETTERX
	lda	#1
	sta	LETTERY
	lda	#16
	sta	LETTERD

	;=================
	; Set draw page

	lda	#0
	sta	DISP_PAGE
	lda	#0
	sta	DRAW_PAGE

	;==========================
	; Load the background image

	lda	#<katahdin
	sta	LZ4_SRC
	lda	#>katahdin
	sta	LZ4_SRC+1

	lda	#<(katahdin_end-8)		; skip checksum at end
	sta	LZ4_END
	lda	#>(katahdin_end-8)		; skip checksum at end
	sta	LZ4_END+1

	lda	#<$2000			; Destination is HGR page0
	sta	LZ4_DST
	lda	#>$2000
	sta	LZ4_DST+1

	jsr	lz4_decode

	sei				; disable interrupt music

	;=====================================================
	; attempt vapor lock
	;=====================================================
	jsr	vapor_lock


	;==========================
	; setup text screen

	; clear top 6 lines to space

	; takes (Y/2)*(6+435+7)+5 = ?
	lda	#$A0			; space			; 2
	ldy	#10			; 6 lines		; 2
	jsr	clear_page_loop					; 2693

	jsr	draw_moon_sky					; 6+54




	; vapor lock returns with us at beginning of hsync in line
	; 114 (7410 cycles), so with 5070 cycles to go
	; 5070+4550 = 9620
	;	     -2757 (draw text)
	;	===========
	;	      6863


	;; Try X=97 Y=14 cycles=6875
	; Try X=136 Y=10 cycles=6861 R2

	nop
	ldy	#10							; 2
bmloopA:ldx	#136							; 2
bmloopB:dex								; 2
	bne	bmloopB							; 2nt/3
	dey								; 2
	bne	bmloopA							; 2nt/3

	jmp	bm_display_loop

	;====================
	; draw moon sky
	;   54 cycles
draw_moon_sky:

;                                1               2
;                0123456789abcdef0123456789abcdef0123456
;line1:.asciiz	"   *                            .      " $400
;line2:.asciiz	"  *    .                            .  " $480
;line3:.asciiz	"  *                                    " $500
;line4:.asciiz	"   *                                   " $580
;line5:.asciiz	" .                          .    .     " $600
;line6:.asciiz	"             .                         " $680

	lda	#'.'|$80	; print star			; 2
	sta	$420						; 4
	sta	$487						; 4
	sta	$4A4						; 4
	sta	$601						; 4
	sta	$61c						; 4
	sta	$621						; 4
	sta	$68d						; 4
							;============
							;	 30
	; draw the moon
	lda	#' '		; print inv space		; 2
	sta	$403						; 4
	sta	$482						; 4
	sta	$502						; 4
	sta	$583						; 4
							;============
							;	 18
	rts							; 6

.align	$100

	;=====================================================
	;=====================================================
	; Loop forever display loop
	;=====================================================
	;=====================================================
bm_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
	;	Text mode for 6*8=48 scanlines (3120 cycles)
	;	hgr for 64 scalines (4160 cycles)
	;	gr for 80 scalines (5200 cycles)
	;	vblank = 4550 cycles

	; text
	bit	SET_TEXT						; 4

	;================
	; clear bottom green

	jsr	draw_bottom_green				; 2209+6


	;================
	; Draw Small Tree

	lda	#>small_tree				; 2
	sta	INH					; 3
	lda	#<small_tree				; 2
	sta	INL					; 3

	lda	TREE1X					; 3
	sta	XPOS					; 3
	lda	#28					; 2
	sta	YPOS					; 3

	jsr	put_sprite				; 6
							;=========
							; 27
							; + 576
							;========
							; 603


	; want		 3120
	; green		-2215
	; tree1		 -603
	; set_test	   -4
	;=============== 298 cycles

	; Try X=1 Y=27 cycles=298

	ldy	#27							; 2
bmloop2:ldx	#1							; 2
bmloop1:dex								; 2
	bne	bmloop1							; 2nt/3
	dey								; 2
	bne	bmloop2							; 2nt/3

;=============================================

	; hgr
	bit	HIRES							; 4
	bit	SET_GR							; 4


	;================
	; Draw Big Tree

	lda	#>big_tree				; 2
	sta	INH					; 3
	lda	#<big_tree				; 2
	sta	INL					; 3

	lda	TREE2X					; 3
	sta	XPOS					; 3
	lda	#30					; 2
	sta	YPOS					; 3

	jsr	put_sprite				; 6
							;=========
							; 27
							; + 1410
							;========
							; 1437

	lda	FRAME							; 3
	and	#$1f							; 2
	and	#$10							; 2

	beq	bird_walking
									; 2
	lda	#>bird_rider_stand_right				; 2
	sta	INH							; 3
	lda	#<bird_rider_stand_right				; 2
	sta	INL							; 3

	jmp	draw_bird						; 3

bird_walking:
									; 3
	lda	#>bird_rider_walk_right					; 2
	sta	INH							; 3
	lda	#<bird_rider_walk_right					; 2
	sta	INL							; 3
	; must be 15
	lda	#0							; 2
	; Must add another 15 as sprite is different
	inc	XPOS							; 5
	inc	XPOS							; 5
	inc	XPOS							; 5


draw_bird:

							; 15 + 7
	lda	#17					; 2
	sta	XPOS					; 3
	lda	#30					; 2
	sta	YPOS					; 3

	jsr	put_sprite				; 6
							;=========
							; 38

							; + 2190
							;========
							; 2228


	;=========================================
	; Update frame
	;=========================================
	; 16 addition
	;  7 inc high
	;  7 if done
	;=========
	; 30 update frame

	inc	FRAME			; frame++			; 5
	lda	FRAME							; 3
	and	#$3f			; roll over after 63		; 2
	sta	FRAME							; 3
	bne	bm_noflo						; 3

									; -1
	inc	FRAMEH							; 5
	jmp	bm_check_done						; 3
bm_noflo:
	nop								; 2
	nop								; 2
	lda	$0	; nop						; 3
bm_check_done:
	; finish after so many cycles
	lda	FRAMEH							; 3
	cmp	#23							; 2
	beq	bm_done							; 3
									; -1


	;===========================
	; Update tree1 = 22 cycles
	lda	FRAME							; 3
;	and	#$3f			; if (frame%64==0)		;
	beq	dec_tree1						; 3

	; need to do 19-5 cycles of nonsense				; -1
	inc	TREE1X							; 5
	dec	TREE1X							; 5
	lda	#0							; 2
	lda	#0							; 2

	jmp	done_tree1						; 3

dec_tree1:
	dec	TREE1X			; tree1_x--			; 5
	lda	TREE1X							; 3
	bmi	tree1_neg						; 3

									;-1
	ldx	TREE1X							; 3
	jmp	done_tree1						; 3
tree1_neg:
	ldx	#37							; 2
	stx	TREE1X							; 3
done_tree1:

	;===========================
	; Update tree2 = 24 cycles
	lda	FRAME							; 3
	and	#$f			; if (frame%16==0)		; 2
	beq	dec_tree2
									; 2
	; need to do 19-5 cycles of nonsense
	inc	TREE2X							; 5
	dec	TREE2X							; 5
	lda	#0							; 2
	lda	#0							; 2

	jmp	done_tree2						; 3

dec_tree2:
									; 3
	dec	TREE2X			; tree2_x--			; 5
	lda	TREE2X							; 3
	bmi	tree2_neg
									; 2
	ldx	TREE2X							; 3
	jmp	done_tree2						; 3
tree2_neg:
							; incoming br     3
	ldx	#37							; 2
	stx	TREE2X							; 3
done_tree2:


	; want                   4160
	; Tree2 Sprite		-1437
	; Sprite		-2228
	; Frame Update		  -30
	; Tree1 Update		  -22
	; Tree2 Update		  -24
	; hgr bits		   -8
	; ======================  411 cycles

	; Try X=1 Y=37 cycles=408 R2
	; Try X=7 Y=10 cycles=411

	ldy	#10							; 2
loop3:
	ldx	#7							; 2
loop4:
	dex								; 2
	bne	loop4							; 2nt/3

	dey								; 2
	bne	loop3							; 2nt/3

;===========================================================================


	; gr
	bit	LORES							; 4


	; Mockingboard went here***

	; lores want 	5200
	; mockingboard			-492
	; softswitch	  -4
	;===================
	;		5196 cycles

	; Try X=46 Y=22 cycles=5193 R3

	lda	$0							; 3

	ldy	#22							; 2
bmloop5:ldx	#46							; 2
bmloop6:dex								; 2
	bne	bmloop6							; 2nt/3
	dey								; 2
	bne	bmloop5							; 2nt/3

;========================================================================

	; vertical blank

	; want 4550 cycles
	; Try X=13 Y=64 cycles=4545 R2

;=========================================================================

	jsr	move_letters					; 6+126

	; Blanking time:	 4550
	; move_letters		 -132
	; play_music		-1038
	; check keypress	   -7
	; JMP at end		   -3
	;========================3370 cycles

	jsr	play_music	; 6+1032

	; Try X=175 Y=5 cycles=4406 R2
	; Try X=17 Y=37 cycles=3368 R2

	nop								; 2

	ldy	#37							; 2
bmloop7:ldx	#17							; 2
bmloop8:dex								; 2
	bne	bmloop8							; 2nt/3
	dey								; 2
	bne	bmloop7							; 2nt/3

	; Skip if keypressed

	lda	KEYPRESS						; 4
	bpl	bm_no_keypress						; 3
        jmp	bm_done							; 3
bm_no_keypress:

	jmp	bm_display_loop						; 3

bm_done:
	bit	KEYRESET	; clear keypress			; 4
	cli		; re-enable interrupt music
	rts								; 6

;===========================================================
;===========================================================
;===========================================================

;wait_until_keypressed:
;	lda	KEYPRESS			; check if keypressed
;	bpl	wait_until_keypressed		; if not, loop
;	bit	KEYRESET
;	rts


.align $100
	;====================================
	; Draw bottom green
	;====================================
	; using hlin 7127, optimized a bit but still awful
	; this one is much better
	; 2209 cycles
draw_bottom_green:

	lda	#$44							; 2
	ldx	#39							; 2
green_loop:
	sta	$728,X		; 28					; 5
	sta	$7a8,X		; 30					; 5
	sta	$450,X		; 32					; 5
	sta	$4d0,X		; 34					; 5
	sta	$550,X		; 36					; 5
	sta	$5d0,X		; 38					; 5
	sta	$650,X		; 40					; 5
	sta	$6d0,X		; 42					; 5
	sta	$750,X		; 44					; 5
	sta	$7d0,X		; 46					; 5

	dex								; 2
	bpl	green_loop						; 2nt/3

	rts								; 6

; 4 + (40*55) + 6 - 1


;.align	$100
;.include "tfv_sprites.inc"

;katahdin:
;.incbin	"KATC.BIN.lz4",11		; skip the header
;katahdin_end: