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 }