Mercurial > repos > blastem
comparison backend.c @ 2036:45c4b74e7676
Fix bug in handling of MMAP_CODE regions smaller than 16KB
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 07 Mar 2021 22:43:51 -0800 |
parents | 9d35ce5012a6 |
children | 638eb2d25696 0013362c320c |
comparison
equal
deleted
inserted
replaced
2035:33f454232aee | 2036:45c4b74e7676 |
---|---|
54 memmap_chunk const *find_map_chunk(uint32_t address, cpu_options *opts, uint16_t flags, uint32_t *size_sum) | 54 memmap_chunk const *find_map_chunk(uint32_t address, cpu_options *opts, uint16_t flags, uint32_t *size_sum) |
55 { | 55 { |
56 if (size_sum) { | 56 if (size_sum) { |
57 *size_sum = 0; | 57 *size_sum = 0; |
58 } | 58 } |
59 uint32_t minsize; | |
60 if (flags == MMAP_CODE) { | |
61 minsize = 1 << (opts->ram_flags_shift + 3); | |
62 } else { | |
63 minsize = 0; | |
64 } | |
59 address &= opts->address_mask; | 65 address &= opts->address_mask; |
60 for (memmap_chunk const *cur = opts->memmap, *end = opts->memmap + opts->memmap_chunks; cur != end; cur++) | 66 for (memmap_chunk const *cur = opts->memmap, *end = opts->memmap + opts->memmap_chunks; cur != end; cur++) |
61 { | 67 { |
62 if (address >= cur->start && address < cur->end) { | 68 if (address >= cur->start && address < cur->end) { |
63 return cur; | 69 return cur; |
64 } else if (size_sum && (cur->flags & flags) == flags) { | 70 } else if (size_sum && (cur->flags & flags) == flags) { |
65 *size_sum += chunk_size(opts, cur); | 71 uint32_t size = chunk_size(opts, cur); |
72 if (size < minsize) { | |
73 size = minsize; | |
74 } | |
75 *size_sum += size; | |
66 } | 76 } |
67 } | 77 } |
68 return NULL; | 78 return NULL; |
69 } | 79 } |
70 | 80 |
267 } | 277 } |
268 | 278 |
269 uint32_t ram_size(cpu_options *opts) | 279 uint32_t ram_size(cpu_options *opts) |
270 { | 280 { |
271 uint32_t size = 0; | 281 uint32_t size = 0; |
282 uint32_t minsize = 1 << (opts->ram_flags_shift + 3); | |
272 for (int i = 0; i < opts->memmap_chunks; i++) | 283 for (int i = 0; i < opts->memmap_chunks; i++) |
273 { | 284 { |
274 if (opts->memmap[i].flags & MMAP_CODE) { | 285 if (opts->memmap[i].flags & MMAP_CODE) { |
275 if (opts->memmap[i].mask == opts->address_mask) { | 286 uint32_t cursize = chunk_size(opts, opts->memmap + i); |
276 size += opts->memmap[i].end - opts->memmap[i].start; | 287 if (cursize < minsize) { |
288 size += minsize; | |
277 } else { | 289 } else { |
278 size += opts->memmap[i].mask + 1; | 290 size += cursize; |
279 } | 291 } |
280 } | 292 } |
281 } | 293 } |
282 return size; | 294 return size; |
283 } | 295 } |