超级任天堂选择的处理器很特别。 与捆绑成熟的68000的竞争产品不同,SNES 的芯片与其前身相比并没有根本性的突破。 概括地说,NES 采用的是经过改进的6502 CPU,它是70年代末和80年代初计算机中备受推崇的部件。 现在,为了给新的十年(90年代)铺平道路,任天堂采用了更保守(也更便宜)的解决方案:WDC 65C816,这是6502的16 位扩展。
6502的现代化
65C816 CPU源自Western Design Center,特别是来自Bill Mensch,他曾是6502开发团队(在 MOS)和6800开发团队(在摩托罗拉)的成员。 1978年,在离开MOS一年后,Mensch创立了Western Design Center (WDC),这是一家半导体公司,专门生产MOS 6502的克隆产品,并对其进行了极具吸引力的改进(如CMOS设计、额外的操作码、电路修复、新的寻址模式等)
有一天,苹果公司找到 WDC,要求其设计一种向后兼容的6502变体,可以处理更大量的数据。 于是,WDC 65C816 CPU 于1983年面世。 奇怪的是,苹果在开发使用这种新CPU的计算机过程中经历了许多挫折,直到三年后才发布了Apple IIGS。

最终,Apple IIGS和超级任天堂成为65C816 CPU的仅有的主要采用者
与此同时,任天堂与理光(Ricoh)及其为NES提供的芯片组保持着良好的合作关系。 我没有找到确切的文件来概述理光与WDC之间的关系,但我可以确定的是,在某个时间点,WDC同意将其65C816设计授权给理光。 因此,理光根据超级任天堂的新要求对其进行了定制,并将其命名为理光5A22,专门供应给任天堂。
新的CPU
如前所述,该控制台的主处理器是理光5A22,是65C816的超集。
与具有Apple II软件的向后兼容能力的Apple IIGS不同,超级任天堂与NES游戏不兼容。 平心而论,从处理器的选择来看,SNES最初计划兼容NES游戏的可能性微乎其微,谁知道呢。
接下来,CPU采用了可变时钟速度,在进行寄存器操作时最高可达3.58 MHz,而在访问最慢的总线(即串行/手柄端口)时则低至1.79 MHz。
现在,为了正确理解5A22的功能,我们必须首先了解65C816的功能:
- 65816 ISA: 65C816首次推出的16位指令。 它以 6502 ISA 为基础,但不执行某些NES游戏使用的未注明指令。
- 指令的大小可在1字节(8位)和4字节(32位)之间变化,这取决于内存地址的引用方式(又称"寻址模式")。
- 被破坏的BCD模式又开始工作了(我猜这是_正当_授权的结果)。
- 10种不同的操作模式: 由于结合了向下兼容模式、BCD模式的回归(在NES上缺失)以及在16位和8位寄存器组之间切换的能力 ,开发人员可以使用不同的组合来使用这款CPU。
- 三个16位通用寄存器。 这组寄存器与6502的寄存器(
X、Y和A)相同。 不过,由于操作模式不同,这些寄存器现在可以在16位和8位之间切换。- 这个数字与竞争对手提供的16个32位寄存器相比,可谓天壤之别!
- 16位内部数据总线和8位外部数据总线: 这意味着在内存中移动大于8位的数值会带来性能损失(CPU 会花费额外的周期),特别是考虑到大多数指令都是16位长。 不过,总体成本是相对的,因为理光的变体包括DMA单元(稍后解释),CPU时钟会根据操作的不同而变化。
- 24位地址空间: 允许CPU访问多达16 MB的内存。 与摩托罗拉68000类似,但 65C816 的24位地址是通过将额外的8位寄存器(
DBR和PBR)与6502的原始16位寻址线相结合而获得的。 总的来说,这种方法类似于使用内部映射器。
看到这里,我不得不承认65C816感觉过于繁琐,而收益却很少。 与摩托罗拉68000等其他产品相比,我们不难得出结论,为什么Apple IIGS最终成为唯一采用65C816的个人电脑。 尽管如此,在这篇文章中,你将看到任天堂和理光如何将这种CPU的局限性转化为改造其游戏库的机会。
理光添加的硬件
65C816是一款通用CPU,于1983年推出,是其1975年祖先的后续产品,具有各种要求和限制。 然而,任天堂计划将其游戏机的寿命延长至整个90年代。 因此,理光必须加大力度去魔改(恕我直言)。
首先要解决的是算术上的限制,65C816没有包含任何乘法或除法的专用指令。 因此,理光增加了16位乘法和除法单元,使CPU能够通过硬件(而不是软件)执行这些运算。
现在,您可能会问"这有什么关系",答案将在我们讨论超级任天堂图形芯片的某些新功能时揭晓(在"图形"部分)。
高速内存访问
第二个挑战是提高数据带宽。 因此,我们增加了两个独占的DMA(直接内存访问),以便在CPU不干预的情况下移动数据(从而提高速度)。 为使这一设计发挥作用,内存区域使用两条不同的地址总线进行引用:
- 由CPU控制的24 位 "A 总线": 连接卡带、CPU 与工作内存
- 由S-PPU控制的8 位 'B 总线' :连接卡带、CPU、工作内存、S-PPU 和音频 CPU。
当设置DMA时, 数据来源 必须与 传输目标 在不同的总线上。
此外,这两种DMA并不完全相同,其功能也截然不同:
- 通用DMA可随时执行传输。 在传输完成之前,CPU会停止运行。
- 水平DMA(HDMA)在每次水平扫描后(显像管光束准备绘制下一行时)执行少量传输。 这避免了长时间中断CPU,但传输限制为每扫描线4字节。
最后,系统提供8个通道用于设置DMA传输,因此可以同时调度多达8个独立的传输。
片段故障
该游戏机还具有一种名为"开放总线"的特殊"异常":如果有指令试图从一个未映射/无效的地址读取数据,则会提供最后读取的值(CPU会将该值存储在一个名为内存数据寄存器或MDR的寄存器中),并在不可预测的状态下继续执行。
相比之下,68000 使用向量表来处理异常,因此只要检测到故障,执行就会重定向。
(大量的)更多内存
NES 的内存只有2 KB,但却能显示大量内容,这实在令人惊叹。 超级任天堂现在拥有128 KB 的 SRAM(仍称为 "工作内存" 或WRAM)。 这比上一代产品多出6400%的通用内存。
那么,开发人员能用它做什么呢? 可以做任何他们想做的事。 WRAM用于存储游戏的变量信息。 空间越大,可存储和处理的信息就越多(从而节省了卡带上的硬件) 不过,请记住,本文下面的章节将向你展示超级任天堂是一台相当复杂的机器(尽管它的CPU很 "简单"),我倾向于将这台游戏机称为"小型计算机/子系统的集合"。 现在,每个子系统都可能需要中央处理器提供数据。 因此,程序员可能会分配部分WRAM来处理这些信息,从而证明128 KB的必要性。

