Game Boy Advance的体系结构

2020-12-29 08:07:46

Game Boy Advance的内部设计对于使用两节AA电池运行的便携式游戏机而言非常出色。

该控制台将使用任天堂的签名GPU进行操作。此外,它将引入来自英国公司的相对较新的CPU,并将在未来几年内迅速普及。

大多数组件都组合到一个称为CPU AGB的软件包中。该软件包包含两个完全不同的CPU:

夏普LR35902,其运行频率为8.4或4.2 MHz:如果与Game Boy上的CPU不同!它有效地用于运行Game Boy(DMG)和Game Boy Color(CGB)游戏。如果您想了解更多有关这方面的信息,请参阅我的上一篇文章。

运行在16.78 MHz的ARM7TDMI:这是我们将重点关注的新处理器,它肯定可以运行Game Boy Advance游戏。

请注意,两个CPU永远不会同时运行或进行任何精美的协同处理。包括非常老的Sharp的唯一原因是为了向后兼容。

在ARM控股公司(现为“手臂”)在智能手机领域变得异常流行之前,他们许可其CPU设计为Acorn的计算机,苹果的Newton,诺基亚的电话和松下3DO提供动力。任天堂选择的CPU ARM7TDMI基于早期的ARM710。设计,包括:

三阶段流水线:指令的执行分为三个步骤或阶段。 CPU将同时获取,解码和执行最多三个指令。这样可以最大程度地利用CPU资源(从而减少空闲硅片),同时还可以增加每单位时间执行的指令量。

T→Thumb:ARM指令集的子集,其指令被编码为16位字。 Thumb指令为16位,需要一半的总线宽度并占用一半的内存。但是,由于Thumb指令仅提供ARM的功能子集,因此您可能必须编写更多指令才能达到相同的效果。

Thumb仅在分支上提供条件执行,其数据处理操作使用双地址格式,而不是三地址格式,并且它只能访问寄存器文件的下半部分。

实际上,Thumb使用了70%的ARM代码空间。对于16位宽的内存,Thumb运行速度比ARM快。

如果需要,可以将ARM和Thumb指令混合在同一程序中(称为互通),以便开发人员可以选择何时何地使用每种模式。

M→增强乘法器:以前的ARM内核需要多个周期才能计算出完整的32位乘法,因此这种增强将其减少到几个。

I→EmbeddedICE宏单元:调试模块,它允许硬件断点,观察点并允许在调试时暂停系统。

特别是Thumb的包含对此控制台的最终设计有很大的影响。 Nintendo在其不同模块之间混合使用16位和32位总线,以降低成本,同时为程序员提供优化其代码所需的资源。可用内存分布在以下位置:

IWRAM(内部WRAM)→具有32 KB的32位:用于大块存储ARM指令和数据。

EWRAM(外部WRAM)→16位(256 KB):优化用于以小块形式存储Thumb指令和数据。

PAK ROM->具有可变大小的16位:这是访问盒式ROM的位置。

购物车RAM->具有可变大小的16位:这是访问盒式RAM的位置。

尽管此控制台以32位系统的形式销售,但其大部分内存只能通过16位总线访问,这意味着游戏将主要使用Thumb指令集,以避免每次获取指令花费两个周期。只有关键部分才应使用ARM指令集。

您会惊讶地发现,没有安装用于检测插入的盒带是GB还是GBA的软件的软件。相反,控制台依赖于硬件开关:形状检测器可有效识别墨盒的类型,然后仅通过所需的总线供电。

在开始之前,您会发现该系统是SNES和Game Boy之间的混合体,图形核心仍然是著名的称为PPU的2D引擎。我建议您先阅读这些文章,然后再继续,因为我将重新审视许多以前解释过的概念。

与以前的Game Boys相比,我们现在有一个彩色LCD屏幕,该屏幕可以显示多达32,768种颜色(15位)。它的分辨率为240x160像素,刷新率约为60Hz。

96 KB 16位VRAM(视频RAM):其中64 KB存储背景图形,而32 KB存储子画面图形。

1 KB 32位OAM(对象属性存储器):最多可存储128个精灵条目(不是图形,仅是索引和属性)。其总线已针对快速渲染进行了优化。

1 KB 16位PAL RAM(调色板RAM):存储两个调色板,一个用于背景,另一个用于精灵。每个调色板包含256个15位颜色的条目,颜色“ 0”是透明的。

