自从学习开发GBA后,便对其开发的容易性,效率为之吸引.

想必大家也是如此.

因为GBA开发多数是使用C语言的,

这里写一点基本的C语言的使用技巧.

希望能增加大家的内功.

1 对内存里的寄存器进行操作.

任何一个GBA开发库的GBA头文件都包含了很多由#define定义的符号.

如 #define VRAM 0x06000000 // VRAM

这里的VRAM是一个宏符号,后面的0x06000000是一个立即数

说明VRAM所代替的是0x06000000.

和变量不同的是,变量会占内存,而宏定义是不占内存的.因为宏只对编译器负责.

由于GBA是使用了统一编地址.所有逻辑功能部件都是直接连接CPU片总线

所以,GBA要对其他部件操作的时候,就如同操作内存一样容易.

下面讲一下如何直接对内存进行操作.

就拿VRAM来说,如果想对这个地址写入一个 8 位无符号数的话,可以如下操作.

*(u8*)VRAM = 0xff; // u8 是 unsigned char

也可以这样写

*(u8*)0x06000000 = 0xff

这样的操作在C语言中是合法的.相当与把一个指针直接指定地址后类型转换成U8然后对内容操作.

其结果是 06000000h 的位置为 0xff

如果你想写入一个u16的数的话,可以这样写

*(u16*)VRAM=0xaaff 或 *(u16*)0x06000000

其结果是 06000000h 为 0xff

06000001h 为 0xaa

以高位存放高地址,低位存放低地址的(大数端)原则存放数据.

当然,地址是固定的,如何使用就要看实际情况了.

上面这样的操作是GBA里最普遍的.由于98%的C语言的书上都没有提到这类用法,

所以在某种程度上,成了新手学习的绊脚石.

2 利用结构型直接对位进行定义名称.

结构型是C语言里极重要和普遍的定义数据的手段.

但是恰恰许多人对结构型了解不是很深入.

结构型的基本定义方式为

struct

{

u8 a,

u8 b;

u8 c;

u8 *d;

}mystr;

如此便定义好了一个结构,其中包括a,b,c三个U8类型的成员.和一个指针d

这个结构的大小是 3 * 8 + 16 = 40 bit. = 5 byte

因为一个指针的大小等于字长,GBA里多数情况下是用THUMB模式开发程序.故为16位.

然后到我们今天的重点.

举个例子,定义一个15bit颜色结构RGB ,其包含 R,G, B.是一共是16位.

格式为 a bbbbb ggggg rrrrr 最高位无用.

许多人会定义成

typedef struct {

U8 R,G,B;

}RGB;

这个结构占3字节,使用的时候用逻辑运算,压成一个16位的点的数据.

其实此操作太麻烦.

先进的定义方式是:

typedef struct {

u16 r : 5 ;

u16 g : 5 ;

u16 b : 5 ;

u16 dummy : 1 ;

}RGB;

此结构大小为 16bit 符合RGB的规则.

关键在于在成员变量的后面加上 冒号 和 定义的位数.就完成了直接给位进行定义名称.

其中 严格按照从低位到高位的原则,先定义这为低位.后面定义的会接在前面一个后面的位定义.

由于RGB定义完了,使用了15位,有最高位空闲,.所以定义个1位的DUMMY,防止浪费.

使用的时候和一般的结构型一样使用.不过如果数值超出范围的话,超出的部分无效.

如果这样定义

typedef struct

{

u8 a:5 ;

u8 b;

u8 c:4;

}ABC

那么这个结构仍然为3BYTE. 因为成员b没有说明是跟在a后面定义,而是另外重新定义一个成员.故

无法连在a后.

也就是说 a 的高3位就浪费了.

3 实例

就拿GBA里一个十分重要的寄存器DISPCNT来说

位于0x4000000 大小为16bit

头文件里定义为

#define DISPCNT 0x4000000

具体内容为

F E D C B A 9 8 7 6 5 4 3 2 1 0

W V U S L K J I F D B A C M M M

0-2 (M) = BG模式 0 ~ 5

3 (C) = Game Boy Color 模式

4 (A) = BG反转

5 (B) = hblnk

6 (D) = 1D 方式还是2D方式

7 (F) = MODE4中使用.用于检测是哪个FRAME有效.

8 (I) = BG0. 允许显示

9 (J) = BG1. 允许显示

A (K) = BG2. 允许显示

B (L) = BG3. 允许显示

C (S) = OAM 允许显示

E (V) = Window允许

F (W) = Sprite Windows允许

按照上面说的,可以如此定义结构.

typedef struct DispCnt{

u16 BgMode:3; // BG Mode Select

u16 CgbMode:1; // CGB Mode Select

u16 Bmp_FrameNo:1; // Bitmap Mode Display Frame Select

u16 Obj_H_Off:1; // OBJ Processing in H Blank OFF

u16 ObjCharMapType:1; // OBJ Character Data Mapping Type

u16 Lcdc_Off:1; // LCDC OFF

u16 Bg0_On:1; // BG 0 ON

u16 Bg1_On:1; // BG 1 ON

u16 Bg2_On:1; // BG 2 ON

u16 Bg3_On:1; // BG 3 ON

u16 Obj_On:1; // OBJ ON

u16 Win0_On:1; // Window 0 ON

u16 Win1_On:1; // Window 1 ON

u16 ObjWin_On:1; // OBJ Window ON

} DispCnt;

对其进行操作:

((DispCnt*) DISPCNT)->成员变量.

把DISPCNT的地址转换成DispCnt类型然后指针化,把这个指针操作其内部的成员.

