Ejemplo n.º 1
0
ssize_t CBitmap::TimeTick(time_t iNow)
{
	//数据量标准
	bool bNeedCoreDump = false;
	if(m_iTotalBinLogSize > 0)
	{
		if(m_stBinLog.GetBinLogTotalSize() >= m_iTotalBinLogSize)
		{
			bNeedCoreDump = true;
		}
	}

	//时间标准
	if (m_iDumpMin > 0)
	{
		time_t tNow = iNow;
		if (!tNow)	
			tNow = time(NULL);
		
		if(tNow -m_pHeadInfo->m_tLastDumpTime >=  (m_iDumpMin*60))
		{
			bNeedCoreDump = true;
		}
	}

	if(bNeedCoreDump)
	{
		CoreDump();
	}	

	return 0;
}
Ejemplo n.º 2
0
void Cpu::CoreCrash(const char *fmt, ...)
{
	va_list ap;
	va_start(ap, fmt);
	vError(fmt, ap);
	va_end(ap);
	CoreDump();
	this->PowerOn = false;
}
Ejemplo n.º 3
0
bool Cpu::RunUnit()
{
	unsigned char Cmd = ((*(vmem + this->rp)) & 0xF0) >> 4;
	unsigned char Addr = 0, AddrSec = 0, Flag = 0, DataType = 0, CalType = 0;
	unsigned int Argu = 0, ArguSec = 0, CmdLen = CmdLengthMap[Cmd];
	switch(CmdLen)
	{
	case 1:
		break;
	case 5:		// X[Addressing] [Argument]
		Addr = (*(vmem + this->rp)) & 0x0F;
		Argu = *(int*)(vmem + this->rp + 1);
		break;
	case 6:		// X[Flag] [Addressing] [Argument]
		Flag = (*(vmem + this->rp)) & 0x0F;
		Addr = *(vmem + this->rp + 1);
		Argu = *(int*)(vmem + this->rp + 2);
		break;
	case 10:	// X[DataType|0] [0|CalType][Multi-Addressing] [Argument1] [Argument2]
		DataType = (*(vmem + this->rp)) & 0x0F;
		if (DataType > 4)
		{
			CoreCrash("Unknow data type:%d", DataType);
			return false;
		}
		CalType = ((*(vmem + this->rp + 1)) & 0xF0) >> 4;
		Addr = (*(vmem + this->rp + 1)) & 0x0F;
		AddrSec = Addr & 0x03;
		Addr >>= 2;
		Argu = *(int*)(vmem + this->rp + 2);
		ArguSec = *(int*)(vmem + this->rp + 6);
		break;
	}
	// Log("%s\n", CmdName[Cmd]);
	switch(Cmd)
	{
	case 0x0:		// NOOP
		this->rp += CmdLen;
		break;
	case 0x1:		// LD
		PutData(Addr, Argu, GetData(AddrSec, ArguSec), DataType);
		this->rp += CmdLen;
		break;
	case 0x2:		// PUSH
		Push(GetData(Addr, Argu));
		this->rp += CmdLen;
		break;
	case 0x3:		// POP
		PutData(Addr, Argu, Pop(), DataType);
		this->rp += CmdLen;
		break;
	case 0x4:		// IN
		PutData(Addr, Argu, InPort(GetData(AddrSec, ArguSec)), DataType);
		this->rp += CmdLen;
		break;
	case 0x5:		// OUT
		OutPort(GetData(Addr, Argu), GetData(AddrSec, ArguSec));
		this->rp += CmdLen;
		break;
	case 0x6:		// JMP
		this->rp = GetData(Addr, Argu);
		break;
	case 0x7:		// JPC
		if (GetFlag(Flag) == true)
		{
			this->rp = GetData(Addr, Argu);
		} else {
			this->rp += CmdLen;
		}
		break;
	case 0x8:		// CALL
		Push(this->rp + CmdLen);
		this->rp = GetData(Addr, Argu);
		break;
	case 0x9:		// RET
		this->rp = Pop();
		break;
	case 0xA:		// CMP
		{
			int op1 = (int)GetData(Addr, Argu), op2 = (int)GetData(AddrSec, ArguSec);
			switch(DataType)
			{
			case BYTE:
				op1 &= 0xFF; op2 &= 0xFF;
			case WORD:
				op1 &= 0xFFFF; op2 &= 0xFFFF;
			case DWORD: case INT:
				if (op1 == op2) {PutFlag(Z);}
				else if (op1 < op2) {PutFlag(B);}
				else if (op1 > op2) {PutFlag(A);}
				break;
			case FLOAT:
				{
					float opf1, opf2;
					conv.i = op1; opf1 = conv.f;
					conv.i = op2; opf2 = conv.f;
					if (opf1 == opf2) {PutFlag(Z);}
					else if (opf1 < opf2) {PutFlag(B);}
					else if (opf1 > opf2) {PutFlag(A);}
				}
				break;
			}
		}
		this->rp += CmdLen;
		break;
	case 0xB:		// CAL
		{
			int op1 = (int)GetData(Addr, Argu), op2 = (int)GetData(AddrSec, ArguSec), result = 0;
			switch(DataType)
			{
			case BYTE:
				op1 &= 0xFF; op2 &= 0xFF;
			case WORD:
				op1 &= 0xFFFF; op2 &= 0xFFFF;
			case DWORD: case INT:
				switch(CalType)
				{
				case ADD: result = op1 + op2; break;
				case SUB: result = op1 - op2; break;
				case MUL: result = op1 * op2; break;
				case DIV: result = op1 / op2; break;
				case MOD: result = op1 % op2; break;
				default:
					CoreCrash("Unknow operator: %d", CalType);
				}
				break;
			case FLOAT:
				{
					float opf1, opf2, resultf = 0.0f;
					conv.i = op1; opf1 = conv.f;
					conv.i = op2; opf2 = conv.f;
					switch(CalType)
					{
					case ADD: resultf = opf1 + opf2; break;
					case SUB: resultf = opf1 - opf2; break;
					case MUL: resultf = opf1 * opf2; break;
					case DIV: resultf = opf1 / opf2; break;
					default:
						CoreCrash("Unknow operator: %d", CalType);
					}
					conv.f = resultf;
					result = conv.i;
				}
				break;
			}
			PutData(Addr, Argu, result, DataType);
		}
		this->rp += CmdLen;
		break;
	case 0xF:		// EXIT
		return false;
	default:
		CoreCrash("Unpredictable command on [0x%08X] :", rp);
		CoreDump();
		return false;
	}
	return true;
}