当前位置: 主页>GBA>硬件周边>  
GBA硬件规格与系统参数
时尚网

GBA硬件规格(第一部分CPU,内存)
原来想一口气把声音,输入控制,中断,DMA的例程都写出来,我的例程都是编译通过的。现在看来应该先把GBA的硬件规格先写出来。

GBA硬件规格(第一部分CPU,内存)
GBA系统由以下部分组成:
CPU -16.78MHz ARM/tdmi
内存-根据应用的情况,有8-11个内存分区,有的是只读的,有的是可写的,详细见后。
输入输出-系统提供了图形,声音,DMA,时钟,串行接口,按钮输入和中断等多个控制。

GBA的BIOS将整个内存分成了许多的区间,每一个区间都有严格的定义,它可能是主程序ROM和卡带RAM(如SRAM,FLASH ROM或EEPROM用于存取进度),类似6502,它的i/o是映射到内存上的,您要进行一个i/o操作只需操作特定的内存就行了。例如往地址0x4000000写0x0100就表示下一个图形操作将使用图形模式0的背景0.中断也是同样是通过BIOS来调用预先放在系统ROM中的子过程。

其它可以直接访问的内存区间有调色板RAM,图形RAM,和OAM(包含精灵属性)可能叫作物体属性内存更合适一些。

GBA的LCD刷新频率59.73hz,每一次刷新包含一个垂直写屏和一个垂直空操作阶段,每一个垂直写屏和垂直空操作阶段又是由许多水平写屏和水平空操作阶段组成,程序要改变当前屏幕内容要在垂直空操作或水平空操作中进行。

本来我想把GBA的CPU的硬件特性写出来,但一想对我们的程序影响不大,在中断和DMA操作中再接合例程讲为好。

下面是本篇的重头戏。内存分布:
系统ROM:
0x00000000-0x0003FFF
大小: 16kb
内存端口宽度: 32 bit
这个内存区间包含GBA的BIOS,是不可读的,任何读写该区间都会出错,您可以通过调用中断来调用其中的过程。

外部工作内存:
0x02000000-0x0203FFFF
大小: 256kb
内存端口宽度: 16 bit
这个内存区间可以暂时存放您的程序和数据,另外,一旦开机时接有多启动电缆,BIOS将自动找到它,并读取数据放到该区间同时从0x02000000开始执行,一般情况下是从0x08000000开始执行。

内部工作内存:
0x02000000-0x03007FFF
大小: 32kb
内存端口宽度: 32 bit
这个内存区间是整个GBA中最快的RAM,不过要使用它必须切换CPU工作模式,我不想把问题复杂化。作为一个入门的文档,还是简单点吧。

I/O映射内存:
0x04000000-0x040003FF
0x02000000-0x03007FFF
大小: 1kb
内存端口宽度: 32 bit
就是GBA开发中可能最复杂的部分,下一步我会专门分门类贴。简而言之就是实现各种图形,声音等等操作的地方。


调色板内存:
0x05000000-0x050003FF
大小: 1kb
内存端口宽度: 16 bit
这是专门存放16位色调色板信息的区间,分成512b的两个部分,0x05000000-0x050001ff为背景调色板。0x05000200-0x050003ff为精灵调色板区。每个部分包含一个256色调色板或16个16色调色板。这取决于精灵或背景的属性。

显示内存:
0x06000000-0x06017FFF
大小: 96kb
内存端口宽度: 16 bit
这个区间用于存放位图模式的图形数据,以及图案数据和属性。

OAM(物体属性内存)
0x07000000-0x070003ff
大小: 1kb
内存端口宽度: 32 bit
用于存放控制精灵的数据。

卡带内存:
开始地址:0x08000000
内存端口宽度:16 bit
结束地址取决于卡带容量。也是开机后开始行的地方,所以我们写的程序的开始地址应设在0x08000000上。

卡带内存映象1
开始地址:0x0A000000

卡带内存映象2
开始地址:0x0C000000

