.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 $fd 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 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 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 $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 jsr loadraw lda #0 sta ZX0_src lda #$80 sta ZX0_src+1 lda #0 sta ZX0_dst lda #$10 jsr zx02 ldx #sidname jsr loadraw ldx #towername jsr loadraw 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 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 jsr write_txt2 ldx #$80 ldy #$01 jsr init_timer lda #1 sta timer_mode ldx #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 jsr write_txt2 ldx #$a8 ldy #$01 jsr init_timer lda #1 sta timer_mode ldx #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 jsr upload_text lda #50*5 sta frame_delay jsr wait_loop ldx #empty_txt jsr upload_text lda #$0d sta frame_until jsr wait_frame_until ldx #adol_win jsr upload_text lda #50*5 sta frame_delay jsr wait_loop ldx #too_bad_txt jsr upload_text lda #50*5 sta frame_delay jsr wait_loop ldx #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 $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: