Skip to content

Commit e53a85c

Browse files
committed
Optimize exporting traces
1 parent 38d2cd1 commit e53a85c

File tree

1 file changed

+70
-44
lines changed

1 file changed

+70
-44
lines changed

ExecutionTrace.cpp

Lines changed: 70 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -66,25 +66,24 @@ namespace VCC { namespace Debugger { namespace UI { namespace
6666

6767
BackBufferInfo BackBuffer_;
6868

69-
int ExportStart=0;
69+
int ExportStart=1;
7070
int ExportStop=0;
7171
char ExportPath[MAX_PATH]={};
7272

7373
//-------------------------------------------------------------------------------
74+
const char *ToCCStringCStr(const unsigned char CC)
75+
{
76+
static const char* flags = "EFHINZVC";
77+
static char buffer[9];
78+
for (int i = 0, mask = 0x80; i < 8; ++i, mask >>= 1)
79+
buffer[i] = CC & mask ? flags[i] : '.';
80+
buffer[8] = 0;
81+
return buffer;
82+
}
83+
7484
std::string ToCCString(const unsigned char CC)
7585
{
76-
std::ostringstream fmt;
77-
78-
fmt << ((CC & 0b10000000) ? "E" : ".")
79-
<< ((CC & 0b01000000) ? "F" : ".")
80-
<< ((CC & 0b00100000) ? "H" : ".")
81-
<< ((CC & 0b00010000) ? "I" : ".")
82-
<< ((CC & 0b00001000) ? "N" : ".")
83-
<< ((CC & 0b00000100) ? "Z" : ".")
84-
<< ((CC & 0b00000010) ? "V" : ".")
85-
<< ((CC & 0b00000001) ? "C" : ".");
86-
87-
return fmt.str();
86+
return std::string(ToCCStringCStr(CC));
8887
}
8988

9089
//-------------------------------------------------------------------------------
@@ -771,6 +770,7 @@ namespace VCC { namespace Debugger { namespace UI { namespace
771770
std::string samples = buf;
772771
int maxSamples = std::stoi(samples);
773772
EmuState.Debugger.SetTraceMaxSamples(maxSamples);
773+
ExportStop = maxSamples;
774774

775775
SCROLLINFO si;
776776
si.cbSize = sizeof(si);
@@ -1108,90 +1108,116 @@ namespace VCC { namespace Debugger { namespace UI { namespace
11081108
unsigned int offset = start > 1 ? start-1 : 0;
11091109
auto & _trace = EmuState.Debugger.GetTraceResult();
11101110
int count = min((unsigned int)_trace.size(), nlines);
1111+
const size_t lineSize = 65536;
1112+
char *line = new char[lineSize];
11111113

11121114
//FilePrintf(hf,"offset:%d nlines:%d count%d _tsize:%d\n",
11131115
// offset, nlines, count, _trace.size());
11141116

1115-
FilePrintf(hf," Line Cycles PC Instruction ");
1117+
char* pos = line;
1118+
char* end = pos + lineSize;
1119+
DWORD dummy;
1120+
1121+
auto Flush = [&]()
1122+
{
1123+
WriteFile(hf, line, pos - line, &dummy, 0);
1124+
pos = line;
1125+
};
1126+
1127+
auto Write = [&](const char* fmt, ...)
1128+
{
1129+
va_list args;
1130+
va_start(args, fmt);
1131+
auto remaining = end - pos;
1132+
auto count = vsnprintf(pos, remaining, fmt, args);
1133+
va_end(args);
1134+
pos += count;
1135+
if (end - pos < 100)
1136+
Flush();
1137+
};
1138+
1139+
Write(" Line Cycles PC Instruction ");
11161140
if (EmuState.CpuType == 1)
1117-
FilePrintf(hf, "CC D W X Y U S DP MD\n");
1141+
Write("CC D W X Y U S DP MD\n");
11181142
else
1119-
FilePrintf(hf, "CC D X Y U S DP\n");
1143+
Write("CC D X Y U S DP\n");
11201144

11211145
for (int n = 0; n < count; n++) {
1122-
FilePrintf(hf,"%7d ",n + offset + 1); // Line
1123-
FilePrintf(hf,"%7d ",_trace[n].cycleTime); // Cycles
1146+
Write("%7d ",n + offset + 1); // Line
1147+
Write("%7d ",_trace[n].cycleTime); // Cycles
11241148

11251149
// Instruction
11261150
if (_trace[n].event == TraceEvent::Instruction) {
1127-
FilePrintf(hf,"%4X ",_trace[n].pc); // Address
1151+
Write("%4X ",_trace[n].pc); // Address
11281152
std::string s = _trace[n].instruction + " "
11291153
+ _trace[n].operand;
1130-
FilePrintf(hf,"%-19s",s.c_str()); // Instruction
1131-
FilePrintf(hf," %8s",
1132-
ToCCString(_trace[n].startState.CC).c_str()); // CC
1133-
FilePrintf(hf," %02X%02X",_trace[n].startState.A, // D
1154+
Write("%-19s ",s.c_str()); // Instruction
1155+
Write(ToCCStringCStr(_trace[n].startState.CC)); // CC
1156+
Write(" %02X%02X",_trace[n].startState.A, // D
11341157
_trace[n].startState.B);
11351158
if (EmuState.CpuType == 1)
1136-
FilePrintf(hf," %02X%02X",_trace[n].startState.E,
1159+
Write(" %02X%02X",_trace[n].startState.E,
11371160
_trace[n].startState.F);
1138-
FilePrintf(hf," %04X",_trace[n].startState.X); // X
1139-
FilePrintf(hf," %04X",_trace[n].startState.Y); // Y
1140-
FilePrintf(hf," %04X",_trace[n].startState.U); // U
1141-
FilePrintf(hf," %04X",_trace[n].startState.S); // S
1142-
FilePrintf(hf," %02X",_trace[n].startState.DP); // DP
1161+
Write(" %04X",_trace[n].startState.X); // X
1162+
Write(" %04X",_trace[n].startState.Y); // Y
1163+
Write(" %04X",_trace[n].startState.U); // U
1164+
Write(" %04X",_trace[n].startState.S); // S
1165+
Write(" %02X",_trace[n].startState.DP); // DP
11431166
if (EmuState.CpuType == 1)
1144-
FilePrintf(hf," %02X",_trace[n].startState.MD); // MD
1145-
FilePrintf(hf,"\n");
1167+
Write(" %02X",_trace[n].startState.MD); // MD
1168+
Write("\n");
11461169

11471170
// Emulator event
11481171
} else if (_trace[n].event == TraceEvent::EmulatorCycle) {
11491172

1150-
FilePrintf(hf,"[Emu] :: ");
1173+
Write("[Emu] :: ");
11511174
switch (_trace[n].emulationState) {
11521175
case 0:
1153-
FilePrintf(hf,"CPUOnly\n");
1176+
Write("CPUOnly\n");
11541177
break;
11551178
case 1:
1156-
FilePrintf(hf,"TimerIRQ\n");
1179+
Write("TimerIRQ\n");
11571180
break;
11581181
case 2:
1159-
FilePrintf(hf,"AudioSample\n");
1182+
Write("AudioSample\n");
11601183
break;
11611184
case 3:
1162-
FilePrintf(hf,"1stAudio\n");
1185+
Write("1stAudio\n");
11631186
break;
11641187
case 4:
1165-
FilePrintf(hf,"2ndTimer\n");
1188+
Write("2ndTimer\n");
11661189
break;
11671190
case 5:
1168-
FilePrintf(hf,"1stTimer\n");
1191+
Write("1stTimer\n");
11691192
break;
11701193
case 6:
1171-
FilePrintf(hf,"2ndAudio\n");
1194+
Write("2ndAudio\n");
11721195
break;
11731196
case 7:
1174-
FilePrintf(hf,"TimerAudio\n");
1197+
Write("TimerAudio\n");
11751198
break;
11761199
case 10:
1177-
FilePrintf(hf,"CycleStart\n");
1200+
Write("CycleStart\n");
11781201
break;
11791202
case 20:
1180-
FilePrintf(hf,"CycleEnd\n");
1203+
Write("CycleEnd\n");
11811204
break;
11821205
default:
1183-
FilePrintf(hf,"\n");
1206+
Write("\n");
11841207
}
11851208

11861209
// Screen or IRQ event
11871210
} else if ((_trace[n].event > TraceEvent::ScreenStart &&
11881211
_trace[n].event < TraceEvent::ScreenEnd ) ||
11891212
(_trace[n].event > TraceEvent::IRQStart &&
11901213
_trace[n].event < TraceEvent::IRQEnd ) ) {
1191-
FilePrintf(hf,"%s\n",_trace[n].instruction.c_str());
1214+
Write(_trace[n].instruction.c_str());
1215+
Write("\n");
11921216
}
11931217
}
11941218

1219+
Flush();
1220+
11951221
EmuState.Debugger.UnlockTrace();
11961222
}
11971223

0 commit comments

Comments
 (0)