Mercurial > repos > blastem
comparison segacd.c @ 2099:b92c998c6742
Add some missing null checks in the Sega CD code dealing with word RAM switching
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 09 Feb 2022 00:47:20 -0800 |
parents | ca6fc8c8dc60 |
children | ff32a90260c9 |
comparison
equal
deleted
inserted
replaced
2098:da326c32ad8f | 2099:b92c998c6742 |
---|---|
125 static uint16_t word_ram_2M_read16(uint32_t address, void *vcontext) | 125 static uint16_t word_ram_2M_read16(uint32_t address, void *vcontext) |
126 { | 126 { |
127 m68k_context *m68k = vcontext; | 127 m68k_context *m68k = vcontext; |
128 //TODO: fixme for interleaving | 128 //TODO: fixme for interleaving |
129 uint16_t* bank = m68k->mem_pointers[1]; | 129 uint16_t* bank = m68k->mem_pointers[1]; |
130 if (!bank) { | |
131 return 0xFFFF; | |
132 } | |
130 uint16_t raw = bank[address >> 2]; | 133 uint16_t raw = bank[address >> 2]; |
131 if (address & 2) { | 134 if (address & 2) { |
132 return (raw & 0xF) | (raw << 4 & 0xF00); | 135 return (raw & 0xF) | (raw << 4 & 0xF00); |
133 } else { | 136 } else { |
134 return (raw >> 4 & 0xF00) | (raw >> 8 & 0xF); | 137 return (raw >> 4 & 0xF00) | (raw >> 8 & 0xF); |
162 if (old) { | 165 if (old) { |
163 return vcontext; | 166 return vcontext; |
164 } | 167 } |
165 } | 168 } |
166 uint16_t* bank = m68k->mem_pointers[1]; | 169 uint16_t* bank = m68k->mem_pointers[1]; |
170 if (!bank) { | |
171 return vcontext; | |
172 } | |
167 uint16_t raw = bank[address >> 2]; | 173 uint16_t raw = bank[address >> 2]; |
168 uint16_t shift = ((address & 3) * 4); | 174 uint16_t shift = ((address & 3) * 4); |
169 raw &= ~(0xF000 >> shift); | 175 raw &= ~(0xF000 >> shift); |
170 raw |= value << (12 - shift); | 176 raw |= value << (12 - shift); |
171 bank[address >> 2] = raw; | 177 bank[address >> 2] = raw; |
266 address |= (line_of_column << 6) | (column >> 5) | word_of_cell; | 272 address |= (line_of_column << 6) | (column >> 5) | word_of_cell; |
267 } | 273 } |
268 m68k_context *m68k = vcontext; | 274 m68k_context *m68k = vcontext; |
269 genesis_context *gen = m68k->system; | 275 genesis_context *gen = m68k->system; |
270 segacd_context *cd = gen->expansion; | 276 segacd_context *cd = gen->expansion; |
277 if (!m68k->mem_pointers[cd->memptr_start_index + 1]) { | |
278 return 0xFFFF; | |
279 } | |
271 return m68k->mem_pointers[cd->memptr_start_index + 1][address>>1]; | 280 return m68k->mem_pointers[cd->memptr_start_index + 1][address>>1]; |
272 } | 281 } |
273 | 282 |
274 static uint8_t cell_image_read8(uint32_t address, void *vcontext) | 283 static uint8_t cell_image_read8(uint32_t address, void *vcontext) |
275 { | 284 { |