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

📄 timer.cpp

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

///////////////////////
//暂时假设定时器开启时不能对T0 T1计数器设置新的数值
//
//
///////////////////////
void TIMER_T0_WRITE_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	TIMER_TCON_TR0_HOOK(VarNum,mode,var8051[VarNum]->pTIMER->TR0);
}

void TIMER_T1_WRITE_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	TIMER_TCON_TR1_HOOK(VarNum,mode,var8051[VarNum]->pTIMER->TR1);
}
void TIMER_TH0_Mode3_CLOCK_HOOK(BYTE  VarNum,unsigned short Clocknum)
{
	if(var8051[VarNum]->pTIMER->TR1)//停止定时则不会发生中断,T0 mode3时TH0使用T1的TR1 TF1
	{
		//产生中断
		//根据模式计算下一个HOOK
		
		var8051[VarNum]->IPC->Setinterrupt(TF1);
		//var8051[VarNum]->pTIMER->TH0_Mode3_Clock_CallBackNum=256+var8051[VarNum]->KMsg->Clockpos;
		//var8051[VarNum]->KMsg->CallBackAfterRelativeClock(256,TIMER_T0_CLOCK_HOOK);
		var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS.CLOCK_POS=256;			
		var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_TH0_Mode3_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS));
		//var8051[VarNum]->IPC->Setinterrupt(TF1);
	}

}

