mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-11-08 16:07:14 +00:00
ab89580e69
not as good as I'd like and an annoying pause, but out of time
658 lines
11 KiB
ArmAsm
658 lines
11 KiB
ArmAsm
; Monkey Title
|
|
|
|
; by deater (Vince Weaver) <vince@deater.net>
|
|
|
|
; Zero Page
|
|
.include "zp.inc"
|
|
.include "hardware.inc"
|
|
.include "common_defines.inc"
|
|
|
|
music_start = $4800
|
|
|
|
title_start:
|
|
;===================
|
|
; init screen
|
|
jsr TEXT
|
|
jsr HOME
|
|
bit KEYRESET
|
|
|
|
bit SET_GR
|
|
bit PAGE0
|
|
bit LORES
|
|
bit FULLGR
|
|
|
|
lda #0
|
|
sta clear_all_color+1
|
|
jsr clear_all
|
|
|
|
lda #0
|
|
sta ANIMATE_FRAME
|
|
sta FRAMEL
|
|
sta FRAMEH
|
|
sta DISP_PAGE
|
|
sta CREDITS_OFFSET
|
|
sta CREDITS_LOGO_ON
|
|
sta CREDITS_SPLIT_SCREEN
|
|
sta CREDITS_DISPLAY_TEXT
|
|
|
|
lda #14
|
|
sta CLOUD_X
|
|
|
|
lda #4
|
|
sta DRAW_PAGE
|
|
|
|
jsr normal_text
|
|
|
|
;====================================
|
|
; load LF logo
|
|
;====================================
|
|
|
|
lda #<logo_lzsa
|
|
sta LZSA_SRC_LO
|
|
lda #>logo_lzsa
|
|
sta LZSA_SRC_HI
|
|
lda #$c ; load to page $c00
|
|
jsr decompress_lzsa2_fast
|
|
|
|
;=====================================
|
|
; load text overlay
|
|
;=====================================
|
|
|
|
lda #<monkey_lzsa
|
|
sta LZSA_SRC_LO
|
|
lda #>monkey_lzsa
|
|
sta LZSA_SRC_HI
|
|
lda #$44 ; load to page $4800-400=$4400
|
|
jsr decompress_lzsa2_fast
|
|
|
|
;=====================================
|
|
; setup music
|
|
;=====================================
|
|
|
|
setup_music:
|
|
; decompress music
|
|
|
|
lda #<theme_lzsa
|
|
sta LZSA_SRC_LO
|
|
lda #>theme_lzsa
|
|
sta LZSA_SRC_HI
|
|
lda #$48 ; load to page $4800
|
|
jsr decompress_lzsa2_fast
|
|
|
|
jsr mockingboard_detect
|
|
|
|
|
|
;====================================
|
|
;====================================
|
|
; Main LOGO loop
|
|
;====================================
|
|
;====================================
|
|
|
|
logo_loop:
|
|
|
|
; copy over background
|
|
|
|
jsr gr_copy_to_current
|
|
|
|
; draw sparks
|
|
|
|
lda FRAMEH ; only do this once
|
|
bne done_sparks
|
|
|
|
ldy #0
|
|
spark_loop:
|
|
lda sparks,Y
|
|
bmi done_sparks
|
|
|
|
sta XPOS
|
|
iny
|
|
|
|
lda sparks,Y
|
|
sta YPOS
|
|
iny
|
|
|
|
; calc which spark
|
|
|
|
lda sparks,Y
|
|
sta TEMPY
|
|
|
|
sec
|
|
lda FRAMEL
|
|
sbc TEMPY ; negative if too soon
|
|
bmi draw_empty_sprite
|
|
cmp #5 ; over 5 if done
|
|
bcs draw_empty_sprite
|
|
|
|
asl
|
|
tax
|
|
lda spark_sprites,X
|
|
sta INL
|
|
lda spark_sprites+1,X
|
|
jmp draw_spark_sprite
|
|
|
|
draw_empty_sprite:
|
|
lda #<empty_sprite
|
|
sta INL
|
|
lda #>empty_sprite
|
|
|
|
draw_spark_sprite:
|
|
sta INH
|
|
|
|
iny
|
|
tya
|
|
pha
|
|
|
|
jsr put_sprite_crop
|
|
|
|
pla
|
|
tay
|
|
|
|
jmp spark_loop
|
|
|
|
done_sparks:
|
|
|
|
; flip page
|
|
|
|
jsr page_flip
|
|
|
|
; incrememnt frame
|
|
|
|
jsr inc_frame
|
|
|
|
; if it's been x seconds then go to next part
|
|
lda FRAMEL
|
|
cmp #$50
|
|
beq do_monkey_loop
|
|
|
|
; early escape if keypressed
|
|
lda KEYPRESS
|
|
bpl do_logo_loop
|
|
|
|
jmp done_with_title
|
|
|
|
do_logo_loop:
|
|
|
|
; delay
|
|
lda #200
|
|
jsr WAIT
|
|
|
|
jmp logo_loop
|
|
|
|
|
|
;====================================
|
|
;====================================
|
|
; Intro
|
|
;====================================
|
|
;====================================
|
|
|
|
;====================================
|
|
; load Background logo
|
|
;====================================
|
|
do_monkey_loop:
|
|
lda #<title_lzsa
|
|
sta LZSA_SRC_LO
|
|
lda #>title_lzsa
|
|
sta LZSA_SRC_HI
|
|
lda #$c ; load to page $c00
|
|
jsr decompress_lzsa2_fast
|
|
|
|
monkey_loop:
|
|
jsr gr_copy_to_current
|
|
|
|
; draw cloud
|
|
|
|
lda CLOUD_X
|
|
sta XPOS
|
|
lda #4
|
|
sta YPOS
|
|
|
|
lda #<cloud_sprite
|
|
sta INL
|
|
lda #>cloud_sprite
|
|
sta INH
|
|
|
|
jsr put_sprite_crop
|
|
|
|
; draw mountain top back over cloud
|
|
|
|
lda #13
|
|
sta XPOS
|
|
lda #4
|
|
sta YPOS
|
|
|
|
lda #<mountain_top_sprite
|
|
sta INL
|
|
lda #>mountain_top_sprite
|
|
sta INH
|
|
|
|
jsr put_sprite_crop
|
|
|
|
|
|
; copy title overlay
|
|
lda CREDITS_LOGO_ON
|
|
beq dont_overlay
|
|
|
|
jsr gr_overlay_40x40_noload
|
|
dont_overlay:
|
|
|
|
;=======================
|
|
; draw text if enabled
|
|
|
|
lda CREDITS_DISPLAY_TEXT
|
|
beq dont_text
|
|
|
|
jsr clear_bottom
|
|
lda CREDITS_TEXTL
|
|
sta OUTL
|
|
lda CREDITS_TEXTH
|
|
sta OUTH
|
|
jsr move_and_print
|
|
jsr move_and_print
|
|
jsr move_and_print
|
|
|
|
dont_text:
|
|
|
|
;===========
|
|
; page flip
|
|
|
|
jsr page_flip
|
|
|
|
jsr inc_frame
|
|
|
|
;================
|
|
; delay
|
|
;================
|
|
|
|
lda #200
|
|
jsr WAIT
|
|
|
|
;=========================
|
|
; update credits sequence
|
|
;=========================
|
|
|
|
jsr update_credit_sequence
|
|
|
|
;============================
|
|
; early escape if end of song
|
|
|
|
lda DONE_PLAYING
|
|
bmi done_with_title
|
|
|
|
;===========================
|
|
; early escape if keypressed
|
|
lda KEYPRESS
|
|
bpl loop_again
|
|
|
|
jmp done_with_title
|
|
|
|
loop_again:
|
|
|
|
;===============
|
|
; move cloud
|
|
;===============
|
|
|
|
lda FRAMEL
|
|
and #$7
|
|
bne dont_move_cloud
|
|
|
|
dec CLOUD_X
|
|
dont_move_cloud:
|
|
|
|
jmp monkey_loop
|
|
|
|
|
|
;==========================
|
|
; turn off music
|
|
;==========================
|
|
done_with_title:
|
|
bit KEYRESET ; clear keypress
|
|
sei ; clear interrupts
|
|
|
|
jsr clear_ay_both ; silence ay-3-8910 chips
|
|
|
|
;==========================
|
|
; load main program
|
|
;==========================
|
|
totally_done:
|
|
lda #LOAD_MONKEY
|
|
sta WHICH_LOAD
|
|
|
|
rts
|
|
|
|
;==========================
|
|
; includes
|
|
;==========================
|
|
|
|
; level graphics
|
|
.include "graphics_intro/title_graphics.inc"
|
|
|
|
.include "text_print.s"
|
|
.include "gr_offsets.s"
|
|
.include "gr_fast_clear.s"
|
|
.include "gr_copy.s"
|
|
.include "gr_putsprite_crop.s"
|
|
.include "gr_pageflip.s"
|
|
.include "gr_overlay.s"
|
|
.include "decompress_fast_v2.s"
|
|
|
|
.include "ym_play.s"
|
|
.include "interrupt_handler.s"
|
|
.include "mockingboard.s"
|
|
|
|
|
|
;====================================
|
|
; inc frame count
|
|
;====================================
|
|
inc_frame:
|
|
inc FRAMEL
|
|
bne room_frame_no_oflo
|
|
inc FRAMEH
|
|
room_frame_no_oflo:
|
|
rts
|
|
|
|
|
|
; music is compressed
|
|
; decompressed it is 30720 bytes
|
|
; we decompress to $4800
|
|
; so total size of our code can't be biggr than $2800 = 10k
|
|
|
|
theme_lzsa:
|
|
.incbin "music/theme.lzsa"
|
|
|
|
spark_sprites:
|
|
.word empty_sprite
|
|
.word spark0_sprite
|
|
.word spark1_sprite
|
|
.word spark2_sprite
|
|
.word spark1_sprite
|
|
.word spark0_sprite
|
|
|
|
empty_sprite:
|
|
.byte 1,1
|
|
.byte $AA
|
|
|
|
spark0_sprite:
|
|
.byte 3,2
|
|
.byte $AA,$AA,$AA
|
|
.byte $AA,$AF,$AA
|
|
|
|
spark1_sprite:
|
|
.byte 3,2
|
|
.byte $AA,$3A,$AA
|
|
.byte $A3,$3F,$A3
|
|
|
|
spark2_sprite:
|
|
.byte 3,3
|
|
.byte $AA,$b3,$AA
|
|
.byte $Ab,$bF,$Ab
|
|
.byte $Aa,$a3,$Aa
|
|
|
|
; spark locations (grow+shrink)
|
|
|
|
sparks:
|
|
; X,Y timestamp
|
|
.byte 0,10, 32 ; first: 0,10
|
|
.byte 3,26, 34 ; second: 3,26
|
|
.byte 6,10, 36 ; third: 6,10
|
|
.byte 6,28, 38 ; 4th 6,28
|
|
.byte 10,14, 40 ; 5th 10,14
|
|
.byte 15,22, 42 ; 6th 15,22
|
|
.byte 19,14, 44 ; 7th 19,14
|
|
.byte 25,24, 46 ; 8th 25,24
|
|
.byte 28,10, 48 ; 9th 28,10
|
|
.byte 32,30, 50 ; 10th 32,30
|
|
.byte 37,10, 52 ; 11th 37,10
|
|
.byte $ff
|
|
|
|
|
|
cloud_sprite:
|
|
.byte 40,6
|
|
;line 1
|
|
.byte $AA,$AA,$AA,$AA,$AA,$AA,$AA,$A5,$AA,$AA
|
|
.byte $AA,$AA,$AA,$AA,$5A,$5A,$7A,$75,$55,$05
|
|
.byte $5A,$AA,$AA,$AA,$77,$5A,$AA,$AA,$AA,$AA
|
|
.byte $AA,$AA,$AA,$AA,$AA,$AA,$5A,$5A,$AA,$AA
|
|
;line 2
|
|
.byte $7A,$7A,$77,$7A,$7A,$77,$7A,$77,$7A,$AA
|
|
.byte $AA,$5A,$5A,$57,$07,$77,$55,$05,$50,$05
|
|
.byte $77,$00,$5A,$AA,$A5,$A5,$AA,$AA,$AA,$AA
|
|
.byte $7A,$AA,$AA,$AA,$A5,$AA,$77,$07,$77,$AA
|
|
;line 3
|
|
.byte $A5,$A7,$55,$05,$50,$55,$05,$05,$55,$57
|
|
.byte $57,$50,$57,$57,$70,$07,$77,$75,$50,$55
|
|
.byte $55,$55,$00,$07,$7A,$77,$77,$77,$AA,$57
|
|
.byte $77,$AA,$5A,$77,$7A,$5A,$07,$75,$05,$AA
|
|
;line 4
|
|
.byte $AA,$AA,$A7,$57,$57,$57,$07,$75,$75,$75
|
|
.byte $70,$00,$75,$55,$75,$70,$77,$77,$50,$05
|
|
.byte $07,$55,$75,$75,$07,$57,$50,$00,$50,$05
|
|
.byte $77,$7A,$70,$07,$77,$77,$75,$70,$75,$5A
|
|
;line 5
|
|
.byte $AA,$AA,$AA,$AA,$AA,$A5,$A5,$AA,$A0,$A5
|
|
.byte $A5,$A5,$A5,$A5,$A5,$A5,$05,$55,$57,$55
|
|
.byte $55,$57,$57,$00,$57,$57,$55,$07,$07,$57
|
|
.byte $50,$77,$77,$50,$07,$77,$77,$77,$77,$55
|
|
;line 6
|
|
.byte $AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA,$AA
|
|
.byte $AA,$AA,$AA,$AA,$AA,$AA,$AA,$A0,$A5,$A5
|
|
.byte $A5,$A5,$A5,$A0,$AA,$A5,$55,$55,$55,$55
|
|
.byte $55,$A5,$A5,$A7,$A5,$A5,$A5,$A5,$A5,$A0
|
|
|
|
mountain_top_sprite:
|
|
.byte 11,6
|
|
.byte $AA,$AA,$AA,$AA,$8A,$98,$8A,$AA,$AA,$AA,$AA
|
|
.byte $AA,$AA,$2A,$20,$25,$2d,$25,$70,$2A,$AA,$AA
|
|
.byte $AA,$AA,$22,$00,$00,$00,$27,$70,$22,$22,$AA
|
|
.byte $AA,$AA,$22,$20,$00,$00,$22,$00,$77,$22,$AA
|
|
.byte $AA,$2A,$22,$22,$00,$00,$22,$07,$70,$00,$AA
|
|
.byte $2A,$22,$00,$22,$00,$22,$02,$22,$07,$70,$0A
|
|
|
|
; FRAMEH, FRAMEL, ACTION
|
|
ACTION_SPLIT_SCREEN = $80
|
|
ACTION_FULL_SCREEN = $81
|
|
ACTION_TURN_ON_LOGO = $82
|
|
ACTION_TURN_OFF_LOGO = $83
|
|
|
|
; 1 E0 is roughly end
|
|
credits_sequence:
|
|
.byte $00,$6F,ACTION_SPLIT_SCREEN
|
|
.byte $00,$70,1
|
|
.byte $00,$80,2
|
|
.byte $00,$A0,ACTION_FULL_SCREEN
|
|
.byte $00,$B0,0
|
|
.byte $00,$B5,ACTION_TURN_ON_LOGO
|
|
.byte $00,$B7,ACTION_SPLIT_SCREEN
|
|
|
|
.byte $00,$B8,3
|
|
.byte $00,$C8,0
|
|
|
|
.byte $00,$D0,4
|
|
.byte $00,$E0,0
|
|
|
|
.byte $00,$E8,5
|
|
.byte $00,$F8,0
|
|
|
|
.byte $01,$00,6
|
|
.byte $01,$10,0
|
|
|
|
.byte $01,$18,7
|
|
.byte $01,$28,0
|
|
|
|
.byte $01,$30,8
|
|
.byte $01,$40,0
|
|
|
|
.byte $01,$48,9
|
|
.byte $01,$58,0
|
|
|
|
.byte $01,$60,10
|
|
.byte $01,$70,0
|
|
|
|
.byte $01,$78,11
|
|
.byte $01,$88,0
|
|
|
|
.byte $01,$90,12
|
|
.byte $01,$A0,0
|
|
|
|
.byte $01,$A8,ACTION_FULL_SCREEN
|
|
|
|
.byte $01,$B0,ACTION_TURN_OFF_LOGO
|
|
|
|
.byte $ff
|
|
|
|
|
|
credits_text:
|
|
.word credits_nothing
|
|
.word credits1,credits2,credits3,credits4
|
|
.word credits5,credits6,credits7,credits8
|
|
.word credits9,credits10,credits11,credits12
|
|
|
|
|
|
credits1: ;0123456789012345678901234567890123456789
|
|
.byte 10,21,"DEEP IN THE CARIBBEAN",0
|
|
.byte 10,22," ",0
|
|
.byte 10,23," ",0
|
|
|
|
credits2:
|
|
.byte 10,20," ^ ,",0
|
|
.byte 10,21,"THE ISLAND OF MELEE",0
|
|
.byte 10,22," ",0
|
|
|
|
; TITLE CARD APPEARS
|
|
credits3:
|
|
.byte 10,20," ",0
|
|
.byte 7,21,"TM & (C) 1990 LUCAS ARTS",0
|
|
.byte 10,22,"ALL RIGHTS RESERVED",0
|
|
|
|
credits4:
|
|
.byte 10,20," ",0
|
|
.byte 9,21,"CREATED AND DESIGNED BY",0
|
|
.byte 15,22,"RON GILBERT",0
|
|
|
|
credits5:
|
|
.byte 7,21,"WRITTEN AND PROGRAMMED BY",0
|
|
.byte 7,22,"RON GILBERT, DAVE GROSSMAN",0
|
|
.byte 12,23,"AND TIM SCHAFER",0
|
|
|
|
credits6:
|
|
.byte 11,21,"BACKGROUND ART BY",0
|
|
.byte 6,22,"STEVE PURCELL, MARK FERRARI",0
|
|
.byte 13,23,"AND MIKE EBERT",0
|
|
|
|
credits7:
|
|
.byte 13,21,"ANIMATION BY",0
|
|
.byte 7,22,"STEVE PURCELL, MIKE EBERT",0
|
|
.byte 5,23,"AND MARTIN CAMERON AS 'BUCKY'",0
|
|
|
|
credits8:
|
|
.byte 10,20," ",0
|
|
.byte 11,21,"ORIGINAL MUSIC BY",0
|
|
.byte 13,22,"MICHAEL LAND",0
|
|
|
|
credits9:
|
|
.byte 10,20," ",0
|
|
.byte 6,21,"BARNEY JONES AND ANDY NEWELL",0
|
|
.byte 8,22,"OF EARWAX PRODUCTIONS...",0
|
|
|
|
credits10:
|
|
.byte 10,20," ",0
|
|
.byte 16,21,"... AND",0
|
|
.byte 13,22,"PATRICK MUNDY",0
|
|
|
|
; TESTERS, PRODUCER, SCUMM
|
|
|
|
credits11:
|
|
.byte 10,20," ",0
|
|
.byte 11,21,"APPLE II VERSION",0
|
|
.byte 9,22,"VINCE 'DEATER' WEAVER",0
|
|
|
|
credits12:
|
|
.byte 10,20," ",0
|
|
.byte 10,21,"CPC AY-3-8910 THEME",0
|
|
.byte 9,22,"EPYTEOR/SUTEKH/STARKOS",0
|
|
|
|
credits_nothing:
|
|
.byte 10,20," ",0
|
|
.byte 10,21," ",0
|
|
.byte 10,22," ",0
|
|
|
|
|
|
;=========================
|
|
; update credits sequence
|
|
;=========================
|
|
update_credit_sequence:
|
|
|
|
ldy CREDITS_OFFSET
|
|
cpy #$ff
|
|
beq done_credit_sequence
|
|
|
|
; see if we've hit FRAMEH
|
|
lda credits_sequence,Y
|
|
cmp FRAMEH
|
|
bne done_credit_sequence
|
|
|
|
lda credits_sequence+1,Y
|
|
cmp FRAMEL
|
|
bne done_credit_sequence
|
|
|
|
; made it this far, we actually need to update!
|
|
lda credits_sequence+2,Y
|
|
iny
|
|
iny
|
|
iny
|
|
sty CREDITS_OFFSET
|
|
|
|
cmp #ACTION_SPLIT_SCREEN
|
|
beq do_split_screen
|
|
cmp #ACTION_FULL_SCREEN
|
|
beq do_full_screen
|
|
cmp #ACTION_TURN_ON_LOGO
|
|
beq do_turn_on_logo
|
|
cmp #ACTION_TURN_OFF_LOGO
|
|
beq do_turn_off_logo
|
|
bne do_update_text
|
|
|
|
done_credit_sequence:
|
|
rts
|
|
|
|
do_split_screen:
|
|
bit TEXTGR
|
|
|
|
lda #1
|
|
sta CREDITS_DISPLAY_TEXT
|
|
lda #<credits_nothing
|
|
sta CREDITS_TEXTL
|
|
lda #>credits_nothing
|
|
sta CREDITS_TEXTH
|
|
|
|
rts
|
|
|
|
do_full_screen:
|
|
lda #0
|
|
sta CREDITS_DISPLAY_TEXT
|
|
bit FULLGR
|
|
rts
|
|
|
|
do_turn_on_logo:
|
|
lda #1
|
|
sta CREDITS_LOGO_ON
|
|
rts
|
|
|
|
do_turn_off_logo:
|
|
lda #0
|
|
sta CREDITS_LOGO_ON
|
|
rts
|
|
|
|
do_update_text:
|
|
; A has string offset
|
|
|
|
asl
|
|
tay
|
|
lda credits_text,Y
|
|
sta CREDITS_TEXTL
|
|
lda credits_text+1,Y
|
|
sta CREDITS_TEXTH
|
|
|
|
rts
|
|
|
|
|