dos33fsprogs/demos/fire/fire.s
Vince Weaver b1238af49d re-arranged the entire directory structure
this will probably upset people
2021-01-05 15:29:31 -05:00

187 lines
2.7 KiB
ArmAsm

; Lo-res fire animation
; by deater (Vince Weaver) <vince@deater.net>
; based on code described here http://fabiensanglard.net/doom_fire_psx/
; Zero Page
COLOR = $30
SEEDL = $4E
DRAW_PAGE = $EE
TEMP = $FA
TEMPY = $FB
; Soft Switches
KEYPRESS= $C000
KEYRESET= $C010
SET_GR = $C050 ; Enable graphics
FULLGR = $C052 ; Full screen, no text
PAGE0 = $C054 ; Page0
PAGE1 = $C055 ; Page1
LORES = $C056 ; Enable LORES graphics
PADDLE_BUTTON0 = $C061
PADDL0 = $C064
PTRIG = $C070
; ROM routines
TEXT = $FB36 ;; Set text mode
HOME = $FC58 ;; Clear the text screen
WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us
fire_demo:
;===================
; init screen
jsr TEXT
jsr HOME
bit PAGE0
;===================
; init vars
lda #0
;==============================
; setup graphics for vapor lock
;==============================
; jsr vapor_lock ; 6
; vapor lock returns with us at beginning of hsync in line
; 114 (7410 cycles), so with 5070 lines to go
; jsr gr_copy_to_current ; 6+ 9292
; now we have 322 left
; GR part
bit LORES ; 4
bit SET_GR ; 4
bit FULLGR ; 4
; 322 - 12 = 310
; -3 for jmp
; 307
; Try X=9 Y=6 cycles=307
; ldy #6 ; 2
;wfloopA:ldx #9 ; 2
;wfloopB:dex ; 2
; bne wfloopB ; 2nt/3
; dey ; 2
; bne wfloopA ; 2nt/3
jsr clear_screens_notext
; Setup white line on bottom
lda #$ff
ldx #39
white_loop:
sta $7d0,X ; hline 24 (46+47)
dex
bpl white_loop
fire_loop:
ldy #44 ; 22 * 2
yloop:
lda gr_offsets,Y
sta smc2+1
lda gr_offsets+1,Y
sta smc2+2
lda gr_offsets+2,Y
sta smc1+1
lda gr_offsets+3,Y
sta smc1+2
sty TEMPY
ldx #39
xloop:
smc1:
lda $7d0,X
sta TEMP
and #$f ; mask off
tay
jsr random16
lda SEEDL
and #$1
beq no_change
decrement:
lda color_progression,Y
jmp done_change
no_change:
lda TEMP
done_change:
smc2:
sta $750,X
dex
bpl xloop
ldy TEMPY
dey
dey
bpl yloop
;======================================================
; We have 4550 cycles in the vblank, use them wisely
;======================================================
; do_nothing should be 4550
; =============
; 15 cycles
;====================
; Handle keypresses
; if no keypress, 9
; if keypress, 6+43 = 49
lda KEYPRESS ; 4
bmi keypress
; 2
no_keypress:
jmp fire_loop
keypress:
jmp keypress
color_progression:
.byte 0 ; 0->0
.byte $88 ; 1->8
.byte 0 ; 2->0
.byte 0 ; 3->0
.byte 0 ; 4->0
.byte 0 ; 5->0
.byte 0 ; 6->0
.byte 0 ; 7->0
.byte $55 ; 8->5
.byte $11 ; 9->1
.byte 0 ; 10->0
.byte 0 ; 11->0
.byte 0 ; 12->0
.byte $99 ; 13->9
.byte 0 ; 14->0
.byte $dd ; 15->13
.include "gr_hline.s"
.include "gr_fast_clear.s"
.include "vapor_lock.s"
.include "delay_a.s"
.include "random16.s"