Add debug dialogs (DisAsm, Memory, VFPU).

New features : Breakpoint display, thread status, display list status
Update translation and start french translation
This commit is contained in:
Xele02 2013-02-10 16:36:06 +01:00
parent 2e0beb5833
commit 69b837f18b
46 changed files with 4999 additions and 618 deletions

View file

@ -99,7 +99,15 @@ reswitch:
// We should never get here on Android.
case CORE_STEPPING:
//1: wait for step command..
#if defined(USING_QT_UI) || defined(_DEBUG)
host->SendCoreWait(true);
#endif
m_hStepEvent.wait(m_hStepMutex);
#if defined(USING_QT_UI) || defined(_DEBUG)
host->SendCoreWait(false);
#endif
if (coreState == CORE_POWERDOWN)
return;
if (coreState != CORE_STEPPING)
@ -112,7 +120,7 @@ reswitch:
currentCPU = &mipsr4k;
Core_SingleStep();
//4: update disasm dialog
#ifdef _DEBUG
#if defined(USING_QT_UI) || defined(_DEBUG)
host->UpdateDisassembly();
host->UpdateMemView();
#endif

View file

@ -143,3 +143,13 @@ void CBreakPoints::InvalidateJit()
if (MIPSComp::jit && coreState == CORE_STEPPING)
MIPSComp::jit->ClearCache();
}
int CBreakPoints::GetNumBreakpoints()
{
return m_iBreakPoints.size();
}
int CBreakPoints::GetBreakpointAddress(int i)
{
return m_iBreakPoints[i].iAddress;
}

View file

@ -83,6 +83,9 @@ public:
static void InvalidateJit(u32 _iAddress);
static void InvalidateJit();
static int GetNumBreakpoints();
static int GetBreakpointAddress(int i);
};

View file

@ -334,6 +334,11 @@ int SymbolMap::GetNumSymbols()
{
return (int)entries.size();
}
SymbolType SymbolMap::GetSymbolType(int i)
{
return entries[i].type;
}
char *SymbolMap::GetSymbolName(int i)
{
return entries[i].name;

View file

@ -52,6 +52,7 @@ public:
void SetSymbolName(int i, const char *newname);
u32 GetSymbolSize(int i);
u32 GetSymbolAddr(int i);
SymbolType GetSymbolType(int i);
int FindSymbol(const char *name);
u32 GetAddress(int num);
void IncreaseRunCount(int num);
@ -61,7 +62,6 @@ public:
void UseFuncSignaturesFile(const char *filename, u32 maxAddress);
void CompileFuncSignaturesFile(const char *filename);
private:
struct MapEntry
{

View file

@ -2722,3 +2722,38 @@ u32 __KernelNotifyCallbackType(RegisteredCallbackType type, SceUID cbId, int not
return 0;
}
std::vector<DebugThreadInfo> GetThreadsInfo()
{
std::vector<DebugThreadInfo> threadList;
u32 error;
for (std::vector<SceUID>::iterator iter = threadqueue.begin(); iter != threadqueue.end(); iter++)
{
Thread *t = kernelObjects.Get<Thread>(*iter, error);
if (!t)
continue;
DebugThreadInfo info;
info.id = *iter;
strncpy(info.name,t->GetName(),KERNELOBJECT_MAX_NAME_LENGTH);
info.name[KERNELOBJECT_MAX_NAME_LENGTH+1] = 0;
info.status = t->nt.status;
info.entrypoint = t->nt.entrypoint;
info.curPC = t->context.pc;
info.isCurrent = (*iter == currentThread);
threadList.push_back(info);
}
return threadList;
}
void __KernelChangeThreadState(SceUID threadId, ThreadStatus newStatus)
{
u32 error;
Thread *t = kernelObjects.Get<Thread>(threadId, error);
if (!t)
return;
__KernelChangeThreadState(t, newStatus);
}

View file

@ -257,3 +257,16 @@ void __KernelChangeThreadState(Thread *thread, ThreadStatus newStatus);
typedef void (*ThreadCallback)(SceUID threadID);
void __KernelListenThreadEnd(ThreadCallback callback);
struct DebugThreadInfo
{
SceUID id;
char name[KERNELOBJECT_MAX_NAME_LENGTH+1];
u32 status;
int curPC;
int entrypoint;
bool isCurrent;
};
std::vector<DebugThreadInfo> GetThreadsInfo();
void __KernelChangeThreadState(SceUID threadId, ThreadStatus newStatus);

View file

@ -61,6 +61,13 @@ public:
virtual bool AttemptLoadSymbolMap() {return false;}
virtual void SetWindowTitle(const char *message) {}
virtual void SendCoreWait(bool) {}
virtual bool GpuStep() { return false; }
virtual void SendGPUWait() {}
virtual void SetGPUStep(bool value) {}
virtual void NextGPUStep() {}
// Used for headless.
virtual void SendDebugOutput(const std::string &output) {}
virtual void SendDebugScreenshot(const u8 *pixbuf, u32 w, u32 h) {}

View file

@ -80,6 +80,10 @@ enum
// George Marsaglia-style random number generator.
class GMRng {
public:
GMRng() {
m_w = 0x23E866ED;
m_z = 0x80FD5AF2;
}
void Init(int seed) {
m_w = seed ^ (seed << 16);
if (!m_w) m_w = 1337;
@ -91,6 +95,9 @@ public:
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w;
}
float F() {
return (float)R32() / (float)(0xFFFFFFFF);
}
void DoState(PointerWrap &p);

View file

@ -4,7 +4,9 @@
#include "GPUCommon.h"
#include "GPUState.h"
#include "ChunkFile.h"
#if defined(USING_QT_UI)
#include "Core/Host.h"
#endif
static int dlIdGenerator = 1;
@ -28,6 +30,9 @@ u32 GPUCommon::EnqueueList(u32 listpc, u32 stall, int subIntrBase, bool head)
{
DisplayList dl;
dl.id = dlIdGenerator++;
#if defined(USING_QT_UI)
dl.startpc = listpc & 0xFFFFFFF;
#endif
dl.pc = listpc & 0xFFFFFFF;
dl.stall = stall & 0xFFFFFFF;
dl.status = PSP_GE_LIST_QUEUED;
@ -82,6 +87,12 @@ bool GPUCommon::InterpretList(DisplayList &list)
list.status = PSP_GE_LIST_STALL_REACHED;
return false;
}
#if defined(USING_QT_UI)
if(host->GpuStep())
{
host->SendGPUWait();
}
#endif
op = Memory::ReadUnchecked_U32(list.pc); //read from memory
u32 cmd = op >> 24;
u32 diff = op ^ gstate.cmdmem[cmd];

View file

@ -53,4 +53,13 @@ public:
}
return NULL;
}
const std::deque<DisplayList>& GetDisplayLists()
{
return dlQueue;
}
DisplayList* GetCurrentDisplayList()
{
return currentList;
}
};

View file

@ -35,6 +35,9 @@ enum DisplayListStatus
struct DisplayList
{
int id;
#if defined(USING_QT_UI)
u32 startpc;
#endif
u32 pc;
u32 stall;
DisplayListStatus status;
@ -91,4 +94,6 @@ public:
// Debugging
virtual void DumpNextFrame() = 0;
virtual const std::deque<DisplayList>& GetDisplayLists() = 0;
virtual DisplayList* GetCurrentDisplayList() = 0;
};

View file

@ -396,7 +396,11 @@ void GeDisassembleOp(u32 pc, u32 op, u32 prev, char *buffer) {
case GE_CMD_TEXSIZE5:
case GE_CMD_TEXSIZE6:
case GE_CMD_TEXSIZE7:
sprintf(buffer, "Texture Size %i: %06x", cmd - GE_CMD_TEXSIZE0, data);
{
int w = 1 << (data & 0xf);
int h = 1 << ((data>>8) & 0xf);
sprintf(buffer, "Texture Size %i: %06x, width : %d, height : %d", cmd - GE_CMD_TEXSIZE0, data, w, h);
}
break;
case GE_CMD_ZBUFPTR:

View file

@ -18,9 +18,10 @@
#include "gfx_es2/gl_state.h"
#include "GPU/GPUState.h"
#include "android/jni/ui_atlas.h"
#include "native/util/random/rng.h"
#include "native/base/timeutil.h"
#include "native/base/colorutil.h"
#include "GPU/GPUState.h"
#include "GPU/GPUInterface.h"
#include "qtemugl.h"
#include "QtHost.h"
@ -114,6 +115,26 @@ void EmuThread_LockDraw(bool value)
}
}
QString GetCurrentFilename()
{
return fileToStart;
}
EmuThread::EmuThread()
: running(false)
, gameRunning(false)
, needInitGame(false)
, frames_(0)
, gameMutex( new QMutex(QMutex::Recursive))
, mutexLockNum(0)
{
}
EmuThread::~EmuThread()
{
delete gameMutex;
}
void EmuThread::init(InputState *inputState)
{
@ -143,13 +164,14 @@ void EmuThread::run()
//UpdateGamepad(*input_state);
timer.start();
gameMutex.lock();
gameMutex->lock();
bool gRun = gameRunning;
gameMutex.unlock();
gameMutex->unlock();
if(gRun)
{
gameMutex.lock();
gameMutex->lock();
glWindow->makeCurrent();
if(needInitGame)
@ -227,14 +249,14 @@ void EmuThread::run()
qint64 time = timer.elapsed();
const int frameTime = (1.0f/60.0f) * 1000;
gameMutex.unlock();
gameMutex->unlock();
if(time < frameTime)
{
glWindow->doneCurrent();
msleep(frameTime-time);
glWindow->makeCurrent();
}
gameMutex.lock();
gameMutex->lock();
timer.start();
}
@ -265,11 +287,11 @@ void EmuThread::run()
#endif
glWindow->swapBuffers();
glWindow->doneCurrent();
gameMutex.unlock();
gameMutex->unlock();
}
else
{
gameMutex.lock();
gameMutex->lock();
glWindow->makeCurrent();
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
@ -311,7 +333,7 @@ void EmuThread::run()
glWindow->swapBuffers();
glWindow->doneCurrent();
gameMutex.unlock();
gameMutex->unlock();
qint64 time = timer.elapsed();
const int frameTime = (1.0f/60.0f) * 1000;
if(time < frameTime)
@ -358,18 +380,18 @@ void EmuThread::setRunning(bool value)
void EmuThread::startGame(QString filename)
{
gameMutex.lock();
gameMutex->lock();
needInitGame = true;
gameRunning = true;
fileToStart = filename;
gameMutex.unlock();
gameMutex->unlock();
}
void EmuThread::stopGame()
{
Core_Stop();
gameMutex.lock();
gameMutex->lock();
gameRunning = false;
PSP_Shutdown();
@ -380,7 +402,25 @@ void EmuThread::stopGame()
g_State.bEmuThreadStarted = false;
frames_ = 0;
gameMutex.unlock();
gameMutex->unlock();
}
void EmuThread::LockGL(bool lock)
{
if(lock)
{
gameMutex->lock();
if(mutexLockNum == 0)
glWindow->makeCurrent();
mutexLockNum++;
}
else
{
mutexLockNum--;
if(mutexLockNum == 0)
glWindow->doneCurrent();
gameMutex->unlock();
}
}

View file

@ -8,14 +8,15 @@ class QtEmuGL;
class EmuThread : public QThread
{
public:
EmuThread() : running(false), gameRunning(false), needInitGame(false), frames_(0) {}
EmuThread();
~EmuThread();
void init(InputState* inputState);
void run();
void FinalShutdown();
void setRunning(bool value);
void startGame(QString filename);
void stopGame();
QMutex gameMutex;
void LockGL(bool value);
public slots:
void Shutdown();
private:
@ -24,6 +25,8 @@ private:
bool gameRunning;
bool needInitGame;
int frames_;
QMutex *gameMutex;
int mutexLockNum;
};
@ -32,3 +35,4 @@ void EmuThread_Stop();
void EmuThread_StartGame(QString filename);
void EmuThread_StopGame();
void EmuThread_LockDraw(bool value);
QString GetCurrentFilename();

View file

@ -22,7 +22,8 @@ desktop_ui {
}
TRANSLATIONS = languages/ppsspp_en.ts \
languages/ppsspp_pl.ts
languages/ppsspp_pl.ts \
languages/ppsspp_fr.ts
# Main
SOURCES += ../native/base/QtMain.cpp

View file

@ -12,6 +12,7 @@
#include "android/jni/EmuScreen.h"
#include "android/jni/UIShader.h"
#include "android/jni/ui_atlas.h"
#include "EmuThread.h"
std::string boot_filename = "";
Texture *uiTexture;
@ -20,20 +21,22 @@ ScreenManager *screenManager;
std::string config_filename;
std::string game_title;
event m_hGPUStepEvent;
recursive_mutex m_hGPUStepMutex;
QtHost::QtHost(MainWindow *mainWindow_)
: mainWindow(mainWindow_)
, m_GPUStep(false)
{
QObject::connect(this,SIGNAL(BootDoneSignal()),mainWindow,SLOT(Boot()));
}
void QtHost::InitGL()
{
}
void QtHost::ShutdownGL()
{
//GL_Shutdown();
}
void QtHost::SetWindowTitle(const char *message)
@ -45,30 +48,28 @@ void QtHost::SetWindowTitle(const char *message)
void QtHost::UpdateUI()
{
//mainWindow->Update();
mainWindow->Update();
mainWindow->UpdateMenus();
}
void QtHost::UpdateMemView()
{
/*for (int i=0; i<numCPUs; i++)
if (memoryWindow[i])
memoryWindow[i]->Update();*/
if(mainWindow->GetDialogMemory())
mainWindow->GetDialogMemory()->Update();
}
void QtHost::UpdateDisassembly()
{
/*for (int i=0; i<numCPUs; i++)
if (disasmWindow[i])
disasmWindow[i]->Update();*/
/*if(dialogDisasm)
dialogDisasm->Update();*/
if(mainWindow->GetDialogDisasm())
{
mainWindow->GetDialogDisasm()->GotoPC();
mainWindow->GetDialogDisasm()->Update();
}
}
void QtHost::SetDebugMode(bool mode)
{
/*for (int i=0; i<numCPUs; i++)*/
if(mainWindow->GetDialogDisasm())
mainWindow->GetDialogDisasm()->SetDebugMode(mode);
}
@ -76,14 +77,9 @@ void QtHost::SetDebugMode(bool mode)
void QtHost::BeginFrame()
{
/*for (auto iter = this->input.begin(); iter != this->input.end(); iter++)
if ((*iter)->UpdateState() == 0)
break; // *iter is std::shared_ptr, **iter is InputDevice
GL_BeginFrame();*/
}
void QtHost::EndFrame()
{
//GL_EndFrame();
}
void QtHost::InitSound(PMixer *mixer)
@ -102,18 +98,26 @@ void QtHost::BootDone()
emit BootDoneSignal();
}
static QString SymbolMapFilename(QString currentFilename)
{
std::string result = currentFilename.toStdString();
size_t dot = result.rfind('.');
if (dot == result.npos)
return (result + ".map").c_str();
result.replace(dot, result.npos, ".map");
return result.c_str();
}
bool QtHost::AttemptLoadSymbolMap()
{
QFileInfo currentFile(fileToStart);
QString ret = currentFile.baseName() + ".map";
return symbolMap.LoadSymbolMap(ret.toAscii().constData());
return symbolMap.LoadSymbolMap(SymbolMapFilename(GetCurrentFilename()).toStdString().c_str());
}
void QtHost::PrepareShutdown()
{
QFileInfo currentFile(fileToStart);
QString ret = currentFile.baseName() + ".map";
symbolMap.SaveSymbolMap(ret.toAscii().constData());
symbolMap.SaveSymbolMap(SymbolMapFilename(GetCurrentFilename()).toStdString().c_str());
}
void QtHost::AddSymbol(std::string name, u32 addr, u32 size, int type=0)
@ -130,6 +134,36 @@ bool QtHost::IsDebuggingEnabled()
#endif
}
void QtHost::SendCoreWait(bool isWaiting)
{
mainWindow->CoreEmitWait(isWaiting);
}
bool QtHost::GpuStep()
{
return m_GPUStep;
}
void QtHost::SendGPUWait()
{
EmuThread_LockDraw(false);
mainWindow->GetDialogDisasm()->UpdateDisplayList();
m_hGPUStepEvent.wait(m_hGPUStepMutex);
EmuThread_LockDraw(true);
}
void QtHost::SetGPUStep(bool value)
{
m_GPUStep = value;
}
void QtHost::NextGPUStep()
{
m_hGPUStepEvent.notify_one();
}
void NativeMix(short *audio, int num_samples)
{
if (g_mixer)

View file

@ -12,6 +12,7 @@
#include "gfx/texture.h"
#include "input/input_state.h"
#include "math/math_util.h"
#include "base/mutex.h"
#include "math/lin/matrix4x4.h"
#include <QGLWidget>
@ -48,10 +49,17 @@ public:
bool AttemptLoadSymbolMap();
void SetWindowTitle(const char *message);
void SendCoreWait(bool);
bool GpuStep();
void SendGPUWait();
void SetGPUStep(bool value);
void NextGPUStep();
signals:
void BootDoneSignal();
private:
MainWindow* mainWindow;
bool m_GPUStep;
};
#endif // QTAPP_H

View file

