git: 9front

Download patch

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);
 }
--