0

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

请注意,这是一个概念性问题,我知道一个大数组会占用大量内存,我不一定要寻找最好的方法,只是想了解它的工作原理以及其他模拟器开发人员为什么这样做他们这样做的方式。

4

2 回答 2

2

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

对于外围设备,您将需要检测对某个地址的读/写,而您不能通过简单地将写入放入数组中来执行此操作(例如,相同值的两次写入会有所不同,您不能只扫描某个数组来查找更改您必须触发读取和写入并执行硬件操作)。

如果您希望循环准确,您还需要知道 ram 和 rom 的时序以模仿它们,这取决于每个的多少个 bank,或者时序是否取决于您需要进一步解码地址。

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

于 2016-02-25T05:04:13.773 回答
0

我将在这里具体介绍gameboy。看gameboy的地址空间图。地址空间本身是划分的,不是模拟器做的。硬件本身就是这样运作的。

以下是一些不能仅作为数组实现的区域:

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