mist: add save game support

had to shar a lot of code with load support so would fit

not much room left
This commit is contained in:
Vince Weaver 2020-09-05 00:34:14 -04:00
parent cc617a59de
commit 5de9e222fc
10 changed files with 188 additions and 140 deletions

View File

@ -58,7 +58,7 @@ mist.dsk: QBOOT TEXT_TITLE QLOAD \
$(DOS33_RAW) mist.dsk 0 13 SAVE3 0 1 $(DOS33_RAW) mist.dsk 0 13 SAVE3 0 1
$(DOS33_RAW) mist.dsk 0 14 SAVE4 0 1 $(DOS33_RAW) mist.dsk 0 14 SAVE4 0 1
$(DOS33_RAW) mist.dsk 0 15 SAVE5 0 1 $(DOS33_RAW) mist.dsk 0 15 SAVE5 0 1
$(DOS33_RAW) mist.dsk 1 0 QLOAD 0 13 $(DOS33_RAW) mist.dsk 1 0 QLOAD 0 14
$(DOS33_RAW) mist.dsk 2 0 MIST_TITLE 0 83 $(DOS33_RAW) mist.dsk 2 0 MIST_TITLE 0 83
$(DOS33_RAW) mist.dsk 8 0 MIST 0 159 $(DOS33_RAW) mist.dsk 8 0 MIST 0 159
$(DOS33_RAW) mist.dsk 18 0 OCTAGON 0 128 $(DOS33_RAW) mist.dsk 18 0 OCTAGON 0 128
@ -126,7 +126,7 @@ text_title.o: text_title.s text_print.s wait_a_bit.s
QLOAD: qload.o QLOAD: qload.o
ld65 -o QLOAD qload.o -C ../linker_scripts/apple2_1200.inc ld65 -o QLOAD qload.o -C ../linker_scripts/apple2_1200.inc
qload.o: qload.s \ qload.o: qload.s qboot.inc \
gr_copy.s gr_offsets.s gr_pageflip.s gr_putsprite_crop.s \ gr_copy.s gr_offsets.s gr_pageflip.s gr_putsprite_crop.s \
text_print.s gr_fast_clear.s decompress_fast_v2.s \ text_print.s gr_fast_clear.s decompress_fast_v2.s \
keyboard.s draw_pointer.s end_level.s audio.s loadstore.s \ keyboard.s draw_pointer.s end_level.s audio.s loadstore.s \

View File

@ -1,9 +1,6 @@
For release 1.0 For release 1.0
+ QLOAD + QLOAD
-- custom boot messages for disk2 and disk3
-- code to sanity check right disk is put in?
read t0/s0 check fingerprint?
+ LOADER + LOADER
-- save game -- save game

View File

@ -2,50 +2,50 @@
; external routines ; external routines
; linking_noise.s ; linking_noise.s
play_link_noise =$145e play_link_noise =$158b
; decompress_fast_v2.s ; decompress_fast_v2.s
decompress_lzsa2_fast =$147a decompress_lzsa2_fast =$15a7
getsrc_smc =$1570 getsrc_smc =$169d
; draw_pointer.s ; draw_pointer.s
draw_pointer =$157d draw_pointer =$16aa
; end_level.s ; end_level.s
end_level =$16eb end_level =$1818
; gr_copy.s ; gr_copy.s
gr_copy_to_current =$170d gr_copy_to_current =$183a
; gr_fast_clear.s ; gr_fast_clear.s
clear_bottom =$1833 clear_bottom =$1960
clear_all =$1871 clear_all =$199e
clear_all_color =$1896 clear_all_color =$19c3
; gr_offsets.s ; gr_offsets.s
gr_offsets =$18b4 gr_offsets =$19e1
; gr_page_flip.s ; gr_page_flip.s
page_flip =$18e4 page_flip =$1a11
; gr_putsprite_crop.s ; gr_putsprite_crop.s
put_sprite_crop =$18fe put_sprite_crop =$1a2b
psc_smc1 =$1921 psc_smc1 =$1a4e
psc_smc2 =$19b9 psc_smc2 =$1ae6
; keyboard.s ; keyboard.s
handle_keypress =$1a3a handle_keypress =$1b67
change_direction =$1afe change_direction =$1c2f
change_location =$1b37 change_location =$1c68
; text_print.s ; text_print.s
move_and_print =$1bcf move_and_print =$1d00
ps_smc1 =$1bfc ps_smc1 =$1d2d
; page_sprites.inc ; page_sprites.inc
blue_page_sprite =$1d18 blue_page_sprite =$1e4f
red_page_sprite =$1d2e red_page_sprite =$1e65
white_page_sprite =$1d44 white_page_sprite =$1e7b
blue_page_small_sprite =$1d5a blue_page_small_sprite =$1e91
red_page_small_sprite =$1d62 red_page_small_sprite =$1e99

View File

