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 {