Qt Ram watch logic in work.
This commit is contained in:
parent
ab922df318
commit
ff694ebe49
|
@ -639,6 +639,7 @@ int GuiCheatsDialog_t::activeCheatListCB (char *name, uint32 a, uint8 v, int c,
|
||||||
|
|
||||||
item->setTextAlignment( 0, Qt::AlignLeft);
|
item->setTextAlignment( 0, Qt::AlignLeft);
|
||||||
item->setTextAlignment( 1, Qt::AlignLeft);
|
item->setTextAlignment( 1, Qt::AlignLeft);
|
||||||
|
item->setTextAlignment( 2, Qt::AlignLeft);
|
||||||
|
|
||||||
actvCheatIdx++;
|
actvCheatIdx++;
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
@ -12,6 +13,11 @@
|
||||||
#include <QCloseEvent>
|
#include <QCloseEvent>
|
||||||
#include <QGroupBox>
|
#include <QGroupBox>
|
||||||
|
|
||||||
|
#include "../../types.h"
|
||||||
|
#include "../../fceu.h"
|
||||||
|
#include "../../cheat.h"
|
||||||
|
#include "../../debug.h"
|
||||||
|
|
||||||
#include "Qt/main.h"
|
#include "Qt/main.h"
|
||||||
#include "Qt/dface.h"
|
#include "Qt/dface.h"
|
||||||
#include "Qt/input.h"
|
#include "Qt/input.h"
|
||||||
|
@ -252,3 +258,279 @@ void RamWatchDialog_t::closeWindow(void)
|
||||||
deleteLater();
|
deleteLater();
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------
|
//----------------------------------------------------------------------------
|
||||||
|
void RamWatchDialog_t::updateRamWatchDisplay(void)
|
||||||
|
{
|
||||||
|
int idx=0;
|
||||||
|
QTreeWidgetItem *item;
|
||||||
|
std::list < ramWatch_t * >::iterator it;
|
||||||
|
char addrStr[32], valStr1[16], valStr2[16];
|
||||||
|
ramWatch_t *rw;
|
||||||
|
|
||||||
|
for (it = ramWatchList.ls.begin (); it != ramWatchList.ls.end (); it++)
|
||||||
|
{
|
||||||
|
rw = *it;
|
||||||
|
|
||||||
|
item = tree->topLevelItem(idx);
|
||||||
|
|
||||||
|
if ( item == NULL )
|
||||||
|
{
|
||||||
|
item = new QTreeWidgetItem();
|
||||||
|
|
||||||
|
tree->addTopLevelItem( item );
|
||||||
|
}
|
||||||
|
sprintf (addrStr, "0x%04X", rw->addr);
|
||||||
|
|
||||||
|
rw->updateMem ();
|
||||||
|
|
||||||
|
if (rw->size == 2)
|
||||||
|
{
|
||||||
|
if (rw->type)
|
||||||
|
{
|
||||||
|
sprintf (valStr1, "%6u", rw->val.u16);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf (valStr1, "%6i", rw->val.i16);
|
||||||
|
}
|
||||||
|
sprintf (valStr2, "0x%04X", rw->val.u16);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (rw->type)
|
||||||
|
{
|
||||||
|
sprintf (valStr1, "%6u", rw->val.u8);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sprintf (valStr1, "%6i", rw->val.i8);
|
||||||
|
}
|
||||||
|
sprintf (valStr2, "0x%02X", rw->val.u8);
|
||||||
|
}
|
||||||
|
|
||||||
|
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemNeverHasChildren );
|
||||||
|
|
||||||
|
//item->setFont(font);
|
||||||
|
item->setText( 0, tr(addrStr) );
|
||||||
|
item->setText( 1, tr(valStr1) );
|
||||||
|
item->setText( 2, tr(rw->name.c_str()) );
|
||||||
|
|
||||||
|
item->setTextAlignment( 0, Qt::AlignLeft);
|
||||||
|
item->setTextAlignment( 1, Qt::AlignLeft);
|
||||||
|
item->setTextAlignment( 2, Qt::AlignLeft);
|
||||||
|
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void ramWatch_t::updateMem (void)
|
||||||
|
{
|
||||||
|
if (size == 1)
|
||||||
|
{
|
||||||
|
val.u8 = GetMem (addr);
|
||||||
|
}
|
||||||
|
else if (size == 2)
|
||||||
|
{
|
||||||
|
val.u16 = GetMem (addr) | (GetMem (addr + 1) << 8);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
val.u8 = GetMem (addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void RamWatchDialog_t::saveWatchFile (const char *filename)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
FILE *fp;
|
||||||
|
const char *c;
|
||||||
|
std::list < ramWatch_t * >::iterator it;
|
||||||
|
ramWatch_t *rw;
|
||||||
|
|
||||||
|
fp = fopen (filename, "w");
|
||||||
|
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
printf ("Error: Failed to open file: %s\n", filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (it = ramWatchList.ls.begin (); it != ramWatchList.ls.end (); it++)
|
||||||
|
{
|
||||||
|
rw = *it;
|
||||||
|
|
||||||
|
c = rw->name.c_str ();
|
||||||
|
|
||||||
|
fprintf (fp, "0x%04x %c%i ", rw->addr, rw->type ? 'U' : 'S',
|
||||||
|
rw->size);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
fprintf (fp, "\"");
|
||||||
|
while (c[i])
|
||||||
|
{
|
||||||
|
if (c[i] == '"')
|
||||||
|
{
|
||||||
|
fprintf (fp, "\\%c", c[i]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (fp, "%c", c[i]);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
fprintf (fp, "\"\n");
|
||||||
|
}
|
||||||
|
fclose (fp);
|
||||||
|
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
void RamWatchDialog_t::loadWatchFile (const char *filename)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
int i, j, a, t, s, literal;
|
||||||
|
char line[512], stmp[512];
|
||||||
|
ramWatch_t *rw;
|
||||||
|
|
||||||
|
fp = fopen (filename, "r");
|
||||||
|
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
printf ("Error: Failed to open file: %s\n", filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (fgets (line, sizeof (line) - 1, fp) > 0)
|
||||||
|
{
|
||||||
|
a = -1;
|
||||||
|
t = -1;
|
||||||
|
s = -1;
|
||||||
|
// Check for Comments
|
||||||
|
i = 0;
|
||||||
|
while (line[i] != 0)
|
||||||
|
{
|
||||||
|
if (literal)
|
||||||
|
{
|
||||||
|
literal = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (line[i] == '#')
|
||||||
|
{
|
||||||
|
line[i] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (line[i] == '\\')
|
||||||
|
{
|
||||||
|
literal = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
j = 0;
|
||||||
|
while (isspace (line[i])) i++;
|
||||||
|
|
||||||
|
if ((line[i] == '0') && (tolower (line[i + 1]) == 'x'))
|
||||||
|
{
|
||||||
|
stmp[j] = '0';
|
||||||
|
j++;
|
||||||
|
i++;
|
||||||
|
stmp[j] = 'x';
|
||||||
|
j++;
|
||||||
|
i++;
|
||||||
|
|
||||||
|
while (isxdigit (line[i]))
|
||||||
|
{
|
||||||
|
stmp[j] = line[i];
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (isxdigit (line[i]))
|
||||||
|
{
|
||||||
|
stmp[j] = line[i];
|
||||||
|
i++;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stmp[j] = 0;
|
||||||
|
|
||||||
|
if (j == 0) continue;
|
||||||
|
|
||||||
|
a = strtol (stmp, NULL, 0);
|
||||||
|
|
||||||
|
while (isspace (line[i])) i++;
|
||||||
|
|
||||||
|
t = line[i];
|
||||||
|
i++;
|
||||||
|
s = line[i];
|
||||||
|
i++;
|
||||||
|
|
||||||
|
if ((t != 'U') && (t != 'S'))
|
||||||
|
{
|
||||||
|
printf ("Error: Invalid RAM Watch Byte Type: %c", t);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!isdigit (s))
|
||||||
|
{
|
||||||
|
printf ("Error: Invalid RAM Watch Byte Size: %c", s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
s = s - '0';
|
||||||
|
|
||||||
|
if ((s != 1) && (s != 2) && (s != 4))
|
||||||
|
{
|
||||||
|
printf ("Error: Invalid RAM Watch Byte Size: %i", s);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (isspace (line[i])) i++;
|
||||||
|
|
||||||
|
if (line[i] == '"')
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
j = 0;
|
||||||
|
literal = 0;
|
||||||
|
while ((line[i] != 0))
|
||||||
|
{
|
||||||
|
if (literal)
|
||||||
|
{
|
||||||
|
literal = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (line[i] == '"')
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (line[i] == '\\')
|
||||||
|
{
|
||||||
|
literal = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!literal)
|
||||||
|
{
|
||||||
|
stmp[j] = line[i];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
stmp[j] = 0;
|
||||||
|
}
|
||||||
|
rw = new ramWatch_t;
|
||||||
|
|
||||||
|
rw->addr = a;
|
||||||
|
rw->type = (t == 'U') ? 1 : 0;
|
||||||
|
rw->size = s;
|
||||||
|
rw->name.assign (stmp);
|
||||||
|
|
||||||
|
ramWatchList.ls.push_back (rw);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose (fp);
|
||||||
|
|
||||||
|
//showAllRamWatchResults (1);
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <list>
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
@ -18,6 +19,120 @@
|
||||||
|
|
||||||
#include "Qt/main.h"
|
#include "Qt/main.h"
|
||||||
|
|
||||||
|
struct ramWatch_t
|
||||||
|
{
|
||||||
|
std::string name;
|
||||||
|
int addr;
|
||||||
|
int type;
|
||||||
|
int size;
|
||||||
|
|
||||||
|
union
|
||||||
|
{
|
||||||
|
int8_t i8;
|
||||||
|
uint8_t u8;
|
||||||
|
int16_t i16;
|
||||||
|
uint16_t u16;
|
||||||
|
} val;
|
||||||
|
|
||||||
|
ramWatch_t (void)
|
||||||
|
{
|
||||||
|
addr = 0;
|
||||||
|
type = 0;
|
||||||
|
size = 0;
|
||||||
|
val.u16 = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
void updateMem (void);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ramWatchList_t
|
||||||
|
{
|
||||||
|
|
||||||
|
std::list <ramWatch_t*> ls;
|
||||||
|
|
||||||
|
ramWatchList_t (void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
~ramWatchList_t (void)
|
||||||
|
{
|
||||||
|
ramWatch_t *rw;
|
||||||
|
|
||||||
|
while (!ls.empty ())
|
||||||
|
{
|
||||||
|
rw = ls.front ();
|
||||||
|
|
||||||
|
delete rw;
|
||||||
|
|
||||||
|
ls.pop_front ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t size (void)
|
||||||
|
{
|
||||||
|
return ls.size ();
|
||||||
|
};
|
||||||
|
|
||||||
|
void add_entry (const char *name, int addr, int type, int size)
|
||||||
|
{
|
||||||
|
ramWatch_t *rw = new ramWatch_t;
|
||||||
|
|
||||||
|
rw->name.assign (name);
|
||||||
|
rw->addr = addr;
|
||||||
|
rw->type = type;
|
||||||
|
rw->size = size;
|
||||||
|
ls.push_back (rw);
|
||||||
|
}
|
||||||
|
|
||||||
|
void updateMemoryValues (void)
|
||||||
|
{
|
||||||
|
ramWatch_t *rw;
|
||||||
|
std::list < ramWatch_t * >::iterator it;
|
||||||
|
|
||||||
|
for (it = ls.begin (); it != ls.end (); it++)
|
||||||
|
{
|
||||||
|
rw = *it;
|
||||||
|
|
||||||
|
rw->updateMem ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ramWatch_t *getIndex (size_t idx)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
std::list < ramWatch_t * >::iterator it;
|
||||||
|
|
||||||
|
for (it = ls.begin (); it != ls.end (); it++)
|
||||||
|
{
|
||||||
|
if (i == idx)
|
||||||
|
{
|
||||||
|
return *it;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int deleteIndex (size_t idx)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
std::list < ramWatch_t * >::iterator it;
|
||||||
|
|
||||||
|
for (it = ls.begin (); it != ls.end (); it++)
|
||||||
|
{
|
||||||
|
if (i == idx)
|
||||||
|
{
|
||||||
|
delete *it;
|
||||||
|
ls.erase (it);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
class RamWatchDialog_t : public QDialog
|
class RamWatchDialog_t : public QDialog
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -28,6 +143,8 @@ class RamWatchDialog_t : public QDialog
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void closeEvent(QCloseEvent *event);
|
void closeEvent(QCloseEvent *event);
|
||||||
|
void loadWatchFile (const char *filename);
|
||||||
|
void saveWatchFile (const char *filename);
|
||||||
|
|
||||||
QFont font;
|
QFont font;
|
||||||
QTreeWidget *tree;
|
QTreeWidget *tree;
|
||||||
|
@ -40,9 +157,12 @@ class RamWatchDialog_t : public QDialog
|
||||||
QPushButton *sep_btn;
|
QPushButton *sep_btn;
|
||||||
QPushButton *cht_btn;
|
QPushButton *cht_btn;
|
||||||
|
|
||||||
|
ramWatchList_t ramWatchList;
|
||||||
|
|
||||||
int fontCharWidth;
|
int fontCharWidth;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void updateRamWatchDisplay(void);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void closeWindow(void);
|
void closeWindow(void);
|
||||||
|
|
Loading…
Reference in New Issue