# HG changeset patch # User Michael Pavone # Date 1693886067 25200 # Node ID b9cd3c64652d0c5216c4593380a841a24fc0e46c # Parent 8990c2f431b10175734cbdc26b125e383ef5c6b3 Slightly more correct implementation of MED extended Sega mapper so s2built debug build doesn't hang diff -r 8990c2f431b1 -r b9cd3c64652d romdb.c --- 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) { diff -r 8990c2f431b1 -r b9cd3c64652d sega_mapper.c --- 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); diff -r 8990c2f431b1 -r b9cd3c64652d sega_mapper.h --- 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);