文章目录

  • 1.关于GBA的一些背景知识
  • 2.GBA程序开发准备
    • 2.1 GBA编译器 - Arm Gcc || ArmSDT
      • 2.1.1 GBA开发包 - DevKitAdv
    • 2.2 GBA模拟器 - VisualBoyAdvance
    • 2.3 图形转换工具 - kaleid_1-2-3
    • 2.4 声音转换工具 - wav2gbac.exe
  • 3.第一个GBA程序:Hello World
    • 3.1 helloword.h
    • 3.2 main.c
    • 3.3 make.bat
    • 3.4 Makefile
    • 3.5 编译文件
    • 3.6 生成main.gba

貌似这年头关于GBA开发的教程都快绝迹了。。。
本文是基于 https://www.cnblogs.com/BG5SBK/archive/2006/07/19/454224.html 的内容,对细节地方进行了再次整理
(其实上面的链接也是转载,但链接里面的真实原文链接早已失效,只剩下了转载的GBA教程。。。)
鉴于原文中提及的许多链接均已失效,我就挑些重点说一下

PS:博主的操作系统是win10 64位的,但是有一个VMware~于是在虚拟机里面装了一个Ubuntu和一个32位的Win7~Ubuntu比较容易安装,关于Windows的安装方法详见:https://blog.csdn.net/u012230668/article/details/81701893所以在下文的测试中我会在三个环境中跳来跳去~请不要介意。。。但所有实质性的内容都可以在win10系统内完成,请放心食用~另附此次项目的源代码:https://github.com/The-Third-Float/GBA/tree/master/HelloWorld

1.关于GBA的一些背景知识

Game Boy Advanced(GBA)是日本任天堂公司于2001年推出的一款32位掌上游戏机。它着重于游戏机的便携式,并且以2D游戏为主(3D游戏依然不错)。GBA有十分高效硬件图像处理加速,GBA基本上是现在全球公认的最佳的掌上游戏机

GBA的硬件功能十分多。它的CPU是以RISC为基础的32位ARM CPU,主频是16.78MHz。屏幕最大支持240x160的16位真彩色显示。在图形处理方面GBA还另外提供了硬件加速,支持硬件上的图形旋转,缩放,alpha混合,face in/out淡入淡出等

GBA的软件开发主要是以C语言为主,程序设计简单而且十分自由,也正是这一点吸引了许多爱好者在GBA上做东西(不一定是游戏)。你完全可以把它做成PDA,做成Mp3播放器(它的声音处理方面能力也不错哦),做成随身电影播放齐,做成电子词典等,只要你有能力设计它的软件

2.GBA程序开发准备

GBA开发所需要的东西除了一台可以用的电脑外,主要就是一个编译器和一个GBA模拟器

GBA程序开发可以用汇编语言和C/C++语言来写程序,不过汇编语言比较复杂,而且不是我们平常使用8086汇编,而是Arm汇编。任天堂公司可能觉得C++程序运行消耗太大,不推荐C++语言来开发,所以我们都一直将C语言作为首选

2.1 GBA编译器 - Arm Gcc || ArmSDT

GBA开发所用的C语言编译器主要有两种:一种是免费的gcc,一种是Arm公司提供的ArmSDT

这里的gcc不是简单的linux下的gcc,而是Arm Gcc。简单地说就是把我们平时常见的gcc改造成生成ARM CPU代码的gcc;ArmSDT是Arm公司提供的专门为ARM CPU的开发程序的C语言编译器,它的编译速度和质量上都比免费的gcc要高,但对C语言的支持不及gcc好(gcc毕竟已经成了C语言编译器的标准),最关键的问题它不是免费的,但是它的免费测试版还是可以用的

Arm Gcc:这里提供三种方法来配置编译环境

  • 我们可以在linux下自己去配置Arm Gcc,相关教程:https://blog.csdn.net/xiaohua0877/article/details/78615897
  • 我们也可以从cygwin(在windows下模拟UNIX的工具)中得到在windows下运行的gcc.你可以根据这个cygwin下的gcc,自己去配置Arm Gcc
  • 也可以直接去下载个配置好了的Arm Gcc。比如DevKitAdv,DevKitAdv大概10多MB。有了它,你用不着去找什么cygwin(200-300MB)和配置什么Arm Gcc了,DevKitAdv已经帮你做好了一切,你只需安装它就OK了。DevkitAdv的下载地址: https://sourceforge.net/projects/devkitadv/files/

ArmSDT:你可以到Arm公司的网站去下载ARMSDT2.51. http://www.arm.com

2.1.1 GBA开发包 - DevKitAdv

DevKitAdv 主要包括两部分:一是GCC++编译器,二是 GBA库

GCC++编译器功能和我们常用的VC差不多,只不过少了个编辑源代码的文本编辑器,还有就是不支持类(class),只能用struct来替代。它的作用是把我们写的代码编译成二进制的可执行文件,当然这个可执行文件是相对GBA和GBA模拟器而言的。就象Windows里的EXE文件无法在Mac机上使用是一样的道理;

GBA库提供了图像,控制及声音一系列的函数,和GCC++配合使用。

下载并安装DevKitAdv开发包到C:\devkitadv-r5-beta-3目录(注:若目录位置不是这个的话还需要设置环境变量
需要注意的是在 https://sourceforge.net/projects/devkitadv/files/Windows/Release 5 (Beta 3)/ 地址中有许多文件,我一开始也不知道下载那个,实际上是每个版块都有各自的功能,建议把全部的文件都下载下来,然后依次解压到C盘中:


解压完毕后即可测试程序是否可以正常执行,进入该目录运行DevKit-Advance-R5-Beta-3.lnk文件,此时会出现蓝色的console控制台窗口,在窗口中输入命令:

cd  testsuite
make


之后就开始编译testsuite项目并生成agbmain.bin、agbmain.elf等文件,此时就可以先使用模拟器VisualBoyAdvance(下文有下载地址)运行其中一个文件,效果如下:

以上程序按Enter键(即GBA模拟器里的START键)可以重复那个刷代码的动画。至此,编译环境配置成功!


2.2 GBA模拟器 - VisualBoyAdvance

这个模拟器目前还有很多地方都可以下载,推荐两个下载地址:

  • 一个是在我想玩《口袋妖怪》的时候,从豆瓣上面找到的:https://ali128.ctfile.com/fs/pMw162979103
    顺便发一下豆瓣原文链接:https://www.douban.com/group/topic/94386022/
  • 一个是在GBADEV上的资源:http://www.gbadev.org/tools.php?showinfo=209
    这里着重说一下在GBADEVhttp://www.gbadev.org/这个网站上的操作:


编译器和模拟器都装好后,下面我们需要一批小工具,主要就是帮我们转换图片,声音等数据.GBA程序编译后通常都是一个rom文件,图像和声音等数据都是包含在主程序里的.这些工具能把我们电脑上的图片或声音文件转换成一个*.h头文件,然后包含在主程序里编译.关于这种转换工具也是有许多,我推荐的图形转换工具是kaleid_1-2-3,它可以转换我们平时用的BMP文件.声音转换工具是wav2gbac.exe,它可以转换我们平时用的WAV文件.

它们的下载方式都与VisualBoyAdvance相同,在 http://www.gbadev.org/ 上下载


2.3 图形转换工具 - kaleid_1-2-3

http://www.gbadev.org/tools.php?showinfo=132
需要注意的是kaleid能否正常运行和32位系统还是64位系统没什么太大的关系(亲测)
但是有一个很关键的因素会导致最后无法导出*.h文件,那就是对图片的要求一定要是:256色的bmp图片


2.4 声音转换工具 - wav2gbac.exe

http://www.gbadev.org/tools.php?showinfo=189

3.第一个GBA程序:Hello World

现在我们开始我们的第一个GBA程序,在这个程序中我们将在屏幕上显示一张名叫 “Hello World!” 的图片
首先,咱们新建一个文件夹。(最后文件夹里面要有三个文件:一个是helloword.h,另一个是main.c,最后一个是编译文件make.bat或者Makefile

3.1 helloword.h

首先打开Windows自带的画图工具,画一张美美哒图片 (PS:一定要是256色的bmp图片)

然后打开刚才下载的Kaleid_1-2-3程序,选中菜单File中Open,打开这个bmp图片文件,再选中菜单File中Convert and Save,出现以下对话框:

点击Convert and Save按钮后就会生成一个*.h文件,我们就将它命名为helloworld.h
这边我把文件用vim打开查看了一下具体内容,实际上就是声明了 helloworld_pal 和 helloworld_gfx 两个常量,里面的数据全是数组,描述的内容就是图片中每个像素点的具体颜色

//256 Color Bitmap Graphics, 520x336const u16 helloworld_gfx[87360] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,0xFFFF,
... ...
0x4210,0x001F,0x03E0,0x03FF,0x7C00,0x7C1F,0x7FE0,0x7FFF,
};
//Palette, Colors Used: 256
const u16 helloworld_pal[256] = {0x4210,0x001F,0x03E0,0x03FF,0x7C00,0x7C1F,0x7FE0,0x7FFF,
... ...
0x4210,0x001F,0x03E0,0x03FF,0x7C00,0x7C1F,0x7FE0,0x7FFF,
};

3.2 main.c

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;#define REG_DISPCNT *(u16*)0x04000000  // 显示寄存器地址
#define VRAM 0x06000000  // 图像缓冲区地址
#define PALETTE 0x5000000  // 调色板地址
#define MODE_4 0x04  // mode4标志
#define BG2_ENABLE 0x0400  // BG_2标志
#define SetMode(Mode) REG_DISPCNT=(Mode) // 设置显示模式的宏定义#include "helloworld.h"  // 包含图像调色板和数据的头文件u16* palette_mem=(u16*)PALETTE; // 系统调色板u16* video_buffer=(u16*)VRAM; // 图像缓冲区
void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data);int main()
{// 设置屏幕模式,这里使用MODE_4SetMode (MODE_4 | BG2_ENABLE); // helloworld_pal和helloworld_gfx是在"helloworld.h"定义的调色板和图像数据数组名Draw((u16*)helloworld_pal,(u16*)helloworld_gfx,palette_mem,video_buffer);// 死循环while(1){ ;}
}// MODE_4绘图函数
void Draw(u16* src_palette,u16* src_data,u16* dst_palette,u16* dst_data)
{int loop,x,y;// 写入目的调色板for(loop = 0; loop < 256; loop++)dst_palette[loop] = src_palette[loop];// 写入图像缓冲区for(x = 0; x < 120; x++)for(y = 0; y < 160; y++)dst_data[(y) *120 + (x)]=src_data[(y) *120 + (x)];
}

