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

1185 lines
14 KiB
ArmAsm

.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
text_ptr: .res 2
timer: .res 2
timer_limit: .res 2
timer_reached: .res 2
timer_mode: .res 1
temp: .res 3
aart_lz_buffer := $fd00
.include "lz_zp.asm"
CODE_START_ADDR = $e000
.segment "CODE"
ZP=$e0
offset = ZP+0
ZX0_src = ZP+2
ZX0_dst = ZP+4
bitr = ZP+6
pntr = ZP+7
.org $080d
copy_start:
sei
lda #$35
sta $01
lda #>(code_end-CODE_START_ADDR)
sta $ff
lda #<(code_end-CODE_START_ADDR)
sta $fe
lda #<CODE_START_ADDR
sta $fc
lda #>CODE_START_ADDR
sta $fd
lda #<code_start
sta $fa
lda #>code_start
sta $fb
@copy_loop:
ldy #0
lda ($fa), y
sta ($fc), y
inc $fc
bne :+
inc $fd
:
inc $fa
bne :+
inc $fb
:
lda $fe
bne :+
dec $ff
:
dec $fe
lda $fe
ora $ff
bne @copy_loop
lda #$36
sta $01
cli
jsr install
sei
lda #$35
sta $01
jmp CODE_START_ADDR
.res loadraw - *
.incbin "../../build/loader-c64.prg", 2
.res install - *
.incbin "../../build/install-c64.prg", 2
code_start:
.org CODE_START_ADDR
sei
ldx #<fontname
ldy #>fontname
jsr loadraw
lda #$34
sta $01
ldx #0
:
lda $8000, x
sta $d800, x
eor #$ff
sta $c00, x
lda $8100, x
sta $d900, x
eor #$ff
sta $d00, x
inx
bne :-
lda #0
tax
:
.repeat 4, I
sta $d000+(I*250), x
.endrepeat
inx
cpx #250
bne :-
lda #$35
sta $01
lda #0
sta ZX0_dst+0
ldx #<badguy
ldy #>badguy
jsr loadraw
lda #0
sta ZX0_src
lda #$80
sta ZX0_src+1
lda #0
sta ZX0_dst
lda #$20
jsr zx02
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 #$d0
sta $d012
lda #1
sta $d01a
sta bmp_delay
jsr init_bmp
lda #0
sta vbl
cli
;lda #64
;sta frame_delay
;jsr wait_loop
;jsr intro
lda #$0b
sta $d011
sei
ldx #<introname
ldy #>introname
jsr loadraw
lda #0
sta ZX0_src
lda #$80
sta ZX0_src+1
lda #0
sta ZX0_dst
lda #$10
jsr zx02
ldx #<sidname
ldy #>sidname
jsr loadraw
ldx #<towername
ldy #>towername
jsr loadraw
lda #<fake_kernal_irq
sta $fffe
lda #>fake_kernal_irq
sta $ffff
lda #1
sta $d01a
jsr run_nufli_bmp
sei
jsr init_2x
lda #$0b
sta $d011
jsr clr_txt
ldx #<story_writ
ldy #>story_writ
jsr write_txt3
ldx #$30
ldy #$01
jsr init_timer
lda #1
sta timer_mode
lda #0
sta ZX0_src
lda #$80
sta ZX0_src+1
lda #0
sta ZX0_dst
lda #$20
jsr zx02
:
lda timer_reached
beq :-
ldx #$b8
ldy #$01
jsr init_timer
lda #2
sta timer_mode
:
lda timer_reached
beq :-
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
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
jsr loadraw
lda #0
sta ZX0_src
lda #$80
sta ZX0_src+1
lda #0
sta ZX0_dst
lda #$20
jsr zx02
:
lda timer_reached
beq :-
ldx #$90
ldy #$01
jsr init_timer
lda #2
sta timer_mode
:
lda timer_reached
beq :-
jsr init_bmp
lda #0
sta vbl
lda #$0d
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 #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
ldx #<fieldname
ldy #>fieldname
jsr loadraw
lda #0
sta ZX0_src
lda #$80
sta ZX0_src+1
lda #0
sta ZX0_dst
lda #$20
jsr zx02
:
lda timer_reached
beq :-
ldx #$48
ldy #$01
jsr init_timer
lda #2
sta timer_mode
:
lda timer_reached
beq :-
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
jmp *
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
lda #50*5
sta frame_delay
jsr wait_loop
ldx #<empty_txt
ldy #>empty_txt
jsr upload_text
lda #$0d
sta frame_until
jsr wait_frame_until
ldx #<adol_win
ldy #>adol_win
jsr upload_text
lda #50*5
sta frame_delay
jsr wait_loop
ldx #<too_bad_txt
ldy #>too_bad_txt
jsr upload_text
lda #50*5
sta frame_delay
jsr wait_loop
ldx #<empty_txt
ldy #>empty_txt
jsr upload_text
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
jsr wait_loop
rts
wait_frame:
@loop:
bit $d011
bpl @loop
@loop2:
bit $d011
bmi @loop2
rts
story_writ:
.res 11, ' '
.byte "story written by"
.res 40-(16+11), ' '
.res 11, ' '
.res 5, ' '
.byte "takahiro ohura"
.res 40-(14+11+5), ' '
.res 11, ' '
.res 5, ' '
.byte "tomoo yamane"
.res 40-(12+11+5), ' '
scenario_writ:
.res (40-24)/2, ' '
.byte " scenario written by "
.res (40-24)/2, ' '
.res (40-24)/2, ' '
.byte " tomoyoshi miyazaki"
.res (40-24)/2, ' '
prog_writ:
.res (40-22)/2, ' '
.byte " programmed by "
.res (40-22)/2, ' '
.res (40-22)/2, ' '
.byte " masaya hashimoto"
.res (40-22)/2, ' '
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
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
lda #0
sta $d01a
lda #$63; <(985248/100)
sta $dc04
lda #$26;>(985248/100)
sta $dc05
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
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
irq_music:
pha
txa
pha
tya
pha
lda $dd00
and #3
sta @dd00_arc+1
lda #3
sta $dd00
inc vbl
;inc $d020
jsr $a003
;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
:
lda timer
cmp timer_limit
bne :+
lda timer+1
cmp timer_limit+1
bne :+
lda #1
sta timer_reached
:
@dd00_arc:
lda #0
sta $dd00
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
wait_loop:
@loop2:
lda vbl
beq @loop2
lda #0
sta vbl
jsr sfx_play
dec frame_delay
lda frame_delay
beq :+
jmp @loop2
:
rts
wait_frame_until:
@loop:
lda vbl
beq @loop
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 :+
jmp @loop
:
rts
wait_loop_2x:
@loop:
lda vbl
cmp #2
bcc @loop
lda #0
sta vbl
dec frame_delay
lda frame_delay
beq :+
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
:
rts
init_bmp:
lda #$0b
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 :-
lda #$3b
sta $d011
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
:
lda bmp_addr
clc
adc #8
sta bmp_addr
bcc :+
inc bmp_addr+1
:
ldy #0
lda (bmp_addr), y
ldy scr_ptr_lo
sta (scr_ptr), y
ldy #1
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
adc #2
sta bmp_addr
bcc :+
inc bmp_addr+1
:
dec chr_count
ldx chr_count
bne @loop
jmp update_bmp
irq_badguy:
pha
txa
pha
tya
pha
inc vbl
;inc $d020
lda #$1b
sta $d011
lda #$19
sta $d018
lda #$c8
sta $d016
lda $dd00
and #3
sta @dd00_arc+1
lda #0
sta $dd00
lda #$47
sta $d018
:
lda $d012
cmp #$fb
bcc :-
.res 2, $ea
lda #$3b
sta $d011
lda #$19
sta $d018
lda #$d8
sta $d016
@dd00_arc:
lda #0
sta $dd00
;dec $d020
asl $d019
pla
tay
pla
tax
pla
rti
badguy: .byte "badguy",0
fontname: .byte "font",0
sidname: .byte "sid", 0
introname: .byte "intrbmp", 0
towername: .byte "tower", 0
towerbeamname: .byte "towerbm", 0
fieldname: .byte "field", 0
darmtower_txt:
.res (40-26)/2, ' '
.byte "who silenced darm's tower?"
.res (40-26)/2, ' '
empty_txt:
.res 40, ' '
adol_win:
.res (40-20)/2, ' '
.byte "adol must have won.."
.res (40-20)/2, ' '
too_bad_txt:
.res (40-10)/2, ' '
.byte "too bad..."
.res (40-10)/2, ' '
write_txt3:
stx text_ptr
sty text_ptr+1
ldx #0
ldy #0
:
lda (text_ptr), y
sec
sbc #$20
ora #$80
sta $400+10*40, x
iny
inx
cpx #40
bne :-
ldx #0
:
lda (text_ptr), y
sec
sbc #$20
ora #$80
sta $400+12*40, x
iny
inx
cpx #40
bne :-
ldx #0
:
lda (text_ptr), y
sec
sbc #$20
ora #$80
sta $400+14*40, x
iny
inx
cpx #40
bne :-
rts
write_txt2:
stx text_ptr
sty text_ptr+1
ldx #0
ldy #0
:
lda (text_ptr), y
sec
sbc #$20
ora #$80
sta $400+11*40, x
iny
inx
cpx #40
bne :-
ldx #0
:
lda (text_ptr), y
sec
sbc #$20
ora #$80
sta $400+13*40, x
iny
inx
cpx #40
bne :-
rts
upload_text:
lda #$34
sta $01
stx text_ptr
sty text_ptr+1
ldy #39
:
lda (text_ptr), y
sec
sbc #$20
sta $d348+40, y
dey
bne :-
lda #$35
sta $01
lda #1
ldy #39
:
sta $db48+40, y
dey
bne :-
rts
run_nufli_bmp:
lda #$01
sta $81
lda #$29
sta $80
lda #0
sta $d01a
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
:
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"
code_end: