mirror of
https://github.com/Marat-Tanalin/bsnes-mt.git
synced 2025-04-02 10:21:42 -04:00
30 lines
590 B
C++
30 lines
590 B
C++
#pragma once
|
|
|
|
namespace Emulator::Memory {
|
|
|
|
inline auto mirror(uint address, uint size) -> uint {
|
|
if(size == 0) return 0;
|
|
uint base = 0;
|
|
uint mask = 1 << 31;
|
|
while(address >= size) {
|
|
while(!(address & mask)) mask >>= 1;
|
|
address -= mask;
|
|
if(size > mask) {
|
|
size -= mask;
|
|
base += mask;
|
|
}
|
|
mask >>= 1;
|
|
}
|
|
return base + address;
|
|
}
|
|
|
|
inline auto reduce(uint address, uint mask) -> uint {
|
|
while(mask) {
|
|
uint bits = (mask & -mask) - 1;
|
|
address = address >> 1 & ~bits | address & bits;
|
|
mask = (mask & mask - 1) >> 1;
|
|
}
|
|
return address;
|
|
}
|
|
|
|
}
|