diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-09-18 22:39:19 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-09-18 22:41:30 +0300 |
commit | 65f7185ad6e99eab403e9111b12e4c34db54136b (patch) | |
tree | fe9c241babd837026e4354ce4d582edaa422d7f9 /saves.asm | |
parent | c13c394c93f78d51ea4abb822d766579ae90384c (diff) |
Banking
Diffstat (limited to 'saves.asm')
-rw-r--r-- | saves.asm | 127 |
1 files changed, 44 insertions, 83 deletions
@@ -2,6 +2,7 @@ SAVES .rs 4 ; saves locations save_state: ; saving last started game + jsr enable_prg_ram lda #0 ; first SRAM bank sta $5005 ; storing signature @@ -25,10 +26,12 @@ save_state: ; storing save ID of last started game lda LAST_STARTED_SAVE sta SRAM_LAST_STARTED_SAVE + jsr disable_prg_ram rts load_state: ; loading saved state + jsr enable_prg_ram lda #0 ; first SRAM bank sta $5005 ; check for signature @@ -42,33 +45,34 @@ load_state: bne .signature_loop ; loading last started game lda SRAM_LAST_STARTED_GAME - sta SELECTED_GAME + sta <SELECTED_GAME lda SRAM_LAST_STARTED_GAME+1 - sta SELECTED_GAME+1 + sta <SELECTED_GAME+1 ; check for invalid value - lda SELECTED_GAME + lda <SELECTED_GAME sec sbc games_count - lda SELECTED_GAME+1 + lda <SELECTED_GAME+1 sbc games_count+1 bcs .ovf ; loading scrolling state lda SRAM_LAST_STARTED_LINE - sta SCROLL_LINES_TARGET + sta <SCROLL_LINES_TARGET lda SRAM_LAST_STARTED_LINE+1 - sta SCROLL_LINES_TARGET+1 + sta <SCROLL_LINES_TARGET+1 ; loading last save ID lda SRAM_LAST_STARTED_SAVE - sta LAST_STARTED_SAVE -.end: - rts + sta <LAST_STARTED_SAVE + jmp .end .ovf: ; reset values lda #0 - sta SELECTED_GAME - sta SELECTED_GAME+1 - sta SCROLL_LINES_TARGET - sta SCROLL_LINES_TARGET+1 + sta <SELECTED_GAME + sta <SELECTED_GAME+1 + sta <SCROLL_LINES_TARGET + sta <SCROLL_LINES_TARGET+1 +.end: + jsr disable_prg_ram rts load_save: @@ -79,7 +83,7 @@ load_save: txa pha - lda LOADER_GAME_SAVE + lda LOADER_GAME_SAVE beq .done ; game has not battery backed saves ; superbank number sta LOADER_GAME_SAVE_SUPERBANK @@ -94,7 +98,9 @@ load_save: sta COPY_SOURCE_ADDR+1 lda #$60 sta COPY_DEST_ADDR+1 + jsr enable_prg_ram jsr read_flash + jsr disable_prg_ram .done: pla tax @@ -110,8 +116,7 @@ save_save: pha txa pha - - lda LOADER_GAME_SAVE + lda LOADER_GAME_SAVE beq .done ; если игра не использует сейвы, то всё ; номер супербанка sta LOADER_GAME_SAVE_SUPERBANK @@ -126,7 +131,9 @@ save_save: sta COPY_SOURCE_ADDR+1 lda #$80 sta COPY_DEST_ADDR+1 + jsr enable_prg_ram jsr write_flash + jsr disable_prg_ram .done: pla tax @@ -136,117 +143,71 @@ save_save: rts save_all_saves: - ldx LAST_STARTED_SAVE + ldx <LAST_STARTED_SAVE bne .there_is_save jmp .done .there_is_save: - ; чёрный экран - lda #%00000000 ; выключаем пока что PPU - sta $2000 - sta $2001 - jsr waitblank_simple - jsr clear_screen - lda #$21 - sta $2006 - lda #$C0 - sta $2006 - ldy #0 -.print_warning: - lda saving_text, y - sta $2007 - iny - cmp #0 ; после завершающего нуля перестаём читать символы - bne .print_warning - lda #$23 - sta $2006 - lda #$C8 - sta $2006 - lda #$FF - ldy #$38 -.print_warning_palette: - sta $2007 - dey - bne .print_warning_palette - jsr waitblank_simple - bit $2002 - lda #0 - sta $2005 - sta $2005 - lda #%00001000 - sta $2000 - lda #%00001010 - sta $2001 - jsr waitblank_simple - - ldx LAST_STARTED_SAVE + jsr saving_warning_show + ldx <LAST_STARTED_SAVE dex txa and #%11111100 ; номер первого сохранения в группе ora #1 ; плюс один - sta LOADER_GAME_SAVE + sta <LOADER_GAME_SAVE lda #0 - sta LOADER_GAME_SAVE_BANK - + sta <LOADER_GAME_SAVE_BANK ; копируем три банка ldx #3 .load_all_saves: ; если это и есть последняя сохранёнка, то пропускаем - lda LOADER_GAME_SAVE - cmp LAST_STARTED_SAVE + lda <LOADER_GAME_SAVE + cmp <LAST_STARTED_SAVE bne .load_all_saves_skip1 - inc LOADER_GAME_SAVE + inc <LOADER_GAME_SAVE .load_all_saves_skip1: ; если это второй банк, то тоже не трогаем - lda LOADER_GAME_SAVE_BANK + lda <LOADER_GAME_SAVE_BANK cmp #2 bne .load_all_saves_skip2 - inc LOADER_GAME_SAVE_BANK + inc <LOADER_GAME_SAVE_BANK .load_all_saves_skip2: ; запоминаем в массив - где какая сохранёнка - lda LOADER_GAME_SAVE - ldy LOADER_GAME_SAVE_BANK + lda <LOADER_GAME_SAVE + ldy <LOADER_GAME_SAVE_BANK sta SAVES, y jsr load_save - inc LOADER_GAME_SAVE - inc LOADER_GAME_SAVE_BANK + inc <LOADER_GAME_SAVE + inc <LOADER_GAME_SAVE_BANK dex - bne .load_all_saves - + bne .load_all_saves ; а во втором банке у нас всегда последняя сохранёнка - ldx LAST_STARTED_SAVE + ldx <LAST_STARTED_SAVE txa ldy #2 sta SAVES, y dex ; выслисляем начало сектора txa ora #%00000011 - sta LOADER_GAME_SAVE_SUPERBANK ; номер супербанка + sta <LOADER_GAME_SAVE_SUPERBANK ; номер супербанка lda #0 sta $5005 ; нулевой банк - ; стираем сектор jsr sector_erase - ; а теперь записываем четыре сейва назад ldy #0 .write: lda SAVES, y - sta LOADER_GAME_SAVE - sty LOADER_GAME_SAVE_BANK + sta <LOADER_GAME_SAVE + sty <LOADER_GAME_SAVE_BANK jsr save_save iny cpy #4 bne .write - .done: lda #0 - sta LAST_STARTED_SAVE ; никаких сохранёнок, всё, но это надо будет занести в SRAM + sta <LAST_STARTED_SAVE ; никаких сохранёнок, всё, но это надо будет занести в SRAM jsr save_state - lda #%00000000 ; выключаем пока что PPU - sta $2000 - sta $2001 - jsr waitblank_simple - jsr clear_screen + jsr saving_warning_hide rts saves_signature: |