]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/gui/mainwin.cpp
Added more developer friendly stuff to Alpine mode.
[virtualjaguar] / src / gui / mainwin.cpp
index 809b916eaa5c3f461dfc8e8ce4a3d6f2e50192bf..ea44c70a8f295dc0c805cced4bf2ba10e709f01f 100644 (file)
@@ -41,6 +41,7 @@
 #include "generaltab.h"
 #include "version.h"
 
+#include "dac.h"
 #include "jaguar.h"
 #include "tom.h"
 #include "log.h"
 // use, we can drop it in anywhere and use it as-is.
 
 MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit(true),
-       cartridgeLoaded(false), CDActive(false)
+       cartridgeLoaded(false), CDActive(false)//, alpineLoadSuccessful(false)
 {
        videoWidget = new GLWidget(this);
        setCentralWidget(videoWidget);
        setWindowIcon(QIcon(":/res/vj-icon.png"));
 //     setWindowTitle("Virtual Jaguar v2.0.0");
-       setWindowTitle("Virtual Jaguar " VJ_RELEASE_VERSION );
+
+       QString title = QString(tr("Virtual Jaguar " VJ_RELEASE_VERSION ));
+
+       if (vjs.hardwareTypeAlpine)
+               title += QString(tr(" - Alpine Mode"));
+
+       setWindowTitle(title);
 
        aboutWin = new AboutWindow(this);
        filePickWin = new FilePickerWindow(this);
@@ -243,10 +250,30 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit
 #endif
 
        filePickWin->ScanSoftwareFolder(allowUnknownSoftware);
+
+       // Load up the default ROM if in Alpine mode:
+       if (vjs.hardwareTypeAlpine)
+       {
+               bool romLoaded = JaguarLoadFile(vjs.alpineROMPath);
+
+               // If regular load failed, try just a straight file load
+               // (Dev only! I don't want people to start getting lazy with their releases again! :-P)
+               if (!romLoaded)
+                       romLoaded = AlpineLoadFile(vjs.alpineROMPath);
+
+               if (romLoaded)
+                       WriteLog("Alpine Mode: Successfully loaded file \"%s\".\n", vjs.alpineROMPath);
+               else
+                       WriteLog("Alpine Mode: Unable to load file \"%s\"!\n", vjs.alpineROMPath);
+
+               // Attempt to load/run the ABS file...
+               LoadSoftware(vjs.absROMPath);
+       }
 }
 
 void MainWin::closeEvent(QCloseEvent * event)
 {
+       JaguarDone();
        WriteSettings();
        event->accept(); // ignore() if can't close for some reason
 }
@@ -274,20 +301,20 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state)
                || (e->key() == vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U]))
                return;
 #else
-       if (e->key() == vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R])
+       if (e->key() == (int)vjs.p1KeyBindings[BUTTON_L] && joypad_0_buttons[BUTTON_R])
                joypad_0_buttons[BUTTON_R] = 0;
-       if (e->key() == vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L])
+       if (e->key() == (int)vjs.p1KeyBindings[BUTTON_R] && joypad_0_buttons[BUTTON_L])
                joypad_0_buttons[BUTTON_L] = 0;
-       if (e->key() == vjs.p1KeyBindings[BUTTON_U] && joypad_0_buttons[BUTTON_D])
+       if (e->key() == (int)vjs.p1KeyBindings[BUTTON_U] && joypad_0_buttons[BUTTON_D])
                joypad_0_buttons[BUTTON_D] = 0;
-       if (e->key() == vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U])
+       if (e->key() == (int)vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U])
                joypad_0_buttons[BUTTON_U] = 0;
 #endif
 
        // No bad combos exist, let's stuff the emulator key buffers...!
        for(int i=BUTTON_FIRST; i<=BUTTON_LAST; i++)
        {
-               if (e->key() == vjs.p1KeyBindings[i])
+               if (e->key() == (int)vjs.p1KeyBindings[i])
                        joypad_0_buttons[i] = (uint8)state;
        }
 }
@@ -307,8 +334,14 @@ void MainWin::Configure(void)
                return;
 
        QString before = vjs.ROMPath;
