diff --git a/games/sb/Makefile b/games/sb/Makefile index 91121910..75e274d7 100644 --- a/games/sb/Makefile +++ b/games/sb/Makefile @@ -34,7 +34,7 @@ sb.o: sb.s zx02_optim.s \ FN: fn.o ld65 -o FN fn.o -C $(LINKER_SCRIPTS)/apple2_6000.inc -fn.o: fn.s zx02_optim.s duet.s hgr_sprite_mask.s hgr_tables.s \ +fn.o: fn.s zx02_optim.s duet.s hgr_sprite_mask.s hgr_sprite.s hgr_tables.s \ zp.inc hardware.inc \ fn_sound/fortnight.ed \ fn_graphics/a2_fortnight.hgr.zx02 \ diff --git a/games/sb/fn.s b/games/sb/fn.s index eb82a554..4bec6337 100644 --- a/games/sb/fn.s +++ b/games/sb/fn.s @@ -25,6 +25,9 @@ fortnight_start: bit SET_GR bit PAGE1 + ldx #0 + sta FRAME + sta FRAMEH ;========================== ; Floppy Animation @@ -32,6 +35,7 @@ fortnight_start: floppy_animation: + ; decompress background to page1 lda #fn_image + sta ZX0_src+1 + lda #$40 jsr full_decomp + reset_floppy_loop: lda #0 sta XPOS @@ -61,9 +76,43 @@ floppy_loop: lda floppy_mask_h,X sta MASKH + ; draw sprite + jsr hgr_draw_sprite_mask_and_save + +time_loop: + + 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: + + lda FRAMEH + cmp #3 + beq done_floppy + + lda FRAME + and #$3 + bne time_loop + + ; erase sprite + + lda #backup_sprite + sta INH jsr hgr_draw_sprite - jsr wait_until_keypress + ; move sprite inc XPOS lda XPOS @@ -71,7 +120,8 @@ floppy_loop: bcc floppy_loop bcs reset_floppy_loop - +done_floppy: + bit KEYRESET ; clear the keyboard buffer ;========================== ; "breakdancing" rat @@ -127,6 +177,7 @@ wait_until_keypress: .include "zx02_optim.s" + .include "hgr_sprite.s" .include "hgr_sprite_mask.s" .include "hgr_tables.s" diff --git a/games/sb/fn_graphics/a2_fortnight_sprites.png b/games/sb/fn_graphics/a2_fortnight_sprites.png index 0130ae98..6cc5e64c 100644 Binary files a/games/sb/fn_graphics/a2_fortnight_sprites.png and b/games/sb/fn_graphics/a2_fortnight_sprites.png differ diff --git a/games/sb/hgr_sprite.s b/games/sb/hgr_sprite.s new file mode 100644 index 00000000..2dae4bfd --- /dev/null +++ b/games/sb/hgr_sprite.s @@ -0,0 +1,83 @@ + ;=========================================== + ; hgr draw sprite (only at 7-bit boundaries) + ;=========================================== + ; SPRITE in INL/INH + ; Location at CURSOR_X CURSOR_Y + + ; xsize, ysize in first two bytes + + ; sprite AT INL/INH + +hgr_draw_sprite: + + ldy #0 + lda (INL),Y ; load xsize + clc + adc CURSOR_X + sta sprite_width_end_smc+1 ; self modify for end of line + + iny ; load ysize + lda (INL),Y + sta sprite_ysize_smc+1 ; self modify + + ; point smc to sprite + lda INL ; 16-bit add + sta sprite_smc1+1 + lda INH + sta sprite_smc1+2 + + + ldx #0 ; X is pointer offset + stx CURRENT_ROW ; actual row + + ldx #2 + +hgr_sprite_yloop: + + lda CURRENT_ROW ; row + + clc + adc CURSOR_Y ; add in cursor_y + + ; calc GBASL/GBASH + + tay ; get output ROW into GBASL/H + lda hposn_low,Y + sta GBASL + 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 + +sprite_inner_loop: + + +sprite_smc1: + lda $f000,X ; load sprite data + sta (GBASL),Y ; store to screen + + inx ; increment sprite offset + iny ; increment output position + + +sprite_width_end_smc: + cpy #6 ; see if reached end of row + bne sprite_inner_loop ; if not, loop + + + inc CURRENT_ROW ; row + lda CURRENT_ROW ; row + +sprite_ysize_smc: + cmp #31 ; see if at end + bne hgr_sprite_yloop ; if not, loop + + rts + diff --git a/games/sb/hgr_sprite_mask.s b/games/sb/hgr_sprite_mask.s index 3a75834f..7f682f4f 100644 --- a/games/sb/hgr_sprite_mask.s +++ b/games/sb/hgr_sprite_mask.s @@ -1,5 +1,5 @@ ;=========================================== - ; hgr draw sprite (only at 7-bit boundaries) + ; hgr draw sprite mask and save (only at 7-bit boundaries) ;=========================================== ; SPRITE in INL/INH ; Location at CURSOR_X CURSOR_Y @@ -8,35 +8,37 @@ ; sprite AT INL/INH -hgr_draw_sprite: +hgr_draw_sprite_mask_and_save: ldy #0 lda (INL),Y ; load xsize + sta backup_sprite clc adc CURSOR_X - sta sprite_width_end_smc+1 ; self modify for end of line + sta sms_sprite_width_end_smc+1 ; self modify for end of line iny ; load ysize lda (INL),Y - sta sprite_ysize_smc+1 ; self modify + sta backup_sprite+1 + sta sms_sprite_ysize_smc+1 ; self modify ; point smc to sprite lda INL ; 16-bit add - sta sprite_smc1+1 + sta sms_sprite_smc1+1 lda INH - sta sprite_smc1+2 + sta sms_sprite_smc1+2 lda MASKL - sta mask_smc1+1 + sta sms_mask_smc1+1 lda MASKH - sta mask_smc1+2 + sta sms_mask_smc1+2 ldx #0 ; X is pointer offset stx CURRENT_ROW ; actual row ldx #2 -hgr_sprite_yloop: +hgr_sms_sprite_yloop: lda CURRENT_ROW ; row @@ -48,42 +50,47 @@ hgr_sprite_yloop: 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 +;hgr_sprite_page_smc: +; eor #$00 sta GBASH +; eor #$60 +; sta INH ldy CURSOR_X -sprite_inner_loop: +sms_sprite_inner_loop: - lda (GBASL),Y ; load bg -sprite_smc1: + lda (GBASL),Y ; load bg + sta backup_sprite,X +sms_sprite_smc1: eor $f000,X ; load sprite data -mask_smc1: +sms_mask_smc1: and $f000,X eor (GBASL),Y - sta (GBASL),Y + sta (GBASL),Y ; store to screen inx ; increment sprite offset iny ; increment output position -sprite_width_end_smc: +sms_sprite_width_end_smc: cpy #6 ; see if reached end of row - bne sprite_inner_loop ; if not, loop + bne sms_sprite_inner_loop ; if not, loop inc CURRENT_ROW ; row lda CURRENT_ROW ; row -sprite_ysize_smc: +sms_sprite_ysize_smc: cmp #31 ; see if at end - bne hgr_sprite_yloop ; if not, loop + bne hgr_sms_sprite_yloop ; if not, loop rts +backup_sprite = $1800