void TIMER_T0_CLOCK_HOOK(BYTE  VarNum,unsigned short Clocknum)//定时器溢出HOOK
{
//	unsigned short buf=var8051[VarNum]->KMsg->Clockpos;
	unsigned int NextClock=0;
	if(var8051[VarNum]->pTIMER->TR0)//停止定时则不会发生中断
	{
		//产生中断
		//根据模式计算下一个发生HOOK的时间
		//TX T0;
		var8051[VarNum]->IPC->Setinterrupt(TF0);
		var8051[VarNum]->pTIMER->T0.Tlh.TH=var8051[VarNum]->mem->GetidataMemBytef(TH0);
		switch(var8051[VarNum]->pTIMER->T0Mode)//计算溢出中断HOOK的触发时机
		{
		case 0:	
			NextClock=8192;
			break;
		case 1:
			NextClock=65535;
			break;
		case 2:
			NextClock=256-var8051[VarNum]->pTIMER->T0.Tlh.TH;
			break;
		case 3:
			NextClock=256;
			break;
		default: return;
		}
		
		var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS.CLOCK_POS=NextClock;
		var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_T0_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS));
	}
	return ;
}
void TIMER_T1_CLOCK_HOOK(BYTE  VarNum,unsigned short Clocknum)
{
	//return;//T1开关
	if(var8051[VarNum]->pTIMER->TR1||var8051[VarNum]->pTIMER->T0Mode==3)
	{
		
		//产生中断
		//根据模式计算下一个HOOK
		if(var8051[VarNum]->mem->GetidataMemBytef(IE)&0x88==0x88)
		{
			if(var8051[VarNum]->pTIMER->T0Mode!=3)
			{
			
				var8051[VarNum]->IPC->Setinterrupt(TF1);
			}
		}
		else
		{
			var8051[VarNum]->mem->SetBitf(TCON_TF1,1);
		}
		//else
		//{
		//}
		unsigned int NextClock=0;
		//TX T1;
		var8051[VarNum]->pTIMER->T1.Tlh.TH=var8051[VarNum]->mem->GetidataMemBytef(TH1);
		switch(var8051[VarNum]->pTIMER->T1Mode)//计算溢出中断HOOK的触发时机
		{
		case 0:	
			NextClock=8192;
			break;
		case 1:
			NextClock=65536;
			break;
		case 2:
			NextClock=256-var8051[VarNum]->pTIMER->T1.Tlh.TH;
			break;
		default: return;
		}			
		var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS.CLOCK_POS=NextClock;
		var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_T1_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS));
	}
	
	return ;
}
void TIMER_T0T1_READ_HOOK(BYTE  VarNum,int mode,BYTE data)//data=1表示TR HOOK中调用该函数
{
	unsigned short buf=var8051[VarNum]->KMsg->Clockpos;
	unsigned short buf1=var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS.CLOCK_POS;
	unsigned short buf2=var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS.CLOCK_POS;	
	unsigned short buf3=var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS.CLOCK_POS;
	TX T0,T1;
	if(var8051[VarNum]->pTIMER->TR0||data==1)
	{
		if(buf1>buf)
		{
			buf1=buf1-buf;
		}
		else
		{
			buf1=65536-buf+buf1;
		}
		if(var8051[VarNum]->pTIMER->T0Mode==3)
		{
			if(buf3>buf)
			{
				buf3=buf3-buf;
			}
			else
			{
				buf3=65536-buf+buf3;
			}
		}
		switch(var8051[VarNum]->pTIMER->T0Mode)//计算溢出中断HOOK的触发时机
			{
			case 0:	
				T0.Tx=8192-buf1;
				T0.Tx=T0.Tx<<3;
				T0.Tlh.TL=T0.Tlh.TL>>3;
				var8051[VarNum]->mem->SetidataMemBytef(TL0,T0.Tlh.TL);
				var8051[VarNum]->mem->SetidataMemBytef(TH0,T0.Tlh.TH);
				break;
			case 1:
				T0.Tx=65536-buf1;
				var8051[VarNum]->mem->SetidataMemBytef(TL0,T0.Tlh.TL);
				var8051[VarNum]->mem->SetidataMemBytef(TH0,T0.Tlh.TH);
				break;
			case 2:
				T0.Tx=256-buf1;
				//var8051[VarNum]->mem->SetidataMemBytef(TL0,var8051[VarNum]->pTIMER->T0.Tlh.TL);
				if(T0.Tlh.TL)
				{
					var8051[VarNum]->mem->SetidataMemBytef(TL0,T0.Tlh.TL);
				}
				else
				{
					var8051[VarNum]->mem->SetidataMemBytef(TL0,var8051[VarNum]->mem->GetidataMemBytef(TH0));
				}
				break;
			case 3:
				T0.Tx=256-buf1;
				var8051[VarNum]->mem->SetidataMemBytef(TL0,T0.Tlh.TL);
				T0.Tx=256-buf3;
				var8051[VarNum]->mem->SetidataMemBytef(TH0,T0.Tlh.TH);
				break;
			default: return;
			}
	}
	if(var8051[VarNum]->pTIMER->T1Mode!=3)//T1mode==3就停止计算保持原有t1数值
	{
		if(var8051[VarNum]->pTIMER->TR1||data==1)
		{
			if(buf2>buf)
			{
				buf2-=buf;
			}
			else
			{
				buf2+=(65536-buf);
			}
			switch(var8051[VarNum]->pTIMER->T1Mode)//计算溢出中断HOOK的触发时机
				{
				case 0:	
					T1.Tx=8192-buf2;
					T1.Tx=T1.Tx<<3;
					T1.Tlh.TL=T1.Tlh.TL>>3;
					var8051[VarNum]->mem->SetidataMemBytef(TL1,T1.Tlh.TL);
					var8051[VarNum]->mem->SetidataMemBytef(TH1,T1.Tlh.TH);
					break;
				case 1:
					T1.Tx=65536-buf2;
					var8051[VarNum]->mem->SetidataMemBytef(TL1,T1.Tlh.TL);
					var8051[VarNum]->mem->SetidataMemBytef(TH1,T1.Tlh.TH);
					break;
				case 2:
					T1.Tx=256-buf2;
					//var8051[VarNum]->mem->SetidataMemBytef(TL1,var8051[VarNum]->pTIMER->T1.Tlh.TL);
					if(T1.Tlh.TL)
					{
						var8051[VarNum]->mem->SetidataMemBytef(TL1,T1.Tlh.TL);
					}
					else
					{
						var8051[VarNum]->mem->SetidataMemBytef(TL1,var8051[VarNum]->mem->GetidataMemBytef(TH1));
					}

					break;
				default: return;
				}
		}
	}
	return ;
}

void TIMER_TMOD_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	var8051[VarNum]->pTIMER->T0Mode=data&0x3;
	var8051[VarNum]->pTIMER->T1Mode=data&0x30;
	var8051[VarNum]->pTIMER->T1Mode=var8051[VarNum]->pTIMER->T1Mode>>4;
	TIMER_TCON_HOOK(VarNum,mode,var8051[VarNum]->mem->idata[TCON]);
	//C_T0=data&0x4;//暂时还不考虑实现下面这些功能位
	//C_T1=data&0x40;
	//GATE0=data&0x8;
	//GATA1=data&0x80;
	return ;
}

void TIMER_TCON_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	if(data&0x10)
	{
		TIMER_TCON_TR0_HOOK(VarNum,mode,data&0x10);
	}
	if(data&0x40)
	{
		TIMER_TCON_TR1_HOOK(VarNum,mode,data&0x40);
	}
	//设置TCON可能会造成中断,这是从串口可以被软件中断这个现象总结出来的
	//var8051[VarNum]->IPC->CheakIRQ();
	return ;
}