@ -4,68 +4,15 @@
; load the game ; load the game
;=================================== ;===================================
;=================================== ;===================================
load_game: load_game:
bit KEYRESET ; clear keyboard buffer
;===============================
; print "are you sure" message
bit SET_TEXT ; set text mode
lda #' '|$80
sta clear_all_color+1
jsr clear_all ; clear screen
lda #<load_message lda #<load_message
sta OUTL sta OUTL
lda #>load_message lda #>load_message
sta OUTH sta OUTH
jsr move_and_print
lda #<are_you_sure jsr confirm_slot
sta OUTL
lda #>are_you_sure
sta OUTH
jsr move_and_print
jsr page_flip
wait_load_confirmation:
lda KEYPRESS
bpl wait_load_confirmation
bit KEYRESET ; clear keypress
and #$7f
cmp #'Y'
bne done_load
;===============================
; print "Which one?"
jsr clear_all ; clear screen
lda #<which_message
sta OUTL
lda #>which_message
sta OUTH
jsr move_and_print
jsr page_flip
which_load_confirmation:
lda KEYPRESS
bpl which_load_confirmation
bit KEYRESET ; clear keypress
and #$7f
sec
sbc #'1'
bmi done_load
cmp #5
bcs done_load bcs done_load
; actually load it ; actually load it
@ -100,21 +47,91 @@ done_load:
;=================================== ;===================================
;=================================== ;===================================
; doesn't do anything yet
save_game: save_game:
lda #<save_message
sta OUTL
lda #>save_message
sta OUTH
jsr confirm_slot
bcs done_save
pha
;========================
; actually save
actually_save:
;===============================
; first load something from
; disk1/track0 to seek the head there
lda WHICH_LOAD
pha
lda #LOAD_SAVE1
sta WHICH_LOAD
jsr load_file
pla
sta WHICH_LOAD
; copy save data to $d00
ldx #0
copy_loop:
lda WHICH_LOAD,X
sta $d00,X
inx
cpx #(END_OF_SAVE-WHICH_LOAD+1)
bne copy_loop
; spin up disk
jsr driveon
; actually save it
pla
clc
adc #11
sta requested_sector+1
jsr sector_write
jsr driveoff
done_save:
jsr change_location ; restore graphics
rts
;================================
; confirm and get slot number
;================================
; call with first message in OUTL/OUTH
; return: carry set if skipping
confirm_slot:
bit KEYRESET ; clear keyboard buffer bit KEYRESET ; clear keyboard buffer
;===============================
; print "are you sure" message
bit SET_TEXT ; set text mode bit SET_TEXT ; set text mode
lda #' '|$80 lda #' '|$80
sta clear_all_color+1 sta clear_all_color+1
jsr clear_all ; clear screen jsr clear_all ; clear screen
lda #<save_message
sta OUTL
lda #>save_message
sta OUTH
jsr move_and_print jsr move_and_print
lda #<are_you_sure lda #<are_you_sure
@ -125,31 +142,53 @@ save_game:
jsr page_flip jsr page_flip
wait_save_confirmation: wait_confirmation:
lda KEYPRESS lda KEYPRESS
bpl wait_save_confirmation bpl wait_confirmation
bit KEYRESET ; clear keypress bit KEYRESET ; clear keypress
and #$7f and #$7f
cmp #'Y' cmp #'Y'
bne done_load bne dont_do_it
; actually load it ;===============================
; print "Which one?"
jsr clear_all ; clear screen
done_store: lda #<which_message
sta OUTL
lda #>which_message
sta OUTH
jsr move_and_print
jsr page_flip
bit SET_GR ; turn graphics back on which_slot:
lda KEYPRESS
bpl which_slot
bit KEYRESET ; clear keypress
and #$7f
sec
sbc #'1'
bmi dont_do_it
cmp #5
bcs dont_do_it
clc
rts
dont_do_it:
sec
rts rts
which_message: which_message:
.byte 9,5,"LOAD WHICH GAME (1-5)?",0 .byte 9,5,"WHICH SLOT (1-5)?",0
load_message: load_message:
.byte 10,5,"LOAD GAME FROM DISK",0 .byte 10,5,"LOAD GAME FROM DISK",0

8
mist/qboot.inc Normal file
View File

@ -0,0 +1,8 @@
seek = $1126
driveon = $119D
driveoff = $1122
load_new = $11AB
load_address=$11C4
load_track=load_address+1
load_sector=load_address+2
load_length=load_address+3

View File

@ -1,7 +1,9 @@
; fast seek/multi-read ; fast seek/multi-read
; copyright (c) Peter Ferrie 2015-16 ; copyright (c) Peter Ferrie 2015-16
sectors = 13 ; user-defined ; Paramaters for loading QLOAD
sectors = 14 ; user-defined
firsttrk = 1 ; user-defined, first track to read firsttrk = 1 ; user-defined, first track to read
firstsec = 0 ; user-defined, first sector to read firstsec = 0 ; user-defined, first sector to read
address = $12 ; user-defined address = $12 ; user-defined
@ -95,7 +97,7 @@ patch_loop:
; patch self-modifying code for turning motor on ; patch self-modifying code for turning motor on
clc clc
adc #1 ; MOTOROFF (c088) -> c0e9 adc #1 ; MOTORON (c089) -> c0e9
sta slotpatch9+1 sta slotpatch9+1
; patch self-modifying code for phase off ; patch self-modifying code for phase off

