changeset 912:4c6c5247de7d

Improve ROM loading functions, make ROM list a public variable.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 10 Nov 2012 13:29:42 +0200
parents b928b8a9c5bf
children f8aa81ac2528
files src/xs_backend.c src/xs_backend.h
diffstat 2 files changed, 50 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- 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;
         }
     }
--- 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);