void TIMER_TCON_TR0_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	
	unsigned int NextClock=0;//为什么不取unsigned short?因为NextClock的最大值是65536,超出了1
	//取消当前的ClockHook
	var8051[VarNum]->KMsg->CancelCallBackByClocknum(&(var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS));
	if(data)
	{
		//用不加f系列的函数是为了触发定时器寄存器刷新
		var8051[VarNum]->pTIMER->T0.Tlh.TL=var8051[VarNum]->mem->GetidataMemByte(TL0);
		var8051[VarNum]->pTIMER->T0.Tlh.TH=var8051[VarNum]->mem->GetidataMemByte(TH0);
		switch(var8051[VarNum]->pTIMER->T0Mode)//计算溢出中断HOOK的触发时机
		{
		case 0:	
			var8051[VarNum]->pTIMER->T0.Tlh.TL=var8051[VarNum]->pTIMER->T0.Tlh.TL<<3;
			var8051[VarNum]->pTIMER->T0.Tx=var8051[VarNum]->pTIMER->T0.Tx>>3;
			NextClock=8192-var8051[VarNum]->pTIMER->T0.Tx;
			break;
		case 1:
			NextClock=65536-var8051[VarNum]->pTIMER->T0.Tx;
			break;
		case 2:
			NextClock=256-var8051[VarNum]->pTIMER->T0.Tlh.TL;
			break;
		case 3:
			NextClock=256-var8051[VarNum]->pTIMER->T0.Tlh.TL;
			var8051[VarNum]->KMsg->CancelCallBackByClocknum(&(var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS));
			var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS.CLOCK_POS=256-var8051[VarNum]->pTIMER->T0.Tlh.TH;			
			var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_TH0_Mode3_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T0MODE3CLOCKEVENTPOS));
			break;
		default: return;
		}
		var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS.CLOCK_POS=NextClock;
		var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_T0_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T0CLOCKEVENTPOS));
	}
	var8051[VarNum]->pTIMER->TR0=data;
/*	else
	{
		//计算出真正的T0并设置寄存器T0
		if(var8051[VarNum]->pTIMER->TR0)//TR0=0的话不用计算
		{
			TIMER_T0T1_READ_HOOK(VarNum,Read,1);
		}
	}*/
	//var8051[VarNum]->pTIMER->TR0=data;
	
	return ;
}

void TIMER_TCON_TR1_HOOK(BYTE  VarNum,int mode,BYTE data)
{
	unsigned int NextClock=0;//为什么不取unsigned short?因为NextClock的最大值是65536,超出了1
	//取消当前的ClockHook
	var8051[VarNum]->KMsg->CancelCallBackByClocknum(&(var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS));
	if(data)
	{
		//用不加f系列的函数是为了触发定时器寄存器刷新
		var8051[VarNum]->pTIMER->T1.Tlh.TL=var8051[VarNum]->mem->GetidataMemByte(TL1);
		var8051[VarNum]->pTIMER->T1.Tlh.TH=var8051[VarNum]->mem->GetidataMemByte(TH1);
		switch(var8051[VarNum]->pTIMER->T0Mode)//计算溢出中断HOOK的触发时机
		{
		case 0:	
			var8051[VarNum]->pTIMER->T1.Tlh.TL=var8051[VarNum]->pTIMER->T1.Tlh.TL<<3;
			var8051[VarNum]->pTIMER->T1.Tx=var8051[VarNum]->pTIMER->T1.Tx>>3;
			NextClock=8192-var8051[VarNum]->pTIMER->T1.Tx;
			break;
		case 1:
			NextClock=65536-var8051[VarNum]->pTIMER->T1.Tx;
			break;
		case 2:
			NextClock=256-var8051[VarNum]->pTIMER->T1.Tlh.TL;
			break;
		case 3:
			
			break;
		default: return;
		}
		var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS.CLOCK_POS=NextClock;
		var8051[VarNum]->KMsg->CallBackAfterRelativeClock(TIMER_T1_CLOCK_HOOK,&(var8051[VarNum]->pTIMER->T1CLOCKEVENTPOS));
	}
	var8051[VarNum]->pTIMER->TR1=data;
/*	unsigned int NextClock=0;
	//取消当前的ClockHook
	var8051[VarNum]->KMsg->CancelCallBackByClocknum(var8051[VarNum]->pTIMER->T1_Clock_CallBackNum,var8051[VarNum]->pTIMER->T1_Clock_BackFun);
	if(data)
	{
		var8051[VarNum]->pTIMER->T1.Tlh.TL=var8051[VarNum]->mem->GetidataMemByte(TL1);
		var8051[VarNum]->pTIMER->T1.Tlh.TH=var8051[VarNum]->mem->GetidataMemByte(TH1);
		switch(var8051[VarNum]->pTIMER->T1Mode)//计算溢出中断HOOK的触发时机
		{
		case 0:	
			var8051[VarNum]->pTIMER->T1.Tlh.TL=var8051[VarNum]->pTIMER->T1.Tlh.TL<<3;
			var8051[VarNum]->pTIMER->T1.Tx=var8051[VarNum]->pTIMER->T1.Tx>>3;
			NextClock=8192-var8051[VarNum]->pTIMER->T1.Tx;
			break;
		case 1:
			NextClock=65536-var8051[VarNum]->pTIMER->T1.Tx;
			break;
		case 2:
			NextClock=256-var8051[VarNum]->pTIMER->T1.Tlh.TL;
			break;
		case 3:
			//var8051[VarNum]->pTIMER->TR1=0;//停止中断
			break;
		default: return;
		}
		var8051[VarNum]->pTIMER->T1_Clock_CallBackNum=NextClock+var8051[VarNum]->KMsg->Clockpos;
		var8051[VarNum]->pTIMER->T1_Clock_BackFun=var8051[VarNum]->KMsg->CallBackAfterRelativeClock(NextClock,TIMER_T1_CLOCK_HOOK);
		if(var8051[VarNum]->pTIMER->T1_Clock_BackFun==TIMER_T1_CLOCK_HOOK)
		{
			var8051[VarNum]->pTIMER->T1_Clock_BackFun=0;
		}

	}
	else
	{
		//计算出真正的T1并设置寄存器T1
		if(var8051[VarNum]->pTIMER->TR1)//TR0=0的话不用计算
		{
			TIMER_T0T1_READ_HOOK(VarNum,Read,1);
		}
	}
	var8051[VarNum]->pTIMER->TR1=data;
	*/
	return ;
}

