模拟游戏机的内存映射,根据提供的地址访问不同的位置

Zer*_*Sum 5 c++ emulation low-level memory-mapping

我正在为旧游戏机实现模拟器,主要是出于学习目的。

此控制台将ROM和许多其他内容映射到其地址空间内的区域。某些位置也被镜像,因此多个地址可以对应于同一物理位置。我想模仿一下,但是我不确定这样做的好方法(也不知道这个过程叫什么,因此不知道这个通用问题)。

起作用的一件事是一张简单的无序地图。让它包含绝对地址和指向我的数据结构的相应指针。这样,我可以轻松地将所需的所有内容映射到系统的地址空间。这种方法的问题在于,这显然是内存消耗。即使有了小光盘,由于上述镜像,我最终还是获得了近一千万个条目。当然,这不是严峻的事情吗?

任何帮助深表感谢。

编辑:

提供一些有关我如何精确执行此操作的详细信息:

当然,所讨论的系统是SNES。使用此Wiki作为我的主要资源,我实现了上面提到的内容,如下所示:

  • 创建一个 std::unordered_map<uint32,uint8_t*> mMemoryMap;
  • 检查ROM是LoRom还是HiRom
  • 对于ROM中的每个字节
    • 计算应该将其映射到的地址,并在映射中放置该地址和指向该字节的指针
    • 如果该部分需要在其他地方镜像,请重复上述步骤
  • 这将应用于我需要提供的其他任何内容,例如视频或系统内存

如果现在我想访问地址空间内的任何内容,我可以简单地使用系统在内部使用的地址。

小智 1

我假设对于连续地址,物理位置在某些内存块或“块”内也是连续的。也就是说,如果地址 0x0000 映射到 0xFF00,则 0x0004 映射到 0xFF04。

在此输入图像描述

如果它们像这样工作,那么您可以创建一个包含这些块的信息的列表。说:

struct Chunk
{
   int addressStart, memoryStart, size;
}
Run Code Online (Sandbox Code Playgroud)

这些块可以按地址开始排序,因此您可以找到任何地址所需的正确块。这需要您迭代列表,但如果您只有几个块,这可能是可以接受的。