comparison src/xs_backend.c @ 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 d03e5c73eb51
children 6f53d0405d58
comparison
equal deleted inserted replaced
911:b928b8a9c5bf 912:4c6c5247de7d
74 }; 74 };
75 75
76 static const gint xs_nenginelist = sizeof(xs_enginelist) / sizeof(xs_enginelist[0]); 76 static const gint xs_nenginelist = sizeof(xs_enginelist) / sizeof(xs_enginelist[0]);
77 77
78 78
79 static const XSROMImageData xs_rom_images[XS_C64_ROM_IMAGES] = 79 const XSROMImageData xs_rom_images[XS_C64_ROM_IMAGES] =
80 { 80 {
81 { "Kernal", "kernal", 8192 }, 81 { "Kernal", "kernal", 8192 },
82 { "Basic", "basic", 8192 }, 82 { "Basic v2.0", "basic", 8192 },
83 { "Chargen", "chargen", 4096 }, 83 { "Character ROM", "chargen", 4096 },
84 }; 84 };
85 85
86 86
87 gboolean xs_init_emu_backend(XSEngineState *state, gint *preferred) 87 gboolean xs_init_emu_backend(XSEngineState *state, gint *preferred)
88 { 88 {
104 XSDEBUG("init#1: %s, %i\n", initialized ? "OK" : "FAILED", *preferred); 104 XSDEBUG("init#1: %s, %i\n", initialized ? "OK" : "FAILED", *preferred);
105 return initialized; 105 return initialized;
106 } 106 }
107 107
108 108
109 gboolean xs_load_rom_image(gint index, guint8 **data)
110 {
111 const XSROMImageData *rom = &xs_rom_images[index];
112 size_t size = 0;
113
114 XSDEBUG("Trying ROM '%s' from '%s%s', %d bytes.\n",
115 rom->name, xs_cfg.romPath, rom->filename, rom->size);
116
117 if (!xs_fload_buffer_path(xs_cfg.romPath, rom->filename,
118 data, &size, rom->size, TRUE))
119 {
120 xs_error("Failed to load required %s ROM image '%s%s'.\n",
121 rom->name, xs_cfg.romPath, rom->filename);
122 return FALSE;
123 }
124
125 if (size < rom->size)
126 {
127 xs_error("ROM image %s '%s%s' size does not match: %d != %d\n",
128 rom->name, xs_cfg.romPath, rom->filename,
129 size, rom->size);
130 return FALSE;
131 }
132 }
133
134
135 void xs_free_rom_images(guint8 **roms)
136 {
137 gint i;
138 for (i = 0; i < XS_C64_ROM_IMAGES; i++)
139 {
140 g_free(roms[i]);
141 roms[i] = NULL;
142 }
143 }
144
145
109 gboolean xs_load_rom_images(guint8 **roms) 146 gboolean xs_load_rom_images(guint8 **roms)
110 { 147 {
111 gint i; 148 gint i;
112 149
113 XSDEBUG("Loading C64 ROM images ...\n"); 150 XSDEBUG("Loading C64 ROM images ...\n");
114 151
152 xs_free_rom_images(roms);
153
115 for (i = 0; i < XS_C64_ROM_IMAGES; i++) 154 for (i = 0; i < XS_C64_ROM_IMAGES; i++)
116 { 155 {
117 const XSROMImageData *rom = &xs_rom_images[i]; 156 if (!xs_load_rom_image(i, &roms[i]))
118 size_t size = 0;
119
120 XSDEBUG("Trying ROM '%s' from '%s%s', %d bytes.\n",
121 rom->name, xs_cfg.romPath, rom->filename, rom->size);
122
123 if (!xs_fload_buffer_path(xs_cfg.romPath, rom->filename,
124 &roms[i], &size, rom->size, TRUE))
125 { 157 {
126 xs_error("Failed to load required %s ROM image '%s%s'.\n", 158 xs_free_rom_images(roms);
127 rom->name, xs_cfg.romPath, rom->filename);
128 return FALSE;
129 }
130
131 if (size < rom->size)
132 {
133 xs_error("ROM image %s '%s%s' size does not match: %d != %d\n",
134 rom->name, xs_cfg.romPath, rom->filename,
135 size, rom->size);
136 return FALSE; 159 return FALSE;
137 } 160 }
138 } 161 }
139 162
140 return TRUE; 163 return TRUE;