如果您已经阅读了以前的文章,尽管对GBA感到有些惊讶,但您会发现它对GBA很熟悉,并且请不要忘记该控制台使用两节AA电池供电。

我将借用Sega Sonic Advance 3的图形来显示框架的构成。

GBA的图块严格来说是8x8像素位图,可以使用16种颜色(4bpp)或256种颜色(8bpp)。 4bpp瓦片占用32个字节,而8bpp瓦片占用64个字节。

磁贴被分组为字符块。每个块都为特定类型的层保留。

由于每个字符块设计为可容纳16 KB内存,因此每个块最多可以存储256个8bpp瓦片或512个4bpp瓦片。分配了六个字符块,这些字符块总共需要96 KB的内存:该控制台具有的VRAM的确切数量。

自从Game Boy Color以来,该系统的背景层已得到显着改善。最后,它包括超级任天堂中的一些功能(还记得仿射变换吗?)。

PPU最多可以绘制四个背景层。每个人的能力将取决于所选的操作模式:

模式1:只有三层可用,尽管其中一层是仿射的(可以旋转和/或缩放)。

每层的宽度最大为512x512像素。如果是仿射,则最大为1024x1024像素。

Sprite的大小可以达到64x64像素宽,但是由于屏幕太小,它们最终将占据很大一部分。

如果这还不够,那么PPU现在可以将仿射变换应用于精灵了!

属性:包含x / y位置,h / v翻转,大小,形状(正方形或矩形),子画面类型(仿射或常规)和第一个图块的位置。

与往常一样,PPU会自动合并所有图层,但尚未结束!系统具有可应用于这些层的几个效果:

窗口化:将屏幕分为两个不同的窗口,每个窗口可以有自己单独的图形和效果,两个窗口的外部区域也可以提供图块。

另一方面,为了更新框架,有多个可用选项:

使用DMA控制器:DMA可将传输速率提高约10倍,并可在VBlank和HBlank期间进行调度。该控制台提供4个DMA通道(两个保留用于声音,一个保留用于关键操作,另一个保留用于通用)。请记住,控制器将在操作过程中暂停CPU(尽管几乎不会注意到它!)。

有时,我们可能想构成一个背景,瓷砖引擎将无法从中绘制所有必需的图形。现在,现代的控制台通过实现帧缓冲体系结构来解决此问题,但是当RAM& mldr很少时,这是不可能的。好吧,GBA恰好有96 KB的VRAM,足以分配具有我们LCD屏幕尺寸的位图。 。

好消息是,PPU实际上通过包括三个额外的模式(称为位图模式)来实现此功能:

模式5:有两个全彩色的帧,每个帧的大小减半(160x128像素)。

具有两个位图的原因是为了启用页面翻转:在显示的位图上绘制会在此过程中暴露出一些奇怪的伪像。相反,如果我们操纵另一故障,则不会向用户显示任何故障。一旦第二个位图完成,就可以更新PPU以指向第二个位图,从而有效地交换显示的帧。

总体来说,这听起来像是一项尖端功能,但是大多数游戏都采用了切片引擎。为什么?因为在实践中,它花费了大量的CPU资源。

您会看到,使用图块引擎时,CPU可以将大多数计算委托给图形芯片。相比之下,PPU提供的帧缓冲系统仅限于将该内存段显示为单个背景层,这意味着除非CPU计算出它们,否则就不再需要单独的仿射变换,分层或效果。而且,帧缓冲区占用80 KB的内存,因此只有16 KB(一半)可用于存储精灵图块。

因此,这些模式特别用于播放运动视频(完全依赖Game Boy Advance Video)或使用CPU渲染3D几何形状。

GBA具有2通道样本播放器,可与旧版Game Boy声音系统结合使用。

新的声音系统现在可以播放PCM样本,它提供了两个称为直接声音的通道,在这里它使用FIFO队列(实现为16字节缓冲区)接收样本。

样本为8位并带符号(以-128到127的值编码)。默认采样率是32 kHz,尽管这取决于每个游戏:由于更高的采样率意味着更大的尺寸和更多的CPU周期,因此并非每个游戏都会花费相同数量的资源来填充音频芯片。

DMA对于避免阻塞CPU周期至关重要。计时器也可用于与队列保持同步。

虽然Game Boy子系统不会共享其CPU,但它确实允许访问其PSG。出于兼容性的原因,这与原始Game Boy中的设计相同。我之前写过这篇文章,其中特别详细介绍了每个渠道。

大多数GBA游戏都将其用于伴奏或效果。后面的将优化其PCM音乐,而保留PSG不用。

