peasant: only save part of hires screen

trying to avoid peasant flicker, seems to be improved
This commit is contained in:
Vince Weaver 2021-08-16 01:31:49 -04:00
parent 825082d087
commit 1d04940324
14 changed files with 320 additions and 176 deletions

View File

@ -69,9 +69,11 @@ title.o: title.s \
INTRO: intro.o INTRO: intro.o
ld65 -o INTRO intro.o -C $(LINKER_SCRIPTS)/apple2_6000.inc ld65 -o INTRO intro.o -C $(LINKER_SCRIPTS)/apple2_6000.inc
intro.o: intro.s graphics/graphics_intro.inc sprites/peasant_sprite.inc \ intro.o: intro.s zp.inc \
graphics/graphics_intro.inc sprites/peasant_sprite.inc \
draw_box.s hgr_rectangle.s hgr_font.s hgr_input.s \ draw_box.s hgr_rectangle.s hgr_font.s hgr_input.s \
hgr_7x30_sprite.s hgr_1x5_sprite.s hgr_save_restore.s \ hgr_7x30_sprite.s hgr_1x5_sprite.s hgr_save_restore.s \
hgr_partial_save.s \
wait_a_bit.s draw_peasant.s hgr_text_box.s \ wait_a_bit.s draw_peasant.s hgr_text_box.s \
title.s directions.s \ title.s directions.s \
intro_cottage.s intro_lake_w.s intro_lake_e.s \ intro_cottage.s intro_lake_w.s intro_lake_e.s \
@ -83,7 +85,8 @@ intro.o: intro.s graphics/graphics_intro.inc sprites/peasant_sprite.inc \
PEASANT: peasant.o PEASANT: peasant.o
ld65 -o PEASANT peasant.o -C $(LINKER_SCRIPTS)/apple2_6000.inc ld65 -o PEASANT peasant.o -C $(LINKER_SCRIPTS)/apple2_6000.inc
peasant.o: peasant.s graphics/graphics.inc sprites/peasant_sprite.inc \ peasant.o: peasant.s zp.inc \
graphics/graphics.inc sprites/peasant_sprite.inc \
draw_box.s hgr_rectangle.s hgr_font.s hgr_input.s \ draw_box.s hgr_rectangle.s hgr_font.s hgr_input.s \
hgr_7x30_sprite.s hgr_1x5_sprite.s hgr_save_restore.s \ hgr_7x30_sprite.s hgr_1x5_sprite.s hgr_save_restore.s \
wait_a_bit.s draw_peasant.s hgr_text_box.s \ wait_a_bit.s draw_peasant.s hgr_text_box.s \

View File

@ -21,12 +21,12 @@ $D0-$FF ROM
Disk Map (disk has 35 tracks, each 4k in size) Disk Map (disk has 35 tracks, each 4k in size)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
T 0 = Qboot T 0 = Qboot
T 1 = QLOAD 4301 bytes 17S = 1T1S T 1 = QLOAD 4813 bytes 19S = 1T3S
T 3 = VID_LOGO 6911 bytes 27S = 1T11S T 3 = VID_LOGO 6911 bytes 27S = 1T11S
T 5 = TITLE 9662 bytes 38S = 2T6S T 5 = TITLE 9662 bytes 38S = 2T6S
T 8 = INTRO 14265 bytes 56S = 3T8S T 8 = INTRO 16040 bytes 63S = 3T15S
T 12 = COPY_CHECK 4642 bytes 18S = 1T2S T 12 = COPY_CHECK 4922 bytes 20S = 1T4S
T 14 = PEASANT 15332 bytes 60S = 3T12S ; 88 is max? T 14 = PEASANT 18501 bytes 73S = 4T9S ; 88 is max?
238, to 280 (6) 238, to 280 (6)

View File

@ -120,6 +120,7 @@ forever:
.include "hgr_input.s" .include "hgr_input.s"
.include "hgr_tables.s" .include "hgr_tables.s"
.include "hgr_text_box.s" .include "hgr_text_box.s"
.include "hgr_partial_save.s"
.include "graphics_copy/copy_graphics.inc" .include "graphics_copy/copy_graphics.inc"

