2023-08-31 23:54:01 +02:00
|
|
|
#include <memory/mbc/mbc1.h>
|
2023-09-01 15:11:27 +02:00
|
|
|
#include <misc/exception.h>
|
2023-08-31 23:54:01 +02:00
|
|
|
|
|
|
|
MBC1::MBC1(Cartridge& cart)
|
|
|
|
: cart(cart),
|
|
|
|
main_bankreg(0),
|
|
|
|
external_ram(0x8000)
|
|
|
|
{}
|
|
|
|
|
|
|
|
u8 MBC1::read8(u16 addr)
|
|
|
|
{
|
|
|
|
if((addr & 0xC000) == 0x0000)
|
|
|
|
return cart[addr];
|
|
|
|
else if((addr & 0xC000) == 0x4000)
|
|
|
|
{
|
|
|
|
u8 bank = main_bankreg ? main_bankreg : 1;
|
|
|
|
u8 numbanks = cart.size() >> 14;
|
|
|
|
return cart[(bank % numbanks) << 14 | (addr - 0x4000)];
|
|
|
|
}
|
|
|
|
else if((addr & 0xE000) == 0xA000)
|
|
|
|
{
|
|
|
|
if(!ram_enabled) return 0xFF;
|
|
|
|
return external_ram.read8(ram_bankreg << 13 | (addr - 0xA000));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return 0xFF;
|
|
|
|
}
|
|
|
|
|
|
|
|
void MBC1::write8(u16 addr, u8 data)
|
|
|
|
{
|
|
|
|
if((addr & 0xE000) == 0x0000)
|
|
|
|
ram_enabled = ((data & 0x0F) == 0x0A);
|
|
|
|
else if((addr & 0xE000) == 0x2000)
|
|
|
|
main_bankreg = data & 0x1F;
|
|
|
|
else if((addr & 0xE000) == 0x4000)
|
|
|
|
ram_bankreg = data & 0x03;
|
|
|
|
else if((addr & 0xE000) == 0x6000)
|
2023-09-01 15:11:27 +02:00
|
|
|
throw EmulatorException("MBC1: banking mode not supported");
|
2023-08-31 23:54:01 +02:00
|
|
|
}
|