Mercurial > repos > blastem
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; |