diff sms.c @ 2134:9caebcfeac72

Implement word RAM interleaving in 1M mode, now passes mcd-verificator word RAM tests
author Michael Pavone <pavone@retrodev.com>
date Fri, 18 Mar 2022 20:49:07 -0700
parents 81df9aa2de9b
children 9a8dd4ba2753
line wrap: on
line diff
--- a/sms.c	Thu Mar 17 22:41:42 2022 -0700
+++ b/sms.c	Fri Mar 18 20:49:07 2022 -0700
@@ -196,10 +196,10 @@
 }
 
 static memmap_chunk io_map[] = {
-	{0x00, 0x40, 0xFF, 0, 0, 0, NULL, NULL, NULL, NULL,     memory_io_write},
-	{0x40, 0x80, 0xFF, 0, 0, 0, NULL, NULL, NULL, hv_read,  sms_psg_write},
-	{0x80, 0xC0, 0xFF, 0, 0, 0, NULL, NULL, NULL, vdp_read, vdp_write},
-	{0xC0, 0x100,0xFF, 0, 0, 0, NULL, NULL, NULL, io_read,  NULL}
+	{0x00, 0x40, 0xFF, .write_8 = memory_io_write},
+	{0x40, 0x80, 0xFF, .read_8 = hv_read, .write_8 = sms_psg_write},
+	{0x80, 0xC0, 0xFF, .read_8 = vdp_read, .write_8 = vdp_write},
+	{0xC0, 0x100,0xFF, .read_8 = io_read}
 };
 
 static void set_speed_percent(system_header * system, uint32_t percent)
@@ -216,33 +216,33 @@
 	start_section(buf, SECTION_Z80);
 	z80_serialize(sms->z80, buf);
 	end_section(buf);
-	
+
 	start_section(buf, SECTION_VDP);
 	vdp_serialize(sms->vdp, buf);
 	end_section(buf);
-	
+
 	start_section(buf, SECTION_PSG);
 	psg_serialize(sms->psg, buf);
 	end_section(buf);
-	
+
 	start_section(buf, SECTION_SEGA_IO_1);
 	io_serialize(sms->io.ports, buf);
 	end_section(buf);
-	
+
 	start_section(buf, SECTION_SEGA_IO_2);
 	io_serialize(sms->io.ports + 1, buf);
 	end_section(buf);
-	
+
 	start_section(buf, SECTION_MAIN_RAM);
 	save_int8(buf, sizeof(sms->ram) / 1024);
 	save_buffer8(buf, sms->ram, sizeof(sms->ram));
 	end_section(buf);
-	
+
 	start_section(buf, SECTION_MAPPER);
 	save_int8(buf, 1);//mapper type, 1 for Sega mapper
 	save_buffer8(buf, sms->bank_regs, sizeof(sms->bank_regs));
 	end_section(buf);
-	
+
 	start_section(buf, SECTION_CART_RAM);
 	save_int8(buf, SMS_CART_RAM_SIZE / 1024);
 	save_buffer8(buf, sms->cart_ram, SMS_CART_RAM_SIZE);
@@ -364,7 +364,7 @@
 			system->delayed_load_slot = slot + 1;
 		}
 		goto done;
-		
+
 	}
 #endif
 	ret = load_state_path(sms, statepath);
@@ -384,7 +384,7 @@
 		if (system->delayed_load_slot) {
 			load_state(system, system->delayed_load_slot - 1);
 			system->delayed_load_slot = 0;
-			
+
 		}
 		if (system->enter_debugger && sms->z80->pc) {
 			system->enter_debugger = 0;
@@ -407,7 +407,7 @@
 		target_cycle = sms->z80->Z80_CYCLE;
 		vdp_run_context(sms->vdp, target_cycle);
 		psg_run(sms->psg, target_cycle);
-		
+
 		if (system->save_state) {
 			while (!sms->z80->pc) {
 				//advance Z80 to an instruction boundary
@@ -416,7 +416,7 @@
 			save_state(sms, system->save_state - 1);
 			system->save_state = 0;
 		}
-		
+
 		target_cycle += 3420*16;
 		if (target_cycle > 0x10000000) {
 			uint32_t adjust = sms->z80->Z80_CYCLE - 3420*262*2;
@@ -451,19 +451,19 @@
 static void start_sms(system_header *system, char *statefile)
 {
 	sms_context *sms = (sms_context *)system;
-	
+
 	z80_assert_reset(sms->z80, 0);
 	z80_clear_reset(sms->z80, 128*15);
-	
+
 	if (statefile) {
 		load_state_path(sms, statefile);
 	}
-	
+
 	if (system->enter_debugger) {
 		system->enter_debugger = 0;
 		zinsert_breakpoint(sms->z80, sms->z80->pc, (uint8_t *)zdebugger);
 	}
-	
+
 	run_sms(system);
 }
 
@@ -592,16 +592,16 @@
 	if (media->size > 0xC000)  {
 		sms->header.info.map_chunks = 6;
 		uint8_t *ram_reg_overlap = sms->ram + sizeof(sms->ram) - 4;
-		memory_map[0] = (memmap_chunk){0x0000, 0x0400,  0xFFFF,             0, 0, MMAP_READ,                        media->buffer, NULL, NULL, NULL, NULL};
-		memory_map[1] = (memmap_chunk){0x0400, 0x4000,  0xFFFF,             0, 0, MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, NULL,     NULL, NULL, NULL, NULL};
-		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, 0x0003,             0, 0, MMAP_READ,                        ram_reg_overlap, NULL, NULL, NULL, mapper_write};
+		memory_map[0] = (memmap_chunk){0x0000, 0x0400,  0xFFFF, .flags = MMAP_READ, .buffer = media->buffer};
+		memory_map[1] = (memmap_chunk){0x0400, 0x4000,  0xFFFF, .ptr_index = 0, .flags = MMAP_READ|MMAP_PTR_IDX|MMAP_CODE};
+		memory_map[2] = (memmap_chunk){0x4000, 0x8000,  0x3FFF, .ptr_index = 1, .flags = MMAP_READ|MMAP_PTR_IDX|MMAP_CODE};
+		memory_map[3] = (memmap_chunk){0x8000, 0xC000,  0x3FFF, .ptr_index = 2, .flags = MMAP_READ|MMAP_PTR_IDX|MMAP_CODE, .write_8 = cart_ram_write};
+		memory_map[4] = (memmap_chunk){0xC000, 0xFFFC,  sizeof(sms->ram)-1, .ptr_index = 0, .flags = MMAP_READ|MMAP_WRITE|MMAP_CODE, .buffer = sms->ram};
+		memory_map[5] = (memmap_chunk){0xFFFC, 0x10000, 0x0003, .ptr_index = 0, .flags = MMAP_READ, .buffer = ram_reg_overlap, .write_8 = mapper_write};
 	} else {
 		sms->header.info.map_chunks = 2;
-		memory_map[0] = (memmap_chunk){0x0000, 0xC000,  rom_size-1,         0, 0, MMAP_READ,                      media->buffer,  NULL, NULL, NULL, NULL};
-		memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, MMAP_READ|MMAP_WRITE|MMAP_CODE, sms->ram, NULL, NULL, NULL, NULL};
+		memory_map[0] = (memmap_chunk){0x0000, 0xC000,  rom_size-1,         0, 0, .flags = MMAP_READ, .buffer = media->buffer};
+		memory_map[1] = (memmap_chunk){0xC000, 0x10000, sizeof(sms->ram)-1, 0, 0, .flags = MMAP_READ|MMAP_WRITE|MMAP_CODE, .buffer = sms->ram};
 	};
 	sms->header.info.map = malloc(sizeof(memmap_chunk) * sms->header.info.map_chunks);
 	memcpy(sms->header.info.map, memory_map, sizeof(memmap_chunk) * sms->header.info.map_chunks);
@@ -610,7 +610,7 @@
 	sms->z80 = init_z80_context(zopts);
 	sms->z80->system = sms;
 	sms->z80->Z80_OPTS->gen.debug_cmd_handler = debug_commands;
-	
+
 	sms->rom = media->buffer;
 	sms->rom_size = rom_size;
 	if (sms->header.info.map_chunks > 2) {
@@ -621,24 +621,24 @@
 		sms->bank_regs[2] = 0x4000 >> 14;
 		sms->bank_regs[3] = 0x8000 >> 14;
 	}
-	
+
 	//TODO: Detect region and pick master clock based off of that
 	sms->normal_clock = sms->master_clock = 53693175;
-	
+
 	sms->psg = malloc(sizeof(psg_context));
 	psg_init(sms->psg, sms->master_clock, 15*16);
-	
+
 	set_gain_config(sms);
-	
+
 	sms->vdp = init_vdp_context(0, 0);
 	sms->vdp->system = &sms->header;
-	
+
 	sms->header.info.save_type = SAVE_NONE;
 	sms->header.info.name = strdup(media->name);
-	
+
 	setup_io_devices(config, &sms->header.info, &sms->io);
 	sms->header.has_keyboard = io_has_keyboard(&sms->io);
-	
+
 	sms->header.set_speed_percent = set_speed_percent;
 	sms->header.start_context = start_sms;
 	sms->header.resume_context = resume_sms;
@@ -662,6 +662,6 @@
 	sms->header.serialize = serialize;
 	sms->header.deserialize = deserialize;
 	sms->header.type = SYSTEM_SMS;
-	
+
 	return sms;
-}
\ No newline at end of file
+}