# HG changeset patch # User Matti Hamalainen # Date 1352546982 -7200 # Node ID 4c6c5247de7d096aff3cccf124c2331b9a863707 # Parent b928b8a9c5bf87541165744a7dc935a197033ce9 Improve ROM loading functions, make ROM list a public variable. diff -r b928b8a9c5bf -r 4c6c5247de7d src/xs_backend.c --- a/src/xs_backend.c Sat Nov 10 13:29:18 2012 +0200 +++ b/src/xs_backend.c Sat Nov 10 13:29:42 2012 +0200 @@ -76,11 +76,11 @@ static const gint xs_nenginelist = sizeof(xs_enginelist) / sizeof(xs_enginelist[0]); -static const XSROMImageData xs_rom_images[XS_C64_ROM_IMAGES] = +const XSROMImageData xs_rom_images[XS_C64_ROM_IMAGES] = { - { "Kernal", "kernal", 8192 }, - { "Basic", "basic", 8192 }, - { "Chargen", "chargen", 4096 }, + { "Kernal", "kernal", 8192 }, + { "Basic v2.0", "basic", 8192 }, + { "Character ROM", "chargen", 4096 }, }; @@ -106,33 +106,56 @@ } +gboolean xs_load_rom_image(gint index, guint8 **data) +{ + const XSROMImageData *rom = &xs_rom_images[index]; + size_t size = 0; + + XSDEBUG("Trying ROM '%s' from '%s%s', %d bytes.\n", + rom->name, xs_cfg.romPath, rom->filename, rom->size); + + if (!xs_fload_buffer_path(xs_cfg.romPath, rom->filename, + data, &size, rom->size, TRUE)) + { + xs_error("Failed to load required %s ROM image '%s%s'.\n", + rom->name, xs_cfg.romPath, rom->filename); + return FALSE; + } + + if (size < rom->size) + { + xs_error("ROM image %s '%s%s' size does not match: %d != %d\n", + rom->name, xs_cfg.romPath, rom->filename, + size, rom->size); + return FALSE; + } +} + + +void xs_free_rom_images(guint8 **roms) +{ + gint i; + for (i = 0; i < XS_C64_ROM_IMAGES; i++) + { + g_free(roms[i]); + roms[i] = NULL; + } +} + + gboolean xs_load_rom_images(guint8 **roms) { gint i; XSDEBUG("Loading C64 ROM images ...\n"); + xs_free_rom_images(roms); + for (i = 0; i < XS_C64_ROM_IMAGES; i++) { - const XSROMImageData *rom = &xs_rom_images[i]; - size_t size = 0; - - XSDEBUG("Trying ROM '%s' from '%s%s', %d bytes.\n", - rom->name, xs_cfg.romPath, rom->filename, rom->size); - - if (!xs_fload_buffer_path(xs_cfg.romPath, rom->filename, - &roms[i], &size, rom->size, TRUE)) + if (!xs_load_rom_image(i, &roms[i])) { - xs_error("Failed to load required %s ROM image '%s%s'.\n", - rom->name, xs_cfg.romPath, rom->filename); - return FALSE; - } - - if (size < rom->size) - { - xs_error("ROM image %s '%s%s' size does not match: %d != %d\n", - rom->name, xs_cfg.romPath, rom->filename, - size, rom->size); + xs_free_rom_images(roms); return FALSE; } } diff -r b928b8a9c5bf -r 4c6c5247de7d src/xs_backend.h --- a/src/xs_backend.h Sat Nov 10 13:29:18 2012 +0200 +++ b/src/xs_backend.h Sat Nov 10 13:29:42 2012 +0200 @@ -47,15 +47,18 @@ typedef struct { - char *name; - char *filename; + gchar *name; + gchar *filename; size_t size; } XSROMImageData; #define XS_C64_ROM_IMAGES 3 +extern const XSROMImageData xs_rom_images[XS_C64_ROM_IMAGES]; gboolean xs_init_emu_backend(XSEngineState *state, gint *preferred); +gboolean xs_load_rom_image(gint index, guint8 **data); +void xs_free_rom_images(guint8 **roms); gboolean xs_load_rom_images(guint8 **roms);