都只是上面卡带的映象,用于卡带中存在多种ROM时。

存盘区间1:
开始地址:0x0E000000
大小:0-64 kb
内存端口宽度:8 bit
用于SRAM和FLASH ROM存盘用。SRAM只能最大为32kb.

存盘区间2:
开始地址:0x0F000000
大小:0-128 kb
内存端口宽度:8 bit
用于EEPROM存盘用。

GBA硬件第二部分(i/oRAM之图形控制寄存器)上
GBA采用一个240X160的TFT,每帧刷新使用280896个cpu时钟周期。
一、图形模式:
GBA共用6种模式:分为两大类(位图模式和图案模式(或字符模式)),由显示控制寄存器的D2-D0决定。背景图形数据的组织于图形模式(图案模式,可放缩旋转图案模式,位图模式),精灵的数量也是由模式决定的,使用图案模式的图形模式可以有128个,而位图模式可能只有64个。
同时显示控制寄存器中,还控制了精灵于背景是否可以显示以及绘制(并不是所有图形模式都支持四个背景,具体情况后面会提到)。
模式0:可以拥有4个图案模式背景.
模式1:可以拥有2个图案模式背景(BG0, BG1)和一个可放缩旋转图案模式背景(BG2)。
模式2:拥有2个可放缩旋转图案模式背景(BG2 ,BG3)。
模式3:只拥有一个位图模式背景(16位色模式)数据放在0x06000000开始的显示内存区间每个点的数据结构(其实只有15位有定义)如下:
D0-D4: R
D5-D9: G
D10-D14:B
由于采用这种模式,每屏的数据量太大240X160X2,所以显示内存区间只能存放一页,意味着不支持页翻转技术。在DMA的例程中我们将使用DMA技术将数据从工作存储区间传输到显示区间。
模式4:这可能是最常用的一种模式,使用240X160的256调色板,位图数据开始于0x06000000与0x0600A000具体使用哪一个由图形控制寄存器的D3决定,调色板地址于第一部分所说的那样,是开始于0x5000000,可以看出它是支持页翻转的。
模式5:于模式3相似,是一个16位色模式,但它的分辨率为160X128,由于减少了分辨率现在显存中可以放入两页了,同模式4,图形控制寄存器的D3决定显示哪一页。

二、背景分类与细节:
图案背景:整个背景由许多的8X8的图案组成,数据地址由背景控制寄存器(每个背景一个),由于图案背景可以大到512X512像素即(64X64个图案)所以每个背景还有水平卷动坐标寄存器和垂直卷动坐标寄存器。特别的是,在图案背景中每个像素可以使用8位(256色)调色板和4位(16色)调色板。具体使用见后面中的、寄存器具体介绍。
可放缩旋转图案背景:整个背景同图案背景一样由许多图案组成,不同的是,它们可以放缩旋转,而且只能使用8位(256色)调色板。背景尺寸128到1024个像素。
位图背景:使用相对简单,但它只能有一层背景,而且由于图形数据量大,占用了一部分原来由精灵图案占用的内存,(0x6014000 - 0x6018000)导致精灵图案数量的减少。

图案背景的数据组成:
这里先给大家讲一下图案的原理和工作方式。这可能是大多数游戏机都采用的技术。大家可能玩过早期的任天堂游戏,可能发现许多场景好象有重复的地方,这就是图案的“功劳”对于象游戏机这样的产品不可能很大的内存用于数据的存储所以想出这么个办法,它把大的图形切成一定规格的图案,这样象大块的天空就可以用一个或几个小的图案组合而成,从而大大的节省内存。
对于GBA它的图案背景采用的就是这种方式,它在显示内存中划出一块用于置入图案的点阵信息(有可能采用16色或256色),另一块用于加入一个背景的图案排列信息(对于图案背景和可放缩旋转图案背景每个图案排列数据的结构是不同的)区别如下:
图案背景的图案排列数据的结构:
D0-D9:图案序号,通过这个序号可以找到图案的点阵信息,GBA就可以形成一个完整的图形。
DA:1表示水平翻转。
DB:1表示垂直翻转。
DC-DF:调色板的序号,对于16色图案可以有16个调色板选用。
可放缩旋转图案背景的图案排列数据的结构:
D0-D7:图案序号。
由于可放缩旋转图案背景只支持256色调色板,所以就不用再加上调色板信息,日本人可真会利用。

