From ff694ebe499bc0f9bd941f453a9a064442175982 Mon Sep 17 00:00:00 2001 From: Matthew Budd Date: Wed, 7 Oct 2020 21:01:39 -0400 Subject: [PATCH] Qt Ram watch logic in work. --- src/drivers/Qt/CheatsConf.cpp | 1 + src/drivers/Qt/RamWatch.cpp | 282 ++++++++++++++++++++++++++++++++++ src/drivers/Qt/RamWatch.h | 120 +++++++++++++++ 3 files changed, 403 insertions(+) diff --git a/src/drivers/Qt/CheatsConf.cpp b/src/drivers/Qt/CheatsConf.cpp index 81dbd037..0dbfd5ee 100644 --- a/src/drivers/Qt/CheatsConf.cpp +++ b/src/drivers/Qt/CheatsConf.cpp @@ -639,6 +639,7 @@ int GuiCheatsDialog_t::activeCheatListCB (char *name, uint32 a, uint8 v, int c, item->setTextAlignment( 0, Qt::AlignLeft); item->setTextAlignment( 1, Qt::AlignLeft); + item->setTextAlignment( 2, Qt::AlignLeft); actvCheatIdx++; diff --git a/src/drivers/Qt/RamWatch.cpp b/src/drivers/Qt/RamWatch.cpp index 229b25f4..e8ce6f4d 100644 --- a/src/drivers/Qt/RamWatch.cpp +++ b/src/drivers/Qt/RamWatch.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -12,6 +13,11 @@ #include #include +#include "../../types.h" +#include "../../fceu.h" +#include "../../cheat.h" +#include "../../debug.h" + #include "Qt/main.h" #include "Qt/dface.h" #include "Qt/input.h" @@ -252,3 +258,279 @@ void RamWatchDialog_t::closeWindow(void) 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); +} +//---------------------------------------------------------------------------- diff --git a/src/drivers/Qt/RamWatch.h b/src/drivers/Qt/RamWatch.h index 1b511ee3..6fd78ffc 100644 --- a/src/drivers/Qt/RamWatch.h +++ b/src/drivers/Qt/RamWatch.h @@ -3,6 +3,7 @@ #pragma once +#include #include #include #include @@ -18,6 +19,120 @@ #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 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 { Q_OBJECT @@ -28,6 +143,8 @@ class RamWatchDialog_t : public QDialog protected: void closeEvent(QCloseEvent *event); + void loadWatchFile (const char *filename); + void saveWatchFile (const char *filename); QFont font; QTreeWidget *tree; @@ -40,9 +157,12 @@ class RamWatchDialog_t : public QDialog QPushButton *sep_btn; QPushButton *cht_btn; + ramWatchList_t ramWatchList; + int fontCharWidth; private: + void updateRamWatchDisplay(void); public slots: void closeWindow(void);