Path: blob/master/libsnes/bsnes/snes/chip/bsx/flash/flash.cpp
2 views
#ifdef BSX_CPP12BSXFlash bsxflash;34void BSXFlash::init() {5}67void BSXFlash::load() {8if(memory.size() == 0) {9memory.map(allocate<uint8>(1024 * 1024, 0xff), 1024 * 1024);10}11}1213void BSXFlash::unload() {14memory.reset();15}1617void BSXFlash::power() {18}1920void BSXFlash::reset() {21regs.command = 0;22regs.write_old = 0x00;23regs.write_new = 0x00;2425regs.flash_enable = false;26regs.read_enable = false;27regs.write_enable = false;28memory.write_protect(!regs.write_enable);29}3031unsigned BSXFlash::size() const {32return memory.size();33}3435uint8 BSXFlash::read(unsigned addr) {36if(addr == 0x0002) {37if(regs.flash_enable) return 0x80;38}3940if(addr == 0x5555) {41if(regs.flash_enable) return 0x80;42}4344if(regs.read_enable && addr >= 0xff00 && addr <= 0xff13) {45//read flash cartridge vendor information46switch(addr - 0xff00) {47case 0x00: return 0x4d;48case 0x01: return 0x00;49case 0x02: return 0x50;50case 0x03: return 0x00;51case 0x04: return 0x00;52case 0x05: return 0x00;53case 0x06: return 0x2a; //0x2a = 8mbit, 0x2b = 16mbit (not known to exist, though BIOS recognizes ID)54case 0x07: return 0x00;55default: return 0x00;56}57}5859return memory.read(addr);60}6162void BSXFlash::write(unsigned addr, uint8 data) {63//there exist both read-only and read-write BS-X flash cartridges ...64//unfortunately, the vendor info is not stored inside memory dumps65//of BS-X flashcarts, so it is impossible to determine whether a66//given flashcart is writeable.67//however, it has been observed that LoROM-mapped BS-X carts always68//use read-write flashcarts, and HiROM-mapped BS-X carts always use69//read-only flashcarts.70//below is an unfortunately necessary workaround to this problem.71//if(cartridge.mapper() == Cartridge::BSCHiROM) return;7273if((addr & 0xff0000) == 0) {74regs.write_old = regs.write_new;75regs.write_new = data;7677if(regs.write_enable && regs.write_old == regs.write_new) {78return memory.write(addr, data);79}80} else {81if(regs.write_enable) {82return memory.write(addr, data);83}84}8586if(addr == 0x0000) {87regs.command <<= 8;88regs.command |= data;8990if((regs.command & 0xffff) == 0x38d0) {91regs.flash_enable = true;92regs.read_enable = true;93}94}9596if(addr == 0x2aaa) {97regs.command <<= 8;98regs.command |= data;99}100101if(addr == 0x5555) {102regs.command <<= 8;103regs.command |= data;104105if((regs.command & 0xffffff) == 0xaa5570) {106regs.write_enable = false;107}108109if((regs.command & 0xffffff) == 0xaa55a0) {110regs.write_old = 0x00;111regs.write_new = 0x00;112regs.flash_enable = true;113regs.write_enable = true;114}115116if((regs.command & 0xffffff) == 0xaa55f0) {117regs.flash_enable = false;118regs.read_enable = false;119regs.write_enable = false;120}121122memory.write_protect(!regs.write_enable);123}124}125126#endif127128129