📄 manager.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 + -