shithub: sms

Download patch

ref: e8cac1e4c4a0005abbb15ecc7324e2751822386f
parent: 7994035e34128acee2c2b16abcb2f9d1b69ed29c
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Mon Jan 12 07:30:50 EST 2026

Make WonderBoy III boot

--- a/dat.h
+++ b/dat.h
@@ -7,8 +7,12 @@
 
 extern u16int ram[32768];
 extern u8int *prg;
-extern u8int rom[0x40000];
+extern u8int *rom;
 extern u8int *mem;
+extern int nbank;
+extern int slotaddr[3];
+extern u16int ram_bank;
+extern u8int ram_enabled;
 
 extern u8int vram[32768], vsram[40];
 extern u8int cram[64];
--- a/fns.h
+++ b/fns.h
@@ -20,3 +20,4 @@
 void psginit(const u16int, const int);
 void psgwrite(const u8int);
 u16int psgstep();
+void mapperinit(void);
--- a/mem.c
+++ b/mem.c
@@ -24,7 +24,7 @@
 u8int ram_enabled = 0;
 
 int slotaddr[3] = {0, 0, 0};
-int nbank = 16;
+int nbank = 1;
 
 void
 cramwrite(u16int a, u8int v)
@@ -41,6 +41,16 @@
 	// for(int i=0;i<64;i++)
 	// 	printf("%x ", cram[i]);
 	// printf("\n");
+}
+
+void
+mapperinit(void)
+{
+	slotaddr[0] = 0;
+	slotaddr[1] = 0x4000;
+	slotaddr[2] = (nbank - 1) * 0x4000;
+	ram_bank = 0;
+	ram_enabled = 0;
 }
 
 u8int
--- a/sms.c
+++ b/sms.c
@@ -11,7 +11,7 @@
 u32int r[16];
 extern u16int pc, curpc, sp;
 u32int irq;
-u8int rom[0x40000];
+u8int *rom = nil;
 u8int *mem = nil;
 int vdpclock = 0;
 int psgclock = 0;
@@ -20,15 +20,33 @@
 loadrom(char *file)
 {
 	int fd;
+	long n;
+	vlong sz;
+	ulong alloc;
 
 	fd = open(file, OREAD);
 	if(fd < 0)
 		sysfatal("open: %r");
 
-	if(readn(fd, rom, 0x40000) < 0x40000)
+	sz = seek(fd, 0, 2);
+	if(sz <= 0 || sz > 4*1024*1024)
+		sysfatal("invalid file size");
+	seek(fd, 0, 0);
+
+	alloc = (sz + 0x3fff) & ~0x3fff;
+	rom = mallocz(alloc, 1);
+	if(rom == nil)
+		sysfatal("mallocz: %r");
+
+	n = readn(fd, rom, sz);
+	if(n < sz)
 		sysfatal("read: %r");
-	mem = malloc(0xC000+0x8000);
-	memcpy(mem, rom, 0xC000);
+
+	nbank = alloc / 0x4000;
+	mem = mallocz(0xC000+0x8000, 1);
+	if(mem == nil)
+		sysfatal("mallocz: %r");
+	mapperinit();
 	pc = 0;
 
 	close(fd);
--