任天堂没有选择在主板上放置许多现成的芯片,而是采用 单芯片设计 来容纳(和隐藏)包括 CPU 在内的大部分组件。 这种芯片被叫做 SoC(System on a Chip,"片上系统")—— 在这里,SoC 就是专门为这款游戏机打造的芯片,这使得任天堂能够根据自己的需求(能效、反盗版与额外的 I/O ,等等)进行定制。 同时也意味着,这种芯片不可能通过零售渠道买到,这让当时的竞争对手更难以仿制它。
GameBoy上使用的 SoC 被称为 DMG-CPU(也叫 Sharp LR35902),从名字里可以看出,这是由 Sharp 生产的。 这家公司和生产 NES CPU 的供应商 Ricoh 一样,与 Nintendo 的关系非常密切。
CPU 核心
DMG 的主处理器是 Sharp SM83 ——这是 Zilog Z80 与 Intel 8080 相融合的产物。Z80 在当时的应用非常广泛,你可以在家用计算机、德仪图形计算器,以及 Sega Master System(SMS) 和 Game Gear 中见到它。 SM83 运行于大约 4.19 MHz,看上去比 1 MHz 的CPU更快;但这里必须指出,处理器的时钟频率有时是会 骗人 的。
回顾我们在 SMS 上的分析,我说过"Z80 是 8080 的'超集'" 。 所以与这两个处理器相比,SM83 多了什么,又缺了什么?
- 它既没有 Z80 的
IX和IY寄存器,也没有 8080 的IN、OUT这两种指令, 这意味着它根本就没有 I/O 接口。 我并不清楚这是不是为了节约成本,但这一点意味着硬件设备需要 完全的内存映射,才能与 CPU 进行交互。 - 只具有类似 8080 的寄存器组。 因此,SM83 只有7个通用寄存器,这与 Z80 的 14 个寄存器不同(在 Z80 中,每个寄存器都有其"备份")。
- 包含了 Z80 的部分扩展指令集,但只限于位操作指令。
此外,Sharp 还增加了一些不存在于 Z80 和 8080 的 新指令 , 这些额外的指令针对 Nintendo 与 Sharp 对硬件的安排进行优化。 其中一个是 LDH,即"读取高位地址内存"(LoaD from High memory) —— 这里的"高位地址",位于内存的最后 256 个字节,即开始于 $ff00。这样写程序的时候可以少写一个字节,速度也更快一些。
彩色效果
过了将近 10 年,随着 Virtual Boy 与它的 先进技术 被人遗忘,一个不起眼的继任者出现了:GameBoy Color(GBC,代号 CGB), 里面的新 SoC 被叫做 CPU CGB。它的功能更多了, 但它的核心 SM83 还在,只是时钟频率翻倍,达到约 8.38 MHz。
很难想象十年后 Nintendo 仍然捆绑使用同一颗 CPU。但这种方案仍然有一些好处:
- 开发者可以在新主机上沿用曾经的编程技能。
- 不需要为一个新架构重新设计他们的游戏系统,这可以省一些钱。
- 向后兼容不费吹灰之力。 其实,这颗核心可以通过编程改变工作模式:
- 正常模式,SM83 在通常时钟频率下运行(约 4.19 MHz),以适应原版 GameBoy;
- 二倍速模式,SM83 的时钟频率翻倍,达到约 8.38 MHz。这是 GameBoy Color "原始"的时钟频率。
但在九十年代后期,仍然使用这种过时技术是要被玩家痛骂的。 稍微看一眼 当时 CPU 的市场行情,就能明白这个掌机究竟错过了什么(但说实在的,Nintendo 保守不保守真的很难讲,例如 Virtual Boy)。
硬件访问
SM83 沿用了 8 位数据总线** 和** 16 位地址总线,可以寻址 64 KB 的内存。 内存映射的结构如下:
- 存储卡带若干区块的空间(Block 0 和 Block else);
- 工作 RAM(WRAM)、高位地址 RAM(HRAM)和显示 RAM(VRAM);
- I/O(按键、音频、图形与 LCD);
- 中断控制。
这些都将在后面为大家说明。
可用内存

DMG(原版 GameBoy)的内存架构 PPU负责对VRAM的访问进行仲裁
Nintendo 装在主板上的 8 KB RAM 是为"一般用途"准备的,这部分就是所谓的 WRAM。 这一大小可是 NES 的四倍。
另外还有 127 B RAM 位于 SoC 中, 这便是 HRAM。借助 SM83 独特的 LDH 指令,这部分空间的数据能够以更快的速度读取。 这与 6502(NES 上的处理器)上的"Zero Page"模式非常相似,它也是利用内存位置优化性能的。 从技术上讲,它跟外面的那部分相比没有实质性区别,但这是 CPU 优先访问的区域。 这里先放一边,等到"图形"章节讨论到 DMA (Direct Memory Access,直接内存访问)组件的时候,您就会明白这意味着什么。

扩展后的CGB内存架构(Game Boy Color)。 PPU再次负责对VRAM的访问进行仲裁
在 GameBoy Color 中,WRAM 扩大到 32 KB。 然而,由于 CPU 还是那个 CPU(特别是因为它有限的内存总线),直接把这些内存加进去会造成地址空间溢出,显然很不现实。 为了解决这个问题,Nintendo 的工程师引入了 "地址组切换" 机制。 这种机制继承自 NES 的卡带,使得 GameBoy Color 可以只使用 8 KB 的内存来访问 32 KB 的 WRAM。 技巧相当简单:8 KB 内存中,后面的 4 KB 可以在 7 个不同的 Bank 之间进行交换。 这样一来,为了让开发者能够检查扩展内存,CPU 又捆绑了一个额外的寄存器,即 SVBK,作为地址组切换器。


