- 注册时间
- 2004-12-25
- 最后登录
- 1970-1-1
|
发表于 2007-7-2 13:18:40
|
显示全部楼层
看看这个:
/**
* @flm2.0播放代码(嵌入汇编for NC3000)
* @by eastsun
* @参考资料: 见汇编区lee发布的NC3000SYS-TOOLS的源代码
* @通过LAVA ALL认证,目前已知全平台适用
*/
#define JMP_ADDR_NC3K 0x8974 //如果要想在其他6502机型上调用汇编,找到该地址即可
char bmpBuf[1600],cutBuf[1600],fileHead[16];
char flags;
char asmCode[] ={//这段代码在6502机型上通用
0xA9,0x40,0x85,0x80,0xA9,0x26,0x85,0x81,0xA9,0x00,0x85,0x82,0xA9,0x20,0x85,0x83,
0xAD,0x90,0x2C,0xD0,0x1D,0xA2,0x06,0xA0,0x00,0xB1,0x80,0x91,0x82,0xC8,0xD0,0xF9,
0xE6,0x81,0xE6,0x83,0xCA,0xD0,0xF2,0xA2,0x40,0xB1,0x80,0x91,0x82,0xC8,0xCA,0xD0,
0xF8,0x60,0xC9,0x03,0x90,0x01,0x60,0xC9,0x01,0xD0,0x1F,0xA2,0x06,0xA0,0x00,0x98,
0x91,0x82,0xC8,0xD0,0xFB,0xE6,0x83,0xCA,0xD0,0xF6,0xA2,0x40,0x91,0x82,0xC8,0xCA,
0xD0,0xFA,0xA9,0x00,0x85,0x82,0xA9,0x20,0x85,0x83,0xA0,0x00,0xB1,0x80,0xC9,0x40,
0xB0,0x1E,0x29,0x3F,0xD0,0x02,0xA9,0x40,0x18,0x65,0x82,0x85,0x82,0x90,0x02,0xE6,
0x83,0xE6,0x80,0xD0,0x02,0xE6,0x81,0xA0,0x00,0xB1,0x80,0xC9,0xC1,0xD0,0xDB,0x60,
0xC9,0x80,0xB0,0x28,0x29,0x3F,0xD0,0x02,0xA9,0x40,0xAA,0xA0,0x00,0x18,0xB1,0x82,
0x69,0xFF,0x91,0x82,0xE6,0x82,0xD0,0x02,0xE6,0x83,0xCA,0xD0,0xF0,0xE6,0x80,0xD0,
0x02,0xE6,0x81,0xA0,0x00,0xB1,0x80,0xC9,0xC1,0xD0,0xAF,0x60,0xC9,0xC0,0xB0,0x27,
0x29,0x3F,0xD0,0x02,0xA9,0x40,0xAA,0xA0,0x00,0xE6,0x80,0xD0,0x02,0xE6,0x81,0x18,
0xB1,0x80,0x71,0x82,0x91,0x82,0xE6,0x80,0xD0,0x02,0xE6,0x81,0xE6,0x82,0xD0,0x02,
0xE6,0x83,0xCA,0xD0,0xEA,0xF0,0xCC,0x29,0x3F,0xD0,0x02,0xA9,0x40,0xAA,0xE6,0x80,
0xD0,0x02,0xE6,0x81,0xA0,0x00,0xB1,0x80,0x85,0x84,0x18,0xB1,0x82,0x65,0x84,0x91,
0x82,0xE6,0x82,0xD0,0x02,0xE6,0x83,0xCA,0xD0,0xF0,0xE6,0x80,0xD0,0x02,0xE6,0x81,
0xA9,0x00,0xF0,0x9F
};
int jmpAddr;
//**************************机型判断代码**********************************
#define GVMIDE 0x0001
#define LAVAX 0x0002
#define NC3000 0x0004
#define TC800 0x0008
char test[]="Eastsun";
int type[] = {GVMIDE,LAVAX,NC3000,TC800};
char str[][20]={"GVmaker IDE..",
"LAVAX IDE..",
"NC3000 GVM..",
"TC800 GVM..",
"其他平台.."
};
long _jiXing(){
int tag,n;
printf("Eastsun");
tag = 1;
for(n=0;n<7;n++) if(*(0x1400+n)!=test[n]){ tag = 0; break;}
if(tag) return LAVAX;
tag = 1;
for(n=0;n<7;n++) if(*(0x01c0+n)!=test[n]) { tag = 0; break;}
if(tag) return GVMIDE;
tag = 1;
for(n=0;n<7;n++) if(*(0x0f1a+n)!=test[n]) {tag = 0; break;}
if(tag) return TC800;
return 0;
}
long jiXing(){
int t;
SetScreen(0);
t=_jiXing();
SetScreen(0);
if(t) return t;
else if(*(0x8189)==0xb0&&*(0x818a)==0x88&&*(0x818c)==0x95) return NC3000;
else return 0;
}
//***********************************************************************
void setAsmMode(int f){
if(f){
//进入汇编模式,修改GVmaker解释器中指令ClearScreen的跳转地址并保存之
jmpAddr =*(JMP_ADDR_NC3K)|(*(JMP_ADDR_NC3K+1)<<8);
*(JMP_ADDR_NC3K) =asmCode&0xff;
*(JMP_ADDR_NC3K+1) =(asmCode>>8)&0xff;
}
else{
//恢复ClearScreen的跳转地址
*(JMP_ADDR_NC3K) =jmpAddr&0xff;
*(JMP_ADDR_NC3K+1) =(jmpAddr>>8)&0xff;
}
}
void decode(){
//调用嵌入的汇编代码
ClearScreen();
}
int playFlm2(int fn){
char fp,high,low,ms,t,byte;
int frame,count,length,process,speed,n,m,deta;
t =(jiXing()==NC3000);
if(!(fp=fopen(fn,"r"))) return 0;
fread(fileHead,1,16,fp);
if(fileHead[0]!='F'||fileHead[1]!='L'||fileHead[2]!='M'||fileHead[3]!=0x10){
//不是有效的FLM文件
fclose(fp);
return 0;
}
if(fileHead[4]){//压缩格式的flm文件
frame =fileHead[5]+(fileHead[6]<<8); //祯数
speed =fileHead[7]; //速度(延迟tick数)
process =0;
if(t) setAsmMode(1);
for(;;){
ms =Getms();
low =getc(fp);
high =getc(fp);
length =low + ((high&0xf)<<8) -2;
fread(cutBuf,1,length,fp);//读取压缩数据
cutBuf[length] =0xc1; //设置结束标记
flags =high>>4;
if(t) decode(); //如果是NC3000,调用汇编解码
else{
if(!flags) memcpy(bmpBuf,cutBuf,1600);
else if(flags==1||flags==2){
if(flags==1) memset(bmpBuf,0,1600);
n =0; m=0; //n ->cutBuf,m ->bmpBuf
do{
byte =cutBuf[n];
if(byte<0x40){
if(byte) count =byte;
else count =0x40;
m =m+count;
n ++;
}
else if(byte<0x80){
if(byte&0x3f) count =byte&0x3f;
else count =0x40;
do{
bmpBuf[m]--;
m ++;
count --;
}while(count);
n ++;
}
else if(byte<0xc0){
if(byte&0x3f) count =byte&0x3f;
else count =0x40;
n ++;
do{
bmpBuf[m] =bmpBuf[m] +cutBuf[n];
m ++;
n ++;
count --;
}while(count);
}
else{
if(byte&0x3f) count =byte&0x3f;
else count =0x40;
deta =cutBuf[++n];
do{
bmpBuf[m] =bmpBuf[m] +deta;
m ++;
count --;
}while(count);
n ++;
}
}while(cutBuf[n]-0xc1);
}
}
WriteBlock(0,0,160,80,0x41,bmpBuf);
if(speed){//延时
while(((Getms()-ms)&0xff)<speed);
ms =Getms();
}
if(process>=frame||Inkey()==0x1b) break; //播放结束
process++;
}//for(;;)
}
else{//flm1.0
}
fclose(fp);
if(t) setAsmMode(0);
return 1;
}
void main(){
char fn[60];
int n,t;
t =jiXing();
if(!t) n=4;
else{
n=0;
while(t!=type[n]) n++;
}
ClearScreen();
TextOut(20,16,str[n],0x81);
Refresh();
Delay(1000);
ChDir("/");
for (;;) {
if (!FileList(fn)) {
ChDir("..");
continue;
}
if (ChDir(fn)) continue;
playFlm2(fn);
ChDir("/");
}
} |
|