.include "zp.inc"

;===========
; CONSTANTS
;===========

NUMSTARS	EQU	16


	;=====================
	; Starfield
	;=====================

	;================================
	; Clear screen and setup graphics
	;================================

	jsr	clear_screens_notext	 ; clear top/bottom of page 0/1
	jsr     set_gr_page0
	bit	FULLGR

	; Initialize the 2kB of multiply lookup tables
	jsr	init_multiply_tables


	;===============
	; Init Variables
	;===============
	lda	#0							; 2
	sta	DRAW_PAGE						; 3
	sta	RANDOM_POINTER						; 3
	sta	STATE

	; always multiply with low byte as zero
	sta	NUM2L							; 3

	lda	#5
	sta	SPEED

	ldy	#(NUMSTARS-1)						; 2
init_stars:
	jsr	random_star						; 6
	dey								; 2
	bpl	init_stars						; 2nt/3

	;===========================
	;===========================
	; Main Loop
	;===========================
	;===========================

starfield_loop:

	;===============
	; clear screen
	;===============

	lda	STATE

	cmp	#5
	bne	quick_skip

	lda	#0
	sta	STATE

	lda	#5
	sta	SPEED

quick_skip:

	cmp	#3
	beq	no_clear

	cmp	#1
	bne	black_back

	dec	SPEED
	lda	SPEED
	bne	not_done

	inc	STATE
not_done:
	lda	#COLOR_BOTH_LIGHTBLUE
	jmp	back_color

black_back:
	lda	#0
back_color:
	sta	clear_all_color+1

	jsr	clear_all						; 6+
									; 6047
	;===============
	; draw stars
	;===============
no_clear:

	; start at 15 and count down (rather than 0 and count up)
	ldx	#(NUMSTARS-1)						; 2

draw_stars:
	stx	XX							; 3

	;================
	; calculate color
	;================

	lda	#$ff		; want if z<16, color = 5		; 2
	sta	COLOR		; 	if 16<z<32 color = 13		; 3
				;	if 32<z<64 color = 15

	lda	star_z,X						; 4
	tay			; put star_z[i] in X for later		; 2

	cmp	#32							; 2
	bpl	done_color						; 2nt/3

	cmp	#16		; 15 -1 16 0 17 1			; 2
	bpl	second_color						; 2nt/3

	lda	#$55							; 2
	sta	COLOR							; 3

	jmp	done_color						; 3
second_color:
	lda	#$dd							; 2
	sta	COLOR							; 3

done_color:


	; calculate x value, stars[i].x/stars[i].z

	; put 1/stars[i].z in NUM1H:NUM1L and multiply

	lda	z_table,Y						; 4
	sta	NUM1L		; F					; 3

	; adjust spacez for 58+
	; all this logic to avoid having a 128 byte table of mostly zero

	lda	#0		; I					; 2
	clc								; 2
	cpy	#60		; 59 -1 60 0 61 1			; 2
	bmi	no_adjust						; 2nt/3
	adc	#1		; 60, 61 = 1				; 2
	cpy	#62		; 61 -1 62 0 63 1			; 2
	bmi	no_adjust						; 2nt/3
	adc	#1		; 62 = 2				; 2
	cpy	#63		; 62 = -1 63 = 0 64 = not possible	; 2
	bne	no_adjust						; 2nt/3
	adc	#2		; 63 = 4				; 2
no_adjust:
	sta	NUM1H		; store int part of spacez		; 3

	; load stars[i].x into NUM2H:NUM2L
	; NUM2L is always zero
	ldy	XX							; 3

	lda	star_x,Y						; 4
	sta	NUM2H							; 3


	sec			; don't reuse old values		; 2
	jsr	multiply						; 6+?

	; integer result in X
	txa								; 2
	clc								; 2
	adc	#20		; center on screen			; 2

	sta	XPOS		; save for later			; 3

	; calculate y value, stars[i].y/stars[i].z

	; 1/stars[i].z is still in NUM1H:NUM1L

	ldy	XX		; reload index				; 3

	lda	star_y,Y	; load integer part of star_		; 4
	sta	NUM2H							; 3
	clc			; reuse old values			; 2
	jsr	multiply						; 6+

	; integer result in X
	txa								; 2
	clc								; 2
	adc	#20		; center the value			; 2

	tay			; Y is YPOS				; 2
	sty	YPOS		; put Y value in Y to plot		; 3


	;============================
	; Check Limits
	;============================

;	ldy	YPOS
	bmi	new_star						; 2nt/3
	cpy	#48							; 2
	bpl	new_star		; if < 0 or > 40 then done	; 2nt/3

	lda	XPOS							; 3
	bmi	new_star						; 2nt/3
	cmp	#40							; 2
	bpl	new_star		; if < 0 or > 40 then done	; 2nt/3

	; FIXME: sort out all of these jumps to be more efficient
	bmi	plot_star						; 2

new_star:
	ldy	XX							; 3
	jsr	random_star						; 6

	jmp	plot_star_continue					; 3

plot_star:
	jsr	plot							; 6

plot_star_continue:

	;==============================
	ldx	XX							; 3

	dex								; 2
	bmi	move_stars						; 2nt/3
	bpl	draw_stars						; 2nt/3
