dos33fsprogs/demos/trogdor/trogdor.s
2024-01-27 21:54:31 -05:00

608 lines
9.5 KiB
ArmAsm

; TROGDOR 2024
.include "hardware.inc"
.include "zp.inc"
.include "qload.inc"
.include "music.inc"
.include "flames.inc"
trogdor_main:
;======================================
; init
;======================================
; clear screen to white0
lda #$0
sta DRAW_PAGE
; clear PAGE1 to white
ldy #$7f
jsr hgr_clear_screen
; set to HIRES PAGE1
bit SET_GR
bit HIRES
bit FULLGR
bit PAGE1
lda #$20
sta DRAW_PAGE
lda SOUND_STATUS
and #SOUND_MOCKINGBOARD
beq trog_no_music
cli ; start music
trog_no_music:
;======================================
; draw SCENE 1
;======================================
; scroll in zoomed in trogdor from right to left
; for 60 frames (roughly 2s)
; decompress trogdor to $6000
lda #<trog00_graphics
sta zx_src_l+1
lda #>trog00_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
; copy+magnify to PAGE2
lda #$60
jsr hgr_copy_magnify
jsr horiz_pan_skip
; clear to white
ldy #$7f
jsr hgr_clear_screen
jsr horiz_pan_skip
jsr hgr_page_flip
;======================================
; draw SCENE 2
;======================================
; 156
;
; draw flames on white background
; left flame short 2 frames
; left tall 1212 roughly 10 frames (1/2 s)
; both short 2 frames
; right tall 1212 roughly 10 frames
; right short 2 frames
; left frame short 2 frames
; left tall 1212 roughly 10 frames (1/2 s)
; left short 2 frames
; clear to white
ldy #$7f
jsr hgr_clear_screen
jsr hgr_page_flip
ldy #$7f
jsr hgr_clear_screen
jsr hgr_page_flip
lda #0 ; blank bg
sta FLAME_BG
lda #8 ; x-coords for two flames
sta FLAME_L
lda #24
sta FLAME_R
jsr do_flames
;=============================
; blank screen
ldy #$7f
jsr hgr_clear_screen
jsr hgr_page_flip
;======================================
; draw SCENE 3
;======================================
; scroll trogdor intro place
; takes rougly 90 frames (3s) to scroll in
; remains there 10 frames (almost .5s)
; orignal: 28s, want 9 times faster???
; can easily do 8 times...
; now should be on PAGE1??
ldy #$7f
jsr hgr_clear_screen
jsr hgr_page_flip
lda #0
sta COUNT
scroll_in_loop:
jsr hgr_vertical_scroll_left
lda COUNT
clc
adc #8
cmp #200
bne scroll_in_loop
lda #10
jsr wait_ticks
;======================================
; draw SCENE 4
;======================================
; countrside scrolls in
; roughly 45 frames? 1.5s?
; only 9 bytes wide
; decompress countryside to $2000
lda #<trog01_graphics
sta zx_src_l+1
lda #>trog01_graphics
sta zx_src_h+1
lda #$20
jsr zx02_full_decomp
; decompress second part to $4000
lda #<$FA00
sta zx_src_l+1
lda #>$FA00
sta zx_src_h+1
lda #$40
jsr zx02_full_decomp
; pan 9 times
; FIXME: update timing
lda #9
jsr horiz_pan
;======================================
; draw SCENE 5
;======================================
; 359
; trogdor man: 42 frames
; flames: left: llll1122
; flames: bb
; flames: right 22112211ss
; flames: left ss11221122ss
; flames gone: 30 frames (roughly 1s)
; dragon man: 160 frames (roughly 5s)
;======================================
; man for 42 frames
lda #<trog03_graphics
sta zx_src_l+1
lda #>trog03_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
jsr hgr_page_flip
lda #42
jsr wait_ticks
;=====================
; do flames
lda #1
sta FLAME_BG
jsr do_flames
;=====================
; done flames
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
jsr hgr_page_flip
lda #30
jsr wait_ticks
;======================================
; dragon man
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
jsr hgr_page_flip
lda #160
jsr wait_ticks
;======================================
; draw SCENE 6
;======================================
; 634
; dragon: 150 frames (roughly 5s)
; dragon zoom: 5 frames
;
; dragon: 5 frames \
; dragon zoom: 5 frames / repeat 6 times
; dragon zoom scroll off screen: 30 frames
; white screen: 20 frames
;=======================================
ldy #$7f
jsr hgr_clear_screen
lda #<trog00_graphics
sta zx_src_l+1
lda #>trog00_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
jsr hgr_copy_left
jsr hgr_page_flip
lda #50 ; should be 250?
jsr wait_ticks
;==========================
; dragon zoom
lda #$60
jsr hgr_copy_magnify
;===========================
; rapidly switch
lda #12
sta ANIMATE_COUNT
rapid_switch:
jsr hgr_page_flip
lda #5
jsr wait_ticks
dec ANIMATE_COUNT
bne rapid_switch
;===h========================
; scroll off screen
; switch to page1
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
jsr hgr_page_flip
lda #0
sta COUNT
scroll_down_in_loop:
jsr hgr_vertical_scroll_down_left
lda COUNT
clc
adc #8
sta COUNT
cmp #200
bne scroll_down_in_loop
;=========================
; clear to white screen
ldy #$7f
jsr hgr_clear_screen
jsr hgr_page_flip
lda #20
jsr wait_ticks
;======================================
; draw SCENE 7
;======================================
; 916
; dragonman, flames both low than high
; ll1122
; 10 times
; then full man 1122
; dragonman 1122
; man 1122
; dragonman 1122
; man 1122
; dragonmna 1122
; man 1122
; dragonman low, off 4 frames
lda #<trog03_graphics
sta zx_src_l+1
lda #>trog03_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
jsr hgr_copy_right
jsr hgr_page_flip
lda #20
jsr wait_ticks
; TODO
;======================================
; draw SCENE 8
;======================================
; 1009
; countryside for 75 frames
; then flames in middle low
; flames high 12 * 16
lda #<trog01_graphics
sta zx_src_l+1
lda #>trog01_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
lda #$60
jsr hgr_copy_fast
jsr hgr_page_flip
lda #20
jsr wait_ticks
; TODO: flames
;======================================
; draw SCENE 9
;======================================
; 1171
; big peasant head scrolling in right to left (also going down?)
; roughly 60 frames
; TODO: big peasant head
;======================================
; draw SCENE 10
;======================================
; 1229
; zoom trogdor down 5 frames
; zoom trogdor up 5 frames
; repeat total of 6 times
lda #<trog04_graphics
sta zx_src_l+1
lda #>trog04_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
; TODO: fix copy
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
lda #$60
jsr hgr_copy_magnify
lda #12
sta ANIMATE_COUNT
up_down_animate:
jsr hgr_page_flip
lda #10
jsr wait_ticks
dec ANIMATE_COUNT
bne up_down_animate
;======================================
; draw SCENE 11
;======================================
; Uncover peasants, 5 frames each
; R2 R4 L5
; L3 L1
; then wait 25 frames
; TODO: peasant drawing
;======================================
; draw SCENE 12
;======================================
; 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
lda #<trog04_graphics
sta zx_src_l+1
lda #>trog04_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
lda #0
sta COUNT
scroll_in_loop2:
jsr hgr_vertical_scroll_right
lda COUNT
clc
adc #8
cmp #200
bne scroll_in_loop2
lda #10
jsr wait_ticks
;======================================
; draw SCENE 13
;======================================
; trog down, 5 frames
; cottage , 5 frames
; trog up, 5 frames
; cottage, 5 frames
; overall: DCUC DCUC DC
; TODO
;======================================
; draw SCENE 14
;======================================
; low flames, tall flames at edges
; 60 frames as cottage comes in upside down from top
; 6 frames of that
; TODO
;======================================
; draw SCENE 15
;======================================
; zoom down 5
; man 7
; peasant 5
; countryside 5
; cottage 5
; trogdor really zoom
; trogdor normal zoom
; trogdor intermediate zoom
; trogdor regular
; low flames
; high flames 1/2
; TODO
;======================================
; draw SCENE 16
;======================================
; strongbad at computer
finished:
jsr wait_until_keypress
jsr hgr_page_flip
jmp finished
trog00_graphics:
.incbin "graphics/actual00_trog_peasant.hgr.zx02"
trog01_graphics:
.incbin "graphics/trog01_countryside.hgr.zx02"
trog03_graphics:
.incbin "graphics/actual01_dragonman.hgr.zx02"
trog04_graphics:
.incbin "graphics/actual02_updown_cottage.hgr.zx02"
.include "wait_keypress.s"
.include "irq_wait.s"
hposn_low = $1e00
hposn_high = $1f00
;.include "hgr_sprite_big_mask.s"
;.include "horiz_scroll_simple.s"
;.include "horiz_scroll_skip.s"
;.include "hgr_copy_magnify.s"
;.include "vertical_scroll.s"
;.include "hgr_copy_part.s"
.include "vertical_scroll_down.s"
.include "do_flames.s"
;=========================================
; hgr_copy_right
;=========================================
; copy right side of $6000 to current page
hgr_copy_right:
lda #0
sta COPY_Y1
sta SPRITE_Y
lda #10
sta SPRITE_X
lda #20
sta COPY_X1
lda #20
sta COPY_WIDTH
lda #191
sta COPY_Y2
jmp hgr_copy_part ; tail call
;=========================================
; hgr_copy_left
;=========================================
; copy left side of $6000 to current page
hgr_copy_left:
lda #0
sta COPY_X1
sta COPY_Y1
sta SPRITE_Y
lda #10
sta SPRITE_X
lda #20
sta COPY_WIDTH
lda #191
sta COPY_Y2
jmp hgr_copy_part ; tail call