changeset 2087:3e0801280bef

Implement bitmap to cell mapping feature of 1M mode
author Michael Pavone <pavone@retrodev.com>
date Sat, 05 Feb 2022 23:30:06 -0800
parents 973a39d93d7b
children c716af3f8980
files segacd.c
diffstat 1 files changed, 32 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/segacd.c	Sat Feb 05 16:41:01 2022 -0800
+++ b/segacd.c	Sat Feb 05 23:30:06 2022 -0800
@@ -242,12 +242,42 @@
 
 static uint16_t cell_image_read16(uint32_t address, void *vcontext)
 {
-	return 0xFFFF;
+	uint32_t word_of_cell = address & 2;
+	if (address < 0x10000) {
+		//64x32 cell view
+		uint32_t line_of_column = address & 0x3FC;
+		uint32_t column = address & 0xFC00;
+		address = (line_of_column << 6) | (column >> 8) | word_of_cell;
+	} else if (address < 0x18000) {
+		//64x16 cell view
+		uint32_t line_of_column = address & 0x1FC;
+		uint32_t column = address & 0x7E00;
+		address = 0x10000 | (line_of_column << 6) | (column >> 7) | word_of_cell;
+	} else if (address < 0x1C000) {
+		//64x8 cell view
+		uint32_t line_of_column = address & 0x00FC;
+		uint32_t column = address & 0x3F00;
+		address = 0x18000 | (line_of_column << 6) | (column >> 6) | word_of_cell;
+	} else {
+		//64x4 cell view
+		uint32_t line_of_column = address & 0x007C;
+		uint32_t column = address & 0x1F80;
+		address &= 0x1E000;
+		address |= (line_of_column << 6) | (column >> 5) | word_of_cell;
+	}
+	m68k_context *m68k = vcontext;
+	genesis_context *gen = m68k->system;
+	segacd_context *cd = gen->expansion;
+	return m68k->mem_pointers[cd->memptr_start_index + 1][address>>1];
 }
 
 static uint8_t cell_image_read8(uint32_t address, void *vcontext)
 {
-	return 0xFF;
+	uint16_t word = cell_image_read16(address & 0xFFFFFE, vcontext);
+	if (address & 1) {
+		return word;
+	}
+	return word >> 8;
 }
 
 static void *cell_image_write16(uint32_t address, void *vcontext, uint16_t value)