ref: 88d446bf347bae4eb1dd8746b62d2c3102c92288
parent: ccef7a8bdca9d58397ab9ebe6af7ccf29edd6dad
author: Jacob Moody <moody@posixcafe.org>
date: Thu Mar 12 11:28:23 EDT 2026
games/gb: store sram in save state as well Some games (notably Polished Crystal rom hack) use parts of sram as extended wram.
--- a/sys/src/games/gb/state.c
+++ b/sys/src/games/gb/state.c
@@ -8,6 +8,8 @@
extern Var cpuvars[], ppuvars[], memvars[], apuvars[], evvars[];
extern Event *events[NEVENT], *elist;
+extern u8int *back;
+extern int nback;
static Biobuf *bp;
Var apuvars[] = {{nil, 0, 0}};@@ -128,6 +130,8 @@
void
savestate(char *file)
{+ u16int nsram;
+
flushback();
bp = Bopen(file, OWRITE);
if(bp == nil){@@ -141,6 +145,12 @@
putvars(evvars);
putevents();
mapper(SAVE, 0);
+
+ nsram = nback;
+ Bputc(bp, nsram);
+ Bputc(bp, nsram>>8);
+ if(nsram > 0)
+ Bwrite(bp, back, nback);
Bterm(bp);
}
@@ -147,6 +157,9 @@
void
loadstate(char *file)
{+ uchar buf[2];
+ u16int nsram;
+
bp = Bopen(file, OREAD);
if(bp == nil){ print("open: %r\n");@@ -159,6 +172,14 @@
getvars(evvars);
getevents();
mapper(RSTR, 0);
+ if(Bread(bp, buf, 2) == 2){+ nsram = buf[0] | (buf[1]<<8);
+ if(nback == nsram){+ if(Bread(bp, back, nback) != nback)
+ sysfatal("truncated sram in save state");+ } else
+ fprint(2, "sram count in save state (%ud) does match detected size from rom (%d)\n", nsram, nback);
+ }
memload();
Bterm(bp);
}
--
⑨