dma and mbc1 passing
This commit is contained in:
74
lib/cart.c
74
lib/cart.c
@ -250,6 +250,25 @@ bool cart_load(char *cart) {
|
||||
fprintf(stderr, "WARNING!!! The header checksum does not match! ROM may be corrupt or invalid!\n");
|
||||
}
|
||||
|
||||
if(cart_mbc1() && ctx.header->rom_size >= 5) {
|
||||
int count = 0;
|
||||
for(int i = 1; i < 4; i++) {
|
||||
u32 start_addr = (i << 18);
|
||||
bool same = true;
|
||||
for(int j = 0x104; j < 0x134; j++) {
|
||||
if(ctx.rom_data[start_addr | j] != ctx.rom_data[j]) {
|
||||
same = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(same)
|
||||
count++;
|
||||
}
|
||||
if(count >= 2) {
|
||||
ctx.is_multicart = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(ctx.battery) {
|
||||
cart_battery_load();
|
||||
}
|
||||
@ -294,38 +313,66 @@ void cart_write(u16 address, u8 value){
|
||||
|
||||
if((address & 0xE000) == 0x2000) {
|
||||
//rom bank
|
||||
if(value == 0) {
|
||||
value = 1;
|
||||
}
|
||||
if(cart_mbc3()) {
|
||||
value &= 0b1111111;
|
||||
if(value == 0) {
|
||||
value = 1;
|
||||
}
|
||||
ctx.rom_bank_value = value;
|
||||
ctx.rom_bank_x = ctx.rom_data + (0x4000 * ctx.rom_bank_value);
|
||||
}else {
|
||||
//printf("Bank Value: %d\n", value);
|
||||
value &= 0b11111;
|
||||
if(value == 0) {
|
||||
value = 1;
|
||||
}
|
||||
if(ctx.is_multicart)
|
||||
value &= 0b1111;
|
||||
//printf("Bank Value after filter: %d\n", value);
|
||||
switch(ctx.header->rom_size) {
|
||||
case 0: value &= 0b1; break;
|
||||
case 1: value &= 0b11; break;
|
||||
case 2: value &= 0b111; break;
|
||||
case 3: value &= 0b1111; break;
|
||||
default: break;
|
||||
}
|
||||
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));
|
||||
//printf("(REG1 >5) Banked %d\n", ctx.rom_bank_value+ctx.rom_bank_value_2);
|
||||
return;
|
||||
}
|
||||
ctx.rom_bank_x = ctx.rom_data + (0x4000 * ctx.rom_bank_value);
|
||||
//printf("(REG1 <5) Banked %d\n", ctx.rom_bank_value);
|
||||
}
|
||||
}
|
||||
|
||||
if((address & 0xE000) == 0x4000) {
|
||||
//ram bank number
|
||||
if(cart_mbc1() && ctx.banking_mode && ctx.header->rom_size >= 5) {
|
||||
if(cart_mbc1() && ctx.header->rom_size >= 5) {
|
||||
if(ctx.header->rom_size == 5)
|
||||
value &= 0b1;
|
||||
ctx.rom_bank_value_2 = (value & 0b11) << 5;
|
||||
if(ctx.is_multicart)
|
||||
ctx.rom_bank_value_2 = (value & 0b11) << 4;
|
||||
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));
|
||||
//printf("(REG2 >5) Banked %d\n", ctx.rom_bank_value+ctx.rom_bank_value_2);
|
||||
if(ctx.banking_mode)
|
||||
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) {
|
||||
if(cart_need_save()) {
|
||||
cart_battery_save();
|
||||
}
|
||||
ctx.ram_bank = ctx.ram_banks[ctx.ram_bank_value];
|
||||
if((ctx.header->ram_size == 2 && ctx.ram_bank_value == 0) ||
|
||||
(ctx.header->ram_size == 3 && ctx.ram_bank_value < 4) ||
|
||||
(ctx.header->ram_size == 5 && ctx.ram_bank_value < 8) ||
|
||||
(ctx.header->ram_size == 4)) {
|
||||
ctx.ram_bank = ctx.ram_banks[ctx.ram_bank_value];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -349,10 +396,17 @@ void cart_write(u16 address, u8 value){
|
||||
}
|
||||
|
||||
if (ctx.ram_banking) {
|
||||
if(cart_need_save) {
|
||||
if(cart_need_save()) {
|
||||
cart_battery_save();
|
||||
}
|
||||
ctx.ram_bank = ctx.ram_banks[ctx.ram_bank_value];
|
||||
if((ctx.header->ram_size == 2 && ctx.ram_bank_value == 0) ||
|
||||
(ctx.header->ram_size == 3 && ctx.ram_bank_value < 4) ||
|
||||
(ctx.header->ram_size == 5 && ctx.ram_bank_value < 8) ||
|
||||
(ctx.header->ram_size == 4)) {
|
||||
ctx.ram_bank = ctx.ram_banks[ctx.ram_bank_value];
|
||||
}
|
||||
} else {
|
||||
ctx.ram_bank = ctx.ram_banks[0];
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -411,7 +465,7 @@ u8 cart_get_rom_bank() {
|
||||
}
|
||||
|
||||
void cart_load_state(const cart_state* state){
|
||||
ctx.ram_enabled = state->ram_enabled;
|
||||
ctx.ram_enabled = state->ram_enabled;
|
||||
ctx.ram_banking = state->ram_banking;
|
||||
ctx.banking_mode = state->banking_mode;
|
||||
ctx.rom_bank_value = state->rom_bank_value;
|
||||
|
Reference in New Issue
Block a user