-//
-// m68kDasmWin.cpp - M68K disassembly window
-//
-// by Jean-Paul Mari
-//
-// JPM = Jean-Paul Mari <djipi.mari@gmail.com>
-//
-// Who When What
-// --- ---------- -------------------------------------------------------------
-// JPM 06/27/2016 Created this file
-// JPM 12/04/2016 Suport ELF debug information
-// JPM Replacing the ELF support by the debugger information manager calls
-//
-
-// STILL TO DO:
-//
-
-#include <stdlib.h>
-#include "debugger\m68kDasmWin.h"
-//#include "memory.h"
-#include "m68000/m68kinterface.h"
-#include "dsp.h"
-#include "gpu.h"
-//#include "jaguar.h"
-//#include "ELFManager.h"
-#include "DBGManager.h"
-//extern jaguarRunAddress;
-#include "settings.h"
-
-
-m68KDasmWindow::m68KDasmWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),
- layout(new QVBoxLayout), text(new QTextBrowser),
-// layout(new QTabWidget), text(new QLabel),
-#if 0
- refresh(new QPushButton(tr("Refresh"))),
- address(new QLineEdit),
- go(new QPushButton(tr("Go"))),
-#endif
-// memBase(0x4000)
- memBase(0)
-{
-// m68kDasmWindow *m68kDasmWin = new m68kDasmWindow();
-// setWindowTitle(tr("Jaguar Disassembly Window"));
-// layout->addTab(new m68KDasmWindow(), tr("M68K Disassembly"));
- //layout = new QTabWidget;
- //layout->QWidget();
-
-#if 0
- address->setInputMask("hhhhhh");
- QHBoxLayout * hbox1 = new QHBoxLayout;
- hbox1->addWidget(refresh);
- hbox1->addWidget(address);
- hbox1->addWidget(go);
-#endif
-
- // Need to set the size as well...
-// resize(560, 480);
-
- QFont fixedFont("Lucida Console", 8, QFont::Normal);
-// QFont fixedFont("", 8, QFont::Normal);
- fixedFont.setStyleHint(QFont::Monospace); //TypeWriter
- fixedFont.setLetterSpacing(QFont::PercentageSpacing, 100);
- text->setFont(fixedFont);
-// text->setStyleSheet("background-color: DeepSkyBlue;");
-//// layout->setSizeConstraint(QLayout::SetFixedSize);
- setLayout(layout);
-
- layout->addWidget(text);
-// layout->addWidget(refresh);
-#if 0
- layout->addLayout(hbox1);
-#endif
-
-#if 0
- connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));
- connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress()));
-#endif
-}
-
-
-//
-void m68KDasmWindow::RefreshContents(void)
-{
- //char ; //, buf[64];
- QString s;
- char buffer[1024], string[1024], adresse[16];
- size_t pc = memBase, oldpc;
- size_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);
- char *Symbol = NULL, *LineSrc, *CurrentLineSrc = NULL;
- bool m68kPCShow = false;
- bool constant, adr, equal, Error;
- size_t j, i;
- size_t nbr = vjs.nbrdisasmlines;
- char *PtrFullSource, *CurrentPtrFullSource = (char *)calloc(1, 1);
- size_t NumLine; // , CurrentNumLine = 0;
-// size_t CurrentNumLine = DBGManager_GetNumLineFromAdr(pc, DBG_NO_TAG) - 1;
- size_t CurrentNumLine;
- char singleCharString[2] = { 0, 0 };
-
- text->clear();
-
- for (i = 0; i < nbr; i++)
- {
- oldpc = pc;
-// WriteLog("%06X: %s\n", oldpc, buffer);
- adr = constant = equal = false;
-
- // Display source filename based on the program address
- if (vjs.displayFullSourceFilename && (PtrFullSource = DBGManager_GetFullSourceFilenameFromAdr(oldpc, &Error)) && strcmp(CurrentPtrFullSource, PtrFullSource))
- {
-#if 0
- if (strcmp(OldPtrFullSource, PtrFullSource))
-#endif
- {
-#if 1
- if (i)
- {
- nbr++;
- s += QString("<br>");
- }
-#endif
- CurrentNumLine = DBGManager_GetNumLineFromAdr(pc, DBG_NO_TAG) - 1;
- nbr++;
- CurrentPtrFullSource = (char *)realloc(CurrentPtrFullSource, strlen(PtrFullSource) + 1);
- strcpy(CurrentPtrFullSource, PtrFullSource);
- if (!Error)
- {
- sprintf(string, "<font color='#ff0000'><b>%s</b></font><br>", PtrFullSource);
- }
- else
- {
- sprintf(string, "<font color='#00ff00'><b>%s</b></font><br>", PtrFullSource);
- }
- s += QString(string);
- }
- }
-
- // Display line number based on the program address
- if ((NumLine = DBGManager_GetNumLineFromAdr(oldpc, DBG_NO_TAG)) && ((signed)NumLine > (signed)CurrentNumLine))
- {
- if ((signed)CurrentNumLine < 0)
- {
- CurrentNumLine = NumLine - 1;
- }
- sprintf(string, "| <font color='#006400'>%5u</font> | ", (unsigned int)++CurrentNumLine); // (CurrentNumLine = NumLine));
- }
- else
- {
- sprintf(string, "| | ");
- }
- s += QString(string);
-
- // Display line source based on the program address
- if (((signed)CurrentNumLine > 0) && (LineSrc = DBGManager_GetLineSrcFromNumLineBaseAdr(oldpc, CurrentNumLine)) && (LineSrc != CurrentLineSrc))
- {
- sprintf(string, "<font color='#006400'>%s</font><br>", (CurrentLineSrc = LineSrc));
- s += QString(string);
- nbr++;
- }
- else
- {
- // Display symbol, or line source, based on the program address
- if (!CurrentLineSrc && !Symbol && (Symbol = DBGManager_GetSymbolnameFromAdr(oldpc)))
- {
- sprintf(string, "%s:<br>", Symbol);
- s += QString(string);
- nbr++;
- }
- // Display the assembly line based on the current PC
- else
- {
- pc += m68k_disassemble(buffer, (unsigned int)pc, 0, vjs.disasmopcodes);
-
- if (m68kPC == oldpc)
- {
- sprintf(string, "-> %06X: %s<br>", (unsigned int)oldpc, buffer);
- m68kPCShow = true;
- }
- else
- {
- sprintf(string, " %06X: %s<br>", (unsigned int)oldpc, buffer);
- }
-
- buffer[0] = 0; // Clear string
- //char singleCharString[2] = { 0, 0 };
-
- for (j = 0; j < strlen(string); j++)
- {
- if (string[j] == ' ')
- {
- strcat(buffer, " ");
- adr = constant = false;
- }
- else
- {
- switch (string[j])
- {
- case '#':
- constant = true;
- break;
-
- case '$':
- adr = true;
- break;
-
- case ',':
- constant = adr = equal = false;
- break;
-
- case '=':
- equal = true;
- break;
- }
-
- if (!constant && adr && !equal)
- {
- int l = 0;
- char *p;
- do
- {
- adresse[l++] = string[++j];
- } while ((string[(j + 1)] >= '0') && (string[(j + 1)] <= '9') || (string[(j + 1)] >= 'A') && (string[(j + 1)] <= 'F'));
- adresse[l] = 0;
-
- if (Symbol = DBGManager_GetSymbolnameFromAdr(strtoul(adresse, &p, 16)))
- {
- strcat(buffer, Symbol);
- }
- else
- {
- strcat(buffer, "$");
- strcat(buffer, adresse);
- }
-
- adr = false;
- }
- else
- {
- singleCharString[0] = string[j];
- strcat(buffer, singleCharString);
- }
- }
- }
-
- Symbol = NULL;
- // s += QString(string);
- s += QString(buffer);
- // text->setStyleSheet("QLabel { background-color : red; color : blue; }");
- }
- }
- }
-
-// text->clear();
-
- if (m68kPCShow)
- {
- text->setText(s);
- }
- else
- {
- Use68KPCAddress();
- RefreshContents();
- }
-
- free(CurrentPtrFullSource);
-}
-
-
-#if 0
-void m68KDasmWindow::keyPressEvent(QKeyEvent * e)
-{
-// if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Return)
-// hide();
-#if 0
- else if (e->key() == Qt::Key_PageUp)
- {
- memBase -= 64;
-
- if (memBase < 0)
- memBase = 0;
-
- RefreshContents();
- }
- else if (e->key() == Qt::Key_PageDown)
- {
- memBase += 64;
-
- if (memBase > (0xF00000 - 64))
- memBase = 0xF00000 - 64;
-
- RefreshContents();
- }
- else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)
- {
- memBase -= 16;
-
- if (memBase < 0)
- memBase = 0;
-
- RefreshContents();
- }
- else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal)
- {
- memBase += 16;
-
- if (memBase > (0xF00000 - 64))
- memBase = 0xF00000 - 64;
-
- RefreshContents();
- }
-#endif
-}
-#endif
-
-
-// Set mem base PC address using the 68K pc current address
-void m68KDasmWindow::Use68KPCAddress(void)
-{
- memBase = m68k_get_reg(NULL, M68K_REG_PC);
-}
-
-
-// Set mem base PC address
-void m68KDasmWindow::SetAddress(int address)
-{
- memBase = address;
-// RefreshContents();
-}
-
-
-// Set mem base PC address based on user interaction
-#if 0
-void m68KDasmWindow::GoToAddress(void)
-{
- bool ok;
-
- QString newAddress = address->text();
- memBase = newAddress.toUInt(&ok, 16);
- RefreshContents();
-}
-#endif
+//\r
+// m68kDasmWin.cpp - M68K disassembly window\r
+//\r
+// by Jean-Paul Mari\r
+//\r
+// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
+//\r
+// Who When What\r
+// --- ---------- -------------------------------------------------------------\r
+// JPM 06/27/2016 Created this file\r
+// JPM 12/04/2016 Suport ELF debug information\r
+// JPM Replacing the ELF support by the debugger information manager calls\r
+//\r
+\r
+// STILL TO DO:\r
+//\r
+\r
+#include <stdlib.h>\r
+#include "debugger/m68kDasmWin.h"\r
+#include "m68000/m68kinterface.h"\r
+#include "dsp.h"\r
+#include "gpu.h"\r
+#include "DBGManager.h"\r
+#include "settings.h"\r
+\r
+\r
+// \r
+m68KDasmWindow::m68KDasmWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),\r
+ layout(new QVBoxLayout), text(new QTextBrowser),\r
+ memBase(0)\r
+{\r
+ QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
+ fixedFont.setStyleHint(QFont::Monospace); //TypeWriter\r
+ fixedFont.setLetterSpacing(QFont::PercentageSpacing, 100);\r
+ text->setFont(fixedFont);\r
+ setLayout(layout);\r
+\r
+ layout->addWidget(text);\r
+}\r
+\r
+\r
+//\r
+void m68KDasmWindow::RefreshContents(void)\r
+{\r
+ QString s;\r
+ char buffer[1024], string[1024], adresse[16];\r
+ size_t pc = memBase, oldpc;\r
+ size_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);\r
+ size_t m68KPCNbrDisasmLines = 0;\r
+ char *Symbol = NULL, *LineSrc, *CurrentLineSrc = NULL;\r
+ bool m68kPCShow = false;\r
+ bool constant, adr, equal, Error;\r
+ size_t j, i;\r
+ size_t nbr = vjs.nbrdisasmlines;\r
+ char *PtrFullSource, *CurrentPtrFullSource = (char *)calloc(1, 1);\r
+ size_t NumLine; // , CurrentNumLine = 0;\r
+ size_t CurrentNumLine;\r
+ char singleCharString[2] = { 0, 0 };\r
+\r
+ for (i = 0; i < nbr; i++)\r
+ {\r
+ oldpc = pc;\r
+ adr = constant = equal = false;\r
+\r
+ // Display source filename based on the program address\r
+ if (vjs.displayFullSourceFilename && (PtrFullSource = DBGManager_GetFullSourceFilenameFromAdr(oldpc, &Error)) && strcmp(CurrentPtrFullSource, PtrFullSource))\r
+ {\r
+#if 0\r
+ if (strcmp(OldPtrFullSource, PtrFullSource))\r
+#endif\r
+ {\r
+ if (i)\r
+ {\r
+ nbr++;\r
+ s += QString("<br>");\r
+ }\r
+\r
+ CurrentNumLine = DBGManager_GetNumLineFromAdr(pc, DBG_NO_TAG) - 1;\r
+ nbr++;\r
+ CurrentPtrFullSource = (char *)realloc(CurrentPtrFullSource, strlen(PtrFullSource) + 1);\r
+ strcpy(CurrentPtrFullSource, PtrFullSource);\r
+ if (!Error)\r
+ {\r
+ sprintf(string, "<font color='#ff0000'><b>%s</b></font><br>", PtrFullSource);\r
+ }\r
+ else\r
+ {\r
+ sprintf(string, "<font color='#00ff00'><b>%s</b></font><br>", PtrFullSource);\r
+ }\r
+ s += QString(string);\r
+ }\r
+ }\r
+\r
+ // Display line number based on the program address\r
+ if ((NumLine = DBGManager_GetNumLineFromAdr(oldpc, DBG_NO_TAG)) && ((signed)NumLine > (signed)CurrentNumLine))\r
+ {\r
+ if ((signed)CurrentNumLine < 0)\r
+ {\r
+ CurrentNumLine = NumLine - 1;\r
+ }\r
+ sprintf(string, "| <font color='#006400'>%5u</font> | ", (unsigned int)++CurrentNumLine); // (CurrentNumLine = NumLine));\r
+ }\r
+ else\r
+ {\r
+ sprintf(string, "| | ");\r
+ }\r
+ s += QString(string);\r
+\r
+ // Display line source based on the program address\r
+ if (((signed)CurrentNumLine > 0) && (LineSrc = DBGManager_GetLineSrcFromNumLineBaseAdr(oldpc, CurrentNumLine)) && (LineSrc != CurrentLineSrc))\r
+ {\r
+ sprintf(string, "<font color='#006400'>%s</font><br>", (CurrentLineSrc = LineSrc));\r
+ s += QString(string);\r
+ nbr++;\r
+ }\r
+ else\r
+ {\r
+ // Display symbol, or line source, based on the program address\r
+ if (!CurrentLineSrc && !Symbol && (Symbol = DBGManager_GetSymbolNameFromAdr(oldpc)))\r
+ {\r
+ sprintf(string, "%s:<br>", Symbol);\r
+ s += QString(string);\r
+ nbr++;\r
+ }\r
+ // Display the assembly line based on the current PC\r
+ else\r
+ {\r
+ pc += m68k_disassemble(buffer, (unsigned int)pc, 0, vjs.disasmopcodes);\r
+\r
+ if (m68kPC == oldpc)\r
+ {\r
+ sprintf(string, "-> <u>%06X: %s</u><br>", (unsigned int)oldpc, buffer);\r
+ m68kPCShow = true;\r
+ m68KPCNbrDisasmLines = i;\r
+ }\r
+ else\r
+ {\r
+ sprintf(string, " %06X: %s<br>", (unsigned int)oldpc, buffer);\r
+ }\r
+\r
+ buffer[0] = 0; // Clear string\r
+\r
+ for (j = 0; j < strlen(string); j++)\r
+ {\r
+ if (string[j] == ' ')\r
+ {\r
+ strcat(buffer, " ");\r
+ adr = constant = false;\r
+ }\r
+ else\r
+ {\r
+ switch (string[j])\r
+ {\r
+ case '#':\r
+ constant = true;\r
+ break;\r
+\r
+ case '$':\r
+ adr = true;\r
+ break;\r
+\r
+ case ',':\r
+ constant = adr = equal = false;\r
+ break;\r
+\r
+ case '=':\r
+ equal = true;\r
+ break;\r
+ }\r
+\r
+ if (!constant && adr && !equal)\r
+ {\r
+ int l = 0;\r
+ char *p;\r
+ do\r
+ {\r
+ adresse[l++] = string[++j];\r
+ } while ((string[(j + 1)] >= '0') && (string[(j + 1)] <= '9') || (string[(j + 1)] >= 'A') && (string[(j + 1)] <= 'F'));\r
+ adresse[l] = 0;\r
+\r
+ if (Symbol = DBGManager_GetSymbolNameFromAdr(strtoul(adresse, &p, 16)))\r
+ {\r
+ strcat(buffer, Symbol);\r
+ }\r
+ else\r
+ {\r
+ strcat(buffer, "$");\r
+ strcat(buffer, adresse);\r
+ }\r
+\r
+ adr = false;\r
+ }\r
+ else\r
+ {\r
+ singleCharString[0] = string[j];\r
+ strcat(buffer, singleCharString);\r
+ }\r
+ }\r
+ }\r
+\r
+ Symbol = NULL;\r
+ s += QString(buffer);\r
+ }\r
+ }\r
+ }\r
+\r
+ // Display generated text\r
+ text->clear();\r
+ if (m68kPCShow)\r
+ {\r
+ text->setText(s);\r
+ }\r
+ else\r
+ {\r
+ Use68KPCAddress();\r
+ RefreshContents();\r
+ }\r
+\r
+ // Set the scrollbar position in accordance of the M68K PC pointer \r
+ if (m68KPCNbrDisasmLines > (nbr / 2))\r
+ {\r
+ text->verticalScrollBar()->setValue(text->verticalScrollBar()->maximum());\r
+ }\r
+ else\r
+ {\r
+ text->verticalScrollBar()->setValue(text->verticalScrollBar()->minimum());\r
+ }\r
+\r
+ free(CurrentPtrFullSource);\r
+}\r
+\r
+\r
+// Set mem base PC address using the 68K pc current address\r
+void m68KDasmWindow::Use68KPCAddress(void)\r
+{\r
+ memBase = m68k_get_reg(NULL, M68K_REG_PC);\r
+}\r
+\r
+\r
+// Set mem base PC address\r
+void m68KDasmWindow::SetAddress(int address)\r
+{\r
+ memBase = address;\r
+}\r