void savestate(int fd) { int i; byte buf[4096]; un32 (*header)[2] = (un32 (*)[2])buf; un32 d = 0; int irl = hw.cgb ? 8 : 2; int vrl = hw.cgb ? 4 : 2; int srl = mbc.ramsize << 1; size_t base_offset; ver = 0x104; iramblock = 1; vramblock = 1+irl; sramblock = 1+irl+vrl; hiofs = 4096 - 768; palofs = 4096 - 512; oamofs = 4096 - 256; memset(buf, 0, sizeof buf); for (i = 0; svars[i].len > 0; i++) { header[i][0] = svars[i].k.key; switch (svars[i].len) { case 1: d = *(byte *)svars[i].ptr; break; case 2: d = *(un16 *)svars[i].ptr; break; case 4: d = *(un32 *)svars[i].ptr; break; } header[i][1] = LIL(d); } header[i][0] = header[i][1] = 0; memcpy(buf+hiofs, ram.hi, sizeof ram.hi); memcpy(buf+palofs, lcd.pal, sizeof lcd.pal); memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam); /* calculate base offset for output file */ /* (we'll seek relative to that from now on) */ base_offset = lseek(fd, 0, SEEK_CUR); write(fd,buf, 4096); lseek(fd, base_offset + (iramblock << 12), SEEK_SET); write(fd,ram.ibank, 4096*irl); lseek(fd, base_offset + (vramblock << 12), SEEK_SET); write(fd,lcd.vbank, 4096*vrl); lseek(fd, base_offset + (sramblock << 12), SEEK_SET); write(fd,ram.sbank, 4096*srl); }
void loadstate(FILE *f) { int i, j; byte buf[4096]; un32 (*header)[2] = (un32 (*)[2])buf; un32 d; int irl = hw.cgb ? 8 : 2; int vrl = hw.cgb ? 4 : 2; int srl = mbc.ramsize << 1; ver = hramofs = hiofs = palofs = oamofs = wavofs = 0; fseek(f, 0, SEEK_SET); fread(buf, 4096, 1, f); for (j = 0; header[j][0]; j++) { for (i = 0; svars[i].ptr; i++) { if (header[j][0] != *(un32 *)svars[i].key) continue; d = LIL(header[j][1]); switch (svars[i].len) { case 1: *(byte *)svars[i].ptr = d; break; case 2: *(un16 *)svars[i].ptr = d; break; case 4: *(un32 *)svars[i].ptr = d; break; } break; } } /* obsolete as of version 0x104 */ if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127); if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi); if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal); if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam); if (wavofs) memcpy(snd.wave, buf+wavofs, sizeof snd.wave); else memcpy(snd.wave, ram.hi+0x30, 16); /* patch data from older files */ fseek(f, iramblock<<12, SEEK_SET); fread(ram.ibank, 4096, irl, f); fseek(f, vramblock<<12, SEEK_SET); fread(lcd.vbank, 4096, vrl, f); fseek(f, sramblock<<12, SEEK_SET); fread(ram.sbank, 4096, srl, f); }
void savestate(FILE *f) { int i; byte buf[4096]; un32 (*header)[2] = (un32 (*)[2])buf; un32 d = 0; int irl = hw.cgb ? 8 : 2; int vrl = hw.cgb ? 4 : 2; int srl = mbc.ramsize << 1; ver = 0x105; iramblock = 1; vramblock = 1+irl; sramblock = 1+irl+vrl; wavofs = 4096 - 784; hiofs = 4096 - 768; palofs = 4096 - 512; oamofs = 4096 - 256; memset(buf, 0, sizeof buf); for (i = 0; svars[i].len > 0; i++) { header[i][0] = *(un32 *)svars[i].key; switch (svars[i].len) { case 1: d = *(byte *)svars[i].ptr; break; case 2: d = *(un16 *)svars[i].ptr; break; case 4: d = *(un32 *)svars[i].ptr; break; } header[i][1] = LIL(d); } header[i][0] = header[i][1] = 0; memcpy(buf+hiofs, ram.hi, sizeof ram.hi); memcpy(buf+palofs, lcd.pal, sizeof lcd.pal); memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam); memcpy(buf+wavofs, snd.wave, sizeof snd.wave); fseek(f, 0, SEEK_SET); fwrite(buf, 4096, 1, f); fseek(f, iramblock<<12, SEEK_SET); fwrite(ram.ibank, 4096, irl, f); fseek(f, vramblock<<12, SEEK_SET); fwrite(lcd.vbank, 4096, vrl, f); fseek(f, sramblock<<12, SEEK_SET); fwrite(ram.sbank, 4096, srl, f); }
void loadstate(int fd) { int i, j; byte buf[4096]; un32 (*header)[2] = (un32 (*)[2])buf; un32 d; int irl = hw.cgb ? 8 : 2; int vrl = hw.cgb ? 4 : 2; int srl = mbc.ramsize << 1; size_t base_offset; ver = hramofs = hiofs = palofs = oamofs = wavofs = 0; base_offset = lseek(fd, 0, SEEK_CUR); read(fd,buf, 4096); for (j = 0; header[j][0]; j++) { for (i = 0; svars[i].ptr; i++) { if (header[j][0] != svars[i].k.key) continue; d = LIL(header[j][1]); switch (svars[i].len) { case 1: *(byte *)svars[i].ptr = d; break; case 2: *(un16 *)svars[i].ptr = d; break; case 4: *(un32 *)svars[i].ptr = d; break; } break; } } /* obsolete as of version 0x104 */ if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127); if (wavofs) memcpy(ram.hi+48, buf+wavofs, 16); if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi); if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal); if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam); lseek(fd, base_offset + (iramblock << 12), SEEK_SET); read(fd,ram.ibank, 4096*irl); lseek(fd, base_offset + (vramblock << 12), SEEK_SET); read(fd,lcd.vbank, 4096*vrl); lseek(fd, base_offset + (sramblock << 12), SEEK_SET); read(fd,ram.sbank, 4096*srl); vram_dirty(); pal_dirty(); sound_dirty(); mem_updatemap(); }
void savestate(const char *filename) { int i; byte *buf;//[4096]; byte *bufptr; //menu_message("Saving"); int irl = hw.cgb ? 8 : 2; int vrl = hw.cgb ? 4 : 2; int srl = mbc.ramsize << 1; int bufsize = (1 + irl + vrl + srl) * 4096; buf=(byte*)malloc(bufsize); bufptr = buf; un32 (*header)[2] = (un32 (*)[2])buf; un32 d = 0; ver = 0x105; iramblock = 1; vramblock = 1+irl; sramblock = 1+irl+vrl; wavofs = 4096 - 784; hiofs = 4096 - 768; palofs = 4096 - 512; oamofs = 4096 - 256; memset(buf, 0, 4096); for (i = 0; svars[i].len > 0; i++) { header[i][0] = *(un32 *)svars[i].key; switch (svars[i].len) { case 1: d = *(byte *)svars[i].ptr; break; case 2: d = *(un16 *)svars[i].ptr; break; case 4: d = *(un32 *)svars[i].ptr; break; } header[i][1] = LIL(d); } header[i][0] = header[i][1] = 0; memcpy(buf+hiofs, ram.hi, sizeof ram.hi); memcpy(buf+palofs, lcd.pal, sizeof lcd.pal); memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam); memcpy(buf+wavofs, snd.wave, sizeof snd.wave); bufptr += 4096; //fseek(f, iramblock<<12, SEEK_SET); memcpy(bufptr, ram.ibank, 4096 * irl); bufptr += 4096 * irl; //fseek(f, vramblock<<12, SEEK_SET); memcpy(bufptr, lcd.vbank, 4096 * vrl); bufptr += 4096 * vrl; //fseek(f, sramblock<<12, SEEK_SET); memcpy(bufptr, ram.sbank, 4096 * srl); bufptr += 4096 * srl; save_archive(filename, "GBCOID", buf, bufsize); free(buf); }
void loadstate(const char *filename) { int i, j; byte *buf;//[4096]; byte *bufptr; //menu_message("Loading"); int irl = hw.cgb ? 8 : 2; int vrl = hw.cgb ? 4 : 2; int srl = mbc.ramsize << 1; int bufsize = (1 + irl + vrl + srl) * 4096; buf=(byte*)malloc(bufsize); bufptr = buf; int n = load_archive(filename, "GBCOID", buf, bufsize); if (n < 0) { FILE *file = fopen(filename, "rb"); if (file != NULL) { n = fread(buf, 1, bufsize, file); fclose(file); } } if (n != bufsize) { free(buf); return; } un32 (*header)[2] = (un32 (*)[2])buf; un32 d; ver = hramofs = hiofs = palofs = oamofs = wavofs = 0; bufptr += 4096; for (j = 0; header[j][0]; j++) { for (i = 0; svars[i].ptr; i++) { if (header[j][0] != *(un32 *)svars[i].key) continue; d = LIL(header[j][1]); switch (svars[i].len) { case 1: *(byte *)svars[i].ptr = d; break; case 2: *(un16 *)svars[i].ptr = d; break; case 4: *(un32 *)svars[i].ptr = d; break; } break; } } /* obsolete as of version 0x104 */ if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127); if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi); if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal); if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam); if (wavofs) memcpy(snd.wave, buf+wavofs, sizeof snd.wave); else memcpy(snd.wave, ram.hi+0x30, 16); /* patch data from older files */ //fseek(f, iramblock<<12, SEEK_SET); memcpy(ram.ibank, bufptr, 4096 * irl); bufptr += 4096 * irl; //fseek(f, vramblock<<12, SEEK_SET); memcpy(lcd.vbank, bufptr, 4096 * vrl); bufptr += 4096 * vrl; //fseek(f, sramblock<<12, SEEK_SET); memcpy(ram.sbank, bufptr, 4096 * srl); bufptr += 4096 * srl; free(buf); }