@ -1,18 +1,451 @@
#include "ctrldisasmview.h"
#include <QPainter>
#include <QKeyEvent>
#include <QClipboard>
#include <QMenu>
#include <QAction>
#include <QApplication>
#include <QDebug>
#include <QInputDialog>
#include <QMessageBox>
#include "debugger_disasm.h"
#include "Core/Debugger/SymbolMap.h"
namespace
{
u32 halfAndHalf(u32 a, u32 b)
{
return ((a>>1)&0x7f7f7f7f) + ((b>>1)&0x7f7f7f7f);
}
}
CtrlDisAsmView::CtrlDisAsmView(QWidget *parent) :
QTableWidget(parent)
QWidget(parent)
{
curAddress=0;
rowHeight=14;
align=2;
selecting=false;
showHex=false;
}
void CtrlDisAsmView::keyPressEvent(QKeyEvent *e)
{
int page=(rect().bottom()/rowHeight)/2-1;
if(e->key() == Qt::Key_Down)
{
curAddress += align;
e->accept();
}
else if(e->key() == Qt::Key_Up)
{
curAddress -= align;
e->accept();
}
else if(e->key() == Qt::Key_PageDown)
{
curAddress += page*align;
e->accept();
}
else if(e->key() == Qt::Key_PageUp)
{
curAddress -= page*align;
e->accept();
}
update();
}
void CtrlDisAsmView::mousePressEvent(QMouseEvent *e)
{
int x = e->pos().x();
int y = e->pos().y();
if (x>16)
{
oldSelection=selection;
selection=yToAddress(y);
bool oldselecting=selecting;
selecting=true;
if (!oldselecting || (selection!=oldSelection))
redraw();
e->accept();
}
else
{
EmuThread_LockDraw(true);
debugger->toggleBreakpoint(yToAddress(y));
EmuThread_LockDraw(false);
parentWindow->Update();
redraw();
e->accept();
}
}
void CtrlDisAsmView::wheelEvent(QWheelEvent* e)
{
int numDegrees = e->delta() / 8;
int numSteps = numDegrees / 15;
if (e->orientation() == Qt::Horizontal) {
} else {
curAddress -= numSteps*align;
e->accept();
update();
}
}
void CtrlDisAsmView::redraw()
{
update();
}
void CtrlDisAsmView::contextMenu(const QPoint &pos)
{
QMenu menu(this);
QAction *copyAddress = new QAction(tr("Copy &address"), this);
connect(copyAddress, SIGNAL(triggered()), this, SLOT(CopyAddress()));
menu.addAction(copyAddress);
QAction *copyInstrHex = new QAction(tr("Copy instruction (&hex)"), this);
connect(copyInstrHex, SIGNAL(triggered()), this, SLOT(CopyInstrHex()));
menu.addAction(copyInstrHex);
QAction *copyInstrDisAsm = new QAction(tr("Copy instruction (&disasm)"), this);
connect(copyInstrDisAsm, SIGNAL(triggered()), this, SLOT(CopyInstrDisAsm()));
menu.addAction(copyInstrDisAsm);
menu.addSeparator();
QAction *runToHere = new QAction(tr("&Run to here"), this);
connect(runToHere, SIGNAL(triggered()), this, SLOT(RunToHere()));
menu.addAction(runToHere);
QAction *setNextStatement = new QAction(tr("&Set Next Statement"), this);
connect(setNextStatement, SIGNAL(triggered()), this, SLOT(SetNextStatement()));
menu.addAction(setNextStatement);
QAction *toggleBreakpoint = new QAction(tr("&Toggle breakpoint"), this);
connect(toggleBreakpoint, SIGNAL(triggered()), this, SLOT(ToggleBreakpoint()));
menu.addAction(toggleBreakpoint);
QAction *followBranch = new QAction(tr("&Follow branch"), this);
connect(followBranch, SIGNAL(triggered()), this, SLOT(FollowBranch()));
menu.addAction(followBranch);
menu.addSeparator();
//QAction *showDynarecResults = new QAction(tr("&Show Dynarec Results"), this);
//connect(showDynarecResults, SIGNAL(triggered()), this, SLOT(ShowDynarecResults()));
//menu.addAction(showDynarecResults);
QAction *goToMemoryView = new QAction(tr("Go to in &Memory View"), this);
connect(goToMemoryView, SIGNAL(triggered()), this, SLOT(GoToMemoryView()));
menu.addAction(goToMemoryView);
menu.addSeparator();
//QAction *killFunction = new QAction(tr("&Kill function"), this);
//connect(killFunction, SIGNAL(triggered()), this, SLOT(KillFunction()));
//menu.addAction(killFunction);
QAction *renameFunction = new QAction(tr("&Rename function..."), this);
connect(renameFunction, SIGNAL(triggered()), this, SLOT(RenameFunction()));
menu.addAction(renameFunction);
menu.exec( mapToGlobal(pos));
}
void CtrlDisAsmView::click(int row, int col)
void CtrlDisAsmView::GoToMemoryView()
{
parentWindow->ShowMemory(selection);
}
void CtrlDisAsmView::CopyAddress()
{
char temp[16];
sprintf(temp,"%08x",selection);
QApplication::clipboard()->setText(QString(temp));
}
void CtrlDisAsmView::CopyInstrDisAsm()
{
EmuThread_LockDraw(true);
QApplication::clipboard()->setText(debugger->disasm(selection,align));
EmuThread_LockDraw(false);
}
void CtrlDisAsmView::CopyInstrHex()
{
char temp[24];
EmuThread_LockDraw(true);
sprintf(temp,"%08x",debugger->readMemory(selection));
EmuThread_LockDraw(false);
QApplication::clipboard()->setText(temp);
}
void CtrlDisAsmView::SetNextStatement()
{
EmuThread_LockDraw(true);
debugger->setPC(selection);
EmuThread_LockDraw(false);
redraw();
}
void CtrlDisAsmView::ToggleBreakpoint()
{
EmuThread_LockDraw(true);
debugger->toggleBreakpoint(selection);
EmuThread_LockDraw(false);
parentWindow->Update();
redraw();
}
void CtrlDisAsmView::FollowBranch()
{
EmuThread_LockDraw(true);
const char *temp = debugger->disasm(selection,align);
EmuThread_LockDraw(false);
const char *mojs=strstr(temp,"->$");
if (mojs)
{
u32 dest;
sscanf(mojs+3,"%08x",&dest);
if (dest)
{
marker = selection;
gotoAddr(dest);
}
}
}
void CtrlDisAsmView::RunToHere()
{
EmuThread_LockDraw(true);
debugger->setBreakpoint(selection);
debugger->runToBreakpoint();
EmuThread_LockDraw(false);
redraw();
}
void CtrlDisAsmView::RenameFunction()
{
int sym = symbolMap.GetSymbolNum(selection);
if (sym != -1)
{
char name[256];
strncpy(name, symbolMap.GetSymbolName(sym),256);
bool ok;
QString newname = QInputDialog::getText(this, tr("New function name"),
tr("New function name :"), QLineEdit::Normal,
name, &ok);
if (ok && !newname.isEmpty())
{
symbolMap.SetSymbolName(sym,newname.toStdString().c_str());
redraw();
parentWindow->NotifyMapLoaded();
}
}
else
{
QMessageBox::information(this,"Warning","No symbol selected",QMessageBox::Ok);
}
}
void CtrlDisAsmView::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::white);
painter.setPen(Qt::white);
painter.drawRect(rect());
struct branch
{
int src,dst,srcAddr;
bool conditional;
};
branch branches[256];
int numBranches=0;
int width = rect().width();
int numRows=(rect().height()/rowHeight)/2+1;
QColor bgColor = QColor(0xFFFFFFFF);
QPen nullPen= QPen(bgColor);
QPen currentPen=QPen(QColor(0,0,0));
QPen selPen=QPen(QColor(0xFF808080));
QPen condPen=QPen(QColor(0xFFFF3020));
QBrush lbr;
lbr.setColor(bgColor);
QBrush currentBrush=QBrush(QColor(0xFFFFEfE8));
QBrush pcBrush=QBrush(QColor(0xFF70FF70));
QFont normalFont = QFont("Arial", 10);
QFont boldFont = QFont("Arial", 10);
QFont alignedFont = QFont("Monospace", 10);
boldFont.setBold(true);
painter.setFont(normalFont);
QImage breakPoint(":/images/breakpoint");
int i;
curAddress&=~(align-1);
align=(debugger->getInstructionSize(0));
for (i=-numRows; i<=numRows; i++)
{
unsigned int address=curAddress + i*align;
int rowY1 = rect().bottom()/2 + rowHeight*i - rowHeight/2;
int rowY2 = rect().bottom()/2 + rowHeight*i + rowHeight/2 - 1;
char temp[256];
sprintf(temp,"%08x",address);
lbr.setColor(marker==address?QColor(0xFFFFEEE0):QColor(debugger->getColor(address)));
QColor bg = lbr.color();
painter.setPen(nullPen);
painter.drawRect(0,rowY1,16-1,rowY2-rowY1);
if (selecting && address == selection)
painter.setPen(selPen);
else
painter.setPen(i==0 ? currentPen : nullPen);
QBrush mojsBrush=QBrush(lbr.color());
painter.setBrush(mojsBrush);
if (address == debugger->getPC())
{
painter.setBrush(pcBrush);
qDebug() << address;
}
painter.drawRect(16,rowY1,width-16-1,rowY2-rowY1);
painter.setBrush(currentBrush);
QPen textPen = QPen(QColor(halfAndHalf(bg.rgba(),0)));
painter.setPen(textPen);
painter.setFont(alignedFont);
painter.drawText(17,rowY1-3+rowHeight,QString(temp));
painter.setFont(normalFont);
textPen.setColor(QColor(0xFF000000));
painter.setPen(textPen);
if (debugger->isAlive())
{
const char *dizz = debugger->disasm(address, align);
char dis[512];
strcpy(dis, dizz);
char *dis2 = strchr(dis,'\t');
char desc[256]="";
if (dis2)
{
*dis2=0;
dis2++;
const char *mojs=strstr(dis2,"->$");
if (mojs)
{
for (int i=0; i<8; i++)
{
bool found=false;
for (int j=0; j<22; j++)
{
if (mojs[i+3]=="0123456789ABCDEFabcdef"[j])
found=true;
}
if (!found)
{
mojs=0;
break;
}
}
}
if (mojs)
{
int offs;
sscanf(mojs+3,"%08x",&offs);
branches[numBranches].src=rowY1 + rowHeight/2;
branches[numBranches].srcAddr=address/align;
branches[numBranches].dst=(int)(rowY1+((s64)offs-(s64)address)*rowHeight/align + rowHeight/2);
branches[numBranches].conditional = (dis[1]!=0); //unconditional 'b' branch
numBranches++;
const char *t = debugger->getDescription(offs);
if (memcmp(t,"z_",2)==0)
t+=2;
if (memcmp(t,"zz_",3)==0)
t+=3;
sprintf(desc,"-->%s", t);
textPen.setColor(QColor(0xFF600060));
painter.setPen(textPen);
}
else
{
textPen.setColor(QColor(0xFF000000));
painter.setPen(textPen);
}
painter.drawText(149,rowY1-3+rowHeight,QString(dis2));
}
textPen.setColor(QColor(0xFF007000));
painter.setPen(textPen);
painter.setFont(boldFont);
painter.drawText(84,rowY1-3+rowHeight,QString(dis));
painter.setFont(normalFont);
if (desc[0]==0)
{
const char *t = debugger->getDescription(address);
if (memcmp(t,"z_",2)==0)
t+=2;
if (memcmp(t,"zz_",3)==0)
t+=3;
strcpy(desc,t);
}
if (memcmp(desc,"-->",3) == 0)
{
textPen.setColor(QColor(0xFF0000FF));
painter.setPen(textPen);
}
else
{
textPen.setColor(halfAndHalf(halfAndHalf(bg.rgba(),0),bg.rgba()));
painter.setPen(textPen);
}
if (strlen(desc))
painter.drawText(std::max(280,width/3+190),rowY1-3+rowHeight,QString(desc));
if (debugger->isBreakpoint(address))
{
painter.drawImage(2,rowY1+2,breakPoint);
}
}
}
for (i=0; i<numBranches; i++)
{
painter.setPen(branches[i].conditional ? condPen : currentPen);
int x=280+(branches[i].srcAddr%9)*8;
QPoint curPos = QPoint(x-2,branches[i].src);
if (branches[i].dst<rect().bottom()+200 && branches[i].dst>-200)
{
painter.drawLine(curPos, QPoint(x+2,branches[i].src));
curPos = QPoint(x+2,branches[i].src);
painter.drawLine(curPos, QPoint(x+2,branches[i].dst));
curPos = QPoint(x+2,branches[i].dst);
painter.drawLine(curPos, QPoint(x-4,branches[i].dst));
curPos = QPoint(x,branches[i].dst-4);
painter.drawLine(curPos, QPoint(x-4,branches[i].dst));
curPos = QPoint(x-4,branches[i].dst);
painter.drawLine(curPos, QPoint(x+1,branches[i].dst+5));
}
else
{
painter.drawLine(curPos, QPoint(x+4,branches[i].src));
}
}
}
int CtrlDisAsmView::yToAddress(int y)
{
int ydiff=y-rect().bottom()/2-rowHeight/2;
ydiff=(int)(floor((float)ydiff / (float)rowHeight))+1;
return curAddress + ydiff * align;
}

View file

@ -1,10 +1,13 @@
#ifndef CTRLDISASMVIEW_H
#define CTRLDISASMVIEW_H
#include <QTableWidget>
#include <QWidget>
#include "Core/Debugger/DebugInterface.h"
#include "EmuThread.h"
class CtrlDisAsmView : public QTableWidget
class Debugger_Disasm;
class CtrlDisAsmView : public QWidget
{
Q_OBJECT
public:
@ -17,11 +20,18 @@ public:
align=l;
}
void setParentWindow(Debugger_Disasm* win)
{
parentWindow = win;
}
void setDebugger(DebugInterface *deb)
{
EmuThread_LockDraw(true);
debugger=deb;
curAddress=debugger->getPC();
align=debugger->getInstructionSize(0);
EmuThread_LockDraw(false);
}
DebugInterface *getDebugger()
{
@ -34,7 +44,9 @@ public:
}
void gotoPC()
{
EmuThread_LockDraw(true);
curAddress=debugger->getPC()&(~(align-1));
EmuThread_LockDraw(false);
redraw();
}
unsigned int getSelection()
@ -49,21 +61,38 @@ public:
void toggleBreakpoint()
{
EmuThread_LockDraw(true);
debugger->toggleBreakpoint(curAddress);
EmuThread_LockDraw(false);
redraw();
}
void contextMenu(const QPoint& pos);
void click(int row, int col);
protected:
void paintEvent(QPaintEvent *);
void mousePressEvent(QMouseEvent *e);
void keyPressEvent(QKeyEvent *);
void wheelEvent(QWheelEvent *e);
signals:
public slots:
void CopyAddress();
void CopyInstrDisAsm();
void SetNextStatement();
void FollowBranch();
void CopyInstrHex();
void RunToHere();
void ToggleBreakpoint();
void GoToMemoryView();
void RenameFunction();
private:
int yToAddress(int y);
int curAddress;
int align;
int rowHeight;
int selection;
int marker;
int oldSelection;
@ -73,6 +102,7 @@ private:
bool showHex;
DebugInterface *debugger;
Debugger_Disasm* parentWindow;
};

250
Qt/ctrlmemview.cpp Normal file
View file

@ -0,0 +1,250 @@
#include "ctrlmemview.h"
#include <QPainter>
#include <QKeyEvent>
#include <QMenu>
#include <QMessageBox>
#include <QApplication>
#include <QClipboard>
#include "EmuThread.h"
#include "Core/MemMap.h"
#include "Core/Debugger/SymbolMap.h"
CtrlMemView::CtrlMemView(QWidget *parent) :
QWidget(parent)
{
curAddress=0;
rowHeight=14;
align=4;
alignMul=4;
selecting=false;
mode=MV_NORMAL;
debugger = 0;
setMinimumWidth(500);
}
void CtrlMemView::redraw()
{
update();
}
void CtrlMemView::wheelEvent(QWheelEvent* e)
{
int numDegrees = e->delta() / 8;
int numSteps = numDegrees / 15;
if (e->orientation() == Qt::Horizontal) {
} else {
curAddress -= numSteps*align*alignMul;
e->accept();
redraw();
}
}
void CtrlMemView::keyPressEvent(QKeyEvent *e)
{
int page=(rect().bottom()/rowHeight)/2-1;
if(e->key() == Qt::Key_Up)
{
curAddress-=align*alignMul;
e->accept();
}
else if(e->key() == Qt::Key_Down)
{
curAddress+=align*alignMul;
e->accept();
}
else if(e->key() == Qt::Key_PageUp)
{
curAddress-=page*align*alignMul;
e->accept();
}
else if(e->key() == Qt::Key_PageDown)
{
curAddress+=page*align*alignMul;
e->accept();
}
redraw();
}
void CtrlMemView::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::white);
painter.setPen(Qt::white);
painter.drawRect(rect());
if (!debugger)
return;
int width = rect().width();
int numRows=(rect().bottom()/rowHeight)/2+1;
QPen nullPen=QPen(0xFFFFFF);
QPen currentPen=QPen(0xFF000000);
QPen selPen=QPen(0x808080);
QBrush lbr = QBrush(0xFFFFFF);
QBrush nullBrush=QBrush(0xFFFFFF);
QBrush currentBrush=QBrush(0xFFEfE8);
QBrush pcBrush=QBrush(0x70FF70);
QPen textPen;
QFont normalFont = QFont("Arial", 10);
QFont alignedFont = QFont("Monospace", 10);
painter.setFont(normalFont);
int i;
curAddress&=~(align-1);
for (i=-numRows; i<=numRows; i++)
{
unsigned int address=curAddress + i*align*alignMul;
int rowY1 = rect().bottom()/2 + rowHeight*i - rowHeight/2;
int rowY2 = rect().bottom()/2 + rowHeight*i + rowHeight/2;
char temp[256];
sprintf(temp,"%08x",address);
painter.setBrush(currentBrush);
if (selecting && address == selection)
painter.setPen(selPen);
else
painter.setPen(i==0 ? currentPen : nullPen);
painter.drawRect(0, rowY1, 16-1, rowY2 - rowY1 - 1);
painter.drawRect(16, rowY1, width - 16 -1, rowY2 - rowY1 - 1);
painter.setBrush(nullBrush);
textPen.setColor(0x600000);
painter.setPen(textPen);
painter.setFont(alignedFont);
painter.drawText(17,rowY1-2+rowHeight, temp);
textPen.setColor(0xFF000000);
painter.setPen(textPen);
if (debugger->isAlive())
{
switch(mode) {
case MV_NORMAL:
{
const char *m = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
if (Memory::IsValidAddress(address))
{
EmuThread_LockDraw(true);
u32 memory[4] = {
debugger->readMemory(address),
debugger->readMemory(address+4),
debugger->readMemory(address+8),
debugger->readMemory(address+12)
};
EmuThread_LockDraw(false);
m = (const char*)memory;
sprintf(temp, "%08x %08x %08x %08x ................",
memory[0],memory[1],memory[2],memory[3]);
}
for (int i=0; i<16; i++)
{
int c = (unsigned char)m[i];
if (c>=32 && c<255)
temp[i+37]=c;
}
}
painter.setFont(alignedFont);
painter.drawText(85,rowY1 - 2 + rowHeight, temp);
break;
case MV_SYMBOLS:
{
textPen.setColor(0x0000FF);
painter.setPen(textPen);
int fn = symbolMap.GetSymbolNum(address);
if (fn==-1)
{
sprintf(temp, "%s (ns)", Memory::GetAddressName(address));
}
else
sprintf(temp, "%s (0x%x b)", symbolMap.GetSymbolName(fn),symbolMap.GetSymbolSize(fn));
painter.drawText(205,rowY1 - 2 + rowHeight, temp);
textPen.setColor(0xFF0000000);
painter.setPen(textPen);
if (align==4)
{
u32 value = Memory::ReadUnchecked_U32(address);
sprintf(temp, "%08x [%s]", value, symbolMap.GetSymbolName(symbolMap.GetSymbolNum(value)));
}
else if (align==2)
{
u16 value = Memory::ReadUnchecked_U16(address);
sprintf(temp, "%04x [%s]", value, symbolMap.GetSymbolName(symbolMap.GetSymbolNum(value)));
}
painter.drawText(85,rowY1 - 2 + rowHeight, temp);
break;
}
}
}
}
}
void CtrlMemView::mousePressEvent(QMouseEvent *e)
{
int x = e->pos().x();
int y = e->pos().y();
if (x>16)
{
oldSelection=selection;
selection=yToAddress(y);
bool oldselecting=selecting;
selecting=true;
if (!oldselecting || (selection!=oldSelection))
redraw();
}
}
void CtrlMemView::contextMenu(const QPoint &pos)
{
QMenu menu(this);
QAction *gotoDisAsm = new QAction(tr("Go to in &disasm"), this);
//connect(gotoDisAsm, SIGNAL(triggered()), this, SLOT(GotoDisAsm()));
menu.addAction(gotoDisAsm);
menu.addSeparator();
QAction *copyValue = new QAction(tr("&Copy value"), this);
connect(copyValue, SIGNAL(triggered()), this, SLOT(CopyValue()));
menu.addAction(copyValue);
QAction *dump = new QAction(tr("Dump..."), this);
connect(dump, SIGNAL(triggered()), this, SLOT(Dump()));
menu.addAction(dump);
menu.exec( mapToGlobal(pos));
}
void CtrlMemView::CopyValue()
{
char temp[24];
sprintf(temp,"%08x",Memory::ReadUnchecked_U32(selection));
QApplication::clipboard()->setText(temp);
}
void CtrlMemView::Dump()
{
QMessageBox::information(this,"Sorry","This feature has not been implemented.",QMessageBox::Ok);
}
int CtrlMemView::yToAddress(int y)
{
int ydiff=y-rect().bottom()/2-rowHeight/2;
ydiff=(int)(floor((float)ydiff / (float)rowHeight))+1;
return curAddress + ydiff * align*alignMul;
}