TIMER::TIMER()
{

}

TIMER::~TIMER()
{

}

int TIMER::init()
{
	//CodeSpace 0
	//BitSpace 1
	//IdataSpace 2
	//XdataSpace 3
	T0Mode=0;
	T1Mode=0;
	GATE0=0;
	GATE1=0;
	T0.Tx=0;
	T1.Tx=0;
	C_T0=0;
	C_T1=0;
	TR0=0;
	TR1=0;
	T0CLOCKEVENTPOS.CLOCK_POS=0;
	T0CLOCKEVENTPOS.EVENT_QUEUE_POS=0;
	T1CLOCKEVENTPOS.CLOCK_POS=0;
	T1CLOCKEVENTPOS.EVENT_QUEUE_POS=0;
	T0MODE3CLOCKEVENTPOS.CLOCK_POS=0;
	T0MODE3CLOCKEVENTPOS.EVENT_QUEUE_POS=0;
	pKMsg->SetupMemHook(TL0,IdataSpace,Read,TIMER_T0T1_READ_HOOK);//读取定时器时计算
	pKMsg->SetupMemHook(TH0,IdataSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TL1,IdataSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TH1,IdataSpace,Read,TIMER_T0T1_READ_HOOK);

	pKMsg->SetupMemHook(TL0,IdataSpace,Write,TIMER_T0_WRITE_HOOK);//写定时器时计算
	pKMsg->SetupMemHook(TH0,IdataSpace,Write,TIMER_T0_WRITE_HOOK);
	pKMsg->SetupMemHook(TL1,IdataSpace,Write,TIMER_T1_WRITE_HOOK);
	pKMsg->SetupMemHook(TH1,IdataSpace,Write,TIMER_T1_WRITE_HOOK);


/*	pKMsg->SetupMemHook(TMOD_,BitSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TH0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TL0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TH0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TL0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TH0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TL0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
	pKMsg->SetupMemHook(TH0,BitSpace,Read,TIMER_T0T1_READ_HOOK);
*/
	//TMOD虽然定义了位,但似乎没有位寻址模式
	pKMsg->SetupMemHook(TCON_TR0,BitSpace,Write,TIMER_TCON_TR0_HOOK);
	pKMsg->SetupMemHook(TCON_TR1,BitSpace,Write,TIMER_TCON_TR1_HOOK);

	pKMsg->SetupMemHook(TMOD,IdataSpace,Write,TIMER_TMOD_HOOK);
	pKMsg->SetupMemHook(TCON,IdataSpace,Write,TIMER_TCON_HOOK);

	return 0;
}


⌨️ 快捷键说明

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