fireworks: now a state machine

This commit is contained in:
Vince Weaver 2018-09-10 15:42:40 -04:00
parent a3378d1192
commit ca57701102

View File

@ -2,10 +2,11 @@
; Based on BASIC program posted by FozzTexx, originally written in 1987 ; Based on BASIC program posted by FozzTexx, originally written in 1987
;======================================================================= ;=======================================================================
; State: Launch ; State:
; rocketing ; 0: Launch Rocket
; explosion ; 1: Move Rocket
; 2: Start Explosion
; 3: Continue Explosion
; Constants ; Constants
NUMSTARS = 16 NUMSTARS = 16
@ -14,6 +15,7 @@ XSIZE = 280
MARGIN = 24 MARGIN = 24
; Zero page addresses ; Zero page addresses
STATE = $EE
OFFSET = $EF OFFSET = $EF
COLOR_GROUP = $F0 COLOR_GROUP = $F0
X_VELOCITY = $F1 X_VELOCITY = $F1
@ -39,25 +41,61 @@ draw_fireworks:
jsr HOME ; clear screen jsr HOME ; clear screen
jsr hgr ; set high-res, clear screen, page0 jsr hgr ; set high-res, clear screen, page0
lda #0
sta STATE
jsr draw_stars ; draw the stars jsr draw_stars ; draw the stars
fireworks_state_machine:
; see if key pressed
lda KEYPRESS ; check if keypressed
bmi done_fireworks ; if so, exit
lda STATE
cmp #0
bne s1
jsr launch_firework
jmp fireworks_state_machine
s1:
cmp #1
bne s2
jsr move_rocket
jmp fireworks_state_machine
s2:
cmp #2
bne s3
jsr start_explosion
jmp fireworks_state_machine
s3:
jsr continue_explosion
jmp fireworks_state_machine
done_fireworks:
rts
;===========================
; LAUNCH_FIREWORK
;===========================
; cycles=???
launch_firework: launch_firework:
jsr random16 ; 6+? jsr random16 ; 6+42
lda SEEDL ; 3 lda SEEDL ; 3
and #$4 ; 2 and #$4 ; 2
sta COLOR_GROUP ; HGR color group (0 PG or 4 BO) ; 4 sta COLOR_GROUP ; HGR color group (0 PG or 4 BO) ; 4
jsr random16 ; 6+ jsr random16 ; 6+42
lda SEEDL ; 3 lda SEEDL ; 3
and #$3 ; 2 and #$3 ; 2
clc ; 2 clc ; 2
adc #$1 ; 2 adc #$1 ; 2
sta X_VELOCITY ; x velocity = 1..4 ; 3 sta X_VELOCITY ; x velocity = 1..4 ; 3
jsr random16 ; 6+ jsr random16 ; 6+42
lda SEEDL ; 3 lda SEEDL ; 3
and #$3 ; 2 and #$3 ; 2
clc ; 2 clc ; 2
@ -67,7 +105,7 @@ launch_firework:
lda #0 ; 2 lda #0 ; 2
sta Y_VELOCITY_L ; it's 8:8 fixed point ; 3 sta Y_VELOCITY_L ; it's 8:8 fixed point ; 3
jsr random16 ; 6+ jsr random16 ; 6+42
lda SEEDL ; 3 lda SEEDL ; 3
and #$1f ; 2 and #$1f ; 2
clc ; 2 clc ; 2
@ -75,12 +113,12 @@ launch_firework:
sta MAX_STEPS ; 33..64 ; 3 sta MAX_STEPS ; 33..64 ; 3
; launch from the two hills ; launch from the two hills
jsr random16 ; 6+ jsr random16 ; 6+42
lda SEEDL ; 3 lda SEEDL ; 3
and #$3f ; 2 and #$3f ; 2
sta XPOS_L ; 3 sta XPOS_L ; 3
jsr random16 ; 6+ jsr random16 ; 6+42
lda SEEDL ; 3 lda SEEDL ; 3
and #$1 ; 2 and #$1 ; 2
beq right_hill ; 2 beq right_hill ; 2
@ -116,13 +154,19 @@ done_hill:
lda #1 ; 2 lda #1 ; 2
sta CURRENT_STEP ; 3 sta CURRENT_STEP ; 3
lda #1 ; 2
sta STATE ; move to launch ; 3
rts ; 6
;=============== ;===============
; Draw rocket ; Move rocket
;=============== ;===============
; cycles=???
draw_rocket_loop: move_rocket:
lda Y_OLD lda Y_OLD
sta Y_OLDER sta Y_OLDER
@ -274,21 +318,27 @@ done_with_loop:
lda CURRENT_STEP lda CURRENT_STEP
cmp MAX_STEPS cmp MAX_STEPS
beq draw_explosion bne not_done_with_launch
lda #2
sta STATE
not_done_with_launch:
lda #$c0 lda #$c0
jsr WAIT jsr WAIT
inc CURRENT_STEP inc CURRENT_STEP
jmp draw_rocket_loop
rts
;================================== ;==================================
; Draw explosion near x_old, y_old ; Start explosion near x_old, y_old
;================================== ;==================================
draw_explosion: start_explosion:
jsr random16 jsr random16
lda SEEDL lda SEEDL
@ -325,14 +375,20 @@ draw_explosion:
ldy #0 ldy #0
jsr hplot0 ; hplot(x_old,y_old); jsr hplot0 ; hplot(x_old,y_old);
; Spread the explosion ; Spread the explosion
ldy #1 ldy #1
sty TEMPY ; save Y sty TEMPY ; save Y
explosion_loop: lda #3 ; move to continue explosion
sta STATE
rts
;===============================
; Continue Explosion
;===============================
continue_explosion:
ldy TEMPY ldy TEMPY
;================================ ;================================
@ -378,24 +434,29 @@ done_with_explosion:
inc TEMPY inc TEMPY
lda TEMPY lda TEMPY
cmp #10 cmp #10
bne explosion_loop beq explosion_done
rts
explosion_done:
;================================== ;==================================
; randomly draw more explosions ; randomly draw more explosions
;================================== ;==================================
jsr random16 jsr random16
lda SEEDL lda SEEDL
and #$1 and #$2
beq draw_explosion sta STATE
; if 0, then move to state 0 (start over)
; if 2, then move to state 2 (new random explosion)
; see if key pressed
lda KEYPRESS ; check if keypressed
bmi done_fireworks ; if so, exit
jmp launch_firework
done_fireworks:
rts rts
;===============================
; Draw explosion rays
;===============================
;
explosion: explosion:
; HPLOT X,Y: X= (y,x), Y=a ; HPLOT X,Y: X= (y,x), Y=a