91
Qt/ctrlmemview.h Normal file
View file

@ -0,0 +1,91 @@
#ifndef CTRLMEMVIEW_H
#define CTRLMEMVIEW_H
#include "Core/Debugger/DebugInterface.h"
#include <QWidget>
enum MemViewMode
{
MV_NORMAL,
MV_SYMBOLS,
MV_MAX
};
class CtrlMemView : public QWidget
{
Q_OBJECT
public:
explicit CtrlMemView(QWidget *parent = 0);
void setDebugger(DebugInterface *deb)
{
debugger=deb;
if (debugger)
align=debugger->getInstructionSize(0);
}
DebugInterface *getDebugger()
{
return debugger;
}
void redraw();
void setMode(MemViewMode m)
{
mode=m;
switch(mode) {
case MV_NORMAL:
alignMul=4;
break;
case MV_SYMBOLS:
alignMul=1;
break;
default:
break;
}
redraw();
}
void setAlign(int l)
{
align=l;
}
int yToAddress(int y);
void gotoAddr(unsigned int addr)
{
curAddress=addr&(~(align-1));
redraw();
}
unsigned int getSelection()
{
return curAddress;
}
void contextMenu(const QPoint &pos);
protected:
void paintEvent(QPaintEvent *);
void keyPressEvent(QKeyEvent *e);
void wheelEvent(QWheelEvent *e);
void mousePressEvent(QMouseEvent *e);
signals:
public slots:
void CopyValue();
void Dump();
private:
int curAddress;
int align;
int alignMul;
int rowHeight;
int selection;
int oldSelection;
bool selectionChanged;
bool selecting;
bool hasFocus;
DebugInterface *debugger;
MemViewMode mode;
};
#endif // CTRLMEMVIEW_H

View file

@ -1,10 +1,362 @@
#include "ctrlregisterlist.h"
#include <QPainter>
#include <QFont>
#include <QKeyEvent>
#include <QScrollBar>
#include <QMenu>
#include <QApplication>
#include <QClipboard>
#include <QInputDialog>
#include "EmuThread.h"
#include "debugger_disasm.h"
CtrlRegisterList::CtrlRegisterList(QWidget *parent) :
QListWidget(parent)
QWidget(parent)
{
rowHeight = 14;
selecting=false;
selection=0;
category=0;
showHex=false;
cpu=0;
lastPC = 0;
lastCat0Values = NULL;
changedCat0Regs = NULL;
curVertOffset = 0;
}
CtrlRegisterList::~CtrlRegisterList()
{
if (lastCat0Values != NULL)
delete [] lastCat0Values;
if (changedCat0Regs != NULL)
delete [] changedCat0Regs;
}
void CtrlRegisterList::redraw()
{
update();
}
void CtrlRegisterList::scrollChanged(int action)
{
QScrollBar *bar = findChild<QScrollBar*>("RegListScroll");
switch(action)
{
case QScrollBar::SliderSingleStepAdd:
curVertOffset++;
break;
case QScrollBar::SliderSingleStepSub:
curVertOffset--;
break;
case QScrollBar::SliderPageStepAdd:
curVertOffset+= 4;
break;
case QScrollBar::SliderPageStepSub:
curVertOffset-= 4;
break;
case QScrollBar::SliderMove:
curVertOffset = bar->sliderPosition();
break;
default:
break;
}
redraw();
}
void CtrlRegisterList::keyPressEvent(QKeyEvent *e)
{
if(e->key() == Qt::Key_Down)
{
selection += 1;
e->accept();
}
else if(e->key() == Qt::Key_Up)
{
selection -= 1;
e->accept();
}
else if(e->key() == Qt::Key_PageDown)
{
selection += 4;
e->accept();
}
else if(e->key() == Qt::Key_PageUp)
{
selection -= 4;
e->accept();
}
int maxRowsDisplay =rect().bottom()/rowHeight - 1;
curVertOffset = std::min(std::max(curVertOffset, selection-maxRowsDisplay),selection);
update();
}
void CtrlRegisterList::mousePressEvent(QMouseEvent *e)
{
int x = e->pos().x();
int y = e->pos().y();
if (x>16)
{
oldSelection=selection;
if (y>rowHeight)
{
selection=yToIndex(y);
bool oldselecting=selecting;
selecting=true;
if (!oldselecting || (selection!=oldSelection))
redraw();
}
else
{
int lastCat = category;
category = (x*cpu->GetNumCategories())/(rect().width());
if (category<0) category=0;
if (category>=cpu->GetNumCategories())
category=cpu->GetNumCategories()-1;
if (category!=lastCat)
{
curVertOffset = 0;
redraw();
}
}
}
else
{
redraw();
}
e->accept();
}
void CtrlRegisterList::wheelEvent(QWheelEvent* e)
{
int numDegrees = e->delta() / 8;
int numSteps = numDegrees / 15;
if (e->orientation() == Qt::Horizontal) {
} else {
curVertOffset -= numSteps;
e->accept();
update();
}
}
void CtrlRegisterList::paintEvent(QPaintEvent *)
{
int numRowsTotal = cpu->GetNumRegsInCategory(category);
int maxRowsDisplay =rect().bottom()/rowHeight - 1;
selection = std::min(std::max(selection,0),numRowsTotal);
curVertOffset = std::min(std::max(curVertOffset, 0),numRowsTotal - maxRowsDisplay);
QScrollBar *bar = findChild<QScrollBar*>("RegListScroll");
if(bar)
{
bar->setMinimum(0);
bar->setMaximum(numRowsTotal - maxRowsDisplay);
bar->setPageStep(1);
bar->setValue(curVertOffset);
}
QPainter painter(this);
painter.setBrush(Qt::white);
painter.setPen(Qt::white);
painter.drawRect(rect());
if (!cpu)
return;
QFont normalFont = QFont("Arial", 10);
painter.setFont(normalFont);
int width = rect().width();
QColor bgColor = QColor(0xffffff);
QPen nullPen=QPen(bgColor);
QPen currentPen=QPen(QColor(0xFF000000));
QPen selPen=QPen(0x808080);
QPen textPen;
QBrush lbr;
lbr.setColor(bgColor);
QBrush nullBrush=QBrush(bgColor);
QBrush currentBrush=QBrush(0xFFEfE8);
QBrush pcBrush=QBrush(0x70FF70);
int nc = cpu->GetNumCategories();
for (int i=0; i<nc; i++)
{
painter.setPen(i==category?currentPen:nullPen);
painter.setBrush(i==category?pcBrush:nullBrush);
painter.drawRect(width*i/nc,0,width*(i+1)/nc - width*i/nc -1,rowHeight-1);
QString name = cpu->GetCategoryName(i);
painter.setPen(currentPen);
painter.drawText(width*i/nc+1,-3+rowHeight,name);
}
int numRows=rect().bottom()/rowHeight;
for (int i=curVertOffset; i<curVertOffset+numRows; i++)
{
int rowY1 = rowHeight*(i-curVertOffset+1);
int rowY2 = rowHeight*(i-curVertOffset+2)-1;
lbr.setColor(i==selection?0xffeee0:0xffffff);
painter.setBrush(currentBrush);
painter.setPen(nullPen);
painter.drawRect(0,rowY1,16-1,rowY2-rowY1);
if (selecting && i == selection)
painter.setPen(selPen);
else
painter.setPen(nullPen);
QBrush mojsBrush=QBrush(lbr.color());
painter.setBrush(mojsBrush);
painter.drawRect(16,rowY1,width-16-1,rowY2-rowY1);
// Check for any changes in the registers.
if (lastPC != cpu->GetPC())
{
for (int i = 0, n = cpu->GetNumRegsInCategory(0); i < n; ++i)
{
u32 v = cpu->GetRegValue(0, i);
changedCat0Regs[i] = v != lastCat0Values[i];
lastCat0Values[i] = v;
}
lastPC = cpu->GetPC();
}
painter.setBrush(currentBrush);
if (i<cpu->GetNumRegsInCategory(category))
{
char temp[256];
sprintf(temp,"%s",cpu->GetRegName(category,i));
textPen.setColor(0x600000);
painter.setPen(textPen);
painter.drawText(17,rowY1-3+rowHeight,temp);
textPen.setColor(0xFF000000);
painter.setPen(textPen);
cpu->PrintRegValue(category,i,temp);
if (category == 0 && changedCat0Regs[i])
{
textPen.setColor(0x0000FF);
painter.setPen(textPen);
}
else
{
textPen.setColor(0x004000);
painter.setPen(textPen);
}
painter.drawText(77,rowY1-3+rowHeight,temp);
}
}
}
int CtrlRegisterList::yToIndex(int y)
{
int n = (y/rowHeight) - 1 + curVertOffset;
if (n<0) n=0;
return n;
}
void CtrlRegisterList::contextMenu(const QPoint &pos)
{
QMenu menu(this);
QAction *gotoMemory = new QAction(tr("Go to in &memory view"), this);
connect(gotoMemory, SIGNAL(triggered()), this, SLOT(GotoMemory()));
menu.addAction(gotoMemory);
QAction *gotoDisAsm = new QAction(tr("Go to in &disasm"), this);
connect(gotoDisAsm, SIGNAL(triggered()), this, SLOT(GotoDisAsm()));
menu.addAction(gotoDisAsm);
menu.addSeparator();
QAction *copyValue = new QAction(tr("&Copy value"), this);
connect(copyValue, SIGNAL(triggered()), this, SLOT(CopyValue()));
menu.addAction(copyValue);
QAction *change = new QAction(tr("C&hange..."), this);
connect(change, SIGNAL(triggered()), this, SLOT(Change()));
menu.addAction(change);
menu.exec( mapToGlobal(pos));
}
void CtrlRegisterList::GotoMemory()
{
int cat = category;
int reg = selection;
if (selection >= cpu->GetNumRegsInCategory(cat))
return;
EmuThread_LockDraw(true);
u32 val = cpu->GetRegValue(cat,reg);
EmuThread_LockDraw(false);
parentWindow->ShowMemory(val);
}
void CtrlRegisterList::GotoDisAsm()
{
int cat = category;
int reg = selection;
if (selection >= cpu->GetNumRegsInCategory(cat))
return;
EmuThread_LockDraw(true);
u32 val = cpu->GetRegValue(cat,reg);
EmuThread_LockDraw(false);
emit GotoDisasm(val);
}
void CtrlRegisterList::CopyValue()
{
int cat = category;
int reg = selection;
if (selection >= cpu->GetNumRegsInCategory(cat))
return;
EmuThread_LockDraw(true);
u32 val = cpu->GetRegValue(cat,reg);
EmuThread_LockDraw(false);
char temp[24];
sprintf(temp,"%08x",val);
QApplication::clipboard()->setText(temp);
}
void CtrlRegisterList::Change()
{
int cat = category;
int reg = selection;
if (selection >= cpu->GetNumRegsInCategory(cat))
return;
EmuThread_LockDraw(true);
u32 val = cpu->GetRegValue(cat,reg);
EmuThread_LockDraw(false);
bool ok;
QString text = QInputDialog::getText(this, tr("Set new value"),
tr("Set new value :"), QLineEdit::Normal,
QString::number(val), &ok);
if (ok && !text.isEmpty())
{
EmuThread_LockDraw(true);
cpu->SetRegValue(cat,reg,text.toInt());
EmuThread_LockDraw(false);
redraw();
}
}

View file

@ -1,16 +1,21 @@
#ifndef CTRLREGISTERLIST_H
#define CTRLREGISTERLIST_H
#include <QListWidget>
#include <QWidget>
#include "Core/Debugger/DebugInterface.h"
class CtrlRegisterList : public QListWidget
class Debugger_Disasm;
class CtrlRegisterList : public QWidget
{
Q_OBJECT
public:
explicit CtrlRegisterList(QWidget *parent = 0);
void redraw();
void setParentWindow(Debugger_Disasm* win)
{
parentWindow = win;
}
void setCPU(DebugInterface *deb)
{
@ -26,10 +31,27 @@ public:
{
return cpu;
}
~CtrlRegisterList();
void contextMenu(const QPoint &pos);
protected:
void paintEvent(QPaintEvent *);
void keyPressEvent(QKeyEvent *e);
void mousePressEvent(QMouseEvent *e);
void wheelEvent(QWheelEvent *e);
signals:
void GotoDisasm(u32);
public slots:
void redraw();
void scrollChanged(int);
void GotoDisAsm();
void CopyValue();
void Change();
void GotoMemory();
private:
int yToIndex(int y);
int rowHeight;
int selection;
@ -43,10 +65,13 @@ private:
bool hasFocus;
bool showHex;
DebugInterface *cpu;
int curVertOffset;
u32 lastPC;
u32 *lastCat0Values;
bool *changedCat0Regs;
Debugger_Disasm* parentWindow;
};
#endif // CTRLREGISTERLIST_H

98
Qt/ctrlvfpuview.cpp Normal file
View file

@ -0,0 +1,98 @@
#include "ctrlvfpuview.h"
#include <QPainter>
#include "Core/MIPS/MIPS.h" // BAD
CtrlVfpuView::CtrlVfpuView(QWidget *parent) :
QWidget(parent)
{
mode = 0;
}
void CtrlVfpuView::setMode(int newMode)
{
mode = newMode;
redraw();
}
void CtrlVfpuView::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setBrush(Qt::white);
painter.setPen(Qt::white);
painter.drawRect(rect());
if (!cpu)
return;
QFont normalFont = QFont("Arial", 10);
painter.setFont(normalFont);
QPen currentPen=QPen(0xFF000000);
QBrush nullBrush=QBrush(0xFFEfE8);
painter.setPen(currentPen);
painter.setBrush(nullBrush);
enum
{
rowHeight = 15,
columnWidth = 80,
xStart = columnWidth/2,
yStart = 0
};
for (int matrix = 0; matrix<8; matrix++)
{
int my = (int)(yStart + matrix * rowHeight * 5.5f);
painter.drawRect(0, my, xStart-1, rowHeight-1);
char temp[256];
sprintf(temp, "M%i00", matrix);
painter.drawText(3, my+rowHeight-3, temp);
painter.drawRect(xStart, my+rowHeight, columnWidth*4-1, 4*rowHeight-1);
for (int column = 0; column<4; column++)
{
int y = my;
int x = column * columnWidth + xStart;
painter.drawRect(x, y, columnWidth-1, rowHeight - 1);
char temp[256];
sprintf(temp, "R%i0%i", matrix, column);
painter.drawText(x+3, y-3+rowHeight, temp);
painter.drawRect(0, y+rowHeight*(column+1), xStart - 1, rowHeight - 1);
sprintf(temp, "C%i%i0", matrix, column);
painter.drawText(3, y+rowHeight*(column+2)-3, temp);
y+=rowHeight;
for (int row = 0; row<4; row++)
{
float val = mipsr4k.v[column*32+row+matrix*4];
u32 hex = *((u32*)&val);
char temp[256];
switch (mode)
{
case 0: sprintf(temp,"%f",val); break;
// case 1: sprintf(temp,"??"); break;
case 2: sprintf(temp,"0x%08x",hex); break;
default:sprintf(temp,"%f",val); break;
}
painter.drawText(x+3, y-3 + rowHeight, temp);
y+=rowHeight;
}
}
}
setMinimumHeight((int)(yStart + 8 * rowHeight * 5.5f));
setMinimumWidth(4*columnWidth+xStart);
}
void CtrlVfpuView::redraw()
{
update();
}

42
Qt/ctrlvfpuview.h Normal file
View file

