ys2-intro/loader/samples/minexample/minexample.s

1886 lines
26 KiB
ArmAsm
Raw Normal View History

2025-11-13 11:07:39 -05:00
.feature c_comments
.include "../../build/loadersymbols-c64.inc"
.ZEROPAGE
.org $10
bmp_delay: .res 1
bmp_addr: .res 2
bmp_ptr: .res 2
scr_ptr_lo: .res 1
scr_ptr: .res 2
cram_ptr: .res 2
chr_count: .res 1
vbl: .res 1
frame: .res 1
cur_frame: .res 1
frame_delay: .res 1
frame_until: .res 1
2025-11-15 15:15:48 -05:00
text_ptr: .res 2
2025-11-16 16:03:39 -05:00
timer: .res 2
timer_limit: .res 2
timer_reached: .res 2
timer_mode: .res 1
2025-11-27 16:15:00 -05:00
enable_music: .res 1
2025-11-17 08:37:55 -05:00
temp: .res 3
2025-11-15 15:15:48 -05:00
aart_lz_buffer := $fd00
.include "lz_zp.asm"
2025-11-13 11:07:39 -05:00
2025-11-15 16:55:16 -05:00
CODE_START_ADDR = $e000
2025-11-13 11:07:39 -05:00
.segment "CODE"
ZP=$e0
offset = ZP+0
ZX0_src = ZP+2
ZX0_dst = ZP+4
bitr = ZP+6
pntr = ZP+7
.org $080d
2025-11-15 16:55:16 -05:00
copy_start:
2025-11-13 11:07:39 -05:00
sei
lda #$35
sta $01
2025-11-15 16:55:16 -05:00
lda #<CODE_START_ADDR
sta $fc
lda #>CODE_START_ADDR
sta $fd
lda #<code_start
sta $fa
lda #>code_start
sta $fb
ldy #0
2025-11-22 12:09:53 -05:00
ldx #>(code_end-CODE_START_ADDR)
beq :+++
:
2025-11-15 16:55:16 -05:00
lda ($fa), y
sta ($fc), y
2025-11-22 12:09:53 -05:00
iny
bne :-
2025-11-15 16:55:16 -05:00
inc $fb
2025-11-22 12:09:53 -05:00
inc $fd
dex
bne :-
beq :+
2025-11-15 16:55:16 -05:00
:
2025-11-22 12:09:53 -05:00
lda ($fa), y
sta ($fc), y
iny
2025-11-15 16:55:16 -05:00
:
2025-11-22 12:09:53 -05:00
cpy #<(code_end-CODE_START_ADDR)
bne :--
2025-11-15 16:55:16 -05:00
lda #$36
sta $01
cli
jsr install
sei
lda #$35
sta $01
2025-11-22 17:55:00 -05:00
jmp CODE_START_ADDR
2025-11-15 16:55:16 -05:00
.res loadraw - *
.incbin "../../build/loader-c64.prg", 2
.res install - *
.incbin "../../build/install-c64.prg", 2
code_start:
.org CODE_START_ADDR
sei
2025-11-27 12:32:13 -05:00
lda #$0b
sta $d011
2025-11-13 11:07:39 -05:00
lda #0
2025-11-27 12:32:13 -05:00
sta $d020
2025-11-13 11:07:39 -05:00
sta ZX0_dst+0
2025-11-27 16:15:00 -05:00
sta enable_music
2025-11-27 12:32:13 -05:00
jsr load_font
jsr init_2x
jsr clr_txt
ldx #<copyright
ldy #>copyright
jsr write_txt3
2025-11-27 14:47:40 -05:00
ldx #$00
2025-11-27 12:32:13 -05:00
ldy #$01
jsr init_timer
lda #1
sta timer_mode
2025-11-13 11:07:39 -05:00
ldx #<badguy
ldy #>badguy
2025-11-22 12:09:53 -05:00
jsr load_8000_zx02_2000
2025-11-13 11:07:39 -05:00
2025-11-27 12:32:13 -05:00
:
lda timer_reached
beq :-
2025-11-13 11:07:39 -05:00
2025-11-27 14:47:40 -05:00
ldx #$90
ldy #$01
2025-11-27 12:32:13 -05:00
jsr txt_fade_out
2025-11-13 11:07:39 -05:00
2025-11-27 12:32:13 -05:00
sei
jsr set_irq_badguy
2025-11-13 11:07:39 -05:00
lda #1
sta $d01a
sta bmp_delay
jsr init_bmp
lda #0
sta vbl
cli
jsr intro
2025-11-15 16:55:16 -05:00
lda #$0b
sta $d011
sei
ldx #<introname
ldy #>introname
lda #$10
2025-11-22 12:09:53 -05:00
jsr load_8000_zx02
2025-11-15 16:55:16 -05:00
2025-11-26 07:42:34 -05:00
ldx #<song0name
ldy #>song0name
lda #$a0
jsr load_8000_zx02
2025-11-15 16:55:16 -05:00
lda #<fake_kernal_irq
sta $fffe
lda #>fake_kernal_irq
sta $ffff
2025-11-27 16:15:00 -05:00
inc enable_music
2025-11-15 16:55:16 -05:00
jsr run_nufli_bmp
sei
jsr init_2x
2025-11-16 16:03:39 -05:00
lda #$0b
sta $d011
2025-11-17 05:20:59 -05:00
2025-11-16 16:03:39 -05:00
jsr clr_txt
ldx #<story_writ
ldy #>story_writ
jsr write_txt3
ldx #$30
ldy #$01
jsr init_timer
lda #1
sta timer_mode
2025-11-27 12:32:13 -05:00
ldx #<towername
ldy #>towername
jsr load_8000_zx02_2000
2025-11-16 16:03:39 -05:00
:
lda timer_reached
beq :-
ldx #$b8
ldy #$01
2025-11-27 12:32:13 -05:00
jsr txt_fade_out
2025-11-16 16:03:39 -05:00
jsr init_bmp
lda #0
sta vbl
lda #$11
sta frame_until
jsr wait_frame_until_2x
ldx #$6c
:
jsr wait_frame
jsr wait_frame
dex
bpl :-
lda #$0b
sta $d011
2025-11-17 05:20:59 -05:00
jsr clr_txt
ldx #<scenario_writ
ldy #>scenario_writ
jsr write_txt2
ldx #$80
ldy #$01
jsr init_timer
lda #1
sta timer_mode
ldx #<towerbeamname
ldy #>towerbeamname
2025-11-22 12:09:53 -05:00
jsr load_8000_zx02_2000
2025-11-17 05:20:59 -05:00
:
lda timer_reached
beq :-
ldx #$90
ldy #$01
2025-11-27 12:32:13 -05:00
jsr txt_fade_out
2025-11-17 05:20:59 -05:00
jsr init_bmp
lda #0
sta vbl
2025-11-17 08:37:55 -05:00
lda #$0d
2025-11-17 05:20:59 -05:00
sta frame_until
jsr wait_frame_until_2x
2025-11-17 08:37:55 -05:00
lda bmp_addr
sta temp
lda bmp_addr+1
sta temp+1
lda cur_frame
sta temp+2
ldx #17
:
txa
pha
lda temp+2
sta cur_frame
lda temp
sta bmp_addr
lda temp+1
sta bmp_addr+1
lda #$0d+3
sta frame_until
jsr wait_frame_until_2x
pla
tax
dex
bpl :-
lda #$0b
sta $d011
jsr clr_txt
ldx #<prog_writ
ldy #>prog_writ
jsr write_txt2
ldx #$a8
ldy #$01
jsr init_timer
lda #1
sta timer_mode
2025-11-17 05:20:59 -05:00
2025-11-17 08:37:55 -05:00
ldx #<fieldname
ldy #>fieldname
2025-11-22 12:09:53 -05:00
jsr load_8000_zx02_2000
2025-11-17 08:37:55 -05:00
:
lda timer_reached
beq :-
ldx #$48
ldy #$01
2025-11-27 12:32:13 -05:00
jsr txt_fade_out
2025-11-17 08:37:55 -05:00
jsr init_bmp
lda #0
sta vbl
lda #$08
sta frame_until
jsr wait_frame_until_2x
lda bmp_addr
sta temp
lda bmp_addr+1
sta temp+1
lda cur_frame
sta temp+2
ldx #2
:
txa
pha
lda temp+2
sta cur_frame
lda temp
sta bmp_addr
lda temp+1
sta bmp_addr+1
lda #$08+8
sta frame_until
jsr wait_frame_until_2x
pla
tax
dex
bpl :-
lda #0
sta vbl
lda #$27
sta frame_until
jsr wait_frame_until_2x
2025-11-17 14:16:02 -05:00
ldx #25
:
jsr wait_frame
dex
bpl :-
lda #$0b
sta $d011
jsr clr_txt
ldx #<gart_writ
ldy #>gart_writ
jsr write_txt5
ldx #$80
ldy #$01
jsr init_timer
lda #1
sta timer_mode
ldx #<fallingstarname
ldy #>fallingstarname
2025-11-22 12:09:53 -05:00
jsr load_8000_zx02_2000
2025-11-17 14:16:02 -05:00
:
lda timer_reached
beq :-
ldx #$48
ldy #$01
2025-11-27 12:32:13 -05:00
jsr txt_fade_out
2025-11-17 14:16:02 -05:00
jsr init_bmp
lda #$1d
sta frame_until
jsr wait_frame_until_2x
ldx #5
:
jsr wait_frame
dex
bpl :-
lda #$0b
sta $d011
jsr clr_txt
ldx #<music_writ
ldy #>music_writ
jsr write_txt4
ldx #$80
ldy #$01
jsr init_timer
lda #1
sta timer_mode
ldx #<lilianame
ldy #>lilianame
2025-11-22 12:09:53 -05:00
jsr load_8000_zx02_2000
2025-11-17 14:16:02 -05:00
:
lda timer_reached
beq :-
ldx #$10
ldy #$01
lda #8*11
2025-11-27 14:47:40 -05:00
jsr txt_fade_out_offset
2025-11-17 14:16:02 -05:00
2025-11-17 14:43:56 -05:00
ldx #$c4
ldy #$01
jsr init_timer
2025-11-17 14:16:02 -05:00
jsr init_bmp
lda #$08
sta frame_until
jsr wait_frame_until_2x
2025-11-17 14:43:56 -05:00
:
lda timer_reached
beq :-
lda #$0b
sta $d011
2025-11-17 14:43:56 -05:00
jsr clr_txt
ldx #<scene_writ
ldy #>scene_writ
jsr write_txt3
ldx #$80
ldy #$01
jsr init_timer
lda #1
sta timer_mode
ldx #<liliaheroname
ldy #>liliaheroname
2025-11-22 12:09:53 -05:00
jsr load_8000_zx02_2000
2025-11-17 14:43:56 -05:00
:
lda timer_reached
beq :-
ldx #$20
ldy #$01
2025-11-27 12:32:13 -05:00
jsr txt_fade_out
2025-11-17 14:43:56 -05:00
2025-11-27 13:08:51 -05:00
jsr init_bmp
ldx #4
:
lda #0
sta vbl
lda #60
:
cmp vbl
bne :-
dex
bpl :--
2025-11-22 12:09:53 -05:00
part_9:
; $0400-$07ff buffer 0 tilemap
; $2000-$3fff buffer 0 bitmap
; $4000-$5fff buffer 1 bitmap
; $6000-$63ff buffer 1 tilemap
; $6400-$6417 next buffer CRAM
; $7000-$77ff tileset bitmap
; $7800-$78ff tileset tile colors
; $7900-$79ff tileset CRAM colors
; $9000- compressed tilemap
2025-11-27 13:08:51 -05:00
jsr clr_txt
ldx #<art_direct
ldy #>art_direct
jsr write_txt2
ldx #$c0
ldy #$01
jsr init_timer
lda #1
sta timer_mode
2025-11-24 13:03:37 -05:00
ldx #<islandname
ldy #>islandname
lda #$70
jsr load_8000_zx02
2025-11-24 13:03:37 -05:00
ldx #<islandmapname
ldy #>islandmapname
jsr loadraw
ldx #0
ldy #$90
jsr LZ_init_decomp
2025-11-27 13:08:51 -05:00
:
lda timer_reached
beq :-
ldx #$90
ldy #$01
lda #8
2025-11-27 14:47:40 -05:00
jsr txt_fade_out_offset
2025-11-27 13:08:51 -05:00
lda #0
sta $d011
jsr clear_2bufs
2025-11-22 12:09:53 -05:00
2025-11-22 17:55:00 -05:00
; set up sprites to cover scrolling
lda #$ff
ldx #0
: sta $2000,x
sta $4000,x
inx
bne :-
.repeat 4, I
ldx #I*48+$58
stx $d000+I*2
stx $d008+I*2
.endrepeat
ldx #6
:
lda #$42
sta $d001,x
lda #$d7
sta $d009,x
dex
dex
bpl :-
ldx #7
:
lda #$80
sta $07f8,x
2025-11-22 17:55:00 -05:00
lda #0
sta $63f8,x
sta $d027,x
dex
bpl :-
stx $d01d
stx $d015
inx
stx $d010
stx $d017
stx $d01b
stx $d01c
stx frame
lda #$18
2025-11-22 12:09:53 -05:00
sta $d018
lda #<((17+4)*40+$408)
2025-11-22 12:09:53 -05:00
sta text_ptr
lda #>((17+4)*40+$408)
2025-11-22 12:09:53 -05:00
sta text_ptr+1
ldx #16
:
lda #0
lda text_ptr
sec
sbc #40
sta text_ptr
sta scr_ptr
sta cram_ptr
sta bmp_ptr
lda text_ptr+1
sbc #0
sta text_ptr+1
sta scr_ptr+1
; carry is always set here
adc #$d8-$04-1
2025-11-22 12:09:53 -05:00
sta cram_ptr+1
adc #<(($20>>3)-$d8)
asl bmp_ptr
rol a
asl bmp_ptr
rol a
asl bmp_ptr
rol a
sta bmp_ptr+1
stx temp+1
jsr drawrow
ldx temp+1
dex
bpl :-
2025-11-23 11:16:42 -05:00
lda #0
sta cram_ptr
lda #$64
sta cram_ptr+1
2025-11-22 12:09:53 -05:00
:
2025-11-23 11:16:42 -05:00
lda $d011
bpl :-
lda #$38
2025-11-22 17:55:00 -05:00
sta $d011
lda #$18
sta $d016
2025-11-23 11:16:42 -05:00
lda #3
sta timer_mode
@loop:
lda #0
sta vbl
lda frame
2025-11-27 14:47:40 -05:00
cmp #$e1
bcc :+
jmp @finish
:
2025-11-23 11:16:42 -05:00
and #1
tax
jsr copybuf
jsr drawrow
:
lda vbl
cmp #32
bcc :-
; B U M R U S H C R A M C O P Y F U N K
ldy #23
: .repeat 16, I
lda $d808+(19-I)*40,y
sta $d808+(20-I)*40,y
.endrepeat
lda $6400,y
sta $d808+4*40,y
dey
bpl :-
2025-11-22 17:55:00 -05:00
inc frame
2025-11-23 11:16:42 -05:00
lda frame
lsr a
lda #$18
2025-11-23 11:16:42 -05:00
ldx #3
bcc :+
lda #$80
ldx #2
:
sta $d018
stx $dd00
jmp @loop
2025-11-23 11:16:42 -05:00
@finish:
2025-11-27 14:47:40 -05:00
ldx #$a8
ldy #$01
jsr init_timer
:
lda timer_reached
beq :-
lda #$0b
sta $d011
lda #0
2025-11-25 12:03:50 -05:00
sta $d015
2025-11-27 14:47:40 -05:00
lda #3
sta $dd00
2025-11-25 12:03:50 -05:00
; we run out of space before the fixed location vector return now
jmp part_10
2025-11-13 11:07:39 -05:00
2025-11-22 12:09:53 -05:00
drawrow:
ldy #0
charloop:
sty temp
lda #$70>>3
sta bmp_addr+1
jsr LZ_get_byte
tax
asl a
rol bmp_addr+1
asl a
rol bmp_addr+1
asl a
rol bmp_addr+1
sta bmp_addr
ldy #0
.repeat 8, I
lda (bmp_addr),y
sta (bmp_ptr),y
iny
.endrepeat
clc
lda bmp_ptr
adc #8
sta bmp_ptr
bne :+
inc bmp_ptr+1
:
ldy temp
lda $7800,x
sta (scr_ptr),y
lda $7900,x
sta (cram_ptr),y
iny
cpy #24
bne charloop
rts
2025-11-16 16:03:39 -05:00
2025-11-17 05:20:59 -05:00
intro:
lda #0
jsr sfx_init
lda #7
sta frame_until
jsr wait_frame_until
lda #64
sta frame_delay
jsr wait_loop
lda #1
jsr sfx_init
ldx #<darmtower_txt
ldy #>darmtower_txt
jsr upload_text
2025-11-21 14:59:16 -05:00
ldx #<(darmtower_txt+40)
ldy #>(darmtower_txt+40)
jsr upload_text_bottom
2025-11-17 05:20:59 -05:00
lda #50*5
sta frame_delay
jsr wait_loop
2025-11-27 14:47:40 -05:00
jsr clear_text
2025-11-17 05:20:59 -05:00
lda #$0d
sta frame_until
jsr wait_frame_until
ldx #<adol_win
ldy #>adol_win
jsr upload_text
2025-11-21 14:59:16 -05:00
ldx #<(adol_win+40)
ldy #>(adol_win+40)
jsr upload_text_bottom
2025-11-17 05:20:59 -05:00
lda #50*5
sta frame_delay
jsr wait_loop
2025-11-27 14:47:40 -05:00
jsr clear_text
2025-11-17 05:20:59 -05:00
ldx #<too_bad_txt
ldy #>too_bad_txt
jsr upload_text
lda #50*5
sta frame_delay
jsr wait_loop
2025-11-27 14:47:40 -05:00
jsr clear_text
2025-11-17 05:20:59 -05:00
lda #$13
sta frame_until
jsr wait_frame_until
lda #0
jsr sfx_init
lda #$1a
sta frame_until
jsr wait_frame_until
lda #120
sta frame_delay
2025-11-27 12:32:13 -05:00
jmp wait_loop
2025-11-17 05:20:59 -05:00
2025-11-16 16:03:39 -05:00
wait_frame:
@loop:
bit $d011
bpl @loop
@loop2:
bit $d011
bmi @loop2
rts
2025-11-15 16:55:16 -05:00
init_2x:
lda #127
sta $dc0d
and $d011
sta $d011
lda $dc0d
lda $dd0d
lda #<irq_music
sta $fffe
lda #>irq_music
sta $ffff
lda #$0b
sta $d011
lda #$00
sta $d012
2025-11-25 12:03:50 -05:00
position_2x_to_display:
2025-11-27 16:15:00 -05:00
lda #50
2025-11-25 12:03:50 -05:00
position_2x:
2025-11-22 17:55:00 -05:00
:
bit $d011
bpl :-
:
bit $d011
bmi :-
:
cmp $d012
bne :-
2025-11-15 16:55:16 -05:00
lda #0
sta $d01a
2025-11-22 17:55:00 -05:00
sta $dc0e
2025-11-15 16:55:16 -05:00
lda #$63; <(985248/100)
sta $dc04
2025-11-22 17:55:00 -05:00
lda #$26; >(985248/100)
2025-11-15 16:55:16 -05:00
sta $dc05
2025-11-22 17:55:00 -05:00
lda #$11
sta $dc0e
2025-11-15 16:55:16 -05:00
lda $dc0d
and #$81
sta $dc0d
lda #$40
sta $dc0c
lda #$81
sta $dc0d
@loop:
bit $d011
bpl @loop
@loop2:
bit $d011
bmi @loop2
cli
rts
2025-11-16 16:03:39 -05:00
init_timer:
lda #0
sta timer_reached
sta timer_mode
sta timer
sta timer+1
stx timer_limit
sty timer_limit+1
rts
fade_cols:
.byte 0, 0
.byte $0, $0, $0, $0, $b, $c, $f, $1
.res 32-10, $1
2025-11-15 16:55:16 -05:00
irq_music:
pha
txa
pha
tya
pha
2025-11-16 16:03:39 -05:00
lda $dd00
and #3
sta @dd00_arc+1
2025-11-23 11:16:42 -05:00
and #3
2025-11-16 16:03:39 -05:00
sta $dd00
inc vbl
;inc $d020
2025-11-27 16:15:00 -05:00
lda enable_music
beq :+
2025-11-15 16:55:16 -05:00
jsr $a003
2025-11-27 16:15:00 -05:00
:
2025-11-16 16:03:39 -05:00
;dec $d020
lda timer_mode
cmp #1
bne :+
lda timer+1
bne :+
lda timer
lsr
lsr
lsr
tax
lda fade_cols, x
sta $d021
:
lda timer_mode
cmp #2
bne :+
lda timer+1
bne :+
lda timer
lsr
lsr
lsr
eor #31
tax
lda fade_cols, x
sta $d021
:
inc timer
bne :+
inc timer+1
:
2025-11-27 12:32:13 -05:00
lda timer
2025-11-27 14:47:40 -05:00
sec
sbc timer_limit
lda timer+1
sbc timer_limit+1
bcc :+
2025-11-16 16:03:39 -05:00
lda #1
sta timer_reached
:
2025-11-23 11:16:42 -05:00
lda timer_mode
cmp #3
bne @timer_done
lda vbl
lsr a
bcs @timer_done
lsr a
and #7
ora #$38
sta $d011
@timer_done:
2025-11-16 16:03:39 -05:00
@dd00_arc:
lda #0
sta $dd00
2025-11-15 16:55:16 -05:00
pla
tay
pla
tax
pla
jmp $dc0c
fake_kernal_irq:
pha
txa
pha
tya
pha
tsx
lda $0104, x
and #$10
beq :+
jmp ($0314)
:
jmp ($0314) ; fuck you
2025-11-13 11:07:39 -05:00
wait_loop:
2025-11-16 16:03:39 -05:00
@loop2:
2025-11-13 11:07:39 -05:00
lda vbl
2025-11-16 16:03:39 -05:00
beq @loop2
2025-11-13 11:07:39 -05:00
lda #0
sta vbl
jsr sfx_play
dec frame_delay
lda frame_delay
beq :+
2025-11-16 16:03:39 -05:00
jmp @loop2
2025-11-13 11:07:39 -05:00
:
rts
wait_frame_until:
2025-11-16 16:03:39 -05:00
@loop:
2025-11-13 11:07:39 -05:00
lda vbl
2025-11-16 16:03:39 -05:00
beq @loop
2025-11-13 11:07:39 -05:00
lda #0
sta vbl
lda cur_frame
cmp #2
bcc :+
jsr sfx_play
:
dec bmp_delay
bpl :+
jsr update_bmp
:
lda cur_frame
cmp frame_until
beq :+
2025-11-16 16:03:39 -05:00
jmp @loop
:
rts
wait_frame_until_2x:
@loop:
lda vbl
cmp #2
bcc @loop
lda #0
sta vbl
dec bmp_delay
bpl :+
jsr update_bmp
:
lda cur_frame
cmp frame_until
beq :+
jmp @loop
2025-11-13 11:07:39 -05:00
:
rts
init_bmp:
2025-11-16 16:03:39 -05:00
lda #$0b
2025-11-13 11:07:39 -05:00
sta $d011
lda #$19
sta $d018
lda #$d8
sta $d016
lda $4710
lsr
lsr
lsr
lsr
sta $d020
lda $4710
and #$0f
sta $d021
lda #0
sta cur_frame
sta bmp_delay
lda #$11
sta bmp_addr
lda #$47
sta bmp_addr+1
ldx #0
:
.repeat 4, I
lda $3f40+(I*250), x
sta $400+(I*250), x
lda $4328+(I*250), x
sta $d800+(I*250), x
.endrepeat
inx
cpx #250
bne :-
2025-11-16 16:03:39 -05:00
lda #$3b
sta $d011
2025-11-13 11:07:39 -05:00
rts
inc_bmp_addr:
inc bmp_addr
bne :+
inc bmp_addr+1
:
rts
update_bmp:
ldy #0
sty scr_ptr
sty cram_ptr
lda (bmp_addr), y
jsr inc_bmp_addr
sta chr_count
cmp #0 ; tfw flags update in inc_bmp_addr
bne @skip_frame_end
lda (bmp_addr), y
jsr inc_bmp_addr
sta bmp_delay
inc cur_frame
rts
@skip_frame_end:
lda (bmp_addr), y
sta bmp_ptr
iny
lda (bmp_addr), y
clc
adc #$20
sta bmp_ptr+1
iny
lda (bmp_addr), y
sta scr_ptr_lo
iny
lda (bmp_addr), y
clc
adc #$04
sta scr_ptr+1
clc
adc #$d8-$04
sta cram_ptr+1
ldy #0
lda bmp_addr
clc
adc #4
sta bmp_addr
bcc :+
inc bmp_addr+1
:
ldx #0
@loop:
ldy #0
lda (bmp_addr), y
sta (bmp_ptr), y
iny
lda (bmp_addr), y
sta (bmp_ptr), y
iny
lda (bmp_addr), y
sta (bmp_ptr), y
iny
lda (bmp_addr), y
sta (bmp_ptr), y
iny
lda (bmp_addr), y
sta (bmp_ptr), y
iny
lda (bmp_addr), y
sta (bmp_ptr), y
iny
lda (bmp_addr), y
sta (bmp_ptr), y
iny
lda (bmp_addr), y
sta (bmp_ptr), y
lda bmp_ptr
clc
adc #8
sta bmp_ptr
bcc :+
inc bmp_ptr+1
:
2025-11-17 14:16:02 -05:00
ldy #8
2025-11-13 11:07:39 -05:00
lda (bmp_addr), y
ldy scr_ptr_lo
sta (scr_ptr), y
2025-11-17 14:16:02 -05:00
ldy #9
2025-11-13 11:07:39 -05:00
lda (bmp_addr), y
ldy scr_ptr_lo
sta (cram_ptr), y
inc scr_ptr_lo
bne :+
inc scr_ptr+1
inc cram_ptr+1
:
lda bmp_addr
clc
2025-11-17 14:16:02 -05:00
adc #10
2025-11-13 11:07:39 -05:00
sta bmp_addr
bcc :+
inc bmp_addr+1
:
dec chr_count
ldx chr_count
bne @loop
jmp update_bmp
irq_badguy:
pha
2025-11-15 15:15:48 -05:00
2025-11-27 12:32:13 -05:00
pha
pla
pha
pla
pha
pla
2025-11-15 15:15:48 -05:00
lda #$1b
sta $d011
lda #$c8
sta $d016
2025-11-25 16:35:13 -05:00
lda #$13
2025-11-15 15:15:48 -05:00
sta $d018
2025-11-25 16:35:13 -05:00
lda #1
sta $d021
2025-11-15 15:15:48 -05:00
2025-11-27 12:32:13 -05:00
lda #<irq_badguy2
sta $fffe
lda #>irq_badguy2
sta $ffff
lda #$fb
sta $d012
2025-11-15 15:15:48 -05:00
2025-11-27 12:32:13 -05:00
asl $d019
pla
rti
irq_badguy2:
pha
inc vbl
2025-11-15 15:15:48 -05:00
lda #$3b
sta $d011
lda #$d8
sta $d016
2025-11-25 16:35:13 -05:00
lda #$19
sta $d018
2025-11-15 15:15:48 -05:00
lda #0
2025-11-25 16:35:13 -05:00
sta $d021
2025-11-15 15:15:48 -05:00
2025-11-27 12:32:13 -05:00
lda #<irq_badguy
sta $fffe
lda #>irq_badguy
sta $ffff
lda #$d2
sta $d012
2025-11-13 11:07:39 -05:00
asl $d019
pla
rti
2025-11-27 12:32:13 -05:00
set_irq_badguy:
lda #127
sta $dc0d
and $d011
sta $d011
lda $dc0d
lda $dd0d
lda #<irq_badguy
sta $fffe
lda #>irq_badguy
sta $ffff
lda #$1b
sta $d011
lda #$d2
sta $d012
rts
2025-11-25 12:03:50 -05:00
badguy: .byte "badguy",0
fontname: .byte "font",0
2025-11-26 07:42:34 -05:00
song0name: .byte "song0", 0
2025-11-27 12:32:13 -05:00
song1name: .byte "song1", 0
2025-11-25 12:03:50 -05:00
introname: .byte "intrbmp", 0
towername: .byte "tower", 0
towerbeamname: .byte "towerbm", 0
fieldname: .byte "field", 0
fallingstarname: .byte "fallstar", 0
lilianame: .byte "lilia", 0
liliaheroname: .byte "lilhero", 0
islandname: .byte "island", 0
islandmapname: .byte "islandmap", 0
cloudsname: .byte "clouds", 0
2025-11-17 14:43:56 -05:00
2025-11-15 15:15:48 -05:00
darmtower_txt:
2025-11-27 14:47:40 -05:00
.byte " darm's tower has fallen silent. "
.byte " what should we do? "
2025-11-21 14:59:16 -05:00
2025-11-15 15:15:48 -05:00
adol_win:
2025-11-27 14:47:40 -05:00
.byte " ", 34, "it must be adol, let's see "
.byte " how far he'll get!", 34, " "
2025-11-21 14:59:16 -05:00
2025-11-15 15:15:48 -05:00
too_bad_txt:
2025-11-27 14:47:40 -05:00
.byte " as you command. "
2025-11-15 15:15:48 -05:00
2025-11-17 14:16:02 -05:00
upload_text:
stx text_ptr
sty text_ptr+1
ldy #39
:
lda (text_ptr), y
2025-11-25 16:35:13 -05:00
clc
adc #$60
sta $748, y
2025-11-21 14:59:16 -05:00
dey
2025-11-25 16:35:13 -05:00
bpl :-
2025-11-21 14:59:16 -05:00
rts
upload_text_bottom:
stx text_ptr
sty text_ptr+1
ldy #39
:
lda (text_ptr), y
2025-11-25 16:35:13 -05:00
clc
adc #$60
sta $748+40+40, y
2025-11-17 14:16:02 -05:00
dey
2025-11-25 16:35:13 -05:00
bpl :-
2025-11-17 14:16:02 -05:00
rts
2025-11-27 14:47:40 -05:00
clear_text:
lda #$80
ldy #39
:
sta $748, y
sta $748+40+40, y
dey
bpl :-
rts
2025-11-17 14:16:02 -05:00
run_nufli_bmp:
lda #$01
sta $81
lda #$29
sta $80
lda #0
sta $d01a
2025-11-27 12:32:13 -05:00
asl $d019
2025-11-17 14:16:02 -05:00
jsr $a000
cli
jsr $3000
@loop:
bit $d011
bpl @loop
jsr $a003
@loop2:
bit $d011
bmi @loop2
lda #0
sta $d020
sta $d021
jsr $a003
lda $80
bne :+
dec $81
:
dec $80
lda $81
cmp #$ff
beq :+
jmp @loop
:
2025-11-17 14:43:56 -05:00
lda #0
sta $d015
2025-11-17 14:16:02 -05:00
rts
.res $ea31-*, $ff
;asl $d019
pla
tay
pla
tax
pla
rti
.res $ea81-*, $ff
;asl $d019
pla
tay
pla
tax
pla
rti
.include "sfx.asm"
.include "zx02.asm"
.include "thcmod_lz.asm"
2025-11-22 12:09:53 -05:00
zx02_8000:
pha
jmp :+
load_8000_zx02_2000:
lda #$20
load_8000_zx02:
pha
jsr loadraw
:
lda #0
sta ZX0_src
sta ZX0_dst
lda #$80
sta ZX0_src+1
pla
jmp zx02
2025-11-25 16:35:13 -05:00
load_font:
beq :+
pha
:
ldx #<fontname
ldy #>fontname
jsr fileexists
bcs :-
ldx #<fontname
ldy #>fontname
jmp loadraw
2025-11-25 12:03:50 -05:00
part_10:
; the sprite data is embedded into first few bitmap pixels
; which are hidden by black border attributes
2025-11-27 16:15:00 -05:00
@y = 93
2025-11-27 14:47:40 -05:00
jsr clr_txt
ldx #<total_direct
ldy #>total_direct
jsr write_txt2
ldx #$c0
ldy #$01
jsr init_timer
lda #1
sta timer_mode
2025-11-25 12:03:50 -05:00
ldx #<cloudsname
ldy #>cloudsname
jsr load_8000_zx02_2000
2025-11-27 14:47:40 -05:00
:
lda timer_reached
beq :-
ldx #$48
ldy #$01
lda #$40
jsr txt_fade_out_offset
2025-11-25 12:03:50 -05:00
jsr init_bmp
ldx #0
stx $d010
stx $d017
stx $d01d
stx $d025
stx frame
dex
stx $d01b
stx $d01c
lda #11
sta $d026
2025-11-25 16:35:13 -05:00
lda #@y+48
2025-11-25 12:03:50 -05:00
jsr position_2x
2025-11-27 16:15:00 -05:00
lda #0
sta vbl
2025-11-25 12:03:50 -05:00
; draw top half
@loop:
bit $d011
bpl @loop
ldx #0
ldy #0
lda frame
2025-11-27 16:15:00 -05:00
bpl :+
2025-11-25 12:03:50 -05:00
jmp @finish
:
2025-11-27 16:15:00 -05:00
cmp #$74
bcc :+
lda #$74
:
pha
:
clc
2025-11-25 12:03:50 -05:00
adc @sprxs,x
sta $d000,y
sta temp
lda @sprys,x
sta $d001,y
txa
ora #$80
sta $7f8,x
lda @sprcols,x
sta $d027,x
lda temp
iny
iny
inx
cpx #8
bcc :-
lda #$ff
sta $d015
; draw bottom half
:
bit $d011
bmi :-
lda #@y+37
:
cmp $d012
bcs :-
ldx #0
ldy #0
2025-11-27 16:15:00 -05:00
pla
2025-11-25 12:03:50 -05:00
clc
:
adc @sprxs+8,x
sta $d000,y
sta temp
lda @sprys+8,x
sta $d001,y
txa
ora #$88
sta $7f8,x
lda @sprcols+8,x
sta $d027,x
lda temp
iny
iny
inx
cpx #6
bcc :-
2025-11-27 16:15:00 -05:00
lda vbl
and #15
bne :+
2025-11-25 12:03:50 -05:00
inc frame
2025-11-27 16:15:00 -05:00
:
2025-11-25 12:03:50 -05:00
jmp @loop
@sprxs:
2025-11-27 16:15:00 -05:00
.byte 48, <-24, 24, 24, <-64, 24, 24, 24
.byte 48-40, 24, 24, 24, <-44, 24
2025-11-25 12:03:50 -05:00
@sprys:
.byte @y-8, @y, @y, @y, @y+21, @y+21, @y+21, @y+21
.byte @y+42, @y+42, @y+42, @y+42, @y+63, @y+63
@sprcols:
.byte 2, 5, 5, 5, 14, 14, 14, 6
.byte 2, 2, 2, 9, 2, 2
@finish:
2025-11-27 16:15:00 -05:00
lda #$0b
sta $d011
lda #0
sta $d015
jsr clr_txt
ldx #<produced
ldy #>produced
jsr write_txt2
ldx #$c0
ldy #$01
jsr init_timer
lda #1
sta timer_mode
:
lda timer_reached
beq :-
ldx #$48
ldy #$01
lda #8*11
jsr txt_fade_out_offset
2025-11-25 16:35:13 -05:00
2025-11-26 08:54:53 -05:00
part_11:
2025-11-27 16:15:00 -05:00
jsr clr_txt
ldx #<presented
ldy #>presented
jsr write_txt1
ldx #$c0
ldy #$01
jsr init_timer
lda #1
sta timer_mode
; ldx #<liliatalkname
; ldy #>liliatalkname
; jsr load_8000_zx02_2000
:
lda timer_reached
beq :-
2025-11-26 08:54:53 -05:00
; tell the music to end and wait
:
lda #1
jsr $a006
cmp #17
bne :-
2025-11-27 12:32:13 -05:00
2025-11-27 16:15:00 -05:00
ldx #$00
ldy #$01
lda #8*11
jsr txt_fade_out_offset
:
lda timer_reached
beq :-
jmp * ; TEMP
; load new music
lda #0
sta enable_music
2025-11-27 12:32:13 -05:00
ldx #<song1name
ldy #>song1name
lda #$a0
jsr load_8000_zx02
2025-11-27 16:15:00 -05:00
sei
jsr set_irq_badguy
inc enable_music
2025-11-27 12:32:13 -05:00
cli
2025-11-27 14:47:40 -05:00
jsr clr_txt
ldx #<turn_disk
ldy #>turn_disk
2025-11-27 16:15:00 -05:00
jsr write_txt1
2025-11-27 14:47:40 -05:00
2025-11-26 08:54:53 -05:00
jmp end
clear_2bufs:
ldy #$44
.byte $2c ; skip next instruction
clear_buf:
ldy #$20
lda #$20
sta @dst+2
lda #0
tax
:
sta $400,x
sta $500,x
sta $600,x
sta $700,x
inx
bne :-
@dst:
sta $2000,x
inx
bne @dst
inc @dst+2
dey
bne @dst
rts
2025-11-23 11:16:42 -05:00
copybuf:
lda @bsrclo,x
sta bmp_addr
lda @bsrchi,x
sta bmp_addr+1
lda @bdstlo,x
sta bmp_ptr
lda @bdsthi,x
sta bmp_ptr+1
lda @tsrclo,x
sta text_ptr
lda @tsrchi,x
sta text_ptr+1
lda @tdstlo,x
sta scr_ptr
lda @tdsthi,x
sta scr_ptr+1
ldx #16
@loop:
ldy #23
: lda (text_ptr),y
sta (scr_ptr),y
dey
bpl :-
ldy #191
: lda (bmp_addr),y
sta (bmp_ptr),y
dey
bne :-
lda (bmp_addr),y
sta (bmp_ptr),y
; math dumb cpu be struggling a lot here
lda text_ptr
sec
sbc #40
sta text_ptr
bcs :+
dec text_ptr+1
:
lda scr_ptr
sec
sbc #40
sta scr_ptr
bcs :+
dec scr_ptr+1
:
lda bmp_addr
sec
sbc #<320
sta bmp_addr
bcs :+
dec bmp_addr+1
:
dec bmp_addr+1
lda bmp_ptr
sec
sbc #<320
sta bmp_ptr
bcs :+
dec bmp_ptr+1
:
dec bmp_ptr+1
dex
bne @loop
rts
@bsrclo: .lobytes (15+4)*320+$2040, (15+4)*320+$4040
@bsrchi: .hibytes (15+4)*320+$2040, (15+4)*320+$4040
@bdstlo: .lobytes (16+4)*320+$4040, (16+4)*320+$2040
@bdsthi: .hibytes (16+4)*320+$4040, (16+4)*320+$2040
@tsrclo: .lobytes (15+4)*40+$0408, (15+4)*40+$6008
@tsrchi: .hibytes (15+4)*40+$0408, (15+4)*40+$6008
@tdstlo: .lobytes (16+4)*40+$6008, (16+4)*40+$0408
@tdsthi: .hibytes (16+4)*40+$6008, (16+4)*40+$0408
2025-11-23 11:16:42 -05:00
2025-11-27 12:32:13 -05:00
copyright:
.byte " ys ^ "
.byte " copyright 1988 falcom "
.byte " all right reserved "
2025-11-17 14:16:02 -05:00
story_writ:
2025-11-27 12:32:13 -05:00
.byte " story written by "
.byte " takahiro ohura "
.byte " tomoo yamane "
2025-11-17 14:16:02 -05:00
scenario_writ:
2025-11-27 12:32:13 -05:00
.byte " scenario written by "
.byte " tomoyoshi miyazaki "
2025-11-17 14:16:02 -05:00
prog_writ:
2025-11-27 12:32:13 -05:00
.byte " programmed by "
.byte " masaya hashimoto "
2025-11-17 14:16:02 -05:00
gart_writ:
2025-11-27 12:32:13 -05:00
.byte " graphic arts designed by "
.byte " takahiro ohura "
.byte " ayano koshiro "
.byte " kazuhiko tsuzuki "
.byte " tomoo yamane "
2025-11-17 14:16:02 -05:00
music_writ:
2025-11-27 12:32:13 -05:00
.byte " music composed by "
.byte " mieko ishikawa "
.byte " yuzo koshiro "
.byte " hideya nagata "
2025-11-17 14:16:02 -05:00
2025-11-17 14:43:56 -05:00
scene_writ:
2025-11-27 12:32:13 -05:00
.byte " scene set by "
.byte " seigo oketani "
.byte " yoshihiko kurata "
2025-11-17 14:43:56 -05:00
2025-11-27 13:08:51 -05:00
art_direct:
.byte " art directed by "
.byte " seigo oketani "
2025-11-27 14:47:40 -05:00
total_direct:
.byte " total directed by "
.byte " masaya hashimoto "
2025-11-27 16:15:00 -05:00
produced:
.byte " produced by "
.byte " masayuki katoh "
presented:
2025-11-27 14:47:40 -05:00
.byte " presented by falcom "
turn_disk:
.byte " insert datadisk in drive 8 "
2025-11-17 14:16:02 -05:00
clr_txt:
lda #$80
ldx #0
:
.repeat 4, I
sta $400+(I*250), x
.endrepeat
inx
cpx #250
bne :-
lda #0
ldx #0
:
.repeat 4, I
sta $d800+(I*250), x
.endrepeat
inx
cpx #250
bne :-
lda #$13
sta $d018
lda #$1b
sta $d011
rts
write_txt5:
2025-11-16 16:03:39 -05:00
stx text_ptr
sty text_ptr+1
ldy #0
2025-11-27 14:47:40 -05:00
lda #<($400+8*40)
ldx #>($400+8*40)
jsr write_txt_to
lda #<($400+10*40)
ldx #>($400+10*40)
jsr write_txt_to
lda #<($400+12*40)
ldx #>($400+12*40)
jsr write_txt_to
lda #<($400+14*40)
ldx #>($400+14*40)
jsr write_txt_to
lda #<($400+16*40)
ldx #>($400+16*40)
jmp write_txt_to
2025-11-16 16:03:39 -05:00
2025-11-17 14:16:02 -05:00
write_txt4:
2025-11-17 05:20:59 -05:00
stx text_ptr
sty text_ptr+1
ldy #0
2025-11-27 14:47:40 -05:00
lda #<($400+9*40)
ldx #>($400+9*40)
jsr write_txt_to
lda #<($400+11*40)
ldx #>($400+11*40)
jsr write_txt_to
lda #<($400+13*40)
ldx #>($400+13*40)
jsr write_txt_to
lda #<($400+15*40)
ldx #>($400+15*40)
jmp write_txt_to
2025-11-15 15:15:48 -05:00
2025-11-17 14:16:02 -05:00
write_txt3:
2025-11-15 15:15:48 -05:00
stx text_ptr
sty text_ptr+1
2025-11-17 14:16:02 -05:00
ldy #0
2025-11-27 14:47:40 -05:00
lda #<($400+10*40)
ldx #>($400+10*40)
jsr write_txt_to
lda #<($400+12*40)
ldx #>($400+12*40)
jsr write_txt_to
lda #<($400+14*40)
ldx #>($400+14*40)
jmp write_txt_to
2025-11-13 11:07:39 -05:00
2025-11-17 14:16:02 -05:00
write_txt2:
stx text_ptr
sty text_ptr+1
ldy #0
2025-11-27 14:47:40 -05:00
lda #<($400+11*40)
ldx #>($400+11*40)
jsr write_txt_to
lda #<($400+13*40)
ldx #>($400+13*40)
jmp write_txt_to
2025-11-27 16:15:00 -05:00
write_txt1:
2025-11-27 14:47:40 -05:00
stx text_ptr
sty text_ptr+1
ldy #0
lda #<($400+12*40)
ldx #>($400+12*40)
; fall through
2025-11-17 14:16:02 -05:00
2025-11-27 14:47:40 -05:00
write_txt_to:
sta @dst+1
stx @dst+2
2025-11-17 14:16:02 -05:00
ldx #0
2025-11-16 16:03:39 -05:00
:
2025-11-17 14:16:02 -05:00
lda (text_ptr), y
sec
sbc #$20
ora #$80
2025-11-27 14:47:40 -05:00
@dst:
sta $400, x
2025-11-17 14:16:02 -05:00
iny
inx
cpx #40
bne :-
2025-11-16 16:03:39 -05:00
rts
2025-11-27 12:32:13 -05:00
txt_fade_out:
2025-11-27 14:47:40 -05:00
lda #0
txt_fade_out_offset:
pha
2025-11-27 12:32:13 -05:00
jsr init_timer
2025-11-27 14:47:40 -05:00
pla
sta timer
2025-11-27 12:32:13 -05:00
lda #2
sta timer_mode
:
lda timer_reached
beq :-
rts
2025-11-27 16:15:00 -05:00
.res ((*+$ff)&$ff00|2)-*
end:
ldx #<fontname
ldy #>fontname
jsr fileexists
bcc end
jmp code_start
2025-11-15 16:55:16 -05:00
code_end: