为了模仿Gameboy,为什么记忆被分解成不同的区域呢?

时间:2016-02-23 21:50:06

标签: emulation gameboy

所以我正在编写一个gameboy模拟器,而且我不能100%确定为什么其他项目会花时间将内存分解成适当的类别。我不知道是否存在我所遗漏的重大技术困境(可能在指令中处理非法参数?),但似乎唯一重要的是写入指令给出的地址是可检索的通过适当的阅读指令。因此,对于一个子问题,如果我在假设程序集完全合法(意味着没有什么东西试图读/写它可以的地方)的情况下工作,我可以制作一个大数组并读取和写信给它?

请注意,这是一个概念性的问题,我知道一个大阵列将是一个记忆猪,我不一定寻找最好的方法来做,只是试图了解它是如何工作的以及为什么其他模拟器开发人员就像他们那样做了。

2 个答案:

答案 0 :(得分:2)

您将拥有只读存储器,读/写存储器和存储器映射I / O(外围设备等)。因此,您需要在某种程度上解码地址以将其分解为主要类别,然后对于外围设备,您必须模拟所有这些,因此您必须在地址解码中得到非常详细的信息。

对于外围设备,您需要检测对某个地址的读/写操作,这是通过简单地将写入数据放入数组中而无法完成的(例如,相同值的两次写入会产生影响,您只能将某些数据扫描到查找必须在读取和写入时触发的更改并执行硬件操作。)

如果你希望循环准确,你还需要知道rams和roms的时间,以模仿那些,取决于每个的库数量,或者时间是否依赖于你需要解码地址进一步

硬件将这些地址解码到同一级别,因此如果您要模拟硬件,则需要...模拟硬件......并进行相同数量的地址解码。

答案 1 :(得分:0)

我将在这里成为特定游戏男孩。看看gameboy的地址空间地图。地址空间本身是分开的,并不是模拟器能够做到的。硬件本身就是这样运作的。

以下某些区域无法实现为数组:

  1. 0x0000-0x3FFF。第一组ROM。它是只读的,但并不完全。阅读下一篇
  2. 0x4000-0x7FFF。可切换的ROM库,它也不是只读的。不适合游戏男孩地址空间的墨盒包含存储库控制器。 ROM将写入某些特定的只读ROM区域,以实际选择将哪个ROM存储区映射到0x4000-0x7FFF地址范围。因此,您必须检测这些写入,然后将读取重定向到所选的ROM库中。
  3. 0xA000-0xBFFF。可切换RAM库。与可切换ROM库相同但现在用于RAM。墨盒可能包含额外的RAM,这些RAM被映射到gameboy的地址空间。通过写入特定的只读区域,再次控制映射哪个RAM存储区。
  4. 0xFF00-0xFF4B。 IO端口。这里有硬件寄存器映射到地址空间。 Gameboy有几个硬件组件,每个组件都有自己的寄存器甚至内存(显示控制器,声音处理器,定时器等)。控制硬件ROM读写IO端口。您显然必须检测这些写入,以便您可以模拟它们对应的硬件。它不仅仅是您必须模仿的CPU和内存。我甚至会说它至少部分和容易的部分。例如,更难以正确获得显示控制器和声道。它们具有复杂的逻辑,错误和非常棘手的行为,这些行为没有很好地记录,但对于实现准确的仿真至关重要。波浪通道特别给我带来了困难。