⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrup.cpp

📁 用C++控制喷泉程序
💻 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;
	}
 }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -