GB/前言

自 1945 年冯·诺依曼体系结构确立, 在不到一个世纪的发展中, 计算机已经渗透到人类社会的每一个角落. 但正如历史长河中种种文明的兴衰迭起一般, 许多经典计算机也再一次一次的巨大变革中被遗失和遗忘. 阿兰·图灵曾提出: 当计算机 P 可以模拟计算机 Q 而且 Q 也可以模拟 P, 则计算机 Q 与计算机 P 是图灵等价的. 随后 IBM 于上世纪六七十年代正式提出虚拟机技术. 事实上, 许多虚拟机出现的初衷正是为了保存多年前的软件或游戏. 一些小时候的经典游戏比如超级玛丽, 坦克大战, 精灵宝可梦等, 随着时代的发展, 能承载它们运行的红白机, Game Boy 游戏机等均已经停产了, 但是只要从互联网上下载一个仿真器, 就可以在 PC 上随意游玩这些游戏, 就好像在手中有了一台真正的游戏机一样. 如果读者对这种技术感到好奇的话, 那么相信本书一定不会令人失望!

为什么要写关于虚拟机的教程

当前虚拟机技术正在计算机及互联网中被大量使用, 无论是在服务器, 个人 PC, 手机甚至手表, 都能见到虚拟机的身影. 就拿最常见的 Android 系统来说, 其运行 App 的 JVM 就是一个虚拟机. 同时像亚马逊等云服务器厂商的虚拟化技术, 以及桌面端的 VMWare 和 VirtualBox 等工具也均是日常生活中常用的虚拟机. 虚拟机应用如此之广泛, 但笔者却很少见到有人玩虚拟机, 一方面在于虚拟机底层技术甚少被用于业务工作, 另一方面在于讨论虚拟机技术的书籍或教程相当缺乏导致的虚拟机技术入门门槛非常高.

在程序员的世界, 会虚拟机与编译器一直是一件被人羡慕的事. 虽然很难真的依靠这门技术获取工作报酬(职位真的很少!), 但用来提升自己对计算机的理解还是不在话下的. 本书通过系统讲解以及实现一个完整的 Game Boy 虚拟机(仿真器)为例, 希望可以通过做出一个"实际"且"好玩"的项目, 吸引更多朋友进入这个领域. 但同时笔者意识到, 这是一个非常庞大的工程, 笔者很难在几十万字中将 Game Boy 的每一个技术细节都讲解明了, 甚至某些地方可能存在纰漏. 因此笔者的另一个希望是当读者发现教程中的纰漏时可以通过提交 Issues 的方式参与本书的排错, 让我们可以共同完善此教程.

目标读者

  • 有丰富经验的软硬件工程师
  • 对虚拟机感兴趣的开发者
  • 会 Rust 编程语言

大纲

  • 虚拟机发展史. 介绍虚拟机(仿真器)的历史, 主要以任天堂与索尼的各种游戏机的仿真器实现为主.
  • 游戏卡带. 介绍及实现 Game Boy 的多种不同类型的游戏卡带.
  • 中央处理器. 介绍及实现 Game Boy 的 CPU:LR35902. 包括其寄存器, 指令集, 中断以及时钟信号等.
  • 内存管理单元与主板. 介绍及实现 Game Boy 的内存管理单元与主板.
  • 视频. 介绍及实现 Game Boy 的 GPU 及贴图系统.
  • 音频. 介绍及实现 Game Boy 的 APU, 期间会简单介绍数字音频.
  • 游戏手柄, 串行通信接口与其他. 介绍及实现 Game Boy 剩余的硬件. 这些硬件实现较为简单, 因此放在一章统一处理.
  • 测试. 介绍如何测试编写的 Game Boy 虚拟机.
  • 使用 GB Studio 开发游戏. 介绍 GB Studio 开发工具.
  • 虚拟机高级实践与未来展望. 带领读者了解一些周边知识, 浅尝辄止.

源码

源码已托管在 Github: https://github.com/mohanson/gameboy.

建议阅读方式

首先, 读者必须拥有 Rust 编程语言的相关开发经验. 笔者默认读者已经相当熟悉这门编程语言, 因此不会再在书中去介绍这门语言的细节. 同时读者需要一点点的 Python 开发经验, 不过不用担心, Python 只会出现一两次. 在以下两个网站中可以找到这两门编程语言的教程:

其次, 本书的内容完全根据已公开的 Game Boy 硬件规范编写. 读者可以在如下两个网站获取笔者在编写代码时所参考的硬件技术文档:

强烈建议读者在阅读本书的同时阅读以上两份文档.

勘误

人力有时而穷, 本书编写过程中难免出现错误, 如果读者发现任何问题, 欢迎在本书仓库 https://github.com/mohanson/accu 下创建 Issues, 笔者会第一时间给予答复.

ROMs

Game Boy 在历史上总共发行过几千款游戏, 笔者从互联网上搜集了这些游戏的 ROMs 以方便读者进行下载和测试. 这些 ROMs 仅做学习和测试使用, 如若侵犯您的权益, 请联系笔者, 笔者会第一时间予以删除.

百度网盘链接: https://pan.baidu.com/s/1_gtQo9EymYpE1_mbO8i5qQ, 提取码:xkn8.

致谢

本书编撰过程中, 获取了大量来自互联网的公开资料, 文档和图像. 在此特别感谢网站 https://gbdev.gg8.se, 可以说没有该网站提供的资料就不可能完成此书. 该网站首页写有一个谚语:"A journey of a thousand miles begins with one small step"(千里之行, 始于足下), 笔者在成书过程中深感认同, 笔者第一次写介绍虚拟机的文章时, 文章只有约 1000 字左右, 如今谁能想到在一年的坚持后, 笔者居然洋洋洒洒地写了几十万字.

其次感谢维基百科, 为了确保书中关于计算机架构的各个技术细节的正确, 本书对计算机科学中专有名词的解析大量参考维基百科中的相关词条. 但由于维基百科是动态更新的百科全书, 本书并不能保证书中所载的内容的时效性.

同时也感谢公司提供的相对宽松的工作环境, 如果实行的 996 工作制的话, 相信本书的成书将晚上几年.还有笔者的好友叶嘉雨, 如果不是他最初带领笔者踏入了虚拟机领域, 笔者的属性点可能就会点到其它方面.