@ -0,0 +1,42 @@
#ifndef CTRLVFPUVIEW_H
#define CTRLVFPUVIEW_H
#include <QWidget>
#include "Core/Debugger/DebugInterface.h"
class Debugger_Vfpu;
class CtrlVfpuView : public QWidget
{
Q_OBJECT
public:
explicit CtrlVfpuView(QWidget *parent = 0);
void setParentWindow(Debugger_Vfpu* win)
{
parentWindow = win;
}
void setCPU(DebugInterface *deb)
{
cpu = deb;
}
DebugInterface *getCPU()
{
return cpu;
}
void setMode(int newMode);
void redraw();
protected:
void paintEvent(QPaintEvent *);
signals:
public slots:
private:
DebugInterface *cpu;
Debugger_Vfpu* parentWindow;
int mode;
};
#endif // CTRLVFPUVIEW_H

View file

@ -1,15 +1,26 @@
#include <QMenu>
#include <QTimer>
#include <deque>
#include "debugger_disasm.h"
#include "ui_debugger_disasm.h"
#include "Core/CPU.h"
#include "Core/Debugger/DebugInterface.h"
#include "Core/Debugger/SymbolMap.h"
#include "ctrldisasmview.h"
#include "Core/Debugger/Breakpoints.h"
#include "Core/HLE/HLE.h"
#include "Core/CoreTiming.h"
#include "mainwindow.h"
#include "ctrlregisterlist.h"
#include "native/base/stringutil.h"
#include "Core/Debugger/SymbolMap.h"
#include "GPU/GPUState.h"
#include "GPU/GPUInterface.h"
#include "GPU/GeDisasm.h"
#include "EmuThread.h"
#include "Core/Host.h"
Debugger_Disasm::Debugger_Disasm(DebugInterface *_cpu, MainWindow* mainWindow_, QWidget *parent) :
QDialog(parent),
@ -19,19 +30,50 @@ Debugger_Disasm::Debugger_Disasm(DebugInterface *_cpu, MainWindow* mainWindow_,
{
ui->setupUi(this);
vfpudlg = new Debugger_VFPU(_cpu, mainWindow, this);
ui->DisasmView->setWindowTitle(_cpu->GetName());
QObject::connect(ui->RegListScroll,SIGNAL(actionTriggered(int)), ui->RegList, SLOT(scrollChanged(int)));
QObject::connect(ui->RegList,SIGNAL(GotoDisasm(u32)),this,SLOT(Goto(u32)));
QObject::connect(this, SIGNAL(updateDisplayList_()), this, SLOT(UpdateDisplayListGUI()));
QObject::connect(this, SIGNAL(UpdateBreakpoints_()), this, SLOT(UpdateBreakpointsGUI()));
QObject::connect(this, SIGNAL(UpdateThread_()), this, SLOT(UpdateThreadGUI()));
CtrlDisAsmView *ptr = ui->DisasmView;
ptr->setDebugger(cpu);
ptr->setParentWindow(this);
ptr->gotoAddr(0x00000000);
CtrlRegisterList *rl = ui->RegList;
rl->setParentWindow(this);
rl->setCPU(cpu);
//symbolMap.FillSymbolComboBox(GetDlgItem(m_hDlg, IDC_FUNCTIONLIST),ST_FUNCTION)
FillFunctions();
}
void Debugger_Disasm::showEvent(QShowEvent *)
{
#ifdef Q_WS_X11
// Hack to remove the X11 crash with threaded opengl when opening the first dialog
EmuThread_LockDraw(true);
QTimer::singleShot(100, this, SLOT(releaseLock()));
#endif
if(Core_IsStepping())
SetDebugMode(true);
else
SetDebugMode(false);
}
void Debugger_Disasm::releaseLock()
{
EmuThread_LockDraw(false);
}
Debugger_Disasm::~Debugger_Disasm()
{
delete ui;
@ -39,73 +81,68 @@ Debugger_Disasm::~Debugger_Disasm()
void Debugger_Disasm::ShowVFPU()
{
//vfpudlg->Show(true);
vfpudlg->show();
}
void Debugger_Disasm::FunctionList()
void Debugger_Disasm::Update()
{
}
void Debugger_Disasm::GotoInt()
{
ui->RegList->redraw();
mainWindow->UpdateMenus();
UpdateDialog();
}
void Debugger_Disasm::Go()
{
SetDebugMode(false);
EmuThread_LockDraw(true);
Core_EnableStepping(false);
EmuThread_LockDraw(false);
mainWindow->UpdateMenus();
}
void Debugger_Disasm::Step()
{
CtrlDisAsmView *ptr = ui->DisasmView;
CtrlRegisterList *reglist = ui->RegList;
EmuThread_LockDraw(true);
Core_DoSingleStep();
//Sleep(1);
sleep(1);
EmuThread_LockDraw(false);
_dbg_update_();
ptr->gotoPC();
reglist->redraw();
//vfpudlg->Update();
}
void Debugger_Disasm::StepOver()
{
CtrlDisAsmView *ptr = ui->DisasmView;
CtrlRegisterList *reglist = ui->RegList;
SetDebugMode(false);
EmuThread_LockDraw(true);
CBreakPoints::AddBreakPoint(cpu->GetPC()+cpu->getInstructionSize(0),true);
_dbg_update_();
Core_EnableStepping(false);
EmuThread_LockDraw(false);
mainWindow->UpdateMenus();
//Sleep(1);
sleep(1);
ptr->gotoPC();
reglist->redraw();
}
void Debugger_Disasm::StepHLE()
{
EmuThread_LockDraw(true);
hleDebugBreak();
SetDebugMode(false);
_dbg_update_();
Core_EnableStepping(false);
EmuThread_LockDraw(false);
mainWindow->UpdateMenus();
}
void Debugger_Disasm::UpdateDialog()
{
CtrlDisAsmView *ptr = ui->DisasmView;
CtrlRegisterList *reglist = ui->RegList;
ui->DisasmView->setAlign(cpu->getInstructionSize(0));
ui->DisasmView->redraw();
ui->RegList->redraw();
vfpudlg->Update();
UpdateBreakpoints();
UpdateThread();
UpdateDisplayList();
ptr->setAlign(cpu->getInstructionSize(0));
ptr->redraw();
reglist->redraw();
char tempTicks[24];
sprintf(tempTicks, "%lld", CoreTiming::GetTicks());
ui->debugCount->setText(QString("Ctr : ") + tempTicks);
/*ui->callStack->clear();
u32 pc = currentMIPS->pc;
@ -116,12 +153,12 @@ void Debugger_Disasm::UpdateDialog()
sprintf(addr_, "0x%08x",pc);
ui->callStack->addItem(new QListWidgetItem(addr_));
u32 addr2 = Memory::ReadUnchecked_U32(ra);
addr = Memory::ReadUnchecked_U32(ra);
sprintf(addr_, "0x%08x",ra);
ui->callStack->addItem(new QListWidgetItem(addr_));
count++;
while (addr != 0xFFFFFFFF && addr!=0 && count++<20)
while (addr != 0xFFFFFFFF && addr!=0 && Memory::IsValidAddress(addr+4) && count++<20)
{
u32 fun = Memory::ReadUnchecked_U32(addr+4);
sprintf(addr_, "0x%08x",fun);
@ -129,37 +166,30 @@ void Debugger_Disasm::UpdateDialog()
addr = Memory::ReadUnchecked_U32(addr);
}*/
/*
for (int i=0; i<numCPUs; i++)
if (memoryWindow[i])
memoryWindow[i]->Update();
*/
if(mainWindow->GetDialogMemory())
mainWindow->GetDialogMemory()->Update();
}
void Debugger_Disasm::Stop()
{
CtrlDisAsmView *ptr = ui->DisasmView;
CtrlRegisterList *reglist = ui->RegList;
SetDebugMode(true);
EmuThread_LockDraw(true);
Core_EnableStepping(true);
EmuThread_LockDraw(false);
_dbg_update_();
mainWindow->UpdateMenus();
UpdateDialog();
//Sleep(1); //let cpu catch up
sleep(1);
ptr->gotoPC();
reglist->redraw();
//vfpudlg->Update();
}
void Debugger_Disasm::Skip()
{
CtrlDisAsmView *ptr = ui->DisasmView;
EmuThread_LockDraw(true);
cpu->SetPC(cpu->GetPC() + cpu->getInstructionSize(0));
//Sleep(1);
sleep(1);
EmuThread_LockDraw(false);
ptr->gotoPC();
UpdateDialog();
}
@ -185,12 +215,13 @@ void Debugger_Disasm::SetDebugMode(bool _bDebug)
{
ui->Go->setEnabled(true);
ui->StepInto->setEnabled(true);
ui->StepOver->setEnabled(true);
ui->StepOver->setEnabled(false); // Crash, so disable for now
ui->NextHLE->setEnabled(true);
ui->Stop->setEnabled(false);
ui->Skip->setEnabled(true);
CtrlDisAsmView *ptr = ui->DisasmView;
ptr->gotoPC();
UpdateDialog();
}
else
{
@ -200,9 +231,9 @@ void Debugger_Disasm::SetDebugMode(bool _bDebug)
ui->NextHLE->setEnabled(false);
ui->Stop->setEnabled(true);
ui->Skip->setEnabled(false);
}
CtrlRegisterList *reglist = ui->RegList;
reglist->redraw();
}
}
void Debugger_Disasm::Goto(u32 addr)
@ -272,14 +303,414 @@ void Debugger_Disasm::on_DisasmView_customContextMenuRequested(const QPoint &pos
ui->DisasmView->contextMenu(pos);
}
void Debugger_Disasm::on_DisasmView_cellClicked(int row, int column)
{
ui->DisasmView->click(row, column);
}
void Debugger_Disasm::NotifyMapLoaded()
{
//symbolMap.FillSymbolListBox(GetDlgItem(m_hDlg, IDC_FUNCTIONLIST),ST_FUNCTION);
FillFunctions();
CtrlDisAsmView *ptr = ui->DisasmView;
ptr->redraw();
}
void Debugger_Disasm::on_RegList_customContextMenuRequested(const QPoint &pos)
{
ui->RegList->contextMenu(pos);
}
void Debugger_Disasm::ShowMemory(u32 addr)
{
mainWindow->ShowMemory(addr);
}
void Debugger_Disasm::on_vfpu_clicked()
{
ShowVFPU();
}
void Debugger_Disasm::on_FuncList_itemClicked(QListWidgetItem *item)
{
u32 addr = item->data(Qt::UserRole).toInt();
ui->DisasmView->gotoAddr(addr);
}
void Debugger_Disasm::FillFunctions()
{
QListWidgetItem* item = new QListWidgetItem();
item->setText("(0x02000000)");
item->setData(Qt::UserRole, 0x02000000);
ui->FuncList->addItem(item);
for(int i = 0; i < symbolMap.GetNumSymbols(); i++)
{
if(symbolMap.GetSymbolType(i) & ST_FUNCTION)
{
QListWidgetItem* item = new QListWidgetItem();
item->setText(QString(symbolMap.GetSymbolName(i)) + " ("+ QVariant(symbolMap.GetSymbolSize(i)).toString() +")");
item->setData(Qt::UserRole, symbolMap.GetAddress(i));
ui->FuncList->addItem(item);
}
}
}
void Debugger_Disasm::UpdateBreakpoints()
{
emit UpdateBreakpoints_();
}
void Debugger_Disasm::UpdateBreakpointsGUI()
{
u32 curBpAddr = 0;
QTreeWidgetItem* curItem = ui->breakpointsList->currentItem();
if(curItem)
curBpAddr = ui->breakpointsList->currentItem()->data(0,Qt::UserRole).toInt();
ui->breakpointsList->clear();
EmuThread_LockDraw(true);
for(int i = 0; i < CBreakPoints::GetNumBreakpoints(); i++)
{
u32 addr_ = CBreakPoints::GetBreakpointAddress(i);
if(!CBreakPoints::IsTempBreakPoint(addr_))
{
QTreeWidgetItem* item = new QTreeWidgetItem();
char temp[24];
sprintf(temp,"%08x",addr_);
item->setText(0,temp);
item->setData(0,Qt::UserRole,addr_);
ui->breakpointsList->addTopLevelItem(item);
if(curBpAddr == addr_)
ui->breakpointsList->setCurrentItem(item);
}
}
EmuThread_LockDraw(false);
}
void Debugger_Disasm::on_breakpointsList_itemClicked(QTreeWidgetItem *item, int column)
{
ui->DisasmView->gotoAddr(item->data(column,Qt::UserRole).toInt());
}
void Debugger_Disasm::on_breakpointsList_customContextMenuRequested(const QPoint &pos)
{
QTreeWidgetItem* item = ui->breakpointsList->itemAt(pos);
if(item)
{
breakpointAddr = item->data(0,Qt::UserRole).toInt();
QMenu menu(this);
QAction *removeBP = new QAction(tr("Remove breakpoint"), this);
connect(removeBP, SIGNAL(triggered()), this, SLOT(RemoveBreakpoint()));
menu.addAction(removeBP);
menu.exec( ui->breakpointsList->mapToGlobal(pos));
}
}
void Debugger_Disasm::RemoveBreakpoint()
{
CBreakPoints::RemoveBreakPoint(breakpointAddr);
Update();
}
void Debugger_Disasm::on_clearAllBP_clicked()
{
CBreakPoints::ClearAllBreakPoints();
Update();
}
void Debugger_Disasm::UpdateThread()
{
emit UpdateThread_();
}
void Debugger_Disasm::UpdateThreadGUI()
{
ui->threadList->clear();
EmuThread_LockDraw(true);
std::vector<DebugThreadInfo> threads = GetThreadsInfo();
EmuThread_LockDraw(false);
for(int i = 0; i < threads.size(); i++)
{
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0,QVariant(threads[i].id).toString());
item->setData(0,Qt::UserRole,threads[i].id);
item->setText(1,threads[i].name);
QString status = "";
if(threads[i].status & THREADSTATUS_RUNNING) status += "Running ";
if(threads[i].status & THREADSTATUS_WAIT) status += "Wait ";
if(threads[i].status & THREADSTATUS_READY) status += "Ready ";
if(threads[i].status & THREADSTATUS_SUSPEND) status += "Suspend ";
if(threads[i].status & THREADSTATUS_DORMANT) status += "Dormant ";
if(threads[i].status & THREADSTATUS_DEAD) status += "Dead ";
item->setText(2,status);
char temp[24];
sprintf(temp,"%08x",threads[i].curPC);
item->setText(3,temp);
item->setData(3,Qt::UserRole,threads[i].curPC);
sprintf(temp,"%08x",threads[i].entrypoint);
item->setText(4,temp);
item->setData(4,Qt::UserRole,threads[i].entrypoint);
if(threads[i].isCurrent)
{
for(int j = 0; j < 5; j++)
item->setTextColor(j,Qt::green);
}
ui->threadList->addTopLevelItem(item);
}
}
void Debugger_Disasm::on_threadList_itemClicked(QTreeWidgetItem *item, int column)
{
ui->DisasmView->gotoAddr(item->data(3,Qt::UserRole).toInt());
}
void Debugger_Disasm::on_threadList_customContextMenuRequested(const QPoint &pos)
{
QTreeWidgetItem* item = ui->threadList->itemAt(pos);
if(item)
{
threadRowSelected = item;
QMenu menu(this);
QAction *gotoEntryPoint = new QAction(tr("Go to entry point"), this);
connect(gotoEntryPoint, SIGNAL(triggered()), this, SLOT(GotoThreadEntryPoint()));
menu.addAction(gotoEntryPoint);
QMenu* changeStatus = menu.addMenu("Change status");
QAction *statusRunning = new QAction(tr("Running"), this);
connect(statusRunning, SIGNAL(triggered()), this, SLOT(SetThreadStatusRun()));
changeStatus->addAction(statusRunning);
QAction *statusWait = new QAction(tr("Wait"), this);
connect(statusWait, SIGNAL(triggered()), this, SLOT(SetThreadStatusWait()));
changeStatus->addAction(statusWait);
QAction *statusSuspend = new QAction(tr("Suspend"), this);
connect(statusSuspend, SIGNAL(triggered()), this, SLOT(SetThreadStatusSuspend()));
changeStatus->addAction(statusSuspend);
menu.exec( ui->threadList->mapToGlobal(pos));
}
}
void Debugger_Disasm::GotoThreadEntryPoint()
{
ui->DisasmView->gotoAddr(threadRowSelected->data(4,Qt::UserRole).toInt());
Update();
}
void Debugger_Disasm::SetThreadStatus(ThreadStatus status)
{
EmuThread_LockDraw(true);
__KernelChangeThreadState(threadRowSelected->data(0,Qt::UserRole).toInt(), status);
EmuThread_LockDraw(false);
UpdateThread();
}
void Debugger_Disasm::SetThreadStatusRun()
{
SetThreadStatus(THREADSTATUS_RUNNING);
}
void Debugger_Disasm::SetThreadStatusWait()
{
SetThreadStatus(THREADSTATUS_WAIT);
}
void Debugger_Disasm::SetThreadStatusSuspend()
{
SetThreadStatus(THREADSTATUS_SUSPEND);
}
void Debugger_Disasm::UpdateDisplayList()
{
emit updateDisplayList_();
}
void Debugger_Disasm::UpdateDisplayListGUI()
{
u32 curDlId = 0;
QTreeWidgetItem* curItem = ui->displayList->currentItem();
if(curItem)
curDlId = ui->displayList->currentItem()->data(0,Qt::UserRole).toInt();
ui->displayList->clear();
ui->displayListData->clear();
EmuThread_LockDraw(true);
const std::deque<DisplayList>& dlQueue = gpu->GetDisplayLists();
DisplayList* dl = gpu->GetCurrentDisplayList();
if(dl)
{
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0,QVariant(dl->id).toString());
item->setData(0, Qt::UserRole, dl->id);
switch(dl->status)
{
case PSP_GE_LIST_DONE: item->setText(1,"Done"); break;
case PSP_GE_LIST_QUEUED: item->setText(1,"Queued"); break;
case PSP_GE_LIST_DRAWING: item->setText(1,"Drawing"); break;
case PSP_GE_LIST_STALL_REACHED: item->setText(1,"Stall Reached"); break;
case PSP_GE_LIST_END_REACHED: item->setText(1,"End Reached"); break;
case PSP_GE_LIST_CANCEL_DONE: item->setText(1,"Cancel Done"); break;
default: break;
}
char temp[24];
sprintf(temp,"%08x",dl->startpc);
item->setText(2,temp);
item->setData(2, Qt::UserRole, dl->startpc);
sprintf(temp,"%08x",dl->pc);
item->setText(3,temp);
item->setData(3, Qt::UserRole, dl->pc);
ui->displayList->addTopLevelItem(item);
if(curDlId == dl->id)
{
ui->displayList->setCurrentItem(item);
displayListRowSelected = item;
ShowDLCode();
}
}
for(auto it = dlQueue.begin(); it != dlQueue.end(); ++it)
{
if(dl && it->id == dl->id)
continue;
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0,QVariant(it->id).toString());
item->setData(0, Qt::UserRole, it->id);
switch(it->status)
{
case PSP_GE_LIST_DONE: item->setText(1,"Done"); break;
case PSP_GE_LIST_QUEUED: item->setText(1,"Queued"); break;
case PSP_GE_LIST_DRAWING: item->setText(1,"Drawing"); break;
case PSP_GE_LIST_STALL_REACHED: item->setText(1,"Stall Reached"); break;
case PSP_GE_LIST_END_REACHED: item->setText(1,"End Reached"); break;
case PSP_GE_LIST_CANCEL_DONE: item->setText(1,"Cancel Done"); break;
default: break;
}
char temp[24];
sprintf(temp,"%08x",it->startpc);
item->setText(2,temp);
item->setData(2, Qt::UserRole, it->startpc);
sprintf(temp,"%08x",it->pc);
item->setText(3,temp);
item->setData(3, Qt::UserRole, it->pc);
ui->displayList->addTopLevelItem(item);
if(curDlId == it->id)
{
ui->displayList->setCurrentItem(item);
displayListRowSelected = item;
ShowDLCode();
}
}
EmuThread_LockDraw(false);
}
void Debugger_Disasm::on_displayList_customContextMenuRequested(const QPoint &pos)
{
QTreeWidgetItem* item = ui->displayList->itemAt(pos);
if(item)
{
displayListRowSelected = item;
QMenu menu(this);
QAction *showCode = new QAction(tr("Show code"), this);
connect(showCode, SIGNAL(triggered()), this, SLOT(ShowDLCode()));
menu.addAction(showCode);
menu.exec( ui->displayList->mapToGlobal(pos));
}
}
void Debugger_Disasm::ShowDLCode()
{
ui->displayListData->clear();
ui->displayListData->setColumnWidth(0,70);
u32 startPc = displayListRowSelected->data(2,Qt::UserRole).toInt();
u32 curPc = displayListRowSelected->data(3,Qt::UserRole).toInt();
std::map<int,std::string> data;
FillDisplayListCmd(data, startPc,0);
for(std::map<int,std::string>::iterator it = data.begin(); it != data.end(); it++)
{
QTreeWidgetItem* item = new QTreeWidgetItem();
char temp[24];
sprintf(temp,"%08x",it->first);
item->setText(0,temp);
item->setText(1,it->second.c_str());
if(curPc == it->first)
{
for(int j = 0; j < 2; j++)
item->setTextColor(j, Qt::green);
}
ui->displayListData->addTopLevelItem(item);
}
}
void Debugger_Disasm::FillDisplayListCmd(std::map<int,std::string>& data, u32 pc, u32 prev)
{
u32 curPc = pc;
int debugLimit = 10000; // Anti crash if this code is bugged
while(Memory::IsValidAddress(curPc) && debugLimit > 0)
{
if(data.find(curPc) != data.end())
return;
u32 op = Memory::ReadUnchecked_U32(curPc); //read from memory
u32 cmd = op >> 24;
u32 diff = op ^ gstate.cmdmem[cmd];
char temp[256];
GeDisassembleOp(curPc, op, prev, temp);
data[curPc] = temp;
prev = op;
if(cmd == GE_CMD_JUMP)
{
u32 target = (((gstate.base & 0x00FF0000) << 8) | (op & 0xFFFFFC)) & 0x0FFFFFFF;
FillDisplayListCmd(data, target, prev);
return;
}
else if(cmd == GE_CMD_CALL)
{
u32 target = gstate_c.getRelativeAddress(op & 0xFFFFFF);
FillDisplayListCmd(data, target, prev);
}
else if(cmd == GE_CMD_RET)
{
return;
}
else if(cmd == GE_CMD_FINISH)
{
return;
}
else if(cmd == GE_CMD_END)
{
if(prev >> 24 == GE_CMD_FINISH)
return;
}
curPc += 4;
debugLimit--;
}
}
void Debugger_Disasm::on_nextGPU_clicked()
{
host->SetGPUStep(true);
host->NextGPUStep();
}
void Debugger_Disasm::on_runBtn_clicked()
{
host->SetGPUStep(false);
host->NextGPUStep();
}

