芒果爱吃胡萝卜 - GBA
type: channel
link: http://blog.mangolovecarrot.net/tag/GBA/
items: C51贪吃蛇移植到GBA上01-GBA游戏编译环境以及代码移植注意点

C51贪吃蛇移植到GBA上01-GBA游戏编译环境以及代码移植注意点
type: item
date: 2022-04-04T09:43:00+08:00
description: 实机效果这个是用GBA烧录卡在NDSL上运行的样子。下方的按键说明是原来C51平台上用的（那个开发板只有3个按键），后面会删掉。贪吃蛇的源码已开源（EmbSnake）https://gitee.com/slipperstree/EmbSnakeEmbSnake是一款贪食蛇游戏。主要面向嵌入式环境，模块化设计，分离了设备相关性。只需要针对特定的设备实现一些必要的函数就可以很快移植到你的平台上。根据需要可剪裁各种功能以适应各种MCU的可用储存空间（ROM）。包含了C51某开发板的一个实现版本。这个GBA版也是基于那个版本移植的。等GBA版本移植的差不多了也会推到仓库中作为sample之一。GBA游戏编译环境安装devkitPro （https://devkitpro.org/）代码编辑推荐vscode，通过配置可以实现配合GBA模拟器打断点调试 （https://www.youtube.com/watch?v=Rj0lf46iljc）使用tonclib框架tonclib是基于devkitPro编译环境的一套第三方GBA框架，包装了很多功能函数。而且，个人觉得tonc的教程是最完整的。tonclib相关资源示例ROM (v1.4.2): tonc-bin.zip示例源码 (v1.4.2): tonc-code.zip官网教程 (v1.4.2): tonc-website纯文字版教程 (v1.4.2): tonc-text.zip电子书格式版教程 (v1.4): tonc.chmPDF版教程 (v1.4.2): tonc.pdf使用tonc注意点编译tonc的示例源码你可能会遇到这个错误 tte_main.c:(.text+0x240): undefined reference to __ctype_ptr__这是因为预编译好的tonclib二进制文件不适用最新版本的devkitPro你需要手动编译一次tonclib文件夹。不用害怕，进入code/tonclib文件夹后执行一次make就好了。你还可能碰到这个错误: make: gbafix: No such file or directory这是因为tonc的makefile里面用到了一个外部工具gbafix用于修复gba文件的头部使其能在gba硬件上运行。这个小工具的位置在devkitPro安装路径下的tools/bin目录中。你只要在makefile顶部添加一行PATH := $(DEVKITPRO)/tools/bin:$(PATH)代码移植注意点idata，xdata关键字需要删掉。直接定义内存即可，GBA有32K内存肯定够用了code关键字需要改成const。大多是用于点阵字库定义之类的不会变化的大数组。C51驱动液晶一般使用的颜色格式为RGB565，需要改成GBA的BGR555格式。为方便修改，博主写了一个小工具可以从RGB565转换成GBR555。（附小工具的c语言源码，有需要的请自行编译）#include <stdio.h> #include <stdlib.h> char buf[10]; int r565,g565,b565; float r555,g555,b555; int bgr555; int main(){ printf("input RGB565 color(ex. f800):"); scanf("%s", buf); int number = (int)strtol(buf, NULL, 16); r565 = number>>11; g565 = (number>>5) & 0xbff; //0000 0111,111 11111 b565 = number & 0x1f; // 000 11111 g555 = g565 * 0x1f / 0x3f; bgr555 = b565<<10 | ((int)g555)<<5 | r565; printf("GBA-Color-Format BGR555= 0x%04x\n", bgr555); return 0; }延时函数避免被优化掉需要加上不优化声明，如下#pragma GCC optimize(0) void delay_ms(u16 n) { u16 x,y; for(x=n;x>0;x--) { for(y=110;y>0;y--); } }