mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-29 00:31:52 +00:00
809 lines
13 KiB
ArmAsm
809 lines
13 KiB
ArmAsm
; load/save menu
|
|
|
|
; o/~ It's the Loading Screen o/~
|
|
|
|
; FIXME: we can share some of the code here a bit more
|
|
|
|
;=====================
|
|
; load_menu
|
|
;=====================
|
|
load_menu:
|
|
lda #0
|
|
sta loadsave_smc1+1
|
|
sta loadsave_smc2+1
|
|
|
|
jmp common_menu
|
|
|
|
;=====================
|
|
; save_menu
|
|
;=====================
|
|
save_menu:
|
|
lda #1
|
|
sta loadsave_smc1+1
|
|
sta loadsave_smc2+1
|
|
|
|
jmp common_menu
|
|
|
|
|
|
;=====================
|
|
; common_menu
|
|
;=====================
|
|
common_menu:
|
|
|
|
;============================
|
|
; first read all three saves
|
|
; updating the save info
|
|
|
|
jsr update_save_info
|
|
|
|
;============================
|
|
; Next update the save message
|
|
|
|
ldx #0
|
|
|
|
lda #<(save_pts1+7)
|
|
sta OUTL
|
|
lda #>(save_pts1+7)
|
|
sta OUTH
|
|
|
|
update_save_loop:
|
|
|
|
|
|
;======================
|
|
; print points
|
|
;======================
|
|
|
|
ldy #0
|
|
|
|
sty usl_leading_zero_smc+1
|
|
|
|
usl_hundreds:
|
|
lda load_slot_pts_high,X ; get the points high
|
|
beq usl_no_hundreds
|
|
|
|
inc usl_leading_zero_smc+1
|
|
|
|
clc
|
|
adc #'0' ; convert to ascii
|
|
bne usl_print_hundreds ; bra
|
|
|
|
usl_no_hundreds:
|
|
lda #' ' ; no leading 0
|
|
usl_print_hundreds:
|
|
sta (OUTL),Y
|
|
|
|
iny
|
|
|
|
usl_tens:
|
|
lda load_slot_pts_low,X ; get the points low
|
|
lsr
|
|
lsr
|
|
lsr
|
|
lsr
|
|
|
|
bne usl_go_tens
|
|
|
|
usl_leading_zero_smc:
|
|
cmp #0
|
|
beq usl_no_tens
|
|
|
|
usl_go_tens:
|
|
adc #'0' ; convert to ASCII
|
|
bne usl_print_tens ; bra
|
|
|
|
usl_no_tens:
|
|
lda #' ' ; no leading 0
|
|
|
|
usl_print_tens:
|
|
sta (OUTL),Y
|
|
|
|
iny
|
|
|
|
usl_ones:
|
|
lda load_slot_pts_low,X ; get the points low
|
|
|
|
and #$f
|
|
clc
|
|
adc #'0' ; convert to ascii
|
|
sta (OUTL),Y
|
|
|
|
; move to text line
|
|
|
|
clc
|
|
lda OUTL
|
|
adc #8
|
|
sta OUTL
|
|
lda OUTH
|
|
adc #0
|
|
sta OUTH
|
|
|
|
|
|
;========================
|
|
; clear out the old name
|
|
|
|
ldy #25
|
|
lda #' ' ; clear to space
|
|
save_memset:
|
|
sta (OUTL),Y
|
|
dey
|
|
bpl save_memset
|
|
|
|
;=========================
|
|
; load the name
|
|
|
|
ldy load_slot_levels,X ; get the level
|
|
|
|
lda location_names_l,Y
|
|
sta INL
|
|
lda location_names_h,Y
|
|
sta INH
|
|
|
|
jsr strcat
|
|
|
|
;==========================
|
|
; move out pointer to next
|
|
|
|
clc
|
|
lda OUTL
|
|
adc #35
|
|
sta OUTL
|
|
lda OUTH
|
|
adc #0
|
|
sta OUTH
|
|
|
|
inx
|
|
cpx #3
|
|
bne update_save_loop
|
|
|
|
|
|
lda #0
|
|
sta INVENTORY_Y
|
|
|
|
;==========================
|
|
; save bg range to restore
|
|
|
|
lda #20
|
|
sta BOX_Y1
|
|
sta SAVED_Y1
|
|
|
|
lda #135
|
|
sta BOX_Y2
|
|
sta SAVED_Y2
|
|
|
|
; jsr hgr_partial_save
|
|
|
|
|
|
;====================
|
|
; draw text box
|
|
draw_loadsave_box:
|
|
|
|
lda #0
|
|
sta BOX_X1H
|
|
lda #14
|
|
sta BOX_X1L
|
|
lda #20
|
|
sta BOX_Y1
|
|
|
|
lda #1
|
|
sta BOX_X2H
|
|
lda #5 ; ?
|
|
sta BOX_X2L
|
|
lda #135
|
|
sta BOX_Y2
|
|
|
|
jsr draw_box
|
|
|
|
;===================
|
|
; draw main text
|
|
draw_loadsave_text:
|
|
|
|
loadsave_smc1:
|
|
lda #0
|
|
bne do_save_message
|
|
|
|
do_load_message:
|
|
; load message
|
|
lda #<load_message
|
|
sta OUTL
|
|
lda #>load_message
|
|
jmp loadsave_ready
|
|
|
|
do_save_message:
|
|
; save message
|
|
lda #<save_message
|
|
sta OUTL
|
|
lda #>save_message
|
|
|
|
loadsave_ready:
|
|
sta OUTH
|
|
|
|
jsr disp_put_string
|
|
|
|
|
|
lda #<save_details
|
|
sta OUTL
|
|
lda #>save_details
|
|
sta OUTH
|
|
|
|
jsr disp_put_string
|
|
|
|
|
|
;======================
|
|
; draw highlighted text
|
|
;======================
|
|
|
|
|
|
lda #<save_titles
|
|
sta OUTL
|
|
lda #>save_titles
|
|
sta OUTH
|
|
|
|
jsr disp_put_string
|
|
jsr disp_put_string
|
|
jsr disp_put_string
|
|
jsr disp_put_string
|
|
|
|
ldy #0
|
|
jsr overwrite_entry_ls
|
|
|
|
;===========================
|
|
; handle inventory keypress
|
|
;===========================
|
|
|
|
handle_loadsave_keypress:
|
|
|
|
lda KEYPRESS
|
|
bpl handle_loadsave_keypress ; no keypress
|
|
|
|
bit KEYRESET ; clear keyboard strobe
|
|
|
|
pha
|
|
|
|
;=================
|
|
; erase old
|
|
|
|
ldy INVENTORY_Y
|
|
jsr overwrite_entry_ls
|
|
|
|
pla
|
|
|
|
and #$7f ; clear top bit
|
|
|
|
cmp #27
|
|
beq urgh_done_ls ; ESCAPE
|
|
cmp #$7f
|
|
bne ls_check_down ; DELETE
|
|
|
|
urgh_done_ls:
|
|
jmp done_ls_keypress
|
|
|
|
ls_check_down:
|
|
and #$5F ; make uppercase
|
|
|
|
cmp #$0A
|
|
beq ls_handle_down
|
|
cmp #'S'
|
|
bne ls_check_up
|
|
ls_handle_down:
|
|
|
|
ldx INVENTORY_Y
|
|
cpx #3
|
|
beq ls_down_wrap
|
|
|
|
inx
|
|
|
|
jmp ls_down_done
|
|
ls_down_wrap:
|
|
ldx #0
|
|
|
|
ls_down_done:
|
|
stx INVENTORY_Y
|
|
jmp ls_done_moving
|
|
|
|
ls_check_up:
|
|
cmp #$0B
|
|
beq ls_handle_up
|
|
cmp #'W'
|
|
bne ls_check_return
|
|
ls_handle_up:
|
|
|
|
ldx INVENTORY_Y
|
|
beq ls_up_wrap
|
|
|
|
dex
|
|
jmp ls_up_done
|
|
|
|
ls_up_wrap:
|
|
ldx #3
|
|
|
|
ls_up_done:
|
|
stx INVENTORY_Y
|
|
jmp ls_done_moving
|
|
|
|
|
|
ls_check_return:
|
|
|
|
cmp #13
|
|
beq ls_return
|
|
cmp #' '
|
|
bne ls_done_moving
|
|
|
|
ls_return:
|
|
|
|
ldy INVENTORY_Y
|
|
cpy #3
|
|
bne do_actual_load
|
|
|
|
; back was hit
|
|
|
|
rts
|
|
|
|
do_actual_load:
|
|
|
|
loadsave_smc2:
|
|
lda #0
|
|
bne go_for_save
|
|
|
|
go_for_load:
|
|
jmp load_game
|
|
|
|
go_for_save:
|
|
jmp save_game
|
|
|
|
|
|
ls_done_moving:
|
|
|
|
;================
|
|
; draw new
|
|
ldy INVENTORY_Y
|
|
jsr overwrite_entry_ls
|
|
|
|
;================
|
|
; repeat
|
|
|
|
jmp handle_loadsave_keypress
|
|
|
|
done_ls_keypress:
|
|
|
|
rts
|
|
|
|
;======================
|
|
; text
|
|
;======================
|
|
|
|
; it's a save game menu
|
|
|
|
; SAVE 1 ?? 115 PTS
|
|
; ?? Cliff base
|
|
;
|
|
; SAVE 2 ?? 133 PTS
|
|
; ?? Trogdor's outer sanctum
|
|
;
|
|
; SAVE 3 ?? 34 PTS
|
|
; ?? That hay bale
|
|
;
|
|
; BACK
|
|
|
|
load_message:
|
|
.byte 10,28
|
|
.byte "it's a load game menu",0
|
|
|
|
save_message:
|
|
.byte 10,28
|
|
.byte "it's a save game menu",0
|
|
|
|
save_details:
|
|
.byte 10,44
|
|
save_pts1:
|
|
.byte " 115 PTS",13
|
|
save_name1:
|
|
.byte "Cliff base ",13
|
|
.byte 13
|
|
.byte " 133 PTS",13
|
|
save_name2:
|
|
.byte "Trogdor's outer sanctum ",13
|
|
.byte 13
|
|
.byte " 34 PTS",13
|
|
save_name3:
|
|
.byte "That hay bale ",13
|
|
.byte 0
|
|
|
|
save_titles:
|
|
.byte 6,44, "SLOT 1",0
|
|
.byte 6,68, "SLOT 2",0
|
|
.byte 6,92, "SLOT 3",0
|
|
.byte 6,116,"BACK",0
|
|
|
|
|
|
;========================
|
|
; overwrite entry_ls
|
|
;========================
|
|
; Y = which
|
|
|
|
overwrite_entry_ls:
|
|
lda invert_smc1+1
|
|
eor #$7f
|
|
sta invert_smc1+1
|
|
|
|
lda #6
|
|
sta CURSOR_X
|
|
|
|
; y=44+(3*Y)*8
|
|
sty CURSOR_Y
|
|
tya
|
|
asl
|
|
clc
|
|
adc CURSOR_Y
|
|
asl
|
|
asl
|
|
asl
|
|
adc #44
|
|
sta CURSOR_Y
|
|
|
|
ldx #6 ; assume 6 chars wide
|
|
overwrite_loop_ls:
|
|
txa
|
|
pha
|
|
|
|
lda #$20
|
|
jsr hgr_put_char_cursor
|
|
inc CURSOR_X
|
|
pla
|
|
tax
|
|
dex
|
|
bne overwrite_loop_ls
|
|
|
|
lda invert_smc1+1
|
|
eor #$7f
|
|
sta invert_smc1+1
|
|
|
|
rts
|
|
|
|
|
|
;===================================
|
|
;===================================
|
|
; load the game
|
|
;===================================
|
|
;===================================
|
|
load_game:
|
|
|
|
; print are you sure message
|
|
|
|
jsr confirm_action
|
|
|
|
bcs done_load
|
|
|
|
; actually load it
|
|
lda INVENTORY_Y
|
|
clc
|
|
adc #LOAD_SAVE1
|
|
sta WHICH_LOAD
|
|
|
|
jsr load_file
|
|
|
|
; copy to zero page
|
|
|
|
ldx #0
|
|
load_loop:
|
|
lda $BC00,X
|
|
sta WHICH_LOAD,X
|
|
inx
|
|
cpx #(END_OF_SAVE-WHICH_LOAD+1)
|
|
bne load_loop
|
|
|
|
lda #NEW_FROM_LOAD ; load whole level from disk
|
|
sta LEVEL_OVER
|
|
|
|
done_load:
|
|
|
|
rts
|
|
|
|
|
|
;===================================
|
|
;===================================
|
|
; save the game
|
|
;===================================
|
|
;===================================
|
|
|
|
save_game:
|
|
|
|
; print are you sure message
|
|
|
|
|
|
jsr confirm_action
|
|
|
|
bcs done_save
|
|
|
|
; put which save into A
|
|
|
|
lda INVENTORY_Y
|
|
|
|
pha ; save slot for later on stack
|
|
|
|
; clc
|
|
; adc #LOAD_SAVE1
|
|
; sta WHICH_LOAD ; get proper WHICH_LOAD value
|
|
|
|
|
|
;========================
|
|
; actually save
|
|
actually_save:
|
|
|
|
;===============================
|
|
; first load something from
|
|
; disk1/track0 to seek the head there
|
|
|
|
lda WHICH_LOAD ; save this value as we
|
|
; destroy it for load
|
|
pha
|
|
|
|
lda #LOAD_SAVE1 ; use SAVE1 as it's on track 0
|
|
sta WHICH_LOAD
|
|
jsr load_file
|
|
|
|
pla
|
|
|
|
sta WHICH_LOAD
|
|
|
|
; copy save data to $BC00
|
|
|
|
ldx #0
|
|
copy_loop:
|
|
lda WHICH_LOAD,X
|
|
sta $BC00,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:
|
|
lda #NEW_LOCATION ; reload level as we scrawled on $2000
|
|
sta LEVEL_OVER
|
|
|
|
rts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;=======================================
|
|
; confirm action
|
|
;=======================================
|
|
; call with first message in OUTL/OUTH
|
|
; return: carry set if skipping
|
|
|
|
confirm_action:
|
|
|
|
bit KEYRESET ; clear keyboard buffer
|
|
|
|
;===============================
|
|
; print "are you sure" message
|
|
|
|
lda #<are_you_sure
|
|
sta OUTL
|
|
lda #>are_you_sure
|
|
sta OUTH
|
|
|
|
jsr hgr_text_box_nosave
|
|
|
|
wait_confirmation:
|
|
lda KEYPRESS
|
|
bpl wait_confirmation
|
|
|
|
bit KEYRESET ; clear keypress
|
|
|
|
and #$5F ; clear high-bit, make uppercase
|
|
cmp #'Y'
|
|
bne dont_do_it
|
|
|
|
clc
|
|
rts
|
|
|
|
dont_do_it:
|
|
sec
|
|
rts
|
|
|
|
|
|
are_you_sure:
|
|
.byte 0,43,40, 0,240,90
|
|
.byte 10,61
|
|
.byte "ARE YOU SURE? (Y/N)",0
|
|
|
|
|
|
;=========================
|
|
; update save info
|
|
;=========================
|
|
update_save_info:
|
|
|
|
lda WHICH_LOAD
|
|
pha
|
|
|
|
ldx #0
|
|
update_save_info_loop:
|
|
clc
|
|
txa
|
|
pha
|
|
adc #LOAD_SAVE1
|
|
sta WHICH_LOAD
|
|
|
|
jsr load_file
|
|
|
|
pla
|
|
tax
|
|
|
|
lda $BC06 ; MAP_LOCATION
|
|
sta load_slot_levels,X
|
|
lda $BC0E ; SCORE_HUNDREDS
|
|
sta load_slot_pts_high,X
|
|
lda $BC0F ; SCORE_HUNDREDS
|
|
sta load_slot_pts_low,X
|
|
|
|
inx
|
|
cpx #3
|
|
bne update_save_info_loop
|
|
|
|
pla
|
|
sta WHICH_LOAD
|
|
|
|
rts
|
|
|
|
|
|
load_slot_levels:
|
|
.byte LOCATION_EMPTY ; location
|
|
.byte LOCATION_WAVY_TREE ; location
|
|
.byte LOCATION_TROGDOR_LAIR ; location
|
|
|
|
load_slot_pts_high:
|
|
.byte $0 ; points_high
|
|
.byte $0 ; points_high
|
|
.byte $1 ; points_high
|
|
|
|
load_slot_pts_low:
|
|
.byte $00 ; points_low
|
|
.byte $45 ; points_low
|
|
.byte $10 ; points_low
|
|
|
|
|
|
location_names_l:
|
|
.byte <lname_poor_gary
|
|
.byte <lname_kerrek_1
|
|
.byte <lname_old_well
|
|
.byte <lname_yellow_tree
|
|
.byte <lname_waterfall
|
|
.byte <lname_hay_bale
|
|
.byte <lname_mud_puddle
|
|
.byte <lname_archery
|
|
.byte <lname_river_stone
|
|
.byte <lname_mountain_pass
|
|
.byte <lname_jhonka_cave
|
|
.byte <lname_your_cottage
|
|
.byte <lname_lake_west
|
|
.byte <lname_lake_east
|
|
.byte <lname_outside_inn
|
|
.byte <lname_outside_nn
|
|
.byte <lname_wavy_tree
|
|
.byte <lname_kerrek_2
|
|
.byte <lname_outside_lady
|
|
.byte <lname_burn_tree
|
|
|
|
.byte <lname_cliff_base
|
|
.byte <lname_cliffland_heights
|
|
.byte <lname_trogdor_outer
|
|
.byte <lname_trogdor_posh
|
|
|
|
.byte <lname_hidden_glen
|
|
.byte <lname_inside_lady
|
|
.byte <lname_inside_nn
|
|
.byte <lname_inside_inn
|
|
|
|
.byte <lname_archery_game
|
|
.byte <lname_map
|
|
|
|
.byte <lname_empty
|
|
|
|
location_names_h:
|
|
.byte >lname_poor_gary
|
|
.byte >lname_kerrek_1
|
|
.byte >lname_old_well
|
|
.byte >lname_yellow_tree
|
|
.byte >lname_waterfall
|
|
.byte >lname_hay_bale
|
|
.byte >lname_mud_puddle
|
|
.byte >lname_archery
|
|
.byte >lname_river_stone
|
|
.byte >lname_mountain_pass
|
|
.byte >lname_jhonka_cave
|
|
.byte >lname_your_cottage
|
|
.byte >lname_lake_west
|
|
.byte >lname_lake_east
|
|
.byte >lname_outside_inn
|
|
.byte >lname_outside_nn
|
|
.byte >lname_wavy_tree
|
|
.byte >lname_kerrek_2
|
|
.byte >lname_outside_lady
|
|
.byte >lname_burn_tree
|
|
|
|
.byte >lname_cliff_base
|
|
.byte >lname_cliffland_heights
|
|
.byte >lname_trogdor_outer
|
|
.byte >lname_trogdor_posh
|
|
|
|
.byte >lname_hidden_glen
|
|
.byte >lname_inside_lady
|
|
.byte >lname_inside_nn
|
|
.byte >lname_inside_inn
|
|
|
|
.byte >lname_archery_game
|
|
.byte >lname_map
|
|
|
|
.byte >lname_empty
|
|
|
|
|
|
location_names:
|
|
lname_poor_gary: .byte "Poor Gary's Glen",0 ; A1 LOCATION_POOR_GARY
|
|
lname_kerrek_1: .byte "Kerrek Tracks 1",0 ; B1 LOCATION_KERREK_1
|
|
lname_old_well: .byte "Old Well",0 ; C1 LOCATION_OLD_WELL
|
|
lname_yellow_tree: .byte "Yellow Tree",0 ; D1 LOCATION_YELLOW_TREE
|
|
lname_waterfall: .byte "Waterfall",0 ; E1 LOCATION_WATERFALL
|
|
lname_hay_bale: .byte "That Hay Bale",0 ; A2 LOCATION_HAY_BALE
|
|
lname_mud_puddle: .byte "That Mud Puddle",0 ; B2 LOCATION_MUD_PUDDLE
|
|
lname_archery: .byte "Archery Range",0 ; C2 LOCATION_ARCHERY
|
|
lname_river_stone: .byte "River and Stone",0 ; D2 LOCATION_RIVER_STONE
|
|
lname_mountain_pass: .byte "Mountain Pass",0 ; E2 LOCATION_MOUNTAIN_PASS
|
|
lname_jhonka_cave: .byte "Jhonka's Cave",0 ; A3 LOCATION_JHONKA_CAVE
|
|
lname_your_cottage: .byte "Your Burninated Cottage",0 ; B3 LOCATION_YOUR_COTTAGE
|
|
lname_lake_west: .byte "Pebble Lake West",0 ; C3 LOCATION_LAKE_WEST
|
|
lname_lake_east: .byte "Pebble Lake East",0 ; D3 LOCATION_LAKE_EAST
|
|
lname_outside_inn: .byte "Outside Giant Inn",0 ; E3 LOCATION_OUTSIDE_INN
|
|
lname_outside_nn: .byte "Outside Mysterious Cottage",0 ; A4 LOCATION_OUTSIDE_NN
|
|
lname_wavy_tree: .byte "Wavy Tree",0 ; B4 LOCATION_WAVY_TREE
|
|
lname_kerrek_2: .byte "Kerrek Tracks 2",0 ; C4 LOCATION_KERREK_2
|
|
lname_outside_lady: .byte "Outside Baby Lady Cottage",0 ; D4 LOCATION_OUTSIDE_LADY
|
|
lname_burn_tree: .byte "Burninated Trees",0 ; E4 LOCATION_BURN_TREES
|
|
|
|
lname_cliff_base: .byte "Cliff Base",0 ; LOCATION_CLIFF_BASE
|
|
lname_cliffland_heights:.byte "Cliffland Heights",0 ; LOCATION_CLIFF_HEIGHTS
|
|
lname_trogdor_outer: .byte "Trogdor's Outer Sanctum",0 ; LOCATION_TROGDOR_OUTER
|
|
lname_trogdor_posh: .byte "Trogdor's Posh Lair",0 ; LOCATION_TROGDOR_LAIR
|
|
|
|
lname_hidden_glen: .byte "Hidden Glen",0 ; LOCATION_HIDDEN_GLEN
|
|
lname_inside_lady: .byte "Inside Baby Lady Cottage",0 ; LOCATION_INSIDE_LADY
|
|
lname_inside_nn: .byte "Inside Mysterious Cottage",0 ; LOCATION_INSIDE_NN
|
|
lname_inside_inn: .byte "Inside Giant Inn",0 ; LOCATION_INSIDE_INN
|
|
|
|
lname_archery_game: .byte "Archery Game",0 ; LOCATION_INSIDE_INN
|
|
lname_map: .byte "Map",0 ; LOCATION_INSIDE_INN
|
|
|
|
lname_empty: .byte "Empty",0
|
|
location_names_end:
|
|
|
|
|
|
;===================
|
|
; strcat
|
|
;===================
|
|
; input in INL
|
|
; output in OUTL
|
|
strcat:
|
|
ldy #0
|
|
strcat_loop:
|
|
lda (INL),Y
|
|
beq strcat_done
|
|
sta (OUTL),Y
|
|
iny
|
|
jmp strcat_loop
|
|
strcat_done:
|
|
rts
|