From: Jean-Paul Mari Date: Sun, 28 Oct 2018 10:33:03 +0000 (-0400) Subject: Added a cartdridge view menu X-Git-Tag: v2.1.3-R4~12 X-Git-Url: http://git.hcoop.net/clinton/Virtual-Jaguar-Rx.git/commitdiff_plain/24470541287fc534ebc8f9bb0d09208066117c49 Added a cartdridge view menu --- diff --git a/Win-VS2017/virtualjaguar.vcxproj b/Win-VS2017/virtualjaguar.vcxproj index 7a8c8ca..44d1a70 100644 --- a/Win-VS2017/virtualjaguar.vcxproj +++ b/Win-VS2017/virtualjaguar.vcxproj @@ -280,6 +280,7 @@ + @@ -308,6 +309,10 @@ true true + + true + true + true true @@ -490,6 +495,10 @@ true true + + true + true + true true @@ -716,6 +725,24 @@ .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_NO_DEBUG -DQT_OPENGL_LIB -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -D_UNICODE "-I." "-I.\..\src" "-I.\..\src\gui" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-IC:\SDK\OpenGL\include" "-IC:\SDK\SDL\SDL-1.2.15\include" "-IC:\SDK\DWARF\libdwarf-VS2015\include" "-IC:\SDK\Elf\libelf-0.8.13\include" "-IC:\SDK\zlib\zlib-1.2.11\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + + $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_OPENGL_LIB "-I." "-I.\..\src" "-I.\..\src\gui" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtOpenGL" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtWidgets" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtGui" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtANGLE" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtCore" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\mkspecs\win32-msvc2015" "-IC:\SDK\SDL-1.2.15\include" "-IC:\SDK\mesa-11.2.0-rc4\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_OPENGL_LIB -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -D_UNICODE "-I." "-I.\..\src" "-I.\..\src\gui" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-IC:\SDK\SDL\SDL-1.2.15\include" "-IC:\SDK\DWARF\libdwarf-VS2015\include" "-IC:\SDK\Elf\libelf-0.8.13\include" "-IC:\SDK\zlib\zlib-1.2.8\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-IC:\SDK\OpenGL\include" + $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_NO_DEBUG -DQT_OPENGL_ES_2 -DQT_OPENGL_ES_2_ANGLE -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_OPENGL_LIB "-I." "-I.\..\src" "-I.\..\src\gui" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtOpenGL" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtWidgets" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtGui" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtANGLE" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\include\QtCore" "-I.\..\..\..\Qt\Qt5.5.1\msvc2015_64\mkspecs\win32-msvc2015" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-I.\GeneratedFiles\$(ConfigurationName)\." + $(QTDIR)\bin\moc.exe;%(FullPath);$(QTDIR)\bin\moc.exe;%(FullPath) + Moc%27ing %(Identity)... + .\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp + "$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -D_CRT_SECURE_NO_WARNINGS -D_WINDOWS -DUNICODE -DWIN32 -DWIN64 -D__GCCWIN32__ -DQT_NO_DEBUG -DQT_OPENGL_LIB -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB -D_UNICODE "-I." "-I.\..\src" "-I.\..\src\gui" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\QtOpenGL" "-IC:\SDK\OpenGL\include" "-IC:\SDK\SDL\SDL-1.2.15\include" "-IC:\SDK\DWARF\libdwarf-VS2015\include" "-IC:\SDK\Elf\libelf-0.8.13\include" "-IC:\SDK\zlib\zlib-1.2.11\include" "-I.\GeneratedFiles\$(ConfigurationName)\." + Moc%27ing keybindingstab.h... diff --git a/Win-VS2017/virtualjaguar.vcxproj.filters b/Win-VS2017/virtualjaguar.vcxproj.filters index 0fea985..1a08a62 100644 --- a/Win-VS2017/virtualjaguar.vcxproj.filters +++ b/Win-VS2017/virtualjaguar.vcxproj.filters @@ -62,6 +62,12 @@ {3764368c-2eb6-49e9-a11a-a49b210d6297} + + {e33caa2f-f4da-4d11-a399-c61abae9129c} + + + {6a9b2983-c30d-47db-8c30-73c1ec7d029d} + @@ -421,6 +427,15 @@ Source Files\debugger + + Generated Files + + + Generated Files + + + Source Files\debugger\View + @@ -730,6 +745,9 @@ Header Files\debugger + + Header Files\debugger\View + diff --git a/docs/vj_HistoryNotes.txt b/docs/vj_HistoryNotes.txt index af829eb..a1dba82 100644 --- a/docs/vj_HistoryNotes.txt +++ b/docs/vj_HistoryNotes.txt @@ -76,6 +76,9 @@ Git commit: TBD 40) Added the return address information in the call stack 41) Added multiple breakpoints feature and their key bindings -- For functions only +42) Added timer initialisation for the SDL setup +43) Added a cartdridge view menu +-- Added a window to display my own directory and his files list Release 3 (13th November 2017) ------------------------------ @@ -198,6 +201,7 @@ Known issues -- User must perform an operation, such code tracing, to see the breakpoints list update 16) Some ASCII characters may be not displayed correctly -- It depend how the text is displayed, this is related to the QT/HTML encoding done when reading DWARF file +17) Potential legacy crash when leaving emulator in pause mode for a long period of time Cosmetic / UX issues ==================== diff --git a/src/debugger/CartFilesListWin.cpp b/src/debugger/CartFilesListWin.cpp new file mode 100644 index 0000000..26ae7ae --- /dev/null +++ b/src/debugger/CartFilesListWin.cpp @@ -0,0 +1,373 @@ +// +// CartFilesListWin.cpp - List files in the cartdridge +// +// by Jean-Paul Mari +// +// JPM = Jean-Paul Mari +// +// Who When What +// --- ---------- ----------------------------------------------------------- +// JPM 10/26/2018 Created this file +// + +// TO DO: +// To allow file opening / viewing +// Remove/modify the 1st information, named '1', at the top +// To add a filter +// + +#include "debugger/CartFilesListWin.h" +#include "memory.h" +#include "settings.h" +#include "debugger/DBGManager.h" + + +// +CartFilesListWindow::CartFilesListWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog), +TableView(new QTableView), +model(new QStandardItemModel), +layout(new QVBoxLayout), +treeView(new QTreeView), +standardModel(new QStandardItemModel), +rootNode(new QStandardItem), +CartDirectory(NULL), +statusbar(new QStatusBar), +fileItems(NULL), +nbItem(0), +CartUsedBytes(0), +CartDirType(CFL_NOTYPE) +{ + setWindowTitle(tr("Cartdridge directory & files")); + + // Set the font + QFont fixedFont("Lucida Console", 8, QFont::Normal); + fixedFont.setStyleHint(QFont::TypeWriter); + + // Set the new layout with proper identation and readibility +#ifdef CFL_BUFFERTREAM + model->setColumnCount(5); +#else + model->setColumnCount(4); +#endif + model->setHeaderData(0, Qt::Horizontal, QObject::tr("File")); + model->setHeaderData(1, Qt::Horizontal, QObject::tr("Address")); + model->setHeaderData(2, Qt::Horizontal, QObject::tr("Size")); + model->setHeaderData(3, Qt::Horizontal, QObject::tr("Seek")); +#ifdef CFL_BUFFERTREAM + model->setHeaderData(4, Qt::Horizontal, QObject::tr("Stream")); +#endif + // Information table + TableView->setModel(model); + TableView->setEditTriggers(QAbstractItemView::NoEditTriggers); + TableView->setShowGrid(0); + TableView->setFont(fixedFont); + TableView->verticalHeader()->setDefaultSectionSize(TableView->verticalHeader()->minimumSectionSize()); + TableView->verticalHeader()->setDefaultAlignment(Qt::AlignRight); + layout->addWidget(TableView); + + // Setup root + rootNode = standardModel->invisibleRootItem(); + //register the model + treeView->setModel(standardModel); + treeView->expandAll(); + layout->addWidget(treeView); + + // Status bar + layout->addWidget(statusbar); + setLayout(layout); +} + + +// +CartFilesListWindow::~CartFilesListWindow(void) +{ +} + + +// +void CartFilesListWindow::Reset(void) +{ + standardModel->setRowCount(0); + model->setRowCount(0); + free(CartDirectory); + free(fileItems); + fileItems = NULL; + CartDirectory = NULL; + CartUsedBytes = CartNbrFiles = CartDirType = nbItem = 0; +} + + +// +void CartFilesListWindow::RefreshContents(void) +{ + size_t Error; + char msg[1024]; + + if (isVisible()) + { + if (!CartDirectory) + { + if (CartDirType = GetDirType()) + { + if ((CartNbrFiles = GetNbrFiles())) + { + if ((CartDirectory = (CARTDIRINFO *)CreateInfos())) + { + UpdateInfos(); + sprintf(msg, "%u files | %u bytes in cartdridge", (unsigned int)CartNbrFiles, (unsigned int)CartUsedBytes); + Error = CFL_NOERROR; + } + else + { + sprintf(msg, "Cannot use directory"); + Error = CFL_NODIRUSE; + } + } + else + { + sprintf(msg, "No files"); + Error = CFL_NOFILESLIST; + } + } + else + { + sprintf(msg, "No directory found"); + Error = CFL_NODIRECTORYLIST; + } + + // Display status bar + if (Error) + { + if ((Error & CFL_WARNING)) + { + statusbar->setStyleSheet("background-color: lightyellow; font: bold"); + } + else + { + statusbar->setStyleSheet("background-color: tomato; font: bold"); + } + } + else + { + statusbar->setStyleSheet("background-color: lightgreen; font: bold"); + } + statusbar->showMessage(QString(msg)); + } + else + { + UpdateInfos(); + } + } +} + + +// Get files number in the directory +size_t CartFilesListWindow::GetNbrFiles(void) +{ + switch (CartDirType) + { + case CFL_OSJAGTYPE: + return ((DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_End") - DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb"))) / sizeof(long); + break; + + default: + return 0; + break; + } +} + + +// Get directory type +size_t CartFilesListWindow::GetDirType(void) +{ + if (DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory")) + { + return CFL_OSJAGTYPE; + } + else + { + return CFL_NOTYPE; + } +} + + +// Get filename from index (starting from 0) +void CartFilesListWindow::GetFileInfos(CARTDIRINFO *Ptr, size_t index) +{ + OSJAGDir *Adr; + size_t Offset; + + switch (CartDirType) + { + case CFL_OSJAGTYPE: + Offset = DBGManager_GetAdrFromSymbolName((char *)"OSJAG_Directory_Deb") + (index * sizeof(long)); + Adr = (OSJAGDir *)&jagMemSpace[Offset = GET32(jagMemSpace, Offset)]; + if (strlen(Adr->Filename)) + { + Ptr->PtrFilename = Adr->Filename; + Ptr->valid = true; + } + else + { + Ptr->PtrFilename = (char *)"(null)"; + } + Ptr->PtrDataFile = GET32(jagMemSpace, Offset); + Ptr->SizeFile = GET32(jagMemSpace, (Offset + sizeof(long))); + break; + + default: + break; + } +} + + +// Create information from the directory information +void *CartFilesListWindow::CreateInfos(void) +{ + CARTDIRINFO *Ptr = (CARTDIRINFO *)calloc(CartNbrFiles, sizeof(CARTDIRINFO)); + model->setRowCount(0); + + for (int i = 0; i < CartNbrFiles; i++) + { + GetFileInfos(&Ptr[i], i); + AddFilename(Ptr[i].PtrFilename, rootNode, 0); + // Display row content + model->insertRow(i); + model->setItem(i, 0, new QStandardItem(QString("%1").arg(Ptr[i].PtrFilename))); + if (!Ptr[i].SizeFile) + { + //model->setItem(i, 1, new QStandardItem(QString("%1").arg(""))); + //model->setItem(i, 2, new QStandardItem(QString("%1").arg(""))); + } + else + { + model->setItem(i, 1, new QStandardItem(QString("0x%1").arg(Ptr[i].PtrDataFile, 6, 16, QChar('0')))); + model->setItem(i, 2, new QStandardItem(QString("0x%1").arg(Ptr[i].SizeFile, 6, 16, QChar('0')))); + } + CartUsedBytes += Ptr[i].SizeFile; + } + + return Ptr; +} + + +// Update the variables information (seek and stream buffer) +void CartFilesListWindow::UpdateInfos(void) +{ + size_t Offset; + + for (int i = 0; i < CartNbrFiles; i++) + { + // Check if file validity (exitence) + if (CartDirectory[i].valid) + { + // Get the current seek and tentatively check validity (must be included in the ram zone) + Offset = DBGManager_GetAdrFromSymbolName((char *)"OSJAG_SeekPosition") + (i * sizeof(long)); + if ((CartDirectory[i].CurrentSeek = GET32(jagMemSpace, Offset)) < vjs.DRAM_size) + { + model->setItem(i, 3, new QStandardItem(QString("0x%1").arg(CartDirectory[i].CurrentSeek, 6, 16, QChar('0')))); + } + else + { + //model->setItem(i, 3, new QStandardItem(QString("%1").arg(""))); + } + + // Get stream buffer address and check validity (must be included in the ram zone) + Offset = DBGManager_GetAdrFromSymbolName((char *)"OSJAG_PtrBuffer") + (i * sizeof(long)); + if (((CartDirectory[i].PtrBufferStream = GET32(jagMemSpace, Offset)) < vjs.DRAM_size) && CartDirectory[i].PtrBufferStream) + { +#ifdef CFL_BUFFERTREAM + model->setItem(i, 4, new QStandardItem(QString("0x%1").arg(CartDirectory[i].PtrBufferStream, 6, 16, QChar('0')))); +#else + if (!CartDirectory[i].SizeFile) + { + model->setItem(i, 1, new QStandardItem(QString("0x%1").arg(CartDirectory[i].PtrBufferStream, 6, 16, QChar('0')))); + } +#endif + } + else + { +#ifdef CFL_BUFFERTREAM + model->setItem(i, 4, new QStandardItem(QString("%1").arg(""))); +#else + if (!CartDirectory[i].SizeFile) + { + model->setItem(i, 1, new QStandardItem(QString("%1").arg(""))); + } +#endif + } + } + } +} + + +// Add source code filename in the list +void CartFilesListWindow::AddFilename(char *FileName, QStandardItem *root, size_t ItemPos) +{ + char *Ptr = FileName; + Sfileitem *PtrNewFile; + char Buffer[255]; + char a; + + while ((a = *Ptr++) && ((a != '\\') && (a != '/'))); + + if (a) + { + strncpy(Buffer, FileName, (Ptr - FileName - 1)); + Buffer[(Ptr - FileName - 1)] = 0; + } + else + { + strcpy(Buffer, FileName); + } + PtrNewFile = (Sfileitem *)AddItem(Buffer, ItemPos); + if (!PtrNewFile->PreviousItem) + { + PtrNewFile->PreviousItem = root; + root->appendRow(PtrNewFile->Item); + PtrNewFile->Item->setEditable(false); + } + + if (a) + { + return (AddFilename(Ptr, PtrNewFile->Item, (ItemPos + 1))); + } +} + + +// Add item to the list +// Return void * on new item or already existing one +void *CartFilesListWindow::AddItem(char *ItemName, size_t ItemPos) +{ + Sfileitem *Ptr = fileItems; + + // Look for already existing item + for (size_t i = 0; i < nbItem; i++) + { + if ((Ptr->column == ItemPos) && !strcmp(Ptr->Item->text().toLocal8Bit().constData(), ItemName)) + { + return Ptr; + } + else + { + Ptr++; + } + } + + // Add item in the list + fileItems = (Sfileitem *)realloc(fileItems, (sizeof(Sfileitem) * ++nbItem)); + (fileItems + (nbItem - 1))->column = ItemPos; + (fileItems + (nbItem - 1))->PreviousItem = NULL; + (fileItems + (nbItem - 1))->Item = new QStandardItem(ItemName); + return (fileItems + (nbItem - 1)); +} + + +// +void CartFilesListWindow::keyPressEvent(QKeyEvent * e) +{ + if (e->key() == Qt::Key_Escape) + { + hide(); + } +} diff --git a/src/debugger/CartFilesListWin.h b/src/debugger/CartFilesListWin.h new file mode 100644 index 0000000..e504d17 --- /dev/null +++ b/src/debugger/CartFilesListWin.h @@ -0,0 +1,91 @@ +// +// CartFilesListWin.h: List files from directory +// +// by Jean-Paul Mari +// + +#ifndef __CARTFILESLISTWIN_H__ +#define __CARTFILESLISTWIN_H__ + +#include +#include + +// +//#define CFL_BUFFERTREAM // Display the buffer stream + +// Error code definitions +#define CFL_NOERROR 0x00 +#define CFL_ERROR 0x80 +#define CFL_WARNING 0x40 +#define CFL_NOFILESLIST (0x01 | CFL_WARNING) +#define CFL_NODIRECTORYLIST (0x02 | CFL_WARNING) +#define CFL_NODIRUSE (0x04 | CFL_WARNING) + +// Cart directory type +#define CFL_NOTYPE 0x00 +#define CFL_OSJAGTYPE 0x01 + + +// +class CartFilesListWindow: public QWidget +{ + Q_OBJECT + + typedef struct _fileitem + { + size_t column; + QStandardItem *PreviousItem; + QStandardItem *Item; + }Sfileitem; + + typedef struct S_CARTDIRINFO + { + bool valid; + char *PtrFilename; + size_t SizeFile; + size_t PtrDataFile; + size_t CurrentSeek; + size_t PtrBufferStream; + } + CARTDIRINFO; + + typedef struct S_OSJAGDir + { + long PtrDataFile; + long SizeFile; + char Filename[]; + } + OSJAGDir; + + public: + CartFilesListWindow(QWidget *parent = 0); + ~CartFilesListWindow(void); + void RefreshContents(void); + void Reset(void); + + private: + void *AddItem(char *ItemName, size_t ItemPos); + void AddFilename(char *FileName, QStandardItem *root, size_t ItemPos); + void UpdateInfos(void); + void *CreateInfos(void); + size_t GetDirType(void); + size_t GetNbrFiles(void); + void GetFileInfos(CARTDIRINFO *Ptr, size_t index); + + protected: + void keyPressEvent(QKeyEvent * e); + + private: + size_t nbItem, CartDirType, CartNbrFiles, CartUsedBytes; + QVBoxLayout *layout; + QTreeView *treeView; + QStandardItemModel *standardModel; + QStandardItem *rootNode; + CARTDIRINFO *CartDirectory; + QStatusBar *statusbar; + Sfileitem *fileItems; + QStandardItemModel *model; + QTableView *TableView; +}; + +#endif // __CARTFILESLISTWIN_H__ diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index 031e6e3..352d580 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -20,7 +20,7 @@ // JPM 11/04/2017 Added the local window // JPM 08/31/2018 Added the call stack window // JPM Sept./2018 Added the new Models and BIOS handler, a screenshot feature and source code files browsing -// JPM Oct./2018 Added search paths in the settings, breakpoints feature +// JPM Oct./2018 Added search paths in the settings, breakpoints feature, cartdridge view menu // // FIXED: @@ -99,6 +99,7 @@ #include "debugger/localbrowser.h" #include "debugger/heapallocatorbrowser.h" #include "debugger/callstackbrowser.h" +#include "debugger/CartFilesListWin.h" // According to SebRmv, this header isn't seen on Arch Linux either... :-/ @@ -199,6 +200,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), NewFunctionBreakpointWin = new NewFnctBreakpointWindow(this); exceptionvectortableBrowseWin = new ExceptionVectorTableBrowserWindow(this); CallStackBrowseWin = new CallStackBrowserWindow(this); + CartFilesListWin = new CartFilesListWindow(this); mem1BrowseWin = (Memory1BrowserWindow **)calloc(vjs.nbrmemory1browserwindow, sizeof(Memory1BrowserWindow)); #ifdef _MSC_VER @@ -447,6 +449,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), CallStackBrowseAct->setStatusTip(tr("Shows Call Stack browser window")); connect(CallStackBrowseAct, SIGNAL(triggered()), this, SLOT(ShowCallStackBrowserWin())); + // Cart files list + CartFilesListAct = new QAction(QIcon(""), tr("Directory and files"), this); + CartFilesListAct->setStatusTip(tr("List of the files in the cartdridge's directory")); + connect(CartFilesListAct, SIGNAL(triggered()), this, SLOT(ShowCartFilesListWin())); + // Memory windows mem1BrowseAct = (QAction **)calloc(vjs.nbrmemory1browserwindow, sizeof(QAction)); QSignalMapper *signalMapper = new QSignalMapper(this); @@ -517,11 +524,25 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), fileMenu->addSeparator(); fileMenu->addAction(quitAppAct); + // Alpine and debugger menus if (vjs.hardwareTypeAlpine || vjs.softTypeDebugger) { + // Create debug & view menu debugMenu = menuBar()->addMenu(tr("&Debug")); + viewMenu = menuBar()->addMenu(tr("&View")); + + // Create debugger menu if (vjs.softTypeDebugger) { + // Cart menu + viewCartMenu = viewMenu->addMenu(tr("&Cartridge")); + viewCartMenu->addAction(CartFilesListAct); +#if 0 + viewCartMenu->addSeparator(); + viewCartMenu->addAction(CartStreamsAct); +#endif + + // Windows menu debugWindowsMenu = debugMenu->addMenu(tr("&Windows")); debugWindowsMenu->addAction(BreakpointsAct); debugWindowExceptionMenu = debugWindowsMenu->addMenu(tr("&Exception")); @@ -565,11 +586,14 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), debugNewBreakpointMenu->addAction(newFunctionBreakpointAct); debugMenu->addAction(deleteAllBreakpointsAct); debugMenu->addAction(disableAllBreakpointsAct); - //debugMenu->addSeparator(); - //debugMenu->addAction(DasmAct); +#if 0 + debugMenu->addSeparator(); + debugMenu->addAction(DasmAct); +#endif } else { + // Create alpine menu debugMenu->addAction(memBrowseAct); debugMenu->addAction(stackBrowseAct); debugMenu->addAction(cpuBrowseAct); @@ -1489,6 +1513,14 @@ void MainWin::ShowNewFunctionBreakpointWin(void) } +// +void MainWin::ShowCartFilesListWin(void) +{ + CartFilesListWin->show(); + CartFilesListWin->RefreshContents(); +} + + // Step Into trace void MainWin::DebuggerTraceStepInto(void) { @@ -2023,6 +2055,13 @@ void MainWin::ReadUISettings(void) size = settings.value("CallStackBrowseWinSize", QSize(400, 400)).toSize(); CallStackBrowseWin->resize(size); + // Cartdridge directory and files + pos = settings.value("CartFilesListWinPos", QPoint(200, 200)).toPoint(); + CartFilesListWin->move(pos); + settings.value("CartFilesListWinIsVisible", false).toBool() ? ShowCartFilesListWin() : void(); + size = settings.value("CartFilesListWinSize", QSize(400, 400)).toSize(); + CartFilesListWin->resize(size); + // Breakpoints UI information pos = settings.value("BreakpointsWinPos", QPoint(200, 200)).toPoint(); BreakpointsWin->move(pos); @@ -2242,6 +2281,10 @@ void MainWin::WriteUISettings(void) settings.setValue("NewFunctionBreakpointWinPos", NewFunctionBreakpointWin->pos()); settings.setValue("NewFunctionBreakpointWinIsVisible", NewFunctionBreakpointWin->isVisible()); settings.setValue("NewFunctionBreakpointWinSize", NewFunctionBreakpointWin->size()); + settings.setValue("CartFilesListWinPos", CartFilesListWin->pos()); + settings.setValue("CartFilesListWinIsVisible", CartFilesListWin->isVisible()); + settings.setValue("CartFilesListWinSize", CartFilesListWin->size()); + for (i = 0; i < vjs.nbrmemory1browserwindow; i++) { sprintf(mem1Name, "mem1BrowseWinPos[%i]", (unsigned int)i); @@ -2270,6 +2313,13 @@ void MainWin::AlpineRefreshWindows(void) } +// Reset soft view windows +void MainWin::ViewResetWindows(void) +{ + CartFilesListWin->Reset(); +} + + // Reset soft debugger windows void MainWin::DebuggerResetWindows(void) { @@ -2279,12 +2329,19 @@ void MainWin::DebuggerResetWindows(void) allWatchBrowseWin->Reset(); heapallocatorBrowseWin->Reset(); BreakpointsWin->Reset(); - //ResetAlpineWindows(); + ViewResetWindows(); } } +// Refresh view windows +void MainWin::ViewRefreshWindows(void) +{ + CartFilesListWin->RefreshContents(); +} + + // Refresh soft debugger & alpine debug windows void MainWin::DebuggerRefreshWindows(void) { @@ -2307,6 +2364,7 @@ void MainWin::DebuggerRefreshWindows(void) } AlpineRefreshWindows(); + ViewRefreshWindows(); } } diff --git a/src/gui/mainwin.h b/src/gui/mainwin.h index a7d36af..4d07906 100644 --- a/src/gui/mainwin.h +++ b/src/gui/mainwin.h @@ -47,6 +47,7 @@ class BreakpointsWindow; class NewFnctBreakpointWindow; class ExceptionVectorTableBrowserWindow; class FilesrcListWindow; +class CartFilesListWindow; // @@ -61,8 +62,10 @@ class MainWin: public QMainWindow void LoadFile(QString); void SyncUI(void); void DebuggerRefreshWindows(void); - void DebuggerResetWindows(void); + void ViewRefreshWindows(void); void AlpineRefreshWindows(void); + void DebuggerResetWindows(void); + void ViewResetWindows(void); protected: void closeEvent(QCloseEvent *); @@ -105,8 +108,11 @@ class MainWin: public QMainWindow void ShowBreakpointsWin(void); void DeleteAllBreakpoints(void); void DisableAllBreakpoints(void); - //void ShowVideoOutputWin(void); - //void ShowDasmWin(void); +#if 0 + void ShowVideoOutputWin(void); + void ShowDasmWin(void); +#endif + void ShowCartFilesListWin(void); // Alpine void ShowMemoryBrowserWin(void); void ShowStackBrowserWin(void); @@ -155,6 +161,7 @@ class MainWin: public QMainWindow FilesrcListWindow *FilesrcListWin; BreakpointsWindow *BreakpointsWin; NewFnctBreakpointWindow *NewFunctionBreakpointWin; + CartFilesListWindow *CartFilesListWin; QTimer *timer; bool running; int zoomLevel; @@ -187,6 +194,7 @@ class MainWin: public QMainWindow QMenu *fileMenu; QMenu *helpMenu; QMenu *debugMenu, *debugWindowsMenu, *debugWindowsBrowsesMenu, *debugWindowsWatchMenu, *debugWindowOutputMenu, *debugWindowExceptionMenu, *debugWindowsMemoryMenu, *debugNewBreakpointMenu; + QMenu *viewMenu, *viewCartMenu; QToolBar * toolbar; QToolBar * debugbar; QToolBar * debuggerbar; @@ -237,6 +245,7 @@ class MainWin: public QMainWindow QAction *deleteAllBreakpointsAct; QAction *disableAllBreakpointsAct; QAction *exceptionVectorTableBrowseAct; + QAction *CartFilesListAct; QIcon powerGreen; QIcon powerRed; diff --git a/virtualjaguar.pro b/virtualjaguar.pro index 788be89..d7e70de 100644 --- a/virtualjaguar.pro +++ b/virtualjaguar.pro @@ -126,6 +126,7 @@ HEADERS = \ src/debugger/callstackbrowser.h \ src/debugger/exceptionvectortablebrowser.h \ src/debugger/NewFnctBreakpointWin.h \ + src/debugger/CartFilesListWin.h \ src/log.h \ src/unzip.h \ src/crc32.h \ @@ -179,6 +180,7 @@ SOURCES = \ src/debugger/exceptionvectortablebrowser.cpp \ src/debugger/callstackbrowser.cpp \ src/debugger/NewFnctBreakpointWin.cpp \ + src/debugger/CartFilesListWin.cpp \ src/log.cpp \ src/unzip.cpp \ src/crc32.cpp \