即使GBA只有两个PCM通道,某些游戏仍然可以神奇地播放两个以上的并发样本。这怎么可能?好吧,尽管纸上只有两个通道似乎有些薄弱,但主CPU可以使用其某些周期来提供音频排序和混合(这应该让您了解ARM7的强大功能!)

有些游戏会进一步提升PCM-PSG的对偶性,并根据具体情况“替代”领先的芯片。

在此游戏中(母亲3),玩家可以进入两个不同的房间,一个相对普通,另一个带有怀旧背景。根据角色所在的房间,相同的分数听起来可能会有些现代或8位。

GBA的编程与SNES相似,另外还具有在2000年代初期开发游戏的所有优势:标准化的高级语言,更好的编译器,更快的RISC CPU,用于开发的非专有计算机,相对更好的文档和&mldr互联网!

游戏大多用C编写,而汇编中的关键部分(ARM和Thumb)可以节省周期。任天堂为SDK提供了库和编译器。 BIOS调用可简化I / O访问并减小盒式磁带的大小。

虽然ARM7具有32位地址总线,但仅24条地址线连接到卡式盒,这意味着无需映射器即可在卡式盒上访问多达16 MB的内存,但是官方文档指出32 MB的盒带数据映射到内存中。那这是怎么回事?事实是,Gamepak使用25位地址(这解释了32 MB的块),但是其最低位固定为零,因此仅剩下24位被设置。这就是Gamepak寻址的工作方式。

现在,这是否意味着将无法访问位于奇数地址(其最低有效位为“ 1”)的数据?否,因为数据总线是16位的:对于每次传输,CPU / DMA都会获取所定位的字节加上下一个字节,从而允许读取偶数和奇数地址。如您所见,这只是工程的另一项工作,它充分利用了硬件功能,同时降低了成本。

SRAM:这些需要电池来保存其内容,最大容量为64 KB。可通过GBA的内存映射进行访问。

闪存ROM:类似于SRAM,无需电池,最大容量为128 KB。

EEPROM:这些需要串行连接,并且理论上可以扩展到任何大小(通常最多8 KB)。

著名的Game Boy Link Cable提供了多种播放功能。此外,电缆还具有内部称为多重启动的特殊功能:另一个控制台(GBA或GameCube)可以将功能性游戏发送到接收器的EWRAM,然后后者从那里启动(而不需要盒带)。

一般而言,与其他游戏机制造商在使用CD-ROM时必须面对的不断的猫鼠游戏相比,专有盒带的使用是一个很大的障碍。

为了打击盗版墨盒(未经授权的复制品),GBA的BIOS引入了与原始Game Boy中相同的启动过程。

随着固态存储的价格越来越便宜,一种新型的盒式磁带出现在市场上。抽认卡看起来像普通的Game Paks,但增加了一个卡槽(SD,MiniSD,MicroSD或其他任何卡槽),可以运行游戏ROM。这个概念实际上并不是什么新鲜事物,开发人员内部使用了类似的工具,以便在真实的控制台上测试他们的游戏(制造商提供了支持该功能的硬件)。

但是,这些卡的商业可用性被证明是一个灰色地带:任天堂谴责其使用由于盗版,因为一些用户辩称盗版是运行Homebrew的唯一方法(程序是在游戏工作室之外制作的,因此未经任天堂批准) 。经过任天堂的法律尝试,这些墨盒在某些国家(例如英国)被禁止使用,但它们仍在全球范围内使用。

本文是控制台体系结构系列的一部分。如果您觉得有趣,请考虑捐款,您的捐款将用于获得更多工具和资源,以帮助改善当前文章和即将发表的文章的质量。

在此处跟踪了本文所需的工具和最新获得的列表:

##有趣的硬件(按优先级排序)-任何开发套件(仅当以合理的价格找到时)##使用的获得工具-原始GBA(£40)-本文分析的两款游戏(£20)

## 2020-09-19-更正了语法并增加了内容,谢谢@dpt-关于gamepak的25位寻址的扩展部分## 2020-08-22-澄清了瓷砖部分## 2019-12-09-偶数更好的Thumb解释。 -添加了更多音频信息。 ## 2019-10-03-改进了Thumb解释## 2019-09-17-添加了快速介绍## 2019-09-01-添加了我的GBA🧐## 2019-08-26-在某些解释中使用了更好的措辞# #2019-08-19-更正了小错误## 2019-08-18-准备发布