summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/save.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/rockboy/save.c')
-rw-r--r--apps/plugins/rockboy/save.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/apps/plugins/rockboy/save.c b/apps/plugins/rockboy/save.c
index 11fc3507c9..dc94ce69ff 100644
--- a/apps/plugins/rockboy/save.c
+++ b/apps/plugins/rockboy/save.c
@@ -169,9 +169,12 @@ void loadstate(int fd)
169 int irl = hw.cgb ? 8 : 2; 169 int irl = hw.cgb ? 8 : 2;
170 int vrl = hw.cgb ? 4 : 2; 170 int vrl = hw.cgb ? 4 : 2;
171 int srl = mbc.ramsize << 1; 171 int srl = mbc.ramsize << 1;
172 size_t base_offset;
172 173
173 ver = hramofs = hiofs = palofs = oamofs = wavofs = 0; 174 ver = hramofs = hiofs = palofs = oamofs = wavofs = 0;
174 175
176 base_offset = lseek(fd, 0, SEEK_CUR);
177
175 read(fd,buf, 4096); 178 read(fd,buf, 4096);
176 179
177 for (j = 0; header[j][0]; j++) 180 for (j = 0; header[j][0]; j++)
@@ -207,14 +210,18 @@ void loadstate(int fd)
207 if (wavofs) memcpy(snd.wave, buf+wavofs, sizeof snd.wave); 210 if (wavofs) memcpy(snd.wave, buf+wavofs, sizeof snd.wave);
208 else memcpy(snd.wave, ram.hi+0x30, 16); /* patch data from older files */ 211 else memcpy(snd.wave, ram.hi+0x30, 16); /* patch data from older files */
209 212
210 lseek(fd, iramblock<<12, SEEK_SET); 213 lseek(fd, base_offset + (iramblock << 12), SEEK_SET);
211 read(fd,ram.ibank, 4096*irl); 214 read(fd,ram.ibank, 4096*irl);
212 215
213 lseek(fd, vramblock<<12, SEEK_SET); 216 lseek(fd, base_offset + (vramblock << 12), SEEK_SET);
214 read(fd,lcd.vbank, 4096*vrl); 217 read(fd,lcd.vbank, 4096*vrl);
215 218
216 lseek(fd, sramblock<<12, SEEK_SET); 219 lseek(fd, base_offset + (sramblock << 12), SEEK_SET);
217 read(fd,ram.sbank, 4096*srl); 220 read(fd,ram.sbank, 4096*srl);
221 vram_dirty();
222 pal_dirty();
223 sound_dirty();
224 mem_updatemap();
218} 225}
219 226
220void savestate(int fd) 227void savestate(int fd)
@@ -226,6 +233,7 @@ void savestate(int fd)
226 int irl = hw.cgb ? 8 : 2; 233 int irl = hw.cgb ? 8 : 2;
227 int vrl = hw.cgb ? 4 : 2; 234 int vrl = hw.cgb ? 4 : 2;
228 int srl = mbc.ramsize << 1; 235 int srl = mbc.ramsize << 1;
236 size_t base_offset;
229 237
230 ver = 0x105; 238 ver = 0x105;
231 iramblock = 1; 239 iramblock = 1;
@@ -261,16 +269,18 @@ void savestate(int fd)
261 memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam); 269 memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam);
262 memcpy(buf+wavofs, snd.wave, sizeof snd.wave); 270 memcpy(buf+wavofs, snd.wave, sizeof snd.wave);
263 271
264 lseek(fd, 0, SEEK_SET); 272 /* calculate base offset for output file */
273 /* (we'll seek relative to that from now on) */
274 base_offset = lseek(fd, 0, SEEK_CUR);
265 write(fd,buf, 4096); 275 write(fd,buf, 4096);
266 276
267 lseek(fd, iramblock<<12, SEEK_SET); 277 lseek(fd, base_offset + (iramblock << 12), SEEK_SET);
268 write(fd,ram.ibank, 4096*irl); 278 write(fd,ram.ibank, 4096*irl);
269 279
270 lseek(fd, vramblock<<12, SEEK_SET); 280 lseek(fd, base_offset + (vramblock << 12), SEEK_SET);
271 write(fd,lcd.vbank, 4096*vrl); 281 write(fd,lcd.vbank, 4096*vrl);
272 282
273 lseek(fd, sramblock<<12, SEEK_SET); 283 lseek(fd, base_offset + (sramblock << 12), SEEK_SET);
274 write(fd,ram.sbank, 4096*srl); 284 write(fd,ram.sbank, 4096*srl);
275} 285}
276 286