X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui%2Fmainwin.cpp;h=ac017ceb4b5e87c5ea573a542e45b2bbb7e5bf1f;hb=178d7f01b40cf8367cfe5b71219e6d20f60f92d4;hp=ea4f8d46156b273f93cc936f04562bcfa36ffdb8;hpb=19cb30261693d5c56c79d87030cfe8e1dc9ca033;p=virtualjaguar diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index ea4f8d4..ac017ce 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -43,6 +43,8 @@ #include "configdialog.h" #include "generaltab.h" #include "version.h" +#include "debug/memorybrowser.h" +#include "debug/cpubrowser.h" #include "dac.h" #include "jaguar.h" @@ -54,10 +56,11 @@ #include "jagstub2bios.h" #include "joystick.h" -#ifdef __GCCWIN32__ +// According to SebRmv, this header isn't seen on Arch Linux either... :-/ +//#ifdef __GCCWIN32__ // Apparently on win32, usleep() is not pulled in by the usual suspects. #include -#endif +//#endif // The way BSNES controls things is by setting a timer with a zero // timeout, sleeping if not emulating anything. Seems there has to be a @@ -71,11 +74,16 @@ // We'll make the VJ core modular so that it doesn't matter what GUI is in // use, we can drop it in anywhere and use it as-is. -MainWin::MainWin(QString filenameToRun): running(true), powerButtonOn(false), +//MainWin::MainWin(QString filenameToRun): running(true), powerButtonOn(false), +MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), showUntunedTankCircuit(true), cartridgeLoaded(false), CDActive(false), //, alpineLoadSuccessful(false), - pauseForFileSelector(false), loadAndGo(false), plzDontKillMyComputer(false) +// pauseForFileSelector(false), loadAndGo(false), plzDontKillMyComputer(false) + pauseForFileSelector(false), loadAndGo(autoRun), plzDontKillMyComputer(false) { + for(int i=0; i<8; i++) + keyHeld[i] = false; + videoWidget = new GLWidget(this); setCentralWidget(videoWidget); setWindowIcon(QIcon(":/res/vj-icon.png")); @@ -90,6 +98,8 @@ MainWin::MainWin(QString filenameToRun): running(true), powerButtonOn(false), aboutWin = new AboutWindow(this); helpWin = new HelpWindow(this); filePickWin = new FilePickerWindow(this); + memBrowseWin = new MemoryBrowserWindow(this); + cpuBrowseWin = new CPUBrowserWindow(this); videoWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -187,10 +197,21 @@ MainWin::MainWin(QString filenameToRun): running(true), powerButtonOn(false), useCDAct->setCheckable(true); connect(useCDAct, SIGNAL(triggered()), this, SLOT(ToggleCDUsage())); - frameAdvanceAct = new QAction(QIcon(":/res/generic.png"), tr("&Frame Advance"), this); + frameAdvanceAct = new QAction(QIcon(":/res/frame-advance.png"), tr("&Frame Advance"), this); frameAdvanceAct->setShortcut(QKeySequence(tr("F7"))); connect(frameAdvanceAct, SIGNAL(triggered()), this, SLOT(FrameAdvance())); + // 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())); + // Misc. connections... connect(filePickWin, SIGNAL(RequestLoad(QString)), this, SLOT(LoadSoftware(QString))); connect(filePickWin, SIGNAL(FilePickerHiding()), this, SLOT(Unpause())); @@ -206,6 +227,13 @@ MainWin::MainWin(QString filenameToRun): running(true), powerButtonOn(false), fileMenu->addAction(configAct); fileMenu->addAction(quitAppAct); + if (vjs.hardwareTypeAlpine) + { + debugMenu = menuBar()->addMenu(tr("&Debug")); + debugMenu->addAction(memBrowseAct); + debugMenu->addAction(cpuBrowseAct); + } + helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(helpAct); helpMenu->addAction(aboutAct); @@ -225,21 +253,18 @@ MainWin::MainWin(QString filenameToRun): running(true), powerButtonOn(false), toolbar->addSeparator(); toolbar->addAction(blurAct); + if (vjs.hardwareTypeAlpine) + { + debugbar = addToolBar(tr("&Debug")); + debugbar->addAction(memBrowseAct); + debugbar->addAction(cpuBrowseAct); + } + // Create status bar statusBar()->showMessage(tr("Ready")); ReadSettings(); - // Set toolbar buttons/menus based on settings read in (sync the UI)... - blurAct->setChecked(vjs.glFilter); - x1Act->setChecked(zoomLevel == 1); - x2Act->setChecked(zoomLevel == 2); - x3Act->setChecked(zoomLevel == 3); -// running = powerAct->isChecked(); - ntscAct->setChecked(vjs.hardwareTypeNTSC); - palAct->setChecked(!vjs.hardwareTypeNTSC); - powerAct->setIcon(vjs.hardwareTypeNTSC ? powerRed : powerGreen); - // Do this in case original size isn't correct (mostly for the first-run case) ResizeMainWindow(); @@ -260,14 +285,17 @@ MainWin::MainWin(QString filenameToRun): running(true), powerButtonOn(false), WriteLog("Virtual Jaguar %s (Last full build was on %s %s)\n", VJ_RELEASE_VERSION, __DATE__, __TIME__); WriteLog("VJ: Initializing jaguar subsystem...\n"); JaguarInit(); + memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Use the stock BIOS - if (!filenameToRun.isEmpty()) + // Check for filename passed in on the command line... +// if (!filenameToRun.isEmpty()) + if (autoRun) { - loadAndGo = true; +// loadAndGo = true; // Attempt to load/run the file the user passed in... - LoadSoftware(filenameToRun); - memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Use the stock BIOS - // Prevent the scanner from running... +// LoadSoftware(filenameToRun); +//// memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Use the stock BIOS + // Prevent the file scanner from running... return; } @@ -292,19 +320,45 @@ MainWin::MainWin(QString filenameToRun): running(true), powerButtonOn(false), // Prevent the scanner from running... return; } - else - memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Otherwise, use the stock BIOS +// else +// memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Otherwise, use the stock BIOS + // Run the scanner if nothing passed in and *not* Alpine mode... + // NB: Really need to look into caching the info scanned in here... filePickWin->ScanSoftwareFolder(allowUnknownSoftware); } + +void MainWin::LoadFile(QString file) +{ + LoadSoftware(file); +} + + +void MainWin::SyncUI(void) +{ + // Set toolbar buttons/menus based on settings read in (sync the UI)... + blurAct->setChecked(vjs.glFilter); + x1Act->setChecked(zoomLevel == 1); + x2Act->setChecked(zoomLevel == 2); + x3Act->setChecked(zoomLevel == 3); +// running = powerAct->isChecked(); + ntscAct->setChecked(vjs.hardwareTypeNTSC); + palAct->setChecked(!vjs.hardwareTypeNTSC); + powerAct->setIcon(vjs.hardwareTypeNTSC ? powerRed : powerGreen); +} + + void MainWin::closeEvent(QCloseEvent * event) { JaguarDone(); - WriteSettings(); +// This should only be done by the config dialog +// WriteSettings(); + WriteUISettings(); event->accept(); // ignore() if can't close for some reason } + void MainWin::keyPressEvent(QKeyEvent * e) { // We ignore the Alt key for now, since it causes problems with the GUI @@ -317,6 +371,7 @@ void MainWin::keyPressEvent(QKeyEvent * e) HandleKeys(e, true); } + void MainWin::keyReleaseEvent(QKeyEvent * e) { // We ignore the Alt key for now, since it causes problems with the GUI @@ -329,12 +384,18 @@ void MainWin::keyReleaseEvent(QKeyEvent * e) HandleKeys(e, false); } + void MainWin::HandleKeys(QKeyEvent * e, bool state) { + enum { P1LEFT = 0, P1RIGHT, P1UP, P1DOWN, P2LEFT, P2RIGHT, P2UP, P2DOWN }; // We kill bad key combos here, before they can get to the emulator... // This also kills the illegal instruction problem that cropped up in Rayman! // May want to do this by killing the old one instead of ignoring the new one... // Seems to work better that way... + +// The problem with this approach is that it causes bad results because it doesn't do +// any checking of previous states. Need to come up with something better because this +// causes problems where the keyboard acts as if it were unresponsive. :-P #if 0 if ((e->key() == vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R]) || (e->key() == vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L]) @@ -342,6 +403,7 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state) || (e->key() == vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U])) return; #else +#if 0 if (e->key() == (int)vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R]) joypad_0_buttons[BUTTON_R] = 0; if (e->key() == (int)vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L]) @@ -359,6 +421,33 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state) joypad_1_buttons[BUTTON_D] = 0; if (e->key() == (int)vjs.p2KeyBindings[BUTTON_D] && joypad_1_buttons[BUTTON_U]) joypad_1_buttons[BUTTON_U] = 0; +#else +//hrm, this still has sticky state problems... Ugh! + // First, settle key states... + if (e->key() == (int)vjs.p1KeyBindings[BUTTON_L]) + keyHeld[P1LEFT] = state; + else if (e->key() == (int)vjs.p1KeyBindings[BUTTON_R]) + keyHeld[P1RIGHT] = state; + else if (e->key() == (int)vjs.p1KeyBindings[BUTTON_U]) + keyHeld[P1UP] = state; + else if (e->key() == (int)vjs.p1KeyBindings[BUTTON_D]) + keyHeld[P1DOWN] = state; + else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_L]) + keyHeld[P2LEFT] = state; + else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_R]) + keyHeld[P2RIGHT] = state; + else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_U]) + keyHeld[P2UP] = state; + else if (e->key() == (int)vjs.p2KeyBindings[BUTTON_D]) + keyHeld[P2DOWN] = state; + + // Next, check for conflicts and bail out if there are any... + if ((keyHeld[P1LEFT] && keyHeld[P1RIGHT]) + || (keyHeld[P1UP] && keyHeld[P1DOWN]) + || (keyHeld[P2LEFT] && keyHeld[P2RIGHT]) + || (keyHeld[P2UP] && keyHeld[P2DOWN])) + return; +#endif #endif // No bad combos exist, let's stuff the emulator key buffers...! @@ -376,10 +465,12 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state) } } + void MainWin::Open(void) { } + void MainWin::Configure(void) { // Call the configuration dialog and update settings @@ -393,12 +484,14 @@ void MainWin::Configure(void) QString before = vjs.ROMPath; QString alpineBefore = vjs.alpineROMPath; QString absBefore = vjs.absROMPath; - bool audioBefore = vjs.audioEnabled; +// bool audioBefore = vjs.audioEnabled; + bool audioBefore = vjs.DSPEnabled; dlg.UpdateVJSettings(); QString after = vjs.ROMPath; QString alpineAfter = vjs.alpineROMPath; QString absAfter = vjs.absROMPath; - bool audioAfter = vjs.audioEnabled; +// bool audioAfter = vjs.audioEnabled; + bool audioAfter = vjs.DSPEnabled; bool allowOld = allowUnknownSoftware; //ick. @@ -435,7 +528,8 @@ void MainWin::Configure(void) } } - // If the "Enable audio" checkbox changed, then we have to re-init the DAC... + // If the "Enable DSP" checkbox changed, then we have to re-init the DAC, + // since it's running in the host audio IRQ... if (audioBefore != audioAfter) { DACDone(); @@ -446,6 +540,7 @@ void MainWin::Configure(void) WriteSettings(); } + // // Here's the main emulator loop // @@ -480,6 +575,7 @@ void MainWin::Timer(void) videoWidget->updateGL(); } + void MainWin::TogglePowerState(void) { powerButtonOn = !powerButtonOn; @@ -524,6 +620,7 @@ void MainWin::TogglePowerState(void) } } + void MainWin::ToggleRunState(void) { running = !running; @@ -542,55 +639,67 @@ void MainWin::ToggleRunState(void) } } + void MainWin::SetZoom100(void) { zoomLevel = 1; ResizeMainWindow(); } + void MainWin::SetZoom200(void) { zoomLevel = 2; ResizeMainWindow(); } + void MainWin::SetZoom300(void) { zoomLevel = 3; ResizeMainWindow(); } + void MainWin::SetNTSC(void) { powerAct->setIcon(powerRed); timer->setInterval(16); vjs.hardwareTypeNTSC = true; ResizeMainWindow(); + WriteSettings(); } + void MainWin::SetPAL(void) { powerAct->setIcon(powerGreen); timer->setInterval(20); vjs.hardwareTypeNTSC = false; ResizeMainWindow(); + WriteSettings(); } + void MainWin::ToggleBlur(void) { vjs.glFilter = !vjs.glFilter; + WriteSettings(); } + void MainWin::ShowAboutWin(void) { aboutWin->show(); } + void MainWin::ShowHelpWin(void) { helpWin->show(); } + void MainWin::InsertCart(void) { // If the emulator is running, we pause it here and unpause it later @@ -604,6 +713,7 @@ void MainWin::InsertCart(void) filePickWin->show(); } + void MainWin::Unpause(void) { // Here we unpause the emulator if it was paused when we went into the file selector @@ -617,6 +727,7 @@ void MainWin::Unpause(void) } } + void MainWin::LoadSoftware(QString file) { running = false; // Prevent bad things(TM) from happening... @@ -644,6 +755,7 @@ void MainWin::LoadSoftware(QString file) } } + void MainWin::ToggleCDUsage(void) { CDActive = !CDActive; @@ -666,6 +778,7 @@ void MainWin::ToggleCDUsage(void) #endif } + void MainWin::FrameAdvance(void) { //printf("Frame Advance...\n"); @@ -674,6 +787,21 @@ void MainWin::FrameAdvance(void) videoWidget->updateGL(); } + +void MainWin::ShowMemoryBrowserWin(void) +{ + memBrowseWin->show(); + memBrowseWin->RefreshContents(); +} + + +void MainWin::ShowCPUBrowserWin(void) +{ + cpuBrowseWin->show(); + cpuBrowseWin->RefreshContents(); +} + + void MainWin::ResizeMainWindow(void) { videoWidget->setFixedSize(zoomLevel * 320, zoomLevel * (vjs.hardwareTypeNTSC ? 240 : 256)); @@ -687,6 +815,9 @@ void MainWin::ResizeMainWindow(void) } } + +#warning "!!! Need to check the window geometry to see if the positions are legal !!!" +// i.e., someone could drag it to another screen, close it, then disconnect that screen void MainWin::ReadSettings(void) { QSettings settings("Underground Software", "Virtual Jaguar"); @@ -727,6 +858,7 @@ WriteLog(" EEPROMPath = \"%s\"\n", vjs.EEPROMPath); WriteLog(" ROMPath = \"%s\"\n", vjs.ROMPath); WriteLog("AlpineROMPath = \"%s\"\n", vjs.alpineROMPath); WriteLog(" absROMPath = \"%s\"\n", vjs.absROMPath); +WriteLog("Pipelined DSP = %s\n", (vjs.usePipelinedDSP ? "ON" : "off")); // Keybindings in order of U, D, L, R, C, B, A, Op, Pa, 0-9, #, * vjs.p1KeyBindings[BUTTON_U] = settings.value("p1k_up", Qt::Key_S).toInt(); @@ -774,6 +906,7 @@ WriteLog(" absROMPath = \"%s\"\n", vjs.absROMPath); vjs.p2KeyBindings[BUTTON_s] = settings.value("p2k_star", Qt::Key_Asterisk).toInt(); } + void MainWin::WriteSettings(void) { QSettings settings("Underground Software", "Virtual Jaguar"); @@ -849,3 +982,14 @@ void MainWin::WriteSettings(void) settings.setValue("p2k_pound", vjs.p2KeyBindings[BUTTON_d]); settings.setValue("p2k_star", vjs.p2KeyBindings[BUTTON_s]); } + + +void MainWin::WriteUISettings(void) +{ + QSettings settings("Underground Software", "Virtual Jaguar"); + settings.setValue("pos", pos()); + settings.setValue("size", size()); + settings.setValue("cartLoadPos", filePickWin->pos()); + + settings.setValue("zoom", zoomLevel); +}