【问题标题】:How do I learn to write a console emulator? [duplicate]如何学习编写控制台模拟器? [复制]
【发布时间】:2012-06-24 01:08:54
【问题描述】:

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

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

我已经搜索了互联网,但我只发现了包含太多错误的不清楚的教程,我无法自己弄清楚。我应该从哪里开始?

【问题讨论】:

  • 我有一个模拟器集合github.com/dwelch67你首先需要学习的是目标cpu的汇编语言,然后使用按执行顺序反汇编的反汇编程序,在某些时候你可以开始转动进入指令集模拟器。然后你必须为所有外围设备制作模拟器。所以你需要为你正在模拟的系统提供好的文档。
  • 另一种方法是静态二进制转换器,SBT。 dwelch.com/ipod/asteroids.htm 是我为 ipod(经典)所做的一个,自从那个版本发布以来,我在那个上做了很多工作,虽然没有在任何地方发布。关于这个主题的一个很好的教程。 gtoal.com/sbt 您也可以进行动态翻译,即时翻译而不是静态翻译。在你可以做静态之前,我不会尝试动态。

标签: c emulation low-level nintendo gameboy


【解决方案1】:

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

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

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

这实际上是我打算在这些日子里自己承担的一个项目,只是一直没有找到时间。

【讨论】:

  • 我一直想知道的一件事是在哪里可以找到特定系统的规格。有些系统,就像你提到的那样,有很好的文档记录,但是像Dolphin Emu 这样的项目呢?任天堂真的会发布他们的游戏机架构给大家看吗?
  • 大量的辛勤工作和逆向工程。有时从例如开始芯片上的引脚排列,有时甚至会在系统运行时将探针贴在实际硬件上。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    这些不是玩具,写出来会很有教育意义。

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

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

    附:当我第一次开始使用计算机时,我花了很多时间在 FORTH 中进行编程,它教会了我很多东西。这些年来,我从中吸取的教训对我很有帮助。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 2014-09-28
      • 2017-02-26
      相关资源
      最近更新 更多