实机效果

这个是用GBA烧录卡在NDSL上运行的样子。下方的按键说明是原来C51平台上用的(那个开发板只有3个按键),后面会删掉。

贪吃蛇的源码已开源(EmbSnake)

https://gitee.com/slipperstree/EmbSnake

EmbSnake是一款贪食蛇游戏。主要面向嵌入式环境,模块化设计,分离了设备相关性。只需要针对特定的设备实现一些必要的函数就可以很快移植到你的平台上。根据需要可剪裁各种功能以适应各种MCU的可用储存空间(ROM)。

包含了C51某开发板的一个实现版本。这个GBA版也是基于那个版本移植的。等GBA版本移植的差不多了也会推到仓库中作为sample之一。

GBA游戏编译环境

使用tonclib框架

  • tonclib是基于devkitPro编译环境的一套第三方GBA框架,包装了很多功能函数。而且,个人觉得tonc的教程是最完整的。
  • tonclib相关资源
  • 使用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--);
        }
    }
Last modification:April 9, 2022
If you think my article is useful to you, please feel free to appreciate