finished MBC1 implementation

This commit is contained in:
2025-05-23 11:44:52 -06:00
parent fb15f89776
commit e9d5b359d0

View File

@ -13,9 +13,11 @@ typedef struct {
bool ram_banking; bool ram_banking;
u8 *rom_bank_x; u8 *rom_bank_x;
u8 *rom_bank_x2;
u8 banking_mode; u8 banking_mode;
u8 rom_bank_value; u8 rom_bank_value;
u8 rom_bank_value_2;
u8 ram_bank_value; u8 ram_bank_value;
u8 *ram_bank; u8 *ram_bank;
@ -185,6 +187,7 @@ void cart_setup_bamking() {
ctx.ram_bank = ctx.ram_banks[0]; ctx.ram_bank = ctx.ram_banks[0];
ctx.rom_bank_x = ctx.rom_data + 0x4000; ctx.rom_bank_x = ctx.rom_data + 0x4000;
ctx.rom_bank_x2 = ctx.rom_data;
} }
bool cart_load(char *cart) { bool cart_load(char *cart) {
@ -240,6 +243,10 @@ bool cart_load(char *cart) {
} }
u8 cart_read(u16 address){ 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) { if(!cart_mbc() || address < 0x4000) {
return ctx.rom_data[address]; return ctx.rom_data[address];
} }
@ -282,13 +289,23 @@ void cart_write(u16 address, u8 value){
}else { }else {
value &= 0b11111; value &= 0b11111;
ctx.rom_bank_value = value; 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); ctx.rom_bank_x = ctx.rom_data + (0x4000 * ctx.rom_bank_value);
} }
} }
if((address & 0xE000) == 0x4000) { if((address & 0xE000) == 0x4000) {
//ram bank number //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(ctx.ram_banking) {
if(cart_need_save) { if(cart_need_save) {
cart_battery_save(); cart_battery_save();
@ -304,6 +321,18 @@ void cart_write(u16 address, u8 value){
ctx.ram_banking = ctx.banking_mode; 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 (ctx.ram_banking) {
if(cart_need_save) { if(cart_need_save) {
cart_battery_save(); cart_battery_save();