diff --git a/lib/cart.c b/lib/cart.c index fe635d5..c50d476 100644 --- a/lib/cart.c +++ b/lib/cart.c @@ -13,9 +13,11 @@ typedef struct { bool ram_banking; u8 *rom_bank_x; + u8 *rom_bank_x2; u8 banking_mode; u8 rom_bank_value; + u8 rom_bank_value_2; u8 ram_bank_value; u8 *ram_bank; @@ -185,6 +187,7 @@ void cart_setup_bamking() { ctx.ram_bank = ctx.ram_banks[0]; ctx.rom_bank_x = ctx.rom_data + 0x4000; + ctx.rom_bank_x2 = ctx.rom_data; } bool cart_load(char *cart) { @@ -240,6 +243,10 @@ bool cart_load(char *cart) { } u8 cart_read(u16 address){ + if(cart_mbc1() && ctx.header->rom_size >= 5 && address < 0x4000) { + return ctx.rom_bank_x2[address]; + } + if(!cart_mbc() || address < 0x4000) { return ctx.rom_data[address]; } @@ -282,13 +289,23 @@ void cart_write(u16 address, u8 value){ }else { value &= 0b11111; ctx.rom_bank_value = value; + if(ctx.header->rom_size >= 5) { + ctx.rom_bank_x = ctx.rom_data + (0x4000 * (ctx.rom_bank_value+ctx.rom_bank_value_2)); + return; + } ctx.rom_bank_x = ctx.rom_data + (0x4000 * ctx.rom_bank_value); } } if((address & 0xE000) == 0x4000) { //ram bank number - ctx.ram_bank_value = value & 0xb11; + if(cart_mbc1() && ctx.banking_mode && ctx.header->rom_size >= 5) { + ctx.rom_bank_value_2 = (value & 0b11) << 5; + ctx.rom_bank_x = ctx.rom_data + (0x4000 * (ctx.rom_bank_value+ctx.rom_bank_value_2)); + ctx.rom_bank_x2 = ctx.rom_data + (0x4000 * (ctx.rom_bank_value_2)); + return; + } + ctx.ram_bank_value = value & 0b11; if(ctx.ram_banking) { if(cart_need_save) { cart_battery_save(); @@ -304,6 +321,18 @@ void cart_write(u16 address, u8 value){ ctx.ram_banking = ctx.banking_mode; + if(cart_mbc1() && ctx.header->rom_size >= 5) { + if(ctx.banking_mode) { + ctx.rom_bank_value_2 = (value & 0b11) << 5; + ctx.rom_bank_x = ctx.rom_data + (0x4000 * (ctx.rom_bank_value+ctx.rom_bank_value_2)); + ctx.rom_bank_x2 = ctx.rom_data + (0x4000 * (ctx.rom_bank_value_2)); + } else { + ctx.rom_bank_x = ctx.rom_data + (0x4000 * (ctx.rom_bank_value)); + ctx.rom_bank_x2 = ctx.rom_data; + } + return; + } + if (ctx.ram_banking) { if(cart_need_save) { cart_battery_save();