Mercurial > repos > blastem
comparison backend_x86.c @ 1145:494234e7e88f
Fix RAM flag offset calculation to take into account the existence of non-writeable MMAP_CODE chunks
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 03 Jan 2017 21:18:42 -0800 |
parents | fe8c79f82c22 |
children | 5d41d0574863 |
comparison
equal
deleted
inserted
replaced
1144:be3df2d8530a | 1145:494234e7e88f |
---|---|
229 } | 229 } |
230 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { | 230 if (is_write && (memmap[chunk].flags & MMAP_CODE)) { |
231 mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size); | 231 mov_rr(code, opts->scratch2, opts->scratch1, opts->address_size); |
232 shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size); | 232 shr_ir(code, opts->ram_flags_shift, opts->scratch1, opts->address_size); |
233 bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size); | 233 bt_rrdisp(code, opts->scratch1, opts->context_reg, ram_flags_off, opts->address_size); |
234 if (memmap[chunk].mask == opts->address_mask) { | |
235 ram_flags_off += (memmap[chunk].end - memmap[chunk].start) / (1 << opts->ram_flags_shift) / 8; ; | |
236 } else { | |
237 ram_flags_off += (memmap[chunk].mask + 1) / (1 << opts->ram_flags_shift) / 8;; | |
238 } | |
239 code_ptr not_code = code->cur + 1; | 234 code_ptr not_code = code->cur + 1; |
240 jcc(code, CC_NC, code->cur + 2); | 235 jcc(code, CC_NC, code->cur + 2); |
241 if (memmap[chunk].mask != opts->address_mask) { | 236 if (memmap[chunk].mask != opts->address_mask) { |
242 or_ir(code, memmap[chunk].start, opts->scratch2, opts->address_size); | 237 or_ir(code, memmap[chunk].start, opts->scratch2, opts->address_size); |
243 } | 238 } |
265 if (!is_write) { | 260 if (!is_write) { |
266 mov_ir(code, size == SZ_B ? 0xFF : 0xFFFF, opts->scratch1, size); | 261 mov_ir(code, size == SZ_B ? 0xFF : 0xFFFF, opts->scratch1, size); |
267 } | 262 } |
268 retn(code); | 263 retn(code); |
269 } | 264 } |
265 if (memmap[chunk].flags & MMAP_CODE) { | |
266 if (memmap[chunk].mask == opts->address_mask) { | |
267 ram_flags_off += (memmap[chunk].end - memmap[chunk].start) / (1 << opts->ram_flags_shift) / 8; ; | |
268 } else { | |
269 ram_flags_off += (memmap[chunk].mask + 1) / (1 << opts->ram_flags_shift) / 8;; | |
270 } | |
271 } | |
270 if (lb_jcc) { | 272 if (lb_jcc) { |
271 *lb_jcc = code->cur - (lb_jcc+1); | 273 *lb_jcc = code->cur - (lb_jcc+1); |
272 lb_jcc = NULL; | 274 lb_jcc = NULL; |
273 } | 275 } |
274 if (ub_jcc) { | 276 if (ub_jcc) { |