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:
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 INL
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
backup_sprites_h:
.byte >backup_sprite1,>backup_sprite2

View File

@ -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:

View File

@ -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

View File

@ -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