Full savestating to memory

This commit is contained in:
2025-05-23 15:49:26 -06:00
parent e9d5b359d0
commit b86d550812
23 changed files with 378 additions and 56 deletions

View File

@ -2,32 +2,6 @@
#include <common.h>
#include <string.h>
typedef struct {
char filename[1024];
u32 rom_size;
u8 *rom_data;
rom_header *header;
//mbc1 data
bool ram_enabled;
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;
u8 *ram_banks[16];
//battery
bool battery;
bool need_save;
} cart_context;
static cart_context ctx;
bool cart_need_save () {
@ -174,7 +148,7 @@ const char *cart_lic_name() {
void cart_setup_bamking() {
for (int i=0; i<16; i++) {
ctx.ram_banks[1] = 0;
ctx.ram_banks[i] = 0;
if((ctx.header->ram_size == 2 && i == 0) ||
(ctx.header->ram_size == 3 && i < 4) ||
@ -190,6 +164,46 @@ void cart_setup_bamking() {
ctx.rom_bank_x2 = ctx.rom_data;
}
bool cart_init() {
char filename[1024];
u32 rom_size;
u8 *rom_data;
rom_header *header;
//mbc1 data
bool ram_enabled;
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;
u8 *ram_banks[16];
//battery
bool battery;
bool need_save;
ctx.ram_enabled = 0;
ctx.ram_banking = 0;
ctx.rom_bank_x = ctx.rom_data;
ctx.rom_bank_x2 = ctx.rom_data;
ctx.banking_mode = 0;
ctx.rom_bank_value = 1;
ctx.rom_bank_value_2 = 0;
ctx.ram_bank_value = 0;
cart_setup_bamking();
ctx.need_save = 0;
if(ctx.battery) {
cart_battery_load();
}
}
bool cart_load(char *cart) {
snprintf(ctx.filename, sizeof(ctx.filename), "%s", cart);
FILE *fp = fopen(cart, "r");
@ -387,4 +401,51 @@ bool cart_battery_save(){
u8 cart_get_rom_bank() {
return ctx.rom_bank_value;
}
void cart_load_state(const cart_state* state){
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;
ctx.rom_bank_value_2 = state->rom_bank_value_2;
ctx.ram_bank_value = state->ram_bank_value;
ctx.need_save = state->need_save;
for(int i = 0; i < 16; i++) {
if(ctx.ram_banks[i]){
memcpy(ctx.ram_banks[i], &state->ram_banks[i], 0x2000);
}
}
if(ctx.banking_mode) {
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;
}
if(ctx.ram_banking) {
ctx.ram_bank = ctx.ram_banks[ctx.ram_bank_value];
} else {
ctx.ram_bank = ctx.ram_banks[0];
}
}
void cart_save_state(cart_state* state){
state->ram_enabled = ctx.ram_enabled;
state->ram_banking = ctx.ram_banking;
state->banking_mode = ctx.banking_mode;
state->rom_bank_value = ctx.rom_bank_value;
state->rom_bank_value_2 = ctx.rom_bank_value_2;
state->ram_bank_value = ctx.ram_bank_value;
state->need_save = ctx.need_save;
for (int i=0; i<16; i++) {
if(ctx.ram_banks[i]) {
memcpy((&state->ram_banks[i]), ctx.ram_banks[i], 0x2000);
}
}
}