X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=src%2Fgui%2Fmainwin.cpp;h=0fde969e6541e8d4539f232496b72d41bcb8d5e8;hb=5d76d651dfc3aa0a2e810e6b6db2ae8a2e34c53e;hp=b17ef8d91e923b709fa28259a668416602058b4a;hpb=e68c334af31779da826f7876a3af487c2e96c3f6;p=virtualjaguar diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index b17ef8d..0fde969 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -52,10 +52,10 @@ #include "dac.h" #include "jaguar.h" -#include "tom.h" #include "log.h" #include "file.h" #include "jagbios.h" +#include "jagbios2.h" #include "jagcdbios.h" #include "jagstub2bios.h" #include "joystick.h" @@ -78,11 +78,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++) @@ -206,6 +203,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), frameAdvanceAct = new QAction(QIcon(":/res/frame-advance.png"), tr("&Frame Advance"), this); frameAdvanceAct->setShortcut(QKeySequence(tr("F7"))); + frameAdvanceAct->setDisabled(true); connect(frameAdvanceAct, SIGNAL(triggered()), this, SLOT(FrameAdvance())); fullScreenAct = new QAction(QIcon(":/res/fullscreen.png"), tr("F&ull Screen"), this); @@ -248,7 +246,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), fileMenu = menuBar()->addMenu(tr("&Jaguar")); fileMenu->addAction(powerAct); fileMenu->addAction(pauseAct); - fileMenu->addAction(frameAdvanceAct); +// fileMenu->addAction(frameAdvanceAct); fileMenu->addAction(filePickAct); fileMenu->addAction(useCDAct); fileMenu->addAction(configAct); @@ -271,6 +269,7 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), toolbar = addToolBar(tr("Stuff")); toolbar->addAction(powerAct); toolbar->addAction(pauseAct); + toolbar->addAction(frameAdvanceAct); toolbar->addAction(filePickAct); toolbar->addAction(useCDAct); toolbar->addSeparator(); @@ -302,6 +301,21 @@ MainWin::MainWin(bool autoRun): running(true), powerButtonOn(false), // Do this in case original size isn't correct (mostly for the first-run case) ResizeMainWindow(); + // Create our test pattern bitmap + QImage tempImg(":/res/test-pattern.jpg"); + QImage tempImgScaled = tempImg.scaled(VIRTUAL_SCREEN_WIDTH, VIRTUAL_SCREEN_HEIGHT_PAL, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); + + for(uint32_t y=0; ysetChecked(!vjs.hardwareTypeNTSC); powerAct->setIcon(vjs.hardwareTypeNTSC ? powerRed : powerGreen); + fullScreenAct->setChecked(vjs.fullscreen); fullScreen = vjs.fullscreen; SetFullScreen(fullScreen); @@ -530,10 +537,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); } } @@ -664,10 +671,20 @@ void MainWin::TogglePowerState(void) pauseAct->setChecked(false); pauseAct->setDisabled(true); showUntunedTankCircuit = true; + DACPauseAudioThread(); // 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(); + + if (plzDontKillMyComputer) + { + // We have to do it line by line, because the texture pitch is not the + // same as the picture buffer's pitch. + for(uint32_t y=0; yrasterHeight; y++) + { + memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t)); + } + } } else { @@ -703,6 +720,8 @@ void MainWin::ToggleRunState(void) if (!running) { + frameAdvanceAct->setDisabled(false); + for(uint32_t i=0; i<(uint32_t)(videoWidget->textureWidth * 256); i++) { uint32_t pixel = videoWidget->buffer[i]; @@ -713,6 +732,8 @@ void MainWin::ToggleRunState(void) videoWidget->updateGL(); } + else + frameAdvanceAct->setDisabled(true); // Pause/unpause any running/non-running threads... DACPauseAudioThread(!running); @@ -839,22 +860,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 } @@ -864,6 +874,8 @@ void MainWin::FrameAdvance(void) // Execute 1 frame, then exit (only useful in Pause mode) JaguarExecuteNew(); videoWidget->updateGL(); + // Need to execute 1 frames' worth of DSP thread as well :-/ +#warning "!!! Need to execute the DSP thread for 1 frame too !!!" } @@ -872,7 +884,6 @@ void MainWin::SetFullScreen(bool state/*= true*/) if (state) { mainWinPosition = pos(); -// mainWinSize = size(); menuBar()->hide(); statusBar()->hide(); x1Act->setDisabled(true); @@ -883,18 +894,15 @@ void MainWin::SetFullScreen(bool state/*= true*/) // 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); 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. + // 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(r.width(), r.height()); showFullScreen(); } @@ -915,6 +923,8 @@ void MainWin::SetFullScreen(bool state/*= true*/) // For some reason, this doesn't work: If the emu is paused, toggling from // fullscreen to windowed (& vice versa) shows a white screen. + // (It was the ResizeGL() function in GLWidget: it was being called too + // much, causing the buffer to be deleted, remade & cleared.) // videoWidget->updateGL(); } @@ -963,9 +973,18 @@ void MainWin::ShowRISCDasmBrowserWin(void) void MainWin::ResizeMainWindow(void) { -// 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 the test pattern if user requested plzDontKillMyComputer mode + if (!powerButtonOn && plzDontKillMyComputer) + { + for(uint32_t y=0; yrasterHeight; y++) + { + memcpy(videoWidget->buffer + (y * videoWidget->textureWidth), testPattern + (y * VIRTUAL_SCREEN_WIDTH), VIRTUAL_SCREEN_WIDTH * sizeof(uint32_t)); + } + } + show(); for(int i=0; i<2; i++) @@ -1006,15 +1025,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); @@ -1092,6 +1109,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);