diff --git a/games/sb/fn.s b/games/sb/fn.s index 4bec6337..88e7b182 100644 --- a/games/sb/fn.s +++ b/games/sb/fn.s @@ -11,7 +11,23 @@ fortnight_start: lda #$20 - sta HGR_PAGE + sta HGR_PAGE ; why? + + lda #$00 ; will be $00/$20 + sta DRAW_PAGE + + lda #0 + sta WHICH_PAGE + + ; disp page1 + ; erase old page2 + ; save page2 + ; draw page2 + + ; disp page2 + ; erase old page1 + ; save page1 + ; draw page1 jsr hgr_make_tables @@ -56,17 +72,86 @@ floppy_animation: jsr full_decomp + lda #4 + sta SPRITE_Y + + lda #$FF + sta backup_sprite1 + sta backup_sprite2 + reset_floppy_loop: lda #0 sta XPOS + floppy_loop: + + ;========================= + ; switch visible page + ;========================= + + lda WHICH_PAGE + tax + sta PAGE1,X + eor #$1 + sta WHICH_PAGE + + + ;======================== + ; switch draw page + ;======================== + + lda DRAW_PAGE + eor #$20 + sta DRAW_PAGE + + ;======================= + ; erase sprite + ;======================= + + lda OLDER_X + sta SPRITE_X + + lda WHICH_PAGE +; eor #$1 + tax + lda backup_sprites_l,X + sta INL + lda backup_sprites_h,X + sta INH + + ldy #0 + lda (INL),Y + bmi goog + + jsr hgr_draw_sprite + +goog: + + lda WHICH_PAGE +; eor #$1 + tax + lda backup_sprites_l,X + sta OUTL + lda backup_sprites_h,X + sta OUTH + + + ;======================= + ; save/draw + ;======================= + ldx XPOS - lda floppy_x,X - sta CURSOR_X - lda #4 - sta CURSOR_Y + lda OLD_X + sta OLDER_X + + lda floppy_x,X ; save/draw offscreen + sta SPRITE_X + sta OLD_X +; lda #4 +; sta SPRITE_Y +; sta OLD_Y lda floppy_sprite_l,X sta INL lda floppy_sprite_h,X @@ -81,20 +166,15 @@ floppy_loop: time_loop: + ; check keypress + lda KEYPRESS ; 4 bmi done_floppy lda #160 jsr WAIT - -; jsr wait_until_keypress - - ; see if end - inc FRAME - bne no_frame_oflo - inc FRAMEH -no_frame_oflo: + jsr inc_frame lda FRAMEH cmp #3 @@ -104,21 +184,15 @@ no_frame_oflo: and #$3 bne time_loop - ; erase sprite - - lda #backup_sprite - sta INH - jsr hgr_draw_sprite - ; move sprite inc XPOS + lda XPOS cmp #18 bcc floppy_loop - bcs reset_floppy_loop + jmp reset_floppy_loop + done_floppy: bit KEYRESET ; clear the keyboard buffer @@ -175,6 +249,13 @@ wait_until_keypress: bit KEYRESET ; clear the keyboard buffer rts +inc_frame: + inc FRAME + bne no_frame_oflo + inc FRAMEH +no_frame_oflo: + rts + .include "zx02_optim.s" .include "hgr_sprite.s" @@ -230,3 +311,9 @@ floppy_mask_h: .byte >disk_mask1,>disk_mask0 +backup_sprites_l: + .byte backup_sprite1,>backup_sprite2 + diff --git a/games/sb/hgr_sprite.s b/games/sb/hgr_sprite.s index 2dae4bfd..c77d9646 100644 --- a/games/sb/hgr_sprite.s +++ b/games/sb/hgr_sprite.s @@ -2,7 +2,7 @@ ; hgr draw sprite (only at 7-bit boundaries) ;=========================================== ; SPRITE in INL/INH - ; Location at CURSOR_X CURSOR_Y + ; Location at SPRITE_X SPRITE_Y ; xsize, ysize in first two bytes @@ -13,7 +13,7 @@ hgr_draw_sprite: ldy #0 lda (INL),Y ; load xsize clc - adc CURSOR_X + adc SPRITE_X sta sprite_width_end_smc+1 ; self modify for end of line iny ; load ysize @@ -37,7 +37,7 @@ hgr_sprite_yloop: lda CURRENT_ROW ; row clc - adc CURSOR_Y ; add in cursor_y + adc SPRITE_Y ; add in cursor_y ; calc GBASL/GBASH @@ -50,11 +50,13 @@ hgr_sprite_yloop: ; eor #$60 draws on page1 ;hgr_sprite_page_smc: ; eor #$00 + clc + adc DRAW_PAGE sta GBASH ; eor #$60 ; sta INH - ldy CURSOR_X + ldy SPRITE_X sprite_inner_loop: diff --git a/games/sb/hgr_sprite_mask.s b/games/sb/hgr_sprite_mask.s index 7f682f4f..5d5ff575 100644 --- a/games/sb/hgr_sprite_mask.s +++ b/games/sb/hgr_sprite_mask.s @@ -2,24 +2,26 @@ ; hgr draw sprite mask and save (only at 7-bit boundaries) ;=========================================== ; SPRITE in INL/INH - ; Location at CURSOR_X CURSOR_Y + ; Location at SPRITE_X SPRITE_Y ; xsize, ysize in first two bytes ; sprite AT INL/INH + ; save at OUTL/OUTH + hgr_draw_sprite_mask_and_save: ldy #0 lda (INL),Y ; load xsize - sta backup_sprite + sta (OUTL),Y clc - adc CURSOR_X + adc SPRITE_X sta sms_sprite_width_end_smc+1 ; self modify for end of line iny ; load ysize lda (INL),Y - sta backup_sprite+1 + sta (OUTL),Y sta sms_sprite_ysize_smc+1 ; self modify ; point smc to sprite @@ -28,6 +30,13 @@ hgr_draw_sprite_mask_and_save: lda INH sta sms_sprite_smc1+2 + ; point smc to sprite + lda OUTL ; 16-bit add + sta backup_sprite_smc1+1 + lda OUTH + sta backup_sprite_smc1+2 + + lda MASKL sta sms_mask_smc1+1 lda MASKH @@ -43,31 +52,31 @@ hgr_sms_sprite_yloop: lda CURRENT_ROW ; row clc - adc CURSOR_Y ; add in cursor_y + adc SPRITE_Y ; add in cursor_y ; calc GBASL/GBASH tay ; get output ROW into GBASL/H lda hposn_low,Y sta GBASL -; sta INL lda hposn_high,Y - ; eor #$00 draws on page2 - ; eor #$60 draws on page1 + ;hgr_sprite_page_smc: ; eor #$00 - sta GBASH -; eor #$60 -; sta INH - ldy CURSOR_X + clc + adc DRAW_PAGE + sta GBASH + + ldy SPRITE_X sms_sprite_inner_loop: lda (GBASL),Y ; load bg - sta backup_sprite,X +backup_sprite_smc1: + sta $f000,X sms_sprite_smc1: eor $f000,X ; load sprite data sms_mask_smc1: @@ -93,4 +102,5 @@ sms_sprite_ysize_smc: rts -backup_sprite = $1800 +backup_sprite1 = $1800 +backup_sprite2 = $1900 diff --git a/games/sb/zp.inc b/games/sb/zp.inc index eaaea771..f427a02f 100644 --- a/games/sb/zp.inc +++ b/games/sb/zp.inc @@ -154,6 +154,9 @@ D2_XSPEED = $EB D1_YSPEED = $EC D2_YSPEED = $ED +OLD_X = $EC +OLDER_X = $ED + DISP_PAGE = $EE DRAW_PAGE = $EF @@ -161,8 +164,8 @@ DRAW_PAGE = $EF XPOS = $F0 YPOS = $F1 XMAX = $F2 -CURSOR_X = $F3 -CURSOR_Y = $F4 +SPRITE_X = $F3 +SPRITE_Y = $F4 HGR_PAGE = $F5 CURRENT_ROW = $F6