Full savestating to memory
This commit is contained in:
115
lib/cart.c
115
lib/cart.c
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user