X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui%2Fmainwin.cpp;h=0e19488f9eeed77ee44423c24be5a07ded56de65;hb=9d399cea8466c7e4a6a1336dafdc830c4680d977;hp=04ae3baee1048a78618541cff3b0c7e260bb88e1;hpb=9af4fb023287b26dce01a36c65c9e30f56481051;p=virtualjaguar diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index 04ae3ba..0e19488 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -24,7 +24,7 @@ // - Remove SDL dependencies (sound, mainly) from Jaguar core lib // - Fix inconsistency with trailing slashes in paths (eeproms needs one, software doesn't) // -// SFDX CODE: 9XF9TUHFM2359 +// SFDX CODE: S1E9T8H5M23YS // Uncomment this for debugging... //#define DEBUG @@ -56,6 +56,7 @@ #include "log.h" #include "file.h" #include "jagbios.h" +#include "jagbios2.h" #include "jagcdbios.h" #include "jagstub2bios.h" #include "joystick.h" @@ -78,11 +79,8 @@ // 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(bool autoRun): running(true), powerButtonOn(false), showUntunedTankCircuit(true), cartridgeLoaded(false), CDActive(false), - //, alpineLoadSuccessful(false), -// pauseForFileSelector(false), loadAndGo(false), plzDontKillMyComputer(false) pauseForFileSelector(false), loadAndGo(autoRun), plzDontKillMyComputer(false) { for(int i=0; i<8; i++) @@ -175,7 +173,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), palAct->setCheckable(true); connect(palAct, SIGNAL(triggered()), this, SLOT(SetPAL())); - blurAct = new QAction(QIcon(":/res/generic.png"), tr("Blur"), this); + blurAct = new QAction(QIcon(":/res/blur.png"), tr("Blur"), this); blurAct->setStatusTip(tr("Sets OpenGL rendering to GL_NEAREST")); blurAct->setCheckable(true); connect(blurAct, SIGNAL(triggered()), this, SLOT(ToggleBlur())); @@ -208,32 +206,33 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), 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 = new QAction(QIcon(":/res/fullscreen.png"), tr("F&ull Screen"), this); fullScreenAct->setShortcut(QKeySequence(tr("F9"))); + fullScreenAct->setCheckable(true); connect(fullScreenAct, SIGNAL(triggered()), this, SLOT(ToggleFullScreen())); // Debugger Actions - memBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("Memory Browser"), this); + memBrowseAct = new QAction(QIcon(":/res/tool-memory.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 = new QAction(QIcon(":/res/tool-cpu.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 = new QAction(QIcon(":/res/tool-op.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 = new QAction(QIcon(":/res/tool-68k-dis.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())); - riscDasmBrowseAct = new QAction(QIcon(":/res/generic.png"), tr("RISC Listing Browser"), this); + riscDasmBrowseAct = new QAction(QIcon(":/res/tool-risc-dis.png"), tr("RISC Listing Browser"), this); riscDasmBrowseAct->setStatusTip(tr("Shows the RISC disassembly browser window")); // memBrowseAct->setCheckable(true); connect(riscDasmBrowseAct, SIGNAL(triggered()), this, SLOT(ShowRISCDasmBrowserWin())); @@ -318,19 +317,13 @@ MainWin::MainWin(bool autoRun): 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 +// memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Use the stock BIOS + memcpy(jagMemSpace + 0xE00000, (vjs.biosType == BT_K_SERIES ? jaguarBootROM : jaguarBootROM2), 0x20000); // Use the stock BIOS - // Check for filename passed in on the command line... -// if (!filenameToRun.isEmpty()) + // Prevent the file scanner from running if filename passed + // in on the command line... if (autoRun) - { -// 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 file scanner from running... return; - } // Load up the default ROM if in Alpine mode: if (vjs.hardwareTypeAlpine) @@ -353,8 +346,6 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), // Prevent the scanner from running... return; } -// 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... @@ -381,6 +372,7 @@ void MainWin::SyncUI(void) palAct->setChecked(!vjs.hardwareTypeNTSC); powerAct->setIcon(vjs.hardwareTypeNTSC ? powerRed : powerGreen); + fullScreenAct->setChecked(vjs.fullscreen); fullScreen = vjs.fullscreen; SetFullScreen(fullScreen); @@ -402,12 +394,22 @@ void MainWin::closeEvent(QCloseEvent * event) void MainWin::keyPressEvent(QKeyEvent * e) { + // From jaguar.cpp + extern bool startM68KTracing; + // We ignore the Alt key for now, since it causes problems with the GUI if (e->key() == Qt::Key_Alt) { e->accept(); return; } + else if (e->key() == Qt::Key_F11) + { + startM68KTracing = true; + e->accept(); + return; + } + /* if (e->key() == Qt::Key_F9) { @@ -519,10 +521,10 @@ void MainWin::HandleGamepads(void) for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++) { - if (vjs.p1KeyBindings[i] & (JOY_BUTTON | JOY_HAT)) + if (vjs.p1KeyBindings[i] & (JOY_BUTTON | JOY_HAT | JOY_AXIS)) joypad_0_buttons[i] = (Gamepad::GetState(0, vjs.p1KeyBindings[i]) ? 0x01 : 0x00); - if (vjs.p2KeyBindings[i] & (JOY_BUTTON | JOY_HAT)) + if (vjs.p2KeyBindings[i] & (JOY_BUTTON | JOY_HAT | JOY_AXIS)) joypad_1_buttons[i] = (Gamepad::GetState(1, vjs.p2KeyBindings[i]) ? 0x01 : 0x00); } } @@ -614,19 +616,21 @@ void MainWin::Timer(void) if (showUntunedTankCircuit) { // Some machines can't handle this, so we give them the option to disable it. :-) +#warning "!!! Add test pattern here for -z option !!!" +// Actually, should put test pattern in buffer in function below :-P if (!plzDontKillMyComputer) { - // Random hash & trash - // We try to simulate an untuned tank circuit here... :-) - for(uint32_t x=0; xrasterWidth; x++) - { - for(uint32_t y=0; yrasterHeight; y++) + // Random hash & trash + // We try to simulate an untuned tank circuit here... :-) + for(uint32_t x=0; xrasterWidth; x++) { - videoWidget->buffer[(y * videoWidget->textureWidth) + x] - = (rand() & 0xFF) << 8 | (rand() & 0xFF) << 16 | (rand() & 0xFF) << 24; + for(uint32_t y=0; yrasterHeight; y++) + { + videoWidget->buffer[(y * videoWidget->textureWidth) + x] + = (rand() & 0xFF) << 8 | (rand() & 0xFF) << 16 | (rand() & 0xFF) << 24; + } } } - } } else { @@ -655,6 +659,7 @@ void MainWin::TogglePowerState(void) showUntunedTankCircuit = true; // This is just in case the ROM we were playing was in a narrow or wide field mode, // so the untuned tank sim doesn't look wrong. :-) + DACPauseAudioThread(); TOMReset(); } else @@ -680,6 +685,7 @@ void MainWin::TogglePowerState(void) WriteLog("GUI: Resetting Jaguar...\n"); JaguarReset(); + DACPauseAudioThread(false); } } @@ -700,6 +706,9 @@ void MainWin::ToggleRunState(void) videoWidget->updateGL(); } + + // Pause/unpause any running/non-running threads... + DACPauseAudioThread(!running); } @@ -823,22 +832,11 @@ void MainWin::ToggleCDUsage(void) { CDActive = !CDActive; -#if 0 - if (CDActive) - { - powerAct->setDisabled(false); - } - else - { - powerAct->setDisabled(true); - } -#else // Set up the Jaguar CD for execution, otherwise, clear memory if (CDActive) memcpy(jagMemSpace + 0x800000, jaguarCDBootROM, 0x40000); else memset(jagMemSpace + 0x800000, 0xFF, 0x40000); -#endif } @@ -859,8 +857,14 @@ void MainWin::SetFullScreen(bool state/*= true*/) // mainWinSize = size(); menuBar()->hide(); statusBar()->hide(); + x1Act->setDisabled(true); + x2Act->setDisabled(true); + x3Act->setDisabled(true); showFullScreen(); - QRect r = QApplication::desktop()->availableGeometry(); + // This is needed because the fullscreen may happen on a different + // screen than screen 0: + int screenNum = QApplication::desktop()->screenNumber(videoWidget); + QRect r = QApplication::desktop()->availableGeometry(screenNum); // 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); @@ -868,12 +872,22 @@ void MainWin::SetFullScreen(bool state/*= true*/) // 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->offset = (r.width() - newWidth) / 2; + videoWidget->fullscreen = true; + videoWidget->outputWidth = newWidth; - videoWidget->setFixedSize(newWidth, r.height()); +// videoWidget->setFixedSize(newWidth, r.height()); + videoWidget->setFixedSize(r.width(), r.height()); showFullScreen(); } else { + // Reset the video widget to windowed mode + videoWidget->offset = 0; + videoWidget->fullscreen = false; + x1Act->setDisabled(false); + x2Act->setDisabled(false); + x3Act->setDisabled(false); menuBar()->show(); statusBar()->show(); showNormal(); @@ -974,15 +988,13 @@ void MainWin::ReadSettings(void) vjs.glFilter = settings.value("glFilterType", 1).toInt(); vjs.renderType = settings.value("renderType", 0).toInt(); vjs.allowWritesToROM = settings.value("writeROM", false).toBool(); -// strcpy(vjs.jagBootPath, settings.value("JagBootROM", "./bios/[BIOS] Atari Jaguar (USA, Europe).zip").toString().toAscii().data()); -// strcpy(vjs.CDBootPath, settings.value("CDBootROM", "./bios/jagcd.rom").toString().toAscii().data()); + vjs.biosType = settings.value("biosType", BT_M_SERIES).toInt(); strcpy(vjs.EEPROMPath, settings.value("EEPROMs", "./eeproms/").toString().toAscii().data()); strcpy(vjs.ROMPath, settings.value("ROMs", "./software/").toString().toAscii().data()); strcpy(vjs.alpineROMPath, settings.value("DefaultROM", "").toString().toAscii().data()); strcpy(vjs.absROMPath, settings.value("DefaultABS", "").toString().toAscii().data()); + WriteLog("MainWin: Paths\n"); -//WriteLog(" jagBootPath = \"%s\"\n", vjs.jagBootPath); -//WriteLog(" CDBootPath = \"%s\"\n", vjs.CDBootPath); WriteLog(" EEPROMPath = \"%s\"\n", vjs.EEPROMPath); WriteLog(" ROMPath = \"%s\"\n", vjs.ROMPath); WriteLog("AlpineROMPath = \"%s\"\n", vjs.alpineROMPath); @@ -1060,6 +1072,7 @@ void MainWin::WriteSettings(void) settings.setValue("glFilterType", vjs.glFilter); settings.setValue("renderType", vjs.renderType); settings.setValue("writeROM", vjs.allowWritesToROM); + settings.setValue("biosType", vjs.biosType); settings.setValue("JagBootROM", vjs.jagBootPath); settings.setValue("CDBootROM", vjs.CDBootPath); settings.setValue("EEPROMs", vjs.EEPROMPath);