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 {