我正在为旧游戏机实现模拟器,主要用于学习目的。
此控制台将 rom 和许多其他内容映射到其地址空间内的区域。某些位置也被镜像,以便多个地址可以对应于相同的物理位置。我想效仿这一点,但我不确定这样做的好方法是什么(也不知道这个过程叫什么,因此这个有点笼统的问题)。
一个有用的东西是一个简单的、无序的 map 。让它包含绝对地址和指向我的数据结构的相应指针。这样,我就可以轻松地将我需要的所有内容映射到系统的地址空间中。这种方法的问题在于,它显然是一种内存消耗。由于上述镜像,即使是小 rom,我最终也有近千万个条目。当然,这不是正确的做法吗?
非常感谢任何帮助。
编辑:
提供一些关于我是如何做到这一点的细节:
有问题的系统当然是 SNES。使用 this wiki作为我的主要资源,我按如下方式实现了上面提到的内容:
- 创建
std::unordered_map<uint32,uint8_t*> mMemoryMap;
- 检查rom是LoRom还是HiRom
- 对于rom中的每个字节
- 计算应该映射到的地址,并将地址和指向该字节的指针放置在映射中
- 如果该部分需要镜像到其他地方,重复上述操作
- 这将应用于我需要提供的任何其他内容,例如视频或系统内存
如果我现在想访问地址空间内的任何内容,我可以简单地使用系统将在内部使用的地址。
最佳答案
我假设对于连续地址,物理位置在特定内存块或“ block ”内也是连续的。也就是说,如果地址 0x0000 映射到 0xFF00,则 0x0004 映射到 0xFF04。
如果它们是这样工作的,那么您可以制作一个包含这些 block 信息的列表。说:
struct Chunk
{
int addressStart, memoryStart, size;
}
block 可以按 addressStart 排序,因此您可以找到任何地址所需的正确 block 。这需要您迭代列表,但如果您只有几个 block ,这可能是可以接受的。
关于c++ - 模拟游戏机的内存映射,根据提供的地址访问不同的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933177/