]> Shamusworld >> Repos - virtualjaguar/commitdiff
Added RISC disassembly browser.
authorShamus Hammons <jlhamm@acm.org>
Wed, 23 Jan 2013 06:59:03 +0000 (00:59 -0600)
committerShamus Hammons <jlhamm@acm.org>
Wed, 23 Jan 2013 06:59:03 +0000 (00:59 -0600)
13 files changed:
src/filedb.cpp
src/gpu.cpp
src/gui/debug/m68kdasmbrowser.cpp
src/gui/debug/memorybrowser.cpp
src/gui/debug/opbrowser.cpp
src/gui/debug/riscdasmbrowser.cpp [new file with mode: 0644]
src/gui/debug/riscdasmbrowser.h [new file with mode: 0644]
src/gui/gamepad.cpp
src/gui/mainwin.cpp
src/gui/mainwin.h
src/jagdasm.cpp
src/tom.cpp
virtualjaguar.pro

index 199b8d45697d38810a19407ddd8d71d9a6668887..8e38803e4e9fd247dd6e365c38eb13ac6b53d985 100644 (file)
@@ -92,7 +92,7 @@ RomIdentifier romList[] = {
        { 0x97EB4651, "I-War (World)", FF_ROM | FF_VERIFIED },
        { 0xA0A25A67, "Missile Command VR", FF_ALPINE },
        { 0xA27823D8, "Ultra Vortek (World) (v0.94) (Beta)", FF_ROM },
-       { 0xA7E01FEF, "Mad Bodies (2008)", FF_ROM | FF_REQ_BIOS },
+       { 0xA7E01FEF, "Mad Bodies (2008)", FF_ROM },
        { 0xA9F8A00E, "Rayman (World)", FF_ROM | FF_VERIFIED },
        { 0xAEA9D831, "Barkley Shut Up & Jam", FF_ROM | FF_VERIFIED },
        { 0xB14C4753, "Fight for Life (World)", FF_ROM | FF_VERIFIED },
index c57b948d5088751dd169e4d20f0d5e89a7a11a3c..02fa112a37281ca310b7925de28b3b550b3458bb 100644 (file)
@@ -501,7 +501,11 @@ uint16 GPUReadWord(uint32 offset, uint32 who/*=UNKNOWN*/)
 uint32 GPUReadLong(uint32 offset, uint32 who/*=UNKNOWN*/)
 {
        if (offset >= 0xF02000 && offset <= 0xF020FF)
-               WriteLog("GPU: ReadLong--Attempt to read from GPU register file by %s!\n", whoName[who]);
+       {
+               WriteLog("GPU: ReadLong--Attempt to read from GPU register file (%X) by %s!\n", offset, whoName[who]);
+               uint32 reg = (offset & 0xFC) >> 2;
+               return (reg < 32 ? gpu_reg_bank_0[reg] : gpu_reg_bank_1[reg - 32]); 
+       }
 
 //     if ((offset >= GPU_WORK_RAM_BASE) && (offset < GPU_WORK_RAM_BASE + 0x1000))
        if ((offset >= GPU_WORK_RAM_BASE) && (offset <= GPU_WORK_RAM_BASE + 0x0FFC))
index 5c52cf020d079d8dfb0e383f1b03902e04f1570b..25829e15e47042c05230d9bd1c3e0c5304e88cf4 100644 (file)
@@ -32,7 +32,7 @@ M68KDasmBrowserWindow::M68KDasmBrowserWindow(QWidget * parent/*= 0*/): QWidget(p
        // Need to set the size as well...
 //     resize(560, 480);
 
-       QFont fixedFont("Lucida Console", 10, QFont::Normal);
+       QFont fixedFont("Lucida Console", 8, QFont::Normal);
        text->setFont(fixedFont);
 ////   layout->setSizeConstraint(QLayout::SetFixedSize);
        setLayout(layout);
index b67ff3271b0c6b5cbf9c039598377ed28662b31e..7acc132969f66d7efe9bf97526b73fab125ae4fa 100644 (file)
@@ -29,7 +29,7 @@ MemoryBrowserWindow::MemoryBrowserWindow(QWidget * parent/*= 0*/): QWidget(paren
        // Need to set the size as well...
 //     resize(560, 480);
 
-       QFont fixedFont("Lucida Console", 10, QFont::Normal);
+       QFont fixedFont("Lucida Console", 8, QFont::Normal);
        text->setFont(fixedFont);
 ////   layout->setSizeConstraint(QLayout::SetFixedSize);
        setLayout(layout);
index 52f40ef784c86274d7d2f459b28884fc5723a992..f129bec62f98c4208fbff6d2f6e9a227de986af7 100644 (file)
@@ -31,7 +31,7 @@ OPBrowserWindow::OPBrowserWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::D
        // Need to set the size as well...
 //     resize(560, 480);
 
-       QFont fixedFont("Lucida Console", 10, QFont::Normal);
+       QFont fixedFont("Lucida Console", 8, QFont::Normal);
        text->setFont(fixedFont);
 ////   layout->setSizeConstraint(QLayout::SetFixedSize);
        setLayout(layout);
diff --git a/src/gui/debug/riscdasmbrowser.cpp b/src/gui/debug/riscdasmbrowser.cpp
new file mode 100644 (file)
index 0000000..194bb11
--- /dev/null
@@ -0,0 +1,148 @@
+//
+// riscdasmbrowser.cpp - Jaguar RISC disassembly browser
+//
+// by James Hammons
+// (C) 2013 Underground Software
+//
+// JLH = James Hammons <jlhamm@acm.org>
+//
+// Who  When        What
+// ---  ----------  -------------------------------------------------------------
+// JLH  01/22/2012  Created this file
+//
+
+// STILL TO DO:
+//
+
+#include "riscdasmbrowser.h"
+//#include "memory.h"
+#include "dsp.h"
+#include "gpu.h"
+#include "jagdasm.h"
+
+
+RISCDasmBrowserWindow::RISCDasmBrowserWindow(QWidget * parent/*= 0*/): QWidget(parent, Qt::Dialog),
+//     layout(new QVBoxLayout), text(new QTextBrowser),
+       layout(new QVBoxLayout), text(new QLabel),
+       refresh(new QPushButton(tr("Refresh"))),
+       go(new QPushButton(tr("Go"))),
+       address(new QLineEdit),
+       gpu(new QRadioButton(tr("GPU"))),
+       dsp(new QRadioButton(tr("DSP"))),
+       memBase(0x4000)
+{
+       setWindowTitle(tr("RISC Disassembly Browser"));
+
+       address->setInputMask("hhhhhh");
+       QHBoxLayout * hbox1 = new QHBoxLayout;
+       hbox1->addWidget(refresh);
+       hbox1->addWidget(address);
+       hbox1->addWidget(go);
+
+
+       // Need to set the size as well...
+//     resize(560, 480);
+
+       QFont fixedFont("Lucida Console", 8, QFont::Normal);
+       text->setFont(fixedFont);
+////   layout->setSizeConstraint(QLayout::SetFixedSize);
+       setLayout(layout);
+
+       layout->addWidget(text);
+//     layout->addWidget(refresh);
+       layout->addLayout(hbox1);
+
+       connect(refresh, SIGNAL(clicked()), this, SLOT(RefreshContents()));
+       connect(go, SIGNAL(clicked()), this, SLOT(GoToAddress()));
+}
+
+
+void RISCDasmBrowserWindow::RefreshContents(void)
+{
+       char string[1024];//, buf[64];
+       QString s;
+
+       char buffer[2048];
+       int pc = memBase, oldpc;
+
+       for(uint32_t i=0; i<32; i++)
+       {
+               oldpc = pc;
+               pc += dasmjag(JAGUAR_GPU, buffer, pc);
+               sprintf(string, "%06X: %s<br>", oldpc, buffer);
+
+               buffer[0] = 0;  // Clear string
+               char singleCharString[2] = { 0, 0 };
+
+               for(uint j=0; j<strlen(string); j++)
+               {
+                       if (string[j] == 32)
+                               strcat(buffer, "&nbsp;");
+                       else
+                       {
+                               singleCharString[0] = string[j];
+                               strcat(buffer, singleCharString);
+                       }
+               }
+
+               s += QString(buffer);
+       }
+
+       text->clear();
+       text->setText(s);
+}
+
+
+void RISCDasmBrowserWindow::keyPressEvent(QKeyEvent * e)
+{
+       if (e->key() == Qt::Key_Escape || e->key() == Qt::Key_Return)
+               hide();
+#if 1
+       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 > (0x1000000 - 480))
+                       memBase = 0x1000000 - 480;
+
+               RefreshContents();
+       }
+       else if (e->key() == Qt::Key_Up || e->key() == Qt::Key_Minus)
+       {
+               memBase -= 2;
+
+               if (memBase < 0)
+                       memBase = 0;
+
+               RefreshContents();
+       }
+       else if (e->key() == Qt::Key_Down || e->key() == Qt::Key_Equal)
+       {
+               memBase += 2;
+
+               if (memBase > (0x1000000 - 480))
+                       memBase = 0x1000000 - 480;
+
+               RefreshContents();
+       }
+#endif
+}
+
+
+void RISCDasmBrowserWindow::GoToAddress(void)
+{
+       bool ok;
+       QString newAddress = address->text();
+       memBase = newAddress.toUInt(&ok, 16);
+       RefreshContents();
+}
+
diff --git a/src/gui/debug/riscdasmbrowser.h b/src/gui/debug/riscdasmbrowser.h
new file mode 100644 (file)
index 0000000..39ae057
--- /dev/null
@@ -0,0 +1,43 @@
+//
+// riscdasmbrowser.h: Jaguar RISC disassembly browser
+//
+// by James Hammons
+// (C) 2013 Underground Software
+//
+
+#ifndef __RISCDASMBROWSER_H__
+#define __RISCDASMBROWSER_H__
+
+#include <QtGui>
+#include <stdint.h>
+
+class RISCDasmBrowserWindow: public QWidget
+{
+       Q_OBJECT
+
+       public:
+               RISCDasmBrowserWindow(QWidget * parent = 0);
+
+
+       public slots:
+//             void DefineAllKeys(void);
+               void RefreshContents(void);
+               void GoToAddress(void);
+
+       protected:
+               void keyPressEvent(QKeyEvent *);
+
+       private:
+               QVBoxLayout * layout;
+//             QTextBrowser * text;
+               QLabel * text;
+               QPushButton * refresh;
+               QPushButton * go;
+               QLineEdit * address;
+               QRadioButton * gpu;
+               QRadioButton * dsp;
+
+               int32_t memBase;
+};
+
+#endif // __RISCDASMBROWSER_H__
index 6ca2329a02cf20ab737bdca253cdc37bb7552f43..1ef1a4e78fdd37877c4b26d4c9ac54b0f2810c5a 100644 (file)
@@ -76,7 +76,6 @@ bool Gamepad::GetState(int joystickID, int buttonID)
        {
                // Handle SDL button
                int buttonNum = (buttonID & JOY_BUTTON_MASK);
-//             SDL_JoystickGetButton(pad[joystickID]);
                return button[joystickID][buttonNum];
        }
        else if (buttonID & JOY_HAT)
@@ -84,8 +83,6 @@ bool Gamepad::GetState(int joystickID, int buttonID)
                // Handle SDL hats
                int hatNumber = (buttonID & JOY_HATNUM_MASK) >> 3;
                uint8_t hatDirection = hatMask[buttonID & JOY_HATBUT_MASK];
-//             uint8 direction = SDL_JoystickGetHat(pad[joystickID], hatNumber);
-//             return (
                return (hat[joystickID][hatNumber] & hatDirection ? true : false);
        }
 
@@ -153,6 +150,7 @@ void Gamepad::Update(void)
 #if 0
 // Need to test this. It may be that the only time joysticks are detected is
 // when the program is first run. That would suck.
+// Well, it turns out that SDL doesn't do hot plugging. :-(
 void Gamepad::CheckConsistency(void)
 {
        int currentNumJoysticks = SDL_NumJoysticks();
index 9a739870df9083a596593f11d30c84204fd3db4f..04ae3baee1048a78618541cff3b0c7e260bb88e1 100644 (file)
@@ -48,6 +48,7 @@
 #include "debug/m68kdasmbrowser.h"
 #include "debug/memorybrowser.h"
 #include "debug/opbrowser.h"
+#include "debug/riscdasmbrowser.h"
 
 #include "dac.h"
 #include "jaguar.h"
@@ -105,9 +106,10 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
        cpuBrowseWin = new CPUBrowserWindow(this);
        opBrowseWin = new OPBrowserWindow(this);
        m68kDasmBrowseWin = new M68KDasmBrowserWindow(this);
+       riscDasmBrowseWin = new RISCDasmBrowserWindow(this);
 
-    videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+       videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+       setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
 
        setUnifiedTitleAndToolBarOnMac(true);
 
@@ -231,6 +233,11 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
 //     memBrowseAct->setCheckable(true);
        connect(m68kDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowM68KDasmBrowserWin()));
 
+       riscDasmBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("RISC Listing Browser"), this);
+       riscDasmBrowseAct->setStatusTip(tr("Shows the RISC disassembly browser window"));
+//     memBrowseAct->setCheckable(true);
+       connect(riscDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowRISCDasmBrowserWin()));
+
        // Misc. connections...
        connect(filePickWin, SIGNAL(RequestLoad(QString)), this, SLOT(LoadSoftware(QString)));
        connect(filePickWin, SIGNAL(FilePickerHiding()), this, SLOT(Unpause()));
