comparison sega_mapper.c @ 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 b6fdedd3b070
children 187bc857a76a
comparison
equal deleted inserted replaced
2339:8990c2f431b1 2340:b9cd3c64652d
202 } 202 }
203 203
204 m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value) 204 m68k_context * write_bank_reg_w(uint32_t address, m68k_context * context, uint16_t value)
205 { 205 {
206 genesis_context * gen = context->system; 206 genesis_context * gen = context->system;
207 if (gen->mapper_type == MAPPER_SEGA_MED_V2 && (address & 0xF0) < 0xF0) {
208 // ignore writes to other MED extended registers for now
209 return context;
210 }
207 address &= 0xE; 211 address &= 0xE;
208 address >>= 1; 212 address >>= 1;
209 if (!address) { 213 if (!address) {
210 if (gen->mapper_type == MAPPER_SEGA_MED_V2) { 214 if (gen->mapper_type == MAPPER_SEGA_MED_V2) {
211 if (!value & 0x8000) { 215 if (!value & 0x8000) {
254 258
255 m68k_context * write_bank_reg_b(uint32_t address, m68k_context * context, uint8_t value) 259 m68k_context * write_bank_reg_b(uint32_t address, m68k_context * context, uint8_t value)
256 { 260 {
257 genesis_context * gen = context->system; 261 genesis_context * gen = context->system;
258 if (gen->mapper_type == MAPPER_SEGA_MED_V2) { 262 if (gen->mapper_type == MAPPER_SEGA_MED_V2) {
259 address &= 0xF; 263 if ((address & 0xFF) == 0xF0) {
260 if (!address) { 264 write_bank_reg_w(address, context, value << 8 | gen->bank_regs[0]);
261 //not sure if this is correct, possible byte sized writes are always rejected to $A130F0
262 write_bank_reg_w(address, context, value << 8 | value);
263 } else if (address > 2 && (address & 1)) { 265 } else if (address > 2 && (address & 1)) {
264 write_bank_reg_w(address, context, value); 266 write_bank_reg_w(address, context, value);
265 } 267 }
266 } else if (address & 1) { 268 } else if (address & 1) {
267 write_bank_reg_w(address, context, value); 269 write_bank_reg_w(address, context, value);
268 } 270 }
269 return context; 271 return context;
272 }
273
274 uint16_t med_reg_read_w(uint32_t address, void *vcontext)
275 {
276 m68k_context *context = vcontext;
277 switch (address & 0xFE)
278 {
279 case 0xE4:
280 //ensure USB serial read returns "not-ready" status
281 return 0x02;
282 default:
283 return read_word(context->last_prefetch_address, (void **)context->mem_pointers, &context->options->gen, context);
284 }
285 }
286
287 uint8_t med_reg_read_b(uint32_t address, void *vcontext)
288 {
289 uint16_t value = med_reg_read_w(address, vcontext);
290 if (address & 1) {
291 return value;
292 }
293 return value >> 8;
270 } 294 }
271 295
272 void sega_mapper_serialize(genesis_context *gen, serialize_buffer *buf) 296 void sega_mapper_serialize(genesis_context *gen, serialize_buffer *buf)
273 { 297 {
274 save_buffer8(buf, gen->bank_regs, gen->mapper_type == MAPPER_SEGA_MED_V2 ? sizeof(gen->bank_regs) : sizeof(gen->bank_regs) - 1); 298 save_buffer8(buf, gen->bank_regs, gen->mapper_type == MAPPER_SEGA_MED_V2 ? sizeof(gen->bank_regs) : sizeof(gen->bank_regs) - 1);