comparison backend.c @ 2113:0013362c320c

Fix handling of ram code flag offset calculation for ranges that are not an even multiple of the code flag page size
author Michael Pavone <pavone@retrodev.com>
date Sun, 13 Feb 2022 22:52:52 -0800
parents 45c4b74e7676
children 9caebcfeac72
comparison
equal deleted inserted replaced
2112:3abb64bd0da6 2113:0013362c320c
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; 59 uint32_t size_round_mask;
60 if (flags == MMAP_CODE) { 60 if (flags == MMAP_CODE) {
61 minsize = 1 << (opts->ram_flags_shift + 3); 61 size_round_mask = (1 << (opts->ram_flags_shift + 3)) - 1;
62 } else { 62 } else {
63 minsize = 0; 63 size_round_mask = 0;
64 } 64 }
65 address &= opts->address_mask; 65 address &= opts->address_mask;
66 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++)
67 { 67 {
68 if (address >= cur->start && address < cur->end) { 68 if (address >= cur->start && address < cur->end) {
69 return cur; 69 return cur;
70 } else if (size_sum && (cur->flags & flags) == flags) { 70 } else if (size_sum && (cur->flags & flags) == flags) {
71 uint32_t size = chunk_size(opts, cur); 71 uint32_t size = chunk_size(opts, cur);
72 if (size < minsize) { 72 if (size_round_mask) {
73 size = minsize; 73 if (size & size_round_mask) {
74 size &= ~size_round_mask;
75 size += size_round_mask + 1;
76 }
74 } 77 }
75 *size_sum += size; 78 *size_sum += size;
76 } 79 }
77 } 80 }
78 return NULL; 81 return NULL;