标签: game-boy-advance

求助GBA ARM汇编程序

我尝试修改ARM 汇编程序(请参见页面底部)以使用子例程。它应该在 GBA 上显示红色屏幕(并编译它实际执行的示例程序,因此这不是工具链使用问题),但是,当我运行它时,屏幕会变黑。我正在使用 devkitARM 30

.arm
.text
.global main
main:
    mov r0, #0x4000000
    mov r1, #0x400
    add r1, r1, #3
    str r1, [r0]
    mov r0, #0x6000000
    stmdb sp!, {r0, r2, lr} @push registers before calling
    mov r0, #0xff
    mov r1, #0
    mov r2, #0
    bl set_rgb
    mov r1, r0
    ldmdb sp!, {r0, r2, lr} @restore registers
    mov r2, #0x9600
loop1:
    strh r1, [r0], #2
    subs r2, r2, #1
    bne loop1
infin:
    b infin

set_rgb:
    @r0: R; r1: …
Run Code Online (Sandbox Code Playgroud)

assembly arm devkitpro game-boy-advance

5
推荐指数
1
解决办法
1526
查看次数

在 C/Gameboy 编程中使用两个数组

对于 Gameboy 编程中的游戏,我使用四个名为topoldTopbottom的数组oldBottom

struct Point { int x, y; };
struct Rect  { struct Point xx, yy; };

Rect top[size], oldTop[size];
Rect bottom[size], oldBottom[i];
Run Code Online (Sandbox Code Playgroud)

其中 Rect 是由两个结构点(左上角点和右下角点)组成的结构体。

游戏的想法是让随机高度的方块从天花板自上而下,从地板自下而上。它类似于直升机经典游戏。在无限 while 循环中,我使用以下代码将所有矩形向下移动一个像素

while (1)
{
    for (int i = 0; i < size; i++)
    {
        //in Struct Rect, xx is the top-left corner point, and yy is the bottom right
        top[i].xx.x--;
        top[i].yy.x--;
        bottom[i].xx.x--;
        bottom[i].yy.x--;

        if (top[i].xx.x < 0)
        {
            top[i].xx.x += 240;
            top[i].yy.x += …
Run Code Online (Sandbox Code Playgroud)

c game-boy-advance gameboy

5
推荐指数
1
解决办法
633
查看次数

可以使用 C 将函数的存储位置存储到 RAM 中吗?

我一直在玩 C 语言的 Game Boy Advance 编码。为了使中断正常工作,必须将中断处理程序例程的地址手动复制到 RAM 位置 0x03007FFC。我知道如何在 ARM Assembly 中执行此操作,但不知道如何在 C 中执行此操作。我正在尝试这样的操作:

#define REG_INTERRUPT *(vu32*)0x03007FFC
void irqhandler()
{
    while(1){}
}

int main()
{
    REG_INTERRUPT = &irqhandler();

    while(1){}
    return 0;

}
Run Code Online (Sandbox Code Playgroud)

但这不起作用。根据我对 C 函数的理解,C 似乎认为我正在尝试获取返回值的地址irqhandler(因为它是空的,所以没有返回值),这就是错误的来源。我如何告诉 C 我想要函数本身的内存位置?

c embedded arm game-boy-advance

3
推荐指数
1
解决办法
335
查看次数

为什么 gcc -O1 优化会破坏在 Gameboy Advance ROM 的循环中修改 VRAM 的代码?

我正在开发一个简单的 Gameboy Advance ROM,并试图理解为什么以下代码适用于 gcc选项,但使用或以上-O0时会崩溃(白色模拟器屏幕) :-O1

int main () {
    // Set video mode 3 and background 2
    *(unsigned int*)0x04000000 = 0x0403;

    int x;
    for(x = 0; x < 1; x++){
        // Set a single pixel at position (120, 80) in VRAM to red
        ((unsigned short*)0x06000000)[120+80*240] = 0x001F;
    };

    while(1);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该循环显然是不必要的,但我用它来创建一个崩溃行为的最小示例。如果没有循环,无论优化级别如何,代码都可以正常工作。通过循环,它会在-O1和更高处崩溃,但可以在-O0.

无论我是否实际x在循环体中使用(例如,用于x计算像素位置),都会发生相同的行为。据我所知,每当我尝试在循环中进行这种类型的直接内存修改时,我都会在更高的优化级别上遇到损坏。

这里发生了什么?什么优化破坏了代码?这是否表明我做事的方式存在问题?谢谢你的帮助!

更多细节:

  • 我正在使用 devkitpro/devkitarm
  • 我使用 NanoBoyAdvance 作为模拟器
  • 我在 Ubuntu 上运行
  • 完整命令:
arm-none-eabi-gcc -MMD -MP …
Run Code Online (Sandbox Code Playgroud)

c gcc arm devkitpro game-boy-advance

3
推荐指数
1
解决办法
92
查看次数

GBA C编程编译器gcc

我正在尝试开始在Windows中为GBA编程。有人可以为我提供一个很好的参考,他们可以遵循一套完整的指示吗?

我希望说明包括以下内容:

1) downloading the compiler needed for gba development
2) downloading the gcc necessary for gba development
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一些网站,但总是遇到安装gcc变体的问题。如果您还没有亲自下载gba开发工具包和gba的编译代码,请不要使用指向cygwin的链接来回答此线程。

谢谢!

c compiler-construction gcc game-boy-advance

2
推荐指数
1
解决办法
4483
查看次数

“BM6”是什么格式?

我正在使用旧的托盘系统。当我导出图像时,它还会创建一个 15/16 色的调色板。但是当我尝试复制相同的结果时,程序无法识别我刚刚创建的图像。为了分析发生了什么,我用记事本打开了一些图像并将它们与我的“创作”进行了比较,我注意到了一些不同之处。

但最有趣的是,在我的图像代码的开头是“BM6”类型,而它们应该是“png”或“bmp”。我认为这是编纂的事情,但我找不到任何关于它的信息。

image colors game-boy-advance

0
推荐指数
1
解决办法
8669
查看次数