trogdor: make flames more generic

This commit is contained in:
Vince Weaver 2024-01-26 01:10:05 -05:00
parent 626121ef29
commit 8e82b8f44e
5 changed files with 369 additions and 229 deletions

View File

@ -185,7 +185,7 @@ TROGDOR: trogdor.o
ld65 -o TROGDOR trogdor.o -C $(LINKER_SCRIPTS)/apple2_8000.inc
trogdor.o: trogdor.s \
flames.inc \
flames.inc do_flames.s \
zp.inc hardware.inc qload.inc \
graphics/trog00_trogdor.hgr.zx02 \
hgr_sprite_big_mask.s horiz_scroll_simple.s hgr_copy_magnify.s \

294
demos/trogdor/do_flames.s Normal file
View File

@ -0,0 +1,294 @@
;======================================
; do_flames
;======================================
; copy background from $6000, left
; then do the following pattern
; s=short, 1=tall_1 2=tall_2, b=both short
; flames: left: ss1122
; flames: bb
; flames: right 22112211ss
; flames: left ss11221122ss
; FLAME_L = X of left flame
; FLAME_R = X of right flame
; FLAME_BG = type of background
; 0 = blank white
; 1 = blank_white + left_copy
do_flames:
;======================================
; left flame short 2 frames
jsr draw_flame_bg
ldx FLAME_L
jsr draw_flame_small_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
;=================================================
; left tall 1212 roughly 10 frames (1/2 s)
lda #2
sta ANIMATE_COUNT
left_flame_animate1:
; 1
jsr draw_flame_bg
ldx FLAME_L
jsr draw_flame_tall_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
; 2
jsr draw_flame_bg
ldx FLAME_L
jsr draw_flame_tall_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
dec ANIMATE_COUNT
bne left_flame_animate1
;==============================
; both short 2 frames
jsr draw_flame_bg
ldx FLAME_L
jsr draw_flame_small_1
ldx FLAME_R
jsr draw_flame_small_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
;===========================================
; right tall 1212 roughly 10 frames
lda #2
sta ANIMATE_COUNT
right_flame_animate1:
; 2
jsr draw_flame_bg
ldx FLAME_R
jsr draw_flame_tall_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
; 1
jsr draw_flame_bg
ldx FLAME_R
jsr draw_flame_tall_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
dec ANIMATE_COUNT
bne right_flame_animate1
;=============================
; right short 2 frames
jsr draw_flame_bg
ldx FLAME_R
jsr draw_flame_small_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
;=============================
; left short 2 frames
jsr draw_flame_bg
ldx FLAME_L
jsr draw_flame_small_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
;================================================
; left tall 1212 roughly 10 frames (1/2 s)
lda #2
sta ANIMATE_COUNT
left_flame_animate2:
; 1
jsr draw_flame_bg
ldx FLAME_L
jsr draw_flame_tall_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
; 2
jsr draw_flame_bg
ldx FLAME_L
jsr draw_flame_tall_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
dec ANIMATE_COUNT
bne left_flame_animate2
;=============================
; left short 2 frames
jsr draw_flame_bg
ldx FLAME_L
jsr draw_flame_small_1
jsr hgr_page_flip
lda #2
jmp wait_ticks ; tail call
; jsr wait_ticks
; rts
;===============================
; draw_flame_bg
;===============================
draw_flame_bg:
lda FLAME_BG
beq flame_bg_clear
flame_bg_left:
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
rts
flame_bg_clear:
ldy #$7f
jsr hgr_clear_screen
rts
;===============================
; draw_flame_small
;===============================
; x location in X
draw_flame_small_1:
lda #<left_flame_small
sta INL
lda #>left_flame_small
sta INH
lda #<left_flame_small_mask
sta MASKL
lda #>left_flame_small_mask
bne draw_flame_small_common ; bra
draw_flame_small_2:
lda #<left_flame_small
sta INL
lda #>left_flame_small
sta INH
lda #<left_flame_small_mask
sta MASKL
lda #>left_flame_small_mask
draw_flame_small_common:
sta MASKH
txa
; lda #8
sta SPRITE_X
lda #152
sta SPRITE_Y
jsr hgr_draw_sprite_big_mask
rts
;===============================
; draw_flame_tall
;===============================
; X location in X
draw_flame_tall_1:
lda #<left_flame_big
sta INL
lda #>left_flame_big
sta INH
lda #<left_flame_big_mask
sta MASKL
lda #>left_flame_big_mask
sta MASKH
bne draw_left_flame_common ; bra
draw_flame_tall_2:
; draw right flame
lda #<right_flame_big
sta INL
lda #>right_flame_big
sta INH
lda #<right_flame_big_mask
sta MASKL
lda #>right_flame_big_mask
sta MASKH
draw_left_flame_common:
; lda #8
txa
sta SPRITE_X
lda #54
sta SPRITE_Y
jsr hgr_draw_sprite_big_mask
rts

View File

@ -94,3 +94,51 @@ hgr_page2_cls_loop:
rts
.if 0
;====================================
; clear $6000 off-screen buffer
;====================================
hgr_page3_clearscreen:
tya
ldy #0
hgr_page3_cls_loop:
sta $6000,Y
sta $6100,Y
sta $6200,Y
sta $6300,Y
sta $6400,Y
sta $6500,Y
sta $6600,Y
sta $6700,Y
sta $6800,Y
sta $6900,Y
sta $6A00,Y
sta $6B00,Y
sta $6C00,Y
sta $6D00,Y
sta $6E00,Y
sta $6F00,Y
sta $7000,Y
sta $7100,Y
sta $7200,Y
sta $7300,Y
sta $7400,Y
sta $7500,Y
sta $7600,Y
sta $7700,Y
sta $7800,Y
sta $7900,Y
sta $7A00,Y
sta $7B00,Y
sta $7C00,Y
sta $7D00,Y
sta $7E00,Y
sta $7F00,Y
iny
bne hgr_page3_cls_loop
rts
.endif

View File

@ -75,8 +75,9 @@ trog_no_music:
;======================================
; draw SCENE 2
;======================================
; draw flames
; 156
;
; draw flames on white background
; left flame short 2 frames
; left tall 1212 roughly 10 frames (1/2 s)
; both short 2 frames
@ -92,158 +93,22 @@ trog_no_music:
; clear to white
ldy #$7f
jsr hgr_clear_screen
ldx #8
jsr draw_flame_small_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
;=================================================
; left tall 1212 roughly 10 frames (1/2 s)
lda #2
sta ANIMATE_COUNT
left_flame_animate1:
ldy #$7f
jsr hgr_clear_screen
ldx #8
jsr draw_flame_tall_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
ldy #$7f
jsr hgr_clear_screen
ldx #8
jsr draw_flame_tall_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
dec ANIMATE_COUNT
bne left_flame_animate1
;==============================
; both short 2 frames
; clear to white
ldy #$7f
jsr hgr_clear_screen
ldx #8
jsr draw_flame_small_1
ldx #24
jsr draw_flame_small_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
lda #0
sta FLAME_BG
;===========================================
; right tall 1212 roughly 10 frames
lda #8
sta FLAME_L
lda #24
sta FLAME_R
lda #2
sta ANIMATE_COUNT
right_flame_animate1:
ldy #$7f
jsr hgr_clear_screen
ldx #24
jsr draw_flame_tall_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
ldy #$7f
jsr hgr_clear_screen
ldx #24
jsr draw_flame_tall_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
dec ANIMATE_COUNT
bne right_flame_animate1
;=============================
; right short 2 frames
; clear to white
ldy #$7f
jsr hgr_clear_screen
ldx #24
jsr draw_flame_small_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
;=============================
; left short 2 frames
; clear to white
ldy #$7f
jsr hgr_clear_screen
ldx #8
jsr draw_flame_small_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
;================================================
; left tall 1212 roughly 10 frames (1/2 s)
lda #2
sta ANIMATE_COUNT
left_flame_animate2:
ldy #$7f
jsr hgr_clear_screen
ldx #8
jsr draw_flame_tall_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
ldy #$7f
jsr hgr_clear_screen
ldx #8
jsr draw_flame_tall_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
dec ANIMATE_COUNT
bne left_flame_animate2
;=============================
; left short 2 frames
; clear to white
ldy #$7f
jsr hgr_clear_screen
ldx #8
jsr draw_flame_small_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
jsr do_flames
;=============================
; blank screen
@ -327,6 +192,7 @@ scroll_in_loop:
;======================================
; draw SCENE 5
;======================================
; 359
; trogdor man: 42 frames
; flames: left: llll1122
; flames: bb
@ -337,7 +203,7 @@ scroll_in_loop:
;======================================
; man
; man for 42 frames
lda #<trog03_graphics
sta zx_src_l+1
@ -356,6 +222,10 @@ scroll_in_loop:
lda #42
jsr wait_ticks
lda #1
sta FLAME_BG
jsr do_flames
;======================================
; dragon man
@ -537,6 +407,12 @@ up_down_animate:
; white screen
; scroll up cottage, takes roughly 90 frames (3s)
; must be at PAGE1 here
ldy #$7f
jsr hgr_clear_screen
jsr hgr_page_flip
ldy #$7f
jsr hgr_clear_screen
jsr hgr_page_flip
@ -637,88 +513,7 @@ trog04_graphics:
;.include "vertical_scroll.s"
;.include "hgr_copy_part.s"
;===============================
; draw_flame_small
;===============================
; x location in X
draw_flame_small_1:
lda #<left_flame_small
sta INL
lda #>left_flame_small
sta INH
lda #<left_flame_small_mask
sta MASKL
lda #>left_flame_small_mask
bne draw_flame_small_common ; bra
draw_flame_small_2:
lda #<left_flame_small
sta INL
lda #>left_flame_small
sta INH
lda #<left_flame_small_mask
sta MASKL
lda #>left_flame_small_mask
draw_flame_small_common:
sta MASKH
txa
; lda #8
sta SPRITE_X
lda #152
sta SPRITE_Y
jsr hgr_draw_sprite_big_mask
rts
;===============================
; draw_flame_tall
;===============================
; X location in X
draw_flame_tall_1:
lda #<left_flame_big
sta INL
lda #>left_flame_big
sta INH
lda #<left_flame_big_mask
sta MASKL
lda #>left_flame_big_mask
sta MASKH
bne draw_left_flame_common ; bra
draw_flame_tall_2:
; draw right flame
lda #<right_flame_big
sta INL
lda #>right_flame_big
sta INH
lda #<right_flame_big_mask
sta MASKL
lda #>right_flame_big_mask
sta MASKH
draw_left_flame_common:
; lda #8
txa
sta SPRITE_X
lda #54
sta SPRITE_Y
jsr hgr_draw_sprite_big_mask
rts
.include "do_flames.s"
;=========================================
; hgr_copy_right

View File

@ -131,6 +131,9 @@ SPRITE_Y = $F2
SPRITE_X = $F3
CURRENT_ROW = $F4
ANIMATE_COUNT = $F5
FLAME_L = $F6
FLAME_R = $F7
FLAME_BG = $F8
;==============================================
; $FC-$FF we use for in/out pointers