易码技术论坛

 找回密码
 加入易码
搜索
查看: 446907|回复: 17

[修改]lava版的nc3000与电脑通讯程序~求人测试~7.4更新

[复制链接]
发表于 2007-7-1 14:46:56 | 显示全部楼层
不错,支持!
发表于 2007-7-1 14:51:49 | 显示全部楼层
^_^。这个技术文好啊!
发表于 2007-7-1 14:54:00 | 显示全部楼层
有机会我把它封装成com口库。
 楼主| 发表于 2007-7-1 15:02:19 | 显示全部楼层
要封装成库的话还有很多问题要解决,不知道有谁研究过com口通讯,nc3000一次最大能发送和接收多少数据?地址在哪?这些都还不懂
发表于 2007-7-1 15:26:26 | 显示全部楼层
技术……支持个!可惜偶3000牺牲了,要不也来研究把~~可惜啊…………
发表于 2007-7-1 15:34:45 | 显示全部楼层
其实我们都在做别人早已做过的事……
其实我们都在做别人早已不做的事……
发表于 2007-7-1 15:54:19 | 显示全部楼层
引用第6楼yan2007-07-01 15:34发表的“”:
其实我们都在做别人早已做过的事……
其实我们都在做别人早已不做的事……
话虽如此,但还是乐在其中啊~~
发表于 2007-7-1 16:41:28 | 显示全部楼层
我K,这个比较强悍啊……
发表于 2007-7-1 17:14:36 | 显示全部楼层
强啊~~~~!!!!!!!!!!!!!
发表于 2007-7-1 18:19:16 | 显示全部楼层
好东西啊
嘿嘿
最近NC3000幸福啊
支持!!
发表于 2007-7-1 19:19:10 | 显示全部楼层
支持啊!
 楼主| 发表于 2007-7-2 13:59:16 | 显示全部楼层
更新了一下
支持的函数有
void ComOpen();
void ComClose();
char ComGetc();
ComPutc(char wsdata);
发表于 2007-7-2 14:19:34 | 显示全部楼层
支持啊,虽然没有nc3000
 楼主| 发表于 2007-7-3 18:52:08 | 显示全部楼层
到目前为止的源代码,ComRead实在是不知道怎么写,ComWrite也不太稳定,将就着用吧,哪位有心的朋友可以继续研究,我的汇编太烂,只能这样了
#define i3a 0x3a
#define i3b 0x3b
#define i3c 0x3c
#define i3d 0x3d
#define i3e 0x3e
#define i3f 0x3f
   
#include <NC3000.y>



char asm[]={0xa9,0x1,0x8d,0xcc,0xf,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0xa9,0x4,0x85,0x3d,0xa9,0x1,0x85,0x3b,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x3,0x85,0x3d,0x68,0x28,0xad,0x3d,0x4,0x9,0x90,0x85,0x3a,0x8d,0x3d,0x4,0xad,0x3c,0x4,0x9,0x90,0x85,0x3c,0x8d,0x3c,0x4,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x1,0x85,0x3d,0x68,0x28,0xa9,0x0,0x85,0x3b,0xa9,0x30,0x85,0x3d,0xa9,0x0,0x8d,0xc9,0xf,0xa9,0x10,0x8d,0xca,0xf,0xa9,0x0,0x8d,0xaa,0xf,0xa9,0x0,0x8d,0xf6,0x3,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0x68,0x28,0xa9,0x0,0x85,0x3d,0xa9,0x4,0x85,0x3d,0xa9,0x8,0x48,0xa9,0xa,0x85,0x3e,0xad,0xf4,0x6,0x29,0xf,0x85,0x3f,0x8d,0xf4,0x6,0xa9,0xb,0x85,0x3e,0xa9,0x4,0x85,0x3f,0x68,0x8d,0xfa,0x6,0x8d,0xfc,0x6,0xa9,0xa,0x85,0x3e,0xad,0xf4,0x6,0x9,0x70,0x85,0x3f,0x8d,0xf4,0x6,0xad,0xfa,0x6,0xd0,0xfb,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0x68,0x28,0xa5,0x3b,0x29,0x60,0xc9,0x60,0xf0,0x1e,0xad,0xc9,0xf,0xd0,0x3,0xce,0xca,0xf,0xce,0xc9,0xf,0xad,0xca,0xf,0xc9,0x0,0xd0,0x5,0xad,0xc9,0xf,0xc9,0x0,0xd0,0x5,0xa9,0x1,0x8d,0xaa,0xf,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x1,0x85,0x3d,0x68,0x28,0xa9,0x30,0x85,0x3d,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x0,0x85,0x3d,0x68,0x28,0xa9,0x2,0x85,0x3c,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x1,0x85,0x3d,0x68,0x28,0xad,0xcc,0xf,0x85,0x3a,0xa9,0x80,0x85,0x17,0xad,0x36,0x4,0x9,0x8,0x85,0x18,0x8d,0x36,0x4,0x8,0x48,0xa5,0x3d,0x29,0xfc,0x9,0x2,0x85,0x3d,0x68,0x28,0xa9,0x20,0x85,0x3c,0x60};
//打开串口的汇编程序,从ftplink中抄出来的!

/*
char switch(char val)  //这个函数没用到,可以留着先
{
*i3d=((*i3d)&0xfc)|val;
}

*/


//========================这个可以用
void ComSetTimer()
{
*i3e=0x00;
*0x45=(*i3f)&0x3f;
}





//原型 int System.ComXor(char data[],size+1)
//功能 校验数据
//说明 data为缓冲区,size为数据长度,data的最后一位为校验值,正确返回0,否则返回非0
int ComXor(char data[],long size)
{
int i;
char chk;
char temp;
temp=data[0];
chk=data[size-1];
for(i=1;i<size-1;i++)temp=temp^data;
if(temp==chk)return 0;
else return -1;
}

void ComWaitReady()  //不知道能不能用
{
for(;;)
{
*i3d=(*i3d)&0xfc;
//if(*i3b&0x9e)continue;  //跳往出错的地方
if((*i3b&0x60)==0x60)break;
}
}



//==========================ComClose_begin============================

char ComClose()  //这个也可以用
{
*i3d=(*i3d)&0xfc;
*i3d=(*i3d)&0xfb;
*i3d=((*i3d)&0xfc)|0x02;
*i3c=0x00;
}
//==========================ComClose_end=====================================

//==============================ComOpen_begin=================================================
void ComOpen() //端口打开函数
{
exeasm(asm);
}
//==============================ComOpen_end=================================================


//===============================ComGetc_beign===============================================
char check_rxrdy()  //1为有数据,0为无数据
{
char temp;
*0x03f6=0x00;
temp=(*i3b)&0x01;
if (temp) return 1;
else return 0;
}

char ComGetc()  //读数据
{
*i3d=(*i3d)&0xfc;
while(!check_rxrdy());
return *i3a;
}
//============================ComGetc_end========================================================

//================================ComPutc_begin==================================================
char check_txrdy()  ////1为有数据,0为无数据
{
char temp;
temp=(*i3b)&0x60;
if (temp) return 1;
else return 0;
}

long ComPutc(char wsdata)//没有加超时处理,这个函数可以用!
{
char temp;
*i3d=(*i3d)&0xfc;
while(!check_txrdy());
*i3a=wsdata;
}
//================================ComPutc_end==================================================


//================================ComRead_begin==================================================
char rin()
{
char temp;
*i3d=(*i3d)&0xfc;
for(;;)
{
if((*i3c)&0x10) break;
*i3e=0x00;
temp=(*i3f)&0x3f;
if(temp<(*0x45))temp=temp+(*i3c);
if(temp>=0x02)break;
}
return *i3a;
}

void ComRead(char &data[],int size)
{
char word;
int i=0;
ComWaitReady();
ComSetTimer();
for(;;)
{
if(i>=size)break;
word=rin();
data[i++]=word;
}
}
//================================ComRead_end==================================================

//================================ComWrite_begin==================================================
void ComWrite(char &data[],int size)
{
int i=0;
for(;;)
{
if(i>=size)break;
ComPutc(data[i++]);
}
}
//================================ComWrite_end==================================================


void main()
{
char word;
char data[51];
int i;
i=0;
SetScreen(0);
printf("Hello Com!\n");
strcpy(data,"01234567890123456789");
ComOpen();
for(;;)
{
if(Inkey()==27)exit(0);
ComSetTimer();
ComWaitReady();
word=ComGetc();
putchar(word);
ComPutc(word);
}
printf("%s\nok",data);
ComClose();
getchar();

}
发表于 2007-7-3 19:03:37 | 显示全部楼层
顶啊
有希望再英雄坛说lav中加入通讯对战
发表于 2007-7-3 19:11:11 | 显示全部楼层
这个可以加精了~
 楼主| 发表于 2007-7-4 17:53:22 | 显示全部楼层
在顶楼更新了~
 楼主| 发表于 2007-7-1 14:43:15 | 显示全部楼层 |阅读模式
使用前可参考

[原创]感谢LEE的FTPLINK!我成功实现LAVA通讯!LAVA可以玩联机游戏了!
http://www.emsky.net/bbs/read.php?tid=1699&keyword=ftplink

通过对源程序的修改,终于实现了在nc3000的lava与电脑通讯的问题,以后有心的朋友可以做联机游戏了。
现把程序的源代码和使用的工具放上来

以下为原版的说明文件

警告!
这是一个测试软件,如果你不知道你在干什么,请删除这个软件!
本人不会对此软件造成的一切不良后果负责!


  此软件为LAVA打开通讯端口的测试程序,此程序只适用于nc3000!其他机型请别使用。

本代码是通过数据线将WQX和电脑相连通过电脑端的串口调试软件来演示LAVA
通讯的。
  
演示说明:
   用串口调试软件打开数据线相连的串口,比特率为115200,运行文曲星上
的原代码.lav。通过串口调试软件发送任意字符,WQX会在屏幕上显示后发
回电脑,然后在电脑上显示!

另外说明:WQX的串口只有17字节的FIFO缓存,也就是说LAVA速度比较慢,如果
你一次性发送了大于17字节的代码,那多出的部分WQX是收不到的!
   原代码里忘了写关闭串口的函数,需要的可以等等,我会发上来的!

   有了这断代码,始LAVA制作联机游戏成为了可能!不过是测试版,效率不高
忘广大星迷们改进!


此程序只适用于nc3000!有心人可以写出其他机型的通讯函数,以后就可以写联机游戏了


这是打开串口的汇编程序源码
  
  LDA $0436
  ORA #$08
  STA $18
  STA $0436
  LDA #$FF
  STA $60
  LDA $3D
  AND #$FC
  ORA #$02
  STA $3D
  LDA #$20
  STA $3C
  LDA #$02
  STA $3D
  LDA $3D
  AND #$FC
  ORA #$01
  STA $3D
  LDA #$00
  STA $3B
  LDA $3D
  AND #$FC
  ORA #$00
  STA $3D
  LDA $3D
  ORA #$04
  STA $3D
  PHP
  PHA
  LDA $3D
  AND #$FC
  ORA #$01
  STA $3D
  PLA
  PLP
  LDA #$30
  STA $3D
  NOP
  NOP
  NOP
  LDA $3D
  AND #$FC
  ORA #$00
  STA $3D
  LDA $3B
  CMP #$60
  BEQ e308B
  LDA $3D
  AND #$FB
  STA $3D
  NOP
  NOP
  NOP
  NOP
  LDA $3D
  ORA #$04
  STA $3D      ;到这里止
e308B:
  LDA $3D
  AND #$FC
  ORA #$00
  STA $3D
  LDA #$23
  STA $3B
  LDA $3D
  AND #$FC
  ORA #$01
  STA $3D
  LDA #$99
  STA $3A
  LDA $3D
  AND #$FC
  ORA #$00
  STA $3D
  LDA #$02
  STA $3C
  LDA #$80
  STA $17
  rts

7.2更新
修改了一下源代码目前支持的函数有
void ComOpen();
void ComClose();
char ComGetc();
ComPutc(char wsdata);
其他函数正在研究中...

7.4更新
几乎支持所有通讯函数,但是有一个问题
那就是如果电脑一次性发送的数据超过17字节,wqx只能正常接收前17字节,原因不明
在汇编下没有这种情况,初步猜想应该是lava的原因
大家有什么好的解决方法??
还有,有nc3000的朋友帮忙测试一下能不能双机互传(自己写一个简单的程序就行了)
目前已知nc3000和tc800无法互传,原因不明
移植到nc2600也很简单,只要把comopen修改一下就可以了
如果解决了上面的问题,那么lava就极有可能支持

Com.rar

279 KB, 下载次数: 200

电脑端和文曲星端的程序7.4更新

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

本版积分规则

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

GMT+8, 2025-4-30 06:55 , Processed in 0.019569 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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