📄 tbtx.c
字号:
#include "tyclh.h"
volatile unsigned int *reg_point1,*reg_point2 ;
int len;
unsigned cc1,ccc[20];
struct StructKeyNode KeyNode;
Boolean bNewSysRdData,bNewData,bNewKey;
int nNewSysDataRdPreAdr;
/*long nTbCount,nTbCountTxInt,nTbCountRxInt;*/
Boolean bNewSysWrData,bRefurbish;
int nNewSysDataWrPreAdr;
#define SOH 0x7e7e
#define SOH_REAPT 0x8181
#define Make_TxCrc nTbTxCrc ^=
#define Make_RxCrc nTbRxCrc ^=
extern TbWrSysTab,TbRdSysTab;
unsigned int nTbRxCrc;
Boolean bTbRxSoh;
unsigned int nTbRxBegin,nTbRxEnd;
unsigned int nTbRxChBuf[256],nTbRxChLen,nTbRxCh[256];
Boolean bTbTxSoh;
unsigned int nTbTxBegin,nTbTxEnd;
unsigned int nTbTxChBuf[256],nTbTxCh[256];
unsigned int nTbTxCrc;
void TbTranRxData();
void TbTx_Data();
/*--------------------------------------*/
void ReadRom(rom_area,ram_area,length)
unsigned int rom_area[],ram_area[],length;
{ len=length;
reg_point2=ram_area;
reg_point1=rom_area;
asm(" MAR *,AR4 ");
asm(" ldpk _reg_point2 ");
asm(" LAR AR4,_reg_point2");
asm(" ldpk _reg_point1 ");
asm(" lacc _reg_point1 ");
asm(" RPT _len ");
asm(" TBLR *+,AR4 ");
}
/*--------------------------------------*/
void TbTxInit()
{long i;
bTbRxSoh=0;
nTbRxChLen=0;
nTbRxBegin=0;
nTbRxEnd=0;
bTbTxSoh=0;
nTbTxBegin=0;
nTbTxEnd=0;
reg_sspcr=0xcc0a;
reg_sspcr=0xcc3a;
bNewSysRdData=True;
bNewData=bNewSysWrData=False;
nNewSysDataRdPreAdr=0;
nNewSysDataWrPreAdr=0;
/* nTbCount=0;nTbCountTxInt=0;nTbCountRxInt=0;*/
}/*-------------------------------------*/
Boolean TbGetRxCrc(unsigned int nTbRxChar[])
/*nTbRxChar[],nTbRxChBuf[],nTbRxChLen,nTbRxBegin,nTbRxEnd ,bTbRxSoh*/
{
unsigned int k;
unsigned int nTbRxChPre;
if(nTbRxBegin==nTbRxEnd) return(False);
for(;nTbRxBegin!=nTbRxEnd;nTbRxBegin++,nTbRxBegin &=0x00ff)
{ if(nTbRxChLen>256-1)
{ nTbRxChLen=0;
nTbRxCrc=0;
bTbRxSoh=False;
}
nTbRxChPre=nTbRxChBuf[nTbRxBegin];
if(bTbRxSoh==True)
{
if (nTbRxChPre==SOH)
{
if(nTbRxChLen > 2)
{
nTbRxChLen=0;
bTbRxSoh = False;
if(nTbRxCrc==0)
{return(True);}
nTbRxCrc = 0;
return(1); /*break for, just finshed*/
}
else
{ nTbRxChLen=0;
nTbRxCrc=0;
bTbRxSoh=True;
}/*len*/
}/*wait soh to again*/
else if(nTbRxChLen>0 && nTbRxChPre==SOH_REAPT)
{ bTbRxSoh=False ; /*input SOH_REAPT*/
Make_RxCrc SOH;
nTbRxChar[nTbRxChLen]=SOH;/*in "7E"*/
nTbRxChLen++;
}
else/* 'bsoh=True*/
{ nTbRxCrc=0;
nTbRxChar[0]=nTbRxChPre; /*in first data*/
nTbRxChLen=1;
bTbRxSoh=False;
Make_RxCrc nTbRxChPre;
}
}/*soh */
/* 'bsoh = False*/
else if(nTbRxChPre==SOH)/*in first SOH*/
{ bTbRxSoh=True;}
else if(nTbRxChLen>0)
{ bTbRxSoh=False;
nTbRxChar[nTbRxChLen]=nTbRxChPre; /*input a byte*/
nTbRxChLen++;
Make_RxCrc nTbRxChPre;
}
}/*end for*/
return(False);
}/*-------------------------------------*/
Boolean TbSentTxCrc(unsigned int *Txdata,unsigned int Len)
/*user *nTbTxChBuff[],nTbTxBegin,nTbTxEnd*/
{
unsigned int n,k,nTbTxChPre,nSaveTxEnd,*reg_p;
nSaveTxEnd=nTbTxEnd;
if(nTbTxBegin>nTbTxEnd){n=nTbTxBegin-nTbTxEnd;}
else {n=256-nTbTxBegin+nTbTxEnd;}
if(n<Len+6){return(False);}
else
{ /* nTbTxChBuf[nTbTxEnd++]=0x7E; */
nTbTxChBuf[nTbTxEnd]=SOH;
nTbTxEnd++;nTbTxEnd &=0x00ff;
nTbTxCrc=0;
for(k=0;k<Len;k++)
{ nTbTxChPre=*Txdata++;
if(nTbTxEnd==nTbTxBegin){nTbTxEnd=nSaveTxEnd;return(False);}
Make_TxCrc nTbTxChPre;
nTbTxChBuf[nTbTxEnd]=nTbTxChPre;
nTbTxEnd++;nTbTxEnd &=0x00ff;
if(nTbTxChPre ==SOH)
{ if(nTbTxEnd==nTbTxBegin){nTbTxEnd=nSaveTxEnd;return(False);}
nTbTxChBuf[nTbTxEnd]=SOH_REAPT;
nTbTxEnd++;nTbTxEnd &=0x00ff;
}
}
}
Make_TxCrc 0;
if(nTbTxEnd==nTbTxBegin){nTbTxEnd=nSaveTxEnd;return(False);}
nTbTxChBuf[nTbTxEnd]=nTbTxCrc;
nTbTxEnd++;nTbTxEnd &=0x00ff;
if(nTbTxChPre==SOH)
{ if(nTbTxEnd==nTbTxBegin){nTbTxEnd=nSaveTxEnd;return(False);}
nTbTxChBuf[nTbTxEnd]=SOH_REAPT;
nTbTxEnd++;nTbTxEnd &=0x00ff;
}
for(k=0;k<3;k++)
{
if(nTbTxEnd==nTbTxBegin)
{nTbTxEnd=nSaveTxEnd;return(False);}
nTbTxChBuf[nTbTxEnd]=SOH;
nTbTxEnd++;nTbTxEnd &=0x00ff;
}
reg_p=(unsigned int *)reg_imr;
if((*reg_p & 0x0010)==0)
{*reg_p |=0x00010;}
return(True);
}/*-------------------------------------*/
Boolean TbTranTxData(unsigned int command,unsigned int Len,unsigned int *info,unsigned int *nTxBuf)
{
unsigned int i,k,*reg_p;
if(Len>256-1) return(False);
*nTxBuf++=command;
*nTxBuf++=Len;
for(i=2;i<Len+2;i++) { *nTxBuf++=*info++;}
nTxBuf=nTxBuf-Len-2;
i=TbSentTxCrc(nTxBuf,Len+2);
if(i==False)
{reg_p=(unsigned int *)reg_imr;
if((*reg_p & 0x0010)==0)
{*reg_p |=0x00010;}
}
return(i);
}/*-------------------------------------*/
interrupt void TbTxInt()
{
unsigned int i,flag_sspcr,*reg_p;
reg_p=(unsigned int *)reg_ifr;
/* nTbCountTxInt++;*/
if(nTbTxBegin==nTbTxEnd)
{
*reg_p |=0x0010;
reg_p=(unsigned int *)reg_imr;
*reg_p &=0xffef;
return;
}
if((reg_sspcr & 0x2000)==0)
{
for(i=0;i<4;i++)
{
if(nTbTxBegin==nTbTxEnd)
{ reg_sdtr=SOH;
}
else
{
reg_sdtr=nTbTxChBuf[nTbTxBegin++];
nTbTxBegin &=0x00ff;
}
}
}
*reg_p |=0x0010;
}/*---------------------------------*/
interrupt void TbRxInt()
{
unsigned int iii,*reg_p;
/* nTbCountRxInt++;*/
reg_p=(unsigned int *)reg_ifr;
if((reg_sspcr & 0x0080)!=0)
iii=0;
cc1++;
cc1 &=0xf;
iii=0; iii=0;
while((reg_sspcr & 0x1000)!=0)
{
iii++;
nTbRxChBuf[nTbRxEnd++]=reg_sdtr;
nTbRxEnd &=0x00ff;
}
ccc[cc1]=iii;
*reg_p =0x0008;
}/*---------------------------------*/
void RdSysData()
{unsigned nTab[5];
ReadRom((unsigned *)((&TbRdSysTab)+nNewSysDataRdPreAdr),nTab,4);
if(nTab[0]==0 )
{nNewSysDataRdPreAdr=0;bNewSysRdData=False;
bNewData=True;
// TbTranTxData(0x4444,1,nTbRxCh,nTbTxCh);
return;}
TbTranTxData(0x2200,4,nTab,nTbTxCh);
}/*-------------------------------------*/
Boolean WrSysData()
{
unsigned int i,*reg_p,*info;
int Len;
ReadRom((unsigned *)((&TbWrSysTab)+nNewSysDataWrPreAdr),nTbTxCh+1,4);
if(nTbTxCh[1]==0)
{nNewSysDataWrPreAdr=0;
if(bRefurbish==True)
TbTranTxData(0x4444,1,nTbRxCh,nTbTxCh);
return;}
Len=nTbTxCh[2];
info=(unsigned *)nTbTxCh[1];
reg_p=nTbTxCh;
if(Len>256-1) return(False);
*reg_p++=0x3355;
*reg_p++=Len+3;
reg_p+=3;
for(i=5;i<Len+5;i++) { *reg_p++=*info++;}
i=TbSentTxCrc(nTbTxCh,Len+5);
if(i==False)
{reg_p=(unsigned int *)reg_imr;
if((*reg_p & 0x0010)==0)
{*reg_p |=0x00010;
}
}
else nNewSysDataWrPreAdr+=4;
return(i);
}/*-------------------------------------*/
void TbTranRxData(int *nTime)
{
unsigned int i;
unsigned int *pd,*ps;
i=TbGetRxCrc(nTbRxCh);
if(i==False) {return; }
if(i==1)
{
TbTranTxData(0x1515,1,nTbRxCh,nTbTxCh);/*err*/
return;
}
switch(nTbRxCh[0])
{case 0x1515 :
{
*nTime=0x5555;
}
case 0x55aa :
{
/* TbTranTxData(0x550a,4,nTbRxCh,nTbTxCh);
pd=(unsigned int *)nTbRxCh[1];
ps=nTbRxCh+3;
if(nTbRxCh[1]==0x1900)
for(i=0;i<20;i++)
{ if((unsigned int )pd<1800)
{break;}
*pd++=*ps++;
}
*/ break;
}
case 0x550a :
{
i=0;
break;
}
case 0x3355 :
{
*nTime=0;
WrSysData();
break;
}
case 0x2255 : /*Claim New data*/
{
bNewSysRdData=True;
nNewSysDataRdPreAdr=0;
RdSysData();nNewSysDataRdPreAdr+=4;
*nTime=0;
break;
}
case 0x2200 : /**/
{
pd=(unsigned *)nTbTxCh[2];
if((unsigned)pd<0x100)return;
for(i=0,ps=nTbRxCh+4;i<nTbRxCh[3];i++)
*pd++=*ps++;
/*if(nTbRxCh[2]==3299)
{if(!(nTbRxCh[4]==6666))
{i=i;}} */
RdSysData();nNewSysDataRdPreAdr+=4;
*nTime=0;
break;
}
case 0x4444 :
bRefurbish=False;
bNewSysWrData=False;
break;
case 0x6666 :
KeyNode.nkey=nTbRxCh[2];
KeyNode.nPageType=nTbRxCh[3];
KeyNode.nCs=nTbRxCh[4];
KeyNode.nPage=nTbRxCh[5];
KeyNode.nCursor=nTbRxCh[6];
KeyNode.nCursorPreLine=nTbRxCh[7];
KeyNode.nCursorOldLine=nTbRxCh[8];
KeyNode.nPageNo=nTbRxCh[9];
KeyNode.nSerial=nTbRxCh[10];
TbTranTxData(0x6666,1,nTbRxCh,nTbTxCh);
bNewKey=True;
default :{;break;}
}
}/*-------------------------------------*/
void SysTb(int *nTime,unsigned nConstTime)
{ TbTranRxData(nTime);
/* nTbCount++;
if(nTbCount>177700)
{
if(nTbCountTxInt<10 || nTbCountRxInt<10)
{TbTxInit();}
else {nTbCountRxInt=0;nTbCountTxInt=0;}
nTbCount=0;
}
*/ if(bNewSysRdData && *nTime>300)
{
RdSysData();*nTime=0;
}
if(bNewSysWrData && *nTime>400)
{
WrSysData();*nTime=0;
}
if(*nTime>nConstTime)
{
nNewSysDataWrPreAdr=0;*nTime=0;
bNewSysWrData=True;
WrSysData();
}
if(bNewSysWrData==False && bRefurbish==True)
{
nNewSysDataWrPreAdr=0;*nTime=0;bNewSysWrData=True;
WrSysData();
}
}/*-------------------------------------*/
Boolean TbTranRdKey()
{
unsigned int i,k,*reg_p;
reg_p=nTbTxCh;
*reg_p++=0x6677;
*reg_p++=8;
*reg_p++=0;
*reg_p++=0;
*reg_p++=0;
*reg_p++=0;
*reg_p++=0;
*reg_p++=0;
*reg_p++=0;
*reg_p++=0;
i=TbSentTxCrc(nTbTxCh,10);
bNewKey=False;
if(i==False)
{reg_p=(unsigned int *)reg_imr;
if((*reg_p & 0x0010)==0)
{*reg_p |=0x00010;
k=reg_sspcr;}
}
return(i);
}/*-------------------------------------*/
void Txtest()
{
unsigned int a[30],i;
for(i=0;i<20;i++)a[i]=i;
TbTranTxData(0x55aa,10,a,nTbTxCh);
for(i=0;i<0x7ff;i++)
a[0]=i;
for(i=0;i<0x7ff;i++)
a[0]=i;
for(i=0;i<0x7ff;i++)
a[0]=i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -