X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fgui%2Fmainwin.cpp;h=3ff3ded3283fe0dab0fc07f9640773ccac40aee1;hb=2136446c0d38d00a651d3eb665ee564b18f94b28;hp=3584fb9618fdee1ced7be1874d3696b3aea02a2c;hpb=81f36e3d736289426541785b6d945126f074e10f;p=virtualjaguar diff --git a/src/gui/mainwin.cpp b/src/gui/mainwin.cpp index 3584fb9..3ff3ded 100644 --- a/src/gui/mainwin.cpp +++ b/src/gui/mainwin.cpp @@ -46,6 +46,9 @@ #include "tom.h" #include "log.h" #include "file.h" +#include "jagbios.h" +#include "jagcdbios.h" +#include "jagstub2bios.h" #include "joystick.h" #ifdef __GCCWIN32__ @@ -58,10 +61,10 @@ // Creating those is left as an exercise for the reader. ;-) //#define USE_BUILT_IN_BIOS -#ifdef USE_BUILT_IN_BIOS -#include "jagboot.h" -#include "jagcd.h" -#endif +//#ifdef USE_BUILT_IN_BIOS +//#include "jagboot.h" +//#include "jagcd.h" +//#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 @@ -76,13 +79,20 @@ // 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), + pauseForFileSelector(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); @@ -156,7 +166,7 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit filePickAct->setShortcut(QKeySequence(tr("Ctrl+i"))); connect(filePickAct, SIGNAL(triggered()), this, SLOT(InsertCart())); - configAct = new QAction(QIcon(":/res/generic.png"), tr("&Configure"), this); + configAct = new QAction(QIcon(":/res/wrench.png"), tr("&Configure"), this); configAct->setStatusTip(tr("Configure options for Virtual Jaguar")); configAct->setShortcut(QKeySequence(tr("Ctrl+c"))); connect(configAct, SIGNAL(triggered()), this, SLOT(Configure())); @@ -169,14 +179,15 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit // Misc. connections... connect(filePickWin, SIGNAL(RequestLoad(QString)), this, SLOT(LoadSoftware(QString))); + connect(filePickWin, SIGNAL(FilePickerHiding()), this, SLOT(Unpause())); // Create menus & toolbars - fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(filePickAct); - fileMenu->addAction(useCDAct); + fileMenu = menuBar()->addMenu(tr("&Jaguar")); fileMenu->addAction(powerAct); fileMenu->addAction(pauseAct); + fileMenu->addAction(filePickAct); + fileMenu->addAction(useCDAct); fileMenu->addAction(configAct); fileMenu->addAction(quitAppAct); @@ -226,11 +237,11 @@ MainWin::MainWin(): running(false), powerButtonOn(false), showUntunedTankCircuit // Get the BIOS ROM #ifdef USE_BUILT_IN_BIOS - WriteLog("VJ: Using built in BIOS/CD BIOS...\n"); - memcpy(jaguarBootROM, jagBootROM, 0x20000); - memcpy(jaguarCDBootROM, jagCDROM, 0x40000); -// BIOSLoaded = CDBIOSLoaded = true; - biosAvailable |= (BIOS_NORMAL | BIOS_CD); +// WriteLog("VJ: Using built in BIOS/CD BIOS...\n"); +// memcpy(jaguarBootROM, jagBootROM, 0x20000); +// memcpy(jaguarCDBootROM, jagCDROM, 0x40000); +//// BIOSLoaded = CDBIOSLoaded = true; +// biosAvailable |= (BIOS_NORMAL | BIOS_CD); #else // What would be nice here would be a way to check if the BIOS was loaded so that we // could disable the pushbutton on the Misc Options menu... !!! FIX !!! [DONE here, but needs to be fixed in GUI as well!] @@ -244,10 +255,32 @@ 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); + } + else + memcpy(jagMemSpace + 0xE00000, jaguarBootROM, 0x20000); // Otherwise, use the stock BIOS } void MainWin::closeEvent(QCloseEvent * event) { + JaguarDone(); WriteSettings(); event->accept(); // ignore() if can't close for some reason } @@ -283,6 +316,15 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state) joypad_0_buttons[BUTTON_D] = 0; if (e->key() == (int)vjs.p1KeyBindings[BUTTON_D] && joypad_0_buttons[BUTTON_U]) joypad_0_buttons[BUTTON_U] = 0; + + if (e->key() == (int)vjs.p2KeyBindings[BUTTON_L] && joypad_1_buttons[BUTTON_R]) + joypad_0_buttons[BUTTON_R] = 0; + if (e->key() == (int)vjs.p2KeyBindings[BUTTON_R] && joypad_1_buttons[BUTTON_L]) + joypad_0_buttons[BUTTON_L] = 0; + if (e->key() == (int)vjs.p2KeyBindings[BUTTON_U] && joypad_1_buttons[BUTTON_D]) + joypad_0_buttons[BUTTON_D] = 0; + if (e->key() == (int)vjs.p2KeyBindings[BUTTON_D] && joypad_1_buttons[BUTTON_U]) + joypad_0_buttons[BUTTON_U] = 0; #endif // No bad combos exist, let's stuff the emulator key buffers...! @@ -290,6 +332,9 @@ void MainWin::HandleKeys(QKeyEvent * e, bool state) { if (e->key() == (int)vjs.p1KeyBindings[i]) joypad_0_buttons[i] = (uint8)state; + + if (e->key() == (int)vjs.p2KeyBindings[i]) + joypad_1_buttons[i] = (uint8)state; } } @@ -308,9 +353,13 @@ 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; @@ -322,6 +371,32 @@ 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) { @@ -366,119 +441,11 @@ void MainWin::Timer(void) videoWidget->updateGL(); } -#if 0 -Window * RunEmu(void) -{ -// extern uint32 * backbuffer; - uint32 * overlayPixels = (uint32 *)sdlemuGetOverlayPixels(); - memset(overlayPixels, 0x00, 640 * 480 * 4); // Clear out overlay... - -//This is crappy... !!! FIX !!! -// extern bool finished, showGUI; - - sdlemuDisableOverlay(); - -// uint32 nFrame = 0, nFrameskip = 0; - uint32 totalFrames = 0; - finished = false; - bool showMessage = true; - uint32 showMsgFrames = 120; - uint8 transparency = 0xFF; - // Pass a message to the "joystick" code to debounce the ESC key... - debounceRunKey = true; - - uint32 cartType = 4; - if (jaguarRomSize == 0x200000) - cartType = 0; - else if (jaguarRomSize == 0x400000) - cartType = 1; - else if (jaguarMainRomCRC32 == 0x687068D5) - cartType = 2; - else if (jaguarMainRomCRC32 == 0x55A0669C) - cartType = 3; - - const char * cartTypeName[5] = { "2M Cartridge", "4M Cartridge", "CD BIOS", "CD Dev BIOS", "Homebrew" }; - uint32 elapsedTicks = SDL_GetTicks(), frameCount = 0, framesPerSecond = 0; - - while (!finished) - { - // Set up new backbuffer with new pixels and data - JaguarExecuteNew(); - totalFrames++; -//WriteLog("Frame #%u...\n", totalFrames); -//extern bool doDSPDis; -//if (totalFrames == 373) -// doDSPDis = true; - -//Problem: Need to do this *only* when the state changes from visible to not... -//Also, need to clear out the GUI when not on (when showMessage is active...) -if (showGUI || showMessage) - sdlemuEnableOverlay(); -else - sdlemuDisableOverlay(); - -//Add in a new function for clearing patches of screen (ClearOverlayRect) - -// Also: Take frame rate into account when calculating fade time... - - // Some QnD GUI stuff here... - if (showGUI) - { - FillScreenRectangle(overlayPixels, 8, 1*FONT_HEIGHT, 128, 4*FONT_HEIGHT, 0x00000000); - extern uint32 gpu_pc, dsp_pc; - DrawString(overlayPixels, 8, 1*FONT_HEIGHT, false, "GPU PC: %08X", gpu_pc); - DrawString(overlayPixels, 8, 2*FONT_HEIGHT, false, "DSP PC: %08X", dsp_pc); - DrawString(overlayPixels, 8, 4*FONT_HEIGHT, false, "%u FPS", framesPerSecond); - } - - if (showMessage) - { - DrawString2(overlayPixels, 8, 24*FONT_HEIGHT, 0x007F63FF, transparency, "Running..."); - DrawString2(overlayPixels, 8, 26*FONT_HEIGHT, 0x001FFF3F, transparency, "%s, run address: %06X", cartTypeName[cartType], jaguarRunAddress); - DrawString2(overlayPixels, 8, 27*FONT_HEIGHT, 0x001FFF3F, transparency, "CRC: %08X", jaguarMainRomCRC32); - - if (showMsgFrames == 0) - { - transparency--; - - if (transparency == 0) -{ - showMessage = false; -/*extern bool doGPUDis; -doGPUDis = true;//*/ -} - - } - else - showMsgFrames--; - } - - frameCount++; - - if (SDL_GetTicks() - elapsedTicks > 250) - elapsedTicks += 250, framesPerSecond = frameCount * 4, frameCount = 0; - } - - // Save the background for the GUI... - // In this case, we squash the color to monochrome, then force it to blue + green... - for(uint32 i=0; i> 16) & 0xFF, g = (pixel >> 8) & 0xFF, r = pixel & 0xFF; - pixel = ((r + g + b) / 3) & 0x00FF; - backbuffer[i] = 0xFF000000 | (pixel << 16) | (pixel << 8); - } - - sdlemuEnableOverlay(); - - return NULL; -} -#endif - void MainWin::TogglePowerState(void) { powerButtonOn = !powerButtonOn; + // With the power off, we simulate white noise on the screen. :-) if (!powerButtonOn) { pauseAct->setChecked(false); @@ -491,12 +458,15 @@ void MainWin::TogglePowerState(void) } else { +//NOTE: Low hanging fruit: We can simplify this a lot... + // Otherwise, we prepare for running regular software... if (!CDActive) { - showUntunedTankCircuit = (cartridgeLoaded ? false : true); + showUntunedTankCircuit = false;//(cartridgeLoaded ? false : true); pauseAct->setChecked(false); - pauseAct->setDisabled(!cartridgeLoaded); + pauseAct->setDisabled(false);//!cartridgeLoaded); } + // Or, set up for the Jaguar CD else { // Should check for cartridgeLoaded here as well...! @@ -512,10 +482,6 @@ void MainWin::TogglePowerState(void) " - Now playing: Jaguar CD")); } -//(Err, what's so crappy about this? It seems to do what it's supposed to...) -//This is crappy!!! !!! FIX !!! -//Is this even needed any more? Hmm. Maybe. Dunno. -//Seems like it is... But then again, maybe not. Have to test it to see. WriteLog("GUI: Resetting Jaguar...\n"); JaguarReset(); running = true; @@ -584,25 +550,52 @@ void MainWin::ShowAboutWin(void) void MainWin::InsertCart(void) { + // If the emulator is running, we pause it here and unpause it later + // if we dismiss the file selector without choosing anything + if (running) + { + ToggleRunState(); + pauseForFileSelector = true; + } + filePickWin->show(); } +void MainWin::Unpause(void) +{ + // Here we unpause the emulator if it was paused when we went into the file selector + if (pauseForFileSelector) + { + pauseForFileSelector = false; + ToggleRunState(); + } +} + void MainWin::LoadSoftware(QString file) { - running = false; // Prevent bad things(TM) from happening... + running = false; // Prevent bad things(TM) from happening... + pauseForFileSelector = false; // Reset the file selector pause flag SET32(jaguarMainRAM, 0, 0x00200000); // Set top of stack... - cartridgeLoaded = (JaguarLoadFile(file.toAscii().data()) ? true : false); + cartridgeLoaded = JaguarLoadFile(file.toAscii().data()); + + char * biosPointer = jaguarBootROM; + + if (vjs.hardwareTypeAlpine) + biosPointer = jaguarDevBootROM2; + + 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) @@ -642,7 +635,7 @@ void MainWin::ReadSettings(void) pos = settings.value("cartLoadPos", QPoint(200, 200)).toPoint(); filePickWin->move(pos); - zoomLevel = settings.value("zoom", 1).toInt(); + zoomLevel = settings.value("zoom", 2).toInt(); allowUnknownSoftware = settings.value("showUnknownSoftware", false).toBool(); vjs.useJoystick = settings.value("useJoystick", false).toBool(); @@ -650,33 +643,39 @@ void MainWin::ReadSettings(void) vjs.hardwareTypeNTSC = settings.value("hardwareTypeNTSC", true).toBool(); vjs.frameSkip = settings.value("frameSkip", 0).toInt(); vjs.useJaguarBIOS = settings.value("useJaguarBIOS", false).toBool(); + vjs.GPUEnabled = settings.value("GPUEnabled", true).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.glFilter = settings.value("glFilterType", 1).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(); - vjs.p1KeyBindings[BUTTON_D] = settings.value("p1k_down", Qt::Key_Down).toInt(); - vjs.p1KeyBindings[BUTTON_L] = settings.value("p1k_left", Qt::Key_Left).toInt(); - vjs.p1KeyBindings[BUTTON_R] = settings.value("p1k_right", Qt::Key_Right).toInt(); - vjs.p1KeyBindings[BUTTON_C] = settings.value("p1k_c", Qt::Key_Z).toInt(); - vjs.p1KeyBindings[BUTTON_B] = settings.value("p1k_b", Qt::Key_X).toInt(); - vjs.p1KeyBindings[BUTTON_A] = settings.value("p1k_a", Qt::Key_C).toInt(); - vjs.p1KeyBindings[BUTTON_OPTION] = settings.value("p1k_option", Qt::Key_Apostrophe).toInt(); - vjs.p1KeyBindings[BUTTON_PAUSE] = settings.value("p1k_pause", Qt::Key_Return).toInt(); + vjs.p1KeyBindings[BUTTON_U] = settings.value("p1k_up", Qt::Key_S).toInt(); + vjs.p1KeyBindings[BUTTON_D] = settings.value("p1k_down", Qt::Key_X).toInt(); + vjs.p1KeyBindings[BUTTON_L] = settings.value("p1k_left", Qt::Key_A).toInt(); + vjs.p1KeyBindings[BUTTON_R] = settings.value("p1k_right", Qt::Key_D).toInt(); + vjs.p1KeyBindings[BUTTON_C] = settings.value("p1k_c", Qt::Key_J).toInt(); + vjs.p1KeyBindings[BUTTON_B] = settings.value("p1k_b", Qt::Key_K).toInt(); + vjs.p1KeyBindings[BUTTON_A] = settings.value("p1k_a", Qt::Key_L).toInt(); + vjs.p1KeyBindings[BUTTON_OPTION] = settings.value("p1k_option", Qt::Key_O).toInt(); + vjs.p1KeyBindings[BUTTON_PAUSE] = settings.value("p1k_pause", Qt::Key_P).toInt(); vjs.p1KeyBindings[BUTTON_0] = settings.value("p1k_0", Qt::Key_0).toInt(); vjs.p1KeyBindings[BUTTON_1] = settings.value("p1k_1", Qt::Key_1).toInt(); vjs.p1KeyBindings[BUTTON_2] = settings.value("p1k_2", Qt::Key_2).toInt(); @@ -687,8 +686,8 @@ WriteLog(" ROMPath = \"%s\"\n", vjs.ROMPath); vjs.p1KeyBindings[BUTTON_7] = settings.value("p1k_7", Qt::Key_7).toInt(); vjs.p1KeyBindings[BUTTON_8] = settings.value("p1k_8", Qt::Key_8).toInt(); vjs.p1KeyBindings[BUTTON_9] = settings.value("p1k_9", Qt::Key_9).toInt(); - vjs.p1KeyBindings[BUTTON_d] = settings.value("p1k_pound", Qt::Key_Slash).toInt(); - vjs.p1KeyBindings[BUTTON_s] = settings.value("p1k_star", Qt::Key_Asterisk).toInt(); + vjs.p1KeyBindings[BUTTON_d] = settings.value("p1k_pound", Qt::Key_Minus).toInt(); + vjs.p1KeyBindings[BUTTON_s] = settings.value("p1k_star", Qt::Key_Equal).toInt(); vjs.p2KeyBindings[BUTTON_U] = settings.value("p2k_up", Qt::Key_Up).toInt(); vjs.p2KeyBindings[BUTTON_D] = settings.value("p2k_down", Qt::Key_Down).toInt(); @@ -728,6 +727,7 @@ void MainWin::WriteSettings(void) settings.setValue("hardwareTypeNTSC", vjs.hardwareTypeNTSC); settings.setValue("frameSkip", vjs.frameSkip); settings.setValue("useJaguarBIOS", vjs.useJaguarBIOS); + settings.setValue("GPUEnabled", vjs.GPUEnabled); settings.setValue("DSPEnabled", vjs.DSPEnabled); settings.setValue("audioEnabled", vjs.audioEnabled); settings.setValue("usePipelinedDSP", vjs.usePipelinedDSP); @@ -735,10 +735,13 @@ void MainWin::WriteSettings(void) 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]);