三、精灵控制(物体属性内存):
GBA支持128个精灵,最大尺寸可以到64X64。物体属性内存中的数据提供了每一个精灵的属性参数。
数据结构如下:
1.属性字0:
D0-D7:精灵的y坐标(单位:像素),对于一般精灵为左上角像素所在背景位置,对于旋转放缩精灵为中心点。
D8:旋转放缩效果打开。
D9:1表示允许精灵放大为原来的两倍。这是由于对于旋转情况下,精灵的四个角有可能超出原精灵的范围,如果这一项不打开,超出的部分会被剪掉。
DA-DB:00表示一般。
01表示半透明。
10表示窗口。
DC:允许马赛克效果。
DD:1表示256色,0表示16色。
DE-DF:用于于下一个属性字的DE-DF共同决定精灵的大小,这两位是低两位。
2.属性字1:
D0-D8:精灵的x坐标,具体解释同y坐标。
对于一般精灵来说:
D9-DB:没有使用。
DC:水平翻转。
DD:垂直翻转。
对于旋转放缩精灵:
D9-DD:决定了旋转角度的索引值(0-31)注意不是具体值,具体值要通过索引才能查到,具体见属性字3:
DE-DF:用于于上一个属性字的DE-DF共同决定精灵的大小,这两位是高两位。
具体组合如下:
0000: 8 x 8
1000: 8 x 16
0001: 16 x 16
1001: 8 x 32
0010: 32 x 32
1010: 16 x 32
0011: 64 x 64
1011: 32 x 64
0100: 16 x 8
0101: 32 x 8
0110: 32 x 16
0111: 64 x 32
3.属性字2:
D0-D9:图案序号。注意每一个索引指示一个32字节长的空间即一个16色精灵图案大小。其指示地址为0x6010000 + 图案序号*32。请注意由于位图模式占用了一部分精灵图案内存,所以序号从0x200-0x3ff。
DA-DB:级别,决定了精灵在画面中的显示顺序,对于同级别的精灵和背景,精灵优先。
DC-DF:调色板号对于使用16色调色板的精灵有效。
4.属性字3:
确切的说,这个字节是不属于任何一个精灵,它只是用于存放一个旋转放缩矩阵的四个参数中的一个,每四个相邻的精灵的四个属性字3组成一个旋转放缩效果,供属性字1的D9-DD索引调用。
其结构如下:
D0-D7:分数。
D8-DE:整数。
DF:符号。
现用如下符号代替各属性字,便于列出方程式。
DX:精灵0的属性字3,
DMX:精灵1的属性字3,
DY:精灵2的属性字3,
DMY:精灵3的属性字3,
DX = x_scale * cos(angle);
DMX= y_scale * sin(angle);
DY = x_scale * -sin(angle);
DMY = y_scale * cos(angle);
大家先把坐标变换的书看了先。
四、精灵图案点阵值的组成。
精灵图案也是放在显示内存中,但放在位置是0x06010000以后的位置,组成结构也是8X8大小,使用的是精灵调色板。对于256色精灵,每个图案64个字节,对于16色精灵,每个图案32个字节,再次重复一次,由于精灵索引只是指向一个32字节长大小的空间,所以对于256色精灵,开始的位置是(0,2,4……..)。
可能您会问,刚才你不是说精灵大小可以大到64X64,这很简单,最多8X8个图案组成啦。不过这里数据的组成又有所不同。
在我发的上一个贴子中,显示一个图中,显示控制寄存器的D6字节是一个1D模式选用,它就是用于精灵的组合啦。
他多儿吧(日语:举个例子):
对于一个16x16的索引号7的16色精灵来说,对于1D模式图案如下:

