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;
 }