Path: blob/master/libsnes/bsnes/gameboy/cartridge/mbc3/mbc3.cpp
2 views
#ifdef CARTRIDGE_CPP12void Cartridge::MBC3::second() {3if(rtc_halt == false) {4if(++rtc_second >= 60) {5rtc_second = 0;6if(++rtc_minute >= 60) {7rtc_minute = 0;8if(++rtc_hour >= 24) {9rtc_hour = 0;10if(++rtc_day >= 512) {11rtc_day = 0;12rtc_day_carry = true;13}14}15}16}17}18}1920uint8 Cartridge::MBC3::mmio_read(uint16 addr) {21if((addr & 0xc000) == 0x0000) { //$0000-3fff22return cartridge.rom_read(addr);23}2425if((addr & 0xc000) == 0x4000) { //$4000-7fff26return cartridge.rom_read((rom_select << 14) | (addr & 0x3fff));27}2829if((addr & 0xe000) == 0xa000) { //$a000-bfff30if(ram_enable) {31if(ram_select >= 0x00 && ram_select <= 0x03) {32return cartridge.ram_read((ram_select << 13) | (addr & 0x1fff));33}34if(ram_select == 0x08) return rtc_latch_second;35if(ram_select == 0x09) return rtc_latch_minute;36if(ram_select == 0x0a) return rtc_latch_hour;37if(ram_select == 0x0b) return rtc_latch_day;38if(ram_select == 0x0c) return (rtc_latch_day_carry << 7) | (rtc_latch_day >> 8);39}40return 0x00;41}4243return 0x00;44}4546void Cartridge::MBC3::mmio_write(uint16 addr, uint8 data) {47if((addr & 0xe000) == 0x0000) { //$0000-1fff48ram_enable = (data & 0x0f) == 0x0a;49return;50}5152if((addr & 0xe000) == 0x2000) { //$2000-3fff53rom_select = (data & 0x7f) + ((data & 0x7f) == 0);54return;55}5657if((addr & 0xe000) == 0x4000) { //$4000-5fff58ram_select = data;59return;60}6162if((addr & 0xe000) == 0x6000) { //$6000-7fff63if(rtc_latch == 0 && data == 1) {64rtc_latch_second = rtc_second;65rtc_latch_minute = rtc_minute;66rtc_latch_hour = rtc_hour;67rtc_latch_day = rtc_day;68rtc_latch_day_carry = rtc_day_carry;69}70rtc_latch = data;71return;72}7374if((addr & 0xe000) == 0xa000) { //$a000-bfff75if(ram_enable) {76if(ram_select >= 0x00 && ram_select <= 0x03) {77cartridge.ram_write((ram_select << 13) | (addr & 0x1fff), data);78} else if(ram_select == 0x08) {79if(data >= 60) data = 0;80rtc_second = data;81} else if(ram_select == 0x09) {82if(data >= 60) data = 0;83rtc_minute = data;84} else if(ram_select == 0x0a) {85if(data >= 24) data = 0;86rtc_hour = data;87} else if(ram_select == 0x0b) {88rtc_day = (rtc_day & 0x0100) | data;89} else if(ram_select == 0x0c) {90rtc_day = ((data & 1) << 8) | (rtc_day & 0xff);91rtc_halt = data & 0x40;92rtc_day_carry = data & 0x80;93}94}95return;96}97}9899void Cartridge::MBC3::power() {100ram_enable = false;101rom_select = 0x01;102ram_select = 0x00;103rtc_latch = 0;104105rtc_halt = true;106rtc_second = 0;107rtc_minute = 0;108rtc_hour = 0;109rtc_day = 0;110rtc_day_carry = false;111112rtc_latch_second = 0;113rtc_latch_minute = 0;114rtc_latch_hour = 0;115rtc_latch_day = 0;116rtc_latch_day_carry = false;117}118119#endif120121122