summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/loader.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/rockboy/loader.c')
-rw-r--r--apps/plugins/rockboy/loader.c485
1 files changed, 209 insertions, 276 deletions
diff --git a/apps/plugins/rockboy/loader.c b/apps/plugins/rockboy/loader.c
index d6efa2e8ee..8166220c8e 100644
--- a/apps/plugins/rockboy/loader.c
+++ b/apps/plugins/rockboy/loader.c
@@ -10,68 +10,67 @@
10#include "hw.h" 10#include "hw.h"
11#include "lcd-gb.h" 11#include "lcd-gb.h"
12#include "rtc-gb.h" 12#include "rtc-gb.h"
13#include "rc.h"
14#include "save.h" 13#include "save.h"
15#include "sound.h" 14#include "sound.h"
16 15
17 16
18static int mbc_table[256] = 17static int mbc_table[256] =
19{ 18{
20 0, 1, 1, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, 19 0, 1, 1, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3,
21 3, 3, 3, 3, 0, 0, 0, 0, 0, 5, 5, 5, MBC_RUMBLE, MBC_RUMBLE, MBC_RUMBLE, 0, 20 3, 3, 3, 3, 0, 0, 0, 0, 0, 5, 5, 5, MBC_RUMBLE, MBC_RUMBLE, MBC_RUMBLE, 0,
22 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
23 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24 23
25 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
26 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
27 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
28 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
29 28
30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
31 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
33 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
34 33
35 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
36 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
37 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
38 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MBC_HUC3, MBC_HUC1 37 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MBC_HUC3, MBC_HUC1
39}; 38};
40 39
41static int rtc_table[256] = 40static int rtc_table[256] =
42{ 41{
43 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 42 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
44 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
45 0 44 0
46}; 45};
47 46
48static int batt_table[256] = 47static int batt_table[256] =
49{ 48{
50 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 49 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0,
51 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 50 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
52 0 51 0
53}; 52};
54 53
55static int romsize_table[256] = 54static int romsize_table[256] =
56{ 55{
57 2, 4, 8, 16, 32, 64, 128, 256, 512, 56 2, 4, 8, 16, 32, 64, 128, 256, 512,
58 0, 0, 0, 0, 0, 0, 0, 0, 57 0, 0, 0, 0, 0, 0, 0, 0,
59 0, 0, 0, 0, 0, 0, 0, 0, 58 0, 0, 0, 0, 0, 0, 0, 0,
60 0, 0, 0, 0, 0, 0, 0, 0, 59 0, 0, 0, 0, 0, 0, 0, 0,
61 0, 0, 0, 0, 0, 0, 0, 0, 60 0, 0, 0, 0, 0, 0, 0, 0,
62 0, 0, 0, 0, 0, 0, 0, 0, 61 0, 0, 0, 0, 0, 0, 0, 0,
63 0, 0, 0, 0, 0, 0, 0, 0, 62 0, 0, 0, 0, 0, 0, 0, 0,
64 0, 0, 0, 0, 0, 0, 0, 0, 63 0, 0, 0, 0, 0, 0, 0, 0,
65 0, 0, 0, 0, 0, 0, 0, 0, 64 0, 0, 0, 0, 0, 0, 0, 0,
66 0, 0, 0, 0, 0, 0, 0, 0, 65 0, 0, 0, 0, 0, 0, 0, 0,
67 0, 0, 128, 128, 128 66 0, 0, 128, 128, 128
68 /* 0, 0, 72, 80, 96 -- actual values but bad to use these! */ 67 /* 0, 0, 72, 80, 96 -- actual values but bad to use these! */
69}; 68};
70 69
71static int ramsize_table[256] = 70static int ramsize_table[256] =
72{ 71{
73 1, 1, 1, 4, 16, 72 1, 1, 1, 4, 16,
74 4 /* FIXME - what value should this be?! */ 73 4 /* FIXME - what value should this be?! */
75}; 74};
76 75
77 76
@@ -80,304 +79,238 @@ static char sramfile[500];
80static char rtcfile[500]; 79static char rtcfile[500];
81static char saveprefix[500]; 80static char saveprefix[500];
82 81
83static char *savename;
84
85static int saveslot; 82static int saveslot;
86 83
87static int forcebatt, nobatt; 84static int forcebatt, nobatt;
88static int forcedmg, gbamode; 85static int forcedmg;
89 86
90static int memfill = -1, memrand = -1; 87static int memfill = -1, memrand = -1;
91 88
92//static byte romMemory[4*1025*1024];
93int mp3_buffer_size;
94void *bufferpos;
95
96static void initmem(void *mem, int size) 89static void initmem(void *mem, int size)
97{ 90{
98 char *p = mem; 91 char *p = mem;
99 if (memrand >= 0) 92 if (memrand >= 0)
100 { 93 {
101 srand(memrand ? memrand : -6 ); //time(0)); 94 srand(memrand ? memrand : -6 ); /* time(0)); */
102 while(size--) *(p++) = rand(); 95 while(size--) *(p++) = rand();
103 } 96 }
104 else if (memfill >= 0) 97 else if (memfill >= 0)
105 memset(p, memfill, size); 98 memset(p, memfill, size);
106} 99}
107 100
108static byte *loadfile(int fd, int *len) 101static byte *loadfile(int fd, int *len)
109{ 102{
110 int c, l = 0, p = 0; 103 int c, l = 0, p = 0;
111 104
112 byte *d, buf[512]; 105 byte *d, buf[512];
113 d=malloc(32768); 106 d=malloc(32768);
114 for(;;) 107 for(;;)
115 { 108 {
116 c = read(fd, buf, sizeof buf); 109 c = read(fd, buf, sizeof buf);
117 if (c <= 0) break; 110 if (c <= 0) break;
118 l += c; 111 l += c;
119 memcpy(d+p, buf, c); 112 memcpy(d+p, buf, c);
120 p += c; 113 p += c;
121 } 114 }
122 setmallocpos(d+p+64); 115 setmallocpos(d+p+64);
123 *len = l; 116 *len = l;
124 return d; 117 return d;
125} 118}
126 119
127//static byte sram[65536];
128 120
129int rom_load(void) 121int rom_load(void)
130{ 122{
131 int fd; 123 int fd;
132 byte c, *data, *header; 124 byte c, *data, *header;
133 int len = 0, rlen; 125 int len = 0, rlen;
134 126
135 fd = open(romfile, O_RDONLY); 127 fd = open(romfile, O_RDONLY);
136 128
137 if (fd<0) { 129 if (fd<0) {
138 die("cannot open rom file"); 130 die("cannot open rom file");
139 die(romfile); 131 die(romfile);
140 return 1; 132 return 1;
141 } 133 }
142 134
143 data = loadfile(fd, &len); 135 data = loadfile(fd, &len);
144 header = data; // no zip. = decompress(data, &len); 136 header = data; /* no zip. = decompress(data, &len); */
145 137
146 memcpy(rom.name, header+0x0134, 16); 138 memcpy(rom.name, header+0x0134, 16);
147 if (rom.name[14] & 0x80) rom.name[14] = 0; 139 if (rom.name[14] & 0x80) rom.name[14] = 0;
148 if (rom.name[15] & 0x80) rom.name[15] = 0; 140 if (rom.name[15] & 0x80) rom.name[15] = 0;
149 rom.name[16] = 0; 141 rom.name[16] = 0;
150 142
151 c = header[0x0147]; 143 c = header[0x0147];
152 mbc.type = mbc_table[c]; 144 mbc.type = mbc_table[c];
153 mbc.batt = (batt_table[c] && !nobatt) || forcebatt; 145 mbc.batt = (batt_table[c] && !nobatt) || forcebatt;
154// mbc.batt = 1; // always store savegame mem. 146 rtc.batt = rtc_table[c];
155 rtc.batt = rtc_table[c]; 147 mbc.romsize = romsize_table[header[0x0148]];
156 mbc.romsize = romsize_table[header[0x0148]]; 148 mbc.ramsize = ramsize_table[header[0x0149]];
157 mbc.ramsize = ramsize_table[header[0x0149]]; 149
158 150 if (!mbc.romsize) {
159 if (!mbc.romsize) { 151 die("unknown ROM size %02X\n", header[0x0148]);
160 die("unknown ROM size %02X\n", header[0x0148]); 152 return 1;
161 return 1; 153 }
162 } 154 if (!mbc.ramsize) {
163 if (!mbc.ramsize) { 155 die("unknown SRAM size %02X\n", header[0x0149]);
164 die("unknown SRAM size %02X\n", header[0x0149]); 156 return 1;
165 return 1; 157 }
166 } 158
167 159 rlen = 16384 * mbc.romsize;
168 rlen = 16384 * mbc.romsize; 160 rom.bank = (void *) data; /* realloc(data, rlen); */
169 rom.bank = (void *) data; //realloc(data, rlen); 161 if (rlen > len) memset(rom.bank[0]+len, 0xff, rlen - len);
170 if (rlen > len) memset(rom.bank[0]+len, 0xff, rlen - len); 162
171 163 ram.sbank = malloc(8192 * mbc.ramsize);
172 ram.sbank = malloc(8192 * mbc.ramsize); 164 /* ram.ibank = malloc(4096*8); */
173 //ram.ibank = malloc(4096*8); 165
174 166 initmem(ram.sbank, 8192 * mbc.ramsize);
175 initmem(ram.sbank, 8192 * mbc.ramsize); 167 initmem(ram.ibank, 4096 * 8);
176 initmem(ram.ibank, 4096 * 8); 168
177 169 mbc.rombank = 1;
178 mbc.rombank = 1; 170 mbc.rambank = 0;
179 mbc.rambank = 0; 171
180 172 c = header[0x0143];
181 c = header[0x0143];
182 hw.cgb = ((c == 0x80) || (c == 0xc0)) && !forcedmg; 173 hw.cgb = ((c == 0x80) || (c == 0xc0)) && !forcedmg;
183 hw.gba = (hw.cgb && gbamode); 174
184 175 close(fd);
185 close(fd);
186 176
187 return 0; 177 return 0;
188} 178}
189 179
190int sram_load(void) 180int sram_load(void)
191{ 181{
192 int fd; 182 int fd;
193 char meow[500]; 183 char meow[500];
194 184
195 if (!mbc.batt || !sramfile || !*sramfile) return -1; 185 if (!mbc.batt || !sramfile || !*sramfile) return -1;
196 186
197 /* Consider sram loaded at this point, even if file doesn't exist */ 187 /* Consider sram loaded at this point, even if file doesn't exist */
198 ram.loaded = 1; 188 ram.loaded = 1;
199 189
200 fd = open(sramfile, O_RDONLY); 190 fd = open(sramfile, O_RDONLY);
201 snprintf(meow,499,"Opening %s %d",sramfile,fd); 191 snprintf(meow,499,"Opening %s %d",sramfile,fd);
202 rb->splash(HZ*2, true, meow); 192 rb->splash(HZ*2, true, meow);
203 if (fd<0) return -1; 193 if (fd<0) return -1;
204 snprintf(meow,499,"Loading savedata from %s",sramfile); 194 snprintf(meow,499,"Loading savedata from %s",sramfile);
205 rb->splash(HZ*2, true, meow); 195 rb->splash(HZ*2, true, meow);
206 read(fd,ram.sbank, 8192*mbc.ramsize); 196 read(fd,ram.sbank, 8192*mbc.ramsize);
207 close(fd); 197 close(fd);
208 198
209 return 0; 199 return 0;
210} 200}
211 201
212 202
213int sram_save(void) 203int sram_save(void)
214{ 204{
215 int fd; 205 int fd;
216 char meow[500]; 206 char meow[500];
217 207
218 /* If we crash before we ever loaded sram, DO NOT SAVE! */ 208 /* If we crash before we ever loaded sram, DO NOT SAVE! */
219 if (!mbc.batt || !sramfile || !ram.loaded || !mbc.ramsize) 209 if (!mbc.batt || !sramfile || !ram.loaded || !mbc.ramsize)
220 return -1; 210 return -1;
221 fd = open(sramfile, O_WRONLY|O_CREAT|O_TRUNC); 211 fd = open(sramfile, O_WRONLY|O_CREAT|O_TRUNC);
222// snprintf(meow,499,"Opening %s %d",sramfile,fd); 212 if (fd<0) return -1;
223// rb->splash(HZ*2, true, meow); 213 snprintf(meow,499,"Saving savedata to %s",sramfile);
224 if (fd<0) return -1; 214 rb->splash(HZ*2, true, meow);
225 snprintf(meow,499,"Saving savedata to %s",sramfile); 215 write(fd,ram.sbank, 8192*mbc.ramsize);
226 rb->splash(HZ*2, true, meow); 216 close(fd);
227 write(fd,ram.sbank, 8192*mbc.ramsize); 217
228 close(fd); 218 return 0;
229
230 return 0;
231} 219}
232 220
233 221
234void state_save(int n) 222void state_save(int n)
235{ 223{
236 int fd; 224 int fd;
237 char name[500]; 225 char name[500];
238 226
239 if (n < 0) n = saveslot; 227 if (n < 0) n = saveslot;
240 if (n < 0) n = 0; 228 if (n < 0) n = 0;
241 snprintf(name, 499,"%s.%03d", saveprefix, n); 229 snprintf(name, 499,"%s.%03d", saveprefix, n);
242 230
243 if ((fd = open(name, O_WRONLY|O_CREAT|O_TRUNC)>=0)) 231 if ((fd = open(name, O_WRONLY|O_CREAT|O_TRUNC)>=0))
244 { 232 {
245 savestate(fd); 233 savestate(fd);
246 close(fd); 234 close(fd);
247 } 235 }
248} 236}
249 237
250 238
251void state_load(int n) 239void state_load(int n)
252{ 240{
253 int fd; 241 int fd;
254 char name[500]; 242 char name[500];
255 243
256 if (n < 0) n = saveslot; 244 if (n < 0) n = saveslot;
257 if (n < 0) n = 0; 245 if (n < 0) n = 0;
258 snprintf(name, 499, "%s.%03d", saveprefix, n); 246 snprintf(name, 499, "%s.%03d", saveprefix, n);
259 247
260 if ((fd = open(name, O_RDONLY)>=0)) 248 if ((fd = open(name, O_RDONLY)>=0))
261 { 249 {
262 loadstate(fd); 250 loadstate(fd);
263 close(fd); 251 close(fd);
264 vram_dirty(); 252 vram_dirty();
265 pal_dirty(); 253 pal_dirty();
266 sound_dirty(); 254 sound_dirty();
267 mem_updatemap(); 255 mem_updatemap();
268 } 256 }
269} 257}
270 258
271void rtc_save(void) 259void rtc_save(void)
272{ 260{
273 int fd; 261 int fd;
274 if (!rtc.batt) return; 262 if (!rtc.batt) return;
275 if ((fd = open(rtcfile, O_WRONLY|O_CREAT|O_TRUNC))<0) return; 263 if ((fd = open(rtcfile, O_WRONLY|O_CREAT|O_TRUNC))<0) return;
276 rtc_save_internal(fd); 264 rtc_save_internal(fd);
277 close(fd); 265 close(fd);
278} 266}
279 267
280void rtc_load(void) 268void rtc_load(void)
281{ 269{
282 int fd; 270 int fd;
283 if (!rtc.batt) return; 271 if (!rtc.batt) return;
284 if ((fd = open(rtcfile, O_RDONLY))<0) return; 272 if ((fd = open(rtcfile, O_RDONLY))<0) return;
285 rtc_load_internal(fd); 273 rtc_load_internal(fd);
286 close(fd); 274 close(fd);
287} 275}
288 276
289 277
290void loader_unload(void) 278void loader_unload(void)
291{ 279{
292 sram_save(); 280 sram_save();
293// if (romfile) free(romfile); 281 /* if (romfile) free(romfile);
294// if (sramfile) free(sramfile); 282 if (sramfile) free(sramfile);
295// if (saveprefix) free(saveprefix); 283 if (saveprefix) free(saveprefix);
296// if (rom.bank) free(rom.bank); 284 if (rom.bank) free(rom.bank);
297// if (ram.sbank) free(ram.sbank); 285 if (ram.sbank) free(ram.sbank); */
298 romfile = 0; 286 romfile = 0;
299 rom.bank = 0; 287 rom.bank = 0;
300 ram.sbank = 0; 288 ram.sbank = 0;
301 mbc.type = mbc.romsize = mbc.ramsize = mbc.batt = 0; 289 mbc.type = mbc.romsize = mbc.ramsize = mbc.batt = 0;
302}
303
304/*
305static char *base(char *s)
306{
307 char *p;
308 p = strrchr(s, '/');
309 if (p) return p+1;
310 return s;
311} 290}
312 291
313
314static char *ldup(char *s)
315{
316 int i;
317 char *n, *p;
318 p = n = malloc(strlen(s));
319 for (i = 0; s[i]; i++) if (isalnum(s[i])) *(p++) = tolower(s[i]);
320 *p = 0;
321 return n;
322}*/
323
324void cleanup(void) 292void cleanup(void)
325{ 293{
326 sram_save(); 294 sram_save();
327 rtc_save(); 295 rtc_save();
328 // IDEA - if error, write emergency savestate..? 296 /* IDEA - if error, write emergency savestate..? */
329} 297}
330 298
331void loader_init(char *s) 299void loader_init(char *s)
332{ 300{
333 char *name; 301 romfile = s;
334// DIR* dir; 302 if(rom_load())
335 303 return;
336// sys_checkdir(savedir, 1); /* needs to be writable */ 304 rb->splash(HZ/2, true, rom.name);
337/* dir=opendir(savedir); // should be handled when the program opens 305
338 if(!dir) 306 snprintf(saveprefix, 499, "%s/%s", savedir, rom.name);
339 mkdir(savedir); 307
340 else 308 strcpy(sramfile, saveprefix);
341 closedir(dir);*/ 309 strcat(sramfile, ".sav");
342 310
343 romfile = s; 311 strcpy(rtcfile, saveprefix);
344 if(rom_load()) 312 strcat(rtcfile, ".rtc");
345 return; 313
346 vid_settitle(rom.name); 314 sram_load();
347 name = rom.name; 315 rtc_load();
348
349 snprintf(saveprefix, 499, "%s/%s", savedir, name);
350
351 strcpy(sramfile, saveprefix);
352 strcat(sramfile, ".sav");
353
354 strcpy(rtcfile, saveprefix);
355 strcat(rtcfile, ".rtc");
356
357 sram_load();
358 rtc_load();
359
360 //atexit(cleanup);
361} 316}
362
363rcvar_t loader_exports[] =
364{
365 RCV_STRING("savedir", &savedir),
366 RCV_STRING("savename", &savename),
367 RCV_INT("saveslot", &saveslot),
368 RCV_BOOL("forcebatt", &forcebatt),
369 RCV_BOOL("nobatt", &nobatt),
370 RCV_BOOL("forcedmg", &forcedmg),
371 RCV_INT("memfill", &memfill),
372 RCV_INT("memrand", &memrand),
373 RCV_END
374};
375
376
377
378
379
380
381
382
383