Mercurial > repos > blastem
changeset 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 |
files | segacd.c |
diffstat | 1 files changed, 28 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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; }