7 8
9 10
2D模式:
由于精灵行距为32个,所以图案组合变成:
7 8
39 40.
您在写入图案点阵数据时要注意了。
上一部分如果您还没有晕的话。您再看一下大胖子贴的水银教程,就可以大概了解图形的操作了。


下一部分是图形寄存器详解。您可以当手册用。

下一部分是图形寄存器详解。您可以当手册用。
0x4000000-(显示控制寄存器)
D0-D2:显示模式。
D3:GameBoy 模式。
D4:在位图模式中决定使用两页中的哪一页。
D5:用于在强制进行水平空操作。用于在一条扫描线上有许多精灵的情况时。
D6:决定精灵图案数据的安排方式。说明在前。
D7:强制进行垂直扫描空操作。比如在模式3中,数据太大,一定要加上空操作才能完整地传输出来。
D8:如果设置显示BG0。
D9:如果设置显示BG1。
DA:如果设置显示BG2。
DB:如果设置显示BG3。
DC:如果设置显示精灵。
DD:允许窗口1。
DE::允许窗口2。
DF:允许精灵窗口。

0x4000004-显示状态寄存器
D0:(只读)垂直刷新状态,当在垂直扫描时为0,垂直空操作时为1。
D1:(只读)水平刷新状态,当在水平扫描时为0,水平空操作时为1。
D2:(只读)垂直计数开关状态。
D3:垂直空操作中断允许,一旦设置,如果一个垂直空操作将产生一个中断。
D4:水平空操作中断允许,一旦设置,如果一个水平空操作将产生一个中断。
D5:垂直计数开关中断允许,一旦设置,如果垂直计数开关条件成立将产生一个中断。
D6-D7:未用。
D8- DF:垂直计数开关的计数。

0x4000006 垂直计数器:
这里存放着当前LCD所在扫的垂直位置,在垂直160线扫描后接垂直空操作68线。

0x4000008 – 背景0控制寄存器
0x400000A - 背景1控制寄存器
0x400000C - 背景2控制寄存器
0x400000E - 背景3控制寄存器
D0-D1:权、00最高,11最低。
D2-D3:图案数据开始地址:0x6000000+本值*0x4000
D6:马赛克特效开。
D7:调色板类型:1、256色调色板
2、16色调色板
D8-DC:背景图案排列数据地址:0x6000000+本值*0x800。
DD:用于旋转背景,一旦旋转后超出原图案部分的处理方式,
DE-DF:图案背景的尺寸:
00 : 256x256 (32x32 图案)
01 : 512x256 (64x32 图案)
10 : 256x512 (32x64 图案)
11 : 512x512 (64x64 图案)
可放缩旋转图案背景的尺寸:
00 : 128x128 (16x16 图案)
01 : 256x256 (32x32 图案)
10 : 512x512 (64x64 图案)
11 : 1024x1024 (128x128 图案)

0x4000010 – 背景0水平卷动坐标寄存器
0x4000012 - 背景0垂直卷动坐标寄存器
0x4000014 - 背景1水平卷动坐标寄存器
0x4000016 - 背景1垂直卷动坐标寄存器
0x4000018 - 背景2水平卷动坐标寄存器
0x400001A - 背景2垂直卷动坐标寄存器
0x400001C - 背景3水平卷动坐标寄存器
0x400001E - 背景3垂直卷动坐标寄存器
D0-D9:卷动值(单位:像素)。
DA-DF:未用。
它们决定了背景显示在LCD中左上角的背景像素的坐标。


由于只有背景2与背景3支持放缩旋转,所以只有它们才有如下的控制寄存器。
0x4000020 –0x4000026
0x4000030 –0x4000036
它们的数据安排都是一样的。
D0-D7:分数。
D8-DE:整数。
DF:符号位。
下面是具体的寄存器定义:
0x4000020背景2的DX解释同前中精灵的放缩旋转中DX的解释。
0x4000030背景3的DX解释同前中精灵的放缩旋转中DX的解释。
0x4000022背景2的DMX解释同前中精灵的放缩旋转中DMX的解释。
0x4000032背景3的DMX解释同前中精灵的放缩旋转中DMX的解释。
0x4000024背景2的DY解释同前中精灵的放缩旋转中DY的解释。
0x4000034背景3的DY解释同前中精灵的放缩旋转中DY的解释。
0x4000026背景2的DMY解释同前中精灵的放缩旋转中DMY的解释。
0x4000036背景3的DMY解释同前中精灵的放缩旋转中DMY的解释。
0x4000020背景2的DX解释同前中精灵的放缩旋转中DX的解释。
0x4000020背景2的DX解释同前中精灵的放缩旋转中DX的解释。

下面四个控制寄存器都是4个字节长。只能用于可放缩旋转图案背景的卷动。
0x4000028 - 可放缩旋转图案背景2的X卷动值
0x4000038 - 可放缩旋转图案背景3的X卷动值
0x400002C - 可放缩旋转图案背景2的Y卷动值
0x400003C - 可放缩旋转图案背景3的Y卷动值
D0-D7:分数
D8-D1A:整数
D1B:符号位
D1C-D1F:未用
同0x4000010-0x400001E一样决定了背景的卷动。不同的是,这个背景是可放缩旋转图案背景。注意也是指左上角,还有就是背景2也可以用于控制位图背景的卷动位置。

0x4000040 – 窗口0水平控制寄存器
0x4000042 – 窗口1水平控制寄存器
D0-D7右边框的X坐标
D8-DF左边框的X坐标

0x4000044 – 窗口0垂直控制寄存器
0x4000046 – 窗口1垂直控制寄存器
D0-D7底边框的Y坐标
D8-DF顶边框的Y坐标

0x4000048 – 窗口内含控制寄存器
D0 – 背景0在窗口0中
D1 – 背景1在窗口0中
D2 – 背景2在窗口0中
D3 – 背景3在窗口0中
D4 - 精灵在窗口0中
D5 – 窗口0内特效。
D6-D7 – 未用
D8 – 背景0在窗口1中
D9 – 背景1在窗口1中
DA – 背景2在窗口1中
DB – 背景3在窗口1中
DC - 精灵在窗口1中
DD – 窗口1内特效。
DE-DF – 未用
0x400004A – 窗口外延控制寄存器
D0 – 背景0在窗口外
D1 – 背景1在窗口外
D2 – 背景2在窗口外
D3 – 背景3在窗口外
D4 – 精灵在窗口外
D5 – 窗口外特效
D6-D7未用
D8 – 背景0在精灵窗口中
D9 – 背景1在精灵窗口中
DA – 背景2在精灵窗口中
DB – 背景3在精灵窗口中
DC – 精灵位于精灵窗口中
DD – 精灵窗口中特效
DE-DF 未用

0x400004C – 马赛克控制寄存器
D0-D3背景X尺寸。
D4-D7背景Y尺寸。
D8-DB精灵X尺寸。
DC-DF精灵Y尺寸。
用于控制背景和精灵的马赛克尺寸。

0x4000050 – 特效组合控制寄存器。
D0 – 混合背景0(源)
D1 – 混合背景1(源)
D2 – 混合背景2(源)
D3 – 混合背景3(源)
D4 – 混合精灵0(源)
D0 – 混合基础背景(GBA有一个全黑背景在所有背景之后)(源)
D6-D7 – 混合方式
00:无特效。
01:alpha混合。
10:增亮
11:暗化
D8 – 混合背景0(目的)
D9 – 混合背景1(目的)
DA – 混合背景2(目的)
DB – 混合背景3(目的)
DC – 混合精灵(目的)
DD – 混合基础背景(目的)
DE-DF未用

