diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-09-17 19:48:23 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-09-17 19:48:23 +0300 |
commit | c13c394c93f78d51ea4abb822d766579ae90384c (patch) | |
tree | ca79b99ed54259e7366b37f6af503f05ad4828eb /saves.asm | |
parent | a95ef293d4c49ac8cc15f1e52000d6548c794990 (diff) |
Spaces
Diffstat (limited to 'saves.asm')
-rw-r--r-- | saves.asm | 443 |
1 files changed, 223 insertions, 220 deletions
@@ -1,250 +1,253 @@ -SAVES .rs 4 ; где какое сохранение +SAVES .rs 4 ; saves locations save_state: - ; saving last started game - lda #0 ; first SRAM bank - sta $5005 - ; storing signature - lda #'C' - sta SRAM_SIG - lda #'L' - sta SRAM_SIG+1 - lda #'U' - sta SRAM_SIG+2 + ; saving last started game + lda #0 ; first SRAM bank + sta $5005 + ; storing signature + ldx #0 +.signature_loop: + lda saves_signature, x + sta SRAM_SIGNATURE, x + inx + cpx #8 + bne .signature_loop ; storing selected game - lda SELECTED_GAME - sta SRAM_LAST_STARTED_GAME - lda SELECTED_GAME+1 - sta SRAM_LAST_STARTED_GAME+1 + lda SELECTED_GAME + sta SRAM_LAST_STARTED_GAME + lda SELECTED_GAME+1 + sta SRAM_LAST_STARTED_GAME+1 ; storing scrolling state - lda SCROLL_LINES_TARGET - sta SRAM_LAST_STARTED_LINE - lda SCROLL_LINES_TARGET+1 - sta SRAM_LAST_STARTED_LINE+1 + lda SCROLL_LINES_TARGET + sta SRAM_LAST_STARTED_LINE + lda SCROLL_LINES_TARGET+1 + sta SRAM_LAST_STARTED_LINE+1 ; storing save ID of last started game - lda LAST_STARTED_SAVE - sta SRAM_LAST_STARTED_SAVE - rts - + lda LAST_STARTED_SAVE + sta SRAM_LAST_STARTED_SAVE + rts + load_state: ; loading saved state - lda #0 ; first SRAM bank - sta $5005 - ; check for signature - lda SRAM_SIG - cmp #'C' - bne .end - lda SRAM_SIG+1 - cmp #'L' - bne .end - lda SRAM_SIG+2 - cmp #'U' - bne .end + lda #0 ; first SRAM bank + sta $5005 + ; check for signature + ldx #0 +.signature_loop: + lda saves_signature, x + cmp SRAM_SIGNATURE, x + bne .end + inx + cpx #8 + bne .signature_loop ; loading last started game - lda SRAM_LAST_STARTED_GAME - sta SELECTED_GAME - lda SRAM_LAST_STARTED_GAME+1 - sta SELECTED_GAME+1 - ; check for invalid value - lda SELECTED_GAME - sec - sbc games_count - lda SELECTED_GAME+1 - sbc games_count+1 - bcs .ovf + lda SRAM_LAST_STARTED_GAME + sta SELECTED_GAME + lda SRAM_LAST_STARTED_GAME+1 + sta SELECTED_GAME+1 + ; check for invalid value + lda SELECTED_GAME + sec + sbc games_count + lda SELECTED_GAME+1 + sbc games_count+1 + bcs .ovf ; loading scrolling state - lda SRAM_LAST_STARTED_LINE - sta SCROLL_LINES_TARGET - lda SRAM_LAST_STARTED_LINE+1 - sta SCROLL_LINES_TARGET+1 + lda SRAM_LAST_STARTED_LINE + sta SCROLL_LINES_TARGET + lda SRAM_LAST_STARTED_LINE+1 + sta SCROLL_LINES_TARGET+1 ; loading last save ID - lda SRAM_LAST_STARTED_SAVE - sta LAST_STARTED_SAVE + lda SRAM_LAST_STARTED_SAVE + sta LAST_STARTED_SAVE .end: - rts + rts .ovf: - ; reset values - lda #0 - sta SELECTED_GAME - sta SELECTED_GAME+1 - sta SCROLL_LINES_TARGET - sta SCROLL_LINES_TARGET+1 - rts - + ; reset values + lda #0 + sta SELECTED_GAME + sta SELECTED_GAME+1 + sta SCROLL_LINES_TARGET + sta SCROLL_LINES_TARGET+1 + rts + load_save: ; loading battery backed save for game if any - pha - tya - pha - txa - pha - - lda LOADER_GAME_SAVE - beq .done ; game has not battery backed saves - ; superbank number - sta LOADER_GAME_SAVE_SUPERBANK - dec LOADER_GAME_SAVE_SUPERBANK - lda LOADER_GAME_SAVE_BANK - ; в регистр - sta $5005 - lda #0 - sta COPY_SOURCE_ADDR - sta COPY_DEST_ADDR - lda #$80 - sta COPY_SOURCE_ADDR+1 - lda #$60 - sta COPY_DEST_ADDR+1 - jsr read_flash + pha + tya + pha + txa + pha + + lda LOADER_GAME_SAVE + beq .done ; game has not battery backed saves + ; superbank number + sta LOADER_GAME_SAVE_SUPERBANK + dec LOADER_GAME_SAVE_SUPERBANK + lda LOADER_GAME_SAVE_BANK + ; в регистр + sta $5005 + lda #0 + sta COPY_SOURCE_ADDR + sta COPY_DEST_ADDR + lda #$80 + sta COPY_SOURCE_ADDR+1 + lda #$60 + sta COPY_DEST_ADDR+1 + jsr read_flash .done: - pla - tax - pla - tay - pla - rts - - ; всё то же самое, только в обратную сторону + pla + tax + pla + tay + pla + rts + + ; всё то же самое, только в обратную сторону save_save: - pha - tya - pha - txa - pha + pha + tya + pha + txa + pha - lda LOADER_GAME_SAVE - beq .done ; если игра не использует сейвы, то всё - ; номер супербанка - sta LOADER_GAME_SAVE_SUPERBANK - dec LOADER_GAME_SAVE_SUPERBANK - lda LOADER_GAME_SAVE_BANK - ; в регистр - sta $5005 - lda #0 - sta COPY_SOURCE_ADDR - sta COPY_DEST_ADDR - lda #$60 - sta COPY_SOURCE_ADDR+1 - lda #$80 - sta COPY_DEST_ADDR+1 - jsr write_flash + lda LOADER_GAME_SAVE + beq .done ; если игра не использует сейвы, то всё + ; номер супербанка + sta LOADER_GAME_SAVE_SUPERBANK + dec LOADER_GAME_SAVE_SUPERBANK + lda LOADER_GAME_SAVE_BANK + ; в регистр + sta $5005 + lda #0 + sta COPY_SOURCE_ADDR + sta COPY_DEST_ADDR + lda #$60 + sta COPY_SOURCE_ADDR+1 + lda #$80 + sta COPY_DEST_ADDR+1 + jsr write_flash .done: - pla - tax - pla - tay - pla - rts + pla + tax + pla + tay + pla + rts save_all_saves: - 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 + 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 + 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 + 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 - dex - txa - and #%11111100 ; номер первого сохранения в группе - ora #1 ; плюс один - sta LOADER_GAME_SAVE - lda #0 - sta LOADER_GAME_SAVE_BANK - - ; копируем три банка - ldx #3 + ldx LAST_STARTED_SAVE + dex + txa + and #%11111100 ; номер первого сохранения в группе + ora #1 ; плюс один + sta LOADER_GAME_SAVE + lda #0 + sta LOADER_GAME_SAVE_BANK + + ; копируем три банка + ldx #3 .load_all_saves: - ; если это и есть последняя сохранёнка, то пропускаем - lda LOADER_GAME_SAVE - cmp LAST_STARTED_SAVE - bne .load_all_saves_skip1 - inc LOADER_GAME_SAVE + ; если это и есть последняя сохранёнка, то пропускаем + lda LOADER_GAME_SAVE + cmp LAST_STARTED_SAVE + bne .load_all_saves_skip1 + inc LOADER_GAME_SAVE .load_all_saves_skip1: - ; если это второй банк, то тоже не трогаем - lda LOADER_GAME_SAVE_BANK - cmp #2 - bne .load_all_saves_skip2 - inc LOADER_GAME_SAVE_BANK + ; если это второй банк, то тоже не трогаем + lda LOADER_GAME_SAVE_BANK + cmp #2 + bne .load_all_saves_skip2 + inc LOADER_GAME_SAVE_BANK .load_all_saves_skip2: - ; запоминаем в массив - где какая сохранёнка - lda LOADER_GAME_SAVE - ldy LOADER_GAME_SAVE_BANK - sta SAVES, y - jsr load_save - inc LOADER_GAME_SAVE - inc LOADER_GAME_SAVE_BANK - dex - bne .load_all_saves - - ; а во втором банке у нас всегда последняя сохранёнка - ldx LAST_STARTED_SAVE - txa - ldy #2 - sta SAVES, y - dex ; выслисляем начало сектора - txa - ora #%00000011 - sta LOADER_GAME_SAVE_SUPERBANK ; номер супербанка - lda #0 - sta $5005 ; нулевой банк + ; запоминаем в массив - где какая сохранёнка + lda LOADER_GAME_SAVE + ldy LOADER_GAME_SAVE_BANK + sta SAVES, y + jsr load_save + inc LOADER_GAME_SAVE + inc LOADER_GAME_SAVE_BANK + dex + bne .load_all_saves + + ; а во втором банке у нас всегда последняя сохранёнка + ldx LAST_STARTED_SAVE + txa + ldy #2 + sta SAVES, y + dex ; выслисляем начало сектора + txa + ora #%00000011 + sta LOADER_GAME_SAVE_SUPERBANK ; номер супербанка + lda #0 + sta $5005 ; нулевой банк - ; стираем сектор - jsr sector_erase - - ; а теперь записываем четыре сейва назад - ldy #0 + ; стираем сектор + jsr sector_erase + + ; а теперь записываем четыре сейва назад + ldy #0 .write: - lda SAVES, y - sta LOADER_GAME_SAVE - sty LOADER_GAME_SAVE_BANK - jsr save_save - iny - cpy #4 - bne .write + lda SAVES, y + 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 - jsr save_state - lda #%00000000 ; выключаем пока что PPU - sta $2000 - sta $2001 - jsr waitblank_simple - jsr clear_screen - rts + lda #0 + sta LAST_STARTED_SAVE ; никаких сохранёнок, всё, но это надо будет занести в SRAM + jsr save_state + lda #%00000000 ; выключаем пока что PPU + sta $2000 + sta $2001 + jsr waitblank_simple + jsr clear_screen + rts + +saves_signature: + .db 'C','O','O','L','S','A','V','E' |