Path: blob/master/libsnes/bsnes/gameboy/cartridge/mbc1/mbc1.cpp
2 views
#ifdef CARTRIDGE_CPP12uint8 Cartridge::MBC1::mmio_read(uint16 addr) {3if((addr & 0xc000) == 0x0000) { //$0000-3fff4return cartridge.rom_read(addr);5}67if((addr & 0xc000) == 0x4000) { //$4000-7fff8if(mode_select == 0) {9return cartridge.rom_read((ram_select << 19) | (rom_select << 14) | (addr & 0x3fff));10} else {11return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));12}13}1415if((addr & 0xe000) == 0xa000) { //$a000-bfff16if(ram_enable) {17if(mode_select == 0) {18return cartridge.ram_read(addr & 0x1fff);19} else {20return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));21}22}23return 0x00;24}2526return 0x00;27}2829void Cartridge::MBC1::mmio_write(uint16 addr, uint8 data) {30if((addr & 0xe000) == 0x0000) { //$0000-1fff31ram_enable = (data & 0x0f) == 0x0a;32return;33}3435if((addr & 0xe000) == 0x2000) { //$2000-3fff36rom_select = (data & 0x1f) + ((data & 0x1f) == 0);37return;38}3940if((addr & 0xe000) == 0x4000) { //$4000-5fff41ram_select = data & 0x03;42return;43}4445if((addr & 0xe000) == 0x6000) { //$6000-7fff46mode_select = data & 0x01;47return;48}4950if((addr & 0xe000) == 0xa000) { //$a000-bfff51if(ram_enable) {52if(mode_select == 0) {53cartridge.ram_write(addr & 0x1fff, data);54} else {55cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);56}57}58return;59}60}6162void Cartridge::MBC1::power() {63ram_enable = false;64rom_select = 0x01;65ram_select = 0x00;66mode_select = 0;67}6869#endif707172