+       QString alpineBefore = vjs.alpineROMPath;
+       QString absBefore = vjs.absROMPath;
+       bool audioBefore = vjs.audioEnabled;
        dlg.UpdateVJSettings();
        QString after = vjs.ROMPath;
+       QString alpineAfter = vjs.alpineROMPath;
+       QString absAfter = vjs.absROMPath;
+       bool audioAfter = vjs.audioEnabled;
 
        bool allowOld = allowUnknownSoftware;
        //ick.
@@ -319,6 +352,39 @@ void MainWin::Configure(void)
        if ((before != after) || (allowOld != allowUnknownSoftware))
                filePickWin->ScanSoftwareFolder(allowUnknownSoftware);
 
+       // If the "Alpine" ROM is changed, then let's load it...
+       if (alpineBefore != alpineAfter)
+       {
+               if (!JaguarLoadFile(vjs.alpineROMPath) || !AlpineLoadFile(vjs.alpineROMPath))
+               {
+                       // Oh crap, we couldn't get the file! Alert the media!
+                       QMessageBox msg;
+                       msg.setText(QString(tr("Could not load file \"%1\"!")).arg(vjs.alpineROMPath));
+                       msg.setIcon(QMessageBox::Warning);
+                       msg.exec();
+               }
+       }
+
+       // If the "ABS" ROM is changed, then let's load it...
+       if (absBefore != absAfter)
+       {
+               if (!JaguarLoadFile(vjs.absROMPath))
+               {
+                       // Oh crap, we couldn't get the file! Alert the media!
+                       QMessageBox msg;
+                       msg.setText(QString(tr("Could not load file \"%1\"!")).arg(vjs.absROMPath));
+                       msg.setIcon(QMessageBox::Warning);
+                       msg.exec();
+               }
+       }
+
+       // If the "Enable audio" checkbox changed, then we have to re-init the DAC...
+       if (audioBefore != audioAfter)
+       {
+               DACDone();
+               DACInit();
+       }
+
        // Just in case we crash before a clean exit...
        WriteSettings();
 }
@@ -483,7 +549,7 @@ void MainWin::TogglePowerState(void)
        {
                if (!CDActive)
                {
-                       showUntunedTankCircuit = (cartridgeLoaded ? false : true);
+                       showUntunedTankCircuit = false;//(cartridgeLoaded ? false : true);
                        pauseAct->setChecked(false);
                        pauseAct->setDisabled(!cartridgeLoaded);
                }
@@ -518,25 +584,15 @@ void MainWin::ToggleRunState(void)
 
        if (!running)
        {
-#if 0
-               for(uint32_t x=0; x<videoWidget->rasterWidth; x++)
-                       for(uint32_t y=0; y<videoWidget->rasterHeight; y++)
-                               videoWidget->buffer[(y * videoWidget->textureWidth) + x] = 0x00000000;
-#else
-//             for(uint32_t i=0; i<TOMGetVideoModeWidth() * 256; i++)
-               for(uint32_t i=0; i<videoWidget->textureWidth * 256; i++)
+               for(uint32_t i=0; i<(uint32_t)(videoWidget->textureWidth * 256); i++)
                {
                        uint32_t pixel = backbuffer[i];
-//                     uint8_t b = (pixel >> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF;
                        uint8_t r = (pixel >> 24) & 0xFF, g = (pixel >> 16) & 0xFF, b = (pixel >> 8) & 0xFF;
                        pixel = ((r + g + b) / 3) & 0x00FF;
-//                     backbuffer[i] = 0xFF000000 | (pixel << 16) | (pixel << 8);
                        backbuffer[i] = 0x000000FF | (pixel << 16) | (pixel << 8);
                }
 
-//             memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->rasterWidth);
                memcpy(videoWidget->buffer, backbuffer, videoWidget->rasterHeight * videoWidget->textureWidth * sizeof(uint32_t));
-#endif
 
                videoWidget->updateGL();
        }
@@ -593,16 +649,33 @@ void MainWin::LoadSoftware(QString file)
        SET32(jaguarMainRAM, 0, 0x00200000);            // Set top of stack...
        cartridgeLoaded = (JaguarLoadFile(file.toAscii().data()) ? true : false);
 
+       uint8_t * biosPointer = jaguarBootROM;
+
+       if (vjs.hardwareTypeAlpine)
+       {
+               if (biosAvailable & BIOS_STUB1)
+//                     memcpy(jagMemSpace + 0xE00000, jaguarDevBootROM1, 0x20000);
+                       biosPointer = jaguarDevBootROM1;
+               else if (biosAvailable & BIOS_STUB2)
+//                     memcpy(jagMemSpace + 0xE00000, jaguarDevBootROM2, 0x20000);
+                       biosPointer = jaguarDevBootROM2;
+       }
+//     else
+//             memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000);
+
+       memcpy(jagMemSpace + 0xE00000, biosPointer, 0x20000);
+
        powerAct->setDisabled(false);
        powerAct->setChecked(true);
        powerButtonOn = false;
        TogglePowerState();
 
-//     QString newTitle = QString("Virtual Jaguar v2.0.0 - Now playing: %1")
-       QString newTitle = QString("Virtual Jaguar " VJ_RELEASE_VERSION
-               " - Now playing: %1")
-               .arg(filePickWin->GetSelectedPrettyName());
-       setWindowTitle(newTitle);
+       if (!vjs.hardwareTypeAlpine)
+       {
+               QString newTitle = QString("Virtual Jaguar " VJ_RELEASE_VERSION " - Now playing: %1")
+                       .arg(filePickWin->GetSelectedPrettyName());
+               setWindowTitle(newTitle);
+       }
 }
 
 void MainWin::ToggleCDUsage(void)
