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

📄 serial.cpp

📁 一款国产的8051模拟器(全部源代码) 本软件是一款8051模拟器
💻 CPP
字号:
// Serial.cpp: implementation of the Serial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GlobalVar.h"
#include "Serial.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//调试ucosii时发现一串口程序居然能软件产生串口中断,不知这是不是真实存在的
//keil c中支持这种软件中断,开中断情况下TI=1居然能强制处理器发生串口中断
//教科书上我没有发现有这种方式,为了兼容期间本模拟器加入这种中断方式,但是其他中断是否有此特性?
//////////////////////////////////////////////////////////////////////



Serial::Serial()
{

}

Serial::~Serial()
{

}

void Serial::SetSBUStxd(SerialBus *pBUS)
{
	psbustxd=pBUS;
	psbustxd->SetInObj(this);

}

void Serial::SetSBUSrxd(SerialBus *pBUS)
{
	psbusrxd=pBUS;
	psbusrxd->SetOutObj((MyObject *)this);
	//MyObject::Serial_Char_Event_CallBack('a');
}

int Serial::Serial_Char_Event_CallBack(char ch)
{
	if(RecvComplete)
	{
		chbuf=ch;
		RecvComplete=0;
		RICLOCKEVENTPOS.CLOCK_POS=Cycle;
		pKMsg->CallBackAfterRelativeClock(RI_Clock_HOOKFun,&(RICLOCKEVENTPOS));
	}
	else
	{
		chbuf=ch;
		RecvComplete=0;
		RICLOCKEVENTPOS.CLOCK_POS=Cycle;
		pKMsg->CallBackAfterRelativeClock(RI_Clock_HOOKFun,&(RICLOCKEVENTPOS));//为了实现不会丢失数据的川口,暂时先这样吧
		return -1;
	}
	//if(var8051[VarNum]->PS->psbustxd==NULL)
	//{
	//	return ;
	//}
	//var8051[VarNum]->PS->psbustxd->SendChar(var8051[VarNum]->PS->SBUFW);
	//AfxMessageBox("int Serial::Serial_Char_Event_CallBack(char ch)");
	return 1;
}

void TI_HOOKFun(BYTE  VarNum,int mode,BYTE data)//由于串口中断可软件控制,所以增加这种软件中断的方法
{
	
		//var8051[VarNum]->IPC->SetSRIRQflag(TI,1);
		//var8051[VarNum]->KMsg->CancelCallBackByClocknum(var8051[VarNum]->PS->TIHOOK_Clock_BackFunNum,TIHOOK_Clock_HOOKFun);
		//因该延迟多少呢?var8051[VarNum]->PS->Cycle?还是1?
//		var8051[VarNum]->PS->TIHOOK_Clock_BackFun=var8051[VarNum]->KMsg->CallBackAfterRelativeClock(1,TIHOOK_Clock_HOOKFun);
//		var8051[VarNum]->PS->TIHOOK_Clock_BackFunNum=var8051[VarNum]->KMsg->GetCurrentClockpos()+1;
	if(data&0x2)
	{
		var8051[VarNum]->PS->TICLOCKEVENTPOS.CLOCK_POS=1;
		var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIHOOK_Clock_HOOKFun,&(var8051[VarNum]->PS->TICLOCKEVENTPOS));
	}
	
}
void TIHOOK_Clock_HOOKFun(BYTE  VarNum,unsigned short Clocknum)
{
	
	var8051[VarNum]->IPC->Setinterrupt(RITI);
//	var8051[VarNum]->PS->SendComplete=1;
	
//	var8051[VarNum]->inst->ClockHookFun[var8051[VarNum]->KMsg->Clockpos]=0;
}
void RIHOOK_Clock_HOOKFun(BYTE  VarNum,unsigned short Clocknum)
{
	
	var8051[VarNum]->IPC->Setinterrupt(RITI);
//	var8051[VarNum]->PS->SendComplete=1;
	
//	var8051[VarNum]->inst->ClockHookFun[var8051[VarNum]->KMsg->Clockpos]=0;
}


void RI_HOOKFun(BYTE  VarNum,int mode,BYTE data)
{
	if(data&0x1)
	{
		var8051[VarNum]->PS->RICLOCKEVENTPOS.CLOCK_POS=1;
		var8051[VarNum]->KMsg->CallBackAfterRelativeClock(RIHOOK_Clock_HOOKFun,&(var8051[VarNum]->PS->RICLOCKEVENTPOS));
	}
	
}


void Serial_SCON_Write_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	switch(data&0x3)
	{
	case 1:
		RI_HOOKFun(VarNum,mode,data);
		break;
	case 2:
		TI_HOOKFun(VarNum,mode,data);
		break;
	case 3:
		RI_HOOKFun(VarNum,mode,data);
		TI_HOOKFun(VarNum,mode,data);
		break;
	default: break;
	}
}


