# HG changeset patch # User Matti Hamalainen # Date 1352430809 -7200 # Node ID d03e5c73eb518c90b704d58d7bc2fbdcc3552232 # Parent 0fdb001e456c8260932f586fa31a8f46b1bbd55b Add ROM image loading. diff -r 0fdb001e456c -r d03e5c73eb51 src/xs_backend.c --- a/src/xs_backend.c Fri Nov 09 05:10:28 2012 +0200 +++ b/src/xs_backend.c Fri Nov 09 05:13:29 2012 +0200 @@ -76,6 +76,14 @@ static const gint xs_nenginelist = sizeof(xs_enginelist) / sizeof(xs_enginelist[0]); +static const XSROMImageData xs_rom_images[XS_C64_ROM_IMAGES] = +{ + { "Kernal", "kernal", 8192 }, + { "Basic", "basic", 8192 }, + { "Chargen", "chargen", 4096 }, +}; + + gboolean xs_init_emu_backend(XSEngineState *state, gint *preferred) { gint engine; @@ -96,3 +104,38 @@ XSDEBUG("init#1: %s, %i\n", initialized ? "OK" : "FAILED", *preferred); return initialized; } + + +gboolean xs_load_rom_images(guint8 **roms) +{ + gint i; + + XSDEBUG("Loading C64 ROM images ...\n"); + + 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)) + { + 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; + } + } + + return TRUE; +} diff -r 0fdb001e456c -r d03e5c73eb51 src/xs_backend.h --- a/src/xs_backend.h Fri Nov 09 05:10:28 2012 +0200 +++ b/src/xs_backend.h Fri Nov 09 05:13:29 2012 +0200 @@ -10,7 +10,8 @@ struct XSEngineState; -typedef struct { +typedef struct +{ gint plrIdent; gboolean (*plrProbe)(XSFile *); gboolean (*plrInit)(struct XSEngineState *); @@ -25,7 +26,8 @@ } XSEngine; -typedef struct XSEngineState { +typedef struct XSEngineState +{ gint audioFrequency, /* Audio settings */ audioChannels, audioBitsPerSample; @@ -43,8 +45,19 @@ } XSEngineState; +typedef struct +{ + char *name; + char *filename; + size_t size; +} XSROMImageData; + +#define XS_C64_ROM_IMAGES 3 + gboolean xs_init_emu_backend(XSEngineState *state, gint *preferred); +gboolean xs_load_rom_images(guint8 **roms); + #ifdef __cplusplus } diff -r 0fdb001e456c -r d03e5c73eb51 src/xs_sidplayfp.cpp --- a/src/xs_sidplayfp.cpp Fri Nov 09 05:10:28 2012 +0200 +++ b/src/xs_sidplayfp.cpp Fri Nov 09 05:13:29 2012 +0200 @@ -47,6 +47,7 @@ #ifdef HAVE_SIDPLAYFP_V1 sidplayfp emu; SidConfig config; + guint8 *romImages[XS_C64_ROM_IMAGES]; #else sidplay2 emu; sid2_config_t config; @@ -290,6 +291,12 @@ XSDEBUG("%s\n", engine->config.sidEmulation->credits()); +#ifdef HAVE_SIDPLAYFP_V1 + if (!xs_load_rom_images(engine->romImages)) + return FALSE; + + engine->emu.setRoms(engine->romImages[0], engine->romImages[1], engine->romImages[2]); +#endif return TRUE; }