Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ClusterM/coolboy-multirom-builder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2022-11-16 13:07:42 +0300
committerAlexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com>2022-11-16 13:07:42 +0300
commit2cceb130964db7204f522089ac99080072b49706 (patch)
treed70a7a9c989982e0527230fcaa99049766fbc2d9
parent9bdfedbfcf73122f333499118acf3bd85193a03b (diff)
Saving fixes
-rw-r--r--flash.asm4
-rw-r--r--menu.asm12
-rw-r--r--preloader.asm4
-rw-r--r--saves.asm33
-rw-r--r--video.asm61
5 files changed, 59 insertions, 55 deletions
diff --git a/flash.asm b/flash.asm
index 788a64a..383b0d7 100644
--- a/flash.asm
+++ b/flash.asm
@@ -1,5 +1,5 @@
FLASH_TYPE .rs 1 ; flash memory type
-STATE_CELL_NEXT .rs 2 ; address of cell for next state save
+STATE_CELL_NEXT .rs 2 ; address of the cell for next state save
flash_detect:
lda #0
@@ -97,7 +97,7 @@ flash_read:
bne .loop
jmp flash_return
- ; read 8 kilabytes of flash to PRG RAM... and RAM
+ ; read 8 kilobytes of flash to PRG RAM... and RAM
; we can't set highest bit of 0x6003 to 1
; so it's a bit complicated code with storing
; each 32th bit to RAM
diff --git a/menu.asm b/menu.asm
index f24bb2d..9a7a09e 100644
--- a/menu.asm
+++ b/menu.asm
@@ -286,10 +286,10 @@ Start:
; build and hardware info
jmp show_build_info
.skip_build_info:
- ldx #GAMES_COUNT & $FF
+ ldx #LOW(GAMES_COUNT)
dex
bne .not_single_game
- ldx #(GAMES_COUNT >> 8) & $FF
+ ldx #HIGH(GAMES_COUNT)
bne .not_single_game
stx <SELECTED_GAME
stx <SELECTED_GAME+1
@@ -299,9 +299,9 @@ Start:
lda #%00010011
cmp <BUTTONS
bne .not_hidden_rom_1
- lda #GAMES_COUNT & $FF
+ lda #LOW(GAMES_COUNT)
sta <SELECTED_GAME
- lda #(GAMES_COUNT >> 8) & $FF
+ lda #HIGH(GAMES_COUNT)
sta <SELECTED_GAME+1
jmp start_game
.not_hidden_rom_1:
@@ -310,11 +310,11 @@ Start:
lda #%00100011
cmp <BUTTONS
bne .not_hidden_rom_2
- lda #GAMES_COUNT & $FF
+ lda #LOW(GAMES_COUNT)
clc
adc #1
sta <SELECTED_GAME
- lda #(GAMES_COUNT >> 8) & $FF
+ lda #HIGH(GAMES_COUNT)
adc #0
sta <SELECTED_GAME+1
jmp start_game
diff --git a/preloader.asm b/preloader.asm
index f1debc9..b29d8b9 100644
--- a/preloader.asm
+++ b/preloader.asm
@@ -24,11 +24,11 @@ start_game:
lda <KONAMI_CODE_STATE
cmp konami_code_length
bne .no_konami_code
- lda #GAMES_COUNT & $FF
+ lda #LOW(GAMES_COUNT)
clc
adc #2
sta <SELECTED_GAME
- lda #(GAMES_COUNT >> 8) & $FF
+ lda #HIGH(GAMES_COUNT)
adc #0
sta <SELECTED_GAME+1
.no_konami_code:
diff --git a/saves.asm b/saves.asm
index db1095e..c8cdd3b 100644
--- a/saves.asm
+++ b/saves.asm
@@ -1,6 +1,8 @@
SAVES_BANK .rs 1 ; bank with saves
LAST_STARTED_SAVE .rs 1 ; last used save ID
+CLEAN_AFTER .equ 128
+
; saving last selected game
save_state:
.if USE_FLASH_WRITING=0
@@ -95,13 +97,6 @@ load_state:
sta <SELECTED_GAME
lda BUFFER+2
sta <SELECTED_GAME+1
- ; check for overflow
- lda <SELECTED_GAME
- sec
- sbc #GAMES_COUNT & $FF
- lda <SELECTED_GAME+1
- sbc #(GAMES_COUNT >> 8) & $FF
- bcs .ovf
lda BUFFER+3
sta <SCROLL_LINES_TARGET
lda BUFFER+4
@@ -116,27 +111,24 @@ load_state:
; loading last save ID
lda BUFFER+5
sta <LAST_STARTED_SAVE
- beq .end
+ ;beq .end
; maybe it's time to clean flash?
lda <STATE_CELL_NEXT+1
- cmp #$1F
- bne .clean_not_required
+ cmp #$80 + (CLEAN_AFTER / ($100 / 8)) ; 32 saves per 256 bytes
+ bcc .clean_not_required
jsr saving_warning_show
jsr flash_cleanup
- jsr saving_warning_hide
.clean_not_required:
+ lda <LAST_STARTED_SAVE
+ beq .save_last_game_not_required
+ jsr saving_warning_show
jsr save_last_game
+.save_last_game_not_required:
+ jsr saving_warning_hide
.end:
rts
-.ovf:
- ; the very first game
- lda #0
- sta <SELECTED_GAME
- sta <SELECTED_GAME+1
- rts
save_last_game:
- jsr saving_warning_show
.save_last_game_again:
lda <SAVES_BANK
sta <NROM_BANK_L ; storing saves bank number
@@ -157,8 +149,8 @@ save_last_game:
inx
cpx #16
bne .loop
- jsr flash_cleanup ; not found, cleanup
- jmp .save_last_game_again ; repeast
+ jsr flash_cleanup ; not found, cleanup
+ jmp .save_last_game_again ; repeat
.found:
txa
pha ; storing save slot number
@@ -192,7 +184,6 @@ save_last_game:
lda #0
sta <LAST_STARTED_SAVE
jsr write_state
- jsr saving_warning_hide
rts
find_saves_bank:
diff --git a/video.asm b/video.asm
index c6b39d9..cd79772 100644
--- a/video.asm
+++ b/video.asm
@@ -19,8 +19,10 @@ CHR_RAM_SIZE .rs 1 ; CHR RAM size 8*2^xKB
LAST_ATTRIBUTE_ADDRESS .rs 1 ; to prevent duplicate writes
SCHEDULE_PRINT_FIRST .rs 1
SCHEDULE_PRINT_LAST .rs 1
- ; flag to lock scrollin at zero
+ ; flag to lock scrolling at zero
SCROLL_LOCK .rs 1
+ ; flag that save warning message is active
+SAVE_WARNED .rs 1
; constants
CHARS_PER_LINE .equ 32
@@ -48,21 +50,21 @@ waitblank:
; updating sprites
jsr sprite_dma_copy
- lda SCHEDULE_PRINT_FIRST
+ lda <SCHEDULE_PRINT_FIRST
beq .first_not_scheduled
jsr print_first_name
lda #0
- sta SCHEDULE_PRINT_FIRST
+ sta <SCHEDULE_PRINT_FIRST
.first_not_scheduled:
- lda SCHEDULE_PRINT_LAST
+ lda <SCHEDULE_PRINT_LAST
beq .last_not_scheduled
jsr print_last_name
lda #0
- sta SCHEDULE_PRINT_LAST
+ sta <SCHEDULE_PRINT_LAST
.last_not_scheduled:
jsr scroll_fix
; scrolling
- lda SCROLL_LOCK
+ lda <SCROLL_LOCK
bne .skip_scrolling
jsr move_scrolling
.skip_scrolling:
@@ -111,7 +113,7 @@ scroll_fix:
; X coordinate always 0
lda #0
sta PPUSCROLL
- ldy SCROLL_LOCK
+ ldy <SCROLL_LOCK
beq .need_to_scroll
; scolling is locked
sta PPUSCROLL
@@ -257,21 +259,21 @@ screen_wrap_down:
screen_wrap_up:
jsr wait_scroll_done
; some weird math
- lda #(GAMES_COUNT - 1) & $FF
+ lda #LOW(GAMES_COUNT - 1)
sta <SELECTED_GAME
- lda #((GAMES_COUNT - 1) >> 8) & $FF
+ lda #HIGH(GAMES_COUNT - 1)
sta <SELECTED_GAME+1
- lda #(GAMES_COUNT + 4) & $FF
+ lda #LOW(GAMES_COUNT + 4)
sta <SCROLL_LINES
- lda #((GAMES_COUNT + 4) >> 8) & $FF
+ lda #HIGH(GAMES_COUNT + 4)
sta <SCROLL_LINES+1
- lda #(GAMES_COUNT - 11) & $FF
+ lda #LOW(GAMES_COUNT - 11)
sta <SCROLL_LINES_TARGET
- lda #((GAMES_COUNT - 11) >> 8) & $FF
+ lda #HIGH(GAMES_COUNT - 11)
sta <SCROLL_LINES_TARGET+1
- lda #(GAMES_COUNT + 4) & $FF
+ lda #LOW(GAMES_COUNT + 4)
sta <LAST_LINE_GAME
- lda #((GAMES_COUNT + 4) >> 8) & $FF
+ lda #HIGH(GAMES_COUNT + 4)
sta <LAST_LINE_GAME+1
jsr set_cursor_targets
ldx #LINES_PER_SCREEN
@@ -700,20 +702,20 @@ print_name:
sta <TMP+1
; is it footer?
lda <TMP+1
- cmp #(GAMES_COUNT >> 8) & $FF
+ cmp #HIGH(GAMES_COUNT)
bne .not_footer_1
lda <TMP
- cmp #GAMES_COUNT & $FF
+ cmp #LOW(GAMES_COUNT)
bne .not_footer_1
jsr draw_footer1
jsr set_line_attributes
jmp .end
.not_footer_1:
lda <TMP+1
- cmp #((GAMES_COUNT + 1) >> 8) & $FF
+ cmp #HIGH(GAMES_COUNT + 1)
bne .not_footer_2
lda <TMP
- cmp #(GAMES_COUNT + 1) & $FF
+ cmp #LOW(GAMES_COUNT + 1)
bne .not_footer_2
jsr draw_footer2
jsr set_line_attributes
@@ -721,9 +723,9 @@ print_name:
.not_footer_2:
lda <TMP
sec
- sbc #GAMES_COUNT & $FF
+ sbc #LOW(GAMES_COUNT)
lda <TMP+1
- sbc #(GAMES_COUNT >> 8) & $FF
+ sbc #HIGH(GAMES_COUNT)
bcs .end
lda <TMP+1
jsr select_prg_bank
@@ -831,10 +833,10 @@ set_line_attributes:
ldx #8
ldy #0
lda <TEXT_DRAW_GAME+1
- cmp #((GAMES_COUNT + 3) >> 8) & $FF
+ cmp #HIGH(GAMES_COUNT + 3)
bne .not_footer
lda <TEXT_DRAW_GAME
- cmp #(GAMES_COUNT + 3) & $FF
+ cmp #LOW(GAMES_COUNT + 3)
beq .footer
jmp .maybe_header_or_game_0
.not_footer:
@@ -1107,7 +1109,7 @@ set_cursor_targets:
; when there are not so many games
.if GAMES_COUNT <= 10
clc
- adc #(6 - GAMES_COUNT / 2 - GAMES_COUNT % 2)
+ adc #6 - GAMES_COUNT / 2 - GAMES_COUNT % 2
.endif
sec
sbc <SCROLL_LINES_TARGET
@@ -1293,6 +1295,11 @@ print_text:
; show "saving... keep power on" message
saving_warning_show:
+ lda <SAVE_WARNED
+ beq .continue
+ rts
+.continue:
+ inc <SAVE_WARNED
; disable PPU
lda #%00000000
sta PPUCTRL
@@ -1323,6 +1330,12 @@ saving_warning_show:
; hide this message (clear screen)
saving_warning_hide:
+ lda <SAVE_WARNED
+ bne .continue
+ rts
+.continue:
+ lda #0
+ sta <SAVE_WARNED
jsr dim_base_palette_out
lda #%00000000 ; disable PPU
sta PPUCTRL