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; }
void Cpu::CoreCrash(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vError(fmt, ap); va_end(ap); CoreDump(); this->PowerOn = false; }
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; }