?? interrup.cpp
字號:
#include "dos.h"
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#include "macro.h"
#include "struct.h"
#include "vardec.h"
void interrupt (*OldInt)(__CPPARGS);
void interrupt IntCtrl(__CPPARGS);
void interrupt (*OldComInt)(__CPPARGS);
void interrupt IntComCtrl(__CPPARGS);
unsigned char ComOutBuff[COMBUFMAXRECORD][COMBUFMAXRECORDBYTE];//={
// {0x02,0x0c,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x7f,0x13,0x88,0x00},
// {0x02,0x0c,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x7f,0x13,0x88,0x00},
// };
//={
// {0x02,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7f,0x20,0x00,0x00},
// {0x02,0x0e,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7f,0x20,0x00,0x00},
// };
unsigned char ComInBuff[COMBUFMAXRECORD][COMBUFMAXRECORDBYTE];
int ComOutBuffRecordHead=COMBUFMAXRECORD-1;
int ComOutBuffRecordEnd=0;
int ComInBuffRecordHead=COMBUFMAXRECORD-1;
int ComInBuffRecordEnd=0;
unsigned long GetTimeTimeCount=0;
unsigned long GetTime(void)
{
static unsigned long oldtime;
unsigned long time;
char val[2];
unsigned int *k=(unsigned int *)&val[0];
disable();
outportb(0x43,0x04);
val[0]=inportb(0x40);
val[1]=inportb(0x40);
enable();
*k=0xffff-*k;
time=(unsigned long)GetTimeTimeCount*55uL+*k/1192ul;
if(time<oldtime)
{
time=oldtime;
}
else
{
oldtime=time;
}
return(time);
};
void InitIntrrupt()
{
disable();
// outportb(0x43,0x34);
// outportb(0x40,0x00);
// outportb(0x40,0x00);
OldInt = getvect(0x08);
setvect(0x08,IntCtrl);
enable();
}
void ResumeIntrrupt(void)
{
disable();
setvect(0x08,OldInt);
enable();
}
void interrupt IntCtrl(__CPPARGS)
{
GetTimeTimeCount++;
(*OldInt)();
}
void InitComInterrupt(COMSTR com,unsigned int baudrate,unsigned int parity,
unsigned int databitnum,unsigned int stopbitnum)
{
unsigned int BDIV;
COMBASE=com.COMBASE;
inportb(COMBASE+MSREG);
inportb(COMBASE+LSREG);
inportb(COMBASE+REIVEREG);
outportb(COMBASE+LCREG,0X80);
BDIV=1843200L/(16L*baudrate);
outportb(COMBASE+LSBREG,BDIV);
outportb(COMBASE+MSBREG,BDIV>>8);
outportb(COMBASE+LCREG,parity+databitnum+stopbitnum);
disable();
OldComInt=getvect(com.COMINTNUM);
setvect(com.COMINTNUM,IntComCtrl);
enable();
outportb(0x21,inportb(0x21)&(~com.IRQMASK));
outportb(COMBASE+LCREG,inportb(COMBASE+LCREG)&0x7f);
outportb(COMBASE+MCREG,DTR+RTS+OUT2);
outportb(COMBASE+IEREG,ERRORINT);//READINT+WRITEINT+ERRORINT);
inportb(COMBASE+MSREG);
inportb(COMBASE+LSREG);
outportb(COMBASE+TRANSMITREG,0x00);
inportb(COMBASE+REIVEREG);
};
void ResumeInitComInterrupt(COMSTR com)
{
outportb(0x21,inportb(0x21)|com.IRQMASK);
disable();
setvect(com.COMINTNUM,OldComInt);
enable();
};
void interrupt IntComCtrl(__CPPARGS)
{
// static int Out_i=1;
// static int In_i=0;
// static int InEnableFlag=0;
// static unsigned char InBCC=0;
// static unsigned char OutBCC=0x02;
// static unsigned long oldtime=0;
unsigned char idd;
unsigned char temp;
idd=inportb(COMBASE+IIDREG);
switch(idd)
{
/* case READINTTYPE:
{
temp=inportb(COMBASE+REIVEREG);
if(InEnableFlag==1)
{
if((ComInBuffRecordEnd+1)%COMBUFMAXRECORD!=ComInBuffRecordHead)
{
if(In_i==COMBUFMAXRECORDBYTE-1)
{
if(InBCC==temp)
{
ComInBuffRecordEnd++;
ComInBuffRecordEnd=ComInBuffRecordEnd%COMBUFMAXRECORD;
}
In_i=0;
InBCC=0;
InEnableFlag=0;
}
else
{
ComInBuff[ComInBuffRecordEnd][In_i]=temp;
if(ComInBuff[ComInBuffRecordEnd][0]==0x02)
{
InBCC=InBCC^temp;
In_i++;
}
}
}
}
else
{
In_i=0;
}
}
break;
case WRITEINTTYPE:
{
if(ComOutBuffRecordHead!=ComOutBuffRecordEnd)
{
InEnableFlag=0;
if(Out_i==COMBUFMAXRECORDBYTE-1)
{
outportb(COMBASE+TRANSMITREG,OutBCC);
ComOutBuff[ComOutBuffRecordHead][Out_i]=OutBCC;
}
else
{
outportb(COMBASE+TRANSMITREG,ComOutBuff[ComOutBuffRecordHead][Out_i]);
OutBCC=OutBCC^ComOutBuff[ComOutBuffRecordHead][Out_i];
}
Out_i++;
if(Out_i>=COMBUFMAXRECORDBYTE)
{
ComOutBuffRecordHead++;
ComOutBuffRecordHead=ComOutBuffRecordHead%COMBUFMAXRECORD;
Out_i=1;
ComInBuff[ComInBuffRecordEnd][0]=0x00;
InEnableFlag=1;
In_i=0;
InBCC=0;
OutBCC=0x02;
}
}
else
{
// outportb(COMBASE+TRANSMITREG,0x00);
Out_i=1;
}
}
break; */
case ERRORINTTYPE:
{
inportb(COMBASE+LSREG);
}
}
outportb(0x20,0x20);
};
void ComWrite(void)
{
static int In_i=0;
static int InEnableFlag=0;
static unsigned char InBCC=0;
static int Out_i;
static unsigned char OutBCC;
unsigned char lsr=inportb(COMBASE+LSREG);
unsigned char temp;
if(lsr&0X20)
{
int temphead=(ComOutBuffRecordHead+1)%COMBUFMAXRECORD;
if(temphead!=ComOutBuffRecordEnd)
{
// if(inportb(COMBASE+LSREG)&0X20)
// {
InEnableFlag=0;
if(Out_i==COMBUFMAXRECORDBYTE-1)
{
outportb(COMBASE+TRANSMITREG,OutBCC);
ComOutBuff[temphead][Out_i]=OutBCC;
}
else
{
outportb(COMBASE+TRANSMITREG,ComOutBuff[temphead][Out_i]);
OutBCC=OutBCC^ComOutBuff[temphead][Out_i];
}
Out_i++;
if(Out_i>=COMBUFMAXRECORDBYTE)
{
ComOutBuffRecordHead=temphead;
Out_i=0;
ComInBuff[ComInBuffRecordEnd][0]=0x00;
InEnableFlag=1;
In_i=0;
InBCC=0;
OutBCC=0x00;
}
// }
}
}
if(lsr&0x01)
{
temp=inportb(COMBASE+REIVEREG);
if(InEnableFlag==1)
{
if((ComInBuffRecordEnd+1)%COMBUFMAXRECORD!=ComInBuffRecordHead)
{
if(In_i==COMBUFMAXRECORDBYTE-1)
{
if(InBCC==temp)
{
ComInBuffRecordEnd++;
ComInBuffRecordEnd=ComInBuffRecordEnd%COMBUFMAXRECORD;
}
In_i=0;
InBCC=0;
InEnableFlag=0;
}
else
{
ComInBuff[ComInBuffRecordEnd][In_i]=temp;
if(ComInBuff[ComInBuffRecordEnd][0]==0x02)
{
InBCC=InBCC^temp;
In_i++;
}
}
}
}
else
{
In_i=0;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -