@@ -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