这样够方便了把.不用理会那些麻烦的标志,和逻辑操作.

直接赋值就可以了.

(此种方法在99%的C语言书里也没提到过. ……..心寒)

由于GBA里类似的寄存器实在太多,请切记,上述方法使用不要过度.

否则一大堆指针,会占太多的内存.使可用的内存减少,造成资源短缺.

请一定要注意.

写完后,有点累了.希望能帮助大家进入GBA的开发圈子,提高自己的C语言内功.

HuangYZ

gba c语言编程,GBA开发C语言内功补习相关推荐

  1. 成都c语言编程培训机构,成都学c语言编程,成都学c语言编程去哪里,成都学c语言编程需要报培训班吗...

    成都学c语言编程,成都学c语言编程去哪里,成都学c语言编程需要报培训班吗 首页 > 软件 > 成都学c语言编程 作者:镀金池   发布时间:2018-09-28 14:20 近似带有序布局 ...

  2. c语言编程模拟选举,C语言编程题精选

    C语言编程题精选 C语言编程题精选 1. 编程实现对键盘输入的英文名句子进行加密.用加密方法为,当内容为英文字母时其在26字母中的其后三个字母代替该字母,若为其它字符时不变. 2. 编程实现将任意的十 ...

  3. 罗定c语言,罗定学c语言编程,罗定学c语言编程培训,罗定学c语言编程一般怎么收费...

    罗定学c语言编程,罗定学c语言编程培训,罗定学c语言编程一般怎么收费 首页 > 软件 > 罗定学c语言编程 作者:镀金池   发布时间:2018-10-04 23:40 依照c语言的法则, ...

  4. c语言编程技巧分析,C语言难点及编程技巧分析

    摘要:近些年信息技术发展迅速,社会需要大量专业的计算机人才,C语言是学习计算机知识的专业理论课程,能够为以后的学习打下专业基础.但目前C语言学习受到各方面因素的影响,学习效果不是很理想,很多时候即使努 ...

  5. 单片机c语言编程下载,单片机C语言编程.doc

    单片机C语言编程.doc 单片机C语言编程指令格式 功能简述 字节数 周期 一.数据传送类指令 MOV A, Rn 寄存器送累加器 1 1 MOV Rn,A 累加器送寄存器 1 1 MOV A ,Ri ...

  6. atmega16 c语言编程,ATmega16开发系统设计(附protel电路图和C语言程序)☆

    摘    要 本文所研究的单片机是Atmega16,这款单片机零售价低,货源充足:且具有16KB的Flash,能满足绝大部分的实际需要:它还支持JTAG仿真,特别适合AVR初学者和需要繁琐调试的低成本 ...

  7. c语言 编程 函数声明,C语言编程开发中的函数声明与定义

    函数功能的使用在许多编程开发语言中都是有不同的使用方法的,而今天我们就一起来了解一下,在C语言编程开发中的函数功能使用与定义. 对函数的"定义"和"声明"不是一 ...

  8. c语言编程课程心得,c语言编程课程设计心得.docx

    C语言编程课程设计心得 C语言编程课程设计心得 河南城建学院 <C语言程序设计>课程设计报告 适用专业工程管理专业课程名称C语言程序设计指导教师赵军民.魏新红.张芳芳 设计人:051409 ...

  9. c语言编程宝典pdf,C语言编程宝典之一.pdf

    C语言编程宝典之一 作者:王大刚 本人的<FOXPRO编程宝典之一>,<FOXPRO编程宝典之二>和<FOXPRO 编程宝典之三>系列软件在<电脑报>配 ...

最新文章

  1. eclipse 关联 Maven本地仓库的配置
  2. 普通用户程序使用保留端口 error while loading shared libraries
  3. es6 取数组的第一个和最后一个_ES6:解构——JavaScript 从数组和对象中提取数据的优雅方法...
  4. WPF企业内训全程实录(下)
  5. 强烈推荐,关于5G最深刻的一篇文!
  6. 大数据_Flink_流式处理_简介_流数处理的发展演变---Flink工作笔记0004
  7. JavaScript------表单约束验证DOM方法
  8. rails 开发随手记 9
  9. python基础知识01-数据类型和序列类型
  10. Maven之dependencyManagement
  11. Python爬取淘宝销量数据!这年头数据就是钱啊!
  12. SUSE Linux 网络配置
  13. python下拉菜单_python下拉菜单
  14. # MPU6050之2阶低通滤波,滤波效果非常好
  15. VSCode远程连接报错
  16. idea 中ctrl+shift+数字的作用
  17. Unity接入ChatGPT基于Python.Runtime的实现
  18. 副业案例-晴矢分享 短视频MCN亏损500W的总结的血泪经验
  19. 采购管理系统--合同、采购单、发货单、返厂单管理
  20. 删除笔记本电脑的EISA分区

热门文章

  1. MES系统在人员工时管理中的应用
  2. 痔疮后水肿该怎么办?
  3. 多模态预训练模型CLIP:中文版本开放使用
  4. 我的世界java最新更新_我的世界21w07a
  5. SpringBoot如何读取配置文件(@Value/@ConfigurationProperties/Environment)
  6. 【htpwdScan 是一个HTTP暴力破解、撞库测试工具。】
  7. 微软 Edge 浏览器无法调用 麦克风 原因及解决办法
  8. python-基于selenium库爬取微博关键词搜索内容
  9. ENSP-----VGMP与HRP协议---防火墙的双机热备
  10. 领铠服务器没有角色信息,王者荣耀英雄印记赠送功能出bug没显示怎么办 铠的印记消失出bug什么情况...