changeset 2340:b9cd3c64652d

Slightly more correct implementation of MED extended Sega mapper so s2built debug build doesn't hang
author Michael Pavone <pavone@retrodev.com>
date Mon, 04 Sep 2023 20:54:27 -0700
parents 8990c2f431b1
children e81c6a44274c
files romdb.c sega_mapper.c sega_mapper.h
diffstat 3 files changed, 35 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/romdb.c	Sat Sep 02 12:08:43 2023 -0700
+++ b/romdb.c	Mon Sep 04 20:54:27 2023 -0700
@@ -340,6 +340,10 @@
 		info->map[8].mask = 0xFF;
 		info->map[8].write_16 = (write_16_fun)write_bank_reg_w;
 		info->map[8].write_8 = (write_8_fun)write_bank_reg_b;
+		if (is_med_ssf) {
+			info->map[8].read_16 = med_reg_read_w;
+			info->map[8].read_8 = med_reg_read_b;
+		}
 		return;
 	} else if(!memcmp("SEGA MEGAWIFI", rom + 0x100, strlen("SEGA MEGAWIFI"))) {
 		info->mapper_type = MAPPER_NONE;
@@ -719,7 +723,7 @@
 	memmap_chunk *map = state->info->map + state->index;
 	map->start = start;
 	map->end = end + 1;
-	
+
 	if (!strcmp(dtype, "ROM")) {
 		uint32_t expanded_size = nearest_pow2(state->rom_size);
 		if (offset >= expanded_size) {
--- a/sega_mapper.c	Sat Sep 02 12:08:43 2023 -0700
+++ b/sega_mapper.c	Mon Sep 04 20:54:27 2023 -0700
@@ -204,6 +204,10 @@
 m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value)
 {
 	genesis_context * gen = context->system;
+	if (gen->mapper_type == MAPPER_SEGA_MED_V2 && (address & 0xF0) < 0xF0) {
+		// ignore writes to other MED extended registers for now
+		return context;
+	}
 	address &= 0xE;
 	address >>= 1;
 	if (!address) {
@@ -256,10 +260,8 @@
 {
 	genesis_context * gen = context->system;
 	if (gen->mapper_type == MAPPER_SEGA_MED_V2) {
-		address &= 0xF;
-		if (!address) {
-			//not sure if this is correct, possible byte sized writes are always rejected to $A130F0
-			write_bank_reg_w(address, context, value << 8 | value);
+		if ((address & 0xFF) == 0xF0) {
+			write_bank_reg_w(address, context, value << 8 | gen->bank_regs[0]);
 		} else if (address > 2 && (address & 1)) {
 			write_bank_reg_w(address, context, value);
 		}
@@ -269,6 +271,28 @@
 	return context;
 }
 
+uint16_t med_reg_read_w(uint32_t address, void *vcontext)
+{
+	m68k_context *context = vcontext;
+	switch (address & 0xFE)
+	{
+	case 0xE4:
+		//ensure USB serial read returns "not-ready" status
+		return 0x02;
+	default:
+		return read_word(context->last_prefetch_address, (void **)context->mem_pointers, &context->options->gen, context);
+	}
+}
+
+uint8_t med_reg_read_b(uint32_t address, void *vcontext)
+{
+	uint16_t value = med_reg_read_w(address, vcontext);
+	if (address & 1) {
+		return value;
+	}
+	return value >> 8;
+}
+
 void sega_mapper_serialize(genesis_context *gen, serialize_buffer *buf)
 {
 	save_buffer8(buf, gen->bank_regs, gen->mapper_type == MAPPER_SEGA_MED_V2 ? sizeof(gen->bank_regs) : sizeof(gen->bank_regs) - 1);
--- a/sega_mapper.h	Sat Sep 02 12:08:43 2023 -0700
+++ b/sega_mapper.h	Mon Sep 04 20:54:27 2023 -0700
@@ -8,6 +8,8 @@
 m68k_context * write_sram_area_b(uint32_t address, m68k_context * context, uint8_t value);
 m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value);
 m68k_context * write_bank_reg_b(uint32_t address, m68k_context * context, uint8_t value);
+uint16_t med_reg_read_w(uint32_t address, void *vcontext);
+uint8_t med_reg_read_b(uint32_t address, void *vcontext);
 void* write_med_ram0_w(uint32_t address, void *vcontext, uint16_t value);
 void* write_med_ram1_w(uint32_t address, void *vcontext, uint16_t value);
 void* write_med_ram2_w(uint32_t address, void *vcontext, uint16_t value);