Mercurial > repos > blastem
comparison segacd.c @ 2121:76ea19e8b1a9
Implement writes to cell image area in 1M mode. Fixes graphics in Stellar Fire
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 10 Mar 2022 21:25:16 -0800 |
parents | 91ed3c4cdfd9 |
children | bb478feccca2 |
comparison
equal
deleted
inserted
replaced
2120:91ed3c4cdfd9 | 2121:76ea19e8b1a9 |
---|---|
248 static void *unmapped_word_write8(uint32_t address, void *vcontext, uint8_t value) | 248 static void *unmapped_word_write8(uint32_t address, void *vcontext, uint8_t value) |
249 { | 249 { |
250 return vcontext; | 250 return vcontext; |
251 } | 251 } |
252 | 252 |
253 static uint16_t cell_image_read16(uint32_t address, void *vcontext) | 253 static uint32_t cell_image_translate_address(uint32_t address) |
254 { | 254 { |
255 uint32_t word_of_cell = address & 2; | 255 uint32_t word_of_cell = address & 2; |
256 if (address < 0x10000) { | 256 if (address < 0x10000) { |
257 //64x32 cell view | 257 //64x32 cell view |
258 uint32_t line_of_column = address & 0x3FC; | 258 uint32_t line_of_column = address & 0x3FC; |
273 uint32_t line_of_column = address & 0x007C; | 273 uint32_t line_of_column = address & 0x007C; |
274 uint32_t column = address & 0x1F80; | 274 uint32_t column = address & 0x1F80; |
275 address &= 0x1E000; | 275 address &= 0x1E000; |
276 address |= (line_of_column << 6) | (column >> 5) | word_of_cell; | 276 address |= (line_of_column << 6) | (column >> 5) | word_of_cell; |
277 } | 277 } |
278 return address; | |
279 } | |
280 | |
281 static uint16_t cell_image_read16(uint32_t address, void *vcontext) | |
282 { | |
283 address = cell_image_translate_address(address); | |
278 m68k_context *m68k = vcontext; | 284 m68k_context *m68k = vcontext; |
279 genesis_context *gen = m68k->system; | 285 genesis_context *gen = m68k->system; |
280 segacd_context *cd = gen->expansion; | 286 segacd_context *cd = gen->expansion; |
281 if (!m68k->mem_pointers[cd->memptr_start_index + 1]) { | 287 if (!m68k->mem_pointers[cd->memptr_start_index + 1]) { |
282 return 0xFFFF; | 288 return 0xFFFF; |
293 return word >> 8; | 299 return word >> 8; |
294 } | 300 } |
295 | 301 |
296 static void *cell_image_write16(uint32_t address, void *vcontext, uint16_t value) | 302 static void *cell_image_write16(uint32_t address, void *vcontext, uint16_t value) |
297 { | 303 { |
304 address = cell_image_translate_address(address); | |
305 m68k_context *m68k = vcontext; | |
306 genesis_context *gen = m68k->system; | |
307 segacd_context *cd = gen->expansion; | |
308 if (m68k->mem_pointers[cd->memptr_start_index + 1]) { | |
309 m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] = value; | |
310 } | |
298 return vcontext; | 311 return vcontext; |
299 } | 312 } |
300 | 313 |
301 static void *cell_image_write8(uint32_t address, void *vcontext, uint8_t value) | 314 static void *cell_image_write8(uint32_t address, void *vcontext, uint8_t value) |
302 { | 315 { |
316 uint32_t byte = address & 1; | |
317 address = cell_image_translate_address(address); | |
318 m68k_context *m68k = vcontext; | |
319 genesis_context *gen = m68k->system; | |
320 segacd_context *cd = gen->expansion; | |
321 if (m68k->mem_pointers[cd->memptr_start_index + 1]) { | |
322 if (byte) { | |
323 m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] &= 0xFF00; | |
324 m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] |= value; | |
325 } else { | |
326 m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] &= 0x00FF; | |
327 m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] |= value << 8; | |
328 } | |
329 } | |
303 return vcontext; | 330 return vcontext; |
304 } | 331 } |
305 | 332 |
306 static uint8_t pcm_read8(uint32_t address, void *vcontext) | 333 static uint8_t pcm_read8(uint32_t address, void *vcontext) |
307 { | 334 { |