View File

@ -0,0 +1,80 @@
;=======================
; HGR Partial Save
;=======================
; loads from $40
; save to $20
; only save from row in P2 to P2+P4
hgr_partial_save:
clc
lda BOX_Y1
sta SAVED_Y1
ldx BOX_Y2
stx SAVED_Y2
partial_save_yloop:
lda hposn_low,X
sta psx_smc1+1
sta psx_smc2+1
lda hposn_high,X
sta psx_smc1+2
sec
sbc #$20
sta psx_smc2+2
ldy #$27
partial_save_xloop:
psx_smc1:
lda $d000,Y
psx_smc2:
sta $d000,Y
dey
bpl partial_save_xloop
dex
cpx BOX_Y1
bcs partial_save_yloop
rts
;=======================
; HGR Partial Restore
;=======================
; loads from $20
; save to $40
hgr_partial_restore:
ldx SAVED_Y2
partial_restore_yloop:
lda hposn_low,X
sta prx_smc2+1
sta prx_smc1+1
lda hposn_high,X
sta prx_smc2+2
sec
sbc #$20
sta prx_smc1+2
ldy #$27
partial_restore_xloop:
prx_smc1:
lda $d000,Y
prx_smc2:
sta $d000,Y
dey
bpl partial_restore_xloop
dex
cpx SAVED_Y1
bcs partial_restore_yloop ; bge
rts

View File

@ -32,6 +32,8 @@ hgr_text_box:
lda (OUTL),Y lda (OUTL),Y
sta BOX_Y2 sta BOX_Y2
jsr hgr_partial_save
jsr draw_box jsr draw_box
clc clc

View File

@ -84,6 +84,8 @@ peasant_quest_intro:
; Start actual game ; Start actual game
;************************ ;************************
jsr draw_peasant
; wait a bit ; wait a bit
lda #10 lda #10
@ -94,9 +96,7 @@ escape_handler:
sei ; turn off music sei ; turn off music
jsr clear_ay_both ; clear AY state jsr clear_ay_both ; clear AY state
jsr draw_peasant ; jsr draw_peasant
; start game ; start game
@ -122,7 +122,8 @@ escape_handler:
.include "hgr_rectangle.s" .include "hgr_rectangle.s"
.include "hgr_7x30_sprite.s" .include "hgr_7x30_sprite.s"
.include "hgr_1x5_sprite.s" .include "hgr_1x5_sprite.s"
.include "hgr_save_restore.s" ;.include "hgr_save_restore.s"
.include "hgr_partial_save.s"
.include "hgr_input.s" .include "hgr_input.s"
.include "hgr_tables.s" .include "hgr_tables.s"
.include "hgr_text_box.s" .include "hgr_text_box.s"

View File

