dos33fsprogs/demos/trogdor/trogdor.s

1266 lines
18 KiB
ArmAsm

; TROGDOR 2024
.include "hardware.inc"
.include "zp.inc"
.include "qload.inc"
.include "music.inc"
.include "flames.inc"
hposn_low = $1e00
hposn_high = $1f00
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
;======================================
; o/~ TRODOR! o/~
; 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 #20
sta SPRITE_Y
lda #0
sta SPRITE_X
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
;======================================
; o/~ TROGDOR! o/~
; 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
; do this in advance
; 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
lda #10
jsr wait_ticks
;======================================
; draw SCENE 4
;======================================
; o/~ Trogdor was a o/~
; countrside scrolls in
; roughly 45 frames? 1.5s?
; only 9 bytes wide
; 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
lda #9
jsr horiz_pan
;======================================
; draw SCENE 5
;======================================
; o/~ man ... o/~
; 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 #20
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 #10
jsr wait_ticks
;======================================
; dragon man
; o/~ I mean he was a dragon man o/~
; o/~ Maybe he was just a ... o/~
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
jsr hgr_page_flip
lda #160
jsr wait_ticks
lda #120
jsr wait_ticks
;======================================
; draw SCENE 6
;======================================
; o/~ dragon, eh, but he was still o/~
; 634
; dragon: 150 frames (roughly 5s)
;=======================================
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 #160
jsr wait_ticks
lda #100
jsr wait_ticks
;======================================
; draw SCENE 6a
;======================================
; o/~ Trogdor! o/~
;==========================
; dragon zoom: 5 frames
; dragon zoom
;
; dragon: 5 frames \
; dragon zoom: 5 frames / repeat 6 times
; dragon zoom scroll off screen: 30 frames
; white screen: 20 frames
; zoomed off screen by end of the Trogdor
;=======================================
lda #0
sta SPRITE_X
lda #20
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
;===========================
; rapidly switch
lda #12
sta ANIMATE_COUNT
rapid_switch:
jsr hgr_page_flip
lda #7
jsr wait_ticks
dec ANIMATE_COUNT
bne rapid_switch
;===========================
; 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
;=========================
; pre-load dragonman graphics
lda #<trog03_graphics
sta zx_src_l+1
lda #>trog03_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
; lda #10
; jsr wait_ticks
;======================================
; draw SCENE 7
;======================================
; o/~ Trogdor! o/~
; 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
; in practice we can't draw this as fast as the original
;===============================
; dragonman with twin low flames
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
jsr draw_twin_flames_low
jsr hgr_page_flip
lda #1
jsr wait_ticks
;===============================
; dragonman 1122 10 times
lda #2
sta ANIMATE_COUNT
long_tall:
jsr dman_flames
dec ANIMATE_COUNT
bne long_tall
;========================
; then full man 1122
; dragonman 1122
; man 1122
; dragonman 1122
; man 1122
; dragonmna 1122
; man 1122
jsr man_flames
jsr dman_flames
jsr man_flames
; jsr dman_flames
; jsr man_flames
; jsr dman_flames
; jsr man_flames
;===============================
; dragonman low, 2 frames
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
jsr draw_twin_flames_low
jsr hgr_page_flip
lda #1
jsr wait_ticks
;================================
; dragonman off, 4 frames
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
jsr hgr_page_flip
; lda #2
; jsr wait_ticks
;======================================
; draw SCENE 8
;======================================
; o/~ Burninating the countryside o/~
; 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 #100
jsr wait_ticks
;===============================
; o/~ Burninating the... o/~
lda #6
sta ANIMATE_COUNT
country_flames:
lda #$60
jsr hgr_copy_fast
ldx #11
jsr draw_flame_tall_1
ldx #21
jsr draw_flame_tall_2
jsr hgr_page_flip
; lda #2
; jsr wait_ticks
lda #$60
jsr hgr_copy_fast
ldx #11
jsr draw_flame_tall_2
ldx #21
jsr draw_flame_tall_1
jsr hgr_page_flip
; lda #2
; jsr wait_ticks
dec ANIMATE_COUNT
bne country_flames
;======================================
; draw SCENE 9
;======================================
; o/~ peasants o/~
; 1171
; big peasant head scrolling in right to left (also going down?)
; roughly 60 frames
; decompress trogdor+peasant to $6000
lda #<trog00_graphics
sta zx_src_l+1
lda #>trog00_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
; clear screen
ldy #$7f
jsr hgr_clear_screen
jsr hgr_page_flip
ldy #$7f
jsr hgr_clear_screen
; jsr hgr_page_flip
; want to be on PAGE2 here, how to force?
; copy+magnify to PAGE2
lda #20
sta SPRITE_X
lda #0
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr horiz_pan_skip
; clear to white
ldy #$7f
jsr hgr_clear_screen
lda #20
jsr horiz_pan_skip_short
jsr hgr_page_flip
;======================================
; draw SCENE 10
;======================================
; o/~ Burninating all the o/~
; 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
lda #00
sta SPRITE_X
lda #0
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
lda #0
sta SPRITE_X
lda #96
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
; ?h
; lda #$60
; jsr hgr_copy_magnify
;======================
; animate
lda #8
sta ANIMATE_COUNT
up_down_animate:
jsr hgr_page_flip
lda #7
jsr wait_ticks
dec ANIMATE_COUNT
bne up_down_animate
;======================================
; draw SCENE 11
;======================================
; o/~ People in their o/~
; 1284
;
; Uncover peasants, 5 frames each
; R2 R4 L5
; L3 L1
; then wait 25 frames
lda #<trog00_graphics
sta zx_src_l+1
lda #>trog00_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
lda #1
sta COUNT
peasant_outer_loop:
ldy #$7f
jsr hgr_clear_screen
ldx #0
peasant_inner_loop:
stx ANIMATE_COUNT
lda peasant_data_x1,X
sta COPY_X1
lda peasant_data_width,X
sta COPY_WIDTH
lda peasant_data_y1,X
sta COPY_Y1
lda peasant_data_y2,X
sta COPY_Y2
lda peasant_data_sprite_x,X
sta SPRITE_X
lda peasant_data_sprite_y,X
sta SPRITE_Y
jsr hgr_copy_part
ldx ANIMATE_COUNT
inx
cpx COUNT
bne peasant_inner_loop
jsr hgr_page_flip
lda #10
jsr wait_ticks
inc COUNT
lda COUNT
cmp #6
bne peasant_outer_loop
lda #10
jsr wait_ticks
;======================================
; draw SCENE 12
;======================================
; o/~ thatched roof cot... o/~
; 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
;======================================
; o/~ ...tages o/~
; 1429
; trog down, 5 frames
; cottage , 5 frames
; trog up, 5 frames
; cottage, 5 frames
; overall: DCUC DCUC DC
lda #<trog04_graphics
sta zx_src_l+1
lda #>trog04_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
jsr down_cottage
jsr up_cottage
jsr down_cottage
; jsr up_cottage
; jsr down_cottage
;======================================
; draw SCENE 14
;======================================
; o/~ Thatched roof cottages o/~
; 1479
; low flames, tall flames at edges
; 60 frames as cottage comes in upside down from top
; 6 frames of that
ldy #$7f
jsr hgr_clear_screen
jsr draw_twin_flames_low
jsr hgr_page_flip
lda #1
jsr wait_ticks
;======================
; scroll in upside down
lda #0
sta COUNT
scroll_down_loop:
ldy #$7f
jsr hgr_clear_screen
;============================
; draw COUNT...0 ($6000) to 0...COUNT (DRAW_PAGE)
; IN OUT
ldx COUNT ; in ptr
ldy #0 ; out ptr
scroll_down_cottage_outer:
lda hposn_low,Y
sta OUTL
lda hposn_high,Y
clc
adc DRAW_PAGE
sta OUTH
lda hposn_low,X
clc
adc #10 ; right side
sta INL
lda hposn_high,X
clc
adc #$40 ; $6000
sta INH
tya
pha
ldy #29
scroll_down_cottage_inner:
lda (INL),Y
sta (OUTL),Y
dey
cpy #9
bne scroll_down_cottage_inner
pla
tay
iny
dex
cpx #$FF
bne scroll_down_cottage_outer
.if 0
;============================
; draw COUNT...192 as white (not needed? keeps frame rate const?)
ldx COUNT
scroll_down_white_outer:
lda hposn_low,X
sta OUTL
lda hposn_high,X
clc
adc DRAW_PAGE
sta OUTH
lda #$7f
ldy #29
scroll_down_white_inner:
sta (OUTL),Y
dey
cpy #9
bne scroll_down_white_inner
inx
cpx #192
bne scroll_down_white_outer
.endif
;============================
; draw flames
lda COUNT ; 0x08
and #$08
bne upside_down_flame_2
upside_down_flame_1:
jsr draw_twin_flames_tall_1
jmp done_upside_down_flame
upside_down_flame_2:
jsr draw_twin_flames_tall_2
done_upside_down_flame:
jsr hgr_page_flip
lda COUNT
clc
adc #8
sta COUNT
cmp #176
bne scroll_down_loop
;================================
; done
; lda #10
; jsr wait_ticks
;======================================
; draw SCENE 15
;======================================
; o/~ ... o/~
; 1561
; zoom down 5
; man 7
; peasant 5g
; countryside 5
; cottage 5
; trogdor really zoom
; trogdor normal zoom
; trogdor intermediate zoom
; trogdor regular
; low flames
; high flames 1/2
;==========================
; trog down
lda #0
sta SPRITE_X
lda #96
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
; lda #2
; jsr wait_ticks
;==========================
; man
lda #<trog03_graphics
sta zx_src_l+1
lda #>trog03_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
lda #0
sta SPRITE_X
lda #0
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
; lda #2
; jsr wait_ticks
;===========================
; peasant
lda #<trog00_graphics
sta zx_src_l+1
lda #>trog00_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
; clear screen
; ldy #$7f
; jsr hgr_clear_screen
lda #20
sta SPRITE_X
lda #0
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
;===========================
; countryside
lda #<trog01_graphics
sta zx_src_l+1
lda #>trog01_graphics
sta zx_src_h+1
lda #$20
jsr zx02_full_decomp
jsr hgr_page_flip
;===========================
; cottage
lda #<trog04_graphics
sta zx_src_l+1
lda #>trog04_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
jsr hgr_page_flip
;======================================
; trog pan up (supposed to be zoom out)
lda #<trog00_graphics
sta zx_src_l+1
lda #>trog00_graphics
sta zx_src_h+1
lda #$60
jsr zx02_full_decomp
;==========================
; pan 1
lda #0
sta SPRITE_X
lda #90
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
;==========================
; pan 2
lda #0
sta SPRITE_X
lda #60
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
;==========================
; pan 3
lda #0
sta SPRITE_X
lda #30
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
;==========================
; full size
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
jsr draw_twin_flames_low
jsr hgr_page_flip
lda #1
jsr wait_ticks
;=======================
; 1
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
jsr draw_twin_flames_tall_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
;=======================
; 2
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
jsr draw_twin_flames_tall_2
jsr hgr_page_flip
lda #2
jsr wait_ticks
;=======================
; 1
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
jsr draw_twin_flames_tall_1
jsr hgr_page_flip
lda #2
jsr wait_ticks
;======================================
; draw SCENE 16
;======================================
; o/~ and the trogdor comes in the night o/~
; strongbad at computer
lda #<$900
sta zx_src_l+1
lda #>$900
sta zx_src_h+1
lda #$20
jsr zx02_full_decomp
jsr hgr_page_flip
finished:
lda #150
jsr wait_ticks
lda #150
jsr wait_ticks
wait_till_done:
lda SOUND_STATUS
beq finished_no_mb
lda DONE_PLAYING
beq wait_till_done
finished_no_mb:
rts
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"
peasant_data_x1:
.byte 20, 20, 20, 20, 20
peasant_data_width:
.byte 9, 8, 9, 8, 9
peasant_data_y1:
.byte 0, 98, 0, 98, 0
peasant_data_y2:
.byte 96,176, 96,176, 96
peasant_data_sprite_x:
.byte 22, 4, 12, 16, 28
peasant_data_sprite_y:
.byte 92, 30, 91, 2, 8
;==========================
; man flames
man_flames:
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_left
jmp dman_flames_common
;==========================
; dragonman flames
dman_flames:
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
dman_flames_common:
jsr draw_twin_flames_tall_1
jsr hgr_page_flip
; lda #1
; jsr wait_ticks
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
jsr draw_twin_flames_tall_2
jsr hgr_page_flip
; lda #1
; jsr wait_ticks
rts
down_cottage:
lda #0
sta SPRITE_X
lda #96
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
lda #5
jsr wait_ticks
jmp common_cottage
up_cottage:
lda #0
sta SPRITE_X
lda #0
sta SPRITE_Y
lda #$60
jsr hgr_copy_magnify
jsr hgr_page_flip
lda #5
jsr wait_ticks
common_cottage:
ldy #$7f
jsr hgr_clear_screen
jsr hgr_copy_right
jsr hgr_page_flip
lda #5
jsr wait_ticks
rts
;.include "wait_keypress.s"
;.include "hgr_copy_part.s"
;.include "vertical_scroll.s"