5

我很好奇模拟器是如何工作的。它们是用什么写的?它是否必须模拟图形?人们如何将游戏上传为 rom?他们是否模拟系统操作系统?

4

1 回答 1

12

有几种仿真技术。第一种技术称为低级仿真。在这种情况下,模拟器几乎可以用任何语言编写,但是由于大量的二进制数据操作,C 和 C++ 很适合这样的任务,尽管有很多其他语言能够提供这样的任务。

通过低级仿真,该程序模拟原始系统的确切硬件。例如,原始 NES 具有来自官方文档和逆向工程信息的明确定义的硬件。我们确切地知道其基于 6502 的 CPU 以及图形、声音芯片等的行为方式。通过低级仿真,原始游戏的确切二进制数据在软件中以与原始硬件解释数据的方式完全相同的方式进行解释。这包括为 6502 指令集编写的原始机器代码、图形数据、IO,一切。图形和声音硬件是通过调用现代图形和声音 API 将原始硬件指令转换为现代硬件来模拟的。

这种技术是最准确和最成功的,但对于复杂的机器来说也是最慢的,有时也是最难实现的。

第二种方法称为静态重新编译。分析原始系统的原始机器代码,然后为现代计算机重新编译。这种技术产生最快的仿真,但成功率非常低。使用这种技术的模拟器最多只能支持一些演示和游戏。原因是原始软件所期望的运行时环境通常会以在编译时很难或不可能知道的方式发生变化。

最后一种技术称为动态重新编译。在这种技术中,模拟器分析代码并在运行时重新编译它。这允许编译器根据程序运行时可用的信息将运行时环境调整为原始软件所期望的。

大多数形式的重新编译技术都涉及一种称为高级仿真的技术。这是观察到大多数代码只是编译为调用操作系统或库 C 例程的代码。代码被重新编译到主机上,对原始操作系统和库的调用,例如图形和声音的调用,被本地重新实现,而不是被模拟。例如,如果有一个在屏幕上绘制三角形的调用,则仿真器可以简单地直接执行该操作,而不必仿真将绘制命令传递给原始图形硬件的确切低级实现。这就是几乎所有 Nintendo 64 和 PlayStation 模拟器的工作方式。

原来的操作系统只是有时需要重新实现。例如,Nintendo 64 实际上没有操作系统,每个卡带本身就是它自己的操作系统。然而,仿真器识别所有 ROM 实现的通用例程,并动态捕获和重新实现它们。然而,PlayStation 有一个专有的 BIOS,用于设置基本硬件和从 CD 读取游戏。仿真器必须拥有此 BIOS 的副本或尝试重新实现其功能。

我们知道使用动态重新编译的模拟器已经在内部实现,例如 Xbox 360,以便玩原始的 Xbox 游戏。对于外部开发人员来说,这样的任务非常困难,但对于拥有所有原始和专有文档以及创建和优化这样一个模拟器的人力的微软来说更简单。在这种情况下,不需要模拟整个原始 Xbox 操作系统,但是原始游戏对原始操作系统的调用必须转换为本地操作系统。Xbox One 模拟 Xbox 360 的技术是相似的,除了为了在模拟中与 Xbox 360 游戏具有更大程度的兼容性,他们选择在其模拟器中运行原始 Xbox 360 操作系统。

游戏卡带中的游戏通过专为 ROM 转储而设计的硬件转移到计算机上。旧机器上的 ROM 实际上以非常简单的方式运行。它们有地址输入线和数据输出线。可以使用微控制器构建设备以转储这些 ROM,然后使用串行、USB 或其他方法将它们传输到计算机。一些 ROM 甚至可以通过计算机的可编程并行端口读取,这在现代 PC 中很大程度上是缺失的,但存在用于它们的 USB 适配器。

由于大量动态代码生成,使用重新编译技术的仿真器几乎只使用 C 或 C++,但是任何能够在运行时进行系统编程和低级代码接口的语言都能够做到这一点。

于 2012-06-16T00:40:15.450 回答