3.3 make.bat

建立一个编译批处理命令make.bat来帮我们编译生成目标代码 (3.3 和 3.4 二选一即可)

写入下面的命令到一个新建的make.bat文件里面

PATH=C:\devkitadv-r5-beta-3\bin;%PATH%gcc -lm -o main.elf main.cobjcopy -v -O binary main.elf main.binpause

3.4 Makefile

建立一个编译批处理命令Makefile来帮我们编译生成目标代码 (3.3 和 3.4 二选一即可)

写入下面的命令到一个新建的Makefile文件里面

CC=arm-agb-elf-gcc
OBJCOPY=arm-agb-elf-objcopy
NAME=mainall: main-binmain-bin: main-elf$(OBJCOPY) -v -O binary $(NAME).elf $(NAME).binmain-elf: $(CC) -lm -o $(NAME).elf $(NAME).cclean:rm -f *.elf *.bin

到这一步我们的GBA文件就全部写好了,接下来就需要编译文件了。

3.5 编译文件

我们先尝试下,若在Linux系统下用自带的gcc来编译会发生什么情况:

这里我们可以看到:
gcc编译可以通过,但是生成的文件并不能正常运行;
而使用make命令时,由于没配置Arm Gcc,同样无法编译。

接下来我们使用DevKitAdv来编译这个文件:

PS:如果编译文件是make.bat的话,双击亦可执行:

编译成功!此时我们可以看到原来的文件夹中多出了 main.bin 和 main.elf 两个文件

此时我们使用模拟器VisualBoyAdvance运行一下任意一个文件,但是会发现显示的图片有点奇怪:

很明显,这个图片是原图Hello的其中一部分,博主怀疑是原图画的太大所造成的这个错误。于是博主重复上述动作又画了一副比较小的bmp图像,测试到的结果如下:


测试成功!至此,GBA 上的 mode4 下第一个程序终于做出来了,撒花~

3.6 生成main.gba

这里补充一下,我们最后玩的像《口袋妖怪》之类的游戏拓展名都是*.gba,要想最后能生成可执行的GBA文件其实很简单,就只要把Makefile里的 $(OBJCOPY) -v -O binary $(NAME).elf $(NAME).bin 改成 $(OBJCOPY) -v -O binary $(NAME).elf $(NAME).gba ,或者把make.bat里的 objcopy -v -O binary main.elf main.bin 改成 objcopy -v -O binary main.elf main.gba 即可。