@@ -651,20 +724,26 @@ void MainWin::ReadSettings(void)
        vjs.frameSkip        = settings.value("frameSkip", 0).toInt();
        vjs.useJaguarBIOS    = settings.value("useJaguarBIOS", false).toBool();
        vjs.DSPEnabled       = settings.value("DSPEnabled", false).toBool();
+       vjs.audioEnabled     = settings.value("audioEnabled", true).toBool();
        vjs.usePipelinedDSP  = settings.value("usePipelinedDSP", false).toBool();
        vjs.fullscreen       = settings.value("fullscreen", false).toBool();
        vjs.useOpenGL        = settings.value("useOpenGL", true).toBool();
        vjs.glFilter         = settings.value("glFilterType", 0).toInt();
        vjs.renderType       = settings.value("renderType", 0).toInt();
-       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.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());
        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("    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);
+WriteLog("   absROMPath = \"%s\"\n", vjs.absROMPath);
 
        // 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_Up).toInt();
@@ -728,15 +807,19 @@ void MainWin::WriteSettings(void)
        settings.setValue("frameSkip", vjs.frameSkip);
        settings.setValue("useJaguarBIOS", vjs.useJaguarBIOS);
        settings.setValue("DSPEnabled", vjs.DSPEnabled);
+       settings.setValue("audioEnabled", vjs.audioEnabled);
        settings.setValue("usePipelinedDSP", vjs.usePipelinedDSP);
        settings.setValue("fullscreen", vjs.fullscreen);
        settings.setValue("useOpenGL", vjs.useOpenGL);
        settings.setValue("glFilterType", vjs.glFilter);
        settings.setValue("renderType", vjs.renderType);
+       settings.setValue("writeROM", vjs.allowWritesToROM);
        settings.setValue("JagBootROM", vjs.jagBootPath);
        settings.setValue("CDBootROM", vjs.CDBootPath);
        settings.setValue("EEPROMs", vjs.EEPROMPath);
        settings.setValue("ROMs", vjs.ROMPath);
+       settings.setValue("DefaultROM", vjs.alpineROMPath);
+       settings.setValue("DefaultABS", vjs.absROMPath);
 
        settings.setValue("p1k_up", vjs.p1KeyBindings[BUTTON_U]);
        settings.setValue("p1k_down", vjs.p1KeyBindings[BUTTON_D]);