View file

@ -1,8 +1,12 @@
#ifndef DEBUGGER_DISASM_H
#define DEBUGGER_DISASM_H
#include "Core/HLE/sceKernelThread.h"
#include "Core/Debugger/DebugInterface.h"
#include "debugger_vfpu.h"
#include <QDialog>
#include <QListWidgetItem>
#include <QTreeWidgetItem>
class MainWindow;
namespace Ui {
@ -17,11 +21,8 @@ public:
explicit Debugger_Disasm(DebugInterface *_cpu, MainWindow* mainWindow_, QWidget *parent = 0);
~Debugger_Disasm();
void SetDebugMode(bool _bDebug);
void Goto(u32 addr);
void ShowVFPU();
void FunctionList();
void GotoInt();
void Go();
void Step();
void StepOver();
@ -32,7 +33,32 @@ public:
void GotoLR();
void UpdateDialog();
void NotifyMapLoaded();
void Update();
void ShowMemory(u32 addr);
void FillFunctions();
void UpdateBreakpoints();
void UpdateThread();
void UpdateDisplayList();
protected:
void showEvent(QShowEvent *);
void FillDisplayListCmd(std::map<int,std::string>& data, u32 pc, u32 prev);
signals:
void updateDisplayList_();
void UpdateBreakpoints_();
void UpdateThread_();
public slots:
void Goto(u32 addr);
void RemoveBreakpoint();
void GotoThreadEntryPoint();
void ShowDLCode();
private slots:
void UpdateDisplayListGUI();
void UpdateBreakpointsGUI();
void UpdateThreadGUI();
void on_GotoPc_clicked();
void on_Go_clicked();
@ -55,12 +81,42 @@ private slots:
void on_DisasmView_customContextMenuRequested(const QPoint &pos);
void on_DisasmView_cellClicked(int row, int column);
void releaseLock();
void on_RegList_customContextMenuRequested(const QPoint &pos);
void on_vfpu_clicked();
void on_FuncList_itemClicked(QListWidgetItem *item);
void on_breakpointsList_itemClicked(QTreeWidgetItem *item, int column);
void on_breakpointsList_customContextMenuRequested(const QPoint &pos);
void on_clearAllBP_clicked();
void on_threadList_itemClicked(QTreeWidgetItem *item, int column);
void on_threadList_customContextMenuRequested(const QPoint &pos);
void SetThreadStatusRun();
void SetThreadStatusWait();
void SetThreadStatusSuspend();
void on_displayList_customContextMenuRequested(const QPoint &pos);
void on_nextGPU_clicked();
void on_runBtn_clicked();
private:
void SetThreadStatus(ThreadStatus status);
Ui::Debugger_Disasm *ui;
DebugInterface* cpu;
MainWindow* mainWindow;
Debugger_VFPU* vfpudlg;
u32 breakpointAddr;
QTreeWidgetItem* threadRowSelected;
QTreeWidgetItem* displayListRowSelected;
};
#endif // DEBUGGER_DISASM_H

View file

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>837</width>
<height>423</height>
<height>492</height>
</rect>
</property>
<property name="focusPolicy">
@ -16,11 +16,16 @@
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QSplitter" name="splitter_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QLabel" name="label">
<widget class="QLabel" name="debugCount">
<property name="text">
<string>Ctr:</string>
</property>
@ -102,6 +107,30 @@
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="vfpu">
<property name="text">
<string>Show VFPU</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
@ -115,17 +144,58 @@
</sizepolicy>
</property>
<attribute name="title">
<string>Tab 1</string>
<string>Regs</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="CtrlRegisterList" name="RegList"/>
<widget class="CtrlRegisterList" name="RegList" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="spacing">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>229</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QScrollBar" name="RegListScroll">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Tab 2</string>
<string>Funcs</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
@ -136,8 +206,8 @@
</widget>
</item>
</layout>
</item>
<item>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
@ -182,6 +252,9 @@
</item>
<item>
<widget class="QPushButton" name="StepOver">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
@ -222,66 +295,274 @@
</layout>
</item>
<item>
<widget class="CtrlDisAsmView" name="DisasmView">
<widget class="CtrlDisAsmView" name="DisasmView" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::ClickFocus</enum>
</property>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="horizontalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOff</enum>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
<property name="selectionBehavior">
<enum>QAbstractItemView::SelectRows</enum>
</property>
<property name="showGrid">
<bool>true</bool>
</property>
<property name="gridStyle">
<enum>Qt::NoPen</enum>
</property>
<property name="rowCount">
<number>5</number>
</property>
<property name="columnCount">
<number>5</number>
</property>
<attribute name="horizontalHeaderVisible">
<bool>false</bool>
</attribute>
<attribute name="verticalHeaderVisible">
<bool>false</bool>
</attribute>
<row/>
<row/>
<row/>
<row/>
<row/>
<column/>
<column/>
<column/>
<column/>
<column/>
</widget>
</item>
<item>
<widget class="QTabWidget" name="tabWidget_2">
<property name="currentIndex">
<number>2</number>
</property>
<widget class="QWidget" name="tab_3">
<attribute name="title">
<string>Breakpoints</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QTreeWidget" name="breakpointsList">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<attribute name="headerDefaultSectionSize">
<number>30</number>
</attribute>
<column>
<property name="text">
<string>Address</string>
</property>
</column>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="clearAllBP">
<property name="text">
<string>Clear All</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_6">
<attribute name="title">
<string>Callstack</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QListWidget" name="callStack"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_4">
<attribute name="title">
<string>Display Lists</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_10">
<item>
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QTreeWidget" name="displayList">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<attribute name="headerDefaultSectionSize">
<number>30</number>
</attribute>
<column>
<property name="text">
<string>Id</string>
</property>
</column>
<column>
<property name="text">
<string>Status</string>
</property>
</column>
<column>
<property name="text">
<string>Start Address</string>
</property>
</column>
<column>
<property name="text">
<string>Current Address</string>
</property>
</column>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QTreeWidget" name="displayListData">
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<property name="columnCount">
<number>2</number>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
<column>
<property name="text">
<string notr="true">1</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">2</string>
</property>
</column>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_9">
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="runBtn">
<property name="text">
<string>Run</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="nextGPU">
<property name="text">
<string>Step</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_5">
<attribute name="title">
<string>Threads</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QTreeWidget" name="threadList">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="itemsExpandable">
<bool>false</bool>
</property>
<property name="expandsOnDoubleClick">
<bool>false</bool>
</property>
<attribute name="headerDefaultSectionSize">
<number>50</number>
</attribute>
<column>
<property name="text">
<string>Id</string>
</property>
</column>
<column>
<property name="text">
<string>Name</string>
</property>
</column>
<column>
<property name="text">
<string>Status</string>
</property>
</column>
<column>
<property name="text">
<string>Current PC</string>
</property>
</column>
<column>
<property name="text">
<string>Entry point</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>CtrlRegisterList</class>
<extends>QListWidget</extends>
<header>ctrlregisterlist.h</header>
<class>CtrlDisAsmView</class>
<extends>QWidget</extends>
<header>ctrldisasmview.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>CtrlDisAsmView</class>
<extends>QTableWidget</extends>
<header>ctrldisasmview.h</header>
<class>CtrlRegisterList</class>
<extends>QWidget</extends>
<header>ctrlregisterlist.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>

110
Qt/debugger_memory.cpp Normal file
View file

@ -0,0 +1,110 @@
#include "debugger_memory.h"
#include "ui_debugger_memory.h"
#include "EmuThread.h"
#include "Core/Debugger/SymbolMap.h"
#include <QTimer>
Debugger_Memory::Debugger_Memory(DebugInterface *_cpu, MainWindow* mainWindow_, QWidget *parent) :
QDialog(parent),
ui(new Ui::Debugger_Memory),
cpu(_cpu),
mainWindow(mainWindow_)
{
ui->setupUi(this);
setWindowTitle(QString("Memory Viewer - ")+cpu->GetName());
ui->memView->setDebugger(_cpu);
}
Debugger_Memory::~Debugger_Memory()
{
delete ui;
}
void Debugger_Memory::showEvent(QShowEvent *)
{
#ifdef Q_WS_X11
// Hack to remove the X11 crash with threaded opengl when opening the first dialog
EmuThread_LockDraw(true);
QTimer::singleShot(100, this, SLOT(releaseLock()));
#endif
}
void Debugger_Memory::releaseLock()
{
EmuThread_LockDraw(false);
}
void Debugger_Memory::Update()
{
ui->memView->redraw();
}
void Debugger_Memory::Goto(u32 addr)
{
show();
ui->memView->gotoAddr(addr & ~3);
}
void Debugger_Memory::on_editAddress_textChanged(const QString &arg1)
{
u32 addr;
sscanf(arg1.toStdString().c_str(),"%08x",&addr);
ui->memView->gotoAddr(addr & ~3);
}
void Debugger_Memory::on_normalBtn_clicked()
{
ui->memView->setMode(MV_NORMAL);
}
void Debugger_Memory::on_symbolsBtn_clicked()
{
ui->memView->setMode(MV_SYMBOLS);
}
void Debugger_Memory::on_memView_customContextMenuRequested(const QPoint &pos)
{
ui->memView->contextMenu(pos);
}
void Debugger_Memory::NotifyMapLoaded()
{
QListWidgetItem* item = new QListWidgetItem();
item->setText("(0x80000000)");
item->setData(Qt::UserRole, 0x80000000);
ui->symbols->addItem(item);
for(int i = 0; i < symbolMap.GetNumSymbols(); i++)
{
if(symbolMap.GetSymbolType(i) & ST_DATA)
{
QListWidgetItem* item = new QListWidgetItem();
item->setText(QString(symbolMap.GetSymbolName(i)) + " ("+ QVariant(symbolMap.GetSymbolSize(i)).toString() +")");
item->setData(Qt::UserRole, symbolMap.GetAddress(i));
ui->symbols->addItem(item);
}
}
ui->regions->clear();
/*
for (int i = 0; i < cpu->getMemMap()->numRegions; i++)
{
int n = ComboBox_AddString(lb,cpu->getMemMap()->regions[i].name);
ComboBox_SetItemData(lb,n,cpu->getMemMap()->regions[i].start);
}
*/
}
void Debugger_Memory::on_regions_currentIndexChanged(int index)
{
ui->memView->gotoAddr(ui->regions->itemData(index,Qt::UserRole).toInt());
}
void Debugger_Memory::on_symbols_itemClicked(QListWidgetItem *item)
{
ui->memView->gotoAddr(item->data(Qt::UserRole).toInt());
}

49
Qt/debugger_memory.h Normal file
View file

@ -0,0 +1,49 @@
#ifndef DEBUGGER_MEMORY_H
#define DEBUGGER_MEMORY_H
#include "Core/Debugger/DebugInterface.h"
#include <QDialog>
#include <QListWidgetItem>
class MainWindow;
namespace Ui {
class Debugger_Memory;
}
class Debugger_Memory : public QDialog
{
Q_OBJECT
public:
explicit Debugger_Memory(DebugInterface *_cpu, MainWindow* mainWindow_, QWidget *parent = 0);
~Debugger_Memory();
void Update();
void Goto(u32 addr);
void NotifyMapLoaded();
public slots:
void releaseLock();
protected:
void showEvent(QShowEvent *);
private slots:
void on_editAddress_textChanged(const QString &arg1);
void on_normalBtn_clicked();
void on_symbolsBtn_clicked();
void on_memView_customContextMenuRequested(const QPoint &pos);
void on_regions_currentIndexChanged(int index);
void on_symbols_itemClicked(QListWidgetItem *item);
private:
Ui::Debugger_Memory *ui;
DebugInterface* cpu;
MainWindow* mainWindow;
};
#endif // DEBUGGER_MEMORY_H

92
Qt/debugger_memory.ui Normal file
View file

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Debugger_Memory</class>
<widget class="QDialog" name="Debugger_Memory">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>611</width>
<height>384</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Goto:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="editAddress"/>
</item>
<item>
<widget class="QComboBox" name="regions"/>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Mode</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QPushButton" name="normalBtn">
<property name="text">
<string>Normal</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="symbolsBtn">
<property name="text">
<string>Symbols</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QListWidget" name="symbols"/>
</item>
<item>
<widget class="CtrlMemView" name="memView" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>CtrlMemView</class>
<extends>QWidget</extends>
<header>ctrlmemview.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

55
Qt/debugger_vfpu.cpp Normal file
View file

@ -0,0 +1,55 @@
#include "debugger_vfpu.h"
#include "ui_debugger_vfpu.h"
#include "EmuThread.h"
#include "mainwindow.h"
#include <QTimer>
Debugger_VFPU::Debugger_VFPU(DebugInterface *_cpu, MainWindow* mainWindow_, QWidget *parent) :
QDialog(parent),
ui(new Ui::Debugger_VFPU),
cpu(_cpu),
mainWindow(mainWindow_)
{
ui->setupUi(this);
setWindowTitle(QString("VFPU - ")+cpu->GetName());
ui->vfpu->setCPU(_cpu);
}
Debugger_VFPU::~Debugger_VFPU()
{
delete ui;
}
void Debugger_VFPU::showEvent(QShowEvent *)
{
#ifdef Q_WS_X11
// Hack to remove the X11 crash with threaded opengl when opening the first dialog
EmuThread_LockDraw(true);
QTimer::singleShot(100, this, SLOT(releaseLock()));
#endif
}
void Debugger_VFPU::releaseLock()
{
EmuThread_LockDraw(false);
}
void Debugger_VFPU::Update()
{
ui->vfpu->redraw();
}
void Debugger_VFPU::Goto(u32 addr)
{
show();
mainWindow->GetDialogMemory()->Goto(addr & ~3);
}
void Debugger_VFPU::on_comboBox_currentIndexChanged(int index)
{
ui->vfpu->setMode(index);
}

35
Qt/debugger_vfpu.h Normal file
View file

