; more plasma

; by Vince `deater` Weaver (vince@deater.net) / dSr
; with some help from qkumba

; zero page
GBASL	= $26
GBASH	= $27
MASK	= $2E
COLOR	= $30
;CTEMP	= $68
YY	= $69

FRAME	= $FC
SUM	= $FD
SAVEX	= $FE
SAVEY	= $FF

; soft-switches
FULLGR	= $C052
PAGE1	= $C054

; ROM routines
PLOT    = $F800                 ;; PLOT AT Y,A
PLOT1	= $F80E		;; PLOT at (GBASL),Y (need MASK to be $0f or $f0)
GBASCALC= $F847		;; take Y-coord/2 in A, put address in GBASL/H ( a trashed, C clear)
SETCOL  = $F864		;; COLOR=A*17
SETGR	= $FB40



	;================================
	; Clear screen and setup graphics
	;================================
plasma:

	jsr	SETGR		; set lo-res 40x40 mode
	bit	FULLGR		; make it 40x48



draw_plasma:
	ldx	#39
create_yloop:
	ldy	#47
create_xloop:
	lda	#128
	sta	SUM
	txa
	adc	FRAME
	jsr	calcsine

	tya
;	adc	FRAME
	jsr	calcsine_div_2

	clc
	stx	SAVEX
	tya
	adc	SAVEX
	jsr	calcsine

	stx	SAVEX
	sty	SAVEY

;	clc
	adc	FRAME

	and	#$7
	tax
	lda	colorlookup,X

	jsr	SETCOL


	ldy	SAVEX
	lda	SAVEY

	jsr	PLOT		; PLOT Y,A

	ldx	SAVEX
	ldy	SAVEY


	dey
	bpl	create_xloop

	dex
	bpl	create_yloop

	; X and Y both $FF

create_lookup_done:

forever_loop:
	inc	FRAME

	jmp	draw_plasma
;	jmp	forever_loop

.if 0
cycle_colors:

	; cycle colors
	; instead of advancing entire frame, do slightly slower route
	; instead now and just incrememnting the frame and doing the
	; adjustment at plot time.

	; increment frame

	inc	frame_smc+1

	; set/flip pages
	; we want to flip pages and then draw to the offscreen one

flip_pages:

;	ldy	#0

;	iny			; y is $FF, make it 0

	lda	draw_page_smc+1	; DRAW_PAGE
	bne	done_page
	dey
done_page:
;	ldx	PAGE1,Y		; set display page to PAGE1 or PAGE2

	ldx	$BF56,Y		; PAGE1 - $FF

	eor	#$4		; flip draw page between $400/$800
	sta	draw_page_smc+1 ; DRAW_PAGE


	; plot current frame
	; scan whole 40x48 screen and plot each point based on
	; lookup table colors
plot_frame:

	ldx	#47		; YY=47 (count backwards)
plot_yloop:

	txa			; get YY into A
	pha			; save X for later
	lsr			; call actually wants Ycoord/2

	php			; save C flag for mask handling

	; ugh can't use PLOT trick as it always will draw something
	; to PAGE1 even if we don't want to

	jsr	GBASCALC	; point GBASL/H to address in (A is ycoord/2)
				; after, A is GBASL, C is clear

	lda	GBASH		; adjust to be PAGE1/PAGE2 ($400 or $800)
draw_page_smc:
	adc	#0
	sta	GBASH

	; increment YY in top nibble of lookup for (yy<<16)+xx
	; clc	from above, C always 0
	lda	plot_lookup_smc+1
	adc	#$10		; no need to mask as it will oflo and be ignored
	sta	plot_lookup_smc+1

	;==========

	ldy	#39		; XX = 39 (countdown)

	; sets MASK by calling into middle of PLOT routine
	; by Y being 39 draw in a spot that gets over-written

	plp
	jsr	$f806

plot_xloop:

	tya			; get XX & 0x0f
	and	#$f
	tax

plot_lookup_smc:
	lda	lookup,X	; load lookup, (YY*16)+XX

	clc
frame_smc:
	adc	#$00		; add in frame

	and	#$f
	lsr			; we actually only have 8 colors

	tax

	lda	colorlookup,X	; lookup color


	sta	COLOR		; each nibble should be same

	jsr	PLOT1		; plot at GBASL,Y (x co-ord goes in Y)

	dey
	bpl	plot_xloop

	pla			; restore YY
	tax
	dex
	bpl	plot_yloop
	bmi	forever_loop
.endif


calcsine_div_8:
	lsr
calcsine_div_4:
	lsr
calcsine_div_2:
	lsr
calcsine:
	stx	SAVEX
	and	#$f
	tax
	lda	sinetable,X
	clc
	adc	SUM
	sta	SUM
	ldx	SAVEX
	rts


colorlookup:

; blue
.byte $55,$22,$66,$77,$ff,$77,$55,$00



sinetable:
; this is actually (32*sin(x))
.byte $00,$0C,$16,$1D
.byte $20,$1D,$16,$0C
.byte $00,$F4,$EA,$E3
.byte $E0,$E3,$EA,$F4