GBA开发入门:做一个名叫Hello World的游戏相关推荐

  1. Java开发入门教程!java破解版游戏免费下载

    前言 在网络技术中基于浏览器的B/S结构无论在PC端还是手机端都充当着至关重要的角色. PC端自不必说,手机中很多应用虽然是以APP的形式存在,但它采用的还是B/S结构.如今日头条.微信的朋友圈等,这 ...

  2. [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏

    阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识. 本文通过实例教大家来开发去中心化应用,应用效果如图 ...

  3. 游戏开发入门(一)游戏开发概述

    视频链接:游戏开发入门(一)游戏开发概述(3节课 时常:约1小时03分钟) 该视频围绕电子游戏的发展与开发简单介绍了一些基本常识,同时提出并解决了几个问题 笔记与总结(请先学习视频内容): 1.游戏机 ...

  4. GBA程序开发入门1

    GBA程序开发入门 1.GBA简介 Game Boy Advanced(GBA)是日本任天堂公司于2001年推出的一款32位掌上游戏机.它着重于游戏机的便携式,并且以2D游戏为主(3D游戏依然不错). ...

  5. linux如何将图片转为gba数组,GBA 开发简单入门

    GBA 开发简单入门 一. GBA开发包--DevKitAdv 简介 DevKitAdv 主要包括两部分,一是GCC++编译器,二是 GBA库. GCC++编译器功能和我们常用的VC差不多,只不过少了 ...

  6. 大数据开发是做什么的?怎样入门?

    其实现在有很多小伙伴看中了大数据的发展前景,但是其实不知道大数据开发具体是做什么的,又该怎么学习?学习了之后又该做什么? 下面具体给你分析下大数据开发是做什么的,又需要学习和掌握哪些技能~ 大数据开发 ...

  7. 掌上游戏机开发指南——GBA程序开发入门

    1.GBA简介 Game Boy Advanced(GBA)是日本任天堂公司于2001年推出的一款32位掌上游戏机.它着重于游戏机的便携式,并且以2D游戏为主(3D游戏依然不错).GBA有十分高效硬件 ...

  8. GBA程序开发入门3

    下面我将一一讲解上篇的程序 前三行: typedef unsigned char u8; typedef unsigned short u16; typedef unsigned long u32; ...

  9. GBA 开发简单入门

    1.为什么要选用GBA作为嵌入式系统学习平台 我们知道,任天堂公司的GameBoy Advance(简称GBA)一款非常出色的掌上游戏机,该产品占领了全球90%以上的掌上游戏机市场. 抛开游戏功能不说 ...

最新文章

  1. win2008server设置问题
  2. 最近工作好忙,自己的软件又得落下很长一段时间了~
  3. 关于云计算 你所知道的可能不是真的
  4. Python编程基础:第五十六节 filter函数Filter
  5. xfce中仿gnome的多桌面的xfdashboard的用法
  6. java写一个服务定时采集数据_java实现定时任务解决方案
  7. Ubuntu14.04配置python接口,测试的小问题
  8. 大数据思维是企业互联网化的思维内核
  9. python 语音识别接口_python实现阿里云语音识别api
  10. 680.验证回文字符串(力扣leetcode) 博主可答疑该问题
  11. msdn系统镜像下载
  12. 微信小程序 - 快速搭建微信小程序demo
  13. ubuntu libxml2 使用
  14. 索尼1a dac插电脑用什么驱动。在哪下载,求助
  15. 针对校园LAN的OpenFlow和软件定义网络
  16. 永恒python+6_永恒中心 – Eternal Center
  17. darknetYolov3图片的分类计数、置信度以及输出xmin,xmax,ymin,ymax的结果
  18. FILEminimizer Office,FILEminimizer Suite和FILEminimizer Server常见问题FAQ合集(一)
  19. NVIDIA CUDA Toolkit 各个版本安装方式
  20. 西安达刚公路机电科技有限公司董事长李太杰简介

热门文章

  1. 情人节,写给每一位单身朋友,愿早日脱单
  2. java 计算矩阵行列式_Java 矩阵行列式算法(非高斯消元)
  3. 训练AI数据模型所需要的高性能计算机配置
  4. 检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。
  5. python 西门子触摸屏通讯_详解博途编程实现S7300与西门子触摸屏通讯
  6. Android 日志打印工具类 可显示打印所在的方法和行号
  7. 工业控制计算机硬件基础知识,第五章 工业控制计算机及其接口技术知识 机电一体化课件.ppt...
  8. @Autowired的这些骚操作,你都知道吗
  9. 5G时代来临,为什么说获益最大的是工业互联网?
  10. HDU-1248 寒冰王座 完全背包