void TI_Clock_HOOKFun(BYTE  VarNum,unsigned short Clocknum)
{
	var8051[VarNum]->IPC->SetSRIRQflag(TI,1);
	var8051[VarNum]->IPC->Setinterrupt(RITI);
	var8051[VarNum]->PS->SendComplete=1;
	
/*	if(var8051[VarNum]->PS->bufpos<(var8051[VarNum]->PS->databuf1+65551))
	{
		*var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->SBUFW;
		var8051[VarNum]->PS->bufpos++;
	}*/
/*	if(var8051[VarNum]->PS->SBUFW>0x80&&var8051[VarNum]->PS->CFlag==0)
	{
		var8051[VarNum]->PS->CFlag=1;
		*var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->SBUFW;
		var8051[VarNum]->PS->bufpos++;		
		if(var8051[VarNum]->PS->SBUFW=='\n'||var8051[VarNum]->PS->bufpos>(var8051[VarNum]->PS->databuf1+64));
		{
			*var8051[VarNum]->PS->bufpos=0x00;
			var8051[VarNum]->PS->psbus->SendString((TCHAR *)var8051[VarNum]->PS->databuf1);
			var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->databuf1;
		}
		
	}
	else
	{
		if(var8051[VarNum]->PS->CFlag==1)
		{
			*var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->SBUFW;
			var8051[VarNum]->PS->bufpos++;		
			if(var8051[VarNum]->PS->SBUFW=='\n'||var8051[VarNum]->PS->bufpos>(var8051[VarNum]->PS->databuf1+64));
			{
				*var8051[VarNum]->PS->bufpos=0x00;
				var8051[VarNum]->PS->psbus->SendString((TCHAR *)var8051[VarNum]->PS->databuf1);
				var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->databuf1;
			}
			var8051[VarNum]->PS->CFlag=0;
		}
		var8051[VarNum]->PS->psbus->SendChar(var8051[VarNum]->PS->SBUFW);
	}*/

/*	*var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->SBUFW;
	var8051[VarNum]->PS->bufpos++;
	if(var8051[VarNum]->PS->SBUFW=='\n')//||var8051[VarNum]->PS->bufpos>(var8051[VarNum]->PS->databuf1+64))
	{
		
		*var8051[VarNum]->PS->bufpos=0x00;
		if(var8051[VarNum]->PS->bufpos==var8051[VarNum]->PS->databuf1)
		{
			return ;
		}
		var8051[VarNum]->PS->psbustxd->SendString((TCHAR *)var8051[VarNum]->PS->databuf1);
		var8051[VarNum]->PS->bufpos=var8051[VarNum]->PS->databuf1;
	}*/
	
//	var8051[VarNum]->inst->ClockHookFun[var8051[VarNum]->KMsg->Clockpos]=0;

	//return;
}

void RI_Clock_HOOKFun(BYTE  VarNum,unsigned short Clocknum)
{
	var8051[VarNum]->PS->SBUFR=var8051[VarNum]->PS->chbuf;
	var8051[VarNum]->IPC->SetSRIRQflag(RI,1);
	var8051[VarNum]->IPC->Setinterrupt(RITI);
	var8051[VarNum]->PS->RecvComplete=1;
}

void Serial_SBUF_Read_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	var8051[VarNum]->mem->SetidataMemBytef(SBUF,var8051[VarNum]->PS->SBUFR);
}

void Serial_SBUF_Write_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	
	if(var8051[VarNum]->PS->SendComplete)
	{
		var8051[VarNum]->PS->SBUFW=data;
		var8051[VarNum]->PS->SendComplete=0;
		var8051[VarNum]->PS->TICLOCKEVENTPOS.CLOCK_POS=var8051[VarNum]->PS->Cycle;
		var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TI_Clock_HOOKFun,&(var8051[VarNum]->PS->TICLOCKEVENTPOS));
		if(var8051[VarNum]->PS->psbustxd==NULL)
		{
			return ;
		}
		var8051[VarNum]->PS->psbustxd->SendChar(data);
	}	
	
}


int Serial::init()
{
	SBUFR=0;
	SBUFW=0;
	Cycle=20;
	psbustxd=NULL;
	psbusrxd=NULL;
	CFlag=0;
	Baudrate=19200;
	bufpos=databuf1;
	SendComplete=1;
	RecvComplete=1;
	TICLOCKEVENTPOS.CLOCK_POS=0;
	TICLOCKEVENTPOS.EVENT_QUEUE_POS=0;
	RICLOCKEVENTPOS.CLOCK_POS=0;
	RICLOCKEVENTPOS.EVENT_QUEUE_POS=0;
#if OS!=1
	memset(databuf1,0,65536*64);
	memset(databuf2,0,65536);
#endif
#if OS==1
	ZeroMemory(databuf1,65536*64*sizeof(unsigned char));
	ZeroMemory(databuf1,65536*sizeof(unsigned char));
#endif
	pKMsg->SetupMemHook(SBUF,IdataSpace,Read,Serial_SBUF_Read_HOOK);
	pKMsg->SetupMemHook(SBUF,IdataSpace,Write,Serial_SBUF_Write_HOOK);
/*	pKMsg->SetupMemHook(SCON,IdataSpace,Write,Serial_SCON_Write_HOOK);
	//下面两个HOOK到底能不能加呢??????????
	pKMsg->SetupMemHook(SCON_RI,BitSpace,Write,RI_HOOKFun);
	pKMsg->SetupMemHook(SCON_TI,BitSpace,Write,TI_HOOKFun);
	pKMsg->SetupMemHook(SCON_RB8,BitSpace,Write,Serial_SCON_Write_HOOK);
	pKMsg->SetupMemHook(SCON_TB8,BitSpace,Write,Serial_SCON_Write_HOOK);
	pKMsg->SetupMemHook(SCON_REN,BitSpace,Write,Serial_SCON_Write_HOOK);
	pKMsg->SetupMemHook(SCON_SM2,BitSpace,Write,Serial_SCON_Write_HOOK);
	pKMsg->SetupMemHook(SCON_SM1,BitSpace,Write,Serial_SCON_Write_HOOK);
	pKMsg->SetupMemHook(SCON_SM0,BitSpace,Write,Serial_SCON_Write_HOOK);*/
	//pKMsg->SetupMemHook(SCON_RI,BitSpace,Write,Serial_SCON_Write_HOOK);


	return 1;
}
//MyObject

⌨️ 快捷键说明

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