blob: f7030d4e08ce57c3abac0e6b5dd38c3aebdcfae1 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
; subroutines for flash memory stuff
FLASH_TYPE .rs 1 ; flash memory type
flash_detect:
lda #0
sta <FLASH_TYPE
jsr enable_flash_write
; enter flash CFI mode
lda #$98
sta $8AAA ; $98 -> $0AAA
; check for CFI signature
lda $8020
cmp #'Q'
bne .end
lda $8022
cmp #'R'
bne .end
lda $8024
cmp #'Y'
bne .end
; if signature is ok read flash size
lda $804E
sta <FLASH_TYPE
.end:
; exit CFI mode
lda #$F0
sta $8000
jsr disable_flash_write
rts
sector_erase:
jsr enable_flash_write
jsr flash_set_superbank
lda #$F0
sta $8000 ; $F0 -> $0000
lda #$AA
sta $8AAA ; $AA -> $0AAA
lda #$55
sta $8555 ; $55 -> $0555
lda #$80
sta $8AAA ; $80 -> $0AAA
lda #$AA
sta $8AAA ; $AA -> $0AAA
lda #$55
sta $8555 ; $55 -> $0555
lda #$30
sta $8000 ; $30 -> $0000
jsr disable_flash_write
.wait:
lda $8000
cmp #$FF
bne .wait
jsr banking_init
rts
write_flash:
jsr enable_flash_write
jsr flash_set_superbank
ldy #$00
ldx #$20
.loop:
lda #$F0
sta $8000 ; $F0 -> $0000
lda #$AA
sta $8AAA ; $AA -> $0AAA
lda #$55
sta $8555 ; $55 -> $0555
lda #$A0
sta $8AAA ; $A0 -> $0AAA
lda [COPY_SOURCE_ADDR], y
sta [COPY_DEST_ADDR], y
.check1:
lda [COPY_DEST_ADDR], y
cmp [COPY_SOURCE_ADDR], y
bne .check1
.check2:
lda [COPY_DEST_ADDR], y
cmp [COPY_SOURCE_ADDR], y
bne .check2
iny
bne .loop
inc <COPY_SOURCE_ADDR+1
inc <COPY_DEST_ADDR+1
dex
bne .loop
jsr disable_flash_write
jsr banking_init
rts
read_flash:
jsr flash_set_superbank
ldy #0
ldx #$20
.loop:
lda [COPY_SOURCE_ADDR], y
sta [COPY_DEST_ADDR], y
iny
bne .loop
inc <COPY_SOURCE_ADDR+1
inc <COPY_DEST_ADDR+1
dex
bne .loop
jsr banking_init
rts
; calculate superbank based on save ID
flash_set_superbank:
lda #0
sta <PRG_BANK
ldx <LOADER_GAME_SAVE_SUPERBANK
inx
lda #$00
sta <PRG_SUPERBANK
sta <PRG_SUPERBANK+1
.loop:
sec
lda <PRG_SUPERBANK
sbc #$02
sta <PRG_SUPERBANK
lda <PRG_SUPERBANK+1
sbc #0
sta <PRG_SUPERBANK+1
dex
bne .loop
jsr sync_banks
rts
|