@ -44,7 +44,7 @@ cottage:
jsr hgr_put_string jsr hgr_put_string
jsr hgr_save ; jsr hgr_save
;==================== ;====================
; save background ; save background
@ -60,50 +60,18 @@ cottage:
jsr save_bg_7x30 jsr save_bg_7x30
cottage_walk_loop: cottage_walk_loop:
lda PEASANT_X
sta CURSOR_X
lda PEASANT_Y
sta CURSOR_Y
jsr restore_bg_7x30 jsr restore_bg_7x30
lda FRAME
check_cottage_action1:
cmp #0
bne check_cottage_action2
; display cottage text 1 ;=======================
; draw peasant
lda #<cottage_text1
sta OUTL
lda #>cottage_text1
jmp finish_cottage_action
check_cottage_action2:
cmp #1
bne check_cottage_action3
jsr hgr_restore
; display cottage text 2
lda #<cottage_text2
sta OUTL
lda #>cottage_text2
jmp finish_cottage_action
check_cottage_action3:
cmp #13
bne done_cottage_action
jsr hgr_restore
; display cottage text 3
lda #<cottage_text3
sta OUTL
lda #>cottage_text3
finish_cottage_action:
sta OUTH
jsr hgr_text_box
done_cottage_action:
lda FRAME lda FRAME
asl asl
@ -123,6 +91,56 @@ done_cottage_action:
jsr draw_peasant jsr draw_peasant
;========================
; handle special
lda FRAME
check_cottage_action1:
cmp #0
bne check_cottage_action2
; display cottage text 1
lda #<cottage_text1
sta OUTL
lda #>cottage_text1
jmp finish_cottage_action
check_cottage_action2:
cmp #1
bne check_cottage_action3
jsr hgr_partial_restore
; display cottage text 2
lda #<cottage_text2
sta OUTL
lda #>cottage_text2
jmp finish_cottage_action
check_cottage_action3:
cmp #13
bne done_cottage_action
jsr hgr_partial_restore
; display cottage text 3
lda #<cottage_text3
sta OUTL
lda #>cottage_text3
finish_cottage_action:
sta OUTH
jsr hgr_text_box
done_cottage_action:
; jsr wait_until_keypress ; jsr wait_until_keypress
lda FRAME lda FRAME
@ -188,7 +206,7 @@ cottage_text2:
; wait a few seconds, then start walking toward cottage ; wait a few seconds, then start walking toward cottage
cottage_text3: cottage_text3:
.byte 0,30,20, 0,253,86 .byte 0,28,20, 0,252,86
.byte 7,33,"With nothing left to lose,",13 .byte 7,33,"With nothing left to lose,",13
.byte "you swear to get revenge on",13 .byte "you swear to get revenge on",13
.byte "the Wingaling Dragon in the",13 .byte "the Wingaling Dragon in the",13

View File

@ -39,7 +39,7 @@ knight:
jsr hgr_put_string jsr hgr_put_string
jsr hgr_save ; jsr hgr_save
;==================== ;====================
@ -56,42 +56,15 @@ knight:
jsr save_bg_7x30 jsr save_bg_7x30
knight_walk_loop: knight_walk_loop:
lda PEASANT_X
sta CURSOR_X
lda PEASANT_Y
sta CURSOR_Y
jsr restore_bg_7x30 jsr restore_bg_7x30
lda FRAME ; draw peasant
check_knight_action1:
cmp #0
bne check_knight_action2
lda #<river_message1
sta OUTL
lda #>river_message1
sta OUTH
jsr hgr_text_box
jmp done_knight_action
check_knight_action2:
cmp #8
bne check_knight_action3
jsr hgr_restore
jmp done_knight_action
check_knight_action3:
cmp #17
bne done_knight_action
lda #<knight_message1
sta OUTL
lda #>knight_message1
sta OUTH
jsr hgr_text_box
done_knight_action:
lda FRAME lda FRAME
asl asl
@ -111,6 +84,45 @@ done_knight_action:
jsr draw_peasant jsr draw_peasant
lda FRAME
check_knight_action1:
cmp #0
bne check_knight_action2
lda #<river_message1
sta OUTL
lda #>river_message1
sta OUTH
jsr hgr_text_box
jmp done_knight_action
check_knight_action2:
cmp #8
bne check_knight_action3
jsr hgr_partial_restore
jmp done_knight_action
check_knight_action3:
cmp #17
bne done_knight_action
lda #<knight_message1
sta OUTL
lda #>knight_message1
sta OUTH
jsr hgr_text_box
done_knight_action:
; jsr wait_until_keypress ; jsr wait_until_keypress
lda #3 lda #3

View File

