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