Memory Bank Controller

自从计算机被发明以来, 许多计算机系统都不得不面对一个问题: 计算机上所运行的程序需要越来越多的内存, 以至于超出了当时的硬件能力范围. 一个发生在我们身边的例子是近几年已经不太常见的 32 位系统, 因为其使用的 32 位 CPU 只能寻址最多 4 GB 内存, 无论是播放超清视频还是玩大型游戏都显得捉襟见肘. 传统上, 有两种方式可以来处理这个问题:

  • 增加 CPU 可寻址的地址空间. 设计一个新的拥有更多地址总线的 CPU, 使其能够寻址更大的内存量. 这是优选的解决方案, 但是需要时间和金钱来解决问题.
  • 虚拟内存方案. 这可以是映射到软盘上的 RAM, 当 CPU 需要时交换软盘与内存中的数据; 或是已经提前预写的 ROM 分块数据. 在这两种情况下, 系统硬件只需要一点扩展, 成本低廉, 但坏处是系统中的任何软件必须知道该虚拟内存体系的存在, 才能使用它.

对于 Game Boy 而言, 任天堂采用了第二种方式, 也就是虚拟内存来支持更大的存储空间. 我相信这是经过广泛的深思熟虑和多方取舍后的结果(而且他们一定评估过小孩子口袋里的零钱数量!). Game Boy 的内存管理单元分配给 Cartridge 的内存地址空间范围有两段, 第一段是 0x0000...0x7fff, 第二段是 0xa000...0xbfff, 总计 0x8000 + 0x2000 = 32 KB + 8 KB = 40 KB 的存储空间, 其中后 8 KB 被分配给外部内存. 因此一个简单的结论是, 如果直接将卡带的物理存储映射到内存管理单元的地址, 卡带的最大容量不得超过 32 KB. 不过幸运的是, 开发者可以通过内嵌在 Cartridge 中的 Memory Bank Controller(内存存储体控制器, 简称 MBC)技术来扩展游戏的体积.

CPU 通常只能与系统地址空间直接通信(除 I/O 口外), 因此如果一个外部设备期望与 CPU 通信的话, 可以通过将自己的存储空间映射到系统地址空间上来完成. MBC 技术正是这层映射过程中的一个中间层.

原理详解

Memory Bank Controller 是计算机设计中的一种常见技术, 用于将可用存储容量增加到超出处理器可直接寻址的范围. 它最初起源于小型嵌入式系统, 之后在 8 位机上发扬光大, 到现代, 依然可以在许多微机系统中看到它的身影(不过在现代它通常被称为 Bank Switing, 存储体切换, 实际上指代的是同一件事物). MBC 被认为是通过一些外部寄存器扩展处理器地址总线的一种方式, 它的原理异常简单, 例如, 假设我们的游戏程序拥有总共 64 KB 的程序指令和数据, 而我们的可用内存只有 32 KB, 那么程序总共被分为 2 个页. 我们将它们编号为 P0 和 P1. 很明显, P0 和 P1 无法同时装入内存, 那么当我们在开始执行程序时, 先将 P0 装载入内存, 在执行一段时间后, 发现需要用到 P1 的内容, 于是将 P1 的数据覆盖装入内存. 我们用一个外部锁存器来控制需要装载入内存的页, 如图所示, 当 CPU 试图读取系统地址为 0x0001 的值时, 根据锁存器标志位的设置与否, 将从存储体中实际读取到值 A(0x0001) 或者值 C(0x8001).

img

由于外部存储体选择锁存器(或寄存器)未直接与处理器的程序计数器连接, 因此当程序计数器溢出时, 它不会自动更改状态. 由于程序计数器是处理器的内部寄存器, 因此外部锁存器无法检测到此错误, 这导致程序无法无缝使用额外的内存. 取而代之的是, 处理器必须明确地执行存储体切换操作, 以访问额外的内存区间. 除此之外, MBC 还有一些其它的限制, 例如显而易见的你无法在同一时间使用两个页的数据.

MBC 在许多视频游戏机中都有广泛的应用. 例如, 最初的 Atari 2600 只能寻址 4 KB 的 ROM, 因此, 后来的 2600 游戏卡带包含其自己的存储体切换硬件, 以便允许卡带存储更多内容, 从而允许进行更复杂的游戏(复杂的游戏通常拥有更多程序代码, 同样拥有更加大量的游戏数据, 例如图形). Nintendo Entertainment System(NES) 包含一个改进的 6502 游戏卡带, 相比较原版多了 MBC 技术. 同一年代的 Sega Mega Drive, 几个大小超过了 4 MB 的盒式磁带使用的也是此技术.

通过合理的使用 MBC, 在已知的已生产的 Game Boy 游戏卡带中, 容量最大的卡带是一款叫做 Densha de Go! 的游戏, 卡带类型是 MBC5(一种 MBC 控制算法), 容量高达 8 MB, 是 32 KB 的 256 倍. 这款游戏是一款电车模拟器, 如图所示, 玩起来还蛮带感的.

img

根据游戏卡带是否采用了 MBC 技术以及采用的是哪一种 MBC 控制算法, 常见的 Game Boy 卡带类型有 ROM Only, MBC1, MBC2, MBC3 和 MBC5 5 个种类, 我们将在后续的小节对此进行详细介绍.