fn: huge pain getting page flipping to work

This commit is contained in:
Vince Weaver 2023-05-03 00:41:01 -04:00
parent cb84455f65
commit 5c37ea5fb7
4 changed files with 144 additions and 42 deletions

View File

@ -11,7 +11,23 @@
fortnight_start: fortnight_start:
lda #$20 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 jsr hgr_make_tables
@ -56,17 +72,86 @@ floppy_animation:
jsr full_decomp jsr full_decomp
lda #4
sta SPRITE_Y
lda #$FF
sta backup_sprite1
sta backup_sprite2
reset_floppy_loop: reset_floppy_loop:
lda #0 lda #0
sta XPOS sta XPOS
floppy_loop: 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 ldx XPOS
lda floppy_x,X lda OLD_X
sta CURSOR_X sta OLDER_X
lda #4
sta CURSOR_Y 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 lda floppy_sprite_l,X
sta INL sta INL
lda floppy_sprite_h,X lda floppy_sprite_h,X
@ -81,20 +166,15 @@ floppy_loop:
time_loop: time_loop:
; check keypress
lda KEYPRESS ; 4 lda KEYPRESS ; 4
bmi done_floppy bmi done_floppy
lda #160 lda #160
jsr WAIT jsr WAIT
jsr inc_frame
; jsr wait_until_keypress
; see if end
inc FRAME
bne no_frame_oflo
inc FRAMEH
no_frame_oflo:
lda FRAMEH lda FRAMEH
cmp #3 cmp #3
@ -104,21 +184,15 @@ no_frame_oflo:
and #$3 and #$3
bne time_loop bne time_loop
; erase sprite
lda #<backup_sprite
sta INL
lda #>backup_sprite
sta INH
jsr hgr_draw_sprite
; move sprite ; move sprite
inc XPOS inc XPOS
lda XPOS lda XPOS
cmp #18 cmp #18
bcc floppy_loop bcc floppy_loop
bcs reset_floppy_loop jmp reset_floppy_loop
done_floppy: done_floppy:
bit KEYRESET ; clear the keyboard buffer bit KEYRESET ; clear the keyboard buffer
@ -175,6 +249,13 @@ wait_until_keypress:
bit KEYRESET ; clear the keyboard buffer bit KEYRESET ; clear the keyboard buffer
rts rts
inc_frame:
inc FRAME
bne no_frame_oflo
inc FRAMEH
no_frame_oflo:
rts
.include "zx02_optim.s" .include "zx02_optim.s"
.include "hgr_sprite.s" .include "hgr_sprite.s"
@ -230,3 +311,9 @@ floppy_mask_h:
.byte >disk_mask1,>disk_mask0 .byte >disk_mask1,>disk_mask0
backup_sprites_l:
.byte <backup_sprite1,<backup_sprite2
backup_sprites_h:
.byte >backup_sprite1,>backup_sprite2

View File

@ -2,7 +2,7 @@
; hgr draw sprite (only at 7-bit boundaries) ; hgr draw sprite (only at 7-bit boundaries)
;=========================================== ;===========================================
; SPRITE in INL/INH ; SPRITE in INL/INH
; Location at CURSOR_X CURSOR_Y ; Location at SPRITE_X SPRITE_Y
; xsize, ysize in first two bytes ; xsize, ysize in first two bytes
@ -13,7 +13,7 @@ hgr_draw_sprite:
ldy #0 ldy #0
lda (INL),Y ; load xsize lda (INL),Y ; load xsize
clc clc
adc CURSOR_X adc SPRITE_X
sta sprite_width_end_smc+1 ; self modify for end of line sta sprite_width_end_smc+1 ; self modify for end of line
iny ; load ysize iny ; load ysize
@ -37,7 +37,7 @@ hgr_sprite_yloop:
lda CURRENT_ROW ; row lda CURRENT_ROW ; row
clc clc
adc CURSOR_Y ; add in cursor_y adc SPRITE_Y ; add in cursor_y
; calc GBASL/GBASH ; calc GBASL/GBASH
@ -50,11 +50,13 @@ hgr_sprite_yloop:
; eor #$60 draws on page1 ; eor #$60 draws on page1
;hgr_sprite_page_smc: ;hgr_sprite_page_smc:
; eor #$00 ; eor #$00
clc
adc DRAW_PAGE
sta GBASH sta GBASH
; eor #$60 ; eor #$60
; sta INH ; sta INH
ldy CURSOR_X ldy SPRITE_X
sprite_inner_loop: sprite_inner_loop:

