shithub: sms

Download patch

ref: fcd896071ef85285b0a6dfcae57f927532d90337
parent: 3b1ba59b9954ce1e01fc314661082a7f9267f881
author: Jean-André Santoni <jean.andre.santoni@gmail.com>
date: Thu Jul 4 11:32:08 EDT 2024

Fix sega mapper bank switching and rom and mem mirror

--- a/mem.c
+++ b/mem.c
@@ -23,6 +23,7 @@
 uint16_t z80bank;
 
 int slotaddr[3] = {0, 0, 0};
+int nbank = 16;
 
 uint8_t
 z80read(uint16_t a)
@@ -35,10 +36,11 @@
 	else if (a < 0x4000)
 		return rom[a + slotaddr[0]];
 	else if (a < 0x8000)
-		return rom[a - 0x4000 + slotaddr[1]];
+		return rom[(a - 0x4000) + slotaddr[1]];
 	else if (a < 0xC000){
-		printf("== page 2 %x\n", a - 0x8000 + slotaddr[2]);
-		return rom[a - 0x8000 + slotaddr[2]];
+		printf("== page 2 %x %x %x\n", a, (a - 0x8000) + slotaddr[2], slotaddr[2]);
+		printf("== rom[(a - 0x8000) + slotaddr[2]] %x\n", rom[(a - 0x8000) + slotaddr[2]]);
+		return rom[(a - 0x8000) + slotaddr[2]];
 	}else
 		return mem[a];
 }
@@ -66,16 +68,16 @@
                 printf("Persistent RAM");
                 break;
             case 0xFFFD:
-                printf("Switch mapper slot 0 to %d\n", v);
-				slotaddr[0] = v * 0x4000;
+                printf("Switch mapper slot 0 to %d\n", (v & nbank-1));
+                slotaddr[0] = (v & nbank-1) * 0x4000;
                 break;
             case 0xFFFE:
-                printf("Switch mapper slot 1 to %d\n", v);
-				slotaddr[1] = v * 0x4000;
+                printf("Switch mapper slot 1 to %d\n", (v & nbank-1));
+                slotaddr[1] = (v & nbank-1) * 0x4000;
                 break;
             case 0xFFFF:
-                printf("Switch mapper slot 2 to %d\n", v);
-				slotaddr[2] = v * 0x4000;
+                printf("Switch mapper slot 2 to %d\n", (v & nbank-1));
+                slotaddr[2] = (v & nbank-1) * 0x4000;
                 break;
 		}
 	}
--- a/sms.c
+++ b/sms.c
@@ -30,8 +30,8 @@
 	// memcpy(header, data, sizeof(header));
 	// prg = malloc(0xC000);
 	// memcpy(prg, data+sizeof(header), 0xC000);
-	rom = malloc(0xC000);
-	memcpy(rom, data, 0xC000);
+	rom = malloc(0x40000);
+	memcpy(rom, data, 0x40000);
 	mem = malloc(0xC000+0x8000);
 	memcpy(mem, rom, 0xC000);
 	spc = 0;
--