@@ -253,6 +260,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                debugMenu->addAction(cpuBrowseAct);
                debugMenu->addAction(opBrowseAct);
                debugMenu->addAction(m68kDasmBrowseAct);
+               debugMenu->addAction(riscDasmBrowseAct);
        }
 
        helpMenu = menuBar()->addMenu(tr("&Help"));
@@ -282,6 +290,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false),
                debugbar->addAction(cpuBrowseAct);
                debugbar->addAction(opBrowseAct);
                debugbar->addAction(m68kDasmBrowseAct);
+               debugbar->addAction(riscDasmBrowseAct);
        }
 
        //      Create status bar
@@ -913,6 +922,13 @@ void MainWin::ShowM68KDasmBrowserWin(void)
 }
 
 
+void MainWin::ShowRISCDasmBrowserWin(void)
+{
+       riscDasmBrowseWin->show();
+       riscDasmBrowseWin->RefreshContents();
+}
+
+
 void MainWin::ResizeMainWindow(void)
 {
 //     videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256));
index f7276b87e7fa000a41a1d831a09363493eb7f862..80cfe935183d1b8f48d93e43bdae9b61cf96d77a 100644 (file)
@@ -20,6 +20,7 @@ class MemoryBrowserWindow;
 class CPUBrowserWindow;
 class OPBrowserWindow;
 class M68KDasmBrowserWindow;
+class RISCDasmBrowserWindow;
 
 class MainWin: public QMainWindow
 {
@@ -62,6 +63,7 @@ class MainWin: public QMainWindow
                void ShowCPUBrowserWin(void);
                void ShowOPBrowserWin(void);
                void ShowM68KDasmBrowserWin(void);
+               void ShowRISCDasmBrowserWin(void);
 
        private:
                void HandleKeys(QKeyEvent *, bool);
@@ -81,6 +83,7 @@ class MainWin: public QMainWindow
                CPUBrowserWindow * cpuBrowseWin;
                OPBrowserWindow * opBrowseWin;
                M68KDasmBrowserWindow * m68kDasmBrowseWin;
+               RISCDasmBrowserWindow * riscDasmBrowseWin;
                QTimer * timer;
                bool running;
                int zoomLevel;
@@ -129,6 +132,7 @@ class MainWin: public QMainWindow
                QAction * cpuBrowseAct;
                QAction * opBrowseAct;
                QAction * m68kDasmBrowseAct;
+               QAction * riscDasmBrowseAct;
 
                QIcon powerGreen;
                QIcon powerRed;
index 31a67ef7d8852489a598b19a00c5a65de527a61e..e2730495534e289c483e32f9d1a34a436bf5febf 100644 (file)
@@ -11,6 +11,8 @@
 // Who  When        What
 // ---  ----------  -------------------------------------------------------------
 // JLH  06/01/2012  Created this log (long overdue! ;-)
+// JLH  01/23/2013  Beautifying of disassembly, including hex digits of opcodes
+//                  and operands
 //
 
 #include "jagdasm.h"
@@ -61,7 +63,7 @@ const char * condition[32] =
        "???,",
        "never,"
 };
-       
+
 
 
 char * signed_16bit(int16 val)
@@ -76,6 +78,7 @@ char * signed_16bit(int16 val)
        return temp;
 }
 
