Successful initial test of Qt Code/Data Logger Window.
This commit is contained in:
parent
086d523566
commit
445b17104a
|
@ -421,12 +421,12 @@ int condition(watchpointinfo* wp)
|
||||||
|
|
||||||
//---------------------
|
//---------------------
|
||||||
|
|
||||||
volatile int codecount, datacount, undefinedcount;
|
volatile int codecount = 0, datacount = 0, undefinedcount = 0;
|
||||||
unsigned char *cdloggerdata;
|
unsigned char *cdloggerdata = NULL;
|
||||||
unsigned int cdloggerdataSize = 0;
|
unsigned int cdloggerdataSize = 0;
|
||||||
static int indirectnext;
|
static int indirectnext = 0;
|
||||||
|
|
||||||
int debug_loggingCD;
|
int debug_loggingCD = 0;
|
||||||
|
|
||||||
//called by the cpu to perform logging if CDLogging is enabled
|
//called by the cpu to perform logging if CDLogging is enabled
|
||||||
void LogCDVectors(int which){
|
void LogCDVectors(int which){
|
||||||
|
|
|
@ -4,6 +4,14 @@
|
||||||
#include <QInputDialog>
|
#include <QInputDialog>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
#include "../../types.h"
|
||||||
|
#include "../../fceu.h"
|
||||||
|
#include "../../cart.h"
|
||||||
|
#include "../../x6502.h"
|
||||||
|
#include "../../debug.h"
|
||||||
|
#include "../../ppu.h"
|
||||||
|
|
||||||
|
#include "Qt/ConsoleUtilities.h"
|
||||||
#include "Qt/CodeDataLogger.h"
|
#include "Qt/CodeDataLogger.h"
|
||||||
#include "Qt/main.h"
|
#include "Qt/main.h"
|
||||||
#include "Qt/dface.h"
|
#include "Qt/dface.h"
|
||||||
|
@ -11,6 +19,12 @@
|
||||||
#include "Qt/config.h"
|
#include "Qt/config.h"
|
||||||
#include "Qt/fceuWrapper.h"
|
#include "Qt/fceuWrapper.h"
|
||||||
|
|
||||||
|
static int autoSaveCDL = true;
|
||||||
|
static int autoLoadCDL = true;
|
||||||
|
static int autoResumeCDL = false;
|
||||||
|
static char loadedcdfile[512] = {0};
|
||||||
|
|
||||||
|
static int getDefaultCDLFile( char *filepath );
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
CodeDataLoggerDialog_t::CodeDataLoggerDialog_t(QWidget *parent)
|
CodeDataLoggerDialog_t::CodeDataLoggerDialog_t(QWidget *parent)
|
||||||
: QDialog( parent )
|
: QDialog( parent )
|
||||||
|
@ -20,7 +34,6 @@ CodeDataLoggerDialog_t::CodeDataLoggerDialog_t(QWidget *parent)
|
||||||
QGridLayout *grid;
|
QGridLayout *grid;
|
||||||
QGroupBox *frame, *subframe;
|
QGroupBox *frame, *subframe;
|
||||||
QPushButton *btn;
|
QPushButton *btn;
|
||||||
QLabel *lbl;
|
|
||||||
|
|
||||||
updateTimer = new QTimer( this );
|
updateTimer = new QTimer( this );
|
||||||
|
|
||||||
|
@ -30,27 +43,42 @@ CodeDataLoggerDialog_t::CodeDataLoggerDialog_t(QWidget *parent)
|
||||||
|
|
||||||
mainLayout = new QVBoxLayout();
|
mainLayout = new QVBoxLayout();
|
||||||
vbox1 = new QVBoxLayout();
|
vbox1 = new QVBoxLayout();
|
||||||
|
hbox = new QHBoxLayout();
|
||||||
grid = new QGridLayout();
|
grid = new QGridLayout();
|
||||||
lbl = new QLabel( tr("Press Start to Run Logger") );
|
statLabel = new QLabel( tr(" Logger is Paused: Press Start to Run ") );
|
||||||
cdlFileLabel = new QLabel( tr("CDL File:") );
|
cdlFileLabel = new QLabel( tr("CDL File:") );
|
||||||
|
|
||||||
vbox1->addLayout( grid );
|
vbox1->addLayout( grid );
|
||||||
vbox1->addWidget( lbl );
|
vbox1->addLayout( hbox );
|
||||||
vbox1->addWidget( cdlFileLabel );
|
vbox1->addWidget( cdlFileLabel );
|
||||||
|
|
||||||
|
hbox->addWidget( statLabel, 0, Qt::AlignHCenter );
|
||||||
|
|
||||||
frame = new QGroupBox(tr("Code/Data Log Status"));
|
frame = new QGroupBox(tr("Code/Data Log Status"));
|
||||||
frame->setLayout( vbox1 );
|
frame->setLayout( vbox1 );
|
||||||
|
|
||||||
prgLoggedCodeLabel = new QLabel( tr("0x00000 0.00%") );
|
prgLoggedCodeLabel = new QLabel( tr("0x000000 0.00%") );
|
||||||
prgLoggedDataLabel = new QLabel( tr("0x00000 0.00%") );
|
prgLoggedDataLabel = new QLabel( tr("0x000000 0.00%") );
|
||||||
prgUnloggedLabel = new QLabel( tr("0x00000 0.00%") );
|
prgUnloggedLabel = new QLabel( tr("0x000000 0.00%") );
|
||||||
chrLoggedCodeLabel = new QLabel( tr("0x00000 0.00%") );
|
chrLoggedCodeLabel = new QLabel( tr("0x000000 0.00%") );
|
||||||
chrLoggedDataLabel = new QLabel( tr("0x00000 0.00%") );
|
chrLoggedDataLabel = new QLabel( tr("0x000000 0.00%") );
|
||||||
chrUnloggedLabel = new QLabel( tr("0x00000 0.00%") );
|
chrUnloggedLabel = new QLabel( tr("0x000000 0.00%") );
|
||||||
autoSaveCdlCbox = new QCheckBox( tr("Auto-save .CDL when closing ROMs") );
|
autoSaveCdlCbox = new QCheckBox( tr("Auto-save .CDL when closing ROMs") );
|
||||||
autoLoadCdlCbox = new QCheckBox( tr("Auto-load .CDL when opening this window") );
|
autoLoadCdlCbox = new QCheckBox( tr("Auto-load .CDL when opening this window") );
|
||||||
autoResumeLogCbox = new QCheckBox( tr("Auto-resume logging when loading ROMs") );
|
autoResumeLogCbox = new QCheckBox( tr("Auto-resume logging when loading ROMs") );
|
||||||
|
|
||||||
|
g_config->getOption("SDL.AutoSaveCDL", &autoSaveCDL);
|
||||||
|
g_config->getOption("SDL.AutoLoadCDL", &autoLoadCDL);
|
||||||
|
g_config->getOption("SDL.AutoResumeCDL", &autoResumeCDL);
|
||||||
|
|
||||||
|
autoSaveCdlCbox->setChecked( autoSaveCDL );
|
||||||
|
autoLoadCdlCbox->setChecked( autoLoadCDL );
|
||||||
|
autoResumeLogCbox->setChecked( autoResumeCDL );
|
||||||
|
|
||||||
|
connect(autoSaveCdlCbox , SIGNAL(stateChanged(int)), this, SLOT(autoSaveCdlStateChange(int)) );
|
||||||
|
connect(autoLoadCdlCbox , SIGNAL(stateChanged(int)), this, SLOT(autoLoadCdlStateChange(int)) );
|
||||||
|
connect(autoResumeLogCbox, SIGNAL(stateChanged(int)), this, SLOT(autoResumeCdlStateChange(int)) );
|
||||||
|
|
||||||
subframe = new QGroupBox(tr("PRG Logged as Code"));
|
subframe = new QGroupBox(tr("PRG Logged as Code"));
|
||||||
vbox = new QVBoxLayout();
|
vbox = new QVBoxLayout();
|
||||||
vbox->addWidget( prgLoggedCodeLabel );
|
vbox->addWidget( prgLoggedCodeLabel );
|
||||||
|
@ -97,9 +125,11 @@ CodeDataLoggerDialog_t::CodeDataLoggerDialog_t(QWidget *parent)
|
||||||
vbox1->addLayout( grid );
|
vbox1->addLayout( grid );
|
||||||
btn = new QPushButton( tr("Reset Log") );
|
btn = new QPushButton( tr("Reset Log") );
|
||||||
grid->addWidget( btn, 0, 0, Qt::AlignCenter );
|
grid->addWidget( btn, 0, 0, Qt::AlignCenter );
|
||||||
|
connect( btn, SIGNAL(clicked(void)), this, SLOT(ResetCDLogClicked(void)));
|
||||||
|
|
||||||
btn = new QPushButton( tr("Start") );
|
startPauseButton = new QPushButton( tr("Start") );
|
||||||
grid->addWidget( btn, 0, 1, Qt::AlignCenter );
|
grid->addWidget( startPauseButton, 0, 1, Qt::AlignCenter );
|
||||||
|
connect( startPauseButton, SIGNAL(clicked(void)), this, SLOT(StartPauseCDLogClicked(void)));
|
||||||
|
|
||||||
btn = new QPushButton( tr("Save") );
|
btn = new QPushButton( tr("Save") );
|
||||||
grid->addWidget( btn, 0, 2, Qt::AlignCenter );
|
grid->addWidget( btn, 0, 2, Qt::AlignCenter );
|
||||||
|
@ -137,6 +167,12 @@ CodeDataLoggerDialog_t::CodeDataLoggerDialog_t(QWidget *parent)
|
||||||
|
|
||||||
updateTimer->start( 100 ); // 10hz
|
updateTimer->start( 100 ); // 10hz
|
||||||
|
|
||||||
|
if (autoLoadCDL)
|
||||||
|
{
|
||||||
|
char nameo[2048];
|
||||||
|
getDefaultCDLFile( nameo );
|
||||||
|
LoadCDLog(nameo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
CodeDataLoggerDialog_t::~CodeDataLoggerDialog_t(void)
|
CodeDataLoggerDialog_t::~CodeDataLoggerDialog_t(void)
|
||||||
|
@ -161,8 +197,334 @@ void CodeDataLoggerDialog_t::closeWindow(void)
|
||||||
deleteLater();
|
deleteLater();
|
||||||
}
|
}
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
void CodeDataLoggerDialog_t::updatePeriodic(void)
|
void CodeDataLoggerDialog_t::autoSaveCdlStateChange(int state)
|
||||||
{
|
{
|
||||||
|
autoSaveCDL = state != Qt::Unchecked;
|
||||||
|
|
||||||
|
g_config->setOption("SDL.AutoSaveCDL", autoSaveCDL);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void CodeDataLoggerDialog_t::autoLoadCdlStateChange(int state)
|
||||||
|
{
|
||||||
|
autoLoadCDL = state != Qt::Unchecked;
|
||||||
|
|
||||||
|
g_config->setOption("SDL.AutoLoadCDL", autoLoadCDL);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void CodeDataLoggerDialog_t::autoResumeCdlStateChange(int state)
|
||||||
|
{
|
||||||
|
autoResumeCDL = state != Qt::Unchecked;
|
||||||
|
|
||||||
|
g_config->setOption("SDL.AutoResumeCDL", autoResumeCDL);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void CodeDataLoggerDialog_t::updatePeriodic(void)
|
||||||
|
{
|
||||||
|
char str[768];
|
||||||
|
float fcodecount = codecount;
|
||||||
|
float fdatacount = datacount;
|
||||||
|
float frendercount = rendercount;
|
||||||
|
float fvromreadcount = vromreadcount;
|
||||||
|
float fundefinedcount = undefinedcount;
|
||||||
|
float fundefinedvromcount = undefinedvromcount;
|
||||||
|
float fromsize = cdloggerdataSize;
|
||||||
|
float fvromsize = (cdloggerVideoDataSize != 0) ? cdloggerVideoDataSize : 1;
|
||||||
|
|
||||||
|
if ( FCEUI_GetLoggingCD() )
|
||||||
|
{
|
||||||
|
startPauseButton->setText( tr("Pause") );
|
||||||
|
statLabel->setText( tr(" Logger is Running: Press Pause to Stop ") );
|
||||||
|
statLabel->setStyleSheet("background-color: green; color: white;");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
startPauseButton->setText( tr("Start") );
|
||||||
|
statLabel->setText( tr(" Logger is Paused: Press Start to Run ") );
|
||||||
|
statLabel->setStyleSheet("background-color: red; color: white;");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( cdloggerdataSize > 0 )
|
||||||
|
{
|
||||||
|
sprintf(str,"0x%06x %.2f%%", codecount, (fcodecount / fromsize) * 100);
|
||||||
|
prgLoggedCodeLabel->setText( tr(str) );
|
||||||
|
|
||||||
|
sprintf(str,"0x%06x %.2f%%", datacount,(fdatacount / fromsize) * 100);
|
||||||
|
prgLoggedDataLabel->setText( tr(str) );
|
||||||
|
|
||||||
|
sprintf(str,"0x%06x %.2f%%", undefinedcount, (fundefinedcount / fromsize) * 100);
|
||||||
|
prgUnloggedLabel->setText( tr(str) );
|
||||||
|
|
||||||
|
sprintf(str,"0x%06x %.2f%%", rendercount, (frendercount / fvromsize) * 100);
|
||||||
|
chrLoggedCodeLabel->setText( tr(str) );
|
||||||
|
|
||||||
|
sprintf(str,"0x%06x %.2f%%", vromreadcount, (fvromreadcount / fvromsize) * 100);
|
||||||
|
chrLoggedDataLabel->setText( tr(str) );
|
||||||
|
|
||||||
|
sprintf(str,"0x%06x %.2f%%", undefinedvromcount, (fundefinedvromcount / fvromsize) * 100);
|
||||||
|
chrUnloggedLabel->setText( tr(str) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prgLoggedCodeLabel->setText( tr("------") );
|
||||||
|
prgLoggedDataLabel->setText( tr("------") );
|
||||||
|
prgUnloggedLabel->setText( tr("------") );
|
||||||
|
chrLoggedCodeLabel->setText( tr("------") );
|
||||||
|
chrLoggedDataLabel->setText( tr("------") );
|
||||||
|
chrUnloggedLabel->setText( tr("------") );
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf( str, "CDL File: %s", loadedcdfile );
|
||||||
|
|
||||||
|
cdlFileLabel->setText( tr(str) );
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void CodeDataLoggerDialog_t::ResetCDLogClicked(void)
|
||||||
|
{
|
||||||
|
::ResetCDLog();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void CodeDataLoggerDialog_t::StartPauseCDLogClicked(void)
|
||||||
|
{
|
||||||
|
if ( FCEUI_GetLoggingCD() )
|
||||||
|
{
|
||||||
|
printf("CD Logging Paused\n");
|
||||||
|
PauseCDLogging();
|
||||||
|
startPauseButton->setText( tr("Start") );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("CD Logging Started\n");
|
||||||
|
StartCDLogging();
|
||||||
|
startPauseButton->setText( tr("Pause") );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
static int getDefaultCDLFile( char *filepath )
|
||||||
|
{
|
||||||
|
const char *romFile;
|
||||||
|
char dir[512], baseFile[256];
|
||||||
|
|
||||||
|
filepath[0] = 0;
|
||||||
|
|
||||||
|
romFile = getRomFile();
|
||||||
|
|
||||||
|
if ( romFile == NULL )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
parseFilepath( romFile, dir, baseFile );
|
||||||
|
|
||||||
|
sprintf( filepath, "%s/%s.cdl", dir, baseFile );
|
||||||
|
|
||||||
|
//printf("%s\n", filepath );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void FreeCDLog(void)
|
||||||
|
{
|
||||||
|
fceuWrapperLock();
|
||||||
|
if (cdloggerdata)
|
||||||
|
{
|
||||||
|
free(cdloggerdata);
|
||||||
|
cdloggerdata = NULL;
|
||||||
|
cdloggerdataSize = 0;
|
||||||
|
}
|
||||||
|
if (cdloggervdata)
|
||||||
|
{
|
||||||
|
free(cdloggervdata);
|
||||||
|
cdloggervdata = NULL;
|
||||||
|
cdloggerVideoDataSize = 0;
|
||||||
|
}
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void InitCDLog(void)
|
||||||
|
{
|
||||||
|
fceuWrapperLock();
|
||||||
|
cdloggerdataSize = PRGsize[0];
|
||||||
|
cdloggerdata = (unsigned char*)malloc(cdloggerdataSize);
|
||||||
|
if (!CHRram[0] || (CHRptr[0] == PRGptr[0])) { // Some kind of workaround for my OneBus VRAM hack, will remove it if I find another solution for that
|
||||||
|
cdloggerVideoDataSize = CHRsize[0];
|
||||||
|
cdloggervdata = (unsigned char*)malloc(cdloggerVideoDataSize);
|
||||||
|
} else {
|
||||||
|
if (GameInfo->type != GIT_NSF) {
|
||||||
|
cdloggerVideoDataSize = 0;
|
||||||
|
cdloggervdata = (unsigned char*)malloc(8192);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void ResetCDLog(void)
|
||||||
|
{
|
||||||
|
if ( GameInfo == NULL )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fceuWrapperLock();
|
||||||
|
|
||||||
|
codecount = datacount = rendercount = vromreadcount = 0;
|
||||||
|
undefinedcount = cdloggerdataSize;
|
||||||
|
|
||||||
|
if ( cdloggerdata != NULL )
|
||||||
|
{
|
||||||
|
memset(cdloggerdata, 0, cdloggerdataSize);
|
||||||
|
}
|
||||||
|
if (cdloggerVideoDataSize != 0)
|
||||||
|
{
|
||||||
|
undefinedvromcount = cdloggerVideoDataSize;
|
||||||
|
|
||||||
|
if ( cdloggervdata != NULL )
|
||||||
|
{
|
||||||
|
memset(cdloggervdata, 0, cdloggerVideoDataSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (GameInfo->type != GIT_NSF)
|
||||||
|
{
|
||||||
|
undefinedvromcount = 8192;
|
||||||
|
memset(cdloggervdata, 0, 8192);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
bool LoadCDLog(const char* nameo)
|
||||||
|
{
|
||||||
|
FILE *FP;
|
||||||
|
int i,j;
|
||||||
|
|
||||||
|
FP = fopen(nameo, "rb");
|
||||||
|
if (FP == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for(i = 0;i < (int)cdloggerdataSize;i++)
|
||||||
|
{
|
||||||
|
j = fgetc(FP);
|
||||||
|
if (j == EOF)
|
||||||
|
break;
|
||||||
|
if ((j & 1) && !(cdloggerdata[i] & 1))
|
||||||
|
codecount++; //if the new byte has something logged and
|
||||||
|
if ((j & 2) && !(cdloggerdata[i] & 2))
|
||||||
|
datacount++; //and the old one doesn't. Then increment
|
||||||
|
if ((j & 3) && !(cdloggerdata[i] & 3))
|
||||||
|
undefinedcount--; //the appropriate counter.
|
||||||
|
cdloggerdata[i] |= j;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cdloggerVideoDataSize != 0)
|
||||||
|
{
|
||||||
|
for(i = 0;i < (int)cdloggerVideoDataSize;i++)
|
||||||
|
{
|
||||||
|
j = fgetc(FP);
|
||||||
|
if(j == EOF)break;
|
||||||
|
if((j & 1) && !(cdloggervdata[i] & 1))rendercount++; //if the new byte has something logged and
|
||||||
|
if((j & 2) && !(cdloggervdata[i] & 2))vromreadcount++; //if the new byte has something logged and
|
||||||
|
if((j & 3) && !(cdloggervdata[i] & 3))undefinedvromcount--; //the appropriate counter.
|
||||||
|
cdloggervdata[i] |= j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(FP);
|
||||||
|
RenameCDLog(nameo);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void StartCDLogging(void)
|
||||||
|
{
|
||||||
|
fceuWrapperLock();
|
||||||
|
FCEUI_SetLoggingCD(1);
|
||||||
|
//EnableTracerMenuItems();
|
||||||
|
//SetDlgItemText(hCDLogger, BTN_CDLOGGER_START_PAUSE, "Pause");
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
bool PauseCDLogging(void)
|
||||||
|
{
|
||||||
|
// can't pause while Trace Logger is using
|
||||||
|
//if ((logging) && (logging_options & LOG_NEW_INSTRUCTIONS))
|
||||||
|
//{
|
||||||
|
// MessageBox(hCDLogger, "The Trace Logger is currently using this for some of its features.\nPlease turn the Trace Logger off and try again.","Unable to Pause Code/Data Logger", MB_OK);
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
fceuWrapperLock();
|
||||||
|
FCEUI_SetLoggingCD(0);
|
||||||
|
//EnableTracerMenuItems();
|
||||||
|
//SetDlgItemText(hCDLogger, BTN_CDLOGGER_START_PAUSE, "Start");
|
||||||
|
fceuWrapperUnLock();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void CDLoggerROMClosed(void)
|
||||||
|
{
|
||||||
|
PauseCDLogging();
|
||||||
|
if (autoSaveCDL)
|
||||||
|
{
|
||||||
|
SaveCDLogFile();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void CDLoggerROMChanged(void)
|
||||||
|
{
|
||||||
|
FreeCDLog();
|
||||||
|
InitCDLog();
|
||||||
|
ResetCDLog();
|
||||||
|
RenameCDLog("");
|
||||||
|
|
||||||
|
if (!autoResumeCDL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// try to load respective CDL file
|
||||||
|
char nameo[1024];
|
||||||
|
getDefaultCDLFile( nameo );
|
||||||
|
|
||||||
|
FILE *FP;
|
||||||
|
FP = fopen(nameo, "rb");
|
||||||
|
if (FP != NULL)
|
||||||
|
{
|
||||||
|
// .cdl file with this ROM name exists
|
||||||
|
fclose(FP);
|
||||||
|
//if (!hCDLogger)
|
||||||
|
//{
|
||||||
|
// DoCDLogger();
|
||||||
|
//}
|
||||||
|
if (LoadCDLog(nameo))
|
||||||
|
{
|
||||||
|
StartCDLogging();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void RenameCDLog(const char* newName)
|
||||||
|
{
|
||||||
|
strcpy(loadedcdfile, newName);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------
|
||||||
|
void SaveCDLogFile(void)
|
||||||
|
{
|
||||||
|
if (loadedcdfile[0] == 0)
|
||||||
|
{
|
||||||
|
char nameo[1024];
|
||||||
|
getDefaultCDLFile( nameo );
|
||||||
|
RenameCDLog(nameo);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE *FP;
|
||||||
|
FP = fopen(loadedcdfile, "wb");
|
||||||
|
if (FP == NULL)
|
||||||
|
{
|
||||||
|
FCEUD_PrintError("Error Saving File");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fwrite(cdloggerdata, cdloggerdataSize, 1, FP);
|
||||||
|
if (cdloggerVideoDataSize != 0)
|
||||||
|
{
|
||||||
|
fwrite(cdloggervdata, cdloggerVideoDataSize, 1, FP);
|
||||||
|
}
|
||||||
|
fclose(FP);
|
||||||
}
|
}
|
||||||
//----------------------------------------------------
|
//----------------------------------------------------
|
||||||
|
|
|
@ -33,16 +33,35 @@ class CodeDataLoggerDialog_t : public QDialog
|
||||||
QLabel *chrLoggedDataLabel;
|
QLabel *chrLoggedDataLabel;
|
||||||
QLabel *chrUnloggedLabel;
|
QLabel *chrUnloggedLabel;
|
||||||
QLabel *cdlFileLabel;
|
QLabel *cdlFileLabel;
|
||||||
|
QLabel *statLabel;
|
||||||
QCheckBox *autoSaveCdlCbox;
|
QCheckBox *autoSaveCdlCbox;
|
||||||
QCheckBox *autoLoadCdlCbox;
|
QCheckBox *autoLoadCdlCbox;
|
||||||
QCheckBox *autoResumeLogCbox;
|
QCheckBox *autoResumeLogCbox;
|
||||||
|
QPushButton *startPauseButton;
|
||||||
void closeEvent(QCloseEvent *bar);
|
void closeEvent(QCloseEvent *bar);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void closeWindow(void);
|
void closeWindow(void);
|
||||||
private slots:
|
private slots:
|
||||||
void updatePeriodic(void);
|
void updatePeriodic(void);
|
||||||
|
void ResetCDLogClicked(void);
|
||||||
|
void StartPauseCDLogClicked(void);
|
||||||
|
void autoSaveCdlStateChange(int state);
|
||||||
|
void autoLoadCdlStateChange(int state);
|
||||||
|
void autoResumeCdlStateChange(int state);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void InitCDLog(void);
|
||||||
|
void ResetCDLog(void);
|
||||||
|
void FreeCDLog(void);
|
||||||
|
void StartCDLogging(void);
|
||||||
|
bool PauseCDLogging(void);
|
||||||
|
bool LoadCDLog(const char* nameo);
|
||||||
|
void RenameCDLog(const char* newName);
|
||||||
|
void CDLoggerROMClosed(void);
|
||||||
|
void CDLoggerROMChanged(void);
|
||||||
|
void SaveCDLogFile(void);
|
||||||
|
|
||||||
|
|
|
@ -83,3 +83,63 @@ int getFileBaseName( const char *filepath, char *base )
|
||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
int parseFilepath( const char *filepath, char *dir, char *base, char *suffix )
|
||||||
|
{
|
||||||
|
int i=0,j=0,end=0;
|
||||||
|
if ( filepath == NULL )
|
||||||
|
{
|
||||||
|
base[0] = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
i=0; j=0;
|
||||||
|
while ( filepath[i] != 0 )
|
||||||
|
{
|
||||||
|
if ( (filepath[i] == '/') || (filepath[i] == '\\') )
|
||||||
|
{
|
||||||
|
j = i+1;
|
||||||
|
}
|
||||||
|
if ( dir )
|
||||||
|
{
|
||||||
|
dir[i] = filepath[i];
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if ( dir )
|
||||||
|
{
|
||||||
|
dir[j] = 0;
|
||||||
|
}
|
||||||
|
i = j;
|
||||||
|
|
||||||
|
if ( base == NULL )
|
||||||
|
{
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
|
j=0;
|
||||||
|
while ( filepath[i] != 0 )
|
||||||
|
{
|
||||||
|
base[j] = filepath[i]; i++; j++;
|
||||||
|
}
|
||||||
|
base[j] = 0; end=j;
|
||||||
|
|
||||||
|
if ( suffix )
|
||||||
|
{
|
||||||
|
suffix[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ( j > 1 )
|
||||||
|
{
|
||||||
|
j--;
|
||||||
|
if ( base[j] == '.' )
|
||||||
|
{
|
||||||
|
if ( suffix )
|
||||||
|
{
|
||||||
|
strcpy( suffix, &base[j] );
|
||||||
|
}
|
||||||
|
end=j; base[j] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
|
|
@ -5,3 +5,5 @@ int getDirFromFile( const char *path, char *dir );
|
||||||
const char *getRomFile( void );
|
const char *getRomFile( void );
|
||||||
|
|
||||||
int getFileBaseName( const char *filepath, char *base );
|
int getFileBaseName( const char *filepath, char *base );
|
||||||
|
|
||||||
|
int parseFilepath( const char *filepath, char *dir, char *base, char *suffix = NULL );
|
||||||
|
|
|
@ -263,6 +263,11 @@ InitConfig()
|
||||||
config->addOption("autoLoadDebugFiles", "SDL.AutoLoadDebugFiles", 1);
|
config->addOption("autoLoadDebugFiles", "SDL.AutoLoadDebugFiles", 1);
|
||||||
config->addOption("autoOpenDebugger" , "SDL.AutoOpenDebugger" , 0);
|
config->addOption("autoOpenDebugger" , "SDL.AutoOpenDebugger" , 0);
|
||||||
|
|
||||||
|
// Code Data Logger Options
|
||||||
|
config->addOption("autoSaveCDL" , "SDL.AutoSaveCDL", 1);
|
||||||
|
config->addOption("autoLoadCDL" , "SDL.AutoLoadCDL", 1);
|
||||||
|
config->addOption("autoResumeCDL", "SDL.AutoResumeCDL", 0);
|
||||||
|
|
||||||
// overwrite the config file?
|
// overwrite the config file?
|
||||||
config->addOption("no-config", "SDL.NoConfig", 0);
|
config->addOption("no-config", "SDL.NoConfig", 0);
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include "Qt/unix-netplay.h"
|
#include "Qt/unix-netplay.h"
|
||||||
#include "Qt/HexEditor.h"
|
#include "Qt/HexEditor.h"
|
||||||
#include "Qt/SymbolicDebug.h"
|
#include "Qt/SymbolicDebug.h"
|
||||||
|
#include "Qt/CodeDataLogger.h"
|
||||||
#include "Qt/ConsoleDebugger.h"
|
#include "Qt/ConsoleDebugger.h"
|
||||||
#include "Qt/ConsoleWindow.h"
|
#include "Qt/ConsoleWindow.h"
|
||||||
#include "Qt/fceux_git_info.h"
|
#include "Qt/fceux_git_info.h"
|
||||||
|
@ -247,6 +248,8 @@ int LoadGame(const char *path)
|
||||||
|
|
||||||
debugSymbolTable.loadGameSymbols();
|
debugSymbolTable.loadGameSymbols();
|
||||||
|
|
||||||
|
CDLoggerROMChanged();
|
||||||
|
|
||||||
int state_to_load;
|
int state_to_load;
|
||||||
g_config->getOption("SDL.AutoLoadState", &state_to_load);
|
g_config->getOption("SDL.AutoLoadState", &state_to_load);
|
||||||
if (state_to_load >= 0 && state_to_load < 10){
|
if (state_to_load >= 0 && state_to_load < 10){
|
||||||
|
@ -299,6 +302,7 @@ CloseGame(void)
|
||||||
|
|
||||||
debugSymbolTable.save();
|
debugSymbolTable.save();
|
||||||
debugSymbolTable.clear();
|
debugSymbolTable.clear();
|
||||||
|
CDLoggerROMClosed();
|
||||||
|
|
||||||
int state_to_save;
|
int state_to_save;
|
||||||
g_config->getOption("SDL.AutoSaveState", &state_to_save);
|
g_config->getOption("SDL.AutoSaveState", &state_to_save);
|
||||||
|
@ -946,17 +950,23 @@ static void DoFun(int frameskip, int periodic_saves)
|
||||||
void fceuWrapperLock(void)
|
void fceuWrapperLock(void)
|
||||||
{
|
{
|
||||||
mutexPending++;
|
mutexPending++;
|
||||||
|
if ( consoleWindow != NULL )
|
||||||
|
{
|
||||||
consoleWindow->mutex->lock();
|
consoleWindow->mutex->lock();
|
||||||
|
}
|
||||||
mutexPending--;
|
mutexPending--;
|
||||||
mutexLocks++;
|
mutexLocks++;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fceuWrapperTryLock(int timeout)
|
bool fceuWrapperTryLock(int timeout)
|
||||||
{
|
{
|
||||||
bool lockAcq;
|
bool lockAcq = false;
|
||||||
|
|
||||||
mutexPending++;
|
mutexPending++;
|
||||||
|
if ( consoleWindow != NULL )
|
||||||
|
{
|
||||||
lockAcq = consoleWindow->mutex->tryLock( timeout );
|
lockAcq = consoleWindow->mutex->tryLock( timeout );
|
||||||
|
}
|
||||||
mutexPending--;
|
mutexPending--;
|
||||||
|
|
||||||
if ( lockAcq )
|
if ( lockAcq )
|
||||||
|
@ -969,8 +979,11 @@ bool fceuWrapperTryLock(int timeout)
|
||||||
void fceuWrapperUnLock(void)
|
void fceuWrapperUnLock(void)
|
||||||
{
|
{
|
||||||
if ( mutexLocks > 0 )
|
if ( mutexLocks > 0 )
|
||||||
|
{
|
||||||
|
if ( consoleWindow != NULL )
|
||||||
{
|
{
|
||||||
consoleWindow->mutex->unlock();
|
consoleWindow->mutex->unlock();
|
||||||
|
}
|
||||||
mutexLocks--;
|
mutexLocks--;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue