任天堂掌机GBA编程说明文档格式.docx
《任天堂掌机GBA编程说明文档格式.docx》由会员分享,可在线阅读,更多相关《任天堂掌机GBA编程说明文档格式.docx(50页珍藏版)》请在冰豆网上搜索。
2系统配置
2.1CPU框图
2.2完全框图
2.3内存设置和访问宽度
当操作游戏卡的程序使用16位指令(16位编译器),操作CPU内部工作内存的程序使用32位指令(32位编译器),能得到更高的执行效率。
2.4高位在前
IntheAGBCPU,memoryaddressesareallocatedin8-bitincrements,andlittle-endian
formatisusedinimplementingthe8-,16-,and32-bitaccesswidths.
3GBA内存
3.1内存映射图
下面是GBA系统整个的内存映射图。
3.2内存配置
内存地址的00000000h-07FFFFFFh区域被分配为GBA内部内存,08000000h-0EFFFFFFh被分配为游戏卡内存。
3.2.1GBA内部内存
1)系统ROM
从00000000h开始的16K字节是系统ROM。
不同类型的系统调用使用这段ROM。
2)CPU外部工作内存
从02000000h开始的256K字节是CPU外部工作内存。
这段内存是两个内存周期访问一次的,16位总线宽度。
3)CPU内部工作内存
从03000000h开始的32K字节是CPU内部工作内存。
这段内存用来保存程序和数据。
4)I/O和寄存器
这个区域是给寄存器使用的。
5)调色板内存
从05000000h开始的1K字节是调色板内存。
这段内存用来保存调色板。
6)VRAM
从06000000h开始的96K字节是VRAM。
这段内存用来保存背景和精灵数据。
7)OAM
从07000000h开始的32K字节是精灵属性内存(OAM),保存要显示的精灵和他们的属性。
3.2.2游戏卡内存
1)游戏卡ROM
从08000000h开始分配了3个32兆的游戏卡ROM空间。
这个三个空间可以设置不同的访问速度。
因此,他们被命名为“等待栈0”,“等待栈1”,“等待栈2”。
这样的设置可以更有效率的访问游戏卡内的不同访问速度的内存。
等待栈0的基地址是08000000h,等待栈1的基地址是0A000000h,而等待栈2的基地址是0C000000h。
另外,每个空间最顶端的1M位(注意不是字节)都是分配给Flash内存的。
这个区域主要用来保存存盘数据。
2)游戏卡RAM
从0E000000h开始的区域是游戏卡内存区域。
这个区域可以放置最大512K位(注意不是字节)的SRAM或者Flash内存。
然而这个区域的数据宽度是8位的总线。
由于这个设定,任何连接在这个区域的游戏卡设备必须用任天堂的库来访问。
3.3游戏卡内存等待控制
32M字节的游戏卡内存已经被映射在从08000000h开始的区域,然而从0A000000h和0C000000h开始的两个32M区域也是从08000000h开始的区域的映像。
这些映像使内存可以使用一致的游戏卡访问速度(1-4个等待时钟周期)。
[d15]游戏卡类型标志
系统ROM使用这个标志。
[d14]预读缓冲标志
当预读缓冲标志为1而且预读缓冲有剩余空间的时候,预读缓冲就可以在CPU不使用游戏卡总线的时候控制游戏卡总线,重复的读取游戏卡ROM的数据。
当CPU打算读取游戏卡上面的指令,如果击中预读缓冲,那么CPU可以完全不需要等待就取得指令。
如果预读缓冲没有击中,那么CPU就从游戏卡ROM取指令,那么等待时间取决于设定好的等待时间。
当预读缓冲标志为0,那么CPU总是从游戏卡内存取指令,等待时间取决于设定好的等待时间。
[d12-11]PHI中断输出控制
控制PHI中断是否输出,可以一直设定为00(没有输出)。
[d10-08],[d07-d05],[d04-02]等待栈等待时间控制
这三个区域可以分别设定等待时间(CPU时钟周期数)。
CPU时钟周期数和等待时间控制的设定之间的关系如下。
使用和你的设备恰当的设定。
系统ROM运行以后(用户程序开始时),等待控制的值是000。
如果游戏卡里面的MASKROM的规格是(第一次访问/3个周期),(第二次访问/1个周期)。
那么,需要把等待控制设定为101。
[d01-00]游戏卡RAM等待时间控制
游戏卡RAM内存的访问等待CPU时钟周期数也可以设定。
下面是等待时间控制的设定和时钟周期数的关系。
3.3.1访问时序
下面的时序图,先是如何访问游戏卡ROM,ROM规格是第一次访问/三个周期,第二次访问/一个周期的。
1)连续访问
2)随机访问
3.3.2游戏卡总线
游戏卡总线包括32个接口,如下表。
4LCD液晶屏
GBA使用2.9英寸宽的反射型TFT真彩LCD(液晶)屏幕。
GBA的垂直刷新空白间隔比DMG和GBC的都大,而它的水平刷新空白间隔是固定的。
4.1LCD状态
4.1.1垂直计数器
VOUNT寄存器可以被读取,以得到当前是正在渲染LCD228行中的哪一行。
数值范围为0-227。
数值为0-159表明正在渲染,数值为160-227表明正在处于垂直刷新空白间隔。
4.1.2LCD一般状态
从DISPSTAT寄存器的0到5位可以读取LCD的状态信息。
另外,LCD控制器可以产生三种中断请求。
[d15-08]垂直计数器设定
设定垂直计数器比对和垂直计数器符合中断使用的值。
范围是0-227。
[d05]垂直计数器符合中断允许标志
允许在当前渲染行数(VCOUNT寄存器值)等于设定值的时候,生成一个中断请求。
[d04]H-Blank(水平空白)中断允许标志
允许在水平空白时,生成一个中断请求。
[d03]V-Blank(垂直空白)中断允许标志
允许在垂直空白时,生成一个中断请求。
[d02]垂直计数器比对
这个标志表明垂直计数器设定值和垂直计数器寄存器值是否相等。
如果相等则标志值为1,如果不相等值为0。
[d01]H-Blank状态
检查是否处于水平空白间隔。
[d00]V-Blank状态
检查是否处于垂直空白间隔。
5图像系统
根据软件的需要,GBA可以使用不同的图像系统。
显示相关的项目主要是在DISPCNT寄存器设置。
[d15]精灵窗口显示标志
控制精灵窗口是否显示的主要标志。
关于精灵窗口的信息,参看“6.3OBJ精灵”
[d14][d13]窗口0,1的显示标志。
控制窗口0,1是否显示的主要标志。
关于窗口的信息,参看“8窗口特性”
[d12-08]屏幕显示标志
允许分别控制BG0,BG1,BG2,BG3和OBJ(精灵)是否显示。
[d07]强制空白
设定此位可以引起CPU强行停止图形处理循环程序,这样CPU可以访问VRAM,调色板内存,OAM和内部寄存器。
在强制空白期间,LCD显示一个白屏。
然而,内部水平垂直扫描计数器在强制空白期间仍会继续工作。
当内部水平垂直扫描计数器在显示期间取消强制空白的时候,显示会将在三根垂直线以后从头开始,。
[d06]精灵字符映射格式
设定VRAM里精灵字符的映射模式
设置为0代表精灵字符在内存中是二维映射的。
设置为1代表精灵字符在内存中是一维映射的。
关于精灵字符映射格式的信息,参看“6.3.2字符数据映射”
[d05]H-Blank(水平空白)间隔精灵处理标志
设定为0,允许在水平扫描间隔(包括水平空白间隔)进行精灵处理。
设定为1,只允许在显示间隔而不允许在水平扫描间隔进行精灵处理。
因此,当用户需要在H-Blank间隔期间访问OAM或者精灵VRAM内存的时候,应该设定1。
然而,在这种情况下,最大精灵显示数是无法达到的。
[d04]显示当前帧选择
当渲染带有两个帧的位图模式(背景模式4,5)背景时,这位用来选择要渲染的帧。
设定为0则选择第0帧,设定为1则选择第一帧。
[d03]GBC模式
GBA装有两个CPU。
在GBA模式下使用32位的RISC类型CPU,在GBC模式下使用8位的CISC模式CPU。
由于这位是系统控制的,所以用户不能访问这位。
[d02-00]背景模式
选择背景模式0-5。
关于背景模式的信息,请看下面的章节。
5.1背景模式
5.1.1背景模式的细节
在GBA中,根据需要可以选择字符背景模式和位图背景模式。
背景模式0,1,2下LCD屏幕的渲染是通过字符模式背景实现的。
背景模式3,4,5下LCD屏幕的渲染是通过位图模式背景实现的。
[注意]
模式3,只有一个帧的内存,可以显示32768色,适合用来显示静止图像。
模式4,5有两个帧的内存,使用用来渲染动画。
字符背景的滚动方法和背景的旋转/缩放和位图背景的滚动的方法有所不同。
(参看“6.1.8背景滚动”和“6.1.7背景旋转和缩放特性”)
5.1.2VRAM内存映射
VRAM的96K字节内存在不同背景模式下的映射方式如下图。
在模式0,1和2下用户可以把屏幕数据和字符数据区域映射在64K自己的背景区域里。
更多的信息,参看“6.1.3背景数据在VRAM的地址映射”。
另外,关于内存区域和每个区域数据格式的更多描述,请看后面的章节。
6渲染功能
GBA的CPU有96K字节大小的内建VRAM。
它的渲染功能包括了背景和精灵的显示能力。
不同背景模式有着不同的渲染方法,请看下面的描述。
6.1字符模式背景(背景模式0-2)
在字符模式下,背景屏幕的组成时8*8点阵的基本字符。
6.1.1背景控制
GBA系统共有四个背景控制寄存器,对应于背景屏幕数量的最大值(寄存器BG0CNT,BG1CNT,BG2CNT和BG3CNT)。
BG0CNT和BG1CNT是专用于字符背景输出控制的,而BG2CNT和BG3CNT也可以用于旋转缩放背景的控制。
背景模式使用的寄存器如下。
背景控制寄存器的内容如下。
1)输出背景控制(背景0,背景1)
2)输出背景和背景旋转缩放控制(背景2,背景3)
这些寄存器既可以是字符背景的控制,也可以是旋转缩放背景的控制。
BG*CNT[d15-14]屏幕大小
允许设定背景的屏幕大小。
当设定值大于最大值的时候,剩余的VRAM可以用来保存字符数据。
请参照下表和上面VRAM映射图。
1)字符背景窗口大小概述
2)旋转缩放背景的屏幕大小的图解
BG2CNT,BG3CNT[d13]区域越界处理
由于旋转缩放操作,显示屏幕可能会超越虚拟屏幕的边界,这个位设定用来选择,超出范围的区域是变成透明还是回绕。
关于缩放的信息,参看“6.1.7背景旋转和缩放特性”
BG*CNT[d12-08]屏幕起始块设定
设定VRAM里存储屏幕数据的起始内存块。
(32步:
0-31,步长是2K字节)
参看“6.1.3背景数据在VRAM的地址映射”
BG*CNT[d07]颜色模式
指定背景字符数据的颜色模式是16色/16个调色板,还是256色/1个调色板。
BG*CNT[d06]马赛克
打开或关闭背景的马赛克选项。
BG*CNT[d03-02]字符起始块设定
设定VRAM里存储字符数据的起始内存块。
(4步:
0-3,步长是16K字节)
BG*CNT[d01-00]背景间优先级
在缺省值下(所有的背景相同优先级),优先级顺序是背景0,背景1,背景2和背景3。
然而,这个顺序可以任意改变。
可以制定0(最高优先级)到3的数值。
背景优先级变化时,一定要小心使用点的颜色特殊效果。
6.1.2马赛克大小
马赛克的大小在MOSAIC寄存器设定。
打开关闭背景的马赛克需要设定相关背景控制寄存器的马赛克标志。
马赛克相关的信息,参看上一个章节,背景控制。
马赛克值制定多少个一般的点组成一个马赛克里的大点。
每个马赛克块的左上角的颜色就是整个马赛克快的颜色。
具体参看以下的表格。
如果马赛克大小为0,那么即使马赛克功能打开,那么也是正常的显示。
6.1.3背景数据在VRAM的地址映射
背景数据(背景字节和背景数据)保存在VRAM里64K字节的背景区域。
1)背景字符数据
背景字符数据的起点地址可以在BG控制寄存器字符起始块设定中指定。
存储的字符数据的总量取决于数据格式(颜色格式:
256色/一个调色板或16色/16个调色板)。
2)背景屏幕数据
背景屏幕数据的起点地址可以在BG控制寄存器屏幕数据起始块设定中指定。
存储的字符数据的总量取决于背景屏幕类型(字符背景和旋转缩放背景)和大小。
这些可以通过背景控制寄存器设定。
背景数据起始块图解
6.1.4字符数据格式
字符数据有两种格式,16色/16个调色板的,和256色/1个调色板的。
精灵和背景使用的字符都是相同的格式。
具体格式如下面的图表。
1)16色/16个调色板
每个地址保存两个点。
因此每个基本字符的总数据量是20H*8位。
2)256色/一个调色板
每个地址保存一个点。
因此每个基本字符的总数据量是40H*8位。
6.1.5背景屏幕数据格式
背景屏幕可以看作是8*8的基本字符单元组成的,而背景屏幕数据就是说明这些字符如何排列的数据。
背景屏幕数据应该在保存在以背景控制寄存器中背景数据起始块部分指定的地址为起点的内存区域里。
背景数据条目的数量由背景控制寄存器里的屏幕大小部分的设定决定。
字符背景的屏幕数据和旋转缩放背景的屏幕数据的格式在下面说明。
1)字符背景
字符背景的每个基本字符包括两个字节,可以设定1024个基本字符。
[d15-12]调色板
如果背景控制器的颜色模式设定为16色/16个调色板模式时,这些位用来设定该字符使用(0-15)哪一个调色板。
如果颜色模式为256色/一个调色板,那么这个设定是无效的。
[d11]垂直翻转标志
设定背景字符的垂直翻转。
设定为1,显示的时候背景字符进行垂直翻转。
[d10]水平翻转标志
设定背景字符的水平翻转。
设定为1,显示的时候背景字符进行水平翻转。
[d09-00]字符名
指定字符的号码,号码的计算从背景控制寄存器的字符起始地址块设定的地址为起点。
2)旋转/缩放背景屏幕
旋转/缩放背景屏幕每个基本字符占一个字节,可以设定256个字符。
字符数据必须设定为256色/一个调色板的模式。
对于旋转/缩放背景屏幕,背景控制寄存器的颜色模式设定无效。
[VRAM注意事项]
GBA在VRAM的背景区域的使用上提供了非常高的自由度。
因此,在VRAM的管理上,需要注意下面的要点。
1.背景字符数据有两种格式(16色和256色),而且它们可以一起使用。
2.背景字符数据起始块可以从4个块中选择(背景控制寄存器)。
3.背景屏幕数据起始块可以从32个块中选择(背景控制寄存器)。
4.每个背景都可以设定不同的屏幕尺寸。
5.字符背景和旋转缩放背景在可以在一个屏幕上一起显示。
在管理VRAM的时候,背景模式1尤其值得注意,因为背景模式1下,字符背景和旋转背景可能会一起使用。
因此,编程时,需要对VRAM的地址映射状态有充分的理解。
6.1.6背景屏幕数据在LCD上的地址映射
1)字符背景
1-1)虚拟屏幕尺寸为256*256
1-2)虚拟屏幕尺寸为512*256
1-3)虚拟屏幕尺寸为256*512
1-4)虚拟屏幕尺寸为512*512
2)旋转缩放背景
2-1)虚拟屏幕大小为128*128
2-2)虚拟屏幕大小为256*256
2-3)虚拟屏幕大小为512*512
2-4)虚拟屏幕大小为1024*1204
6.1.7背景旋转和缩放特性
背景的旋转缩放可以在整个背景屏幕的旋转下实现。
旋转的背景数据可以参看下面的图表。
GBA的旋转缩放是由下面的公式实现的。
模式2,3的旋转和缩放操作的参数在下面的寄存器中指定。
背景数据的起点寄存器也用来实现旋转缩放屏幕和位图屏幕的滚动。
背景数据的起点设定的寄存器
背景数据的方向参数的寄存器
背景旋转缩放处理的操作
1.首先用户设定屏幕左上角旋转/缩放操作以后的结果,然后把这个值设定为引用背景数据的起点,设定在BG2X_L,BG2X_H,BG2Y_L,BG2Y_H,BG3X_L,BG3X_H,BG3Y_L,BG3Y_H等寄存器。
这个值设定为有符号的定点实数(8位作为小数部分,19位作为整数部分,1位作为符号位,总共是28位)。
引用背景数据方向在BG2PA,BG2PB,BG2PC,BG2PD,BG3PA,BG3PB,BG3PC,BG3PD等寄存器设定。
这个值也是定点实数(8位作为小数部分,7位作为整数部分,1位作为符号位,总共是16位)。
2.图形处理程序计算前面设定的引用背景数据起点相关的X轴向的增量(dx,dy)的和,计算出X轴坐标。
3.当处理到下一条线的时候,计算Y轴向的增量(dmx,dmy)的和,然后进行第二步的处理。
4.然而,如果在H-Blanking间隔期间改写背景数据引用的起始地点,那么Y方向的和就不会被计算。
CPU通过这个模式来改变每条线的中心坐标和旋转缩放参数。
显示区域越界处理
当显示屏幕由于旋转缩放操作超出了虚拟屏幕的边界,那么可以在背景控制寄存器里设定,发行越界的时候是超出部分是透明还是回绕。
关于背景控制的信息,参看“6.1.1背景控制”
6.1.8背景的滚动
对于每个字符背景屏幕,可以以点为单位设定偏移量。
偏移量寄存器仅用于字符背景。
为了在旋转/缩放背景和位图模式背景里面使用偏移显示功能,需要设定引用背景的起点。
参看“6.1.7背景旋转和缩放特性”。
偏移量设定寄存器
6.2位图模式背景(模式3到5)
在位图模式下,背景屏幕的组成部分是以点为单位控制的,VRAM(帧缓存)的内容显示出来也就是屏幕上面点的颜色。
6.2.1背景控制
位图背景将被看作BG2。
因此,为了在LCD上显示帧缓存中的内容,你需要在DISPCNT寄存器设定BG2显示标志为ON。
为了控制背景需要使用BG2CNT寄存器。
BG2CNT[d06]马赛克
这个位控制BG2的马赛克处理是否打开。
打开的时候,还需要设定马赛克大小寄存器。
关于马赛克的信息,参看“6.1.2马赛克的大小”。
BG2CNT[d01-00]背景的优先级
由于实际上位图模式只有一个背景平面(除了backdrop平面),所以没有所谓的背景间的优先级,但是你可以设定背景和精灵间的优先级。
参见“精灵和背景的优先级”。
6.2.2背景旋转和缩放
位图的旋转和缩放主要使用BG2相关寄存器(BG2X_L,BG2X_H,BG2Y_L,BG2Y_H,BG2PA,BG2PB,BG2PC,andBG2PD)。
关于旋转缩放参数,参看“6.1.7背景旋转缩放特性”
对于位图背景,如果显示部分由于旋转缩放超过了屏幕边缘,那么这些区域会变成透明的。
6.2.3点阵数据
在位图模式下,只有显示屏幕尺寸的点阵数据才能保存在VRAM里。
GBA提供的位图模式可以显示连续色调的32768色(背景模式3和5)和32768色中的256色(背景模式4)。
不同模式在帧缓冲中保存的数据有不同的格式,将在下面描述。
1.32768色连续色调显示格式(背景模式3和5)
调色板内存无效。
每个点使用半个字(译注:
ARM7的字长是32位,半字为16位)。
2.256色显示格式(背景模式4)
需要调色板。
每个点用一个字节。
6.2.4点阵数据在LCD上的地址映射
下面可以看到,不同的背景模式有着不同的地址映射。
帧缓冲(VRAM)的起始地址为06000000h。
6.2.4.1背景模式3(32768色,240*160点,一个帧缓冲)
因为这个模式只有一个帧缓冲,所以这个模式主要用来显示静态图片。
然而,它可以显示全屏的连续色调的32768色。
6.2.4.2背景模式4(256色,240*160点,两个帧缓冲)
这个模式在VRAM里面分配了两个帧缓存,所以这个模式适于播放全动态的视频。
从32768色里,有256色可以连续色调的全屏显示。
1)帧缓存0
2)帧缓存1
6.2.4.3背景模式5(32768色,160*128点,两个帧缓冲)
虽然这个模式有两个帧缓冲,可以显示32768色,但是这个模式的显示区域不是全屏。
1)帧缓冲0
2)帧缓冲1
6.3OBJ精灵
6.3.1OBJ功能
不管任何背景模式,精灵都是字符模式的。
但是不同的背景模式决定了基本字符的数目。
项目
功能
颜色数
16色/16个调色板256色/一个调色板(可以混合显示)
精灵数
模式0-2:
1024(16色/16个调色板)
512(256色/一个调色板)
模式3-5:
512(16色/16个调色板)
256(256色/一个调色板)
字符大小
8*8-64*64(12种类型)
同屏最大数目
128(64*64)
同线最大数目
128(8*8)
特殊效果
垂直水平翻转,半透明,马赛克,优先级,精灵窗口
同一扫描线的精灵显示能力
单线精灵显示能力是保证最大效率的能力,具体数值在下面的表格体现。
当显示的精灵从OAM的第一个开始连续排列的时候,你可以用下面的公式计算同一扫描线可以显示的精