diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2022-11-16 13:07:42 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2022-11-16 13:07:42 +0300 |
commit | 2cceb130964db7204f522089ac99080072b49706 (patch) | |
tree | d70a7a9c989982e0527230fcaa99049766fbc2d9 | |
parent | 9bdfedbfcf73122f333499118acf3bd85193a03b (diff) |
Saving fixes
-rw-r--r-- | flash.asm | 4 | ||||
-rw-r--r-- | menu.asm | 12 | ||||
-rw-r--r-- | preloader.asm | 4 | ||||
-rw-r--r-- | saves.asm | 33 | ||||
-rw-r--r-- | video.asm | 61 |
5 files changed, 59 insertions, 55 deletions
@@ -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 @@ -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: @@ -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: @@ -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 |