diff options
Diffstat (limited to 'apps/plugins/rockboy/loader.c')
-rw-r--r-- | apps/plugins/rockboy/loader.c | 485 |
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 | ||
18 | static int mbc_table[256] = | 17 | static 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 | ||
41 | static int rtc_table[256] = | 40 | static 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 | ||
48 | static int batt_table[256] = | 47 | static 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 | ||
55 | static int romsize_table[256] = | 54 | static 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 | ||
71 | static int ramsize_table[256] = | 70 | static 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]; | |||
80 | static char rtcfile[500]; | 79 | static char rtcfile[500]; |
81 | static char saveprefix[500]; | 80 | static char saveprefix[500]; |
82 | 81 | ||
83 | static char *savename; | ||
84 | |||
85 | static int saveslot; | 82 | static int saveslot; |
86 | 83 | ||
87 | static int forcebatt, nobatt; | 84 | static int forcebatt, nobatt; |
88 | static int forcedmg, gbamode; | 85 | static int forcedmg; |
89 | 86 | ||
90 | static int memfill = -1, memrand = -1; | 87 | static int memfill = -1, memrand = -1; |
91 | 88 | ||
92 | //static byte romMemory[4*1025*1024]; | ||
93 | int mp3_buffer_size; | ||
94 | void *bufferpos; | ||
95 | |||
96 | static void initmem(void *mem, int size) | 89 | static 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 | ||
108 | static byte *loadfile(int fd, int *len) | 101 | static 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 | ||
129 | int rom_load(void) | 121 | int 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 | ||
190 | int sram_load(void) | 180 | int 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 | ||
213 | int sram_save(void) | 203 | int 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 | ||
234 | void state_save(int n) | 222 | void 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 | ||
251 | void state_load(int n) | 239 | void 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 | ||
271 | void rtc_save(void) | 259 | void 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 | ||
280 | void rtc_load(void) | 268 | void 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 | ||
290 | void loader_unload(void) | 278 | void 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 | /* | ||
305 | static 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 | |||
314 | static 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 | |||
324 | void cleanup(void) | 292 | void 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 | ||
331 | void loader_init(char *s) | 299 | void 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 | |||
363 | rcvar_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 | |||