comparison segacd.c @ 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 372625dd9590
children ca6fc8c8dc60
comparison
equal deleted inserted replaced
2086:973a39d93d7b 2087:3e0801280bef
240 return vcontext; 240 return vcontext;
241 } 241 }
242 242
243 static uint16_t cell_image_read16(uint32_t address, void *vcontext) 243 static uint16_t cell_image_read16(uint32_t address, void *vcontext)
244 { 244 {
245 return 0xFFFF; 245 uint32_t word_of_cell = address & 2;
246 if (address < 0x10000) {
247 //64x32 cell view
248 uint32_t line_of_column = address & 0x3FC;
249 uint32_t column = address & 0xFC00;
250 address = (line_of_column << 6) | (column >> 8) | word_of_cell;
251 } else if (address < 0x18000) {
252 //64x16 cell view
253 uint32_t line_of_column = address & 0x1FC;
254 uint32_t column = address & 0x7E00;
255 address = 0x10000 | (line_of_column << 6) | (column >> 7) | word_of_cell;
256 } else if (address < 0x1C000) {
257 //64x8 cell view
258 uint32_t line_of_column = address & 0x00FC;
259 uint32_t column = address & 0x3F00;
260 address = 0x18000 | (line_of_column << 6) | (column >> 6) | word_of_cell;
261 } else {
262 //64x4 cell view
263 uint32_t line_of_column = address & 0x007C;
264 uint32_t column = address & 0x1F80;
265 address &= 0x1E000;
266 address |= (line_of_column << 6) | (column >> 5) | word_of_cell;
267 }
268 m68k_context *m68k = vcontext;
269 genesis_context *gen = m68k->system;
270 segacd_context *cd = gen->expansion;
271 return m68k->mem_pointers[cd->memptr_start_index + 1][address>>1];
246 } 272 }
247 273
248 static uint8_t cell_image_read8(uint32_t address, void *vcontext) 274 static uint8_t cell_image_read8(uint32_t address, void *vcontext)
249 { 275 {
250 return 0xFF; 276 uint16_t word = cell_image_read16(address & 0xFFFFFE, vcontext);
277 if (address & 1) {
278 return word;
279 }
280 return word >> 8;
251 } 281 }
252 282
253 static void *cell_image_write16(uint32_t address, void *vcontext, uint16_t value) 283 static void *cell_image_write16(uint32_t address, void *vcontext, uint16_t value)
254 { 284 {
255 return vcontext; 285 return vcontext;