diff options
author | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-09-17 01:13:18 +0300 |
---|---|---|
committer | Alexey 'Cluster' Avdyukhin <clusterrr@clusterrr.com> | 2020-09-17 01:13:18 +0300 |
commit | a95ef293d4c49ac8cc15f1e52000d6548c794990 (patch) | |
tree | f9e5c15cb83101c01a58b000e235ae561692771e /flash.asm | |
parent | c1a0b52bc997859f7ba7f0fba0b76c9226ea1e95 (diff) |
Refactoring
Diffstat (limited to 'flash.asm')
-rw-r--r-- | flash.asm | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/flash.asm b/flash.asm new file mode 100644 index 0000000..476bcd9 --- /dev/null +++ b/flash.asm @@ -0,0 +1,104 @@ + ; субрутины для работы с флеш-памятью + ; OMG, это работает! +flash_writer: +sector_erase: + jsr flash_set_superbank + lda #%00001111 ; mirroring, flash-write, chr-write, enable sram + sta $5007 ; to enable flash writes + + lda #$F0 + sta $8000 ; write_prg_flash_command(0x0000, 0xF0); + lda #$AA + sta $8AAA ; write_prg_flash_command(0x0AAA, 0xAA); + lda #$55 + sta $8555 ; write_prg_flash_command(0x0555, 0x55); + lda #$80 + sta $8AAA ; write_prg_flash_command(0x0AAA, 0x80); + lda #$AA + sta $8AAA ; write_prg_flash_command(0x0AAA, 0xAA); + lda #$55 + sta $8555 ; write_prg_flash_command(0x0555, 0x55); + lda #$30 + sta $8000 ; write_prg_flash_command(0x0000, 0x30); + + lda #%00001011 ; mirroring, chr-write, enable sram + sta $5007 ; to disable flash writes + +wait_for_sector_erase: + lda $8000 + cmp #$FF + bne wait_for_sector_erase + jsr flash_set_superbank_zero + rts + +write_flash: + jsr flash_set_superbank + lda #%00001111 ; mirroring, flash-write, chr-write, enable sram + sta $5007 ; включаем запись в PRG + ldy #$00 + ldx #$20 +write_flash_loop: + lda #$F0 + sta $8000 ; write_prg_flash_command(0x0000, 0xF0); + lda #$AA + sta $8AAA ; write_prg_flash_command(0x0AAA, 0xAA); + lda #$55 + sta $8555 ; write_prg_flash_command(0x0555, 0x55); + lda #$A0 + sta $8AAA ; write_prg_flash_command(0x0AAA, 0xA0); + lda [COPY_SOURCE_ADDR], y + sta [COPY_DEST_ADDR], y +write_flash_check1: + lda [COPY_DEST_ADDR], y + cmp [COPY_SOURCE_ADDR], y + bne write_flash_check1 +write_flash_check2: + lda [COPY_DEST_ADDR], y + cmp [COPY_SOURCE_ADDR], y + bne write_flash_check2 + iny + bne write_flash_loop + inc COPY_SOURCE_ADDR+1 + inc COPY_DEST_ADDR+1 + dex + bne write_flash_loop + lda #%00001011 ; mirroring, chr-write, enable sram + sta $5007 ; to disable flash writes + jsr flash_set_superbank_zero + rts + +read_flash: + jsr flash_set_superbank + ldy #0 + ldx #$20 +load_save_again: + lda [COPY_SOURCE_ADDR], y + sta [COPY_DEST_ADDR], y + iny + bne load_save_again + inc COPY_SOURCE_ADDR+1 + inc COPY_DEST_ADDR+1 + dex + bne load_save_again + jsr flash_set_superbank_zero + rts + +flash_set_superbank: + ldx LOADER_GAME_SAVE_SUPERBANK + inx + lda #$FF + sta $5000 + lda #$00 +flash_set_superbank_calc_next: + sec + sbc #$02 + dex + bne flash_set_superbank_calc_next + sta $5001 + rts + +flash_set_superbank_zero: + lda #$00 + sta $5000 + sta $5001 + rts |