萧竹 发表于 2007-7-2 12:07:53

嗯,沙发,敬礼!!

zjjerry413 发表于 2007-7-2 12:07:59

支持,支持,顶一下!!!!

markliteng 发表于 2007-7-2 12:40:48

还有个问题想问一下YAN:你是怎样在LAVA中调用汇编的?或者说那个程序入口在什么地方!

qhlixpfh 发表于 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,cutBuf,fileHead;
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[]={"GVmaker IDE..",
       "LAVAXIDE..",
       "NC3000 GVM..",
       "TC800 GVM..",
       "其他平台.."
       };
long _jiXing(){
int tag,n;
printf("Eastsun");
tag = 1;
for(n=0;n<7;n++) if(*(0x1400+n)!=test){ tag = 0; break;}
if(tag) return LAVAX;
tag = 1;
for(n=0;n<7;n++) if(*(0x01c0+n)!=test) { tag = 0; break;}
if(tag) return GVMIDE;
tag = 1;
for(n=0;n<7;n++) if(*(0x0f1a+n)!=test) {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!=&#39;F&#39;||fileHead!=&#39;L&#39;||fileHead!=&#39;M&#39;||fileHead!=0x10){
   //不是有效的FLM文件
   fclose(fp);
   return 0;
}
if(fileHead){//压缩格式的flm文件
   frame =fileHead+(fileHead<<8); //祯数
   speed =fileHead; //速度(延迟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 =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;
            if(byte<0x40){
               if(byte) count =byte;
               elsecount =0x40;
               m =m+count;
               n ++;
            }      
            else if(byte<0x80){
               if(byte&0x3f) count =byte&0x3f;
               else   count =0x40;
               do{
                bmpBuf--;
                m ++;
                count --;
               }while(count);
               n ++;
            }
            else if(byte<0xc0){
               if(byte&0x3f) count =byte&0x3f;
               else   count =0x40;
               n ++;
               do{
                bmpBuf =bmpBuf +cutBuf;
                  m ++;
                n ++;
                count --;
               }while(count);
            }
            else{
               if(byte&0x3f) count =byte&0x3f;
               else   count =0x40;
               deta =cutBuf[++n];
               do{
                bmpBuf =bmpBuf +deta;
                  m ++;
                  count --;
               }while(count);
               n ++;
         }
          }while(cutBuf-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;
   int n,t;
   t =jiXing();
   if(!t) n=4;
   else{
    n=0;
    while(t!=type) n++;
   }
   ClearScreen();
   TextOut(20,16,str,0x81);
   Refresh();
   Delay(1000);
   ChDir("/");
for (;;) {
   if (!FileList(fn)) {
      ChDir("..");
      continue;
   }
   if (ChDir(fn)) continue;
   playFlm2(fn);
   ChDir("/");
}
}

qhlixpfh 发表于 2007-7-2 13:35:57

这个:
#include <***.y>
char buf[]={0x00,0x1d,0x05,0x60};

void main()
{
exeasm(buf)
}
即执行 brk $051d
       rts

qhlixpfh 发表于 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=

qhlixpfh 发表于 2007-7-2 15:47:23

看出来了,很麻烦耶

yan 发表于 2007-7-2 16:20:13

谢谢lz的支持!
不过我只需要circle和ellipse两个函数就够了.能不能改一下?
4灰度的显存都是$1384起始

yan 发表于 2007-7-2 16:24:02

引用第3楼markliteng于2007-07-02 12:40发表的“”:
还有个问题想问一下YAN:你是怎样在LAVA中调用汇编的?或者说那个程序入口在什么地方!
就是用eastsun的方法.

POTO 发表于 2007-7-2 18:21:02

支持啊!!!

rid 发表于 2007-7-2 22:07:23

好困难啊!!!

Loading 发表于 2007-7-4 21:33:32

看不懂也顶

gcwy 发表于 2007-7-12 17:36:46

引用第9楼yan于2007-07-02 16:20发表的“”:
谢谢lz的支持!
不过我只需要circle和ellipse两个函数就够了.能不能改一下?
4灰度的显存都是$1384起始


4灰度的显存不是$1380吗?

gcwy 发表于 2007-7-12 17:40:06

LZ真是强人啊
不知道LZ是否能写出在4灰度模式下用的UpdateText函数
和贴图函数

dragon_ 发表于 2007-7-16 23:05:55

貌似yan没用LZ的代码?

POTO 发表于 2007-7-17 07:55:27

好像是

yan 发表于 2007-7-17 13:19:05

呵呵,我发布了四灰度库后lz才发布的。而已我的方法是直接hack解释器,比较简单和不太占内存空间,所以就不采纳了。

绿鸟 发表于 2007-7-18 09:36:41

汇编,老是觉得好长啊。

红色激情 发表于 2007-7-18 11:25:37

页: [1] 2
查看完整版本: [代码]4灰度状态下的作图函数,用汇编完成