@ -36,7 +36,7 @@ lake_east:
jsr hgr_put_string jsr hgr_put_string
jsr hgr_save ; jsr hgr_save
;==================== ;====================
@ -53,32 +53,15 @@ lake_east:
jsr save_bg_7x30 jsr save_bg_7x30
lake_e_walk_loop: lake_e_walk_loop:
lda PEASANT_X
sta CURSOR_X
lda PEASANT_Y
sta CURSOR_Y
jsr restore_bg_7x30 jsr restore_bg_7x30
lda FRAME ; draw peasant
check_lake_e_action1:
cmp #10
bne check_lake_e_action2
lda #<lake_e_message1
sta OUTL
lda #>lake_e_message1
sta OUTH
jsr hgr_text_box
jmp done_lake_e_action
check_lake_e_action2:
cmp #28
bne done_lake_e_action
jsr hgr_restore
lda #PEASANT_DIR_UP
sta PEASANT_DIR
done_lake_e_action:
jsr update_bubbles_e
lda FRAME lda FRAME
asl asl
@ -98,6 +81,34 @@ done_lake_e_action:
jsr draw_peasant jsr draw_peasant
lda FRAME
check_lake_e_action1:
cmp #10
bne check_lake_e_action2
lda #<lake_e_message1
sta OUTL
lda #>lake_e_message1
sta OUTH
jsr hgr_text_box
jmp done_lake_e_action
check_lake_e_action2:
cmp #28
bne done_lake_e_action
jsr hgr_partial_restore
lda #PEASANT_DIR_UP
sta PEASANT_DIR
done_lake_e_action:
jsr update_bubbles_e
; jsr wait_until_keypress ; jsr wait_until_keypress
lda #3 lda #3

View File

@ -38,7 +38,7 @@ lake_west:
jsr hgr_put_string jsr hgr_put_string
jsr hgr_save ; jsr hgr_save
;==================== ;====================
; save background ; save background
@ -54,32 +54,15 @@ lake_west:
jsr save_bg_7x30 jsr save_bg_7x30
lake_w_walk_loop: lake_w_walk_loop:
lda PEASANT_X
sta CURSOR_X
lda PEASANT_Y
sta CURSOR_Y
jsr restore_bg_7x30 jsr restore_bg_7x30
lda FRAME ; draw peasant
check_lake_w_action1:
cmp #0
bne check_lake_w_action2
; re-display cottage text 3
lda #<cottage_text3
sta OUTL
lda #>cottage_text3
sta OUTH
jsr hgr_text_box
jmp done_lake_w_action
check_lake_w_action2:
cmp #20
bne done_lake_w_action
jsr hgr_restore
jsr display_lake_w_text1
done_lake_w_action:
jsr update_bubbles
lda FRAME lda FRAME
asl asl
@ -99,6 +82,36 @@ done_lake_w_action:
jsr draw_peasant jsr draw_peasant
lda FRAME
check_lake_w_action1:
cmp #0
bne check_lake_w_action2
; re-display cottage text 3
lda #<cottage_text3
sta OUTL
lda #>cottage_text3
sta OUTH
jsr hgr_text_box
jmp done_lake_w_action
check_lake_w_action2:
cmp #20
bne done_lake_w_action
jsr hgr_partial_restore
jsr display_lake_w_text1
done_lake_w_action:
jsr update_bubbles
; jsr wait_until_keypress ; jsr wait_until_keypress
lda #3 lda #3
@ -125,7 +138,7 @@ done_lake_w:
; walk halfway across the screen ; walk halfway across the screen
lake_w_message1: lake_w_message1:
.byte 0,43,24, 0,253,82 .byte 0,42,24, 0,252,82
.byte 8,41,"You head east toward the",13 .byte 8,41,"You head east toward the",13
.byte "mountain atop which",13 .byte "mountain atop which",13
.byte "TROGDOR lives.",0 .byte "TROGDOR lives.",0
@ -345,9 +358,3 @@ bubble_sprite5:
.byte $88 ; 1XX0 10XX .byte $88 ; 1XX0 10XX
.byte $2A ; 0010 1010 .byte $2A ; 0010 1010

View File

