Welcome to mirror list, hosted at ThFree Co, Russian Federation.

flash.asm - github.com/coolgirl-multicart/coolgirl-multirom-builder.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
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