@ -0,0 +1,35 @@
#ifndef DEBUGGER_VFPU_H
#define DEBUGGER_VFPU_H
#include "Core/Debugger/DebugInterface.h"
#include <QDialog>
class MainWindow;
namespace Ui {
class Debugger_VFPU;
}
class Debugger_VFPU : public QDialog
{
Q_OBJECT
public:
explicit Debugger_VFPU(DebugInterface *_cpu, MainWindow *mainWindow_, QWidget *parent = 0);
~Debugger_VFPU();
void Update();
void Goto(u32 addr);
protected:
void showEvent(QShowEvent *);
public slots:
void releaseLock();
private slots:
void on_comboBox_currentIndexChanged(int index);
private:
Ui::Debugger_VFPU *ui;
DebugInterface* cpu;
MainWindow* mainWindow;
};
#endif // DEBUGGER_VFPU_H

87
Qt/debugger_vfpu.ui Normal file
View file

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Debugger_VFPU</class>
<widget class="QDialog" name="Debugger_VFPU">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="comboBox">
<item>
<property name="text">
<string>Float</string>
</property>
</item>
<item>
<property name="text">
<string>HalfFloat</string>
</property>
</item>
<item>
<property name="text">
<string>Hex</string>
</property>
</item>
<item>
<property name="text">
<string>Bytes</string>
</property>
</item>
<item>
<property name="text">
<string>Shorts</string>
</property>
</item>
<item>
<property name="text">
<string>Ints</string>
</property>
</item>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="CtrlVfpuView" name="vfpu" native="true">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>CtrlVfpuView</class>
<extends>QWidget</extends>
<header>ctrlvfpuview.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View file