@ -56,8 +56,35 @@ river:
jsr save_bg_7x30 jsr save_bg_7x30
river_walk_loop: river_walk_loop:
lda PEASANT_X
sta CURSOR_X
lda PEASANT_Y
sta CURSOR_Y
jsr restore_bg_7x30 jsr restore_bg_7x30
; draw peasant
lda FRAME
asl
tax
lda river_path,X
bmi done_river
sta PEASANT_X
sta CURSOR_X
inx
lda river_path,X
sta PEASANT_Y
sta CURSOR_Y
jsr save_bg_7x30
jsr draw_peasant
lda FRAME lda FRAME
check_river_action1: check_river_action1:
cmp #10 cmp #10
@ -84,23 +111,7 @@ done_river_action:
jsr update_bubbles_r jsr update_bubbles_r
lda FRAME
asl
tax
lda river_path,X
bmi done_river
sta PEASANT_X
sta CURSOR_X
inx
lda river_path,X
sta PEASANT_Y
sta CURSOR_Y
jsr save_bg_7x30
jsr draw_peasant
; jsr wait_until_keypress ; jsr wait_until_keypress

View File

@ -100,7 +100,7 @@ new_location:
; jsr clear_bottom ; jsr clear_bottom
jsr hgr_save ; jsr hgr_save
;==================== ;====================
; save background ; save background
@ -275,7 +275,7 @@ score_text:
parse_input: parse_input:
jsr hgr_save ; jsr hgr_save
lda input_buffer ; get first char FIXME lda input_buffer ; get first char FIXME
and #$DF ; make uppercase 0110 0001 -> 0100 0001 and #$DF ; make uppercase 0110 0001 -> 0100 0001
@ -331,14 +331,10 @@ finish_parse_message:
jsr wait_until_keypress jsr wait_until_keypress
done_parse_message: done_parse_message:
jsr hgr_restore jsr hgr_partial_restore
rts rts
.include "decompress_fast_v2.s" .include "decompress_fast_v2.s"
.include "wait_keypress.s" .include "wait_keypress.s"
@ -349,7 +345,8 @@ done_parse_message:
.include "hgr_rectangle.s" .include "hgr_rectangle.s"
.include "hgr_7x30_sprite.s" .include "hgr_7x30_sprite.s"
.include "hgr_1x5_sprite.s" .include "hgr_1x5_sprite.s"
.include "hgr_save_restore.s" ;.include "hgr_save_restore.s"
.include "hgr_partial_save.s"
.include "hgr_input.s" .include "hgr_input.s"
.include "hgr_tables.s" .include "hgr_tables.s"
.include "hgr_text_box.s" .include "hgr_text_box.s"

View File

@ -20,12 +20,12 @@ HGR_PAGE = $E6
DISP_PAGE = $F0 DISP_PAGE = $F0
DRAW_PAGE = $F1 DRAW_PAGE = $F1
P0 = $F1 ;P0 = $F1
P1 = $F2 ;P1 = $F2
P2 = $F3 ;P2 = $F3
P3 = $F4 ;P3 = $F4
P4 = $F5 ;P4 = $F5
P5 = $F6 ;P5 = $F6
INL = $FC INL = $FC
INH = $FD INH = $FD

View File

@ -80,14 +80,14 @@ BOX_Y1 = $C3
BOX_X2L = $C4 BOX_X2L = $C4
BOX_X2H = $C5 BOX_X2H = $C5
BOX_Y2 = $C6 BOX_Y2 = $C6
SAVED_Y1 = $C7
SAVED_Y2 = $C8
WHICH_SLOT = $DA WHICH_SLOT = $DA
CURRENT_DISK = $DC CURRENT_DISK = $DC
HGR_COLOR = $E4 HGR_COLOR = $E4
HGR_PAGE = $E6 HGR_PAGE = $E6
P0 = $F1 P0 = $F1
P1 = $F2 P1 = $F2
P2 = $F3 P2 = $F3
@ -95,6 +95,7 @@ P3 = $F4
P4 = $F5 P4 = $F5
P5 = $F6 P5 = $F6
INL = $FC INL = $FC
INH = $FD INH = $FD
OUTL = $FE OUTL = $FE