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

📄 manager.cpp

📁 mini mips 小型mips软件
💻 CPP
字号:
#include "StdAfx.h"
#include "Manager.h"

string Manager::PrintNum(unsigned num){
		ostringstream os;
		os << setw(8) << setfill('0') << hex << num;
		return os.str();
}

char *Manager::RegisterFormat[26]={
"PC      = %s   EPC     = %s  Cause   = %s  BadVAddr= %s",
"Status  = %s   HI      = %s  LO      = %s",
"                    General Registers",
"R0 (r0) = %s R8  (t0) = %s  R16 (s0) = %s R24 (t8) = %s",
"R1 (at) = %s R9  (t1) = %s  R17 (s1) = %s R25 (t9) = %s",
"R2 (v0) = %s R10 (t2) = %s  R18 (s2) = %s R26 (k0) = %s",
"R3 (v1) = %s R11 (t3) = %s  R19 (s3) = %s R27 (k1) = %s",
"R4 (a0) = %s R12 (t4) = %s  R20 (s4) = %s R28 (gp) = %s",
"R5 (a1) = %s R13 (t5) = %s  R21 (s5) = %s R29 (sp) = %s",
"R6 (a2) = %s R14 (t6) = %s  R22 (s6) = %s R30 (s8) = %s",
"R7 (a3) = %s R15 (t7) = %s  R23 (s7) = %s R31 (ra) = %s",
"",
"                    Double Floating Point Registers",
"FP0  = %8.6lf\tFP8  = %8.6lf\tFP16 = %8.6lf\tFP24 = %8.6lf\t",
"FP2  = %8.6lf\tFP10 = %8.6lf\tFP18 = %8.6lf\tFP26 = %8.6lf\t",
"FP4  = %8.6lf\tFP12 = %8.6lf\tFP20 = %8.6lf\tFP28 = %8.6lf\t",
"FP6  = %8.6lf\tFP14 = %8.6lf\tFP22 = %8.6lf\tFP30 = %8.6lf\t",
"                   Single Floating Point Registers",
"FP0  = %8.6f\tFP8  = %8.6f\tFP16 = %8.6f\tFP24 = %8.6f\t",
"FP1  = %8.6f\tFP9  = %8.6f\tFP17 = %8.6f\tFP25 = %8.6f\t",
"FP2  = %8.6f\tFP10 = %8.6f\tFP18 = %8.6f\tFP26 = %8.6f\t",
"FP3  = %8.6f\tFP11 = %8.6f\tFP19 = %8.6f\tFP27 = %8.6f\t",
"FP4  = %8.6f\tFP12 = %8.6f\tFP20 = %8.6f\tFP28 = %8.6f\t",
"FP5  = %8.6f\tFP13 = %8.6f\tFP21 = %8.6f\tFP29 = %8.6f\t",
"FP6  = %8.6f\tFP14 = %8.6f\tFP22 = %8.6f\tFP30 = %8.6f\t",
"FP7  = %8.6f\tFP15 = %8.6f\tFP23 = %8.6f\tFP31 = %8.6f\t"
};

void Manager::ShowStatus(vector<string>& ret){
	ret.clear();
	ret.resize(26);
	string line;
	char buf[100];
	buf[0] = '\0';
	sprintf_s(buf, 99, RegisterFormat[0], PrintNum(cpu.Data.PC.GetPC()).c_str(), PrintNum(cpu.Data.eIRegister.EPC.UIntV).c_str(),
		PrintNum(cpu.Data.eIRegister.BadVAddr.UIntV).c_str(), PrintNum(cpu.Data.eIRegister.BadVAddr.UIntV).c_str());
	ret[0] = buf; buf[0] = '\0';

	sprintf_s(buf, 99, RegisterFormat[1], PrintNum(cpu.Data.eIRegister.Status.UIntV).c_str(), PrintNum(cpu.Data.HI.UIntV).c_str(),
		PrintNum(cpu.Data.LO.UIntV).c_str());
	ret[1] = buf; buf[0] = '\0';

	ret[2] = RegisterFormat[2];

	for (int i = 3; i < 11; ++i){
		sprintf_s(buf, 99, RegisterFormat[i], PrintNum(cpu.Data.generalRegister[i - 3].UIntV).c_str(),
											  PrintNum(cpu.Data.generalRegister[i + 5].UIntV).c_str(),
											  PrintNum(cpu.Data.generalRegister[i + 13].UIntV).c_str(),
											  PrintNum(cpu.Data.generalRegister[i + 21].UIntV).c_str());
		ret[i] = buf;
		buf[0] = '\0';
	}

	ret[11] = RegisterFormat[11];
	ret[12] = RegisterFormat[12];

	for (int i = 13; i < 17; ++i){
		sprintf_s(buf, 99, RegisterFormat[i], cpu.Data.floatingRegister.GetValueD((i - 13) * 2),
											  cpu.Data.floatingRegister.GetValueD((i - 9) * 2),
											  cpu.Data.floatingRegister.GetValueD((i - 5) * 2),
											  cpu.Data.floatingRegister.GetValueD((i - 1) * 2));
		ret[i] = buf;
		buf[0] = '\0';
	}

	ret[17] = RegisterFormat[17];

	for (int i = 18; i < 26; ++i){
		sprintf_s(buf, 99, RegisterFormat[i], cpu.Data.floatingRegister.GetValueF(i - 18),
											  cpu.Data.floatingRegister.GetValueF(i - 10),
											  cpu.Data.floatingRegister.GetValueF(i - 2),
											  cpu.Data.floatingRegister.GetValueF(i + 6));
		ret[i] = buf;
		buf[0] = '\0';
	}
}

void Manager::GetTextCodes(vector<string>& ret){
	ret.clear();
	for (vector<TextCode>::iterator i = textCodes.begin(); i != textCodes.end(); ++i){
		ostringstream os;
		os << "[" << i->GetAddress() << "]\t" << i->GetBinary() << "\t" << i->asmCode;
		ret.push_back(os.str());
	}
}

void Manager::SaveCode(){
	for (unsigned i = 0; i < textCodes.size(); ++i){
		cpu.AddCode(textCodes[i].binary, textCodes[i].address);
	}
}

void Manager::Execute(){
	while (cpu.RunCurrentSentence());
}

bool Manager::StepRun(int step){
	while (step--){
		if (!cpu.RunCurrentSentence()) return false;
	}
	return true;
}

⌨️ 快捷键说明

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