Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/chip/bsx/flash/flash.cpp
2 views
1
#ifdef BSX_CPP
2
3
BSXFlash bsxflash;
4
5
void BSXFlash::init() {
6
}
7
8
void BSXFlash::load() {
9
if(memory.size() == 0) {
10
memory.map(allocate<uint8>(1024 * 1024, 0xff), 1024 * 1024);
11
}
12
}
13
14
void BSXFlash::unload() {
15
memory.reset();
16
}
17
18
void BSXFlash::power() {
19
}
20
21
void BSXFlash::reset() {
22
regs.command = 0;
23
regs.write_old = 0x00;
24
regs.write_new = 0x00;
25
26
regs.flash_enable = false;
27
regs.read_enable = false;
28
regs.write_enable = false;
29
memory.write_protect(!regs.write_enable);
30
}
31
32
unsigned BSXFlash::size() const {
33
return memory.size();
34
}
35
36
uint8 BSXFlash::read(unsigned addr) {
37
if(addr == 0x0002) {
38
if(regs.flash_enable) return 0x80;
39
}
40
41
if(addr == 0x5555) {
42
if(regs.flash_enable) return 0x80;
43
}
44
45
if(regs.read_enable && addr >= 0xff00 && addr <= 0xff13) {
46
//read flash cartridge vendor information
47
switch(addr - 0xff00) {
48
case 0x00: return 0x4d;
49
case 0x01: return 0x00;
50
case 0x02: return 0x50;
51
case 0x03: return 0x00;
52
case 0x04: return 0x00;
53
case 0x05: return 0x00;
54
case 0x06: return 0x2a; //0x2a = 8mbit, 0x2b = 16mbit (not known to exist, though BIOS recognizes ID)
55
case 0x07: return 0x00;
56
default: return 0x00;
57
}
58
}
59
60
return memory.read(addr);
61
}
62
63
void BSXFlash::write(unsigned addr, uint8 data) {
64
//there exist both read-only and read-write BS-X flash cartridges ...
65
//unfortunately, the vendor info is not stored inside memory dumps
66
//of BS-X flashcarts, so it is impossible to determine whether a
67
//given flashcart is writeable.
68
//however, it has been observed that LoROM-mapped BS-X carts always
69
//use read-write flashcarts, and HiROM-mapped BS-X carts always use
70
//read-only flashcarts.
71
//below is an unfortunately necessary workaround to this problem.
72
//if(cartridge.mapper() == Cartridge::BSCHiROM) return;
73
74
if((addr & 0xff0000) == 0) {
75
regs.write_old = regs.write_new;
76
regs.write_new = data;
77
78
if(regs.write_enable && regs.write_old == regs.write_new) {
79
return memory.write(addr, data);
80
}
81
} else {
82
if(regs.write_enable) {
83
return memory.write(addr, data);
84
}
85
}
86
87
if(addr == 0x0000) {
88
regs.command <<= 8;
89
regs.command |= data;
90
91
if((regs.command & 0xffff) == 0x38d0) {
92
regs.flash_enable = true;
93
regs.read_enable = true;
94
}
95
}
96
97
if(addr == 0x2aaa) {
98
regs.command <<= 8;
99
regs.command |= data;
100
}
101
102
if(addr == 0x5555) {
103
regs.command <<= 8;
104
regs.command |= data;
105
106
if((regs.command & 0xffffff) == 0xaa5570) {
107
regs.write_enable = false;
108
}
109
110
if((regs.command & 0xffffff) == 0xaa55a0) {
111
regs.write_old = 0x00;
112
regs.write_new = 0x00;
113
regs.flash_enable = true;
114
regs.write_enable = true;
115
}
116
117
if((regs.command & 0xffffff) == 0xaa55f0) {
118
regs.flash_enable = false;
119
regs.read_enable = false;
120
regs.write_enable = false;
121
}
122
123
memory.write_protect(!regs.write_enable);
124
}
125
}
126
127
#endif
128
129