Mercurial > repos > blastem
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); |