📄 gba上的简易阅读器.txt
字号:
GBA上的简易阅读器
作者:乐水 文章来源:掌机之王 更新时间:2004-1-22
在这里先要声明的是,这个文挡仅仅是一个教程,真正的代码全部包含在 Read.zip 中,其中所用到的代码也许并不完全符合某种规定,但他确确实实可以正常的在GBA(模拟器)上运行。我使用的PC环境如下:
Cpu: Ce366
Ram: 128M
Hard Disk: 15G
GBA Emu :BoycottAdvance 0.2.6
Env: Gcc Compile.
关于gcc这个编译器我觉得有很多的问题,我没有使用过HAM那个编译器,所以不清楚它的性能。
在gcc中,char的默认类型不是通常的signed而是unsigned型。你可以通过参数传递指针,但却不可以传递给函数内部定义的指针或内部指针之间的传递。就像下面的例子:
void (char *str)
{
char *s=str; //可以正确的得到数据
char *ss;
ss=str; //很可能什么也得不到,而且编译时没有任何错误提示。
}
针对于上面的问题,我们几乎无能为力。但好在指针和数组在某种程度上可以说相同,而且gcc也支持这种方法:
void (char *str)
{
...
char ss[n]; //定义数组长度
ss=str; // 可以正确的得到数据。长度为n
}
从这可以看出,gba是把数据copy到ss中的,至于为什么要这样做我不清楚。(也可能是因为才疏学浅没有真正搞明白)。 GBA虽然也有一定大小的RAM,但却不能够由我们随意使用,gcc的头文件中包含malloc()这个函数,但在我的使用过程中,它似乎从来没有为我分配到一点内存。
好了,先说这么多,其实这本不属于这篇文挡中的内容,但我没见到有人发表过类似的文章,所以为广大gba编程爱好者着想,还是说明白的好。
我曾经在dos下写过一个底层(Beauty 和 Beauty16),它包含了图象、声音、键盘、鼠标等一系列游戏中需要用到的函数。这为我编写gba程序打下一定的基础,因为我可以将它移植到gba上,事实上我也的确是这么做的。这样可以更方便的让我在pc上进行调试而不是使用那麻烦而又缓慢的GBA EMU。
在我的gba底层包中提供了显示汉字的函数和字库,他们是从ucdos中的asc16和hzk16中转换过来的。
在Stxt.cpp中,你可以看到我在main()函数中这样写到:
main()
{
........
......
long offset=400000;
char *ip=(char*)0x8000000;
buf=(const char*)(ip+offset+1);
........
.....
}
需要说明的是,offset是stxt.cpp编译后的长度,但我们不可能事前知道这一点,所以它被我用一个略大于编译后长度的数值代替。而ip指向的则是程序被装入的起始地址,这在gba中固定是0x8000000处。
为什么要这样做呢?因为gba不可能像pc一样操作外部文件,我们只能把所要显示的文挡同主程序连接起来,所以就需要一个指向文挡起始位置的指针。
同时,因为offset是我们估算的数值,真正编译后的主程序不可能正好是这个数值,所以我提供了一个小程序来填充这段数据。Cat2Gba.exe 是我在watcom下编写的实现这个功能的程序。使用方法大致如下:
Cat2Gba 主程序(即编译后的.bin) 文挡(纯文本格式) 输出文件(.bin) 偏移量(这个值要同main()中的offset相同)
例:cat2gba stxt.bin readme.txt o.bin 400000
这个小程序中有保护机制,如果偏移量小于主程序的实际长度,它会给出提示并终止运行。
需要注意的是,因为我使用的是本来基于Allegro中的GUI函数(被我移植到我的Beauty库中。)而它是不支持中文的,所以你想要显示的文挡不能够是中文文挡。
虽然这个函数(我提供的底层包支持中文)不能够显示中文,但你可以自己修改。如果你需要我所说的这些文件,请 下载 。欢迎与我联系,提出你的建议或是把你修改后的代码发给我。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -