changeset 1162:c4ea535cf57e

Forgot that the expansion to 32-bit values for 16-bit addresses is not done when calling a C function to handle a memory operation. Mask on location in mapper_write was needed afterall
author Michael Pavone <pavone@retrodev.com>
date Sun, 08 Jan 2017 16:55:30 -0800
parents c2210d586950
children b251899f2b97
files sms.c
diffstat 1 files changed, 5 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/sms.c	Sun Jan 08 13:39:44 2017 -0800
+++ b/sms.c	Sun Jan 08 16:55:30 2017 -0800
@@ -113,8 +113,8 @@
 	z80_context *z80 = vcontext;
 	sms_context *sms = z80->system;
 	void *old_value;
-	sms->ram[location & (sizeof(sms->ram)-1)] = value;
 	location &= 3;
+	sms->ram[0x1FFC + location] = value;
 	sms->bank_regs[location] = value;
 	if (location) {
 		uint32_t idx = location - 1;
@@ -288,7 +288,7 @@
 		memory_map[2] = (memmap_chunk){0x4000, 0x8000,  0x3FFF,             0, 1, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL,     NULL, NULL, NULL, NULL};
 		memory_map[3] = (memmap_chunk){0x8000, 0xC000,  0x3FFF,             0, 2, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL,     NULL, NULL, NULL, cart_ram_write};
 		memory_map[4] = (memmap_chunk){0xC000, 0xFFFC,  sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE,   sms->ram, NULL, NULL, NULL, NULL};
-		memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0xFFFF,             0, 0, MMAP_READ,                        ram_reg_overlap, NULL, NULL, NULL, mapper_write};
+		memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0x0003,             0, 0, MMAP_READ,                        ram_reg_overlap, NULL, NULL, NULL, mapper_write};
 	} else {
 		info_out->map_chunks = 2;
 		memory_map[0] = (memmap_chunk){0x0000, 0xC000,  rom_size-1,         0, 0, MMAP_READ,                      rom,      NULL, NULL, NULL, NULL};
@@ -308,6 +308,9 @@
 		sms->z80->mem_pointers[0] = sms->rom;
 		sms->z80->mem_pointers[1] = sms->rom + 0x4000;
 		sms->z80->mem_pointers[2] = sms->rom + 0x8000;
+		sms->bank_regs[1] = 0;
+		sms->bank_regs[2] = 0x4000 >> 14;
+		sms->bank_regs[3] = 0x8000 >> 14;
 	}
 	
 	char * lowpass_cutoff_str = tern_find_path(config, "audio\0lowpass_cutoff\0").ptrval;