#include "SDL.h"
#include "app.h"
-#include "glwidget.h"
#include "about.h"
-#include "help.h"
-#include "settings.h"
-#include "filepicker.h"
#include "configdialog.h"
+#include "filepicker.h"
+#include "gamepad.h"
#include "generaltab.h"
+#include "glwidget.h"
+#include "help.h"
+#include "settings.h"
#include "version.h"
+#include "debug/cpubrowser.h"
+#include "debug/m68kdasmbrowser.h"
+#include "debug/memorybrowser.h"
+#include "debug/opbrowser.h"
#include "dac.h"
#include "jaguar.h"
aboutWin = new AboutWindow(this);
helpWin = new HelpWindow(this);
filePickWin = new FilePickerWindow(this);
+ memBrowseWin = new MemoryBrowserWindow(this);
+ cpuBrowseWin = new CPUBrowserWindow(this);
+ opBrowseWin = new OPBrowserWindow(this);
+ m68kDasmBrowseWin = new M68KDasmBrowserWindow(this);
videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
frameAdvanceAct->setShortcut(QKeySequence(tr("F7")));
connect(frameAdvanceAct, SIGNAL(triggered()), this, SLOT(FrameAdvance()));
+ fullScreenAct = new QAction(QIcon(":/res/generic.png"), tr("F&ull Screen"), this);
+ fullScreenAct->setShortcut(QKeySequence(tr("F9")));
+ connect(fullScreenAct, SIGNAL(triggered()), this, SLOT(ToggleFullScreen()));
+
+ // Debugger Actions
+ memBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("Memory Browser"), this);
+ memBrowseAct->setStatusTip(tr("Shows the Jaguar memory browser window"));
+// memBrowseAct->setCheckable(true);
+ connect(memBrowseAct, SIGNAL(triggered()), this, SLOT(ShowMemoryBrowserWin()));
+
+ cpuBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("CPU Browser"), this);
+ cpuBrowseAct->setStatusTip(tr("Shows the Jaguar CPU browser window"));
+// memBrowseAct->setCheckable(true);
+ connect(cpuBrowseAct, SIGNAL(triggered()), this, SLOT(ShowCPUBrowserWin()));
+
+ opBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("OP Browser"), this);
+ opBrowseAct->setStatusTip(tr("Shows the Jaguar OP browser window"));
+// memBrowseAct->setCheckable(true);
+ connect(opBrowseAct, SIGNAL(triggered()), this, SLOT(ShowOPBrowserWin()));
+
+ m68kDasmBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("68K Listing Browser"), this);
+ m68kDasmBrowseAct->setStatusTip(tr("Shows the 68K disassembly browser window"));
+// memBrowseAct->setCheckable(true);
+ connect(m68kDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowM68KDasmBrowserWin()));
+
// Misc. connections...
connect(filePickWin, SIGNAL(RequestLoad(QString)), this, SLOT(LoadSoftware(QString)));
connect(filePickWin, SIGNAL(FilePickerHiding()), this, SLOT(Unpause()));
fileMenu->addAction(configAct);
fileMenu->addAction(quitAppAct);
+ if (vjs.hardwareTypeAlpine)
+ {
+ debugMenu = menuBar()->addMenu(tr("&Debug"));
+ debugMenu->addAction(memBrowseAct);
+ debugMenu->addAction(cpuBrowseAct);
+ debugMenu->addAction(opBrowseAct);
+ debugMenu->addAction(m68kDasmBrowseAct);
+ }
+
helpMenu = menuBar()->addMenu(tr("&Help"));
helpMenu->addAction(helpAct);
helpMenu->addAction(aboutAct);
toolbar->addAction(palAct);
toolbar->addSeparator();
toolbar->addAction(blurAct);
+ toolbar->addAction(fullScreenAct);
+
+ if (vjs.hardwareTypeAlpine)
+ {
+ debugbar = addToolBar(tr("&Debug"));
+ debugbar->addAction(memBrowseAct);
+ debugbar->addAction(cpuBrowseAct);
+ debugbar->addAction(opBrowseAct);
+ debugbar->addAction(m68kDasmBrowseAct);
+ }
// Create status bar
statusBar()->showMessage(tr("Ready"));
// Set up timer based loop for animation...
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(Timer()));
-//This is only correct for PAL. !!! FIX !!! [DONE]
-//Use timer->setInterval( int msec ) to fix this on the fly
-// timer->start(20);
+
// This isn't very accurate for NTSC: This is early by 40 msec per frame.
// This is because it's discarding the 0.6666... on the end of the fraction.
// Alas, 6 doesn't divide cleanly into 10. :-P
- timer->start(vjs.hardwareTypeNTSC ? 16 : 20);
+//Should we defer this until SyncUI? Probably.
+//No, it doesn't work, because it uses setInterval() instead of start()...
+// timer->start(vjs.hardwareTypeNTSC ? 16 : 20);
// We set this initially, to make VJ behave somewhat as it would if no
// cart were inserted and the BIOS was set as active...
void MainWin::SyncUI(void)
{
// Set toolbar buttons/menus based on settings read in (sync the UI)...
+ // (Really, this is to sync command line options passed in)
blurAct->setChecked(vjs.glFilter);
x1Act->setChecked(zoomLevel == 1);
x2Act->setChecked(zoomLevel == 2);
ntscAct->setChecked(vjs.hardwareTypeNTSC);
palAct->setChecked(!vjs.hardwareTypeNTSC);
powerAct->setIcon(vjs.hardwareTypeNTSC ? powerRed : powerGreen);
+
+ fullScreen = vjs.fullscreen;
+ SetFullScreen(fullScreen);
+
+ // Reset the timer to be what was set in the command line (if any):
+// timer->setInterval(vjs.hardwareTypeNTSC ? 16 : 20);
+ timer->start(vjs.hardwareTypeNTSC ? 16 : 20);
}
e->accept();
return;
}
-
+/*
+ if (e->key() == Qt::Key_F9)
+ {
+ ToggleFullScreen();
+ return;
+ }
+*/
HandleKeys(e, true);
}
}
+void MainWin::HandleGamepads(void)
+{
+ Gamepad::Update();
+
+ for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++)
+ {
+ if (vjs.p1KeyBindings[i] & (JOY_BUTTON | JOY_HAT))
+ joypad_0_buttons[i] = (Gamepad::GetState(0, vjs.p1KeyBindings[i]) ? 0x01 : 0x00);
+
+ if (vjs.p2KeyBindings[i] & (JOY_BUTTON | JOY_HAT))
+ joypad_1_buttons[i] = (Gamepad::GetState(1, vjs.p2KeyBindings[i]) ? 0x01 : 0x00);
+ }
+}
+
+
void MainWin::Open(void)
{
}
else
{
// Otherwise, run the Jaguar simulation
+ HandleGamepads();
JaguarExecuteNew();
}
}
+void MainWin::SetFullScreen(bool state/*= true*/)
+{
+ if (state)
+ {
+ mainWinPosition = pos();
+// mainWinSize = size();
+ menuBar()->hide();
+ statusBar()->hide();
+ showFullScreen();
+ QRect r = QApplication::desktop()->availableGeometry();
+// double targetWidth = 320.0, targetHeight = (vjs.hardwareTypeNTSC ? 240.0 : 256.0);
+ double targetWidth = (double)VIRTUAL_SCREEN_WIDTH,
+ targetHeight = (double)(vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL);
+ double aspectRatio = targetWidth / targetHeight;
+ // NOTE: Really should check here to see which dimension constrains the other.
+ // Right now, we assume that height is the constraint.
+ int newWidth = (int)(aspectRatio * (double)r.height());
+
+ videoWidget->setFixedSize(newWidth, r.height());
+ showFullScreen();
+ }
+ else
+ {
+ menuBar()->show();
+ statusBar()->show();
+ showNormal();
+ ResizeMainWindow();
+ move(mainWinPosition);
+ }
+
+ // For some reason, this doesn't work: If the emu is paused, toggling from
+ // fullscreen to windowed (& vice versa) shows a white screen.
+// videoWidget->updateGL();
+}
+
+
+void MainWin::ToggleFullScreen(void)
+{
+ fullScreen = !fullScreen;
+ SetFullScreen(fullScreen);
+}
+
+
+void MainWin::ShowMemoryBrowserWin(void)
+{
+ memBrowseWin->show();
+ memBrowseWin->RefreshContents();
+}
+
+
+void MainWin::ShowCPUBrowserWin(void)
+{
+ cpuBrowseWin->show();
+ cpuBrowseWin->RefreshContents();
+}
+
+
+void MainWin::ShowOPBrowserWin(void)
+{
+ opBrowseWin->show();
+ opBrowseWin->RefreshContents();
+}
+
+
+void MainWin::ShowM68KDasmBrowserWin(void)
+{
+ m68kDasmBrowseWin->show();
+ m68kDasmBrowseWin->RefreshContents();
+}
+
+
void MainWin::ResizeMainWindow(void)
{
- videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256));
+// videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256));
+ videoWidget->setFixedSize(zoomLevel * VIRTUAL_SCREEN_WIDTH,
+ zoomLevel * (vjs.hardwareTypeNTSC ? VIRTUAL_SCREEN_HEIGHT_NTSC : VIRTUAL_SCREEN_HEIGHT_PAL));
show();
for(int i=0; i<2; i++)
void MainWin::ReadSettings(void)
{
QSettings settings("Underground Software", "Virtual Jaguar");
- QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();
+ mainWinPosition = settings.value("pos", QPoint(200, 200)).toPoint();
QSize size = settings.value("size", QSize(400, 400)).toSize();
resize(size);
- move(pos);
- pos = settings.value("cartLoadPos", QPoint(200, 200)).toPoint();
+ move(mainWinPosition);
+ QPoint pos = settings.value("cartLoadPos", QPoint(200, 200)).toPoint();
filePickWin->move(pos);
zoomLevel = settings.value("zoom", 2).toInt();