diff --git a/Machines/Apple/AppleIIgs/MemoryMap.hpp b/Machines/Apple/AppleIIgs/MemoryMap.hpp index d1f92d178..33916ad6d 100644 --- a/Machines/Apple/AppleIIgs/MemoryMap.hpp +++ b/Machines/Apple/AppleIIgs/MemoryMap.hpp @@ -576,9 +576,28 @@ class MemoryMap { // would be less efficient. Verify that? #define MemoryMapRegion(map, address) map.regions[map.region_map[address >> 8]] -//#define IsShadowed(map, region, address) (map.shadow_pages[((®ion.write[address] - map.ram_base) >> 10) & 127] & map.shadow_banks[address >> 17]) -#define IsShadowed(map, region, address) (map.shadow_pages[(address >> 10) & 127] & map.shadow_banks[address >> 17]) #define MemoryMapRead(region, address, value) *value = region.read ? region.read[address] : 0xff + +// The below encapsulates the fact that I've yet to determine whether Apple intends to +// indicate that logical addresses (i.e. those prior to being mapped per the current paging) +// or physical addresses (i.e. after mapping) are subject to shadowing. +#ifdef SHADOW_LOGICAL + +#define IsShadowed(map, region, address) \ + (map.shadow_pages[((®ion.write[address] - map.ram_base) >> 10) & 127] & map.shadow_banks[address >> 17]) + +#define MemoryMapWrite(map, region, address, value) \ + if(region.write) { \ + region.write[address] = *value; \ + const bool _mm_is_shadowed = IsShadowed(map, region, address); \ + map.shadow_base[_mm_is_shadowed][address & map.shadow_mask[_mm_is_shadowed]] = *value; \ + } + +#else + +#define IsShadowed(map, region, address) \ + (map.shadow_pages[(address >> 10) & 127] & map.shadow_banks[address >> 17]) + #define MemoryMapWrite(map, region, address, value) \ if(region.write) { \ region.write[address] = *value; \ @@ -586,6 +605,8 @@ class MemoryMap { map.shadow_base[_mm_is_shadowed][(®ion.write[address] - map.ram_base) & map.shadow_mask[_mm_is_shadowed]] = *value; \ } +#endif + // Quick notes on ::IsShadowed contortions: // // The objective is to support shadowing: diff --git a/OSBindings/Mac/Clock SignalTests/IIgsMemoryMapTests.mm b/OSBindings/Mac/Clock SignalTests/IIgsMemoryMapTests.mm index 185a31844..80c83268f 100644 --- a/OSBindings/Mac/Clock SignalTests/IIgsMemoryMapTests.mm +++ b/OSBindings/Mac/Clock SignalTests/IIgsMemoryMapTests.mm @@ -377,7 +377,7 @@ namespace { int logical = 0; for(NSNumber *next in test[@"shadowed"]) { while(logical < [next intValue]) { - const auto ®ion = + [[maybe_unused]] const auto ®ion = self->_memoryMap.regions[self->_memoryMap.region_map[logical]]; const bool isShadowed = IsShadowed(_memoryMap, region, (logical << 8));