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;
|
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();
|
||||||
|
Reference in New Issue
Block a user