我如何学习编写控制台模拟器?

时间:2012-06-21 18:15:30

标签: c emulation low-level nintendo gameboy

  

可能重复:
  How do emulators work and how are they written?

我想尝试编写基本的gameboy模拟器,甚至是NES。我知道C的基础知识,而且我相当擅长Java,所以我知道编程的必要基础知识。但我不知道的是人们如何将所有数据处理成C程序并从中创建模拟器。我知道我应该从源头学习,但是很难看到一堆代码而不知道它们为什么存在以及它们应该做什么。如果我想学习如何编写这样的模拟器,我应该从哪里开始?

我搜索了互联网,但我发现不清楚的教程包含太多错误,我自己也没弄清楚。我该在哪里开始?

3 个答案:

答案 0 :(得分:7)

你没有。你模仿硬件。您根本不必“处理”程序数据,您需要编写模仿CPU,图形硬件,输入设备等的代码。

一个好的第一步可能是编写Z-Machine模拟器,虽然它不是控制台,但它实际上是第一个广泛使用的“模拟器”。它被用于所有infocom文本冒险(zork等)。由于它是面向文本的游戏格式,因此在图形或声音方面没有太多模仿,唯一的输入设备是键盘,您不必担心执行速度/同步。

这里有很好的记录:http://www.gnelson.demon.co.uk/zspec/preface.html

这实际上是一个项目,我的意思是在这些日子里做我自己,但从来没有找到时间。

答案 1 :(得分:2)

您可能首先要收集有关您要模拟的硬件的信息。 CPU可能是最大的一块,也是最容易获得的,所以这是一个合理的起点。

CPU仿真器基本上读取程序的字节,解码各个指令并执行它们。您通常会分配一个大数组来表示设备的内存,以及一些变量来表示CPU的寄存器。您可以通过在这些“寄存器”/存储器位置上一次执行一个操作来模拟指令的执行。

您还必须在您尝试模拟的设备上找到有关I / O的信息 - 例如,代表特定按钮输入的端口或内存位置,哪些地址代表屏幕等。较新的设备(但通常不是大多数较旧的设备)您将需要一个单独的图形处理器,您也需要模拟。您不仅需要模拟处理器本身,还需要模拟它与主CPU的连接。

答案 2 :(得分:2)

控制台模拟器是一个非常大的项目,我预测它对大多数项目来说都不会太有趣;在任何游戏开始运行之前,你必须得到很多的东西。

找到一个试图模拟控制台的现有开源项目可能会更有趣,看看你是否能找到改进它的方法。

但如果您只是在寻找一个非常有教育意义的项目,我还有另一个建议:编写您自己的Scheme解释器,或编写您自己的FORTH解释器。这些都是最小的,优雅的语言(并且都有非主流语法规则!)。您可以从头开始编写自己的Scheme或FORTH,并在几天内运行程序。

这些不是玩具,写作将具有教育意义。

想象一下:获取SICP [1]的副本并在您自己编写的系统中运行程序!或者获得一本FORTH书的副本并在你自己编写的系统上解决问题!

如果您对这些项目感兴趣,Google会搜索“编写一个Scheme解释器”和/或“编写一个FORTH解释器”。

P.S。当我第一次开始使用计算机时,我花了很多时间在FORTH中进行黑客攻击,它教会了我很多东西。多年来,我从中吸取的教训帮助了我。

[1] http://sicpebook.wordpress.com/