+
 unsigned dasmjag(int dsp_type, char * bufferOut, unsigned pc)
 {
        char buffer[64];
@@ -83,41 +86,41 @@ unsigned dasmjag(int dsp_type, char * bufferOut, unsigned pc)
        int reg1 = (op >> 5) & 31;
        int reg2 = op & 31;
        int size = 2;
-       
        pc += 2;
+
        switch (op >> 10)
        {
-               case 0:         sprintf(buffer, "ADD     R%02d,R%02d", reg1, reg2);                                     break;
-               case 1:         sprintf(buffer, "ADDC    R%02d,R%02d", reg1, reg2);                                     break;
+               case 0:         sprintf(buffer, "ADD     R%02d,R%02d", reg1, reg2);                             break;
+               case 1:         sprintf(buffer, "ADDC    R%02d,R%02d", reg1, reg2);                             break;
                case 2:         sprintf(buffer, "ADDQ    $%X,R%02d", convert_zero[reg1], reg2); break;
                case 3:         sprintf(buffer, "ADDQT   $%X,R%02d", convert_zero[reg1], reg2); break;
-               case 4:         sprintf(buffer, "SUB     R%02d,R%02d", reg1, reg2);                                     break;
-               case 5:         sprintf(buffer, "SUBC    R%02d,R%02d", reg1, reg2);                                     break;
+               case 4:         sprintf(buffer, "SUB     R%02d,R%02d", reg1, reg2);                             break;
+               case 5:         sprintf(buffer, "SUBC    R%02d,R%02d", reg1, reg2);                             break;
                case 6:         sprintf(buffer, "SUBQ    $%X,R%02d", convert_zero[reg1], reg2); break;
                case 7:         sprintf(buffer, "SUBQT   $%X,R%02d", convert_zero[reg1], reg2); break;
                case 8:         sprintf(buffer, "NEG     R%02d", reg2);                                                 break;
-               case 9:         sprintf(buffer, "AND     R%02d,R%02d", reg1, reg2);                                     break;
-               case 10:        sprintf(buffer, "OR      R%02d,R%02d", reg1, reg2);                                     break;
-               case 11:        sprintf(buffer, "XOR     R%02d,R%02d", reg1, reg2);                                     break;
+               case 9:         sprintf(buffer, "AND     R%02d,R%02d", reg1, reg2);                             break;
+               case 10:        sprintf(buffer, "OR      R%02d,R%02d", reg1, reg2);                             break;
+               case 11:        sprintf(buffer, "XOR     R%02d,R%02d", reg1, reg2);                             break;
                case 12:        sprintf(buffer, "NOT     R%02d", reg2);                                                 break;
-               case 13:        sprintf(buffer, "BTST    $%X,R%02d", reg1, reg2);                                       break;
-               case 14:        sprintf(buffer, "BSET    $%X,R%02d", reg1, reg2);                                       break;
-               case 15:        sprintf(buffer, "BCLR    $%X,R%02d", reg1, reg2);                                       break;
-               case 16:        sprintf(buffer, "MULT    R%02d,R%02d", reg1, reg2);                                     break;
-               case 17:        sprintf(buffer, "IMULT   R%02d,R%02d", reg1, reg2);                                     break;
-               case 18:        sprintf(buffer, "IMULTN  R%02d,R%02d", reg1, reg2);                                     break;
+               case 13:        sprintf(buffer, "BTST    $%X,R%02d", reg1, reg2);                               break;
+               case 14:        sprintf(buffer, "BSET    $%X,R%02d", reg1, reg2);                               break;
+               case 15:        sprintf(buffer, "BCLR    $%X,R%02d", reg1, reg2);                               break;
+               case 16:        sprintf(buffer, "MULT    R%02d,R%02d", reg1, reg2);                             break;
+               case 17:        sprintf(buffer, "IMULT   R%02d,R%02d", reg1, reg2);                             break;
+               case 18:        sprintf(buffer, "IMULTN  R%02d,R%02d", reg1, reg2);                             break;
                case 19:        sprintf(buffer, "RESMAC  R%02d", reg2);                                                 break;
-               case 20:        sprintf(buffer, "IMACN   R%02d,R%02d", reg1, reg2);                                     break;
-               case 21:        sprintf(buffer, "DIV     R%02d,R%02d", reg1, reg2);                                     break;
+               case 20:        sprintf(buffer, "IMACN   R%02d,R%02d", reg1, reg2);                             break;
+               case 21:        sprintf(buffer, "DIV     R%02d,R%02d", reg1, reg2);                             break;
                case 22:        sprintf(buffer, "ABS     R%02d", reg2);                                                 break;
-               case 23:        sprintf(buffer, "SH      R%02d,R%02d", reg1, reg2);                                     break;
+               case 23:        sprintf(buffer, "SH      R%02d,R%02d", reg1, reg2);                             break;
                case 24:        sprintf(buffer, "SHLQ    $%X,R%02d", 32 - convert_zero[reg1], reg2);    break;
                case 25:        sprintf(buffer, "SHRQ    $%X,R%02d", convert_zero[reg1], reg2); break;
-               case 26:        sprintf(buffer, "SHA     R%02d,R%02d", reg1, reg2);                                     break;
+               case 26:        sprintf(buffer, "SHA     R%02d,R%02d", reg1, reg2);                             break;
                case 27:        sprintf(buffer, "SHARQ   $%X,R%02d", convert_zero[reg1], reg2); break;
-               case 28:        sprintf(buffer, "ROR     R%02d,R%02d", reg1, reg2);                                     break;
+               case 28:        sprintf(buffer, "ROR     R%02d,R%02d", reg1, reg2);                             break;
                case 29:        sprintf(buffer, "RORQ    $%X,R%02d", convert_zero[reg1], reg2); break;
-               case 30:        sprintf(buffer, "CMP     R%02d,R%02d", reg1, reg2);                                     break;
+               case 30:        sprintf(buffer, "CMP     R%02d,R%02d", reg1, reg2);                             break;
                case 31:        sprintf(buffer, "CMPQ    %s,R%02d", signed_16bit((int16)(reg1 << 11) >> 11), reg2);break;
                case 32:        if (dsp_type == JAGUAR_GPU)
                                                sprintf(buffer, "SAT8    R%02d", reg2);
@@ -129,14 +132,14 @@ unsigned dasmjag(int dsp_type, char * bufferOut, unsigned pc)
                                        else
                                                sprintf(buffer, "SAT16S  R%02d", reg2);
                                        break;
-               case 34:        sprintf(buffer, "MOVE    R%02d,R%02d", reg1, reg2);                                     break;
-               case 35:        sprintf(buffer, "MOVEQ   %d,R%02d", reg1, reg2);                                        break;
-               case 36:        sprintf(buffer, "MOVETA  R%02d,R%02d", reg1, reg2);                                     break;
-               case 37:        sprintf(buffer, "MOVEFA  R%02d,R%02d", reg1, reg2);                                     break;
-               case 38:        sprintf(buffer, "MOVEI   $%08X,R%02d", ROPCODE(pc) | (ROPCODE(pc+2)<<16), reg2); size = 6; break;
-               case 39:        sprintf(buffer, "LOADB   (R%02d),R%02d", reg1, reg2);                                   break;
-               case 40:        sprintf(buffer, "LOADW   (R%02d),R%02d", reg1, reg2);                                   break;
-               case 41:        sprintf(buffer, "LOAD    (R%02d),R%02d", reg1, reg2);                                   break;
+               case 34:        sprintf(buffer, "MOVE    R%02d,R%02d", reg1, reg2);                             break;
+               case 35:        sprintf(buffer, "MOVEQ   %d,R%02d", reg1, reg2);                                break;
+               case 36:        sprintf(buffer, "MOVETA  R%02d,R%02d", reg1, reg2);                             break;
+               case 37:        sprintf(buffer, "MOVEFA  R%02d,R%02d", reg1, reg2);                             break;
+               case 38:        sprintf(buffer, "MOVEI   #$%X,R%02d", ROPCODE(pc) | (ROPCODE(pc+2)<<16), reg2); size = 6; break;
+               case 39:        sprintf(buffer, "LOADB   (R%02d),R%02d", reg1, reg2);                   break;
+               case 40:        sprintf(buffer, "LOADW   (R%02d),R%02d", reg1, reg2);                   break;
+               case 41:        sprintf(buffer, "LOAD    (R%02d),R%02d", reg1, reg2);                   break;
                case 42:        if (dsp_type == JAGUAR_GPU)
                                                sprintf(buffer, "LOADP   (R%02d),R%02d", reg1, reg2);
                                        else
@@ -144,9 +147,9 @@ unsigned dasmjag(int dsp_type, char * bufferOut, unsigned pc)
                                        break;
                case 43:        sprintf(buffer, "LOAD    (R14+$%X),R%02d", convert_zero[reg1]*4, reg2);break;
                case 44:        sprintf(buffer, "LOAD    (R15+$%X),R%02d", convert_zero[reg1]*4, reg2);break;
-               case 45:        sprintf(buffer, "STOREB  R%02d,(R%02d)", reg2, reg1);                           break;
-               case 46:        sprintf(buffer, "STOREW  R%02d,(R%02d)", reg2, reg1);                           break;
-               case 47:        sprintf(buffer, "STORE   R%02d,(R%02d)", reg2, reg1);                                   break;
+               case 45:        sprintf(buffer, "STOREB  R%02d,(R%02d)", reg2, reg1);                   break;
+               case 46:        sprintf(buffer, "STOREW  R%02d,(R%02d)", reg2, reg1);                   break;
+               case 47:        sprintf(buffer, "STORE   R%02d,(R%02d)", reg2, reg1);                   break;
                case 48:        if (dsp_type == JAGUAR_GPU)
                                                sprintf(buffer, "STOREP  R%02d,(R%02d)", reg2, reg1);
                                        else
@@ -154,17 +157,17 @@ unsigned dasmjag(int dsp_type, char * bufferOut, unsigned pc)
                                        break;
                case 49:        sprintf(buffer, "STORE   R%02d,(R14+$%X)", reg2, convert_zero[reg1]*4);break;
                case 50:        sprintf(buffer, "STORE   R%02d,(R15+$%X)", reg2, convert_zero[reg1]*4);break;
-               case 51:        sprintf(buffer, "MOVE    PC,R%02d", reg2);                                                      break;
-               case 52:        sprintf(buffer, "JUMP    %s(R%02d)", condition[reg2], reg1);                    break;
-               case 53:        sprintf(buffer, "JR      %s%08X", condition[reg2], pc + ((int8)(reg1 << 3) >> 2)); break;
-               case 54:        sprintf(buffer, "MMULT   R%02d,R%02d", reg1, reg2);                                     break;
-               case 55:        sprintf(buffer, "MTOI    R%02d,R%02d", reg1, reg2);                                     break;
-               case 56:        sprintf(buffer, "NORMI   R%02d,R%02d", reg1, reg2);                                     break;
+               case 51:        sprintf(buffer, "MOVE    PC,R%02d", reg2);                                              break;
+               case 52:        sprintf(buffer, "JUMP    %s(R%02d)", condition[reg2], reg1);    break;
+               case 53:        sprintf(buffer, "JR      %s$%X", condition[reg2], pc + ((int8)(reg1 << 3) >> 2)); break;
+               case 54:        sprintf(buffer, "MMULT   R%02d,R%02d", reg1, reg2);                             break;
+               case 55:        sprintf(buffer, "MTOI    R%02d,R%02d", reg1, reg2);                             break;
+               case 56:        sprintf(buffer, "NORMI   R%02d,R%02d", reg1, reg2);                             break;
                case 57:        sprintf(buffer, "NOP");                                                                                 break;
-               case 58:        sprintf(buffer, "LOAD    (R14+R%02d),R%02d", reg1, reg2);                               break;
-               case 59:        sprintf(buffer, "LOAD    (R15+R%02d),R%02d", reg1, reg2);                               break;
-               case 60:        sprintf(buffer, "STORE   R%02d,(R14+R%02d)", reg2, reg1);                               break;
-               case 61:        sprintf(buffer, "STORE   R%02d,(R15+R%02d)", reg2, reg1);                               break;
+               case 58:        sprintf(buffer, "LOAD    (R14+R%02d),R%02d", reg1, reg2);               break;
+               case 59:        sprintf(buffer, "LOAD    (R15+R%02d),R%02d", reg1, reg2);               break;
+               case 60:        sprintf(buffer, "STORE   R%02d,(R14+R%02d)", reg2, reg1);               break;
+               case 61:        sprintf(buffer, "STORE   R%02d,(R15+R%02d)", reg2, reg1);               break;
                case 62:        if (dsp_type == JAGUAR_GPU)
                                                sprintf(buffer, "SAT24   R%02d", reg2);
                                        else
@@ -176,7 +179,18 @@ unsigned dasmjag(int dsp_type, char * bufferOut, unsigned pc)
                                                sprintf(buffer, "ADDQMOD $%X,R%02d", convert_zero[reg1], reg2);
                                        break;
        }
+
+#if 0
        sprintf(bufferOut,"%-24s (%04X)", buffer, op);
+#else
+       if (size == 2)
+               sprintf(bufferOut, "%04X            %-24s", op, buffer);
+       else
+       {
+               uint16 word1 = ROPCODE(pc), word2 = ROPCODE(pc + 2);
+               sprintf(bufferOut, "%04X %04X %04X  %-24s", op, word1, word2, buffer);
+       }
+#endif
 
        return size;
 }
index 49da93e377c45e6767b87bc3e78d03a916993e0a..9569252d7441e0f5f8594fb1ffa3c31136e5089e 100644 (file)
@@ -1268,7 +1268,7 @@ uint16 TOMReadWord(uint32 offset, uint32 who/*=UNKNOWN*/)
        WriteLog("TOM: Reading word at %06X for %s\n", offset, whoName[who]);
 #endif
 if (offset >= 0xF02000 && offset <= 0xF020FF)
-       WriteLog("TOM: Read attempted from GPU register file by %s (unimplemented)!\n", whoName[who]);
+       WriteLog("TOM: ReadWord attempted from GPU register file by %s (unimplemented)!\n", whoName[who]);
 
        if (offset == 0xF000E0)
        {
@@ -1429,7 +1429,7 @@ void TOMWriteWord(uint32 offset, uint16 data, uint32 who/*=UNKNOWN*/)
 //if (offset == 0xF00000 + MEMCON2)
 //     WriteLog("TOM: Memory Configuration 2 written by %s: %04X\n", whoName[who], data);
 if (offset >= 0xF02000 && offset <= 0xF020FF)
-       WriteLog("TOM: Write attempted to GPU register file by %s (unimplemented)!\n", whoName[who]);
+       WriteLog("TOM: WriteWord attempted to GPU register file by %s (unimplemented)!\n", whoName[who]);
 
        if ((offset >= GPU_CONTROL_RAM_BASE) && (offset < GPU_CONTROL_RAM_BASE+0x20))
        {
index 9a66477109fa6f1805e908eab265ba323f074e16..d31d2fbc8e666cc18c6c070ffd6c1408da562ca0 100644 (file)
@@ -78,6 +78,7 @@ HEADERS = \
        src/gui/debug/m68kdasmbrowser.h \
        src/gui/debug/memorybrowser.h \
        src/gui/debug/opbrowser.h \
+       src/gui/debug/riscdasmbrowser.h \
 #      src/gui/sdljoystick.h
 
 SOURCES = \
@@ -101,4 +102,5 @@ SOURCES = \
        src/gui/debug/m68kdasmbrowser.cpp \
        src/gui/debug/memorybrowser.cpp \
        src/gui/debug/opbrowser.cpp \
+       src/gui/debug/riscdasmbrowser.cpp \
 #      src/gui/sdljoystick.cpp