From: Shamus Hammons Date: Wed, 23 Jan 2013 06:59:03 +0000 (-0600) Subject: Added RISC disassembly browser. X-Git-Tag: 2.1.0~6 X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?p=virtualjaguar;a=commitdiff_plain;h=9af4fb023287b26dce01a36c65c9e30f56481051 Added RISC disassembly browser. --- diff --git a/src/filedb.cpp b/src/filedb.cpp index 199b8d4..8e38803 100644 --- a/src/filedb.cpp +++ b/src/filedb.cpp @@ -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 }, diff --git a/src/gpu.cpp b/src/gpu.cpp index c57b948..02fa112 100644 --- a/src/gpu.cpp +++ b/src/gpu.cpp @@ -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)) diff --git a/src/gui/debug/m68kdasmbrowser.cpp b/src/gui/debug/m68kdasmbrowser.cpp index 5c52cf0..25829e1 100644 --- a/src/gui/debug/m68kdasmbrowser.cpp +++ b/src/gui/debug/m68kdasmbrowser.cpp @@ -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); diff --git a/src/gui/debug/memorybrowser.cpp b/src/gui/debug/memorybrowser.cpp index b67ff32..7acc132 100644 --- a/src/gui/debug/memorybrowser.cpp +++ b/src/gui/debug/memorybrowser.cpp @@ -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); diff --git a/src/gui/debug/opbrowser.cpp b/src/gui/debug/opbrowser.cpp index 52f40ef..f129bec 100644 --- a/src/gui/debug/opbrowser.cpp +++ b/src/gui/debug/opbrowser.cpp @@ -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 index 0000000..194bb11 --- /dev/null +++ b/src/gui/debug/riscdasmbrowser.cpp @@ -0,0 +1,148 @@ +// +// riscdasmbrowser.cpp - Jaguar RISC disassembly browser +// +// by James Hammons +// (C) 2013 Underground Software +// +// JLH = James Hammons +// +// 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
", oldpc, buffer); + + buffer[0] = 0; // Clear string + char singleCharString[2] = { 0, 0 }; + + for(uint j=0; jclear(); + 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 index 0000000..39ae057 --- /dev/null +++ b/src/gui/debug/riscdasmbrowser.h @@ -0,0 +1,43 @@ +// +// riscdasmbrowser.h: Jaguar RISC disassembly browser +// +// by James Hammons +// (C) 2013 Underground Software +// + +#ifndef __RISCDASMBROWSER_H__ +#define __RISCDASMBROWSER_H__ + +#include +#include + +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__ diff --git a/src/gui/gamepad.cpp b/src/gui/gamepad.cpp index 6ca2329..1ef1a4e 100644 --- a/src/gui/gamepad.cpp +++ b/src/gui/gamepad.cpp @@ -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(); diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index 9a73987..04ae3ba 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -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)); diff --git a/src/gui/mainwin.h b/src/gui/mainwin.h index f7276b8..80cfe93 100644 --- a/src/gui/mainwin.h +++ b/src/gui/mainwin.h @@ -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; diff --git a/src/jagdasm.cpp b/src/jagdasm.cpp index 31a67ef..e273049 100644 --- a/src/jagdasm.cpp +++ b/src/jagdasm.cpp @@ -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; } diff --git a/src/tom.cpp b/src/tom.cpp index 49da93e..9569252 100644 --- a/src/tom.cpp +++ b/src/tom.cpp @@ -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)) { diff --git a/virtualjaguar.pro b/virtualjaguar.pro index 9a66477..d31d2fb 100644 --- a/virtualjaguar.pro +++ b/virtualjaguar.pro @@ -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