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