Mercurial > hg > xmms-sid
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; |