Mercurial > repos > blastem
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; |