282 lines
6.0 KiB
ArmAsm
282 lines
6.0 KiB
ArmAsm
; ootw -- It's the End of the Game as We Know It
|
|
|
|
; TODO: missing a bunch of frames
|
|
|
|
|
|
; by Vince "Deater" Weaver <vince@deater.net>
|
|
|
|
.include "../zp.inc"
|
|
.include "../hardware.inc"
|
|
|
|
ending:
|
|
|
|
;=========================
|
|
; set up sound
|
|
;=========================
|
|
lda #0
|
|
sta DONE_PLAYING
|
|
|
|
lda #1
|
|
sta LOOP
|
|
|
|
; detect mockingboard
|
|
|
|
jsr mockingboard_detect
|
|
|
|
bcc mockingboard_notfound
|
|
|
|
mockingboard_found:
|
|
|
|
; jsr mockingboard_patch ; patch to work in slots other than 4?
|
|
|
|
;=======================
|
|
; Set up 50Hz interrupt
|
|
;========================
|
|
|
|
jsr mockingboard_init
|
|
jsr mockingboard_setup_interrupt
|
|
|
|
;============================
|
|
; Init the Mockingboard
|
|
;============================
|
|
|
|
jsr reset_ay_both
|
|
jsr clear_ay_both
|
|
|
|
;==================
|
|
; init song
|
|
;==================
|
|
|
|
jsr pt3_init_song
|
|
|
|
|
|
jmp done_setup_sound
|
|
|
|
mockingboard_notfound:
|
|
; patch out cli/sei calls
|
|
|
|
lda #$EA
|
|
sta cli_smc
|
|
sta sei_smc
|
|
|
|
done_setup_sound:
|
|
|
|
repeat_ending:
|
|
|
|
;===========================
|
|
; Enable graphics
|
|
;===========================
|
|
|
|
bit LORES
|
|
bit SET_GR
|
|
bit FULLGR
|
|
bit KEYRESET
|
|
|
|
;=================================
|
|
; Setup pages (is this necessary?)
|
|
;=================================
|
|
|
|
; lda #0
|
|
; sta DRAW_PAGE
|
|
; lda #1
|
|
; sta DISP_PAGE
|
|
|
|
|
|
|
|
;============
|
|
; start music
|
|
;============
|
|
|
|
cli_smc:
|
|
cli ; enable interrupts
|
|
|
|
;=====================================
|
|
; friend arrive, board dragon sequence
|
|
;=====================================
|
|
|
|
lda #<pickup_sequence
|
|
sta INTRO_LOOPL
|
|
lda #>pickup_sequence
|
|
sta INTRO_LOOPH
|
|
|
|
jsr run_sequence
|
|
|
|
;=========================
|
|
; wing open sequence
|
|
;=========================
|
|
|
|
lda #<wing_sequence
|
|
sta INTRO_LOOPL
|
|
lda #>wing_sequence
|
|
sta INTRO_LOOPH
|
|
|
|
jsr run_sequence
|
|
|
|
;=========================
|
|
; flying sequence
|
|
;=========================
|
|
|
|
lda #<flying_sequence
|
|
sta INTRO_LOOPL
|
|
lda #>flying_sequence
|
|
sta INTRO_LOOPH
|
|
|
|
jsr run_sequence
|
|
|
|
;===========================
|
|
; real end
|
|
;===========================
|
|
|
|
quit_level:
|
|
jsr TEXT
|
|
jsr HOME
|
|
lda KEYRESET ; clear strobe
|
|
|
|
;======================
|
|
; scroll credits
|
|
;======================
|
|
|
|
jsr end_credits
|
|
|
|
|
|
;======================
|
|
; wait before rebooting
|
|
;======================
|
|
|
|
; wait wait wait
|
|
|
|
jsr wait_until_keypressed
|
|
|
|
; disable music
|
|
|
|
jsr clear_ay_both
|
|
sei_smc:
|
|
sei
|
|
|
|
; reboot to title
|
|
|
|
lda #$ff ; force cold reboot
|
|
sta $03F4
|
|
jmp ($FFFC)
|
|
|
|
; jmp repeat_ending
|
|
|
|
|
|
|
|
;======================
|
|
; wait until keypressed
|
|
;======================
|
|
wait_until_keypressed:
|
|
lda KEYPRESS
|
|
bpl wait_until_keypressed
|
|
bit KEYRESET
|
|
rts
|
|
|
|
|
|
; sequence: 0 = done
|
|
; 255 reload $C00 with PTR
|
|
; 0..127 wait TIME, then overlay $C00 with X
|
|
; 128..254 wait TIME then overlay $C00 with next
|
|
; note: pauses *before* flipping to new graphic
|
|
|
|
|
|
; dragon moves its head a bit when we arrive
|
|
; repeats twice pulling self
|
|
; then again but slightly to right
|
|
; two more times
|
|
; friend pops up, pauses a while
|
|
|
|
pickup_sequence:
|
|
.byte 255 ; load to bg
|
|
.word rooftop_bg_lzsa ; this
|
|
.byte 128+110 ; .word rooftop01_lzsa ; next
|
|
.byte 128+110 ; .word rooftop02_lzsa ; next
|
|
.byte 128+100 ; .word rooftop03_lzsa ; next
|
|
.byte 128+110 ; .word rooftop04_lzsa ; next
|
|
.byte 128+110 ; .word rooftop05_lzsa ; next
|
|
.byte 128+100 ; .word rooftop06_lzsa ; next
|
|
.byte 128+110 ; .word rooftop07_lzsa ; next
|
|
.byte 128+110 ; .word rooftop08_lzsa ; next
|
|
.byte 128+100 ; .word rooftop09_lzsa ; next
|
|
.byte 128+100 ; .word rooftop10_lzsa ; next
|
|
.byte 128+110 ; .word rooftop11_lzsa ; next
|
|
.byte 128+110 ; .word rooftop12_lzsa ; next
|
|
.byte 128+100 ; .word rooftop13_lzsa ; next
|
|
.byte 128+110 ; .word rooftop14_lzsa ; next
|
|
.byte 128+110 ; .word rooftop15_lzsa ; next
|
|
.byte 128+100 ; .word rooftop16_lzsa ; next
|
|
.byte 128+110 ; .word rooftop17_lzsa ; next
|
|
.byte 128+110 ; .word rooftop18_lzsa ; next
|
|
.byte 128+100 ; .word rooftop19_lzsa ; next
|
|
.byte 128+100 ; .word rooftop20_lzsa ; next
|
|
.byte 128+110 ; .word rooftop21_lzsa ; next
|
|
.byte 128+110 ; .word rooftop22_lzsa ; next
|
|
.byte 128+100 ; .word rooftop23_lzsa ; next
|
|
.byte 128+110 ; .word rooftop24_lzsa ; next
|
|
.byte 128+110 ; .word rooftop25_lzsa ; next
|
|
.byte 128+100 ; .word rooftop26_lzsa ; next
|
|
.byte 128+110 ; .word rooftop27_lzsa ; next
|
|
.byte 128+110 ; .word rooftop28_lzsa ; next
|
|
.byte 128+100 ; .word rooftop29_lzsa ; next
|
|
.byte 0 ; finish
|
|
|
|
wing_sequence:
|
|
.byte 255 ; load to bg
|
|
.word wing_bg_lzsa ; this
|
|
.byte 128+60 ; .word left_unfurl1_lzsa ; next
|
|
.byte 128+40 ; .word left_unfurl2_lzsa ; next
|
|
.byte 128+60 ; .word right_unfurl1_lzsa ; next
|
|
.byte 128+40 ; .word right_unfurl2_lzsa ; next
|
|
.byte 128+40 ; .word onboard_lzsa ; next
|
|
.byte 0 ; finish
|
|
|
|
flying_sequence:
|
|
.byte 255 ; load to bg
|
|
.word sky_bg_lzsa ; this
|
|
.byte 128+50 ; .word flying01_lzsa ; next
|
|
.byte 128+50 ; .word flying03_lzsa ; next
|
|
.byte 128+50 ; .word flying05_lzsa ; next
|
|
.byte 128+50 ; .word flying07_lzsa ; next
|
|
.byte 128+50 ; .word flying09_lzsa ; next
|
|
.byte 128+50 ; .word flying11_lzsa ; next
|
|
.byte 128+50 ; .word the_end01_lzsa ; next
|
|
.byte 128+50 ; .word the_end02_lzsa ; next
|
|
.byte 128+50 ; .word the_end03_lzsa ; next
|
|
.byte 128+50 ; .word the_end04_lzsa ; next
|
|
.byte 128+50 ; .word the_end05_lzsa ; next
|
|
.byte 128+50 ; .word the_end06_lzsa ; next
|
|
.byte 128+50 ; .word the_end07_lzsa ; next
|
|
.byte 128+120 ; .word the_end08_lzsa ; next
|
|
.byte 128+50 ; .word the_end09_lzsa ; next
|
|
.byte 128+50 ; .word the_end10_lzsa ; next
|
|
.byte 0 ; finish
|
|
|
|
|
|
.include "credits.s"
|
|
|
|
|
|
.include "../text_print.s"
|
|
.include "../gr_pageflip.s"
|
|
.include "../decompress_fast_v2.s"
|
|
.include "../gr_fast_clear.s"
|
|
.include "../gr_copy.s"
|
|
.include "../gr_offsets.s"
|
|
.include "../gr_overlay.s"
|
|
.include "../gr_run_sequence2.s"
|
|
|
|
.include "../pt3_player/pt3_lib_core.s"
|
|
.include "../pt3_player/pt3_lib_init.s"
|
|
.include "../pt3_player/interrupt_handler.s"
|
|
.include "../pt3_player/pt3_lib_mockingboard_detect.s"
|
|
.include "../pt3_player/pt3_lib_mockingboard_setup.s"
|
|
|
|
; backgrounds
|
|
.include "graphics/ending/ootw_c16_end.inc"
|
|
|
|
PT3_LOC = song
|
|
|
|
; must be page aligned
|
|
.align 256
|
|
song:
|
|
.incbin "music/ootw_outro.pt3"
|