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;
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();