易码技术论坛

 找回密码
 加入易码
搜索
12
返回列表 发新帖
楼主: Eastsun

[归档] 【分享】flm2.0(黑白)播放程序(嵌入汇编,通过LAVA ALL认证)

[复制链接]
发表于 2007-2-14 11:04:31 | 显示全部楼层
前几天才看到GVBASIC通过改LINE来贴图,今天看到LAVA用改ClearScreen来嵌入汇编。
果然是举一反三。

回20楼:复制代码自己编译不就可以了......
发表于 2007-2-14 16:04:10 | 显示全部楼层
都加了威望的- -
 楼主| 发表于 2007-2-14 22:32:13 | 显示全部楼层
怎么又被挖出来鸟~
发表于 2007-3-11 11:37:03 | 显示全部楼层
被挖说明其实很不错,
不过只是嵌入汇编了,还不是纯lava。。
有点可惜。。
 楼主| 发表于 2007-3-12 11:32:16 | 显示全部楼层
楼上没看到通过LAVA ALL认证吗?
虽然不是纯LAVA的,但可以在所有LAVA平台上正确运行!
 楼主| 发表于 2006-9-11 21:23:23 | 显示全部楼层 |阅读模式
以下内容需要积分高于 0 才可浏览

RT,代码如下:
  1. /**
  2. * @flm2.0播放代码(嵌入汇编for NC3000)
  3. * @by eastsun
  4. * @参考资料: 见汇编区lee发布的NC3000SYS-TOOLS的源代码
  5. * @通过LAVA ALL认证,目前已知全平台适用
  6. */
  7. #define JMP_ADDR_NC3K 0x8974   //如果要想在其他6502机型上调用汇编,找到该地址即可
  8. char bmpBuf[1600],cutBuf[1600],fileHead[16];
  9. char flags;
  10. char asmCode[] ={//这段代码在6502机型上通用
  11.             0xA9,0x40,0x85,0x80,0xA9,0x26,0x85,0x81,0xA9,0x00,0x85,0x82,0xA9,0x20,0x85,0x83,
  12.             0xAD,0x90,0x2C,0xD0,0x1D,0xA2,0x06,0xA0,0x00,0xB1,0x80,0x91,0x82,0xC8,0xD0,0xF9,
  13.             0xE6,0x81,0xE6,0x83,0xCA,0xD0,0xF2,0xA2,0x40,0xB1,0x80,0x91,0x82,0xC8,0xCA,0xD0,
  14.             0xF8,0x60,0xC9,0x03,0x90,0x01,0x60,0xC9,0x01,0xD0,0x1F,0xA2,0x06,0xA0,0x00,0x98,
  15.             0x91,0x82,0xC8,0xD0,0xFB,0xE6,0x83,0xCA,0xD0,0xF6,0xA2,0x40,0x91,0x82,0xC8,0xCA,
  16.             0xD0,0xFA,0xA9,0x00,0x85,0x82,0xA9,0x20,0x85,0x83,0xA0,0x00,0xB1,0x80,0xC9,0x40,
  17.             0xB0,0x1E,0x29,0x3F,0xD0,0x02,0xA9,0x40,0x18,0x65,0x82,0x85,0x82,0x90,0x02,0xE6,
  18.             0x83,0xE6,0x80,0xD0,0x02,0xE6,0x81,0xA0,0x00,0xB1,0x80,0xC9,0xC1,0xD0,0xDB,0x60,
  19.             0xC9,0x80,0xB0,0x28,0x29,0x3F,0xD0,0x02,0xA9,0x40,0xAA,0xA0,0x00,0x18,0xB1,0x82,
  20.             0x69,0xFF,0x91,0x82,0xE6,0x82,0xD0,0x02,0xE6,0x83,0xCA,0xD0,0xF0,0xE6,0x80,0xD0,
  21.             0x02,0xE6,0x81,0xA0,0x00,0xB1,0x80,0xC9,0xC1,0xD0,0xAF,0x60,0xC9,0xC0,0xB0,0x27,
  22.             0x29,0x3F,0xD0,0x02,0xA9,0x40,0xAA,0xA0,0x00,0xE6,0x80,0xD0,0x02,0xE6,0x81,0x18,
  23.             0xB1,0x80,0x71,0x82,0x91,0x82,0xE6,0x80,0xD0,0x02,0xE6,0x81,0xE6,0x82,0xD0,0x02,
  24.             0xE6,0x83,0xCA,0xD0,0xEA,0xF0,0xCC,0x29,0x3F,0xD0,0x02,0xA9,0x40,0xAA,0xE6,0x80,
  25.             0xD0,0x02,0xE6,0x81,0xA0,0x00,0xB1,0x80,0x85,0x84,0x18,0xB1,0x82,0x65,0x84,0x91,
  26.             0x82,0xE6,0x82,0xD0,0x02,0xE6,0x83,0xCA,0xD0,0xF0,0xE6,0x80,0xD0,0x02,0xE6,0x81,
  27.             0xA9,0x00,0xF0,0x9F
  28.            };
  29. int jmpAddr;
  30. //**************************机型判断代码**********************************
  31. #define GVMIDE 0x0001
  32. #define LAVAX  0x0002
  33. #define NC3000 0x0004
  34. #define TC800  0x0008
  35. char test[]="Eastsun";
  36. int type[] = {GVMIDE,LAVAX,NC3000,TC800};
  37. char str[][20]={"GVmaker IDE..",
  38.            "LAVAX  IDE..",
  39.            "NC3000 GVM..",
  40.            "TC800  GVM..",
  41.            "其他平台.."
  42.           };
  43. long _jiXing(){
  44.     int tag,n;
  45.     printf("Eastsun");
  46.     tag = 1;
  47.     for(n=0;n<7;n++) if(*(0x1400+n)!=test[n]){ tag = 0; break;}
  48.     if(tag) return LAVAX;
  49.     tag = 1;
  50.     for(n=0;n<7;n++) if(*(0x01c0+n)!=test[n]) { tag = 0; break;}
  51.     if(tag) return GVMIDE;
  52.     tag = 1;
  53.     for(n=0;n<7;n++) if(*(0x0f1a+n)!=test[n]) {tag = 0; break;}
  54.     if(tag) return TC800;
  55.     return 0;
  56. }
  57. long jiXing(){
  58.     int t;
  59.     SetScreen(0);
  60.     t=_jiXing();
  61.     SetScreen(0);
  62.     if(t) return t;
  63.     else if(*(0x8189)==0xb0&&*(0x818a)==0x88&&*(0x818c)==0x95) return NC3000;
  64.     else  return 0;
  65. }
  66. //***********************************************************************
  67. void setAsmMode(int f){
  68.    if(f){
  69.       //进入汇编模式,修改GVmaker解释器中指令ClearScreen的跳转地址并保存之
  70.       jmpAddr =*(JMP_ADDR_NC3K)|(*(JMP_ADDR_NC3K+1)<<8);
  71.       *(JMP_ADDR_NC3K) =asmCode&0xff;
  72.       *(JMP_ADDR_NC3K+1) =(asmCode>>8)&0xff;
  73.    }
  74.    else{
  75.       //恢复ClearScreen的跳转地址
  76.       *(JMP_ADDR_NC3K)  =jmpAddr&0xff;
  77.       *(JMP_ADDR_NC3K+1) =(jmpAddr>>8)&0xff;
  78.    }
  79. }   
  80. void decode(){
  81.    //调用嵌入的汇编代码
  82.    ClearScreen();
  83. }
  84. int playFlm2(int fn){
  85.    char fp,high,low,ms,t,byte;
  86.    int frame,count,length,process,speed,n,m,deta;
  87.    t =(jiXing()==NC3000);
  88.    if(!(fp=fopen(fn,"r"))) return 0;
  89.    fread(fileHead,1,16,fp);
  90.    if(fileHead[0]!=&#39;F&#39;||fileHead[1]!=&#39;L&#39;||fileHead[2]!=&#39;M&#39;||fileHead[3]!=0x10){
  91.       //不是有效的FLM文件
  92.       fclose(fp);
  93.       return 0;  
  94.    }
  95.    if(fileHead[4]){//压缩格式的flm文件
  96.       frame =fileHead[5]+(fileHead[6]<<8); //祯数
  97.       speed =fileHead[7]; //速度(延迟tick数)
  98.       process =0;
  99.       if(t) setAsmMode(1);
  100.       for(;;){
  101.         ms =Getms();
  102.         low =getc(fp);
  103.         high =getc(fp);  
  104.         length =low + ((high&0xf)<<8) -2;
  105.         fread(cutBuf,1,length,fp);//读取压缩数据
  106.         cutBuf[length] =0xc1; //设置结束标记
  107.         flags =high>>4;
  108.         if(t) decode(); //如果是NC3000,调用汇编解码
  109.         else{
  110.             if(!flags) memcpy(bmpBuf,cutBuf,1600);
  111.             else if(flags==1||flags==2){      
  112.                if(flags==1) memset(bmpBuf,0,1600);
  113.                n =0; m=0;  //n ->cutBuf,m ->bmpBuf
  114.                do{
  115.                     byte =cutBuf[n];
  116.                     if(byte<0x40){
  117.                        if(byte) count =byte;
  118.                        else    count =0x40;
  119.                        m =m+count;
  120.                        n ++;
  121.                     }        
  122.                     else if(byte<0x80){
  123.                         if(byte&0x3f) count =byte&0x3f;
  124.                        else       count =0x40;
  125.                        do{
  126.                           bmpBuf[m]--;
  127.                           m ++;
  128.                           count --;
  129.                        }while(count);
  130.                        n ++;
  131.                     }
  132.                     else if(byte<0xc0){
  133.                        if(byte&0x3f) count =byte&0x3f;
  134.                        else       count =0x40;
  135.                        n ++;
  136.                        do{
  137.                           bmpBuf[m] =bmpBuf[m] +cutBuf[n];
  138.                           m ++;
  139.                           n ++;
  140.                           count --;
  141.                        }while(count);   
  142.                     }
  143.                     else{
  144.                         if(byte&0x3f) count =byte&0x3f;
  145.                        else       count =0x40;
  146.                        deta =cutBuf[++n];
  147.                        do{
  148.                           bmpBuf[m] =bmpBuf[m] +deta;
  149.                           m ++;
  150.                           count --;
  151.                        }while(count);
  152.                         n ++;
  153.                   }
  154.                }while(cutBuf[n]-0xc1);
  155.             }
  156.        }
  157.         WriteBlock(0,0,160,80,0x41,bmpBuf);
  158.         if(speed){//延时
  159.            while(((Getms()-ms)&0xff)<speed);
  160.            ms =Getms();
  161.         }
  162.         if(process>=frame||Inkey()==0x1b) break; //播放结束
  163.         process++;
  164.       }//for(;;)
  165.    }
  166.    else{//flm1.0
  167.    }
  168.    fclose(fp);
  169.    if(t) setAsmMode(0);
  170.    return 1;
  171. }
  172. void main(){
  173.     char fn[60];
  174.     int n,t;
  175.     t =jiXing();
  176.     if(!t) n=4;
  177.     else{
  178.        n=0;
  179.        while(t!=type[n]) n++;
  180.     }
  181.     ClearScreen();
  182.     TextOut(20,16,str[n],0x81);
  183.     Refresh();
  184.     Delay(1000);
  185.     ChDir("/");
  186.    for (;;) {
  187.       if (!FileList(fn)) {
  188.         ChDir("..");
  189.         continue;
  190.       }
  191.       if (ChDir(fn)) continue;
  192.       playFlm2(fn);
  193.       ChDir("/");
  194.    }
  195. }
  196.            
  197.            
  198.         
  199.               
  200.       
复制代码



flm2Player.rar

4 KB, 下载次数: 67

代码及编译好的LAV文件

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-4-19 22:17 , Processed in 0.012290 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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