summaryrefslogtreecommitdiff
path: root/romdb.c
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2018-01-31 22:05:10 -0800
committerMichael Pavone <pavone@retrodev.com>2018-01-31 22:05:10 -0800
commitc2653ab569c2a0139089db6586f1213884b03b2c (patch)
tree256e5c28b18ebc394c19cff6bc2768259b8f7379 /romdb.c
parentaeb32eebf529a82a624f2c88f51a7706aad0bcc5 (diff)
Made the NOR flash emulation a bit more flexible, but not yet flexible enough to properly support the flash chip in the MegaWiFi cart
Diffstat (limited to 'romdb.c')
-rw-r--r--romdb.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/romdb.c b/romdb.c
index e580797..65e1e9b 100644
--- a/romdb.c
+++ b/romdb.c
@@ -57,6 +57,7 @@ void free_rom_info(rom_info *info)
free(info->port2_override);
free(info->ext_override);
free(info->mouse_mode);
+ free(info->nor);
}
void cart_serialize(system_header *sys, serialize_buffer *buf)
@@ -500,15 +501,15 @@ void process_nor_def(char *key, map_iter_state *state)
if (!page_size) {
fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR page size is not defined\n", state->index, key);
}
- state->info->save_page_size = atoi(size);
- if (!state->info->save_page_size) {
- fatal_error("NOR page size %s is invalid\n", size);
+ uint32_t save_page_size = atoi(page_size);
+ if (!save_page_size) {
+ fatal_error("NOR page size %s is invalid\n", page_size);
}
char *product_id = tern_find_path(state->root, "NOR\0product_id\0", TVAL_PTR).ptrval;
if (!product_id) {
fatal_error("ROM DB map entry %d with address %s has device type NOR, but the NOR product ID is not defined\n", state->index, key);
}
- state->info->save_product_id = strtol(product_id, NULL, 16);
+ uint16_t save_product_id = strtol(product_id, NULL, 16);
char *bus = tern_find_path(state->root, "NOR\0bus\0", TVAL_PTR).ptrval;
if (!strcmp(bus, "odd")) {
state->info->save_bus = RAM_FLAG_ODD;
@@ -519,7 +520,26 @@ void process_nor_def(char *key, map_iter_state *state)
}
state->info->save_type = SAVE_NOR;
state->info->save_buffer = malloc(state->info->save_size);
- memset(state->info->save_buffer, 0xFF, state->info->save_size);
+ char *init = tern_find_path_default(state->root, "NOR\0init\0", (tern_val){.ptrval="FF"}, TVAL_PTR).ptrval;
+ if (!strcmp(init, "ROM")) {
+ uint32_t init_size = state->rom_size > state->info->save_size ? state->info->save_size : state->rom_size;
+ memcpy(state->info->save_buffer, state->rom, init_size);
+ if (state->info->save_bus == RAM_FLAG_BOTH) {
+ byteswap_rom(state->info->save_size, (uint16_t *)state->info->save_buffer);
+ }
+ } else {
+ memset(state->info->save_buffer, strtol(init, NULL, 16), state->info->save_size);
+ }
+ state->info->nor = calloc(1, sizeof(nor_state));
+ nor_flash_init(state->info->nor, state->info->save_buffer, state->info->save_size, save_page_size, save_product_id, state->info->save_bus);
+ char *cmd1 = tern_find_path(state->root, "NOR\0cmd_address1\0", TVAL_PTR).ptrval;
+ if (cmd1) {
+ state->info->nor->cmd_address1 = strtol(cmd1, NULL, 16);
+ }
+ char *cmd2 = tern_find_path(state->root, "NOR\0cmd_address2\0", TVAL_PTR).ptrval;
+ if (cmd2) {
+ state->info->nor->cmd_address2 = strtol(cmd2, NULL, 16);
+ }
}
}
@@ -616,8 +636,7 @@ void map_iter_fun(char *key, tern_val val, uint8_t valtype, void *data)
state->info->save_buffer = lock_info.save_buffer;
state->info->save_size = lock_info.save_size;
state->info->save_mask = lock_info.save_mask;
- state->info->save_page_size = lock_info.save_page_size;
- state->info->save_product_id = lock_info.save_product_id;
+ state->info->nor = lock_info.nor;
state->info->save_type = lock_info.save_type;
state->info->save_bus = lock_info.save_bus;
lock_info.save_buffer = NULL;
@@ -667,6 +686,10 @@ void map_iter_fun(char *key, tern_val val, uint8_t valtype, void *data)
map->write_8 = nor_flash_write_b;
map->read_16 = nor_flash_read_w;
map->read_8 = nor_flash_read_b;
+ if (state->info->save_bus == RAM_FLAG_BOTH) {
+ map->flags |= MMAP_READ_CODE | MMAP_CODE;
+ map->buffer = state->info->save_buffer;
+ }
map->mask = 0xFFFFFF;
} else if (!strcmp(dtype, "Sega mapper")) {
state->info->mapper_type = MAPPER_SEGA;