易码技术论坛

 找回密码
 加入易码
搜索
查看: 1614|回复: 9

[求助] TC800中,不占用内存的资源使用

[复制链接]
发表于 2008-10-1 02:52:18 | 显示全部楼层 |阅读模式
大家知道,在TC800中(包括LavaX1.0等机器,比如nc3000等等)显示一副图片,要么是将其写在资源文件里面(比如/LavaData/pic.dat),要么是直接在程序里面包含(比如char pic[]={....),第一种方法安装的时候需要复制多个文件,比较不方便,而第二种方法则会占用机器运行时内存,假设有100张图片,每张6K,要一张张显示,显然只好使用资源文件的方法,因为内存总共只有24K,装不下那么多数据。

但是yan和另外一个高手(记不得名字了)却有另外一种办法,就是把资源附加在程序的末尾,然后似乎是直接打开程序文件去得到资源。这样可以避免上面提到的问题。我在FileEasy里面也很想使用这种方法,但是遇到了困难。

首先,没办法得到运行程序的名字,当然可以固定命名,但是如果用户改变了程序的名称怎么办呢?还有可能在内存里面某个地方取得程序的名字,但是有点担心无法跨平台,还有就是安全性的问题,内存位置极有可能被不知名的原因抹去,这样程序会很脆弱。

然后,在编译程序的时候,怎么把数据附加到程序后呢?直接编译好以后写程序文件么?还有没有更好的办法呢?比如在代码里面动动手脚什么的?当然这个是比较简单的,实在不行写个C程序专门负责在程序末尾添加数据……不过似乎看上去是有更好的办法的……

大家有知道的么?希望告之一下……谢谢咯~~~
发表于 2008-10-1 11:04:06 | 显示全部楼层
用我的编译器可以用#loaddata。
gameghost应该也有类似的做法。
 楼主| 发表于 2008-10-2 10:20:10 | 显示全部楼层
恩~~我试一下~~谢谢yan~~~
 楼主| 发表于 2008-10-2 10:31:56 | 显示全部楼层
- -可是我用电脑端的编译器啊……Lee那个就不指望了……那,gg的编译器里面有没有这个功能呢??

gg在么?

yan,你的#loaddata的原理是什么呢?
发表于 2008-10-2 16:26:56 | 显示全部楼层
在我的编译器里可以使用__code__指令.
在后面的大括号里直接写入伪指令码.
如固定内存初始化指令:
__code__{0x41, 0x00, 0x20, 0x00, 0x03, 1,2,3}
意思就是初始化0x2000开始的3个字节的内存的值为1,2,3.
第一字节0x41是指令
第二,三字节是地址
第四,五字节是长度
后面的就是数据

你可以用这个指令直接把数据初始化到显存的地址.

如:
void ShowPic()
{
    __code__{0x41, 6592 & 0xff, (6592 >> 8) & 0xff, 1600 & 0xff, (1600 >> 8)&0xff,
    [1600字节长度的图形数据]}
}
发表于 2008-10-2 16:48:36 | 显示全部楼层
GG惊现!!!!
 楼主| 发表于 2008-10-2 19:03:50 | 显示全部楼层
GG……太太太太感谢了!!!实在是无以形容我的感激之情了!!太谢谢了!!!
 楼主| 发表于 2008-10-3 00:31:05 | 显示全部楼层
研究成功了……
设置了一个全局变量,
char pic_buffer[512];
然后试验得它的地址是0x2084,然后在代码里面写:
__code__{ 0x41, 0x84, 0x20, 0x00, 0x02, [512字节图片数据]}
试验成功。
不过,似乎为了初始化局部数组变量,程序的前128字节运行内存被占了啊……而且似乎还多了4个字节不知道是干什么的……所以十分怀疑这个东西的可移植性……前面128个字节是为了局部数组初始化,那么后面4个字节是做什么的呢?

虽然这样,我本人已经是满意到不能再满意了~~哈哈~
发表于 2008-11-30 23:39:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2008-12-1 12:18:01 | 显示全部楼层
是函数调用时占用的长度吧!一个函数调用另一个函数时要存放返回信息的!
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-3-29 07:26 , Processed in 0.010286 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表