; Finally Arriving ; Simple Text/GR split ; Some zero-page action ;TFV_X = 0 ;TFV_Y = 1 TFG_X = 2 ;HEART_X = 3 ;HEART_Y = 4 arriving_there: ;=================== ; init screen setup_arrival: ;=================== ; init vars lda #0 sta FRAME sta FRAMEH lda #0 sta TFV_X lda #8 sta DRAW_PAGE ; lda #14 ; sta HEART_X ; lda #20 ; sta HEART_Y lda #22 sta TFG_X ;============================= ; Load graphic page0 lda #$0c sta BASH lda #$00 sta BASL ; load image to $c00 lda #<arrival sta GBASL lda #>arrival sta GBASH jsr load_rle_gr lda #$a0 ldy #10 jsr clear_page_loop ; make top 6 lines spaces lda #0 sta DRAW_PAGE bit PAGE0 sei ; disable interrupt music ;============================== ; setup graphics for vapor lock ;============================== jsr vapor_lock ; 6 ; vapor lock returns with us at beginning of hsync in line ; 114 (7410 cycles), so with 5070 lines to go jsr gr_copy_to_current ; 6+ 9292 ; now we have 322 left ; GR part bit LORES ; 4 bit SET_GR ; 4 bit FULLGR ; 4 jsr draw_moon_sky ; 6+54 ; 322 - 12 = 310 ; - 3 for jmp ; 307 - 60 for sky = 247 ; Try X=9 Y=6 cycles=307 ; Try X=7 Y=6 cycles=247 ldy #6 ; 2 arloopA:ldx #7 ; 2 arloopB:dex ; 2 bne arloopB ; 2nt/3 dey ; 2 bne arloopA ; 2nt/3 jmp ar_begin_loop .align $100 ;================================================ ; Arrival Loop ;================================================ ; each scan line 65 cycles ; 1 cycle each byte (40cycles) + 25 for horizontal ; Total of 12480 cycles to draw screen ; Vertical blank = 4550 cycles (70 scan lines) ; Total of 17030 cycles to get back to where was ; want 12*4 = 48 lines of TEXT = 3120-4=3116 ; want 144-48 = 96 lines of undisturbed LORES = 6240 - 4 = 6236 ; lores lines 24-36 (80 - 143) are changing ; so don't do much then ; want 192-144=48 lines of LORES = 3120 ar_begin_loop: ; 3120 ; -4 set_text ; -25 inc frame ; -17 set state ; -43 move ; -8 check if done ;======= ; 3023 bit SET_TEXT ; 4 ;==================== ; Update frame count ;==================== ; no carry: 13+(12) = 25 ; carry: 13+12 = 25 inc FRAME ; 5 lda FRAME ; 3 cmp #20 ; 2 bne ar_waste_12 ; 3 ;============ ; 13 ; -1 lda #0 ; 2 sta FRAME ; 3 inc FRAMEH ; 5 jmp ar_no_carry ; 3 ;============ ; 12 ar_waste_12: lda $0 ; 3 lda $0 ; 3 lda $0 ; 3 lda $0 ; 3 ar_no_carry: ;================= ; check if done ;================= lda FRAMEH ; 3 cmp #32 ; 2 bne ar_not_done ; 3 jmp ar_all_done ar_not_done: ;=========== ; 8 ; Set the state ; STATE0 = 5+4+(5)+3 = 17 ; STATE2 = 5+5+4+3 = 17 ; STATE4 = 5+5+2+3+(2) =17 ; looking at FRAMEH (orig 5,16,30) -> 9, 20, 32 ; if 0 < 9 then STATE0 (waiting) $0 < $9 ; if 9 < 20 then STATE2 (walking) $9 < $14 ; if 20 < 32 then STATE4 (heart) $14 < $20 cmp #9 ; 2 bcs ar_state_notzero ; bge ; 3 ar_state_zero: ; -1 lda $0 ; nop ; 3 nop ; 2 ldx #0 ; 2 jmp ar_set_state ; 3 ar_state_notzero: cmp #20 ; 2 bcs ar_state_four ; bge ; 3 ar_state_two: ; -1 ldx #2 ; 2 jmp ar_set_state ; 3 ar_state_four: nop ; 2 ldx #4 ; 2 ar_set_state: stx STATE ; 3 ;==================== ; Move TFV ;==================== ; if move, 6+13=19 ; if not move, 6+13=19 lda FRAME ; only move if FRAME==0 ; 3 beq arv_move ; 3 arv_nomove: ; -1 lda $0 ;nop ; 3 lda $0 ;nop ; 3 lda $0 ;nop ; 3 nop ; 2 jmp arv_done_move ; 3 arv_move: lda STATE ; 3 lsr ; 2 clc ; 2 adc TFV_X ; 3 sta TFV_X ; 3 arv_done_move: ;==================== ; Move TFG ; if move, 6+18=24 ; if not move, 6+18=24 lda FRAME ; only move if FRAME===0 ; 3 beq arg_move ; 3 arg_nomove: ; -1 lda $0 ;nop ; 3 lda $0 ;nop ; 3 lda $0 ;nop ; 3 lda $0 ;nop ; 3 nop ; 2 nop ; 2 jmp arg_done_move ; 3 arg_move: lda STATE ; 3 and FRAMEH ; 3 lsr ; 2 eor #$ff ; make negative ; 2 sec ; 2 adc TFG_X ; 3 sta TFG_X ; 3 arg_done_move: ; Try X=29 Y=20 cycles=3021 R2 nop ldy #20 ; 2 arloop8:ldx #29 ; 2 arloop9:dex ; 2 bne arloop9 ; 2nt/3 dey ; 2 bne arloop8 ; 2nt/3 ;========================== ; Set graphics mode, delay until done displaying the yard ;========================== bit SET_GR ; 4 ; Try X=53 Y=23 cycles=6234 R2 nop ldy #23 ; 2 arloop6:ldx #53 ; 2 arloop7:dex ; 2 bne arloop7 ; 2nt/3 dey ; 2 bne arloop6 ; 2nt/3 ;=============================== ; Draw the Field ;=============================== draw_the_field: ;=============================== ; Draw one of three states ;=============================== ; STATE0 = draw nothing ; STATE2 = draw open door + walking TFV+susie ; STATE4 = draw heart ; Set up jump table that runs same speed on 6502 and 65c02 ldy STATE ; 3 lda ar_jump_table+1,y ; 4 pha ; 3 lda ar_jump_table,y ; 4 pha ; 3 rts ; 6 ;============= ; 23 ar_jump_table: .word (ar_state0-1) .word (ar_state2-1) .word (ar_state4-1) ar_back_from_jumptable: ;====================================================== ; We have 4550 cycles in the vblank, use them wisely ;====================================================== ; do_nothing should be 3120 (bottom of GR screen) ; 4550 (vblank) ; -23 (setup jump table) ; -6237 (in state code) ; -10 keypress ; -1038 play_music ; =========== ; 362 jsr play_music ; 6+1032 ; Try X=5 Y=45 cycles=1396 R4 ; Try X=3 Y=17 cycles=358 R4 nop nop ldy #17 ; 2 arloop1:ldx #3 ; 2 arloop2:dex ; 2 bne arloop2 ; 2nt/3 dey ; 2 bne arloop1 ; 2nt/3 lda KEYPRESS ; 4 bpl ar_no_keypress ; 3 jmp ar_all_done ar_no_keypress: jmp ar_begin_loop ; 3 ar_all_done: bit KEYRESET ; clear keypress ; 4 cli ; re-enable interrupt music rts ; 6 ;===================== ; State0 : do nothing ;===================== ; Delay 6237 ; -1524 ; -3 ;=========== ; 4710 ar_state0: ; draw fs standing lda #>tfg_stand_left ; 2 sta INH ; 3 lda #<tfg_stand_left ; 2 sta INL ; 3 lda #22 ; 2 sta XPOS ; 3 lda #24 ; 2 sta YPOS ; 3 jsr put_sprite ; 6 ;========= ; 26 + 1498 = 1524 ; Try X=35 Y=26 cycles=4707 R3 lda $0 ldy #26 ; 2 arloopT:ldx #35 ; 2 arloopU:dex ; 2 bne arloopU ; 2nt/3 dey ; 2 bne arloopT ; 2nt/3 jmp ar_back_from_jumptable ; 3 ;====================================================== ; State2 : draw walking ;====================================================== ; 785 = erase field ; 3 (return) ; 1490 = 1471+19 (draw tfv) ; 33 (draw susie) ; 1538 = 1519+19 (draw fs) ; 1937 (draw falls) ;========== ; 5786 ; - 6237 .align $100 ar_state2: jsr erase_field ; 6+779 ; Try X=2 Y=28 cycles=449 R2 nop ldy #28 ; 2 arloopZ:ldx #2 ; 2 arloopX:dex ; 2 bne arloopX ; 2nt/3 dey ; 2 bne arloopZ ; 2nt/3 ; ; jmp ar_back_from_jumptable ; 3 lda TFV_X ; 3 sta XPOS ; 3 lda #24 ; 2 sta YPOS ; 3 lda FRAMEH ; 3 and #$1 ; 2 beq ar_walk ; 3 ;=========== ; 19 ar_stand: ; draw deater standing ; -1 lda #>tfv_stand_right ; 2 sta INH ; 3 lda #<tfv_stand_right ; 2 sta INL ; 3 jsr put_sprite ; 6 ; need to waste 61 cycles lda #34 ; 2 jsr delay_a ; 25+34 = 59 jmp girl_walk ; 3 ;========= ; 18 + 1392 = 1410 ar_walk: ; draw deater walking lda #>tfv_walk_right ; 2 sta INH ; 3 lda #<tfv_walk_right ; 2 sta INL ; 3 jsr put_sprite ; 6 ;========= ; 16 + 1455 = 1471 ; girl walk girl_walk: lda TFG_X ; 3 sta XPOS ; 3 lda #24 ; 2 sta YPOS ; 3 lda FRAMEH ; 3 and #$1 ; 2 beq arg_walk ; 3 ;=========== ; 19 arg_stand: ; draw fs standing ; -1 lda #>tfg_stand_left ; 2 sta INH ; 3 lda #<tfg_stand_left ; 2 sta INL ; 3 jsr put_sprite ; 6 lda $0 ; nop ; 3 jmp ar_susie ; 3 ;========= ; 21 + 1498 = 1519 arg_walk: ; draw fs walking lda #>tfg_walk_left ; 2 sta INH ; 3 lda #<tfg_walk_left ; 2 sta INL ; 3 jsr put_sprite ; 6 ;========= ; 16 + 1503 = 1519 ; draw susie ; 33 cycles ar_susie: ; draw susie at TFV_X-5, IFF TFV_X>10 lda TFV_X ; 3 sec ; 2 sbc #4 ; 2 tax ; 2 cpx #1 ; 2 bpl ar_yes_susie ; bge ; 3 ;============ ; 14 ar_no_susie: ; -1 inc TFV_Y ; 5 dec TFV_Y ; 5 nop ; 2 nop ; 2 lda $0 ; 3 jmp ar_done_susie ; 3 ;============ ; 19 ar_yes_susie: lda #0 ; 2 sta $4d0,X ; 5 sta $4d1,X ; 5 lda #$0f ; 2 sta $4d2,X ; 5 ar_done_susie: ;=========== ; 19 ar_draw_wfall: ; draw minifalls lda #>wfall_sprite ; 2 sta INH ; 3 lda #<wfall_sprite ; 2 sta INL ; 3 lda #0 ; 2 sta XPOS ; 3 lda #24 ; 2 sta YPOS ; 3 jsr put_sprite ; 6 ;========= ; 26 + 1911 = 1937 jmp ar_back_from_jumptable ; 3 .align $100 ;====================================================== ; State4 : heart ;====================================================== ; 6237 ; -473 (draw heart) ; -217 (erase heart) ; -3 = return ;========== ; 5544 ar_state4: jsr erase_heart ; 6+211 lda FRAMEH ; 3 and #$f ; 2 tax ; 2 lda ar_heart_lookup_x,x ; 4 sta XPOS ; 3 lda ar_heart_lookup_y,x ; 4 sta YPOS ; 3 ; draw heart lda #>heart_sprite ; 2 sta INH ; 3 lda #<heart_sprite ; 2 sta INL ; 3 jsr put_sprite ; 6 ;========= ; 37 + 436 = 473 ar_done_heart: ; delay ; Try X=47 Y=23 cycles=5544 ldy #23 ; 2 arloopV:ldx #47 ; 2 arloopW:dex ; 2 bne arloopW ; 2nt/3 dey ; 2 bne arloopV ; 2nt/3 jmp ar_back_from_jumptable ;====================== ; erase field ;====================== ; erase to green 4-25, 24-35 ; 4+ 22*[30 + 5 ] + 5 = 779 erase_field: lda #$44 ; green ; 2 ldx #21 ; 4 - 25 ; 2 field_loop: sta $628+4,X ; 24 ; 5 sta $6a8+4,X ; 26 ; 5 sta $728+4,X ; 28 ; 5 sta $7a8+4,X ; 30 ; 5 sta $450+4,X ; 32 ; 5 sta $4d0+4,X ; 34 ; 5 dex ; 2 bpl field_loop ; 3 ; -1 rts ; 6 ;====================== ; erase heart ;====================== ; erase to black, (13-18,14-20) ; erase to green (13-18,20-24) ; 2+ 6*[29 + 5 ] + 5 = 211 erase_heart: ldx #5 ; 13 - 18 ; 2 heart_loop: lda #$00 ; black ; 2 sta $780+13,X ; 14 ; 5 sta $428+13,X ; 16 ; 5 sta $4a8+13,X ; 18 ; 5 lda #$44 ; green ; 2 sta $528+13,X ; 20 ; 5 sta $5a8+13,X ; 22 ; 5 dex ; 2 bpl heart_loop ; 3 ; -1 rts ; 6 ar_heart_lookup_x: .byte 14,14,14,14,14,14,13,13,14,14,14,14 ; .byte 14,14,15,15,14,14,14,14 .byte 14,14,14,14 ar_heart_lookup_y: ; HEART_Y .byte 16,16,16,16,20,20,18,18,16,16,16,16 .byte 16,16,16,16 heart_path: ; .byte $14,$20 ; .byte $14,$20 ; .byte $13,$18 ; .byte $13,$18 ; .byte $14,$16 ; .byte $15,$16 ; .byte $15,$14 ; .byte $14,$14