易码技术论坛

 找回密码
 加入易码
搜索
查看: 882335|回复: 22

[源码] [代码]4灰度状态下的作图函数,用汇编完成

[复制链接]
发表于 2007-7-2 12:07:53 | 显示全部楼层
嗯,沙发,敬礼!!
发表于 2007-7-2 12:07:59 | 显示全部楼层
支持,支持,顶一下!!!!
 楼主| 发表于 2007-7-2 12:40:48 | 显示全部楼层
还有个问题想问一下YAN:你是怎样在LAVA中调用汇编的?或者说那个程序入口在什么地方!
发表于 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]!=&#39;F&#39;||fileHead[1]!=&#39;L&#39;||fileHead[2]!=&#39;M&#39;||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("/");
  }
}
发表于 2007-7-2 13:35:57 | 显示全部楼层
这个:
#include <***.y>
char buf[]={0x00,0x1d,0x05,0x60};

void main()
{
exeasm(buf)
}
即执行 brk $051d
       rts
发表于 2007-7-2 13:53:54 | 显示全部楼层
四级灰度绘图偷懒方法(汇编):
1-增加入口参数$xxxx用以判断所绘图形颜色深度
2-调用二级灰度绘图函数
3-据参数$xxxx对图形缓冲内容进行扩充。

说是偷懒,好像操作起来要复杂很多,速度也很成问题,汗........
发表于 2007-7-2 15:20:55 | 显示全部楼层
eastsun的那个源代码是修改了nc3000的lava解释器的ClearScreen的入口地址,把ClearScreen的入口地址改成了汇编的入口,然后调用ClearScreen就相当于调用了汇编,而没有执行lava解释器中ClearScreen的汇编程序

部分资料可以参见此贴
http://www.emsky.net/bbs/read.php?tid=19791&keyword=
发表于 2007-7-2 15:47:23 | 显示全部楼层
看出来了,很麻烦耶
发表于 2007-7-2 16:20:13 | 显示全部楼层
谢谢lz的支持!
不过我只需要circle和ellipse两个函数就够了.能不能改一下?
4灰度的显存都是$1384起始
发表于 2007-7-2 16:24:02 | 显示全部楼层
引用第3楼markliteng2007-07-02 12:40发表的“”:
还有个问题想问一下YAN:你是怎样在LAVA中调用汇编的?或者说那个程序入口在什么地方!
就是用eastsun的方法.
发表于 2007-7-2 18:21:02 | 显示全部楼层
支持啊!!!
发表于 2007-7-2 22:07:23 | 显示全部楼层
好困难啊!!!
发表于 2007-7-4 21:33:32 | 显示全部楼层
看不懂也顶
发表于 2007-7-12 17:36:46 | 显示全部楼层
引用第9楼yan2007-07-02 16:20发表的“”:
谢谢lz的支持!
不过我只需要circle和ellipse两个函数就够了.能不能改一下?
4灰度的显存都是$1384起始


4灰度的显存不是$1380吗?
发表于 2007-7-12 17:40:06 | 显示全部楼层
LZ真是强人啊
不知道LZ是否能写出在4灰度模式下用的UpdateText函数
和贴图函数
发表于 2007-7-16 23:05:55 | 显示全部楼层
貌似yan没用LZ的代码?
发表于 2007-7-17 07:55:27 | 显示全部楼层
好像是
发表于 2007-7-17 13:19:05 | 显示全部楼层
呵呵,我发布了四灰度库后lz才发布的。而已我的方法是直接hack解释器,比较简单和不太占内存空间,所以就不采纳了。
发表于 2007-7-18 09:36:41 | 显示全部楼层
汇编,老是觉得好长啊。
发表于 2007-7-18 11:25:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

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

GMT+8, 2024-4-26 12:31 , Processed in 0.013170 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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