@ -9,6 +9,115 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CtrlDisAsmView</name>
<message>
<location filename="../ctrldisasmview.cpp" line="106"/>
<source>Copy &amp;address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="110"/>
<source>Copy instruction (&amp;hex)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="114"/>
<source>Copy instruction (&amp;disasm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="120"/>
<source>&amp;Run to here</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="124"/>
<source>&amp;Set Next Statement</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="128"/>
<source>&amp;Toggle breakpoint</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="132"/>
<source>&amp;Follow branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="142"/>
<source>Go to in &amp;Memory View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="152"/>
<source>&amp;Rename function...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="240"/>
<source>New function name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="241"/>
<source>New function name :</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CtrlMemView</name>
<message>
<location filename="../ctrlmemview.cpp" line="215"/>
<source>Go to in &amp;disasm</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlmemview.cpp" line="221"/>
<source>&amp;Copy value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlmemview.cpp" line="225"/>
<source>Dump...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CtrlRegisterList</name>
<message>
<location filename="../ctrlregisterlist.cpp" line="274"/>
<source>Go to in &amp;memory view</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="278"/>
<source>Go to in &amp;disasm</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="284"/>
<source>&amp;Copy value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="288"/>
<source>C&amp;hange...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="352"/>
<source>Set new value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="353"/>
<source>Set new value :</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_Disasm</name>
<message>
@ -17,65 +126,243 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="25"/>
<location filename="../debugger_disasm.ui" line="30"/>
<source>Ctr:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="38"/>
<location filename="../debugger_disasm.ui" line="43"/>
<source>&amp;Go to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="73"/>
<location filename="../debugger_disasm.ui" line="78"/>
<source>&amp;PC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="86"/>
<location filename="../debugger_disasm.ui" line="91"/>
<source>&amp;LR</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="118"/>
<source>Tab 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="128"/>
<source>Tab 2</source>
<source>Show VFPU</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="153"/>
<location filename="../debugger_disasm.ui" line="147"/>
<source>Regs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="198"/>
<source>Funcs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="223"/>
<source>&amp;Go</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="166"/>
<location filename="../debugger_disasm.ui" line="236"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="179"/>
<location filename="../debugger_disasm.ui" line="249"/>
<source>Step &amp;Into</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="192"/>
<location filename="../debugger_disasm.ui" line="265"/>
<source>Step &amp;Over</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="205"/>
<location filename="../debugger_disasm.ui" line="278"/>
<source>S&amp;kip</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="218"/>
<location filename="../debugger_disasm.ui" line="291"/>
<source>Next &amp;HLE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="320"/>
<source>Breakpoints</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="339"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="362"/>
<source>Clear All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="372"/>
<source>Callstack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="382"/>
<source>Display Lists</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="408"/>
<location filename="../debugger_disasm.ui" line="519"/>
<source>Id</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="413"/>
<location filename="../debugger_disasm.ui" line="529"/>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="418"/>
<source>Start Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="423"/>
<source>Current Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="476"/>
<source>Run</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="483"/>
<source>Step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="497"/>
<source>Threads</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="524"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="534"/>
<source>Current PC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="539"/>
<source>Entry point</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="401"/>
<source>Remove breakpoint</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="480"/>
<source>Go to entry point</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="486"/>
<source>Running</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="490"/>
<source>Wait</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="494"/>
<source>Suspend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="626"/>
<source>Show code</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_Memory</name>
<message>
<location filename="../debugger_memory.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="22"/>
<source>Goto:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="35"/>
<source>Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="41"/>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="48"/>
<source>Symbols</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_VFPU</name>
<message>
<location filename="../debugger_vfpu.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="23"/>
<source>Float</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="28"/>
<source>HalfFloat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="33"/>
<source>Hex</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="38"/>
<source>Bytes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="43"/>
<source>Shorts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="48"/>
<source>Ints</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GamePadDialog</name>
@ -205,340 +492,360 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="79"/>
<location filename="../mainwindow.ui" line="81"/>
<source>Debu&amp;g</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="91"/>
<location filename="../mainwindow.ui" line="95"/>
<source>&amp;Options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="95"/>
<location filename="../mainwindow.ui" line="99"/>
<source>&amp;Log Levels</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="99"/>
<location filename="../mainwindow.ui" line="103"/>
<source>G3D</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="108"/>
<location filename="../mainwindow.ui" line="112"/>
<source>HLE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="117"/>
<location filename="../mainwindow.ui" line="121"/>
<source>Default</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="131"/>
<location filename="../mainwindow.ui" line="135"/>
<source>Zoom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="140"/>
<location filename="../mainwindow.ui" line="144"/>
<source>Language</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="167"/>
<location filename="../mainwindow.ui" line="172"/>
<source>&amp;Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="182"/>
<location filename="../mainwindow.ui" line="187"/>
<source>&amp;Open...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="187"/>
<location filename="../mainwindow.ui" line="192"/>
<source>&amp;Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="192"/>
<location filename="../mainwindow.ui" line="197"/>
<source>-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="197"/>
<location filename="../mainwindow.ui" line="202"/>
<source>Quickload state</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="200"/>
<location filename="../mainwindow.ui" line="205"/>
<source>F4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="205"/>
<location filename="../mainwindow.ui" line="210"/>
<source>Quicksave state</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="208"/>
<location filename="../mainwindow.ui" line="213"/>
<source>F2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="213"/>
<location filename="../mainwindow.ui" line="218"/>
<source>&amp;Load State File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="218"/>
<location filename="../mainwindow.ui" line="223"/>
<source>&amp;Save State File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="223"/>
<location filename="../mainwindow.ui" line="228"/>
<source>E&amp;xit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="228"/>
<location filename="../mainwindow.ui" line="233"/>
<source>&amp;Run</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="231"/>
<location filename="../mainwindow.ui" line="236"/>
<source>F7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="236"/>
<location filename="../mainwindow.ui" line="241"/>
<source>&amp;Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="239"/>
<location filename="../mainwindow.ui" line="244"/>
<source>F8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="244"/>
<location filename="../mainwindow.ui" line="249"/>
<source>R&amp;eset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="252"/>
<location filename="../mainwindow.ui" line="257"/>
<source>&amp;Interpreter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="260"/>
<location filename="../mainwindow.ui" line="265"/>
<source>&amp;Slightly Faster Interpreter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="268"/>
<location filename="../mainwindow.ui" line="273"/>
<source>&amp;Dynarec</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="276"/>
<location filename="../mainwindow.ui" line="281"/>
<source>Load &amp;Map File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="284"/>
<location filename="../mainwindow.ui" line="289"/>
<source>&amp;Save Map File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="292"/>
<location filename="../mainwindow.ui" line="297"/>
<source>&amp;Reset Symbol Table</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="300"/>
<location filename="../mainwindow.ui" line="302"/>
<source>&amp;Disassembly</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="303"/>
<location filename="../mainwindow.ui" line="305"/>
<source>Ctrl+D</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="311"/>
<location filename="../mainwindow.ui" line="313"/>
<source>&amp;Log Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="314"/>
<location filename="../mainwindow.ui" line="316"/>
<source>Ctrl+L</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="322"/>
<location filename="../mainwindow.ui" line="321"/>
<source>Memory &amp;View...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="325"/>
<location filename="../mainwindow.ui" line="324"/>
<source>Ctrl+M</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="330"/>
<location filename="../mainwindow.ui" line="329"/>
<source>Keyboard &amp;Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="335"/>
<location filename="../mainwindow.ui" line="334"/>
<source>&amp;Toggle Full Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="338"/>
<location filename="../mainwindow.ui" line="337"/>
<source>F12</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="346"/>
<location filename="../mainwindow.ui" line="345"/>
<source>&amp;Buffered Rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="349"/>
<location filename="../mainwindow.ui" line="348"/>
<source>F5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="357"/>
<location filename="../mainwindow.ui" line="356"/>
<source>&amp;Hardware Transform</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="360"/>
<location filename="../mainwindow.ui" line="359"/>
<source>F6</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="368"/>
<location filename="../mainwindow.ui" line="367"/>
<source>&amp;Linear Filtering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="376"/>
<location filename="../mainwindow.ui" line="375"/>
<source>&amp;Wireframe (experimental)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="384"/>
<location filename="../mainwindow.ui" line="383"/>
<source>&amp;Display Raw Framebuffer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="392"/>
<location filename="../mainwindow.ui" line="391"/>
<source>&amp;Show Debug Statistics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="400"/>
<location filename="../mainwindow.ui" line="399"/>
<source>Screen &amp;1x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="403"/>
<location filename="../mainwindow.ui" line="402"/>
<source>Ctrl+1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="411"/>
<location filename="../mainwindow.ui" line="410"/>
<source>Screen &amp;2x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="414"/>
<location filename="../mainwindow.ui" line="413"/>
<source>Ctrl+2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="422"/>
<location filename="../mainwindow.ui" line="421"/>
<source>Screen &amp;3x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="425"/>
<location filename="../mainwindow.ui" line="424"/>
<source>Ctrl+3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="433"/>
<location filename="../mainwindow.ui" line="432"/>
<source>Screen &amp;4x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="436"/>
<location filename="../mainwindow.ui" line="435"/>
<source>Ctrl+4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="444"/>
<location filename="../mainwindow.ui" line="443"/>
<source>&amp;Fast Memory (dynarec, unstable)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="452"/>
<location filename="../mainwindow.ui" line="451"/>
<source>&amp;Ignore illegal reads/writes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="457"/>
<location filename="../mainwindow.ui" line="456"/>
<source>&amp;Go to http://www.ppsspp.org/</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="462"/>
<location filename="../mainwindow.ui" line="461"/>
<source>&amp;About PPSSPP...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="467"/>
<location filename="../mainwindow.ui" line="466"/>
<source>&amp;Use VBO</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="475"/>
<location filename="../mainwindow.ui" line="507"/>
<location filename="../mainwindow.ui" line="539"/>
<location filename="../mainwindow.ui" line="474"/>
<location filename="../mainwindow.ui" line="506"/>
<location filename="../mainwindow.ui" line="538"/>
<source>Debug</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="483"/>
<location filename="../mainwindow.ui" line="515"/>
<location filename="../mainwindow.ui" line="547"/>
<location filename="../mainwindow.ui" line="482"/>
<location filename="../mainwindow.ui" line="514"/>
<location filename="../mainwindow.ui" line="546"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="491"/>
<location filename="../mainwindow.ui" line="531"/>
<location filename="../mainwindow.ui" line="563"/>
<location filename="../mainwindow.ui" line="490"/>
<location filename="../mainwindow.ui" line="530"/>
<location filename="../mainwindow.ui" line="562"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="499"/>
<location filename="../mainwindow.ui" line="523"/>
<location filename="../mainwindow.ui" line="555"/>
<location filename="../mainwindow.ui" line="498"/>
<location filename="../mainwindow.ui" line="522"/>
<location filename="../mainwindow.ui" line="554"/>
<source>Info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="568"/>
<location filename="../mainwindow.ui" line="567"/>
<source>GamePad Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="828"/>
<location filename="../mainwindow.ui" line="572"/>
<source>&amp;Run on load</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="577"/>
<source>D&amp;ump next frame to log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="582"/>
<source>&amp;Vertex Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="587"/>
<source>Memory View Texture...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="843"/>
<source>No translations</source>
<translation type="unfinished"></translation>
</message>

941
Qt/languages/ppsspp_fr.ts Normal file
View file

@ -0,0 +1,941 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="fr_FR">
<context>
<name>Controls</name>
<message>
<location filename="../controls.ui" line="20"/>
<source>Controls</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CtrlDisAsmView</name>
<message>
<location filename="../ctrldisasmview.cpp" line="106"/>
<source>Copy &amp;address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="110"/>
<source>Copy instruction (&amp;hex)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="114"/>
<source>Copy instruction (&amp;disasm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="120"/>
<source>&amp;Run to here</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="124"/>
<source>&amp;Set Next Statement</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="128"/>
<source>&amp;Toggle breakpoint</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="132"/>
<source>&amp;Follow branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="142"/>
<source>Go to in &amp;Memory View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="152"/>
<source>&amp;Rename function...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="240"/>
<source>New function name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="241"/>
<source>New function name :</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CtrlMemView</name>
<message>
<location filename="../ctrlmemview.cpp" line="215"/>
<source>Go to in &amp;disasm</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlmemview.cpp" line="221"/>
<source>&amp;Copy value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlmemview.cpp" line="225"/>
<source>Dump...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CtrlRegisterList</name>
<message>
<location filename="../ctrlregisterlist.cpp" line="274"/>
<source>Go to in &amp;memory view</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="278"/>
<source>Go to in &amp;disasm</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="284"/>
<source>&amp;Copy value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="288"/>
<source>C&amp;hange...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="352"/>
<source>Set new value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="353"/>
<source>Set new value :</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_Disasm</name>
<message>
<location filename="../debugger_disasm.ui" line="17"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="30"/>
<source>Ctr:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="43"/>
<source>&amp;Go to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="78"/>
<source>&amp;PC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="91"/>
<source>&amp;LR</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="128"/>
<source>Show VFPU</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="147"/>
<source>Regs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="198"/>
<source>Funcs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="223"/>
<source>&amp;Go</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="236"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="249"/>
<source>Step &amp;Into</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="265"/>
<source>Step &amp;Over</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="278"/>
<source>S&amp;kip</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="291"/>
<source>Next &amp;HLE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="320"/>
<source>Breakpoints</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="339"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="362"/>
<source>Clear All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="372"/>
<source>Callstack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="382"/>
<source>Display Lists</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="408"/>
<location filename="../debugger_disasm.ui" line="519"/>
<source>Id</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="413"/>
<location filename="../debugger_disasm.ui" line="529"/>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="418"/>
<source>Start Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="423"/>
<source>Current Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="476"/>
<source>Run</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="483"/>
<source>Step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="497"/>
<source>Threads</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="524"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="534"/>
<source>Current PC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="539"/>
<source>Entry point</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="401"/>
<source>Remove breakpoint</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="480"/>
<source>Go to entry point</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="486"/>
<source>Running</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="490"/>
<source>Wait</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="494"/>
<source>Suspend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="626"/>
<source>Show code</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_Memory</name>
<message>
<location filename="../debugger_memory.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="22"/>
<source>Goto:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="35"/>
<source>Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="41"/>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="48"/>
<source>Symbols</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_VFPU</name>
<message>
<location filename="../debugger_vfpu.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="23"/>
<source>Float</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="28"/>
<source>HalfFloat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="33"/>
<source>Hex</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="38"/>
<source>Bytes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="43"/>
<source>Shorts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="48"/>
<source>Ints</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GamePadDialog</name>
<message>
<location filename="../gamepaddialog.ui" line="14"/>
<source>Gamepad Configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="22"/>
<source>GamePad List</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="46"/>
<source>Refresh</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="53"/>
<source>Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="62"/>
<source>Gamepad Values :</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="86"/>
<source>TextLabel</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="98"/>
<source>Assign Gamepad input</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="108"/>
<source> to PSP button/axis</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="118"/>
<source>Assign</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.ui" line="127"/>
<source>Press buttons on your gamePad to verify mapping :</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="134"/>
<location filename="../gamepaddialog.cpp" line="366"/>
<source>&lt;b&gt;No gamepad&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="146"/>
<source>&lt;b&gt;Unknown gamepad&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="287"/>
<source>Buttons</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="301"/>
<location filename="../gamepaddialog.cpp" line="344"/>
<source>Button %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="304"/>
<source>Axes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="310"/>
<source>%1 Neg</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="317"/>
<source>Axes %1 Neg</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="320"/>
<source>%1 Pos</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="327"/>
<source>Axes %1 Pos</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="331"/>
<source>Hats</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="368"/>
<source>&lt;b&gt;Current gamepad: %1&lt;/b&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainWindow</name>
<message>
<location filename="../mainwindow.ui" line="20"/>
<source>PPSSPP</source>
<translation>PPSSPP</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="52"/>
<source>&amp;File</source>
<translation>&amp;Fichier</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="66"/>
<source>&amp;Emulation</source>
<translation>&amp;Emulation</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="81"/>
<source>Debu&amp;g</source>
<translation>Debu&amp;g</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="95"/>
<source>&amp;Options</source>
<translation>&amp;Options</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="99"/>
<source>&amp;Log Levels</source>
<translation>Niveaux de &amp;logs</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="103"/>
<source>G3D</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="112"/>
<source>HLE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="121"/>
<source>Default</source>
<translation>Défaut</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="135"/>
<source>Zoom</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="144"/>
<source>Language</source>
<translation>Langue</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="172"/>
<source>&amp;Help</source>
<translation>&amp;Aide</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="187"/>
<source>&amp;Open...</source>
<translation>&amp;Ouvrir...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="192"/>
<source>&amp;Close</source>
<translation>&amp;Fermer</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="197"/>
<source>-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="202"/>
<source>Quickload state</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="205"/>
<source>F4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="210"/>
<source>Quicksave state</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="213"/>
<source>F2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="218"/>
<source>&amp;Load State File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="223"/>
<source>&amp;Save State File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="228"/>
<source>E&amp;xit</source>
<translation>&amp;Quitter</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="233"/>
<source>&amp;Run</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="236"/>
<source>F7</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="241"/>
<source>&amp;Pause</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="244"/>
<source>F8</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="249"/>
<source>R&amp;eset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="257"/>
<source>&amp;Interpreter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="265"/>
<source>&amp;Slightly Faster Interpreter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="273"/>
<source>&amp;Dynarec</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="281"/>
<source>Load &amp;Map File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="289"/>
<source>&amp;Save Map File...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="297"/>
<source>&amp;Reset Symbol Table</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="302"/>
<source>&amp;Disassembly</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="305"/>
<source>Ctrl+D</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="313"/>
<source>&amp;Log Console</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="316"/>
<source>Ctrl+L</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="321"/>
<source>Memory &amp;View...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="324"/>
<source>Ctrl+M</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="329"/>
<source>Keyboard &amp;Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="334"/>
<source>&amp;Toggle Full Screen</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="337"/>
<source>F12</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="345"/>
<source>&amp;Buffered Rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="348"/>
<source>F5</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="356"/>
<source>&amp;Hardware Transform</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="359"/>
<source>F6</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="367"/>
<source>&amp;Linear Filtering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="375"/>
<source>&amp;Wireframe (experimental)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="383"/>
<source>&amp;Display Raw Framebuffer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="391"/>
<source>&amp;Show Debug Statistics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="399"/>
<source>Screen &amp;1x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="402"/>
<source>Ctrl+1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="410"/>
<source>Screen &amp;2x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="413"/>
<source>Ctrl+2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="421"/>
<source>Screen &amp;3x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="424"/>
<source>Ctrl+3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="432"/>
<source>Screen &amp;4x</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="435"/>
<source>Ctrl+4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="443"/>
<source>&amp;Fast Memory (dynarec, unstable)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="451"/>
<source>&amp;Ignore illegal reads/writes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="456"/>
<source>&amp;Go to http://www.ppsspp.org/</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="461"/>
<source>&amp;About PPSSPP...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="466"/>
<source>&amp;Use VBO</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="474"/>
<location filename="../mainwindow.ui" line="506"/>
<location filename="../mainwindow.ui" line="538"/>
<source>Debug</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="482"/>
<location filename="../mainwindow.ui" line="514"/>
<location filename="../mainwindow.ui" line="546"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="490"/>
<location filename="../mainwindow.ui" line="530"/>
<location filename="../mainwindow.ui" line="562"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="498"/>
<location filename="../mainwindow.ui" line="522"/>
<location filename="../mainwindow.ui" line="554"/>
<source>Info</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="567"/>
<source>GamePad Controls</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="572"/>
<source>&amp;Run on load</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="577"/>
<source>D&amp;ump next frame to log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="582"/>
<source>&amp;Vertex Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="587"/>
<source>Memory View Texture...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="843"/>
<source>No translations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>gamepadMapping</name>
<message>
<location filename="../gamepaddialog.cpp" line="19"/>
<source>Cross</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="20"/>
<source>Circle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="21"/>
<source>Square</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="22"/>
<source>Triangle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="23"/>
<source>Left Trigger</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="24"/>
<source>Right Trigger</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="25"/>
<source>Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="26"/>
<source>Select</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="27"/>
<source>Up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="28"/>
<source>Down</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="29"/>
<source>Left</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="30"/>
<source>Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="32"/>
<source>Home</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="35"/>
<source>Stick left</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="36"/>
<source>Stick right</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="37"/>
<source>Stick up</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../gamepaddialog.cpp" line="38"/>
<source>Stick bottom</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View file

@ -9,6 +9,115 @@
<translation></translation>
</message>
</context>
<context>
<name>CtrlDisAsmView</name>
<message>
<location filename="../ctrldisasmview.cpp" line="106"/>
<source>Copy &amp;address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="110"/>
<source>Copy instruction (&amp;hex)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="114"/>
<source>Copy instruction (&amp;disasm)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="120"/>
<source>&amp;Run to here</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="124"/>
<source>&amp;Set Next Statement</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="128"/>
<source>&amp;Toggle breakpoint</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="132"/>
<source>&amp;Follow branch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="142"/>
<source>Go to in &amp;Memory View</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="152"/>
<source>&amp;Rename function...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="240"/>
<source>New function name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrldisasmview.cpp" line="241"/>
<source>New function name :</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CtrlMemView</name>
<message>
<location filename="../ctrlmemview.cpp" line="215"/>
<source>Go to in &amp;disasm</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlmemview.cpp" line="221"/>
<source>&amp;Copy value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlmemview.cpp" line="225"/>
<source>Dump...</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CtrlRegisterList</name>
<message>
<location filename="../ctrlregisterlist.cpp" line="274"/>
<source>Go to in &amp;memory view</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="278"/>
<source>Go to in &amp;disasm</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="284"/>
<source>&amp;Copy value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="288"/>
<source>C&amp;hange...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="352"/>
<source>Set new value</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../ctrlregisterlist.cpp" line="353"/>
<source>Set new value :</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_Disasm</name>
<message>
@ -17,65 +126,243 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="25"/>
<location filename="../debugger_disasm.ui" line="30"/>
<source>Ctr:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="38"/>
<location filename="../debugger_disasm.ui" line="43"/>
<source>&amp;Go to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="73"/>
<location filename="../debugger_disasm.ui" line="78"/>
<source>&amp;PC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="86"/>
<location filename="../debugger_disasm.ui" line="91"/>
<source>&amp;LR</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="118"/>
<source>Tab 1</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="128"/>
<source>Tab 2</source>
<source>Show VFPU</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="153"/>
<location filename="../debugger_disasm.ui" line="147"/>
<source>Regs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="198"/>
<source>Funcs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="223"/>
<source>&amp;Go</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="166"/>
<location filename="../debugger_disasm.ui" line="236"/>
<source>Stop</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="179"/>
<location filename="../debugger_disasm.ui" line="249"/>
<source>Step &amp;Into</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="192"/>
<location filename="../debugger_disasm.ui" line="265"/>
<source>Step &amp;Over</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="205"/>
<location filename="../debugger_disasm.ui" line="278"/>
<source>S&amp;kip</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="218"/>
<location filename="../debugger_disasm.ui" line="291"/>
<source>Next &amp;HLE</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="320"/>
<source>Breakpoints</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="339"/>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="362"/>
<source>Clear All</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="372"/>
<source>Callstack</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="382"/>
<source>Display Lists</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="408"/>
<location filename="../debugger_disasm.ui" line="519"/>
<source>Id</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="413"/>
<location filename="../debugger_disasm.ui" line="529"/>
<source>Status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="418"/>
<source>Start Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="423"/>
<source>Current Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="476"/>
<source>Run</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="483"/>
<source>Step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="497"/>
<source>Threads</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="524"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="534"/>
<source>Current PC</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.ui" line="539"/>
<source>Entry point</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="401"/>
<source>Remove breakpoint</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="480"/>
<source>Go to entry point</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="486"/>
<source>Running</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="490"/>
<source>Wait</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="494"/>
<source>Suspend</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_disasm.cpp" line="626"/>
<source>Show code</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_Memory</name>
<message>
<location filename="../debugger_memory.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="22"/>
<source>Goto:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="35"/>
<source>Mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="41"/>
<source>Normal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_memory.ui" line="48"/>
<source>Symbols</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Debugger_VFPU</name>
<message>
<location filename="../debugger_vfpu.ui" line="14"/>
<source>Dialog</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="23"/>
<source>Float</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="28"/>
<source>HalfFloat</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="33"/>
<source>Hex</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="38"/>
<source>Bytes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="43"/>
<source>Shorts</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugger_vfpu.ui" line="48"/>
<source>Ints</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GamePadDialog</name>
@ -205,340 +492,360 @@
<translation>&amp;Emulacja</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="79"/>
<location filename="../mainwindow.ui" line="81"/>
<source>Debu&amp;g</source>
<translation>&amp;Debugger</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="91"/>
<location filename="../mainwindow.ui" line="95"/>
<source>&amp;Options</source>
<translation>&amp;Opcje</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="95"/>
<location filename="../mainwindow.ui" line="99"/>
<source>&amp;Log Levels</source>
<translation>P&amp;oziomy logowania</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="99"/>
<location filename="../mainwindow.ui" line="103"/>
<source>G3D</source>
<translation>G3D</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="108"/>
<location filename="../mainwindow.ui" line="112"/>
<source>HLE</source>
<translation>HLE</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="117"/>
<location filename="../mainwindow.ui" line="121"/>
<source>Default</source>
<translation>Domyślne</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="131"/>
<location filename="../mainwindow.ui" line="135"/>
<source>Zoom</source>
<translation>Zoom</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="140"/>
<location filename="../mainwindow.ui" line="144"/>
<source>Language</source>
<translation>Język</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="167"/>
<location filename="../mainwindow.ui" line="172"/>
<source>&amp;Help</source>
<translation>Pomo&amp;c</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="182"/>
<location filename="../mainwindow.ui" line="187"/>
<source>&amp;Open...</source>
<translation>&amp;Otwórz...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="187"/>
<location filename="../mainwindow.ui" line="192"/>
<source>&amp;Close</source>
<translation>&amp;Zamknij</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="192"/>
<location filename="../mainwindow.ui" line="197"/>
<source>-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="197"/>
<location filename="../mainwindow.ui" line="202"/>
<source>Quickload state</source>
<translation>Wczytaj stan</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="200"/>
<location filename="../mainwindow.ui" line="205"/>
<source>F4</source>
<translation>F4</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="205"/>
<location filename="../mainwindow.ui" line="210"/>
<source>Quicksave state</source>
<translation>Zapisz stan</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="208"/>
<location filename="../mainwindow.ui" line="213"/>
<source>F2</source>
<translation>F2</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="213"/>
<location filename="../mainwindow.ui" line="218"/>
<source>&amp;Load State File...</source>
<translation>&amp;Wczytaj plik stanu...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="218"/>
<location filename="../mainwindow.ui" line="223"/>
<source>&amp;Save State File...</source>
<translation>&amp;Zapisz plik stanu...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="223"/>
<location filename="../mainwindow.ui" line="228"/>
<source>E&amp;xit</source>
<translation>Wyj&amp;</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="228"/>
<location filename="../mainwindow.ui" line="233"/>
<source>&amp;Run</source>
<translation>&amp;Uruchom</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="231"/>
<location filename="../mainwindow.ui" line="236"/>
<source>F7</source>
<translation>F7</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="236"/>
<location filename="../mainwindow.ui" line="241"/>
<source>&amp;Pause</source>
<translation>&amp;Pauza</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="239"/>
<location filename="../mainwindow.ui" line="244"/>
<source>F8</source>
<translation>F8</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="244"/>
<location filename="../mainwindow.ui" line="249"/>
<source>R&amp;eset</source>
<translation>&amp;Reset</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="252"/>
<location filename="../mainwindow.ui" line="257"/>
<source>&amp;Interpreter</source>
<translation>&amp;Interpreter</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="260"/>
<location filename="../mainwindow.ui" line="265"/>
<source>&amp;Slightly Faster Interpreter</source>
<translation>&amp;Szybszy interpreter</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="268"/>
<location filename="../mainwindow.ui" line="273"/>
<source>&amp;Dynarec</source>
<translation>R&amp;ekompilacja (Dynarec)</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="276"/>
<location filename="../mainwindow.ui" line="281"/>
<source>Load &amp;Map File...</source>
<translation>&amp;Wczytaj plik mapy...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="284"/>
<location filename="../mainwindow.ui" line="289"/>
<source>&amp;Save Map File...</source>
<translation>&amp;Zapisz plik mapy...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="292"/>
<location filename="../mainwindow.ui" line="297"/>
<source>&amp;Reset Symbol Table</source>
<translation>Zresetuj &amp;tablicę symboli</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="300"/>
<location filename="../mainwindow.ui" line="302"/>
<source>&amp;Disassembly</source>
<translation>&amp;Dekompiluj</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="303"/>
<location filename="../mainwindow.ui" line="305"/>
<source>Ctrl+D</source>
<translation>Ctrl+D</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="311"/>
<location filename="../mainwindow.ui" line="313"/>
<source>&amp;Log Console</source>
<translation>&amp;Konsola logowania</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="314"/>
<location filename="../mainwindow.ui" line="316"/>
<source>Ctrl+L</source>
<translation>Ctrl+L</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="322"/>
<location filename="../mainwindow.ui" line="321"/>
<source>Memory &amp;View...</source>
<translation>Widok &amp;pamięci...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="325"/>
<location filename="../mainwindow.ui" line="324"/>
<source>Ctrl+M</source>
<translation>Ctrl+M</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="330"/>
<location filename="../mainwindow.ui" line="329"/>
<source>Keyboard &amp;Controls</source>
<translation>Ustawienia &amp;klawiatury</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="335"/>
<location filename="../mainwindow.ui" line="334"/>
<source>&amp;Toggle Full Screen</source>
<translation>&amp;Pełny ekran</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="338"/>
<location filename="../mainwindow.ui" line="337"/>
<source>F12</source>
<translation>F12</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="346"/>
<location filename="../mainwindow.ui" line="345"/>
<source>&amp;Buffered Rendering</source>
<translation>&amp;Buffered rendering</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="349"/>
<location filename="../mainwindow.ui" line="348"/>
<source>F5</source>
<translation>F5</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="357"/>
<location filename="../mainwindow.ui" line="356"/>
<source>&amp;Hardware Transform</source>
<translation>&amp;Hardware Transform</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="360"/>
<location filename="../mainwindow.ui" line="359"/>
<source>F6</source>
<translation>F6</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="368"/>
<location filename="../mainwindow.ui" line="367"/>
<source>&amp;Linear Filtering</source>
<translation>&amp;Linear Filtering</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="376"/>
<location filename="../mainwindow.ui" line="375"/>
<source>&amp;Wireframe (experimental)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="384"/>
<location filename="../mainwindow.ui" line="383"/>
<source>&amp;Display Raw Framebuffer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="392"/>
<location filename="../mainwindow.ui" line="391"/>
<source>&amp;Show Debug Statistics</source>
<translation>Pokaż &amp;statystyki emulacji</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="400"/>
<location filename="../mainwindow.ui" line="399"/>
<source>Screen &amp;1x</source>
<translation>&amp;1x</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="403"/>
<location filename="../mainwindow.ui" line="402"/>
<source>Ctrl+1</source>
<translation>Ctrl+1</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="411"/>
<location filename="../mainwindow.ui" line="410"/>
<source>Screen &amp;2x</source>
<translation>&amp;2x</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="414"/>
<location filename="../mainwindow.ui" line="413"/>
<source>Ctrl+2</source>
<translation>Ctrl+2</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="422"/>
<location filename="../mainwindow.ui" line="421"/>
<source>Screen &amp;3x</source>
<translation>&amp;3x</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="425"/>
<location filename="../mainwindow.ui" line="424"/>
<source>Ctrl+3</source>
<translation>Ctrl+3</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="433"/>
<location filename="../mainwindow.ui" line="432"/>
<source>Screen &amp;4x</source>
<translation>&amp;4x</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="436"/>
<location filename="../mainwindow.ui" line="435"/>
<source>Ctrl+4</source>
<translation>Ctrl+4</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="444"/>
<location filename="../mainwindow.ui" line="443"/>
<source>&amp;Fast Memory (dynarec, unstable)</source>
<translation>&amp;Fast memory (wymagany Dynarec, niestabilne)</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="452"/>
<location filename="../mainwindow.ui" line="451"/>
<source>&amp;Ignore illegal reads/writes</source>
<translation>&amp;Ignoruj nieprawidłowe odczyty/zapisy</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="457"/>
<location filename="../mainwindow.ui" line="456"/>
<source>&amp;Go to http://www.ppsspp.org/</source>
<translation>&amp;Idź do http://www.ppsspp.org</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="462"/>
<location filename="../mainwindow.ui" line="461"/>
<source>&amp;About PPSSPP...</source>
<translation>&amp;O PPSSPP...</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="467"/>
<location filename="../mainwindow.ui" line="466"/>
<source>&amp;Use VBO</source>
<translation>Użyj &amp;VBO</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="475"/>
<location filename="../mainwindow.ui" line="507"/>
<location filename="../mainwindow.ui" line="539"/>
<location filename="../mainwindow.ui" line="474"/>
<location filename="../mainwindow.ui" line="506"/>
<location filename="../mainwindow.ui" line="538"/>
<source>Debug</source>
<translation>Debug</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="483"/>
<location filename="../mainwindow.ui" line="515"/>
<location filename="../mainwindow.ui" line="547"/>
<location filename="../mainwindow.ui" line="482"/>
<location filename="../mainwindow.ui" line="514"/>
<location filename="../mainwindow.ui" line="546"/>
<source>Warning</source>
<translation>Ostrzeżenia</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="491"/>
<location filename="../mainwindow.ui" line="531"/>
<location filename="../mainwindow.ui" line="563"/>
<location filename="../mainwindow.ui" line="490"/>
<location filename="../mainwindow.ui" line="530"/>
<location filename="../mainwindow.ui" line="562"/>
<source>Error</source>
<translation>Błędy</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="499"/>
<location filename="../mainwindow.ui" line="523"/>
<location filename="../mainwindow.ui" line="555"/>
<location filename="../mainwindow.ui" line="498"/>
<location filename="../mainwindow.ui" line="522"/>
<location filename="../mainwindow.ui" line="554"/>
<source>Info</source>
<translation>Info</translation>
</message>
<message>
<location filename="../mainwindow.ui" line="568"/>
<location filename="../mainwindow.ui" line="567"/>
<source>GamePad Controls</source>
<translation>&amp;Ustawienia pada</translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="828"/>
<location filename="../mainwindow.ui" line="572"/>
<source>&amp;Run on load</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="577"/>
<source>D&amp;ump next frame to log</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="582"/>
<source>&amp;Vertex Cache</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.ui" line="587"/>
<source>Memory View Texture...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../mainwindow.cpp" line="843"/>
<source>No translations</source>
<translation type="unfinished"></translation>
</message>

View file

@ -9,6 +9,7 @@
#include <QDesktopWidget>
#include "Core/MIPS/MIPSDebugInterface.h"
#include "Core/Debugger/SymbolMap.h"
#include "Core/SaveState.h"
#include "Core/System.h"
#include "Core/Config.h"
@ -26,7 +27,8 @@ MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
nextState(CORE_POWERDOWN),
dialogDisasm(0)
dialogDisasm(0),
memoryWindow(0)
{
ui->setupUi(this);
qApp->installEventFilter(this);
@ -36,19 +38,18 @@ MainWindow::MainWindow(QWidget *parent) :
gamePadDlg = new GamePadDialog(&input_state, this);
#endif
SetPlaying(0);
host = new QtHost(this);
w = ui->widget;
w->init(&input_state);
w->resize(pixel_xres, pixel_yres);
w->setMinimumSize(pixel_xres, pixel_yres);
w->setMaximumSize(pixel_xres, pixel_yres);
QObject::connect( w, SIGNAL(doubleClick()), this, SLOT(on_action_OptionsFullScreen_triggered()) );
/*
DialogManager::AddDlg(memoryWindow[0] = new CMemoryDlg(_hInstance, hwndMain, currentDebugMIPS));
DialogManager::AddDlg(vfpudlg = new CVFPUDlg(_hInstance, hwndMain, currentDebugMIPS));
*/
// Update();
createLanguageMenu();
UpdateMenus();
int zoom = g_Config.iWindowZoom;
@ -173,15 +174,16 @@ void NativeInit(int argc, const char *argv[], const char *savegame_directory, co
void MainWindow::SetPlaying(QString text)
{
// TODO
/*if (text == 0)
SetWindowText(hwndMain,programname);
if (text == 0)
{
QString title = "PPSSPP " + QString(PPSSPP_VERSION_STR);
setWindowTitle(title);
}
else
{
char temp[256];
sprintf(temp, "%s - %s", text, programname);
SetWindowText(hwndMain,temp);
}*/
QString title = "PPSSPP " + QString(PPSSPP_VERSION_STR) + "-" + text;
setWindowTitle(title);
}
}
void MainWindow::SetNextState(CoreState state)
@ -205,20 +207,28 @@ void MainWindow::Boot()
dialogDisasm = new Debugger_Disasm(currentDebugMIPS, this, this);
if(g_Config.bShowDebuggerOnLoad)
dialogDisasm->show();
/*
// TODO
memoryWindow[0] = new CMemoryDlg(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS);
DialogManager::AddDlg(memoryWindow[0]);
if (disasmWindow[0])
disasmWindow[0]->NotifyMapLoaded();
if (memoryWindow[0])
memoryWindow[0]->NotifyMapLoaded();*/
if(g_Config.bFullScreen != isFullScreen())
on_action_OptionsFullScreen_triggered();
memoryWindow = new Debugger_Memory(currentDebugMIPS, this, this);
if (dialogDisasm)
dialogDisasm->NotifyMapLoaded();
if (memoryWindow)
memoryWindow->NotifyMapLoaded();
if (nextState == CORE_RUNNING)
on_action_EmulationRun_triggered();
UpdateMenus();
}
void MainWindow::CoreEmitWait(bool isWaiting)
{
// Unlock mutex while core is waiting;
EmuThread_LockDraw(!isWaiting);
}
void MainWindow::UpdateMenus()
{
ui->action_OptionsDisplayRawFramebuffer->setChecked(g_Config.bDisplayFramebuffer);
@ -227,10 +237,14 @@ void MainWindow::UpdateMenus()
ui->action_CPUFastInterpreter->setChecked(g_Config.iCpuCore == CPU_FASTINTERPRETER);
ui->action_CPUDynarec->setChecked(g_Config.iCpuCore == CPU_JIT);
ui->action_OptionsBufferedRendering->setChecked(g_Config.bBufferedRendering);
ui->action_OptionsShowDebugStatistics->setChecked(g_Config.bShowDebugStats);
ui->action_OptionsWireframe->setChecked(g_Config.bDrawWireframe);
ui->action_OptionsHardwareTransform->setChecked(g_Config.bHardwareTransform);
ui->action_OptionsFastMemory->setChecked(g_Config.bFastMemory);
ui->action_OptionsLinearFiltering->setChecked(g_Config.bLinearFiltering);
ui->action_EmulationRunLoad->setChecked(g_Config.bAutoRun);
ui->action_OptionsUseVBO->setChecked(g_Config.bUseVBO);
ui->action_OptionsVertexCache->setChecked(g_Config.bVertexCache);
bool enable = !Core_IsStepping() ? false : true;
ui->action_EmulationRun->setEnabled(g_State.bEmuThreadStarted ? enable : false);
@ -275,6 +289,8 @@ void MainWindow::SetZoom(float zoom) {
pixel_xres = 480 * zoom;
pixel_yres = 272 * zoom;
dp_xres = pixel_xres;
dp_yres = pixel_yres;
w->resize(pixel_xres, pixel_yres);
w->setMinimumSize(pixel_xres, pixel_yres);
@ -299,7 +315,6 @@ void MainWindow::on_action_EmulationRun_triggered()
{
if (g_State.bEmuThreadStarted)
{
/*for (int i=0; i<numCPUs; i++)*/
if(dialogDisasm)
{
dialogDisasm->Stop();
@ -310,34 +325,29 @@ void MainWindow::on_action_EmulationRun_triggered()
void MainWindow::on_action_EmulationStop_triggered()
{
/*for (int i=0; i<numCPUs; i++)*/
if(dialogDisasm)
{
dialogDisasm->Stop();
}
usleep(100); // TODO : UGLY wait for event instead
// This will wait for ppsspp to pause
EmuThread_LockDraw(true);
EmuThread_LockDraw(false);
/*for (int i=0; i<numCPUs; i++)
if (disasmWindow[i])
SendMessage(disasmWindow[i]->GetDlgHandle(), WM_CLOSE, 0, 0);
for (int i=0; i<numCPUs; i++)
if (memoryWindow[i])
SendMessage(memoryWindow[i]->GetDlgHandle(), WM_CLOSE, 0, 0);*/
if(dialogDisasm && dialogDisasm->isVisible())
dialogDisasm->close();
if(memoryWindow && memoryWindow->isVisible())
memoryWindow->close();
EmuThread_StopGame();
SetPlaying(0);
//Update();
Update();
UpdateMenus();
}
void MainWindow::on_action_EmulationPause_triggered()
{
/*for (int i=0; i<numCPUs; i++)*/
if(dialogDisasm)
{
dialogDisasm->Stop();
}
}
void SaveStateActionFinished(bool result, void *userdata)
@ -356,7 +366,6 @@ void SaveStateActionFinished(bool result, void *userdata)
if (g_State.bEmuThreadStarted && mainWindow->GetNextState() == CORE_RUNNING)
{
/*for (int i=0; i<numCPUs; i++)*/
if(mainWindow->GetDialogDisasm())
mainWindow->GetDialogDisasm()->Go();
}
@ -367,7 +376,6 @@ void MainWindow::on_action_FileLoadStateFile_triggered()
if (g_State.bEmuThreadStarted)
{
nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING;
/*for (int i=0; i<numCPUs; i++)*/
if(dialogDisasm)
{
dialogDisasm->Stop();
@ -393,7 +401,6 @@ void MainWindow::on_action_FileSaveStateFile_triggered()
if (g_State.bEmuThreadStarted)
{
nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING;
/*for (int i=0; i<numCPUs; i++)*/
if(dialogDisasm)
{
dialogDisasm->Stop();
@ -418,7 +425,6 @@ void MainWindow::on_action_FileQuickloadState_triggered()
if (g_State.bEmuThreadStarted)
{
nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING;
/*for (int i=0; i<numCPUs; i++)*/
if(dialogDisasm)
{
dialogDisasm->Stop();
@ -432,7 +438,6 @@ void MainWindow::on_action_FileQuickSaveState_triggered()
if (g_State.bEmuThreadStarted)
{
nextState = Core_IsStepping() ? CORE_STEPPING : CORE_RUNNING;
/*for (int i=0; i<numCPUs; i++)*/
if(dialogDisasm)
{
dialogDisasm->Stop();
@ -510,37 +515,47 @@ void MainWindow::on_action_CPUFastInterpreter_triggered()
void MainWindow::on_action_DebugLoadMapFile_triggered()
{
// TODO
/*if (W32Util::BrowseForFileName(true, hWnd, "Load .MAP",0,"Maps\0*.map\0All files\0*.*\0\0","map",fn))
QFileDialog dialog(0,"Load .MAP");
dialog.setFileMode(QFileDialog::ExistingFile);
QStringList filters;
filters << "Maps (*.map)" << "|All files (*.*)";
dialog.setNameFilters(filters);
dialog.setAcceptMode(QFileDialog::AcceptOpen);
QStringList fileNames;
if (dialog.exec())
{
symbolMap.LoadSymbolMap(fn.c_str());
// HLE_PatchFunctions();
for (int i=0; i<numCPUs; i++)
if (disasmWindow[i])
disasmWindow[i]->NotifyMapLoaded();
for (int i=0; i<numCPUs; i++)
if (memoryWindow[i])
memoryWindow[i]->NotifyMapLoaded();
}*/
fileNames = dialog.selectedFiles();
symbolMap.LoadSymbolMap(fileNames[0].toStdString().c_str());
if (dialogDisasm)
dialogDisasm->NotifyMapLoaded();
if (memoryWindow)
memoryWindow->NotifyMapLoaded();
}
}
void MainWindow::on_action_DebugSaveMapFile_triggered()
{
// TODO
/*if (W32Util::BrowseForFileName(false, hWnd, "Save .MAP",0,"Maps\0*.map\0All files\0*.*\0\0","map",fn))
symbolMap.SaveSymbolMap(fn.c_str());*/
QFileDialog dialog(0,"Save .MAP");
dialog.setFileMode(QFileDialog::AnyFile);
dialog.setAcceptMode(QFileDialog::AcceptSave);
QStringList filters;
filters << "Save .MAP (*.map)" << "|All files (*.*)";
dialog.setNameFilters(filters);
QStringList fileNames;
if (dialog.exec())
{
fileNames = dialog.selectedFiles();
symbolMap.SaveSymbolMap(fileNames[0].toStdString().c_str());
}
}
void MainWindow::on_action_DebugResetSymbolTable_triggered()
{
// TODO
/*symbolMap.ResetSymbolMap();
for (int i=0; i<numCPUs; i++)
if (disasmWindow[i])
disasmWindow[i]->NotifyMapLoaded();
for (int i=0; i<numCPUs; i++)
if (memoryWindow[i])
memoryWindow[i]->NotifyMapLoaded();*/
symbolMap.ResetSymbolMap();
if (dialogDisasm)
dialogDisasm->NotifyMapLoaded();
if (memoryWindow)
memoryWindow->NotifyMapLoaded();
}
void MainWindow::on_action_DebugDisassembly_triggered()
@ -551,9 +566,8 @@ void MainWindow::on_action_DebugDisassembly_triggered()
void MainWindow::on_action_DebugMemoryView_triggered()
{
// TODO
/*if (memoryWindow[0])
memoryWindow[0]->Show(true);*/
if (memoryWindow)
memoryWindow->show();
}
void MainWindow::on_action_DebugLog_triggered()
@ -570,12 +584,14 @@ void MainWindow::on_action_OptionsIgnoreIllegalReadsWrites_triggered()
void MainWindow::on_action_OptionsFullScreen_triggered()
{
if(isFullScreen()) {
g_Config.bFullScreen = false;
showNormal();
ui->menubar->setVisible(true);
ui->statusbar->setVisible(true);
SetZoom(g_Config.iWindowZoom);
}
else {
g_Config.bFullScreen = true;
ui->menubar->setVisible(false);
ui->statusbar->setVisible(false);
@ -597,6 +613,8 @@ void MainWindow::on_action_OptionsFullScreen_triggered()
PSP_CoreParameter().outputHeight = height;
pixel_xres = width;
pixel_yres = height;
dp_xres = pixel_xres;
dp_yres = pixel_yres;
if (gpu)
gpu->Resized();
}
@ -638,10 +656,7 @@ void MainWindow::on_action_HelpOpenWebsite_triggered()
void MainWindow::on_action_HelpAbout_triggered()
{
// TODO
/*DialogManager::EnableAll(FALSE);
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
DialogManager::EnableAll(TRUE);*/
// TODO display about
}
void MainWindow::closeEvent(QCloseEvent *event)
@ -879,3 +894,55 @@ void MainWindow::changeEvent(QEvent *event)
}
}
}
void MainWindow::ShowMemory(u32 addr)
{
if(memoryWindow)
memoryWindow->Goto(addr);
}
void MainWindow::Update()
{
}
void MainWindow::on_action_EmulationReset_triggered()
{
if(dialogDisasm)
dialogDisasm->Stop();
EmuThread_LockDraw(true);
EmuThread_LockDraw(false);
if(dialogDisasm)
dialogDisasm->close();
if(memoryWindow)
memoryWindow->close();
EmuThread_StopGame();
EmuThread_StartGame(GetCurrentFilename());
}
void MainWindow::on_action_DebugDumpFrame_triggered()
{
gpu->DumpNextFrame();
}
void MainWindow::on_action_EmulationRunLoad_triggered()
{
g_Config.bAutoRun = !g_Config.bAutoRun;
UpdateMenus();
}
void MainWindow::on_action_OptionsVertexCache_triggered()
{
g_Config.bVertexCache = !g_Config.bVertexCache;
UpdateMenus();
}
void MainWindow::on_action_OptionsUseVBO_triggered()
{
g_Config.bUseVBO = !g_Config.bUseVBO;
UpdateMenus();
}

View file

@ -7,6 +7,7 @@
#include "Core/Core.h"
#include "input/input_state.h"
#include "debugger_disasm.h"
#include "debugger_memory.h"
#include "controls.h"
#include "gamepaddialog.h"
@ -31,13 +32,17 @@ public:
void SetPlaying(QString text);
Debugger_Disasm* GetDialogDisasm() { return dialogDisasm; }
Debugger_Memory* GetDialogMemory() { return memoryWindow; }
CoreState GetNextState() { return nextState; }
void closeEvent(QCloseEvent *event);
void keyPressEvent(QKeyEvent *);
void keyReleaseEvent(QKeyEvent *e);
void ShowMemory(u32 addr);
void Update();
public slots:
void Boot();
void CoreEmitWait(bool);
private slots:
void on_action_FileLoad_triggered();
@ -138,6 +143,16 @@ private slots:
void on_language_changed(QAction *action);
void on_action_EmulationReset_triggered();
void on_action_DebugDumpFrame_triggered();
void on_action_EmulationRunLoad_triggered();
void on_action_OptionsVertexCache_triggered();
void on_action_OptionsUseVBO_triggered();
private:
void loadLanguage(const QString &language);
void createLanguageMenu();
@ -156,6 +171,7 @@ private:
InputState input_state;
Debugger_Disasm *dialogDisasm;
Debugger_Memory *memoryWindow;
Controls* controls;
GamePadDialog* gamePadDlg;
};

View file

@ -70,6 +70,8 @@
<addaction name="separator"/>
<addaction name="action_EmulationReset"/>
<addaction name="separator"/>
<addaction name="action_EmulationRunLoad"/>
<addaction name="separator"/>
<addaction name="action_CPUInterpreter"/>
<addaction name="action_CPUFastInterpreter"/>
<addaction name="action_CPUDynarec"/>
@ -82,6 +84,8 @@
<addaction name="action_DebugSaveMapFile"/>
<addaction name="action_DebugResetSymbolTable"/>
<addaction name="separator"/>
<addaction name="action_DebugDumpFrame"/>
<addaction name="separator"/>
<addaction name="action_DebugDisassembly"/>
<addaction name="action_DebugLog"/>
<addaction name="action_DebugMemoryView"/>
@ -148,6 +152,7 @@
<addaction name="action_OptionsHardwareTransform"/>
<addaction name="action_OptionsLinearFiltering"/>
<addaction name="action_OptionsUseVBO"/>
<addaction name="action_OptionsVertexCache"/>
<addaction name="separator"/>
<addaction name="action_OptionsWireframe"/>
<addaction name="action_OptionsDisplayRawFramebuffer"/>
@ -293,9 +298,6 @@
</property>
</action>
<action name="action_DebugDisassembly">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>&amp;Disassembly</string>
</property>
@ -315,9 +317,6 @@
</property>
</action>
<action name="action_DebugMemoryView">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Memory &amp;View...</string>
</property>
@ -568,6 +567,26 @@
<string>GamePad Controls</string>
</property>
</action>
<action name="action_EmulationRunLoad">
<property name="text">
<string>&amp;Run on load</string>
</property>
</action>
<action name="action_DebugDumpFrame">
<property name="text">
<string>D&amp;ump next frame to log</string>
</property>
</action>
<action name="action_OptionsVertexCache">
<property name="text">
<string>&amp;Vertex Cache</string>
</property>
</action>
<action name="action_DebugMemoryViewTexture">
<property name="text">
<string>Memory View Texture...</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View file

@ -50,14 +50,7 @@ void QtEmuGL::stop_game()
void QtEmuGL::LockDraw(bool value)
{
if(value)
{
thread.gameMutex.lock();
}
else
{
thread.gameMutex.unlock();
}
thread.LockGL(value);
}
void QtEmuGL::resizeEvent(QResizeEvent *evt)
@ -75,3 +68,8 @@ void QtEmuGL::closeEvent(QCloseEvent *evt)
//TODO stopRendering();
QGLWidget::closeEvent(evt);
}
void QtEmuGL::mouseDoubleClickEvent(QMouseEvent *)
{
emit doubleClick();
}

View file

@ -19,6 +19,8 @@ public:
void start_game(QString filename);
void stop_game();
void LockDraw(bool value);
signals:
void doubleClick();
protected:
void initializeGL();
@ -26,6 +28,7 @@ protected:
void resizeEvent(QResizeEvent *evt);
void paintEvent(QPaintEvent *);
void closeEvent(QCloseEvent *evt);
void mouseDoubleClickEvent(QMouseEvent *);
signals:
public slots:

View file

@ -14,5 +14,7 @@
<file>resources/psp_adown.png</file>
<file>resources/psp_aleft.png</file>
<file>resources/psp_aup.png</file>
<file alias="breakpointDisable">resources/stop1.ico</file>
<file alias="breakpoint">resources/icon1.ico</file>
</qresource>
</RCC>

BIN
Qt/resources/icon1.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

BIN
Qt/resources/stop1.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B