finished MBC1 implementation
This commit is contained in:
31
lib/cart.c
31
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();
|
||||
|
Reference in New Issue
Block a user