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