View File

@ -2,24 +2,26 @@
; hgr draw sprite mask and save (only at 7-bit boundaries) ; hgr draw sprite mask and save (only at 7-bit boundaries)
;=========================================== ;===========================================
; SPRITE in INL/INH ; SPRITE in INL/INH
; Location at CURSOR_X CURSOR_Y ; Location at SPRITE_X SPRITE_Y
; xsize, ysize in first two bytes ; xsize, ysize in first two bytes
; sprite AT INL/INH ; sprite AT INL/INH
; save at OUTL/OUTH
hgr_draw_sprite_mask_and_save: hgr_draw_sprite_mask_and_save:
ldy #0 ldy #0
lda (INL),Y ; load xsize lda (INL),Y ; load xsize
sta backup_sprite sta (OUTL),Y
clc clc
adc CURSOR_X adc SPRITE_X
sta sms_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 iny ; load ysize
lda (INL),Y lda (INL),Y
sta backup_sprite+1 sta (OUTL),Y
sta sms_sprite_ysize_smc+1 ; self modify sta sms_sprite_ysize_smc+1 ; self modify
; point smc to sprite ; point smc to sprite
@ -28,6 +30,13 @@ hgr_draw_sprite_mask_and_save:
lda INH lda INH
sta sms_sprite_smc1+2 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 lda MASKL
sta sms_mask_smc1+1 sta sms_mask_smc1+1
lda MASKH lda MASKH
@ -43,31 +52,31 @@ hgr_sms_sprite_yloop:
lda CURRENT_ROW ; row lda CURRENT_ROW ; row
clc clc
adc CURSOR_Y ; add in cursor_y adc SPRITE_Y ; add in cursor_y
; calc GBASL/GBASH ; calc GBASL/GBASH
tay ; get output ROW into GBASL/H tay ; get output ROW into GBASL/H
lda hposn_low,Y lda hposn_low,Y
sta GBASL sta GBASL
; sta INL
lda hposn_high,Y lda hposn_high,Y
; eor #$00 draws on page2
; eor #$60 draws on page1
;hgr_sprite_page_smc: ;hgr_sprite_page_smc:
; eor #$00 ; eor #$00
sta GBASH
; eor #$60
; sta INH
ldy CURSOR_X clc
adc DRAW_PAGE
sta GBASH
ldy SPRITE_X
sms_sprite_inner_loop: sms_sprite_inner_loop:
lda (GBASL),Y ; load bg lda (GBASL),Y ; load bg
sta backup_sprite,X backup_sprite_smc1:
sta $f000,X
sms_sprite_smc1: sms_sprite_smc1:
eor $f000,X ; load sprite data eor $f000,X ; load sprite data
sms_mask_smc1: sms_mask_smc1:
@ -93,4 +102,5 @@ sms_sprite_ysize_smc:
rts rts
backup_sprite = $1800 backup_sprite1 = $1800
backup_sprite2 = $1900

View File

@ -154,6 +154,9 @@ D2_XSPEED = $EB
D1_YSPEED = $EC D1_YSPEED = $EC
D2_YSPEED = $ED D2_YSPEED = $ED
OLD_X = $EC
OLDER_X = $ED
DISP_PAGE = $EE DISP_PAGE = $EE
DRAW_PAGE = $EF DRAW_PAGE = $EF
@ -161,8 +164,8 @@ DRAW_PAGE = $EF
XPOS = $F0 XPOS = $F0
YPOS = $F1 YPOS = $F1
XMAX = $F2 XMAX = $F2
CURSOR_X = $F3 SPRITE_X = $F3
CURSOR_Y = $F4 SPRITE_Y = $F4
HGR_PAGE = $F5 HGR_PAGE = $F5
CURRENT_ROW = $F6 CURRENT_ROW = $F6