changeset 876:d03e5c73eb51

Add ROM image loading.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 09 Nov 2012 05:13:29 +0200
parents 0fdb001e456c
children 5e33075ed9dd
files src/xs_backend.c src/xs_backend.h src/xs_sidplayfp.cpp
diffstat 3 files changed, 65 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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;
+}
--- 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
 }
--- 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;
 }