0x4000052 – 混合比例控制寄存器
于特效组合控制寄存器相配合,用于决定混合比例。
D0-D4源混合系数。
D8-DC目的混合系数。
比如对于ALPHA混合,源为12,目的为4,则最后效果为源像素值*12/16+目的像素值*4/16。

0x4000054 – 增亮暗化系数控制寄存器。
只有
D0-D4有效,为系数。
上面就是于图形有关的控制寄存器的说明,一般对于编程而言,它们都是用容易理解的符号来代替了,对它们的操作,很多也写成了函数的形式供调用。写这个主要是为了从根本上了解GBA,从而写出更好,更优化的程序。



GBA硬件系统介绍
作者:Roc, roc@163.com


声明:
本文章参考了任天堂 AGB Developers Kit Version 2.0,进行部分的翻译整理完成。
本文件可以全部或一部分地以任何的实体媒介或电子形式地被重制或散布,只要这份版权声明在所有的拷贝上被保留下来。商业性的再散布使用是被允许与鼓励的。然而,作者希望这样的散布使用前能被预先被告知
GBA作为GBC的新一代手掌游戏机,具有向下兼容GBC的特性。同时提供了更高的处理性能。
GBA装备了2.9英寸的反射型TFT彩色液晶屏和32位的RISC(精简指令系统)中央处理器。这使得在某种程度上其性能超越了超任(Super Nintendo Entertainment System)。

中央处理器:
32-bit RISC CPU (ARM7TDMI)/16.78 MHz
8-bit CISC CPU (兼容GBC)

内存:
系统只读存储器:16KB(2KB GBC专用)
工作内存:32KB+CPU内部专用 256KB
显存:96KB
精灵属性管理区:1KB
调色板:1KB
游戏容量:32MB

显示系统

分辨率:240 x 160
最大发色数:32768
硬件支持的特效:旋转/缩放,Alpha混合,淡入/淡出和马赛克效果
显示模式: 4

控制系统

A, B ,L ,R, START, SELECT, 方向键

声音系统

4声道,2CPU控制发声(PCM格式)
 

通讯系统

串行通讯

CPU单元结构图



GBA结构图



Little-Endian

GBA内存地址步长为一个字节。数据存放格式采用了Little-Endian编码(高字节放在存储区的高地址 ,低字节放在存储区的低地址。)

GBA内存映射



00000000h - 07FFFFFFh 是GBA的内部地址空间
08000000h - 0EFFFFFFh 是游戏ROM的地址空间

GBA内部存储结构

System ROM:从00000000h开始的16KB空间。存放了各种类型系统调用函数,主要是BIOS提供的功能接口。

CPU External Working RAM:02000000h开始的256KB空间。16位总线。

CPU Internal Working RAM:03000000h开始的32KB空间,用于存储游戏运行中的程序和数据。

I/O and Registers:存放了各种控制寄存器。

Palette RAM:05000000h开始的1KB空间,用于存放调色板信息。

VRAM:06000000h开始的96KB空间,存放BG(背景)和OBJ(精灵)数据。

OAM:07000000h开始的1KB空间,存放了OBJ(精灵)的一些显示属性。

 
 
延伸阅读
浣犺闂殑椤甸潰涓嶅瓨鍦
404閿欒
热点·今日头条

精彩推荐

热门视频 HOT VIDEO

《王国之心》最新影索尼+美女军团完胜
综合资讯 FORUM

美图下载 DOWNLOAD

《风云2》公映 特效将现次世代网游点评几款网游中最能囧人的征婚法子
台湾电玩新公主!瑶瑶众师妹如此甜美毕业那些年!一部让所有人流泪的漫画
这些经典有所怀念吗? 葫芦娃VS本拉登网博会火辣showgirl 使猛男鼻血狂流
   

Copyright 2004-2009 52384 Corporation, All Rights Reserved
本网站由52384版权所有