;	jmp	draw_stars


	;=============================
	; Move stars
move_stars:
	ldy	#(NUMSTARS-1)						; 2
move_stars_loop:
				; increment z
	clc			; if z >= 64 new star			; 2
	lda	star_z,Y						; 4
	adc	#1							; 2
	sta	star_z,Y						; 4
	and	#64							; 2
	beq	move_loop_skip						; 2nt/3

	jsr	random_star	; new random star			; 6

move_loop_skip:
	dey								; 2
	bpl	move_stars_loop						; 2nt/3




skipskip:


	lda	#>ship_forward
	sta	INH
	lda	#<ship_forward
	sta	INL

	lda	#15
	sta	XPOS
	lda	#34
	sta	YPOS
	jsr	put_sprite


	;==================
	; flip pages
	;==================

	jsr	page_flip						; 6



starfield_keyboard:

	lda	STATE			; if 0, wait
	bne	check_keyboard

first_press:
	jsr	get_key		; get keypress				; 6
	lda	LASTKEY

	beq	first_press

	inc	STATE

	jmp	done_keyboard

check_keyboard:

	jsr	get_key		; get keypress				; 6
	lda	LASTKEY
	beq	done_keyboard

	bit	SPEAKER
	inc	STATE

done_keyboard:

	;==================
	; loop forever
	;==================

	jmp	starfield_loop						; 3


; matches scroll_row1 - row3
star_x	EQU	$8A00
star_y	EQU	$8B00
star_z	EQU	$8C00

	;===================
	; star number in Y
	; FIXME: increment at end?
	; X trashed
random_star:
	; random x location
	ldx	RANDOM_POINTER						; 3

	lda	random_table,X						; 4
	sta	star_x,Y						; 5
	inx								; 2

	; random y location
	lda	random_table,X						; 4
	sta	star_y,Y						; 5
	inx								; 2

	; random z location
	lda	random_table,X						; 4
	and	#$3f							; 2
	sta	star_z,Y						; 5
	inx								; 2

	stx	RANDOM_POINTER						; 3

	rts								; 6

;===============================================
; External modules
;===============================================

.include "../asm_routines/pageflip.s"
.include "../asm_routines/gr_setpage.s"
.include "../asm_routines/keypress.s"
.include "../asm_routines/gr_putsprite.s"
.include "../asm_routines/gr_offsets.s"
.include "../asm_routines/gr_fast_clear.s"
.include "../asm_routines/gr_plot.s"
.include "../asm_routines/multiply_fast.s"


.include "sprites.inc"

;======================
; some "random" numbers
;======================
random_table:
	.byte	103,198,105,115, 81,255, 74,236, 41,205,186,171,242,251,227, 70
	.byte	124,194, 84,248, 27,232,231,141,118, 90, 46 ,99, 51,159,201,154
	.byte	102, 50, 13,183, 49, 88,163, 90, 37, 93,  5, 23, 88,233, 94,212
	.byte	171,178,205,198,155,180, 84, 17, 14,130,116, 65, 33, 61,220,135
	.byte	112,233, 62,161, 65,225,252,103, 62,  1,126,151,234,220,107,150
	.byte	143, 56, 92, 42,236,176, 59,251, 50,175, 60, 84,236, 24,219, 92
	.byte     2, 26,254, 67,251,250,170, 58,251, 41,209,230,  5, 60,124,148
	.byte	117,216,190, 97,137,249, 92,187,168,153, 15,149,177,235,241,179
	.byte	  5,239,247,  0,233,161, 58,229,202, 11,203,208, 72, 71,100,189
	.byte	 31, 35, 30,168, 28,123,100,197, 20,115, 90,197, 94, 75,121, 99
	.byte	 59,112,100, 36, 17,158,  9,220,170,212,172,242, 27, 16,175, 59
	.byte	 51,205,227, 80, 72, 71, 21, 92,187,111, 34, 25,186,155,125,245
	.byte	 11,225, 26, 28,127, 35,248, 41,248,164, 27, 19,181,202, 78,232
	.byte	152, 50, 56,224,121, 77, 61, 52,188, 95, 78,119,250,203,108,  5
	.byte	172,134, 33, 43,170, 26, 85,162,190,112,181,115, 59,  4, 92,211
	.byte	 54,148,179,175,226,240,228,158, 79, 50, 21, 73,253,130, 78,169

z_table:
	; 1/16.0 - 1/12.25
	.byte	$10,$10,$10,$10,$11,$11,$11,$11,$12,$12,$12,$13,$13,$14,$14,$14
	; 1/12.0 - 1/8.25
	.byte	$15,$15,$16,$16,$17,$17,$18,$18,$19,$1A,$1A,$1B,$1C,$1D,$1E,$1F
	; 1/8.0 - 1/4.25
	.byte	$20,$21,$22,$23,$24,$25,$27,$28,$2A,$2C,$2E,$30,$33,$35,$38,$3C
	; 1/4.0 - 1/0.25
	.byte	$40,$44,$49,$4E,$55,$5D,$66,$71,$80,$92,$AA,$CC,$00,$55,$00,$00