View File

@ -311,12 +311,15 @@ partial2: .byte $00
code_end: code_end:
load_new:
;==========================
; enable drive motor ; enable drive motor
;==========================
driveon:
slotpatch9: slotpatch9:
lda $c0e9 ; fixme, patch lda $c0d1
; wait 1s ; wait 1s
@ -327,15 +330,11 @@ wait_1s:
dex dex
bne wait_1s bne wait_1s
; setup return on stack rts
; is value - 1
; lda load_address load_new:
; sec
; sbc #1 jsr driveon
; pha
; lda #$ff
; pha
lda load_track lda load_track
asl ; track to start*2 asl ; track to start*2
@ -362,4 +361,3 @@ load_sector:
load_length: load_length:
.byte $00 .byte $00

View File

@ -1,14 +1,28 @@
; popwr -- code provided by qkumba ; popwr -- code provided by qkumba
; !cpu 6502
; !to "popwr",plain
; *=$d500
;bit2tbl=$dc00 ; in loader.s
frombuff=$d00 ; sector data to write frombuff=$d00 ; sector data to write
; note these must be contiguous
encbuf=$e00 ; nibble buffer must be page alined encbuf=$e00 ; nibble buffer must be page alined
bit2tbl=$f00
readnib = $1001
readd5aa:
try_again:
jsr readnib
try_for_d5:
cmp #$d5
bne try_again
jsr readnib
cmp #$aa
bne try_for_d5
jsr readnib
rts
;================================ ;================================
@ -76,10 +90,7 @@ b3:
requested_sector: requested_sector:
tay cmp #$d1
; at this point A has the sector number
; this code assumes you want sector 0
bne cmpsecwr ; retry if not what we want? bne cmpsecwr ; retry if not what we want?

View File

@ -4,9 +4,14 @@
.include "hardware.inc" .include "hardware.inc"
.include "common_defines.inc" .include "common_defines.inc"
.include "qboot.inc"
qload_start: qload_start:
; init the write code
jsr popwr_init
; first time entry ; first time entry
; start by loading text title ; start by loading text title
@ -37,18 +42,6 @@ not_title:
jsr $2000 jsr $2000
jmp main_game_loop jmp main_game_loop
; FIXME: have to keep these in sync
driveoff =$1122
load_new = $119D
load_address=$11C0
load_track=load_address+1
load_sector=load_address+2
load_length=load_address+3
;==================================== ;====================================
; loads file specified by WHICH_LOAD ; loads file specified by WHICH_LOAD
;==================================== ;====================================
@ -228,7 +221,7 @@ length_array:
.byte 1,1,1,1,1 ; SAVE1,SAVE2,SAVE3,SAVE4,SAVE5 .byte 1,1,1,1,1 ; SAVE1,SAVE2,SAVE3,SAVE4,SAVE5
.byte 1 ; FIRST_SECTOR .byte 1 ; FIRST_SECTOR
; .include "qkumba_popwr.s" .include "qkumba_popwr.s"
.include "audio.s" .include "audio.s"
.include "linking_noise.s" .include "linking_noise.s"

View File

@ -37,13 +37,13 @@ text_loop:
boot_message: boot_message:
.byte 0,0,"LOADING MIST V0.99.5",0 .byte 0,0, "LOADING MIST V0.99.6",0
.byte 0,3,"CONTROLS:",0 .byte 0,3, "CONTROLS:",0
.byte 5,4,"MOVE CURSOR : ARROWS OR WASD",0 .byte 5,4, "MOVE CURSOR : ARROWS OR WASD",0
.byte 5,5,"FORWARD/ACTION : ENTER",0 .byte 5,5, "FORWARD/ACTION : ENTER",0
.byte 5,7,"JOYSTICK (TODO): J",0 .byte 5,7, "JOYSTICK (TODO): J",0
.byte 5,8,"LOAD GAME : CONTROL-L",0 .byte 5,8, "LOAD GAME : CONTROL-L",0
.byte 5,9,"SAVE (TODO) : CONTROL-S",0 .byte 5,9, "SAVE : CONTROL-S",0
.byte 5,10,"TOGGLE SOUND : CONTROL-T",0 .byte 5,10,"TOGGLE SOUND : CONTROL-T",0
.byte 0,13,"BASED ON MYST BY CYAN INC",0 .byte 0,13,"BASED ON MYST BY CYAN INC",0
.byte 0,14,"APPLE II PORT: VINCE WEAVER",0 .byte 0,14,"APPLE II PORT: VINCE WEAVER",0