diff --git a/VSLinux/Amiberry.vcxproj b/VSLinux/Amiberry.vcxproj index 5cbee7c7..4cedbdae 100644 --- a/VSLinux/Amiberry.vcxproj +++ b/VSLinux/Amiberry.vcxproj @@ -402,6 +402,7 @@ + @@ -409,6 +410,7 @@ + diff --git a/VSLinux/Amiberry.vcxproj.filters b/VSLinux/Amiberry.vcxproj.filters index 2886bc28..86ba9691 100644 --- a/VSLinux/Amiberry.vcxproj.filters +++ b/VSLinux/Amiberry.vcxproj.filters @@ -756,6 +756,12 @@ src\archivers\mp2 + + src\osdep\gui + + + src\osdep\gui + diff --git a/VisualGDB/Amiberry/Amiberry-Debug.vgdbsettings b/VisualGDB/Amiberry/Amiberry-Debug.vgdbsettings index 4eff26b8..adb259fd 100644 --- a/VisualGDB/Amiberry/Amiberry-Debug.vgdbsettings +++ b/VisualGDB/Amiberry/Amiberry-Debug.vgdbsettings @@ -45,34 +45,26 @@ $(ProjectDir) - - com.visualgdb.raspberry_pi - - 4.9.2 - 7.7.1 - 4 - - - false - - C:\SysGCC\raspberry\bin - - false - - - MinGWUnixSlash - Raspberry PI com.visualgdb.raspberry_pi C:\SysGCC\raspberry + false C:\SysGCC\raspberry\bin\arm-linux-gnueabihf-gcc.exe C:\SysGCC\raspberry\bin\arm-linux-gnueabihf-g++.exe C:\SysGCC\raspberry\bin\arm-linux-gnueabihf-gdb.exe C:\SysGCC\raspberry\bin\arm-linux-gnueabihf-ar.exe C:\SysGCC\raspberry\bin\arm-linux-gnueabihf-objcopy.exe C:\SysGCC\raspberry\bin\make.exe - false + + C:\SysGCC\raspberry\bin + + false + false + + + MinGWUnixSlash + Amiberry.vcxproj @@ -80,7 +72,6 @@ 1 - true @@ -154,7 +145,6 @@ true - false Enabled true @@ -164,9 +154,6 @@ - - false - VisualGDB\VisualGDBCache \ No newline at end of file diff --git a/VisualGDB/Amiberry/Amiberry.vcxproj b/VisualGDB/Amiberry/Amiberry.vcxproj index 5ba6bbe8..3e58c2ea 100644 --- a/VisualGDB/Amiberry/Amiberry.vcxproj +++ b/VisualGDB/Amiberry/Amiberry.vcxproj @@ -275,6 +275,7 @@ + @@ -282,6 +283,7 @@ + diff --git a/VisualGDB/Amiberry/Amiberry.vcxproj.filters b/VisualGDB/Amiberry/Amiberry.vcxproj.filters index 1381738d..41295ed4 100644 --- a/VisualGDB/Amiberry/Amiberry.vcxproj.filters +++ b/VisualGDB/Amiberry/Amiberry.vcxproj.filters @@ -708,6 +708,12 @@ Source files\archivers\mp2 + + Source files\osdep\gui + + + Source files\osdep\gui + diff --git a/src/include/uae.h b/src/include/uae.h index cff68335..92c46d18 100644 --- a/src/include/uae.h +++ b/src/include/uae.h @@ -24,6 +24,7 @@ extern void sleep_millis (int ms); extern void uae_reset (int, int); extern void uae_quit (void); +extern void host_shutdown(); extern void uae_restart (int, const TCHAR*); extern void target_reset (void); extern void target_addtorecent (const TCHAR*, int); diff --git a/src/osdep/gui/CreateFilesysHardfile.cpp b/src/osdep/gui/CreateFilesysHardfile.cpp index 8a090f59..3e54690d 100644 --- a/src/osdep/gui/CreateFilesysHardfile.cpp +++ b/src/osdep/gui/CreateFilesysHardfile.cpp @@ -15,7 +15,7 @@ #include "gui.h" #include "gui_handling.h" -#define DIALOG_WIDTH 520 +#define DIALOG_WIDTH 620 #define DIALOG_HEIGHT 202 static const char* harddisk_filter[] = {".hdf", "\0"}; diff --git a/src/osdep/gui/EditFilesysHardfile.cpp b/src/osdep/gui/EditFilesysHardfile.cpp index ce9f5f04..988de986 100644 --- a/src/osdep/gui/EditFilesysHardfile.cpp +++ b/src/osdep/gui/EditFilesysHardfile.cpp @@ -16,11 +16,21 @@ #include "gui.h" #include "gui_handling.h" -#define DIALOG_WIDTH 520 +#define DIALOG_WIDTH 620 #define DIALOG_HEIGHT 270 static const char* harddisk_filter[] = {".hdf", "\0"}; +struct controller_map { + int type; + char display[64]; +}; +static struct controller_map controller[] = { + { HD_CONTROLLER_TYPE_UAE, "UAE" }, + { HD_CONTROLLER_TYPE_IDE_FIRST, "A600/A1200/A4000 IDE" }, + { -1 } +}; + static bool dialogResult = false; static bool dialogFinished = false; static bool fileSelected = false; @@ -46,7 +56,9 @@ static gcn::Label* lblSectors; static gcn::TextField* txtSectors; static gcn::Label* lblBlocksize; static gcn::TextField* txtBlocksize; - +static gcn::Label *lblController; +static gcn::UaeDropDown* cboController; +static gcn::UaeDropDown* cboUnit; static void check_rdb(const TCHAR* filename) { @@ -65,6 +77,52 @@ static void check_rdb(const TCHAR* filename) } +class ControllerListModel : public gcn::ListModel +{ +public: + ControllerListModel() + { + } + + int getNumberOfElements() override + { + return 2; + } + + std::string getElementAt(int i) override + { + if (i < 0 || i >= 2) + return "---"; + return controller[i].display; + } +}; +static ControllerListModel controllerListModel; + + +class UnitListModel : public gcn::ListModel +{ +public: + UnitListModel() + { + } + + int getNumberOfElements() override + { + return 4; + } + + std::string getElementAt(int i) override + { + char num[8]; + + if (i < 0 || i >= 4) + return "---"; + snprintf(num, 8, "%d", i); + return num; + } +}; +static UnitListModel unitListModel; + class FilesysHardfileActionListener : public gcn::ActionListener { public: @@ -84,6 +142,17 @@ public: wndEditFilesysHardfile->requestModalFocus(); cmdPath->requestFocus(); } + else if (actionEvent.getSource() == cboController) { + switch (controller[cboController->getSelected()].type) { + case HD_CONTROLLER_TYPE_UAE: + cboUnit->setSelected(0); + cboUnit->setEnabled(false); + break; + default: + cboUnit->setEnabled(true); + break; + } + } else { if (actionEvent.getSource() == cmdOK) @@ -110,6 +179,18 @@ static FilesysHardfileActionListener* filesysHardfileActionListener; static void InitEditFilesysHardfile() { + for (int i = 0; expansionroms[i].name; i++) { + const struct expansionromtype *erc = &expansionroms[i]; + if (erc->deviceflags & EXPANSIONTYPE_IDE) { + for (int j = 0; controller[j].type >= 0; ++j) { + if (!strcmp(erc->friendlyname, controller[j].display)) { + controller[j].type = HD_CONTROLLER_TYPE_IDE_EXPANSION_FIRST + i; + break; + } + } + } + } + wndEditFilesysHardfile = new gcn::Window("Edit"); wndEditFilesysHardfile->setSize(DIALOG_WIDTH, DIALOG_HEIGHT); wndEditFilesysHardfile->setPosition((GUI_WIDTH - DIALOG_WIDTH) / 2, (GUI_HEIGHT - DIALOG_HEIGHT) / 2); @@ -193,6 +274,19 @@ static void InitEditFilesysHardfile() cmdPath->setId("hdfPath"); cmdPath->addActionListener(filesysHardfileActionListener); + lblController = new gcn::Label("Controller:"); + lblController->setSize(100, LABEL_HEIGHT); + lblController->setAlignment(gcn::Graphics::RIGHT); + cboController = new gcn::UaeDropDown(&controllerListModel); + cboController->setSize(180, DROPDOWN_HEIGHT); + cboController->setBaseColor(gui_baseCol); + cboController->setId("hdfController"); + cboController->addActionListener(filesysHardfileActionListener); + cboUnit = new gcn::UaeDropDown(&unitListModel); + cboUnit->setSize(60, DROPDOWN_HEIGHT); + cboUnit->setBaseColor(gui_baseCol); + cboUnit->setId("hdfUnit"); + int posY = DISTANCE_BORDER; int posX = DISTANCE_BORDER; @@ -230,6 +324,11 @@ static void InitEditFilesysHardfile() wndEditFilesysHardfile->add(txtBlocksize, lblBlocksize->getX() + lblBlocksize->getWidth() + 8, posY); posY += txtSectors->getHeight() + DISTANCE_NEXT_Y; + wndEditFilesysHardfile->add(lblController, DISTANCE_BORDER, posY); + wndEditFilesysHardfile->add(cboController, DISTANCE_BORDER + lblController->getWidth() + 8, posY); + wndEditFilesysHardfile->add(cboUnit, cboController->getX() + cboController->getWidth() + 8, posY); + posY += cboController->getHeight() + DISTANCE_NEXT_Y; + wndEditFilesysHardfile->add(cmdOK); wndEditFilesysHardfile->add(cmdCancel); @@ -262,6 +361,9 @@ static void ExitEditFilesysHardfile() delete txtSectors; delete lblBlocksize; delete txtBlocksize; + delete lblController; + delete cboController; + delete cboUnit; delete cmdOK; delete cmdCancel; @@ -273,6 +375,9 @@ static void ExitEditFilesysHardfile() static void EditFilesysHardfileLoop() { + // TODO: Check if this is needed in Guisan? + FocusBugWorkaround(wndEditFilesysHardfile); + while (!dialogFinished) { SDL_Event event; @@ -370,6 +475,13 @@ bool EditFilesysHardfile(int unit_no) txtSectors->setText(tmp); snprintf(tmp, sizeof tmp, "%d", ci->blocksize); txtBlocksize->setText(tmp); + int selIndex = 0; + for (int i = 0; i < 2; ++i) { + if (controller[i].type == ci->controller_type) + selIndex = i; + } + cboController->setSelected(selIndex); + cboUnit->setSelected(ci->controller_unit); check_rdb(strroot.c_str()); } @@ -387,6 +499,8 @@ bool EditFilesysHardfile(int unit_no) txtReserved->setText("2"); txtSectors->setText("32"); txtBlocksize->setText("512"); + cboController->setSelected(0); + cboUnit->setSelected(0); } EditFilesysHardfileLoop(); @@ -401,18 +515,28 @@ bool EditFilesysHardfile(int unit_no) strcpy(ci.devname, const_cast(txtDevice->getText().c_str())); strcpy(ci.rootdir, const_cast(txtPath->getText().c_str())); ci.type = UAEDEV_HDF; + ci.controller_type = controller[cboController->getSelected()].type; + ci.controller_type_unit = 0; + ci.controller_unit = cboUnit->getSelected(); + ci.controller_media_type = 0; + ci.unit_feature_level = 1; + ci.unit_special_flags = 0; ci.readonly = !chkReadWrite->isSelected(); ci.sectors = atoi(txtSectors->getText().c_str()); ci.surfaces = atoi(txtSurfaces->getText().c_str()); ci.reserved = atoi(txtReserved->getText().c_str()); ci.blocksize = atoi(txtBlocksize->getText().c_str()); ci.bootpri = bp; + ci.physical_geometry = hardfile_testrdb(ci.rootdir); uci = add_filesys_config(&changed_prefs, unit_no, &ci); if (uci) { - struct hardfiledata* hfd = get_hardfile_data(uci->configoffset); - hardfile_media_change(hfd, &ci, true, false); + struct hardfiledata *hfd = get_hardfile_data(uci->configoffset); + if (hfd) + hardfile_media_change(hfd, &ci, true, false); + else + hardfile_added(&ci); } } diff --git a/src/osdep/gui/Navigation.cpp b/src/osdep/gui/Navigation.cpp index 3459fb2f..1e28e7a8 100644 --- a/src/osdep/gui/Navigation.cpp +++ b/src/osdep/gui/Navigation.cpp @@ -23,10 +23,11 @@ static NavigationMap navMap[] = { // active move left move right move up move down // main_window - {"Paths", "SystemROMs", "SystemROMs", "Reset", "Configurations"}, - {"Configurations", "ConfigList", "ConfigList", "Paths", "CPU and FPU"}, - {"CPU and FPU", "7 Mhz", "68000", "Configurations", "Chipset"}, - {"Chipset", "BlitNormal", "OCS", "CPU and FPU", "ROM"}, + { "Paths", "SystemROMs", "SystemROMs", "Reset", "Quickstart" }, + { "Quickstart", "qsNTSC", "AModel", "Paths", "Configurations" }, + { "Configurations", "ConfigList", "ConfigList", "Quickstart", "CPU and FPU" }, + {"CPU and FPU", "7 Mhz", "68000", "Configurations", "Chipset"}, + {"Chipset", "BlitNormal", "OCS", "CPU and FPU", "ROM"}, {"ROM", "MainROM", "cboMainROM", "Chipset", "RAM"}, {"RAM", "Chipmem", "Chipmem", "ROM", "Floppy drives"}, {"Floppy drives", "cmdSel0", "DF0:", "RAM", "Hard drives/CD"}, @@ -37,7 +38,8 @@ static NavigationMap navMap[] = {"Miscellaneous", "StatusLine", "StatusLine", "Input", "Savestates"}, {"Savestates", "State0", "State0", "Miscellaneous", "Reset"}, {"Reset", "Start", "Quit", "Savestates", "Paths"}, - {"Quit", "Reset", "Start", "Savestates", "Paths"}, + {"Quit", "Reset", "Help", "Savestates", "Paths"}, + { "Help", "Quit", "Start", "Savestates", "Paths" }, {"Start", "Quit", "Reset", "Savestates", "Paths"}, // PanelPaths @@ -45,6 +47,29 @@ static NavigationMap navMap[] = {"ConfigPath", "Paths", "Paths", "SystemROMs", "RescanROMs"}, {"RescanROMs", "Paths", "Paths", "ConfigPath", "SystemROMs"}, + // active move left move right move up move down + // PanelQuickstart + { "AModel", "Quickstart", "qsNTSC", "qsMode", "AConfig" }, + { "qsNTSC", "AModel", "Quickstart", "qsMode", "AConfig" }, + { "AConfig", "Quickstart", "Quickstart", "AModel", "qscmdSel0" }, + { "qsDF0", "Quickstart", "qsWP0", "AConfig", "qscboDisk0" }, + { "qsWP0", "qsDF0", "qscmdEject0", "AConfig", "qscboDisk0" }, + // { "qsInfo0", "Quickstart", "", "", "" }, + { "qscmdEject0", "qsWP0", "qscmdSel0", "AConfig", "qscboDisk0" }, + { "qscmdSel0", "qscmdEject0", "Quickstart", "AConfig", "qscboDisk0" }, + { "qscboDisk0", "Quickstart", "Quickstart", "qscmdSel0", "qscmdSel1" }, + { "qsDF1", "Quickstart", "qsWP1", "qscboDisk0", "qscboDisk1" }, + { "qsWP1", "qsDF1", "qscmdEject1", "qscboDisk0", "qscboDisk1" }, + // { "qsInfo1", "Quickstart", "", "", "" }, + { "qscmdEject1", "qsWP1", "qscmdSel1", "qscboDisk0", "qscboDisk1" }, + { "qscmdSel1", "qscmdEject1", "Quickstart", "qscboDisk0", "qscboDisk1" }, + { "qscboDisk1", "Quickstart", "Quickstart", "qsDF1", "qsCDSelect" }, + { "qsCD drive", "Quickstart", "qscdEject", "qscboDisk1", "qscboCD" }, + { "qscdEject", "qsCD drive", "qsCDSelect", "qscboDisk1", "qscboCD" }, + { "qsCDSelect", "qscdEject", "Quickstart", "qscboDisk1", "qscboCD" }, + { "qscboCD", "Quickstart", "Quickstart", "qsCDSelect", "qsMode" }, + { "qsMode", "Quickstart", "Quickstart", "qscboCD", "qsNTSC" }, + // PanelConfig {"ConfigList", "Configurations", "ConfigName", "", ""}, {"ConfigName", "Configurations", "Configurations", "ConfigList", "ConfigDesc"}, @@ -55,22 +80,24 @@ static NavigationMap navMap[] = // active move left move right move up move down // PanelCPU - {"68000", "CPU and FPU", "FPUnone", "JIT", "68010"}, - {"68010", "CPU and FPU", "68881", "68000", "68020"}, - {"68020", "CPU and FPU", "68882", "68010", "68030"}, - {"68030", "CPU and FPU", "CPU internal", "68020", "68040"}, - {"68040", "CPU and FPU", "CPU internal", "68030", "CPU24Bit"}, - {"CPU24Bit", "CPU and FPU", "CPU internal", "68040", "CPUComp"}, - {"CPUComp", "CPU and FPU", "CPU internal", "CPU24Bit", "JIT"}, - {"JIT", "CPU and FPU", "CPU internal", "CPUComp", "68000"}, - {"FPUnone", "68000", "7 Mhz", "CPU internal", "68881"}, - {"68881", "68010", "14 Mhz", "FPUnone", "68882"}, - {"68882", "68020", "25 Mhz", "68881", "CPU internal"}, - {"CPU internal", "68030", "Fastest", "68882", "FPUnone"}, - {"7 Mhz", "FPUnone", "CPU and FPU", "Fastest", "14 Mhz"}, - {"14 Mhz", "68881", "CPU and FPU", "7 Mhz", "25 Mhz"}, - {"25 Mhz", "68882", "CPU and FPU", "14 Mhz", "Fastest"}, - {"Fastest", "CPU internal", "CPU and FPU", "25 Mhz", "7 Mhz"}, + { "68000", "CPU and FPU", "FPUnone", "JIT", "68010" }, + { "68010", "CPU and FPU", "68881", "68000", "68020" }, + { "68020", "CPU and FPU", "68882", "68010", "68030" }, + { "68030", "CPU and FPU", "CPU internal", "68020", "68040" }, + { "68040", "CPU and FPU", "FPUstrict", "68030", "CPU24Bit" }, + { "CPU24Bit", "CPU and FPU", "SoftFloat", "68040", "CPUComp" }, + { "CPUComp", "CPU and FPU", "SoftFloat", "CPU24Bit", "JIT" }, + { "JIT", "CPU and FPU", "SoftFloat", "CPUComp", "68000" }, + { "FPUnone", "68000", "7 Mhz", "SoftFloat", "68881" }, + { "68881", "68010", "14 Mhz", "FPUnone", "68882" }, + { "68882", "68020", "25 Mhz", "68881", "CPU internal" }, + { "CPU internal", "68030", "Fastest", "68882", "FPUstrict" }, + { "FPUstrict", "68040", "Fastest", "CPU internal", "SoftFloat" }, + { "SoftFloat", "CPU24Bit", "Fastest", "FPUstrict", "FPUnone" }, + { "7 Mhz", "FPUnone", "CPU and FPU", "Fastest", "14 Mhz" }, + { "14 Mhz", "68881", "CPU and FPU", "7 Mhz", "25 Mhz" }, + { "25 Mhz", "68882", "CPU and FPU", "14 Mhz", "Fastest" }, + { "Fastest", "CPU internal", "CPU and FPU", "25 Mhz", "7 Mhz" }, // PanelChipset {"OCS", "Chipset", "BlitNormal", "CollFull", "ECS Agnus"}, @@ -88,17 +115,28 @@ static NavigationMap navMap[] = // active move left move right move up move down // PanelROM - {"cboMainROM", "ROM", "MainROM", "cboExtROM", "cboExtROM"}, - {"MainROM", "cboMainROM", "ROM", "ExtROM", "ExtROM"}, - {"cboExtROM", "ROM", "ExtROM", "cboMainROM", "cboMainROM"}, - {"ExtROM", "cboExtROM", "ROM", "MainROM", "MainROM"}, +#ifdef ACTION_REPLAY + { "cboMainROM", "ROM", "MainROM", "cboCartROM", "cboExtROM" }, + { "MainROM", "cboMainROM", "ROM", "CartROM", "ExtROM" }, + { "cboExtROM", "ROM", "ExtROM", "cboMainROM", "cboCartROM" }, + { "ExtROM", "cboExtROM", "ROM", "MainROM", "CartROM" }, + { "cboCartROM", "ROM", "CartROM", "cboExtROM", "cboMainROM" }, + { "CartROM", "cboCartROM", "ROM", "ExtROM", "MainROM" }, +#else + { "cboMainROM", "ROM", "MainROM", "cboExtROM", "cboExtROM" }, + { "MainROM", "cboMainROM", "ROM", "ExtROM", "ExtROM" }, + { "cboExtROM", "ROM", "ExtROM", "cboMainROM", "cboMainROM" }, + { "ExtROM", "cboExtROM", "ROM", "MainROM", "MainROM" }, +#endif //PanelRAM - {"Chipmem", "", "", "RAM", "Slowmem"}, - {"Slowmem", "", "", "Chipmem", "Fastmem"}, - {"Fastmem", "", "", "Slowmem", "Z3mem"}, - {"Z3mem", "", "", "Fastmem", "Gfxmem"}, - {"Gfxmem", "", "", "Z3mem", "RAM"}, + { "Chipmem", "", "", "RAM", "Slowmem" }, + { "Slowmem", "", "", "Chipmem", "Fastmem" }, + { "Fastmem", "", "", "Slowmem", "Z3mem" }, + { "Z3mem", "", "", "Fastmem", "Gfxmem" }, + { "Gfxmem", "", "", "Z3mem", "A3000Low" }, + { "A3000Low", "", "", "Gfxmem", "A3000High" }, + { "A3000High", "", "", "A3000Low", "RAM" }, //PanelFloppy {"DF0:", "Floppy drives", "cboType0", "SaveForDisk", "cboDisk0"}, @@ -188,10 +226,11 @@ static NavigationMap navMap[] = {"cboRight", "cboLeft", "Input", "cboDown", "cboPort0"}, // PanelMisc - {"StatusLine", "Miscellaneous", "Miscellaneous", "BSDSocket", "HideIdle"}, + {"StatusLine", "Miscellaneous", "Miscellaneous", "MasterWP", "HideIdle"}, {"HideIdle", "Miscellaneous", "Miscellaneous", "StatusLine", "ShowGUI"}, {"ShowGUI", "Miscellaneous", "Miscellaneous", "HideIdle", "BSDSocket"}, - {"BSDSocket", "Miscellaneous", "Miscellaneous", "ShowGUI", "numlock"}, + {"BSDSocket", "Miscellaneous", "Miscellaneous", "ShowGUI", "MasterWP"}, + { "MasterWP", "Miscellaneous", "Miscellaneous", "BSDSocket", "numlock" }, {"numlock", "Miscellaneous", "scrolllock", "", ""}, {"scrolllock", "numlock", "", "", ""}, @@ -216,17 +255,19 @@ static NavigationMap navMap[] = {"virtCancel", "virtOK", "virtOK", "virtPath", "virtRW"}, // EditFilesysHardfile - {"hdfDev", "hdfBootPri", "hdfRW", "hdfOK", "hdfPath"}, - {"hdfRW", "hdfDev", "hdfAutoboot", "hdfOK", "hdfPath"}, - {"hdfAutoboot", "hdfRW", "hdfBootPri", "hdfOK", "hdfPath"}, - {"hdfBootPri", "hdfAutoboot", "hdfDev", "hdfCancel", "hdfPath"}, - {"hdfSurface", "hdfReserved", "hdfReserved", "hdfPath", "hdfSectors"}, - {"hdfReserved", "hdfSurface", "hdfSurface", "hdfPath", "hdfBlocksize"}, - {"hdfSectors", "hdfBlocksize", "hdfBlocksize", "hdfSurface", "hdfOK"}, - {"hdfBlocksize", "hdfSectors", "hdfSectors", "hdfReserved", "hdfOK"}, - {"hdfPath", "", "", "hdfBootPri", "hdfReserved"}, - {"hdfOK", "hdfCancel", "hdfCancel", "hdfBlocksize", "hdfBootPri"}, - {"hdfCancel", "hdfOK", "hdfOK", "hdfBlocksize", "hdfBootPri"}, + { "hdfDev", "hdfBootPri", "hdfRW", "hdfOK", "hdfPath" }, + { "hdfRW", "hdfDev", "hdfAutoboot", "hdfOK", "hdfPath" }, + { "hdfAutoboot", "hdfRW", "hdfBootPri", "hdfOK", "hdfPath" }, + { "hdfBootPri", "hdfAutoboot", "hdfDev", "hdfCancel", "hdfPath" }, + { "hdfSurface", "hdfReserved", "hdfReserved", "hdfPath", "hdfSectors" }, + { "hdfReserved", "hdfSurface", "hdfSurface", "hdfPath", "hdfBlocksize" }, + { "hdfSectors", "hdfBlocksize", "hdfBlocksize", "hdfSurface", "hdfController" }, + { "hdfBlocksize", "hdfSectors", "hdfSectors", "hdfReserved", "hdfUnit" }, + { "hdfPath", "", "", "hdfBootPri", "hdfReserved" }, + { "hdfController", "hdfUnit", "hdfUnit", "hdfSectors", "hdfOK" }, + { "hdfUnit", "hdfController", "hdfController", "hdfBlocksize", "hdfOK" }, + { "hdfOK", "hdfCancel", "hdfCancel", "hdfUnit", "hdfBootPri" }, + { "hdfCancel", "hdfOK", "hdfOK", "hdfUnit", "hdfBootPri" }, // CreateFilesysHardfile {"createHdfDev", "createHdfBootPri", "createHdfAutoboot", "createHdfOK", "createHdfPath"}, @@ -254,8 +295,9 @@ bool HandleNavigation(int direction) { string activeName = activeWidget->getId(); bool bFoundEnabled = false; + int tries = 10; - while (!bFoundEnabled) + while (!bFoundEnabled && tries > 0) { string searchFor = ""; @@ -299,6 +341,7 @@ bool HandleNavigation(int direction) } if (searchFor == "") bFoundEnabled = true; // No entry to navigate to -> exit loop + --tries; } if (focusTarget != nullptr) diff --git a/src/osdep/gui/PanelCPU.cpp b/src/osdep/gui/PanelCPU.cpp index 23745fd7..2cf96e28 100644 --- a/src/osdep/gui/PanelCPU.cpp +++ b/src/osdep/gui/PanelCPU.cpp @@ -9,8 +9,10 @@ #include "sysconfig.h" #include "sysdeps.h" #include "options.h" +#include "uae.h" #include "gui.h" #include "gui_handling.h" +#include "newcpu.h" static gcn::Window* grpCPU; static gcn::UaeRadioButton* optCPU68000; @@ -26,6 +28,8 @@ static gcn::UaeRadioButton* optFPUnone; static gcn::UaeRadioButton* optFPU68881; static gcn::UaeRadioButton* optFPU68882; static gcn::UaeRadioButton* optFPUinternal; +static gcn::UaeCheckBox* chkFPUstrict; +static gcn::UaeCheckBox* chkSoftFloat; static gcn::Window* grpCPUSpeed; static gcn::UaeRadioButton* opt7Mhz; static gcn::UaeRadioButton* opt14Mhz; @@ -43,16 +47,16 @@ public: changed_prefs.cpu_model = 68000; changed_prefs.fpu_model = 0; changed_prefs.address_space_24 = true; - changed_prefs.z3fastmem_size = 0; - changed_prefs.rtgmem_size = 0; + changed_prefs.z3fastmem[0].size = 0; + changed_prefs.rtgboards[0].rtgmem_size = 0; } else if (actionEvent.getSource() == optCPU68010) { changed_prefs.cpu_model = 68010; changed_prefs.fpu_model = 0; changed_prefs.address_space_24 = true; - changed_prefs.z3fastmem_size = 0; - changed_prefs.rtgmem_size = 0; + changed_prefs.z3fastmem[0].size = 0; + changed_prefs.rtgboards[0].rtgmem_size = 0; } else if (actionEvent.getSource() == optCPU68020) { @@ -155,7 +159,7 @@ public: } else { - changed_prefs.cpu_compatible = 0; + changed_prefs.cpu_compatible = false; } RefreshPanelCPU(); } @@ -172,7 +176,7 @@ public: if (chkJIT->isSelected()) { changed_prefs.cpu_compatible = 0; - changed_prefs.cachesize = DEFAULT_JIT_CACHE_SIZE; + changed_prefs.cachesize = MAX_JIT_CACHE; } else { @@ -184,6 +188,23 @@ public: static JITActionListener* jitActionListener; +class FPUActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) + { + if (actionEvent.getSource() == chkFPUstrict) { + changed_prefs.fpu_strict = chkFPUstrict->isSelected(); + + } + else if (actionEvent.getSource() == chkSoftFloat) { + changed_prefs.fpu_softfloat = chkSoftFloat->isSelected(); + + } + RefreshPanelCPU(); + } +}; +static FPUActionListener* fpuActionListener; void InitPanelCPU(const struct _ConfigCategory& category) { @@ -191,6 +212,7 @@ void InitPanelCPU(const struct _ConfigCategory& category) cpu24BitActionListener = new CPU24BitActionListener(); cpuCompActionListener = new CPUCompActionListener(); jitActionListener = new JITActionListener(); + fpuActionListener = new FPUActionListener(); optCPU68000 = new gcn::UaeRadioButton("68000", "radiocpugroup"); optCPU68000->addActionListener(cpuButtonActionListener); @@ -246,14 +268,24 @@ void InitPanelCPU(const struct _ConfigCategory& category) optFPUinternal = new gcn::UaeRadioButton("CPU internal", "radiofpugroup"); optFPUinternal->addActionListener(fpuButtonActionListener); + chkFPUstrict = new gcn::UaeCheckBox("More compatible", true); + chkFPUstrict->setId("FPUstrict"); + chkFPUstrict->addActionListener(fpuActionListener); + + chkSoftFloat = new gcn::UaeCheckBox("Softfloat FPU emul.", true); + chkSoftFloat->setId("SoftFloat"); + chkSoftFloat->addActionListener(fpuActionListener); + grpFPU = new gcn::Window("FPU"); grpFPU->setPosition(DISTANCE_BORDER + grpCPU->getWidth() + DISTANCE_NEXT_X, DISTANCE_BORDER); grpFPU->add(optFPUnone, 5, 10); grpFPU->add(optFPU68881, 5, 40); grpFPU->add(optFPU68882, 5, 70); grpFPU->add(optFPUinternal, 5, 100); + grpFPU->add(chkFPUstrict, 5, 140); + grpFPU->add(chkSoftFloat, 5, 170); grpFPU->setMovable(false); - grpFPU->setSize(140, 145); + grpFPU->setSize(180, 215); grpFPU->setBaseColor(gui_baseCol); category.panel->add(grpFPU); @@ -308,8 +340,11 @@ void ExitPanelCPU() delete optFPU68881; delete optFPU68882; delete optFPUinternal; + delete chkFPUstrict; + delete chkSoftFloat; delete grpFPU; delete fpuButtonActionListener; + delete fpuActionListener; delete opt7Mhz; delete opt14Mhz; @@ -358,6 +393,9 @@ void RefreshPanelCPU() optFPU68882->setEnabled(changed_prefs.cpu_model >= 68020 && changed_prefs.cpu_model < 68040); optFPUinternal->setEnabled(changed_prefs.cpu_model == 68040); + chkFPUstrict->setSelected(changed_prefs.fpu_strict); + chkSoftFloat->setSelected(changed_prefs.fpu_softfloat); + if (changed_prefs.m68k_speed == M68K_SPEED_7MHZ_CYCLES) opt7Mhz->setSelected(true); else if (changed_prefs.m68k_speed == M68K_SPEED_14MHZ_CYCLES) @@ -367,3 +405,25 @@ void RefreshPanelCPU() else if (changed_prefs.m68k_speed == -1) optFastest->setSelected(true); } + +bool HelpPanelCPU(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("Select the required Amiga CPU (68000 - 68040)."); + helptext.push_back("If you select 68020, you can choose between 24-bit addressing (68EC020) or 32-bit addressing (68020)."); + helptext.push_back("The option \"More compatible\" is only available if 68000 or 68010 is selected and emulates simple prefetch of"); + helptext.push_back("the 68000. This may improve compatibility in few situations but is not required for most games and demos."); + helptext.push_back(""); + helptext.push_back("JIT enables the Just-in-time compiler. This may break compatibility in some games."); + helptext.push_back(""); + helptext.push_back("The available FPU models depending on the selected CPU."); + helptext.push_back("The option \"More compatible\" activates more accurate rounding and compare of two floats."); + helptext.push_back("\"Softfloat FPU emul.\" aktivates the FPU emulation from QEMU. This is more accurate, but a bit slower."); + helptext.push_back(""); + helptext.push_back("With \"CPU Speed\" you can choose the clock rate of the Amiga."); + helptext.push_back(""); + helptext.push_back("In current version, you will not see a difference in the performance for 68020, 68030 and 68040 CPUs. The cpu"); + helptext.push_back("cycles for the opcodes are based on 68020. The different cycles for 68030 and 68040 may come in a later"); + helptext.push_back("version."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelChipset.cpp b/src/osdep/gui/PanelChipset.cpp index 7b472098..783c4c49 100644 --- a/src/osdep/gui/PanelChipset.cpp +++ b/src/osdep/gui/PanelChipset.cpp @@ -5,6 +5,7 @@ #include "SelectorEntry.hpp" #include "UaeRadioButton.hpp" #include "UaeCheckBox.hpp" +#include "UaeDropDown.hpp" #include "sysconfig.h" #include "sysdeps.h" @@ -14,13 +15,14 @@ #include "custom.h" #include "gui_handling.h" - static gcn::Window* grpChipset; static gcn::UaeRadioButton* optOCS; static gcn::UaeRadioButton* optECSAgnus; static gcn::UaeRadioButton* optECS; static gcn::UaeRadioButton* optAGA; static gcn::UaeCheckBox* chkNTSC; +static gcn::Label *lblChipset; +static gcn::UaeDropDown* cboChipset; static gcn::Window* grpBlitter; static gcn::UaeRadioButton* optBlitNormal; static gcn::UaeRadioButton* optBlitImmed; @@ -31,6 +33,68 @@ static gcn::UaeRadioButton* optCollSprites; static gcn::UaeRadioButton* optCollPlayfield; static gcn::UaeRadioButton* optCollFull; +struct chipset { + int compatible; + char name[32]; +}; +static struct chipset chipsets[] = { + { CP_GENERIC, "Generic" }, + { CP_CD32, "CD32" }, + { CP_A500, "A500" }, + { CP_A500P, "A500+" }, + { CP_A600, "A600" }, + { CP_A1200, "A1200" }, + { CP_A2000, "A2000" }, + { CP_A4000, "A4000" }, + { -1, "" } +}; + +static const int numChipsets = 8; + +class ChipsetListModel : public gcn::ListModel +{ +public: + ChipsetListModel() + { + } + + int getNumberOfElements() override + { + return numChipsets; + } + + std::string getElementAt(int i) override + { + if (i < 0 || i >= numChipsets) + return "---"; + return chipsets[i].name; + } +}; +static ChipsetListModel chipsetList; +static bool bIgnoreListChange = true; + + +class ChipsetActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + if (!bIgnoreListChange) { + if (actionEvent.getSource() == cboChipset) { + //--------------------------------------- + // Chipset selected + //--------------------------------------- + int cs = chipsets[cboChipset->getSelected()].compatible; + if (changed_prefs.cs_compatible != cs) { + changed_prefs.cs_compatible = cs; + built_in_chipset_prefs(&changed_prefs); + RefreshPanelChipset(); + } + } + } + } +}; +static ChipsetActionListener* chipsetActionListener; class ChipsetButtonActionListener : public gcn::ActionListener { @@ -106,6 +170,7 @@ static CollisionButtonActionListener* collisionButtonActionListener; void InitPanelChipset(const struct _ConfigCategory& category) { + chipsetActionListener = new ChipsetActionListener(); chipsetButtonActionListener = new ChipsetButtonActionListener(); ntscButtonActionListener = new NTSCButtonActionListener(); @@ -124,6 +189,15 @@ void InitPanelChipset(const struct _ConfigCategory& category) chkNTSC = new gcn::UaeCheckBox("NTSC"); chkNTSC->addActionListener(ntscButtonActionListener); + lblChipset = new gcn::Label("Extra:"); + lblChipset->setSize(40, LABEL_HEIGHT); + lblChipset->setAlignment(gcn::Graphics::RIGHT); + cboChipset = new gcn::UaeDropDown(&chipsetList); + cboChipset->setSize(75, DROPDOWN_HEIGHT); + cboChipset->setBaseColor(gui_baseCol); + cboChipset->setId("ChipsetExtra"); + cboChipset->addActionListener(chipsetActionListener); + grpChipset = new gcn::Window("Chipset"); grpChipset->setPosition(DISTANCE_BORDER, DISTANCE_BORDER); grpChipset->add(optOCS, 5, 10); @@ -131,6 +205,9 @@ void InitPanelChipset(const struct _ConfigCategory& category) grpChipset->add(optECS, 5, 70); grpChipset->add(optAGA, 5, 100); grpChipset->add(chkNTSC, 5, 140); + grpChipset->add(lblChipset, 115, 10); + grpChipset->add(cboChipset, 115 + lblChipset->getWidth() + 8, 10); + grpChipset->setMovable(false); grpChipset->setSize(120, 185); grpChipset->setBaseColor(gui_baseCol); @@ -201,9 +278,12 @@ void ExitPanelChipset() delete optECS; delete optAGA; delete chkNTSC; + delete lblChipset; + delete cboChipset; delete grpChipset; delete chipsetButtonActionListener; delete ntscButtonActionListener; + delete chipsetActionListener; delete optBlitNormal; delete optBlitImmed; @@ -222,6 +302,17 @@ void ExitPanelChipset() void RefreshPanelChipset() { + bIgnoreListChange = true; + int idx = 0; + for (int i = 0; isetSelected(idx); + bIgnoreListChange = false; + if (changed_prefs.chipset_mask == 0) optOCS->setSelected(true); else if (changed_prefs.chipset_mask == CSMASK_ECS_AGNUS) @@ -240,7 +331,7 @@ void RefreshPanelChipset() else optBlitNormal->setSelected(true); - if (changed_prefs.collision_level == 0) + if (changed_prefs.collision_level == 0) optCollNone->setSelected(true); else if (changed_prefs.collision_level == 1) optCollSprites->setSelected(true); @@ -249,3 +340,23 @@ void RefreshPanelChipset() else optCollFull->setSelected(true); } + +bool HelpPanelChipset(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("If you want to emulate an Amiga 1200, select AGA. For most Amiga 500 games, select \"Full ECS\". Some older"); + helptext.push_back("Amiga games requires \"OCS\" or \"ECS Agnus\". You have to play with these options if a game won't work as"); + helptext.push_back("expected. By selecting an entry in \"Extra\", all internal chipset settings will become the required values for the specified"); + helptext.push_back("Amiga model."); + helptext.push_back("For some games, you have to activate \"NTSC\" (60 Hz instead of 50 Hz) for correct timing."); + helptext.push_back(""); + helptext.push_back("When you see some graphic issues in a game, try \"Immediate\" or \"Wait for blit.\" for blitter and/or disable"); + helptext.push_back("\"Fast copper\"."); + helptext.push_back(""); + helptext.push_back("\"Fast copper\" uses a prediction algorithm instead of checking the copper state on a more regular basis. This may"); + helptext.push_back("cause issues but brings a big performance improvement. The option was removed in WinUAE in an early state,"); + helptext.push_back("but for most games, it works fine and the better performance is helpful for low powered devices."); + helptext.push_back(""); + helptext.push_back("For \"Collision Level\", select \"Sprites and Sprites vs. Playfield\" which is fine for nearly all games."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelConfig.cpp b/src/osdep/gui/PanelConfig.cpp index 34ff03fb..b4ac881a 100644 --- a/src/osdep/gui/PanelConfig.cpp +++ b/src/osdep/gui/PanelConfig.cpp @@ -10,6 +10,7 @@ #include "options.h" #include "gui.h" #include "gui_handling.h" +#include "uae.h" static char last_active_config[MAX_DPATH] = {'\0'}; static int ensureVisible = -1; @@ -43,28 +44,6 @@ bool LoadConfigByName(const char* name) return false; } -void load_builtin_config(int id) -{ - if (changed_prefs.cdslots[0].inuse) - gui_force_rtarea_hdchange(); - discard_prefs(&changed_prefs, 0); - default_prefs(&changed_prefs, 0); - switch (id) - { - case BUILTINID_A500: - built_in_prefs(&changed_prefs, 0, 1, 0, 0); - break; - - case BUILTINID_A1200: - built_in_prefs(&changed_prefs, 4, 0, 0, 0); - break; - - case BUILTINID_CD32: - built_in_prefs(&changed_prefs, 8, 0, 0, 0); - break; - } -} - void SetLastActiveConfig(const char* filename) { extractFileName(filename, last_active_config); @@ -126,18 +105,12 @@ public: // Load selected configuration //----------------------------------------------- i = lstConfigs->getSelected(); - if (i != -1) - { - if (ConfigFilesList[i]->BuiltInID != BUILTINID_NONE) - { - load_builtin_config(ConfigFilesList[i]->BuiltInID); - strcpy(changed_prefs.description, ConfigFilesList[i]->Description); - } - else - { - target_cfgfile_load(&changed_prefs, ConfigFilesList[i]->FullPath, 0, 0); - } - strcpy(last_active_config, ConfigFilesList[i]->Name); + if (emulating) { + uae_restart(-1, ConfigFilesList[i]->FullPath); + } + else { + target_cfgfile_load(&changed_prefs, ConfigFilesList[i]->FullPath, 0, 0); + strncpy(last_active_config, ConfigFilesList[i]->Name, MAX_PATH); DisableResume(); RefreshAllPanels(); } @@ -171,9 +144,9 @@ public: //----------------------------------------------- char msg[MAX_DPATH]; i = lstConfigs->getSelected(); - if (i >= 0 && ConfigFilesList[i]->BuiltInID == BUILTINID_NONE && strcmp(ConfigFilesList[i]->Name, OPTIONSFILENAME)) + if (i >= 0 && strcmp(ConfigFilesList[i]->Name, OPTIONSFILENAME)) { - snprintf(msg, sizeof msg, "Do you want to delete '%s' ?", ConfigFilesList[i]->Name); + snprintf(msg, 256, "Do you want to delete '%s' ?", ConfigFilesList[i]->Name); if (ShowMessage("Delete Configuration", msg, "", "Yes", "No")) { remove(ConfigFilesList[i]->FullPath); @@ -206,18 +179,17 @@ public: //----------------------------------------------- // Selected same config again -> load and start it //----------------------------------------------- - if (ConfigFilesList[selected_item]->BuiltInID != BUILTINID_NONE) - { - load_builtin_config(ConfigFilesList[selected_item]->BuiltInID); - strcpy(changed_prefs.description, ConfigFilesList[selected_item]->Description); + if (emulating) { + uae_restart(0, ConfigFilesList[selected_item]->FullPath); } - else - { + else { target_cfgfile_load(&changed_prefs, ConfigFilesList[selected_item]->FullPath, 0, 0); + strncpy(last_active_config, ConfigFilesList[selected_item]->Name, MAX_PATH); + DisableResume(); + RefreshAllPanels(); + uae_reset(0, 1); } - strcpy(last_active_config, ConfigFilesList[selected_item]->Name); - DisableResume(); - RefreshAllPanels(); + gui_running = false; } else { @@ -375,3 +347,16 @@ void RefreshPanelConfig() } } } + +bool HelpPanelConfig(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("To load a configuration, select the entry in the list and then click on \"Load\". If you doubleclick on an entry"); + helptext.push_back("in the list, the emulation starts with this configuration."); + helptext.push_back(""); + helptext.push_back("If you want to create a new configuration, setup all options, enter a new name in \"Name\", provide a short"); + helptext.push_back("description and then click on \"Save\"."); + helptext.push_back(""); + helptext.push_back("\"Delete\" will delete the selected configuration."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelDisplay.cpp b/src/osdep/gui/PanelDisplay.cpp index 3b9b9df4..fa949fed 100644 --- a/src/osdep/gui/PanelDisplay.cpp +++ b/src/osdep/gui/PanelDisplay.cpp @@ -112,3 +112,16 @@ void RefreshPanelDisplay() else if (changed_prefs.scaling_method == 1) optLinear->setSelected(true); } + +bool HelpPanelDisplay(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("Select the scaling method for the Amiga screen. The default option \"Auto\", will try to find the best looking"); + helptext.push_back("scaling method depending on your monitor's resolution. \"Nearest Neighbor\" will give you a more pixelated"); + helptext.push_back("and crisp image, but it may come with some distortion if your resolution is not an exact multiple."); + helptext.push_back("\"Linear\" will give you a smoother scaling but some people might find it a bit blurry."); + helptext.push_back(""); + helptext.push_back("When you activate \"Frameskip\", only every second frame is drawn. This will improve performance and some"); + helptext.push_back("more games are playable."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelFloppy.cpp b/src/osdep/gui/PanelFloppy.cpp index b3acd115..f70440a1 100644 --- a/src/osdep/gui/PanelFloppy.cpp +++ b/src/osdep/gui/PanelFloppy.cpp @@ -30,13 +30,13 @@ static gcn::Button* cmdSaveForDisk; static gcn::Button* cmdCreateDDDisk; static gcn::Button* cmdCreateHDDisk; -static const char* diskfile_filter[] = {".adf", ".adz", ".zip", ".gz", ".dms", "\0"}; +static const char *diskfile_filter[] = { ".adf", ".adz", ".fdi", ".zip", ".dms", ".gz", ".xz", "\0" }; static const char* drivespeedlist[] = {"100% (compatible)", "200%", "400%", "800%"}; static const int drivespeedvalues[] = {100, 200, 400, 800}; static void AdjustDropDownControls(); static bool bLoadConfigForDisk = false; - +static bool bIgnoreListChange = false; class DriveTypeListModel : public gcn::ListModel { @@ -104,6 +104,7 @@ public: changed_prefs.floppyslots[i].dfxtype = cboDFxType[i]->getSelected() - 1; } RefreshPanelFloppy(); + RefreshPanelQuickstart(); } }; @@ -136,10 +137,17 @@ public: // Write-protect changed //--------------------------------------- disk_setwriteprotect(&changed_prefs, i, changed_prefs.floppyslots[i].df, chkDFxWriteProtect[i]->isSelected()); + if (disk_getwriteprotect(&changed_prefs, changed_prefs.floppyslots[i].df) != chkDFxWriteProtect[i]->isSelected()) { + // Failed to change write protection -> maybe filesystem doesn't support this + chkDFxWriteProtect[i]->setSelected(!chkDFxWriteProtect[i]->isSelected()); + ShowMessage("Set/Clear write protect", "Failed to change write permission.", "Maybe underlying filesystem doesn't support this.", "Ok", ""); + } + DISK_reinsert(i); } } } RefreshPanelFloppy(); + RefreshPanelQuickstart(); } }; @@ -159,6 +167,7 @@ public: // Show info about current disk-image //--------------------------------------- if (changed_prefs.floppyslots[i].dfxtype != DRV_NONE && strlen(changed_prefs.floppyslots[i].df) > 0); // ToDo: Show info dialog + //ToDo: Show info dialog } else if (actionEvent.getSource() == cmdDFxEject[i]) { @@ -203,14 +212,13 @@ public: } } RefreshPanelFloppy(); + RefreshPanelQuickstart(); } }; static DFxButtonActionListener* dfxButtonActionListener; -static bool bIgnoreListChange = false; - class DiskFileActionListener : public gcn::ActionListener { public: @@ -260,6 +268,7 @@ public: } } RefreshPanelFloppy(); + RefreshPanelQuickstart(); } }; @@ -325,7 +334,7 @@ public: extractFileName(tmp, diskname); removeFileExtension(diskname); diskname[31] = '\0'; - disk_creatediskfile(tmp, 0, DRV_35_DD, diskname, false, false, nullptr); + disk_creatediskfile(&changed_prefs, tmp, 0, DRV_35_DD, -1, diskname, false, false, nullptr); AddFileToDiskList(tmp, 1); extractPath(tmp, currentDir); } @@ -342,7 +351,7 @@ public: extractFileName(tmp, diskname); removeFileExtension(diskname); diskname[31] = '\0'; - disk_creatediskfile(tmp, 0, DRV_35_HD, diskname, false, false, nullptr); + disk_creatediskfile(&changed_prefs, tmp, 0, DRV_35_HD, -1, diskname, false, false, nullptr); AddFileToDiskList(tmp, 1); extractPath(tmp, currentDir); } @@ -563,6 +572,7 @@ void RefreshPanelFloppy() chkDFx[i]->setEnabled(prevAvailable); cboDFxType[i]->setEnabled(prevAvailable); + chkDFxWriteProtect[i]->setEnabled(driveEnabled && !changed_prefs.floppy_read_only); cmdDFxInfo[i]->setEnabled(driveEnabled); cmdDFxEject[i]->setEnabled(driveEnabled); cmdDFxSelect[i]->setEnabled(driveEnabled); @@ -585,3 +595,23 @@ void RefreshPanelFloppy() } } } + +bool HelpPanelFloppy(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("You can enable/disable each drive by clicking the checkbox next to DFx or select the drive type in the dropdown"); + helptext.push_back("control. \"3.5'' DD\" is the right choise for nearly all ADF and ADZ files."); + helptext.push_back("The option \"Write-protected\" indicates if the emulator can write to the ADF. Changing the write protection of the"); + helptext.push_back("disk file may fail because of missing rights on the host filesystem."); + helptext.push_back("The button \"...\" opens a dialog to select the required disk file. With the dropdown control, you can select one of"); + helptext.push_back("the disks you recently used."); + helptext.push_back(""); + helptext.push_back("You can reduce the loading time for lot of games by increasing the floppy drive emulation speed. A few games"); + helptext.push_back("will not load with higher drive speed and you have to select 100%."); + helptext.push_back(""); + helptext.push_back("\"Save config for disk\" will create a new configuration file with the name of the disk in DF0. This configuration will"); + helptext.push_back("be loaded each time you select the disk and have the option \"Load config with same name as disk\" enabled."); + helptext.push_back(""); + helptext.push_back("With the buttons \"Create 3.5'' DD disk\" and \"Create 3.5'' HD disk\" you can create a new and empty disk."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelHD.cpp b/src/osdep/gui/PanelHD.cpp index 7f0bc70f..40e30148 100644 --- a/src/osdep/gui/PanelHD.cpp +++ b/src/osdep/gui/PanelHD.cpp @@ -55,6 +55,7 @@ static gcn::ImageButton* listCmdDelete[MAX_HD_DEVICES]; static gcn::Button* cmdAddDirectory; static gcn::Button* cmdAddHardfile; static gcn::Button* cmdCreateHardfile; +static gcn::UaeCheckBox* chkHDReadOnly; static gcn::UaeCheckBox* chkCD; static gcn::UaeDropDown* cboCDFile; static gcn::Button* cmdCDEject; @@ -258,6 +259,7 @@ public: cmdCDSelect->requestFocus(); } RefreshPanelHD(); + RefreshPanelQuickstart(); } }; @@ -271,13 +273,16 @@ public: { if (actionEvent.getSource() == sldCDVol) { - int newvol = 100 - int(sldCDVol->getValue()); + int newvol = 100 - (int)sldCDVol->getValue(); if (changed_prefs.sound_volume_cd != newvol) { changed_prefs.sound_volume_cd = newvol; RefreshPanelHD(); } } + else if (actionEvent.getSource() == chkHDReadOnly) { + changed_prefs.harddrive_read_only = chkHDReadOnly->isSelected(); + } } }; @@ -395,6 +400,10 @@ void InitPanelHD(const struct _ConfigCategory& category) cdFileActionListener = new CDFileActionListener(); genericActionListener = new GenericActionListener(); + chkHDReadOnly = new gcn::UaeCheckBox("Master harddrive write protection"); + chkHDReadOnly->setId("chkHDRO"); + chkHDReadOnly->addActionListener(genericActionListener); + chkCD = new gcn::UaeCheckBox("CD drive"); chkCD->addActionListener(cdCheckActionListener); @@ -459,6 +468,9 @@ void InitPanelHD(const struct _ConfigCategory& category) category.panel->add(cmdCreateHardfile, cmdAddHardfile->getX() + cmdAddHardfile->getWidth() + DISTANCE_NEXT_X, posY); posY += cmdAddDirectory->getHeight() + 2 * DISTANCE_NEXT_Y; + category.panel->add(chkHDReadOnly, DISTANCE_BORDER, posY); + + posY += chkHDReadOnly->getHeight() + DISTANCE_NEXT_Y + 4; category.panel->add(chkCD, DISTANCE_BORDER, posY + 2); category.panel->add(cmdCDEject, category.panel->getWidth() - cmdCDEject->getWidth() - DISTANCE_NEXT_X - cmdCDSelect->getWidth() - DISTANCE_BORDER, posY); category.panel->add(cmdCDSelect, category.panel->getWidth() - cmdCDSelect->getWidth() - DISTANCE_BORDER, posY); @@ -494,6 +506,7 @@ void ExitPanelHD() delete cmdAddDirectory; delete cmdAddHardfile; delete cmdCreateHardfile; + delete chkHDReadOnly; delete chkCD; delete cmdCDEject; @@ -600,6 +613,8 @@ void RefreshPanelHD() } } + chkHDReadOnly->setSelected(changed_prefs.harddrive_read_only); + chkCD->setSelected(changed_prefs.cdslots[0].inuse); cmdCDEject->setEnabled(changed_prefs.cdslots[0].inuse); cmdCDSelect->setEnabled(changed_prefs.cdslots[0].inuse); @@ -616,3 +631,21 @@ int count_HDs(struct uae_prefs* p) { return p->mountitems; } + +bool HelpPanelHD(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("Use \"Add Directory\" to add a folder or \"Add Hardfile\" to add a HDF file as a hard disk. To edit the settings of a"); + helptext.push_back("HDD, click on \"...\" left to the entry in the list. With the red cross, you can delete an entry."); + helptext.push_back(""); + helptext.push_back("With \"Create Hardfile\", you can create a new formatted HDF file up to 2 GB. For large files, it will take some time"); + helptext.push_back("to create the new hard disk. You have to format the new HDD in the Amiga via the Workbench."); + helptext.push_back(""); + helptext.push_back("If \"Master harddrive write protection\" is activated, you can't write to any HD."); + helptext.push_back(""); + helptext.push_back("Activate \"CD drive\" to emulate CD for CD32. Use \"Eject\" to remove current CD and click on \"...\" to open a dialog"); + helptext.push_back("to select the iso/cue file for CD emulation."); + helptext.push_back(""); + helptext.push_back("In current version, WAV, MP3 and FLAC is supported for audio tracks."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelInput.cpp b/src/osdep/gui/PanelInput.cpp index ecd98801..a8c24dd3 100644 --- a/src/osdep/gui/PanelInput.cpp +++ b/src/osdep/gui/PanelInput.cpp @@ -754,3 +754,16 @@ void RefreshPanelInput() txtRight->setText(changed_prefs.custom_right); txtPlay->setText(changed_prefs.custom_play); } + +bool HelpPanelInput(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("You can select the control type for both ports and the rate for autofire."); + helptext.push_back(""); + helptext.push_back("Set the emulated mouse speed to .25x, .5x, 1x, 2x and 4x to slow down or speed up the mouse."); + helptext.push_back(""); + helptext.push_back("When you activate \"Custom Control\", you can define which Amiga key should be emulated by pressing one of the"); + helptext.push_back("ABXY- or D-pad buttons. Useful to setup controls for pinball games. During emulation, you can switch between"); + helptext.push_back("regular buttons and custom settings by pressing left shoulder button and 'c'."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelMisc.cpp b/src/osdep/gui/PanelMisc.cpp index e540d751..f255ab62 100644 --- a/src/osdep/gui/PanelMisc.cpp +++ b/src/osdep/gui/PanelMisc.cpp @@ -18,6 +18,7 @@ static gcn::UaeCheckBox* chkStatusLine; static gcn::UaeCheckBox* chkHideIdleLed; static gcn::UaeCheckBox* chkShowGUI; static gcn::UaeCheckBox* chkBSDSocket; +static gcn::UaeCheckBox* chkMasterWP; static gcn::Label* lblOpenGUI; static gcn::TextField* txtOpenGUI; @@ -72,6 +73,12 @@ public: else if (actionEvent.getSource() == chkBSDSocket) changed_prefs.socket_emu = chkBSDSocket->isSelected(); + else if (actionEvent.getSource() == chkMasterWP) { + changed_prefs.floppy_read_only = chkMasterWP->isSelected(); + RefreshPanelQuickstart(); + RefreshPanelFloppy(); + } + else if (actionEvent.getSource() == cmdOpenGUI) { const char* key = ShowMessageForInput("Press a key", "Press a key to map to Open the GUI", "Cancel"); @@ -123,6 +130,10 @@ void InitPanelMisc(const struct _ConfigCategory& category) chkBSDSocket->setId("BSDSocket"); chkBSDSocket->addActionListener(miscActionListener); + chkMasterWP = new gcn::UaeCheckBox("Master floppy write protection"); + chkMasterWP->setId("MasterWP"); + chkMasterWP->addActionListener(miscActionListener); + lblNumLock = new gcn::Label("NumLock:"); lblNumLock->setSize(85, LABEL_HEIGHT); lblNumLock->setAlignment(gcn::Graphics::RIGHT); @@ -203,6 +214,7 @@ void ExitPanelMisc() delete chkHideIdleLed; delete chkShowGUI; delete chkBSDSocket; + delete chkMasterWP; delete lblScrLock; delete lblNumLock; @@ -223,9 +235,29 @@ void RefreshPanelMisc() chkStatusLine->setSelected(changed_prefs.leds_on_screen); chkShowGUI->setSelected(changed_prefs.start_gui); chkBSDSocket->setSelected(changed_prefs.socket_emu); + chkMasterWP->setSelected(changed_prefs.floppy_read_only); + cboKBDLed_num->setSelected(changed_prefs.kbd_led_num); cboKBDLed_scr->setSelected(changed_prefs.kbd_led_scr); txtOpenGUI->setText(changed_prefs.open_gui != "" ? changed_prefs.open_gui : "Click to map"); txtKeyForQuit->setText(changed_prefs.quit_amiberry != "" ? changed_prefs.quit_amiberry : "Click to map"); } + +bool HelpPanelMisc(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("\"Status Line\" shows/hides the status line indicator. The first value in the status line"); + helptext.push_back("shows the idle time of the CPU in %, the second value is the current frame rate."); + helptext.push_back("When you have a HDD in your Amiga emulation, the HD indicator shows read (blue) and"); + helptext.push_back("write (red) access to the HDD. The next values are showing the track number for each disk"); + helptext.push_back("drive and indicates disk access."); + helptext.push_back(""); + helptext.push_back("When you deactivate the option \"Show GUI on startup\" and use this configuration by specifying it with the"); + helptext.push_back("command line parameter \"-config=\", the emulation starts directly without showing the GUI."); + helptext.push_back(""); + helptext.push_back("\"bsdsocket.library\" enables network functions (i.e. for web browsers in OS3.9)."); + helptext.push_back(""); + helptext.push_back("\"Master floppy drive protection\" will disable all write access to floppy disks."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelPaths.cpp b/src/osdep/gui/PanelPaths.cpp index f2a43c7c..6aff73a4 100644 --- a/src/osdep/gui/PanelPaths.cpp +++ b/src/osdep/gui/PanelPaths.cpp @@ -146,3 +146,14 @@ void RefreshPanelPaths() fetch_configurationpath(tmp, sizeof tmp); txtConfigPath->setText(tmp); } + +bool HelpPanelPaths(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("Specify the location of your kickstart roms and the folder where the configuration files should be stored."); + helptext.push_back("Use the \"...\" button to open a dialog to choose the folder."); + helptext.push_back(""); + helptext.push_back("After changing the location of the kickstart roms, click on \"Rescan ROMS\" to refresh the list of the available"); + helptext.push_back("ROMs."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelQuickstart.cpp b/src/osdep/gui/PanelQuickstart.cpp new file mode 100644 index 00000000..8b51ec8b --- /dev/null +++ b/src/osdep/gui/PanelQuickstart.cpp @@ -0,0 +1,898 @@ +#include +#include +#include +#include "guisan/sdl/sdltruetypefont.hpp" +#include "SelectorEntry.hpp" +#include "UaeRadioButton.hpp" +#include "UaeDropDown.hpp" +#include "UaeCheckBox.hpp" + +#include "sysconfig.h" +#include "sysdeps.h" +#include "config.h" +#include "options.h" +#include "memory.h" +#include "disk.h" +#include "uae.h" +#include "autoconf.h" +#include "filesys.h" +#include "blkdev.h" +#include "gui.h" +#include "gui_handling.h" + + +static gcn::Label *lblModel; +static gcn::UaeDropDown* cboModel; +static gcn::Label *lblConfig; +static gcn::UaeDropDown* cboConfig; +static gcn::UaeCheckBox* chkNTSC; + +static gcn::UaeCheckBox* chkDFx[2]; +static gcn::UaeCheckBox* chkDFxWriteProtect[2]; +static gcn::Button* cmdDFxInfo[2]; +static gcn::Button* cmdDFxEject[2]; +static gcn::Button* cmdDFxSelect[2]; +static gcn::UaeDropDown* cboDFxFile[2]; + +static gcn::UaeCheckBox* chkCD; +static gcn::Button* cmdCDEject; +static gcn::Button* cmdCDSelect; +static gcn::UaeDropDown* cboCDFile; + +static gcn::UaeCheckBox* chkQuickstartMode; + + +struct amigamodels { + int compalevels; + char name[32]; + char configs[8][128]; +}; +static struct amigamodels amodels[] = { + { 4, "Amiga 500",{ + "1.3 ROM, OCS, 512 KB Chip + 512 KB Slow RAM (most common)", + "1.3 ROM, ECS Agnus, 512 KB Chip RAM + 512 KB Slow RAM", + "1.3 ROM, ECS Agnus, 1 MB Chip RAM", + "1.3 ROM, OCS Agnus, 512 KB Chip RAM", + "1.2 ROM, OCS Agnus, 512 KB Chip RAM", + "1.2 ROM, OCS Agnus, 512 KB Chip RAM + 512 KB Slow RAM", + "\0" } }, + { 4, "Amiga 500+",{ + "Basic non-expanded configuration", + "2 MB Chip RAM expanded configuration", + "MB Fast RAM expanded configuration\n", + "\0" } }, + { 4, "Amiga 600",{ + "Basic non-expanded configuration", + "2 MB Chip RAM expanded configuration", + "n MB Fast RAM expanded configuration", + "\0" } }, + { 4, "Amiga 1200",{ + "Basic non-expanded configuration", + "4 MB Fast RAM expanded configuration", + "\0" } }, + // { 2, "Amiga 3000", { + // "1.4 ROM, 2MB Chip + 8MB Fast", + // "2.04 ROM, 2MB Chip + 8MB Fast", + // "3.1 ROM, 2MB Chip + 8MB Fast", + // "\0" } }, + { 1, "Amiga 4000",{ + "68030, 3.1 ROM, 2MB Chip + 8MB Fast", + "68040, 3.1 ROM, 2MB Chip + 8MB Fast", + "\0" } }, + { 3, "CD32",{ + "CD32", + "CD32 with Full Motion Video cartridge", + "\0" } }, + { -1 } +}; + +static const int numModels = 6; +static int numModelConfigs = 0; +static bool bIgnoreListChange = true; + + +static const char *diskfile_filter[] = { ".adf", ".adz", ".fdi", ".zip", ".dms", ".gz", ".xz", "\0" }; +static const char *cdfile_filter[] = { ".cue", ".ccd", ".iso", "\0" }; + +static void AdjustDropDownControls(void); + +static void CountModelConfigs(void) +{ + numModelConfigs = 0; + if (quickstart_model >= 0 && quickstart_model < numModels) { + for (int i = 0; i<8; ++i) { + if (amodels[quickstart_model].configs[i][0] == '\0') + break; + ++numModelConfigs; + } + } +} + + +static void SetControlState(int model) +{ + bool df1Visible = true; + bool cdVisible = false; + bool df0Editable = true; + + switch (model) { + case 0: // A500 + case 1: // A500+ + case 2: // A600 + case 3: // A1200 + case 4: // A4000 + break; + + case 5: // CD32 + // No floppy drive available, CD available + df0Editable = false; + df1Visible = false; + cdVisible = true; + break; + } + + chkDFxWriteProtect[0]->setEnabled(df0Editable && !changed_prefs.floppy_read_only); + cmdDFxInfo[0]->setEnabled(df0Editable); + cmdDFxEject[0]->setEnabled(df0Editable); + cmdDFxSelect[0]->setEnabled(df0Editable); + cboDFxFile[0]->setEnabled(df0Editable); + + chkDFx[1]->setVisible(df1Visible); + chkDFxWriteProtect[1]->setVisible(df1Visible); + cmdDFxInfo[1]->setVisible(df1Visible); + cmdDFxEject[1]->setVisible(df1Visible); + cmdDFxSelect[1]->setVisible(df1Visible); + cboDFxFile[1]->setVisible(df1Visible); + + chkCD->setVisible(cdVisible); + cmdCDEject->setVisible(cdVisible); + cmdCDSelect->setVisible(cdVisible); + cboCDFile->setVisible(cdVisible); +} + + +static void AdjustPrefs(void) +{ + int old_cs = changed_prefs.cs_compatible; + + built_in_prefs(&changed_prefs, quickstart_model, quickstart_conf, 0, 0); + switch (quickstart_model) { + case 0: // A500 + case 1: // A500+ + case 2: // A600 + case 3: // A1200 + case 4: // A4000 + // df0 always active + changed_prefs.floppyslots[0].dfxtype = DRV_35_DD; + + // No CD available + changed_prefs.cdslots[0].inuse = false; + changed_prefs.cdslots[0].type = SCSI_UNIT_DISABLED; + break; + + case 5: // CD32 + // No floppy drive available, CD available + changed_prefs.floppyslots[0].dfxtype = DRV_NONE; + changed_prefs.floppyslots[1].dfxtype = DRV_NONE; + changed_prefs.cdslots[0].inuse = true; + changed_prefs.cdslots[0].type = SCSI_UNIT_IMAGE; + break; + } + + if (emulating && old_cs != changed_prefs.cs_compatible) + uae_restart(-1, NULL); +} + + +static void SetModelFromConfig(void) +{ + switch (changed_prefs.cs_compatible) { + case CP_A500: + quickstart_model = 0; + if (changed_prefs.chipset_mask == 0) + quickstart_conf = 0; + else if (changed_prefs.chipmem_size == 0x100000) + quickstart_conf = 2; + else + quickstart_conf = 1; + break; + + case CP_A500P: + quickstart_model = 1; + if (changed_prefs.chipmem_size == 0x200000) + quickstart_conf = 1; + else if (changed_prefs.fastmem[0].size == 0x400000) + quickstart_conf = 2; + else + quickstart_conf = 1; + break; + + case CP_A600: + quickstart_model = 2; + if (changed_prefs.chipmem_size == 0x200000) + quickstart_conf = 1; + else if (changed_prefs.fastmem[0].size == 0x400000) + quickstart_conf = 2; + else + quickstart_conf = 1; + break; + + case CP_A1200: + quickstart_model = 3; + if (changed_prefs.fastmem[0].size == 0x400000) + quickstart_conf = 1; + else + quickstart_conf = 0; + break; + + case CP_A4000: + quickstart_model = 4; + if (changed_prefs.cpu_model == 68040) + quickstart_conf = 1; + else + quickstart_conf = 0; + break; + + case CP_CD32: + quickstart_model = 5; + if (changed_prefs.cs_cd32fmv) + quickstart_conf = 1; + else + quickstart_conf = 0; + break; + + default: + if (changed_prefs.cpu_model == 68000) + quickstart_model = 0; + else if (changed_prefs.cpu_model == 68020) + quickstart_model = 3; + else + quickstart_model = 4; + quickstart_conf = 0; + } + cboModel->setSelected(quickstart_model); +} + + +class AmigaModelListModel : public gcn::ListModel +{ +public: + AmigaModelListModel() + { + } + + int getNumberOfElements() override + { + return numModels; + } + + std::string getElementAt(int i) override + { + if (i < 0 || i >= numModels) + return "---"; + return amodels[i].name; + } +}; +static AmigaModelListModel amigaModelList; + + +class AmigaConfigListModel : public gcn::ListModel +{ +public: + AmigaConfigListModel() + { + } + + int getNumberOfElements() override + { + return numModelConfigs; + } + + std::string getElementAt(int i) override + { + if (quickstart_model < 0 || i < 0 || i >= numModelConfigs) + return "---"; + return amodels[quickstart_model].configs[i]; + } +}; +static AmigaConfigListModel amigaConfigList; + + +class QSDiskfileListModel : public gcn::ListModel +{ +public: + QSDiskfileListModel() + { + } + + int getNumberOfElements() override + { + return lstMRUDiskList.size(); + } + + std::string getElementAt(int i) override + { + if (i < 0 || i >= lstMRUDiskList.size()) + return "---"; + return lstMRUDiskList[i]; + } +}; +static QSDiskfileListModel diskfileList; + + +class QSCDfileListModel : public gcn::ListModel +{ +public: + QSCDfileListModel() + { + } + + int getNumberOfElements() override + { + return lstMRUCDList.size(); + } + + std::string getElementAt(int i) override + { + if (i < 0 || i >= lstMRUCDList.size()) + return "---"; + return lstMRUCDList[i]; + } +}; +static QSCDfileListModel cdfileList; + + +class QSCDButtonActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + if (actionEvent.getSource() == cmdCDEject) { + //--------------------------------------- + // Eject CD from drive + //--------------------------------------- + strncpy(changed_prefs.cdslots[0].name, "", MAX_DPATH); + AdjustDropDownControls(); + } + else if (actionEvent.getSource() == cmdCDSelect) { + char tmp[MAX_DPATH]; + + if (strlen(changed_prefs.cdslots[0].name) > 0) + strncpy(tmp, changed_prefs.cdslots[0].name, MAX_DPATH); + else + strncpy(tmp, currentDir, MAX_DPATH); + + if (SelectFile("Select CD image file", tmp, cdfile_filter)) + { + if (strncmp(changed_prefs.cdslots[0].name, tmp, MAX_DPATH)) + { + strncpy(changed_prefs.cdslots[0].name, tmp, sizeof(changed_prefs.cdslots[0].name)); + changed_prefs.cdslots[0].inuse = true; + changed_prefs.cdslots[0].type = SCSI_UNIT_IMAGE; + AddFileToCDList(tmp, 1); + extractPath(tmp, currentDir); + + AdjustDropDownControls(); + } + } + cmdCDSelect->requestFocus(); + } + RefreshPanelHD(); + RefreshPanelQuickstart(); + } +}; +static QSCDButtonActionListener* cdButtonActionListener; + + +class QSCDFileActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + //--------------------------------------- + // CD image from list selected + //--------------------------------------- + if (!bIgnoreListChange) { + int idx = cboCDFile->getSelected(); + + if (idx < 0) { + strncpy(changed_prefs.cdslots[0].name, "", MAX_DPATH); + AdjustDropDownControls(); + } + else { + if (cdfileList.getElementAt(idx).compare(changed_prefs.cdslots[0].name)) + { + strncpy(changed_prefs.cdslots[0].name, cdfileList.getElementAt(idx).c_str(), sizeof(changed_prefs.cdslots[0].name)); + changed_prefs.cdslots[0].inuse = true; + changed_prefs.cdslots[0].type = SCSI_UNIT_IMAGE; + lstMRUCDList.erase(lstMRUCDList.begin() + idx); + lstMRUCDList.insert(lstMRUCDList.begin(), changed_prefs.cdslots[0].name); + bIgnoreListChange = true; + cboCDFile->setSelected(0); + bIgnoreListChange = false; + } + } + } + RefreshPanelHD(); + RefreshPanelQuickstart(); + } +}; +static QSCDFileActionListener* cdFileActionListener; + + +class AmigaModelActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + if (!bIgnoreListChange) { + if (actionEvent.getSource() == cboModel) { + //--------------------------------------- + // Amiga model selected + //--------------------------------------- + if (quickstart_model != cboModel->getSelected()) { + quickstart_model = cboModel->getSelected(); + CountModelConfigs(); + cboConfig->setSelected(0); + SetControlState(quickstart_model); + AdjustPrefs(); + DisableResume(); + } + } + else if (actionEvent.getSource() == cboConfig) { + //--------------------------------------- + // Model configuration selected + //--------------------------------------- + if (quickstart_conf != cboConfig->getSelected()) { + quickstart_conf = cboConfig->getSelected(); + AdjustPrefs(); + } + } + RefreshAllPanels(); + } + } +}; +static AmigaModelActionListener* amigaModelActionListener; + + +class QSNTSCButtonActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + if (chkNTSC->isSelected()) { + changed_prefs.ntscmode = true; + changed_prefs.chipset_refreshrate = 60; + } + else { + changed_prefs.ntscmode = false; + changed_prefs.chipset_refreshrate = 50; + } + RefreshPanelChipset(); + } +}; +static QSNTSCButtonActionListener* ntscButtonActionListener; + + +class QSDFxCheckActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + for (int i = 0; i<2; ++i) { + if (actionEvent.getSource() == chkDFx[i]) { + //--------------------------------------- + // Drive enabled/disabled + //--------------------------------------- + if (chkDFx[i]->isSelected()) + changed_prefs.floppyslots[i].dfxtype = DRV_35_DD; + else + changed_prefs.floppyslots[i].dfxtype = DRV_NONE; + } + else if (actionEvent.getSource() == chkDFxWriteProtect[i]) { + //--------------------------------------- + // Write-protect changed + //--------------------------------------- + disk_setwriteprotect(&changed_prefs, i, changed_prefs.floppyslots[i].df, chkDFxWriteProtect[i]->isSelected()); + if (disk_getwriteprotect(&changed_prefs, changed_prefs.floppyslots[i].df) != chkDFxWriteProtect[i]->isSelected()) { + // Failed to change write protection -> maybe filesystem doesn't support this + ShowMessage("Set/Clear write protect", "Failed to change write permission.", "Maybe underlying filesystem doesn't support this.", "Ok", ""); + } + DISK_reinsert(i); + } + } + + RefreshPanelFloppy(); + RefreshPanelQuickstart(); + } +}; +static QSDFxCheckActionListener* dfxCheckActionListener; + + +class QSDFxButtonActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + for (int i = 0; i<2; ++i) { + if (actionEvent.getSource() == cmdDFxInfo[i]) { + //--------------------------------------- + // Show info about current disk-image + //--------------------------------------- + if (changed_prefs.floppyslots[i].dfxtype != DRV_NONE && strlen(changed_prefs.floppyslots[i].df) > 0) + ; // ToDo: Show info dialog + } + else if (actionEvent.getSource() == cmdDFxEject[i]) { + //--------------------------------------- + // Eject disk from drive + //--------------------------------------- + disk_eject(i); + strncpy(changed_prefs.floppyslots[i].df, "", MAX_DPATH); + AdjustDropDownControls(); + } + else if (actionEvent.getSource() == cmdDFxSelect[i]) { + //--------------------------------------- + // Select disk for drive + //--------------------------------------- + char tmp[MAX_PATH]; + + if (strlen(changed_prefs.floppyslots[i].df) > 0) + strncpy(tmp, changed_prefs.floppyslots[i].df, MAX_PATH); + else + strncpy(tmp, currentDir, MAX_PATH); + if (SelectFile("Select disk image file", tmp, diskfile_filter)) + { + if (strncmp(changed_prefs.floppyslots[i].df, tmp, MAX_PATH)) + { + strncpy(changed_prefs.floppyslots[i].df, tmp, sizeof(changed_prefs.floppyslots[i].df)); + disk_insert(i, tmp); + AddFileToDiskList(tmp, 1); + extractPath(tmp, currentDir); + + AdjustDropDownControls(); + } + } + cmdDFxSelect[i]->requestFocus(); + } + } + + RefreshPanelFloppy(); + RefreshPanelQuickstart(); + } +}; +static QSDFxButtonActionListener* dfxButtonActionListener; + + +class QSDiskFileActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + for (int i = 0; i<2; ++i) { + if (actionEvent.getSource() == cboDFxFile[i]) { + //--------------------------------------- + // Diskimage from list selected + //--------------------------------------- + if (!bIgnoreListChange) { + int idx = cboDFxFile[i]->getSelected(); + + if (idx < 0) { + disk_eject(i); + strncpy(changed_prefs.floppyslots[i].df, "", MAX_DPATH); + AdjustDropDownControls(); + } + else { + if (diskfileList.getElementAt(idx).compare(changed_prefs.floppyslots[i].df)) { + strncpy(changed_prefs.floppyslots[i].df, diskfileList.getElementAt(idx).c_str(), sizeof(changed_prefs.floppyslots[i].df)); + disk_insert(i, changed_prefs.floppyslots[i].df); + lstMRUDiskList.erase(lstMRUDiskList.begin() + idx); + lstMRUDiskList.insert(lstMRUDiskList.begin(), changed_prefs.floppyslots[i].df); + bIgnoreListChange = true; + cboDFxFile[i]->setSelected(0); + bIgnoreListChange = false; + } + } + RefreshPanelFloppy(); + RefreshPanelQuickstart(); + } + } + } + } +}; +static QSDiskFileActionListener* diskFileActionListener; + + +class QuickstartModeActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + quickstart_start = chkQuickstartMode->isSelected(); + } +}; +static QuickstartModeActionListener* quickstartModeActionListener; + + +void InitPanelQuickstart(const struct _ConfigCategory& category) +{ + int posX; + int posY = DISTANCE_BORDER; + int i; + + amigaModelActionListener = new AmigaModelActionListener(); + ntscButtonActionListener = new QSNTSCButtonActionListener(); + dfxCheckActionListener = new QSDFxCheckActionListener(); + dfxButtonActionListener = new QSDFxButtonActionListener(); + diskFileActionListener = new QSDiskFileActionListener(); + cdButtonActionListener = new QSCDButtonActionListener(); + cdFileActionListener = new QSCDFileActionListener(); + quickstartModeActionListener = new QuickstartModeActionListener(); + + lblModel = new gcn::Label("Amiga model:"); + lblModel->setSize(100, LABEL_HEIGHT); + lblModel->setAlignment(gcn::Graphics::RIGHT); + cboModel = new gcn::UaeDropDown(&amigaModelList); + cboModel->setSize(160, DROPDOWN_HEIGHT); + cboModel->setBaseColor(gui_baseCol); + cboModel->setId("AModel"); + cboModel->addActionListener(amigaModelActionListener); + + lblConfig = new gcn::Label("Configuration:"); + lblConfig->setSize(100, LABEL_HEIGHT); + lblConfig->setAlignment(gcn::Graphics::RIGHT); + cboConfig = new gcn::UaeDropDown(&amigaConfigList); + cboConfig->setSize(category.panel->getWidth() - lblConfig->getWidth() - 8 - 2 * DISTANCE_BORDER, DROPDOWN_HEIGHT); + cboConfig->setBaseColor(gui_baseCol); + cboConfig->setId("AConfig"); + cboConfig->addActionListener(amigaModelActionListener); + + chkNTSC = new gcn::UaeCheckBox("NTSC"); + chkNTSC->setId("qsNTSC"); + chkNTSC->addActionListener(ntscButtonActionListener); + + for (i = 0; i<2; ++i) + { + char tmp[20]; + snprintf(tmp, 20, "DF%d:", i); + chkDFx[i] = new gcn::UaeCheckBox(tmp); + chkDFx[i]->addActionListener(dfxCheckActionListener); + snprintf(tmp, 20, "qsDF%d", i); + chkDFx[i]->setId(tmp); + + chkDFxWriteProtect[i] = new gcn::UaeCheckBox("Write-protected"); + chkDFxWriteProtect[i]->addActionListener(dfxCheckActionListener); + snprintf(tmp, 20, "qsWP%d", i); + chkDFxWriteProtect[i]->setId(tmp); + + cmdDFxInfo[i] = new gcn::Button("?"); + cmdDFxInfo[i]->setSize(SMALL_BUTTON_WIDTH, SMALL_BUTTON_HEIGHT); + cmdDFxInfo[i]->setBaseColor(gui_baseCol); + cmdDFxInfo[i]->addActionListener(dfxButtonActionListener); + snprintf(tmp, 20, "qsInfo%d", i); + cmdDFxInfo[i]->setId(tmp); + + cmdDFxEject[i] = new gcn::Button("Eject"); + cmdDFxEject[i]->setSize(SMALL_BUTTON_WIDTH * 2, SMALL_BUTTON_HEIGHT); + cmdDFxEject[i]->setBaseColor(gui_baseCol); + snprintf(tmp, 20, "qscmdEject%d", i); + cmdDFxEject[i]->setId(tmp); + cmdDFxEject[i]->addActionListener(dfxButtonActionListener); + + cmdDFxSelect[i] = new gcn::Button("Select file"); + cmdDFxSelect[i]->setSize(BUTTON_WIDTH, SMALL_BUTTON_HEIGHT); + cmdDFxSelect[i]->setBaseColor(gui_baseCol); + snprintf(tmp, 20, "qscmdSel%d", i); + cmdDFxSelect[i]->setId(tmp); + cmdDFxSelect[i]->addActionListener(dfxButtonActionListener); + + cboDFxFile[i] = new gcn::UaeDropDown(&diskfileList); + cboDFxFile[i]->setSize(category.panel->getWidth() - 2 * DISTANCE_BORDER, DROPDOWN_HEIGHT); + cboDFxFile[i]->setBaseColor(gui_baseCol); + snprintf(tmp, 20, "qscboDisk%d", i); + cboDFxFile[i]->setId(tmp); + cboDFxFile[i]->addActionListener(diskFileActionListener); + } + + chkCD = new gcn::UaeCheckBox("CD drive"); + chkCD->setId("qsCD drive"); + chkCD->setEnabled(false); + + cmdCDEject = new gcn::Button("Eject"); + cmdCDEject->setSize(SMALL_BUTTON_WIDTH * 2, SMALL_BUTTON_HEIGHT); + cmdCDEject->setBaseColor(gui_baseCol); + cmdCDEject->setId("qscdEject"); + cmdCDEject->addActionListener(cdButtonActionListener); + + cmdCDSelect = new gcn::Button("Select image"); + cmdCDSelect->setSize(BUTTON_WIDTH, SMALL_BUTTON_HEIGHT); + cmdCDSelect->setBaseColor(gui_baseCol); + cmdCDSelect->setId("qsCDSelect"); + cmdCDSelect->addActionListener(cdButtonActionListener); + + cboCDFile = new gcn::UaeDropDown(&cdfileList); + cboCDFile->setSize(category.panel->getWidth() - 2 * DISTANCE_BORDER, DROPDOWN_HEIGHT); + cboCDFile->setBaseColor(gui_baseCol); + cboCDFile->setId("qscboCD"); + cboCDFile->addActionListener(cdFileActionListener); + + chkQuickstartMode = new gcn::UaeCheckBox("Start in Quickstart mode"); + chkQuickstartMode->setId("qsMode"); + chkQuickstartMode->addActionListener(quickstartModeActionListener); + + category.panel->add(lblModel, DISTANCE_BORDER, posY); + category.panel->add(cboModel, DISTANCE_BORDER + lblModel->getWidth() + 8, posY); + category.panel->add(chkNTSC, cboModel->getX() + cboModel->getWidth() + 8, posY); + posY += cboModel->getHeight() + DISTANCE_NEXT_Y; + category.panel->add(lblConfig, DISTANCE_BORDER, posY); + category.panel->add(cboConfig, DISTANCE_BORDER + lblConfig->getWidth() + 8, posY); + posY += cboConfig->getHeight() + DISTANCE_NEXT_Y; + + for (i = 0; i<2; ++i) + { + posX = DISTANCE_BORDER; + category.panel->add(chkDFx[i], posX, posY); + posX += 180; + category.panel->add(chkDFxWriteProtect[i], posX, posY); + posX += chkDFxWriteProtect[i]->getWidth() + 4 * DISTANCE_NEXT_X; + // category.panel->add(cmdDFxInfo[i], posX, posY); + posX += cmdDFxInfo[i]->getWidth() + DISTANCE_NEXT_X; + category.panel->add(cmdDFxEject[i], posX, posY); + posX += cmdDFxEject[i]->getWidth() + DISTANCE_NEXT_X; + category.panel->add(cmdDFxSelect[i], posX, posY); + posY += chkDFx[i]->getHeight() + 8; + + category.panel->add(cboDFxFile[i], DISTANCE_BORDER, posY); + posY += cboDFxFile[i]->getHeight() + DISTANCE_NEXT_Y + 4; + } + + category.panel->add(chkCD, chkDFx[1]->getX(), chkDFx[1]->getY()); + category.panel->add(cmdCDEject, cmdDFxEject[1]->getX(), cmdDFxEject[1]->getY()); + category.panel->add(cmdCDSelect, cmdDFxSelect[1]->getX(), cmdDFxSelect[1]->getY()); + category.panel->add(cboCDFile, cboDFxFile[1]->getX(), cboDFxFile[1]->getY()); + + category.panel->add(chkQuickstartMode, category.panel->getWidth() - chkQuickstartMode->getWidth() - DISTANCE_BORDER, posY); + posY += chkQuickstartMode->getHeight() + DISTANCE_NEXT_Y; + + chkCD->setVisible(false); + cmdCDEject->setVisible(false); + cmdCDSelect->setVisible(false); + cboCDFile->setVisible(false); + + bIgnoreListChange = false; + + cboModel->setSelected(quickstart_model); + CountModelConfigs(); + cboConfig->setSelected(quickstart_conf); + SetControlState(quickstart_model); + + SetModelFromConfig(); + + RefreshPanelQuickstart(); +} + + +void ExitPanelQuickstart(void) +{ + delete lblModel; + delete cboModel; + delete lblConfig; + delete cboConfig; + delete chkNTSC; + for (int i = 0; i<2; ++i) + { + delete chkDFx[i]; + delete chkDFxWriteProtect[i]; + delete cmdDFxInfo[i]; + delete cmdDFxEject[i]; + delete cmdDFxSelect[i]; + delete cboDFxFile[i]; + } + delete chkCD; + delete cmdCDEject; + delete cmdCDSelect; + delete cboCDFile; + delete chkQuickstartMode; + + delete amigaModelActionListener; + delete ntscButtonActionListener; + delete dfxCheckActionListener; + delete dfxButtonActionListener; + delete diskFileActionListener; + delete cdButtonActionListener; + delete cdFileActionListener; + delete quickstartModeActionListener; +} + + +static void AdjustDropDownControls(void) +{ + int i; + + bIgnoreListChange = true; + + for (i = 0; i<2; ++i) + { + cboDFxFile[i]->clearSelected(); + + if (changed_prefs.floppyslots[i].dfxtype != DRV_NONE && strlen(changed_prefs.floppyslots[i].df) > 0) + { + for (int j = 0; jsetSelected(j); + break; + } + } + } + } + + cboCDFile->clearSelected(); + if (changed_prefs.cdslots[0].inuse && strlen(changed_prefs.cdslots[0].name) > 0) + { + for (i = 0; i < lstMRUCDList.size(); ++i) + { + if (!lstMRUCDList[i].compare(changed_prefs.cdslots[0].name)) + { + cboCDFile->setSelected(i); + break; + } + } + } + + bIgnoreListChange = false; +} + + +void RefreshPanelQuickstart(void) +{ + bool prevAvailable = true; + + chkNTSC->setSelected(changed_prefs.ntscmode); + + AdjustDropDownControls(); + + changed_prefs.nr_floppies = 0; + for (int i = 0; i<4; ++i) + { + bool driveEnabled = changed_prefs.floppyslots[i].dfxtype != DRV_NONE; + if (i < 2) { + chkDFx[i]->setSelected(driveEnabled); + chkDFxWriteProtect[i]->setSelected(disk_getwriteprotect(&changed_prefs, changed_prefs.floppyslots[i].df)); + if (i == 0) + chkDFx[i]->setEnabled(false); + else + chkDFx[i]->setEnabled(prevAvailable); + + cmdDFxInfo[i]->setEnabled(driveEnabled); + chkDFxWriteProtect[i]->setEnabled(driveEnabled && !changed_prefs.floppy_read_only); + cmdDFxEject[i]->setEnabled(driveEnabled); + cmdDFxSelect[i]->setEnabled(driveEnabled); + cboDFxFile[i]->setEnabled(driveEnabled); + } + prevAvailable = driveEnabled; + if (driveEnabled) + changed_prefs.nr_floppies = i + 1; + } + + chkCD->setSelected(changed_prefs.cdslots[0].inuse); + cmdCDEject->setEnabled(changed_prefs.cdslots[0].inuse); + cmdCDSelect->setEnabled(changed_prefs.cdslots[0].inuse); + cboCDFile->setEnabled(changed_prefs.cdslots[0].inuse); + + chkQuickstartMode->setSelected(quickstart_start); +} + + +bool HelpPanelQuickstart(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("Simplified start of emulation by just selecting the Amiga model and the disk/CD you want to use."); + helptext.push_back(""); + helptext.push_back("After selecting the Amiga model, you can choose from a small list of standard configurations for this model to"); + helptext.push_back("start with."); + helptext.push_back(""); + helptext.push_back("When you activate \"Start in Quickstart mode\", the next time you run the emulator, it will start with the quickstart"); + helptext.push_back("panel. Otherwise you start in configuraions panel."); + return true; +} diff --git a/src/osdep/gui/PanelRAM.cpp b/src/osdep/gui/PanelRAM.cpp index b19f6f2a..11e4f70f 100644 --- a/src/osdep/gui/PanelRAM.cpp +++ b/src/osdep/gui/PanelRAM.cpp @@ -13,16 +13,21 @@ #include "include/memory.h" #include "gui.h" #include "gui_handling.h" +#include "gfxboard.h" -static const char* ChipMem_list[] = {"512 K", "1 MB", "2 MB", "4 MB", "8 MB"}; -static const int ChipMem_values[] = {0x080000, 0x100000, 0x200000, 0x400000, 0x800000}; -static const char* SlowMem_list[] = {"None", "512 K", "1 MB", "1.5 MB", "1.8 MB"}; -static const int SlowMem_values[] = {0x000000, 0x080000, 0x100000, 0x180000, 0x1c0000}; -static const char* FastMem_list[] = {"None", "1 MB", "2 MB", "4 MB", "8 MB", "16 MB", "32 MB", "64 MB", "128 MB"}; -static const int FastMem_values[] = {0x000000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000}; +static const char *ChipMem_list[] = { "512 K", "1 MB", "2 MB", "4 MB", "8 MB" }; +static const int ChipMem_values[] = { 0x080000, 0x100000, 0x200000, 0x400000, 0x800000 }; +static const char *SlowMem_list[] = { "None", "512 K", "1 MB", "1.5 MB", "1.8 MB" }; +static const int SlowMem_values[] = { 0x000000, 0x080000, 0x100000, 0x180000, 0x1c0000 }; +static const char *FastMem_list[] = { "None", "1 MB", "2 MB", "4 MB", "8 MB", "16 MB", "32 MB", "64 MB", "128 MB" }; +static const int FastMem_values[] = { 0x000000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000, 0x4000000, 0x8000000 }; +static const char *A3000LowMem_list[] = { "None", "8 MB", "16 MB" }; +static const int A3000LowMem_values[] = { 0x080000, 0x800000, 0x1000000 }; +static const char *A3000HighMem_list[] = { "None", "8 MB", "16 MB", "32 MB" }; +static const int A3000HighMem_values[] = { 0x080000, 0x800000, 0x1000000, 0x2000000 }; -static gcn::Window* grpRAM; +static gcn::Window *grpRAM; static gcn::Label* lblChipmem; static gcn::Label* lblChipsize; static gcn::Slider* sldChipmem; @@ -38,6 +43,12 @@ static gcn::Slider* sldZ3mem; static gcn::Label* lblGfxmem; static gcn::Label* lblGfxsize; static gcn::Slider* sldGfxmem; +static gcn::Label* lblA3000Lowmem; +static gcn::Label* lblA3000Lowsize; +static gcn::Slider* sldA3000Lowmem; +static gcn::Label* lblA3000Highmem; +static gcn::Label* lblA3000Highsize; +static gcn::Slider* sldA3000Highmem; class MemorySliderActionListener : public gcn::ActionListener @@ -48,8 +59,8 @@ public: if (actionEvent.getSource() == sldChipmem) { changed_prefs.chipmem_size = ChipMem_values[int(sldChipmem->getValue())]; - if ((changed_prefs.chipmem_size > 0x200000) && (changed_prefs.fastmem_size > 0)) - changed_prefs.fastmem_size = 0; + if ((changed_prefs.chipmem_size > 0x200000) && (changed_prefs.fastmem[0].size > 0)) + changed_prefs.fastmem[0].size = 0; } if (actionEvent.getSource() == sldSlowmem) @@ -59,22 +70,34 @@ public: if (actionEvent.getSource() == sldFastmem) { - changed_prefs.fastmem_size = FastMem_values[int(sldFastmem->getValue())]; - if (changed_prefs.fastmem_size > 0 && changed_prefs.chipmem_size > 0x200000) + changed_prefs.fastmem[0].size = FastMem_values[int(sldFastmem->getValue())]; + if (changed_prefs.fastmem[0].size > 0 && changed_prefs.chipmem_size > 0x200000) changed_prefs.chipmem_size = 0x200000; } if (actionEvent.getSource() == sldZ3mem) { - changed_prefs.z3fastmem_size = FastMem_values[int(sldZ3mem->getValue())]; - if (changed_prefs.z3fastmem_size > max_z3fastmem) - changed_prefs.z3fastmem_size = max_z3fastmem; + changed_prefs.z3fastmem[0].size = FastMem_values[int(sldZ3mem->getValue())]; + if (changed_prefs.z3fastmem[0].size > max_z3fastmem) + changed_prefs.z3fastmem[0].size = max_z3fastmem; } if (actionEvent.getSource() == sldGfxmem) { - changed_prefs.rtgmem_size = FastMem_values[int(sldGfxmem->getValue())]; - changed_prefs.rtgmem_type = 1; + changed_prefs.rtgboards[0].rtgmem_size = FastMem_values[int(sldGfxmem->getValue())]; + changed_prefs.rtgboards[0].rtgmem_type = GFXBOARD_UAE_Z3; + } + + if (actionEvent.getSource() == sldA3000Lowmem) { + changed_prefs.mbresmem_low_size = A3000LowMem_values[(int)(sldA3000Lowmem->getValue())]; + if (currprefs.mbresmem_low_size != changed_prefs.mbresmem_low_size) + DisableResume(); + } + + if (actionEvent.getSource() == sldA3000Highmem) { + changed_prefs.mbresmem_high_size = A3000HighMem_values[(int)(sldA3000Highmem->getValue())]; + if (currprefs.mbresmem_high_size != changed_prefs.mbresmem_high_size) + DisableResume(); } RefreshPanelRAM(); @@ -108,7 +131,7 @@ void InitPanelRAM(const struct _ConfigCategory& category) sldSlowmem->addActionListener(memorySliderActionListener); lblSlowsize = new gcn::Label("None "); - lblFastmem = new gcn::Label("Fast:"); + lblFastmem = new gcn::Label("Z2 Fast:"); sldFastmem = new gcn::Slider(0, 4); sldFastmem->setSize(110, SLIDER_HEIGHT); sldFastmem->setBaseColor(gui_baseCol); @@ -116,7 +139,7 @@ void InitPanelRAM(const struct _ConfigCategory& category) sldFastmem->setStepLength(1); sldFastmem->setId("Fastmem"); sldFastmem->addActionListener(memorySliderActionListener); - lblFastsize = new gcn::Label("None "); + lblFastsize = new gcn::Label("None "); lblZ3mem = new gcn::Label("Z3 fast:"); sldZ3mem = new gcn::Slider(0, 8); @@ -126,9 +149,9 @@ void InitPanelRAM(const struct _ConfigCategory& category) sldZ3mem->setStepLength(1); sldZ3mem->setId("Z3mem"); sldZ3mem->addActionListener(memorySliderActionListener); - lblZ3size = new gcn::Label("None "); + lblZ3size = new gcn::Label("None "); - lblGfxmem = new gcn::Label("RTG:"); + lblGfxmem = new gcn::Label("RTG board:"); sldGfxmem = new gcn::Slider(0, 5); sldGfxmem->setSize(110, SLIDER_HEIGHT); sldGfxmem->setBaseColor(gui_baseCol); @@ -136,39 +159,69 @@ void InitPanelRAM(const struct _ConfigCategory& category) sldGfxmem->setStepLength(1); sldGfxmem->setId("Gfxmem"); sldGfxmem->addActionListener(memorySliderActionListener); - lblGfxsize = new gcn::Label("None "); + lblGfxsize = new gcn::Label("None "); + + lblA3000Lowmem = new gcn::Label("A4000 Motherb. slot:"); + sldA3000Lowmem = new gcn::Slider(0, 2); + sldA3000Lowmem->setSize(110, SLIDER_HEIGHT); + sldA3000Lowmem->setBaseColor(gui_baseCol); + sldA3000Lowmem->setMarkerLength(20); + sldA3000Lowmem->setStepLength(1); + sldA3000Lowmem->setId("A3000Low"); + sldA3000Lowmem->addActionListener(memorySliderActionListener); + lblA3000Lowsize = new gcn::Label("None "); + + lblA3000Highmem = new gcn::Label("A4000 Proc. board:"); + sldA3000Highmem = new gcn::Slider(0, 3); + sldA3000Highmem->setSize(110, SLIDER_HEIGHT); + sldA3000Highmem->setBaseColor(gui_baseCol); + sldA3000Highmem->setMarkerLength(20); + sldA3000Highmem->setStepLength(1); + sldA3000Highmem->setId("A3000High"); + sldA3000Highmem->addActionListener(memorySliderActionListener); + lblA3000Highsize = new gcn::Label("None "); grpRAM = new gcn::Window("Memory Settings"); grpRAM->setPosition(DISTANCE_BORDER, DISTANCE_BORDER); int posY = 10; grpRAM->add(lblChipmem, 8, posY); - grpRAM->add(sldChipmem, 70, posY); - grpRAM->add(lblChipsize, 70 + sldChipmem->getWidth() + 12, posY); + grpRAM->add(sldChipmem, 160, posY); + grpRAM->add(lblChipsize, 160 + sldChipmem->getWidth() + 12, posY); posY += sldChipmem->getHeight() + DISTANCE_NEXT_Y; grpRAM->add(lblSlowmem, 8, posY); - grpRAM->add(sldSlowmem, 70, posY); - grpRAM->add(lblSlowsize, 70 + sldSlowmem->getWidth() + 12, posY); + grpRAM->add(sldSlowmem, 160, posY); + grpRAM->add(lblSlowsize, 160 + sldSlowmem->getWidth() + 12, posY); posY += sldSlowmem->getHeight() + DISTANCE_NEXT_Y; grpRAM->add(lblFastmem, 8, posY); - grpRAM->add(sldFastmem, 70, posY); - grpRAM->add(lblFastsize, 70 + sldFastmem->getWidth() + 12, posY); + grpRAM->add(sldFastmem, 160, posY); + grpRAM->add(lblFastsize, 160 + sldFastmem->getWidth() + 12, posY); posY += sldFastmem->getHeight() + DISTANCE_NEXT_Y; grpRAM->add(lblZ3mem, 8, posY); - grpRAM->add(sldZ3mem, 70, posY); - grpRAM->add(lblZ3size, 70 + sldZ3mem->getWidth() + 12, posY); + grpRAM->add(sldZ3mem, 160, posY); + grpRAM->add(lblZ3size, 160 + sldZ3mem->getWidth() + 12, posY); posY += sldZ3mem->getHeight() + DISTANCE_NEXT_Y; -#ifdef PICASSO96 + grpRAM->add(lblGfxmem, 8, posY); - grpRAM->add(sldGfxmem, 70, posY); - grpRAM->add(lblGfxsize, 70 + sldGfxmem->getWidth() + 12, posY); + grpRAM->add(sldGfxmem, 160, posY); + grpRAM->add(lblGfxsize, 160 + sldGfxmem->getWidth() + 12, posY); posY += sldGfxmem->getHeight() + DISTANCE_NEXT_Y; -#endif + + grpRAM->add(lblA3000Lowmem, 8, posY); + grpRAM->add(sldA3000Lowmem, 160, posY); + grpRAM->add(lblA3000Lowsize, 160 + sldA3000Lowmem->getWidth() + 12, posY); + posY += sldA3000Lowmem->getHeight() + DISTANCE_NEXT_Y; + + grpRAM->add(lblA3000Highmem, 8, posY); + grpRAM->add(sldA3000Highmem, 160, posY); + grpRAM->add(lblA3000Highsize, 160 + sldA3000Highmem->getWidth() + 12, posY); + posY += sldA3000Highmem->getHeight() + DISTANCE_NEXT_Y; + grpRAM->setMovable(false); - grpRAM->setSize(250, posY + DISTANCE_BORDER); + grpRAM->setSize(350, posY + DISTANCE_BORDER); grpRAM->setBaseColor(gui_baseCol); category.panel->add(grpRAM); @@ -194,6 +247,12 @@ void ExitPanelRAM() delete lblGfxmem; delete sldGfxmem; delete lblGfxsize; + delete lblA3000Lowmem; + delete sldA3000Lowmem; + delete lblA3000Lowsize; + delete lblA3000Highmem; + delete sldA3000Highmem; + delete lblA3000Highsize; delete grpRAM; delete memorySliderActionListener; } @@ -223,9 +282,9 @@ void RefreshPanelRAM() } } - for (i = 0; i < 5; ++i) + for (i = 0; i<5; ++i) { - if (changed_prefs.fastmem_size == FastMem_values[i]) + if (changed_prefs.fastmem[0].size == FastMem_values[i]) { sldFastmem->setValue(i); lblFastsize->setCaption(FastMem_list[i]); @@ -233,9 +292,9 @@ void RefreshPanelRAM() } } - for (i = 0; i < 9; ++i) + for (i = 0; i<9; ++i) { - if (changed_prefs.z3fastmem_size == FastMem_values[i]) + if (changed_prefs.z3fastmem[0].size == FastMem_values[i]) { sldZ3mem->setValue(i); lblZ3size->setCaption(FastMem_list[i]); @@ -244,9 +303,9 @@ void RefreshPanelRAM() } sldZ3mem->setEnabled(!changed_prefs.address_space_24); - for (i = 0; i < 6; ++i) + for (i = 0; i<6; ++i) { - if (changed_prefs.rtgmem_size == FastMem_values[i]) + if (changed_prefs.rtgboards[0].rtgmem_size == FastMem_values[i]) { sldGfxmem->setValue(i); lblGfxsize->setCaption(FastMem_list[i]); @@ -254,4 +313,39 @@ void RefreshPanelRAM() } } sldGfxmem->setEnabled(!changed_prefs.address_space_24); + + for (i = 0; i<3; ++i) + { + if (changed_prefs.mbresmem_low_size == A3000LowMem_values[i]) + { + sldA3000Lowmem->setValue(i); + lblA3000Lowsize->setCaption(A3000LowMem_list[i]); + break; + } + } + + for (i = 0; i<4; ++i) + { + if (changed_prefs.mbresmem_high_size == A3000HighMem_values[i]) + { + sldA3000Highmem->setValue(i); + lblA3000Highsize->setCaption(A3000HighMem_list[i]); + break; + } + } +} + + +bool HelpPanelRAM(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("Select the amount of RAM for each type you want to emulate in your Amiga."); + helptext.push_back("\"Slow\" is the simple memory extension of an Amiga 500."); + helptext.push_back("\"Z2 Fast\" is real fast memory in 24 bit address space."); + helptext.push_back("\"Z3 Fast\" is real fast memory in 32 bit address space and only available if a 32 bit CPU is selected."); + helptext.push_back("\"RTG board\" is the graphics memory used by Picasso96 and only available if a 32 bit CPU is selected. If you"); + helptext.push_back("select some memory for this type, the Z3 RTG board will be activated."); + helptext.push_back("A4000 motherboard and processor board memory is only detected by the Amiga if you choose the correct"); + helptext.push_back("Kickstart ROM (A4000)."); + return true; } diff --git a/src/osdep/gui/PanelROM.cpp b/src/osdep/gui/PanelROM.cpp index 974eb49a..8e0962a1 100644 --- a/src/osdep/gui/PanelROM.cpp +++ b/src/osdep/gui/PanelROM.cpp @@ -20,6 +20,11 @@ static gcn::Button* cmdMainROM; static gcn::Label* lblExtROM; static gcn::UaeDropDown* cboExtROM; static gcn::Button* cmdExtROM; +#ifdef ACTION_REPLAY +static gcn::Label *lblCartROM; +static gcn::UaeDropDown* cboCartROM; +static gcn::Button *cmdCartROM; +#endif class ROMListModel : public gcn::ListModel { @@ -57,12 +62,14 @@ public: roms.clear(); idxToAvailableROMs.clear(); + int currIdx = -1; if (ROMType & (ROMTYPE_EXTCDTV | ROMTYPE_EXTCD32)) { roms.push_back(""); idxToAvailableROMs.push_back(-1); + currIdx = 0; } - int currIdx = -1; + for (int i = 0; i < lstAvailableROMs.size(); ++i) { if (lstAvailableROMs[i]->ROMType & ROMType) @@ -79,7 +86,9 @@ public: static ROMListModel* mainROMList; static ROMListModel* extROMList; - +#ifdef ACTION_REPLAY +static ROMListModel *cartROMList; +#endif class MainROMActionListener : public gcn::ActionListener { @@ -110,6 +119,21 @@ public: static ExtROMActionListener* extROMActionListener; +#ifdef ACTION_REPLAY +class CartROMActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + AvailableROM* rom = cartROMList->getROMat(cboCartROM->getSelected()); + if (rom != nullptr) + strcpy(changed_prefs.cartfile, rom->Path); + else + strcpy(changed_prefs.cartfile, ""); + } +}; +static CartROMActionListener* cartROMActionListener; +#endif class ROMButtonActionListener : public gcn::ActionListener { @@ -124,8 +148,7 @@ public: strcpy(tmp, currentDir); if (SelectFile("Select System ROM", tmp, filter)) { - AvailableROM* newrom; - newrom = new AvailableROM(); + AvailableROM * newrom = new AvailableROM(); extractFileName(tmp, newrom->Name); removeFileExtension(newrom->Name); strcpy(newrom->Path, tmp); @@ -141,8 +164,7 @@ public: strcpy(tmp, currentDir); if (SelectFile("Select Extended ROM", tmp, filter)) { - AvailableROM* newrom; - newrom = new AvailableROM(); + AvailableROM * newrom = new AvailableROM(); extractFileName(tmp, newrom->Name); removeFileExtension(newrom->Name); strcpy(newrom->Path, tmp); @@ -153,6 +175,24 @@ public: } cmdExtROM->requestFocus(); } +#ifdef ACTION_REPLAY + else if (actionEvent.getSource() == cmdCartROM) + { + strncpy(tmp, currentDir, MAX_PATH); + if (SelectFile("Select Cartridge ROM", tmp, filter)) + { + AvailableROM *newrom = new AvailableROM(); + extractFileName(tmp, newrom->Name); + removeFileExtension(newrom->Name); + strcpy(newrom->Path, tmp); + newrom->ROMType = ROMTYPE_CD32CART; + lstAvailableROMs.push_back(newrom); + strcpy(changed_prefs.romextfile, tmp); + RefreshPanelROM(); + } + cmdCartROM->requestFocus(); + } +#endif } }; @@ -165,9 +205,15 @@ void InitPanelROM(const struct _ConfigCategory& category) mainROMActionListener = new MainROMActionListener(); extROMActionListener = new ExtROMActionListener(); +#ifdef ACTION_REPLAY + cartROMActionListener = new CartROMActionListener(); +#endif romButtonActionListener = new ROMButtonActionListener(); mainROMList = new ROMListModel(ROMTYPE_KICK | ROMTYPE_KICKCD32); extROMList = new ROMListModel(ROMTYPE_EXTCDTV | ROMTYPE_EXTCD32); +#ifdef ACTION_REPLAY + cartROMList = new ROMListModel(ROMTYPE_ALL_CART); +#endif lblMainROM = new gcn::Label("Main ROM File:"); lblMainROM->setSize(120, LABEL_HEIGHT); @@ -197,6 +243,21 @@ void InitPanelROM(const struct _ConfigCategory& category) cmdExtROM->setBaseColor(gui_baseCol); cmdExtROM->addActionListener(romButtonActionListener); +#ifdef ACTION_REPLAY + lblCartROM = new gcn::Label("Cardridge ROM File:"); + lblCartROM->setSize(200, LABEL_HEIGHT); + cboCartROM = new gcn::UaeDropDown(cartROMList); + cboCartROM->setSize(400, DROPDOWN_HEIGHT); + cboCartROM->setBaseColor(gui_baseCol); + cboCartROM->setId("cboCartROM"); + cboCartROM->addActionListener(cartROMActionListener); + cmdCartROM = new gcn::Button("..."); + cmdCartROM->setId("CartROM"); + cmdCartROM->setSize(SMALL_BUTTON_WIDTH, SMALL_BUTTON_HEIGHT); + cmdCartROM->setBaseColor(gui_baseCol); + cmdCartROM->addActionListener(romButtonActionListener); +#endif + int posY = DISTANCE_BORDER; category.panel->add(lblMainROM, DISTANCE_BORDER, posY); posY += lblMainROM->getHeight() + 4; @@ -210,6 +271,14 @@ void InitPanelROM(const struct _ConfigCategory& category) category.panel->add(cmdExtROM, DISTANCE_BORDER + cboExtROM->getWidth() + DISTANCE_NEXT_X, posY); posY += cboExtROM->getHeight() + DISTANCE_NEXT_Y; +#ifdef ACTION_REPLAY + category.panel->add(lblCartROM, DISTANCE_BORDER, posY); + posY += lblCartROM->getHeight() + 4; + category.panel->add(cboCartROM, DISTANCE_BORDER, posY); + category.panel->add(cmdCartROM, DISTANCE_BORDER + cboCartROM->getWidth() + DISTANCE_NEXT_X, posY); + posY += cboCartROM->getHeight() + DISTANCE_NEXT_Y; +#endif + RefreshPanelROM(); } @@ -228,6 +297,14 @@ void ExitPanelROM() delete extROMList; delete extROMActionListener; +#ifdef ACTION_REPLAY + delete lblCartROM; + delete cboCartROM; + delete cmdCartROM; + delete cartROMList; + delete cartROMActionListener; +#endif + delete romButtonActionListener; // delete chkMapROM; } @@ -240,4 +317,21 @@ void RefreshPanelROM() idx = extROMList->InitROMList(changed_prefs.romextfile); cboExtROM->setSelected(idx); + +#ifdef ACTION_REPLAY + idx = cartROMList->InitROMList(changed_prefs.cartfile); + cboCartROM->setSelected(idx); +#endif } + +bool HelpPanelROM(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("Select the required kickstart ROM for the Amiga you want to emulate in \"Main ROM File\"."); + helptext.push_back(""); + helptext.push_back("In \"Extended ROM File\", you can only select the required ROM for CD32 emulation."); + helptext.push_back(""); + helptext.push_back("In \"Cartridge ROM File\", you can select the CD32 FMV module to activate video playback in CD32."); + helptext.push_back("There are also some Action Replay and Freezer cards and the built in HRTMon available."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelSavestate.cpp b/src/osdep/gui/PanelSavestate.cpp index 58c93ff3..88c7fdd9 100644 --- a/src/osdep/gui/PanelSavestate.cpp +++ b/src/osdep/gui/PanelSavestate.cpp @@ -241,3 +241,12 @@ void RefreshPanelSavestate() cmdSaveState->setEnabled(enabled); lblWarningHDDon->setVisible(!enabled); } + +bool HelpPanelSavestate(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("Savestates are stored with the name of the disk in drive DF0 attached with the selected number."); + helptext.push_back(""); + helptext.push_back("Note: Savestates will not work with HDDs."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/PanelSound.cpp b/src/osdep/gui/PanelSound.cpp index ca0bf7d0..271ba1a6 100644 --- a/src/osdep/gui/PanelSound.cpp +++ b/src/osdep/gui/PanelSound.cpp @@ -459,3 +459,19 @@ void RefreshPanelSound() lblStereoDelayInfo->setCaption(tmp); } } + +bool HelpPanelSound(std::vector &helptext) +{ + helptext.clear(); + helptext.push_back("You can turn on sound emulation with different levels of accuracy and choose between mono and stereo."); + helptext.push_back(""); + helptext.push_back("The different types of interpolation have different impact on the performance. Play with the settings to find the"); + helptext.push_back("type you like most. You may need headphones to really hear the differences between the interpolations."); + helptext.push_back(""); + helptext.push_back("With \"Filter\", you can select the type of the Amiga audio filter."); + helptext.push_back(""); + helptext.push_back("With \"Stereo separation\" and \"Stereo delay\", you can adjust how the left and right audio channels of the Amiga"); + helptext.push_back("are mixed to the left and right channels of your device. A value of 70% for separation and no delay is a good"); + helptext.push_back("start."); + return true; +} \ No newline at end of file diff --git a/src/osdep/gui/SelectFile.cpp b/src/osdep/gui/SelectFile.cpp index e0c681e2..5ab31b15 100644 --- a/src/osdep/gui/SelectFile.cpp +++ b/src/osdep/gui/SelectFile.cpp @@ -278,6 +278,8 @@ static void ExitSelectFile() static void SelectFileLoop() { + FocusBugWorkaround(wndSelectFile); + while (!dialogFinished) { SDL_Event event; diff --git a/src/osdep/gui/SelectFolder.cpp b/src/osdep/gui/SelectFolder.cpp index 0de34f85..ccf022c7 100644 --- a/src/osdep/gui/SelectFolder.cpp +++ b/src/osdep/gui/SelectFolder.cpp @@ -191,6 +191,8 @@ static void ExitSelectFolder() static void SelectFolderLoop() { + FocusBugWorkaround(wndSelectFolder); + while (!dialogFinished) { SDL_Event event; diff --git a/src/osdep/gui/ShowHelp.cpp b/src/osdep/gui/ShowHelp.cpp new file mode 100644 index 00000000..eaa36ef0 --- /dev/null +++ b/src/osdep/gui/ShowHelp.cpp @@ -0,0 +1,179 @@ +#include +#include +#include +#include +#include +#include +#include "guisan/sdl/sdltruetypefont.hpp" +#include "SelectorEntry.hpp" + +#include "sysconfig.h" +#include "sysdeps.h" +#include "config.h" +#include "gui.h" +#include "gui_handling.h" + + +#define DIALOG_WIDTH 760 +#define DIALOG_HEIGHT 420 + +static bool dialogFinished = false; + +static gcn::Window *wndShowHelp; +static gcn::Button* cmdOK; +static gcn::ListBox* lstHelp; +static gcn::ScrollArea* scrAreaHelp; + + +class HelpListModel : public gcn::ListModel +{ + std::vector lines; + +public: + HelpListModel(std::vector helptext) + { + lines = helptext; + } + + int getNumberOfElements() override + { + return lines.size(); + } + + std::string getElementAt(int i) override + { + if (i >= 0 && i < lines.size()) + return lines[i]; + return ""; + } +}; +static HelpListModel *helpList; + + +class ShowHelpActionListener : public gcn::ActionListener +{ +public: + void action(const gcn::ActionEvent& actionEvent) override + { + dialogFinished = true; + } +}; +static ShowHelpActionListener* showHelpActionListener; + + +static void InitShowHelp(const std::vector& helptext) +{ + wndShowHelp = new gcn::Window("Help"); + wndShowHelp->setSize(DIALOG_WIDTH, DIALOG_HEIGHT); + wndShowHelp->setPosition((GUI_WIDTH - DIALOG_WIDTH) / 2, (GUI_HEIGHT - DIALOG_HEIGHT) / 2); + wndShowHelp->setBaseColor(gui_baseCol); + wndShowHelp->setTitleBarHeight(TITLEBAR_HEIGHT); + + showHelpActionListener = new ShowHelpActionListener(); + + helpList = new HelpListModel(helptext); + + lstHelp = new gcn::ListBox(helpList); + lstHelp->setSize(DIALOG_WIDTH - 2 * DISTANCE_BORDER - 4, DIALOG_HEIGHT - 3 * DISTANCE_BORDER - BUTTON_HEIGHT - DISTANCE_NEXT_Y - 10); + lstHelp->setPosition(DISTANCE_BORDER, DISTANCE_BORDER); + lstHelp->setBaseColor(gui_baseCol + 0x202020); + lstHelp->setBackgroundColor(gui_baseCol); + lstHelp->setWrappingEnabled(true); + + scrAreaHelp = new gcn::ScrollArea(lstHelp); + scrAreaHelp->setBorderSize(1); + scrAreaHelp->setPosition(DISTANCE_BORDER, 10 + TEXTFIELD_HEIGHT + 10); + scrAreaHelp->setSize(DIALOG_WIDTH - 2 * DISTANCE_BORDER - 4, DIALOG_HEIGHT - 3 * DISTANCE_BORDER - BUTTON_HEIGHT - DISTANCE_NEXT_Y - 10); + scrAreaHelp->setScrollbarWidth(20); + scrAreaHelp->setBaseColor(gui_baseCol + 0x202020); + scrAreaHelp->setBackgroundColor(gui_baseCol); + + cmdOK = new gcn::Button("Ok"); + cmdOK->setSize(BUTTON_WIDTH, BUTTON_HEIGHT); + cmdOK->setPosition(DIALOG_WIDTH - DISTANCE_BORDER - BUTTON_WIDTH, DIALOG_HEIGHT - 2 * DISTANCE_BORDER - BUTTON_HEIGHT - 10); + cmdOK->setBaseColor(gui_baseCol); + cmdOK->addActionListener(showHelpActionListener); + + wndShowHelp->add(scrAreaHelp, DISTANCE_BORDER, DISTANCE_BORDER); + wndShowHelp->add(cmdOK); + + gui_top->add(wndShowHelp); + + cmdOK->requestFocus(); + wndShowHelp->requestModalFocus(); +} + + +static void ExitShowHelp(void) +{ + wndShowHelp->releaseModalFocus(); + gui_top->remove(wndShowHelp); + + delete lstHelp; + delete scrAreaHelp; + delete cmdOK; + + delete helpList; + delete showHelpActionListener; + + delete wndShowHelp; +} + + +static void ShowHelpLoop(void) +{ + FocusBugWorkaround(wndShowHelp); + + while (!dialogFinished) + { + SDL_Event event; + while (SDL_PollEvent(&event)) + { + if (event.type == SDL_KEYDOWN) + { + switch (event.key.keysym.scancode) + { + case VK_ESCAPE: + dialogFinished = true; + break; + + case VK_Red: + case VK_Green: + case SDL_SCANCODE_RETURN: + event.key.keysym.scancode = SDL_SCANCODE_RETURN; + gui_input->pushInput(event); // Fire key down + event.type = SDL_KEYUP; // and the key up + break; + default: + break; + } + } + + //------------------------------------------------- + // Send event to guisan-controls + //------------------------------------------------- + gui_input->pushInput(event); + } + + // Now we let the Gui object perform its logic. + uae_gui->logic(); + // Now we let the Gui object draw itself. + uae_gui->draw(); + // Finally we update the screen. + + UpdateGuiScreen(); + } +} + + +void ShowHelp(const char *title, const std::vector& text) +{ + dialogFinished = false; + + InitShowHelp(text); + + wndShowHelp->setCaption(title); + cmdOK->setCaption("Ok"); + ShowHelpLoop(); + ExitShowHelp(); +} diff --git a/src/osdep/gui/ShowMessage.cpp b/src/osdep/gui/ShowMessage.cpp index 4a0fd143..c716ca93 100644 --- a/src/osdep/gui/ShowMessage.cpp +++ b/src/osdep/gui/ShowMessage.cpp @@ -98,6 +98,8 @@ static void ExitShowMessage() static void ShowMessageWaitInputLoop() { + FocusBugWorkaround(wndShowMessage); + while (!dialogFinished) { SDL_Event event; @@ -143,6 +145,8 @@ static void ShowMessageWaitInputLoop() static void ShowMessageLoop() { + FocusBugWorkaround(wndShowMessage); + while (!dialogFinished) { SDL_Event event; @@ -214,6 +218,7 @@ bool ShowMessage(const char* title, const char* line1, const char* line2, const cmdCancel->setVisible(false); cmdOK->setPosition(cmdCancel->getX(), cmdCancel->getY()); } + cmdOK->setEnabled(true); ShowMessageLoop(); ExitShowMessage(); diff --git a/src/osdep/gui/gui_handling.h b/src/osdep/gui/gui_handling.h index 5ac21bbc..b62fba20 100644 --- a/src/osdep/gui/gui_handling.h +++ b/src/osdep/gui/gui_handling.h @@ -28,6 +28,7 @@ typedef struct _ConfigCategory void (*InitFunc)(const struct _ConfigCategory& category); void (*ExitFunc)(void); void (*RefreshFunc)(void); + bool(*HelpFunc) (std::vector&); } ConfigCategory; extern bool gui_running; @@ -42,10 +43,9 @@ extern SDL_Surface* gui_screen; extern char currentDir[MAX_DPATH]; extern char last_loaded_config[MAX_DPATH]; -#define BUILTINID_NONE 0 -#define BUILTINID_A500 1 -#define BUILTINID_A1200 2 -#define BUILTINID_CD32 3 +extern int quickstart_start; +extern int quickstart_model; +extern int quickstart_conf; typedef struct { @@ -60,45 +60,77 @@ extern vector ConfigFilesList; void InitPanelPaths(const struct _ConfigCategory& category); void ExitPanelPaths(void); void RefreshPanelPaths(void); +bool HelpPanelPaths(std::vector &helptext); + +void InitPanelQuickstart(const struct _ConfigCategory& category); +void ExitPanelQuickstart(void); +void RefreshPanelQuickstart(void); +bool HelpPanelQuickstart(std::vector &helptext); + void InitPanelConfig(const struct _ConfigCategory& category); void ExitPanelConfig(void); void RefreshPanelConfig(void); +bool HelpPanelConfig(std::vector &helptext); + void InitPanelCPU(const struct _ConfigCategory& category); void ExitPanelCPU(void); void RefreshPanelCPU(void); +bool HelpPanelCPU(std::vector &helptext); + void InitPanelChipset(const struct _ConfigCategory& category); void ExitPanelChipset(void); void RefreshPanelChipset(void); +bool HelpPanelChipset(std::vector &helptext); + void InitPanelROM(const struct _ConfigCategory& category); void ExitPanelROM(void); void RefreshPanelROM(void); +bool HelpPanelROM(std::vector &helptext); + void InitPanelRAM(const struct _ConfigCategory& category); void ExitPanelRAM(void); void RefreshPanelRAM(void); +bool HelpPanelRAM(std::vector &helptext); + void InitPanelFloppy(const struct _ConfigCategory& category); void ExitPanelFloppy(void); void RefreshPanelFloppy(void); +bool HelpPanelFloppy(std::vector &helptext); + void InitPanelHD(const struct _ConfigCategory& category); void ExitPanelHD(void); void RefreshPanelHD(void); +bool HelpPanelHD(std::vector &helptext); + void InitPanelDisplay(const struct _ConfigCategory& category); void ExitPanelDisplay(void); void RefreshPanelDisplay(void); +bool HelpPanelDisplay(std::vector &helptext); + void InitPanelSound(const struct _ConfigCategory& category); void ExitPanelSound(void); void RefreshPanelSound(void); +bool HelpPanelSound(std::vector &helptext); + void InitPanelInput(const struct _ConfigCategory& category); void ExitPanelInput(void); void RefreshPanelInput(void); +bool HelpPanelInput(std::vector &helptext); + void InitPanelMisc(const struct _ConfigCategory& category); void ExitPanelMisc(void); void RefreshPanelMisc(void); +bool HelpPanelMisc(std::vector &helptext); + void InitPanelSavestate(const struct _ConfigCategory& category); void ExitPanelSavestate(void); void RefreshPanelSavestate(void); +bool HelpPanelSavestate(std::vector &helptext); void RefreshAllPanels(void); -void RegisterRefreshFunc(void (*func)(void)); +void RegisterRefreshFunc(void(*func)(void)); + +void FocusBugWorkaround(gcn::Window *wnd); void DisableResume(void); @@ -109,6 +141,7 @@ bool SelectFile(const char* title, char* value, const char* filter[], bool creat bool EditFilesysVirtual(int unit_no); bool EditFilesysHardfile(int unit_no); bool CreateFilesysHardfile(void); +void ShowHelp(const char *title, const std::vector& text); bool LoadConfigByName(const char* name); ConfigFileInfo* SearchConfigInList(const char* name); diff --git a/src/osdep/gui/main_window.cpp b/src/osdep/gui/main_window.cpp index c183a275..61a3a90a 100644 --- a/src/osdep/gui/main_window.cpp +++ b/src/osdep/gui/main_window.cpp @@ -13,68 +13,68 @@ #include "gui.h" #include "gui_handling.h" #include "amiberry_gfx.h" +#include "autoconf.h" bool gui_running = false; -static int last_active_panel = 1; +static int last_active_panel = 2; + +#define MAX_STARTUP_TITLE 64 +#define MAX_STARTUP_MESSAGE 256 +static TCHAR startup_title[MAX_STARTUP_TITLE] = _T(""); +static TCHAR startup_message[MAX_STARTUP_MESSAGE] = _T(""); -ConfigCategory categories[] = +void target_startup_msg(TCHAR* title, TCHAR* msg) { - {"Paths", "data/paths.ico", nullptr, nullptr, InitPanelPaths, ExitPanelPaths, RefreshPanelPaths}, - {"Configurations", "data/file.ico", nullptr, nullptr, InitPanelConfig, ExitPanelConfig, RefreshPanelConfig}, - {"CPU and FPU", "data/cpu.ico", nullptr, nullptr, InitPanelCPU, ExitPanelCPU, RefreshPanelCPU}, - {"Chipset", "data/cpu.ico", nullptr, nullptr, InitPanelChipset, ExitPanelChipset, RefreshPanelChipset}, - {"ROM", "data/chip.ico", nullptr, nullptr, InitPanelROM, ExitPanelROM, RefreshPanelROM}, - {"RAM", "data/chip.ico", nullptr, nullptr, InitPanelRAM, ExitPanelRAM, RefreshPanelRAM}, - {"Floppy drives", "data/35floppy.ico", nullptr, nullptr, InitPanelFloppy, ExitPanelFloppy, RefreshPanelFloppy}, - {"Hard drives/CD", "data/drive.ico", nullptr, nullptr, InitPanelHD, ExitPanelHD, RefreshPanelHD}, - {"Display", "data/screen.ico", nullptr, nullptr, InitPanelDisplay, ExitPanelDisplay, RefreshPanelDisplay}, - {"Sound", "data/sound.ico", nullptr, nullptr, InitPanelSound, ExitPanelSound, RefreshPanelSound}, - {"Input", "data/joystick.ico", nullptr, nullptr, InitPanelInput, ExitPanelInput, RefreshPanelInput}, - {"Miscellaneous", "data/misc.ico", nullptr, nullptr, InitPanelMisc, ExitPanelMisc, RefreshPanelMisc}, - {"Savestates", "data/savestate.png", nullptr, nullptr, InitPanelSavestate, ExitPanelSavestate, RefreshPanelSavestate}, - {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr} + _tcsncpy(startup_title, title, MAX_STARTUP_TITLE); + _tcsncpy(startup_message, msg, MAX_STARTUP_MESSAGE); +} + +ConfigCategory categories[] = { + { "Paths", "data/paths.ico", nullptr, nullptr, InitPanelPaths, ExitPanelPaths, RefreshPanelPaths, HelpPanelPaths }, + { "Quickstart", "data/quickstart.ico", nullptr, nullptr, InitPanelQuickstart, ExitPanelQuickstart, RefreshPanelQuickstart, HelpPanelQuickstart }, + { "Configurations", "data/file.ico", nullptr, nullptr, InitPanelConfig, ExitPanelConfig, RefreshPanelConfig, HelpPanelConfig }, + { "CPU and FPU", "data/cpu.ico", nullptr, nullptr, InitPanelCPU, ExitPanelCPU, RefreshPanelCPU, HelpPanelCPU }, + { "Chipset", "data/cpu.ico", nullptr, nullptr, InitPanelChipset, ExitPanelChipset, RefreshPanelChipset, HelpPanelChipset }, + { "ROM", "data/chip.ico", nullptr, nullptr, InitPanelROM, ExitPanelROM, RefreshPanelROM, HelpPanelROM }, + { "RAM", "data/chip.ico", nullptr, nullptr, InitPanelRAM, ExitPanelRAM, RefreshPanelRAM, HelpPanelRAM }, + { "Floppy drives", "data/35floppy.ico", nullptr, nullptr, InitPanelFloppy, ExitPanelFloppy, RefreshPanelFloppy, HelpPanelFloppy }, + { "Hard drives/CD", "data/drive.ico", nullptr, nullptr, InitPanelHD, ExitPanelHD, RefreshPanelHD, HelpPanelHD }, + { "Display", "data/screen.ico", nullptr, nullptr, InitPanelDisplay, ExitPanelDisplay, RefreshPanelDisplay, HelpPanelDisplay }, + { "Sound", "data/sound.ico", nullptr, nullptr, InitPanelSound, ExitPanelSound, RefreshPanelSound, HelpPanelSound }, + { "Input", "data/joystick.ico", nullptr, nullptr, InitPanelInput, ExitPanelInput, RefreshPanelInput, HelpPanelInput }, + { "Miscellaneous", "data/misc.ico", nullptr, nullptr, InitPanelMisc, ExitPanelMisc, RefreshPanelMisc, HelpPanelMisc }, + { "Savestates", "data/savestate.png", nullptr, nullptr, InitPanelSavestate, ExitPanelSavestate, RefreshPanelSavestate, HelpPanelSavestate }, + { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr } }; -enum -{ - PANEL_PATHS, - PANEL_CONFIGURATIONS, - PANEL_CPU, - PANEL_CHIPSET, - PANEL_ROM, - PANEL_RAM, - PANEL_FLOPPY, - PANEL_HD, - PANEL_DISPLAY, - PANEL_SOUND, - PANEL_INPUT, - PANEL_MISC, - PANEL_SAVESTATES, +enum { + PANEL_PATHS, PANEL_QUICKSTART, PANEL_CONFIGURATIONS, PANEL_CPU, PANEL_CHIPSET, PANEL_ROM, PANEL_RAM, + PANEL_FLOPPY, PANEL_HD, PANEL_DISPLAY, PANEL_SOUND, PANEL_INPUT, PANEL_MISC, PANEL_SAVESTATES, NUM_PANELS }; /* - * SDL Stuff we need - */ +* SDL Stuff we need +*/ SDL_Surface* gui_screen; SDL_Texture* gui_texture; SDL_Event gui_event; SDL_Cursor* cursor; -SDL_Surface *cursorSurface; +SDL_Surface* cursorSurface; /* - * Guisan SDL stuff we need - */ +* Guisan SDL stuff we need +*/ gcn::SDLInput* gui_input; gcn::SDLGraphics* gui_graphics; gcn::SDLImageLoader* gui_imageLoader; gcn::SDLTrueTypeFont* gui_font; /* - * Guisan stuff we need - */ +* Guisan stuff we need +*/ gcn::Gui* uae_gui; gcn::Container* gui_top; gcn::Container* selectors; @@ -91,18 +91,19 @@ namespace widgets gcn::Button* cmdRestart; gcn::Button* cmdStart; gcn::Button* cmdShutdown; + gcn::Button* cmdHelp; } /* Flag for changes in rtarea: - Bit 0: any HD in config? - Bit 1: force because add/remove HD was clicked - Bit 2: socket_emu on - Bit 3: mousehack on - Bit 4: rtgmem on - Bit 5: chipmem larger than 2MB +Bit 0: any HD in config? +Bit 1: force because add/remove HD was clicked +Bit 2: socket_emu on +Bit 3: mousehack on +Bit 4: rtgmem on +Bit 5: chipmem larger than 2MB - gui_rtarea_flags_onenter is set before GUI is shown, bit 1 may change during GUI display. +gui_rtarea_flags_onenter is set before GUI is shown, bit 1 may change during GUI display. */ static int gui_rtarea_flags_onenter; @@ -119,7 +120,7 @@ static int gui_create_rtarea_flag(struct uae_prefs* p) if (p->input_tablet > 0) flag |= 8; - if (p->rtgmem_size) + if (p->rtgboards[0].rtgmem_size) flag |= 16; if (p->chipmem_size > 2 * 1024 * 1024) @@ -133,6 +134,11 @@ void gui_force_rtarea_hdchange() gui_rtarea_flags_onenter |= 2; } +void gui_restart() +{ + gui_running = false; +} + static void (*refreshFuncAfterDraw)() = nullptr; void RegisterRefreshFunc(void (*func)()) @@ -140,6 +146,35 @@ void RegisterRefreshFunc(void (*func)()) refreshFuncAfterDraw = func; } +void FocusBugWorkaround(gcn::Window *wnd) +{ + // When modal dialog opens via mouse, the dialog will not + // have the focus unless there is a mouse click. We simulate the click... + SDL_Event event; + event.type = SDL_MOUSEBUTTONDOWN; + event.button.button = SDL_BUTTON_LEFT; + event.button.state = SDL_PRESSED; + event.button.x = wnd->getX() + 2; + event.button.y = wnd->getY() + 2; + gui_input->pushInput(event); + event.type = SDL_MOUSEBUTTONUP; + gui_input->pushInput(event); +} + +static void ShowHelpRequested() +{ + std::vector helptext; + if (categories[last_active_panel].HelpFunc != nullptr && categories[last_active_panel].HelpFunc(helptext)) + { + //------------------------------------------------ + // Show help for current panel + //------------------------------------------------ + char title[128]; + snprintf(title, 128, "Help for %s", categories[last_active_panel].category); + ShowHelp(title, helptext); + } +} + void UpdateGuiScreen() { // Update the texture from the surface @@ -209,10 +244,11 @@ namespace sdl delete gui_imageLoader; delete gui_input; delete gui_graphics; - + SDL_FreeSurface(gui_screen); SDL_DestroyTexture(gui_texture); - if (cursor) { + if (cursor) + { SDL_FreeCursor(cursor); } gui_screen = nullptr; @@ -295,7 +331,7 @@ namespace sdl if (HandleNavigation(DIRECTION_RIGHT)) continue; // Don't change value when enter Slider -> don't send event to control break; - default: + default: break; } } @@ -510,6 +546,12 @@ namespace widgets cmdStart->setId("Start"); cmdStart->addActionListener(mainButtonActionListener); + cmdHelp = new gcn::Button("Help"); + cmdHelp->setSize(BUTTON_WIDTH, BUTTON_HEIGHT); + cmdHelp->setBaseColor(gui_baseCol); + cmdHelp->setId("Help"); + cmdHelp->addActionListener(mainButtonActionListener); + //-------------------------------------------------- // Create selector entries //-------------------------------------------------- @@ -552,6 +594,7 @@ namespace widgets gui_top->add(cmdReset, DISTANCE_BORDER, GUI_HEIGHT - DISTANCE_BORDER - BUTTON_HEIGHT); gui_top->add(cmdQuit, DISTANCE_BORDER + BUTTON_WIDTH + DISTANCE_NEXT_X, GUI_HEIGHT - DISTANCE_BORDER - BUTTON_HEIGHT); gui_top->add(cmdShutdown, DISTANCE_BORDER + 2 * BUTTON_WIDTH + 2 * DISTANCE_NEXT_X, GUI_HEIGHT - DISTANCE_BORDER - BUTTON_HEIGHT); + gui_top->add(cmdHelp, DISTANCE_BORDER + 3 * BUTTON_WIDTH + 3 * DISTANCE_NEXT_X, GUI_HEIGHT - DISTANCE_BORDER - BUTTON_HEIGHT); gui_top->add(cmdStart, GUI_WIDTH - DISTANCE_BORDER - BUTTON_WIDTH, GUI_HEIGHT - DISTANCE_BORDER - BUTTON_HEIGHT); gui_top->add(selectors, DISTANCE_BORDER + 1, DISTANCE_BORDER + 1); @@ -564,7 +607,10 @@ namespace widgets //-------------------------------------------------- // Activate last active panel //-------------------------------------------------- + if (!emulating && quickstart_start) + last_active_panel = 1; categories[last_active_panel].selector->requestFocus(); + cmdHelp->setVisible(categories[last_active_panel].HelpFunc != nullptr); } @@ -588,6 +634,7 @@ namespace widgets delete cmdReset; delete cmdRestart; delete cmdStart; + delete cmdHelp; delete mainButtonActionListener; @@ -626,40 +673,59 @@ void run_gui() gui_running = true; gui_rtarea_flags_onenter = gui_create_rtarea_flag(&currprefs); + expansion_generate_autoconfig_info(&changed_prefs); + try { sdl::gui_init(); widgets::gui_init(); + if (_tcslen(startup_message) > 0) { + ShowMessage(startup_title, startup_message, _T(""), _T("Ok"), _T("")); + _tcscpy(startup_title, _T("")); + _tcscpy(startup_message, _T("")); + widgets::cmdStart->requestFocus(); + } sdl::gui_run(); widgets::gui_halt(); sdl::gui_halt(); } + // Catch all guisan exceptions. catch (gcn::Exception e) { cout << e.getMessage() << endl; uae_quit(); } + // Catch all Std exceptions. catch (exception e) { cout << "Std exception: " << e.what() << endl; uae_quit(); } + // Catch all unknown exceptions. catch (...) { cout << "Unknown exception" << endl; uae_quit(); } + + expansion_generate_autoconfig_info(&changed_prefs); + cfgfile_compatibility_romtype(&changed_prefs); + if (quit_program > UAE_QUIT || quit_program < -UAE_QUIT) { //-------------------------------------------------- // Prepare everything for Reset of Amiga //-------------------------------------------------- currprefs.nr_floppies = changed_prefs.nr_floppies; + screen_is_picasso = 0; if (gui_rtarea_flags_onenter != gui_create_rtarea_flag(&changed_prefs)) quit_program = -UAE_RESET_HARD; // Hardreset required... } + + // Reset counter for access violations + init_max_signals(); }