# HG changeset patch # User Michael Pavone # Date 1646976316 28800 # Node ID 76ea19e8b1a9eee0a4e9c6737d096a08c6c69098 # Parent 91ed3c4cdfd9b7d768ca4456bce6c74e48bb5208 Implement writes to cell image area in 1M mode. Fixes graphics in Stellar Fire diff -r 91ed3c4cdfd9 -r 76ea19e8b1a9 segacd.c --- a/segacd.c Thu Mar 10 20:45:50 2022 -0800 +++ b/segacd.c Thu Mar 10 21:25:16 2022 -0800 @@ -250,7 +250,7 @@ return vcontext; } -static uint16_t cell_image_read16(uint32_t address, void *vcontext) +static uint32_t cell_image_translate_address(uint32_t address) { uint32_t word_of_cell = address & 2; if (address < 0x10000) { @@ -275,6 +275,12 @@ address &= 0x1E000; address |= (line_of_column << 6) | (column >> 5) | word_of_cell; } + return address; +} + +static uint16_t cell_image_read16(uint32_t address, void *vcontext) +{ + address = cell_image_translate_address(address); m68k_context *m68k = vcontext; genesis_context *gen = m68k->system; segacd_context *cd = gen->expansion; @@ -295,11 +301,32 @@ static void *cell_image_write16(uint32_t address, void *vcontext, uint16_t value) { + address = cell_image_translate_address(address); + m68k_context *m68k = vcontext; + genesis_context *gen = m68k->system; + segacd_context *cd = gen->expansion; + if (m68k->mem_pointers[cd->memptr_start_index + 1]) { + m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] = value; + } return vcontext; } static void *cell_image_write8(uint32_t address, void *vcontext, uint8_t value) { + uint32_t byte = address & 1; + address = cell_image_translate_address(address); + m68k_context *m68k = vcontext; + genesis_context *gen = m68k->system; + segacd_context *cd = gen->expansion; + if (m68k->mem_pointers[cd->memptr_start_index + 1]) { + if (byte) { + m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] &= 0xFF00; + m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] |= value; + } else { + m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] &= 0x00FF; + m68k->mem_pointers[cd->memptr_start_index + 1][address>>1] |= value << 8; + } + } return vcontext; }