diff --git a/desmume/src/Makefile.am b/desmume/src/Makefile.am
index 9596f6bb1..270786ad6 100644
--- a/desmume/src/Makefile.am
+++ b/desmume/src/Makefile.am
@@ -79,7 +79,7 @@ libdesmume_a_SOURCES = \
utils/libfat/partition.cpp \
utils/libfat/partition.h \
addons.cpp addons.h \
- addons/slot2_mpcf.cpp addons/slot2_paddle.cpp addons/slot2_gbagame.cpp addons/slot2_none.cpp addons/slot2_rumblepak.cpp addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp addons/slot2_piano.cpp addons/slot1_none.cpp addons/slot1_r4.cpp addons/slot1_retail.cpp \
+ addons/slot2_mpcf.cpp addons/slot2_paddle.cpp addons/slot2_gbagame.cpp addons/slot2_none.cpp addons/slot2_rumblepak.cpp addons/slot2_guitarGrip.cpp addons/slot2_expMemory.cpp addons/slot2_piano.cpp addons/slot1_none.cpp addons/slot1_r4.cpp addons/slot1_retail.cpp addons/slot1_retail_nand.cpp \
cheatSystem.cpp cheatSystem.h \
texcache.cpp texcache.h rasterize.cpp rasterize.h \
metaspu/metaspu.cpp metaspu/metaspu.h \
diff --git a/desmume/src/addons.cpp b/desmume/src/addons.cpp
index 15a52df52..f8182f62e 100644
--- a/desmume/src/addons.cpp
+++ b/desmume/src/addons.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2010 DeSmuME team
+/* Copyright (C) 2009-2011 DeSmuME team
This file is part of DeSmuME
@@ -70,10 +70,10 @@ void addonsReset()
BOOL addonsChangePak(NDS_ADDON_TYPE type)
{
- printf("addonsChangePak\n");
if (type > NDS_ADDON_COUNT) return FALSE;
addon.close();
addon = addonList[type];
addon_type = type;
+ printf("Slot 2: %s\n", addon.name);
return addon.init();
}
diff --git a/desmume/src/addons.h b/desmume/src/addons.h
index b89bf1441..8911b0352 100644
--- a/desmume/src/addons.h
+++ b/desmume/src/addons.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2009-2010 DeSmuME team
+/* Copyright (C) 2009-2011 DeSmuME team
This file is part of DeSmuME
diff --git a/desmume/src/addons/slot1_none.cpp b/desmume/src/addons/slot1_none.cpp
index 36ea49611..f0c0ce557 100644
--- a/desmume/src/addons/slot1_none.cpp
+++ b/desmume/src/addons/slot1_none.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010 DeSmuME team
+/* Copyright (C) 2010-2011 DeSmuME team
This file is part of DeSmuME
@@ -48,7 +48,7 @@ static u32 slot1_read32(u8 PROCNUM, u32 adr)
SLOT1INTERFACE slot1None = {
- "Slot1None",
+ "None",
slot1_init,
slot1_reset,
slot1_close,
diff --git a/desmume/src/addons/slot1_r4.cpp b/desmume/src/addons/slot1_r4.cpp
index 15344bf22..31285f0ba 100644
--- a/desmume/src/addons/slot1_r4.cpp
+++ b/desmume/src/addons/slot1_r4.cpp
@@ -223,7 +223,7 @@ static u32 read32(u8 PROCNUM, u32 adr)
}
SLOT1INTERFACE slot1R4 = {
- "Slot1R4",
+ "R4",
init,
reset,
close,
diff --git a/desmume/src/addons/slot1_retail.cpp b/desmume/src/addons/slot1_retail.cpp
index 26eadcc18..d68239d09 100644
--- a/desmume/src/addons/slot1_retail.cpp
+++ b/desmume/src/addons/slot1_retail.cpp
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010 DeSmuME team
+/* Copyright (C) 2010-2011 DeSmuME team
This file is part of DeSmuME
@@ -154,7 +154,7 @@ static u32 read32(u8 PROCNUM, u32 adr)
SLOT1INTERFACE slot1Retail = {
- "Slot1Retail",
+ "Retail",
init,
reset,
close,
diff --git a/desmume/src/addons/slot1_retail_nand.cpp b/desmume/src/addons/slot1_retail_nand.cpp
new file mode 100644
index 000000000..ee6df7a86
--- /dev/null
+++ b/desmume/src/addons/slot1_retail_nand.cpp
@@ -0,0 +1,202 @@
+/* Copyright (C) 2011 DeSmuME team
+
+ This file is part of DeSmuME
+
+ DeSmuME is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DeSmuME is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DeSmuME; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "../slot1.h"
+#include "../registers.h"
+#include "../MMU.h"
+#include "../NDSSystem.h"
+
+static void info(char *info) { strcpy(info, "Slot1 Retail NAND card emulation"); }
+static void config(void) {}
+
+static BOOL init() { return (TRUE); }
+
+static void reset() {}
+
+static void close() {}
+
+
+static void write08(u8 PROCNUM, u32 adr, u8 val) {}
+static void write16(u8 PROCNUM, u32 adr, u16 val) {}
+
+static void write32_GCROMCTRL(u8 PROCNUM, u32 val)
+{
+ nds_dscard& card = MMU.dscard[PROCNUM];
+
+ switch(card.command[0])
+ {
+ case 0x00: //Data read
+ case 0xB7:
+ card.address = (card.command[1] << 24) | (card.command[2] << 16) | (card.command[3] << 8) | card.command[4];
+ card.transfer_count = 0x80;
+ break;
+
+ case 0xB8: // Chip ID
+ card.address = 0;
+ card.transfer_count = 1;
+ break;
+
+ // Nand Init
+ case 0x94:
+ card.address = 0;
+ card.transfer_count = 0x80;
+ break;
+
+ // Nand Error?
+ case 0xD6:
+ card.address = 0;
+ card.transfer_count = 1;
+ break;
+
+ // Nand Write? ---- PROGRAM for INTERNAL DATA MOVE/RANDOM DATA INPUT
+ //case 0x8B:
+ case 0x85:
+ card.address = 0;
+ card.transfer_count = 0x80;
+ break;
+
+ default:
+ card.address = 0;
+ card.transfer_count = 0;
+ break;
+ }
+}
+
+static void write32(u8 PROCNUM, u32 adr, u32 val)
+{
+ switch(adr)
+ {
+ case REG_GCROMCTRL:
+ write32_GCROMCTRL(PROCNUM, val);
+ break;
+ }
+}
+
+static u8 read08(u8 PROCNUM, u32 adr)
+{
+ return 0xFF;
+}
+static u16 read16(u8 PROCNUM, u32 adr)
+{
+ return 0xFFFF;
+}
+
+static u32 read32_GCDATAIN(u8 PROCNUM)
+{
+ nds_dscard& card = MMU.dscard[PROCNUM];
+
+ switch(card.command[0])
+ {
+ //Get ROM chip ID
+ case 0x90:
+ case 0xB8:
+ {
+ // Note: the BIOS stores the chip ID in main memory
+ // Most games continuously compare the chip ID with
+ // the value in memory, probably to know if the card
+ // was removed.
+ // As DeSmuME boots directly from the game, the chip
+ // ID in main mem is zero and this value needs to be
+ // zero too.
+
+ //staff of kings verifies this (it also uses the arm7 IRQ 20)
+ if(nds.cardEjected) //TODO - handle this with ejected card slot1 device (and verify using this case)
+ return 0xFFFFFFFF;
+ else return 0;
+ }
+ break;
+
+
+ // Data read
+ case 0x00:
+ case 0xB7:
+ {
+ // Make sure any reads below 0x8000 redirect to 0x8000+(adr&0x1FF) as on real cart
+ if((card.command[0] == 0xB7) && (card.address < 0x8000))
+ {
+ //TODO - refactor this to include the PROCNUM, for debugging purposes if nothing else
+ //(can refactor gbaslot also)
+
+ //INFO("Read below 0x8000 (0x%04X) from: ARM%s %08X\n",
+ // card.address, (PROCNUM ? "7":"9"), (PROCNUM ? NDS_ARM7:NDS_ARM9).instruct_adr);
+
+ card.address = (0x8000 + (card.address&0x1FF));
+ }
+
+ //it seems that etrian odyssey 3 doesnt work unless we mask this to cart size.
+ //but, a thought: does the internal rom address counter register wrap around? we may be making a mistake by keeping the extra precision
+ //but there is no test case yet
+ u32 address = card.address & (gameInfo.mask);
+
+ //as a sanity measure for funny-sized roms (homebrew and perhaps truncated retail roms)
+ //we need to protect ourselves by returning 0xFF for things still out of range
+ if(address >= gameInfo.romsize)
+ {
+ DEBUG_Notify.ReadBeyondEndOfCart(address,gameInfo.romsize);
+ return 0xFFFFFFFF;
+ }
+
+ return T1ReadLong(MMU.CART_ROM, address);
+ }
+ break;
+
+ // Nand Init?
+ case 0x94:
+ return 0; //Unsure what to return here so return 0 for now
+
+ // Nand Status?
+ case 0xD6:
+ //0x80 == busy
+ // Made in Ore/WariWare D.I.Y. need set value to 0x80
+ return 0x80; //0x20 == ready
+
+ default:
+ return 0;
+ } //switch(card.command[0])
+} //read32_GCDATAIN
+
+static u32 read32(u8 PROCNUM, u32 adr)
+{
+ switch(adr)
+ {
+ case REG_GCDATAIN:
+ return read32_GCDATAIN(PROCNUM);
+ default:
+ return 0;
+ }
+}
+
+
+SLOT1INTERFACE slot1Retail_NAND = {
+ "Retail with NAND Flash",
+ init,
+ reset,
+ close,
+ config,
+ write08,
+ write16,
+ write32,
+ read08,
+ read16,
+ read32,
+ info
+};
+
+
+
diff --git a/desmume/src/commandline.cpp b/desmume/src/commandline.cpp
index 1600f0c93..9e6f7cb27 100644
--- a/desmume/src/commandline.cpp
+++ b/desmume/src/commandline.cpp
@@ -241,5 +241,7 @@ void CommandLine::process_addonCommands()
slot1Change(NDS_SLOT1_RETAIL);
else if(slot1 == "r4")
slot1Change(NDS_SLOT1_R4);
+ else if(slot1 == "retailNAND")
+ slot1Change(NDS_SLOT1_RETAIL_NAND);
}
diff --git a/desmume/src/slot1.cpp b/desmume/src/slot1.cpp
index 9f16e834a..9733b4b63 100644
--- a/desmume/src/slot1.cpp
+++ b/desmume/src/slot1.cpp
@@ -28,6 +28,7 @@
extern SLOT1INTERFACE slot1None;
extern SLOT1INTERFACE slot1Retail;
extern SLOT1INTERFACE slot1R4;
+extern SLOT1INTERFACE slot1Retail_NAND;
static EMUFILE* fatImage = NULL;
static std::string fatDir;
@@ -35,7 +36,8 @@ static std::string fatDir;
SLOT1INTERFACE slot1List[NDS_SLOT1_COUNT] = {
slot1None,
slot1Retail,
- slot1R4
+ slot1R4,
+ slot1Retail_NAND
};
SLOT1INTERFACE slot1_device = slot1Retail; //default for frontends that dont even configure this
@@ -45,8 +47,11 @@ static void scanDir()
{
if(fatDir == "") return;
- delete fatImage;
- fatImage = NULL;
+ if (fatImage)
+ {
+ delete fatImage;
+ fatImage = NULL;
+ }
VFAT vfat;
if(vfat.build(fatDir.c_str(),16))
@@ -57,7 +62,8 @@ static void scanDir()
BOOL slot1Init()
{
- scanDir();
+ if (slot1_device_type == NDS_SLOT1_R4)
+ scanDir();
return slot1_device.init();
}
@@ -66,8 +72,11 @@ void slot1Close()
slot1_device.close();
//be careful to do this second, maybe the device will write something more
- delete fatImage;
- fatImage = NULL;
+ if (fatImage)
+ {
+ delete fatImage;
+ fatImage = NULL;
+ }
}
void slot1Reset()
@@ -77,19 +86,27 @@ void slot1Reset()
BOOL slot1Change(NDS_SLOT1_TYPE changeToType)
{
- printf("slot1Change to: %d\n", changeToType);
if (changeToType > NDS_SLOT1_COUNT || changeToType < 0) return FALSE;
slot1_device.close();
slot1_device_type = changeToType;
slot1_device = slot1List[slot1_device_type];
+ if (changeToType == NDS_SLOT1_R4)
+ scanDir();
+ printf("Slot 1: %s\n", slot1_device.name);
return slot1_device.init();
}
void slot1SetFatDir(const std::string& dir)
{
+ //printf("FAT path %s\n", dir.c_str());
fatDir = dir;
}
+std::string slot1GetFatDir()
+{
+ return fatDir;
+}
+
EMUFILE* slot1GetFatImage()
{
return fatImage;
diff --git a/desmume/src/slot1.h b/desmume/src/slot1.h
index 9f5adc3c0..11530f751 100644
--- a/desmume/src/slot1.h
+++ b/desmume/src/slot1.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2010 DeSmuME team
+/* Copyright (C) 2010-2011 DeSmuME team
This file is part of DeSmuME
@@ -58,21 +58,24 @@ struct SLOT1INTERFACE
void (*info)(char *info);
};
-extern SLOT1INTERFACE slot1_device; // current slot1 device
-
enum NDS_SLOT1_TYPE
{
NDS_SLOT1_NONE,
NDS_SLOT1_RETAIL,
NDS_SLOT1_R4,
+ NDS_SLOT1_RETAIL_NAND, // used in Made in Ore/WarioWare D.I.Y.
NDS_SLOT1_COUNT // use for counter addons - MUST TO BE LAST!!!
};
+extern SLOT1INTERFACE slot1_device; // current slot1 device
+extern SLOT1INTERFACE slot1List[NDS_SLOT1_COUNT];
+extern u8 slot1_device_type;
+
BOOL slot1Init();
void slot1Close();
void slot1Reset();
BOOL slot1Change(NDS_SLOT1_TYPE type); // change current adddon
void slot1SetFatDir(const std::string& dir);
+std::string slot1GetFatDir();
EMUFILE* slot1GetFatImage();
-
-#endif //__ADDONS_H__
+#endif //__SLOT1_H__
diff --git a/desmume/src/windows/DeSmuME_2005.vcproj b/desmume/src/windows/DeSmuME_2005.vcproj
index 923f03561..e7c65062b 100644
--- a/desmume/src/windows/DeSmuME_2005.vcproj
+++ b/desmume/src/windows/DeSmuME_2005.vcproj
@@ -869,6 +869,14 @@
RelativePath=".\resources.rc"
>
+
+
+
+
@@ -1655,6 +1663,10 @@
RelativePath="..\addons\slot1_retail.cpp"
>
+
+
diff --git a/desmume/src/windows/DeSmuME_2008.vcproj b/desmume/src/windows/DeSmuME_2008.vcproj
index fe57667c8..cfac96247 100644
--- a/desmume/src/windows/DeSmuME_2008.vcproj
+++ b/desmume/src/windows/DeSmuME_2008.vcproj
@@ -922,22 +922,6 @@
RelativePath="..\slot1.h"
>
-
-
-
-
-
-
-
-
@@ -1005,6 +989,10 @@
RelativePath="..\addons\slot1_retail.cpp"
>
+
+
@@ -1554,6 +1542,14 @@
RelativePath=".\resource.h"
>
+
+
+
+
diff --git a/desmume/src/windows/DeSmuME_2010.vcxproj b/desmume/src/windows/DeSmuME_2010.vcxproj
index 374ab2b9a..4ec230c82 100644
--- a/desmume/src/windows/DeSmuME_2010.vcxproj
+++ b/desmume/src/windows/DeSmuME_2010.vcxproj
@@ -432,6 +432,7 @@
+
@@ -542,6 +543,7 @@
+
@@ -680,6 +682,7 @@
+
diff --git a/desmume/src/windows/DeSmuME_2010.vcxproj.filters b/desmume/src/windows/DeSmuME_2010.vcxproj.filters
index a533195e3..40bbb51bd 100644
--- a/desmume/src/windows/DeSmuME_2010.vcxproj.filters
+++ b/desmume/src/windows/DeSmuME_2010.vcxproj.filters
@@ -315,6 +315,9 @@
Windows
+
+ Windows
+
Windows
@@ -393,6 +396,9 @@
Core\addons
+
+ Core\addons
+
Core\utils
@@ -719,6 +725,9 @@
Windows
+
+ Windows
+
Windows
diff --git a/desmume/src/windows/console.cpp b/desmume/src/windows/console.cpp
index 27706ac24..90201c4be 100644
--- a/desmume/src/windows/console.cpp
+++ b/desmume/src/windows/console.cpp
@@ -106,14 +106,5 @@ void CloseConsole() {
void printlog(const char *fmt, ...)
{
- va_list list;
- char msg[512];
- DWORD tmp;
-
- memset(msg,0,512);
-
- va_start(list,fmt);
- _vsnprintf(msg,511,fmt,list);
- va_end(list);
- WriteConsole(hConsole,msg, (DWORD)strlen(msg), &tmp, 0);
+ printf(fmt);
}
diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp
index cef4da54c..566b3b62b 100644
--- a/desmume/src/windows/main.cpp
+++ b/desmume/src/windows/main.cpp
@@ -44,6 +44,7 @@ along with the this software. If not, see .
#include "../NDSSystem.h"
#include "../debug.h"
#include "../saves.h"
+#include "../slot1.h"
#include "../addons.h"
#include "../GPU_osd.h"
#include "../OGLRender.h"
@@ -91,6 +92,7 @@ along with the this software. If not, see .
#include "mapview.h"
#include "matrixview.h"
#include "lightview.h"
+#include "slot1_config.h"
#include "gbaslot_config.h"
#include "cheatsWin.h"
#include "memView.h"
@@ -2562,12 +2564,6 @@ int _main()
CommonSettings.cheatsDisable = GetPrivateProfileBool("General", "cheatsDisable", false, IniName);
- addon_type = (NDS_ADDON_TYPE)GetPrivateProfileInt("GBAslot", "type", NDS_ADDON_NONE, IniName);
- win32_CFlash_cfgMode = GetPrivateProfileInt("GBAslot.CFlash", "fileMode", 2, IniName);
- win32_CFlash_cfgDirectory = GetPrivateProfileStdString("GBAslot.CFlash", "path", "");
- win32_CFlash_cfgFileName = GetPrivateProfileStdString("GBAslot.CFlash", "filename", "");
- GetPrivateProfileString("GBAslot.GBAgame", "filename", "", GBAgameName, MAX_PATH, IniName);
-
WIN_InstallCFlash();
ColorCtrl_Register();
@@ -2747,8 +2743,30 @@ int _main()
ViewMatrices = new TOOLSCLASS(hAppInst, IDD_MATRIX_VIEWER, (DLGPROC) ViewMatricesProc);
ViewLights = new TOOLSCLASS(hAppInst, IDD_LIGHT_VIEWER, (DLGPROC) ViewLightsProc);
+ // Slot 1 / Slot 2 (GBA slot)
+ slot1_device_type = (NDS_SLOT1_TYPE)GetPrivateProfileInt("Slot1", "type", NDS_SLOT1_RETAIL, IniName);
+ cmdline.slot1_fat_dir = GetPrivateProfileStdString("Slot1", "fat_path", "");
+
+ addon_type = (NDS_ADDON_TYPE)GetPrivateProfileInt("GBAslot", "type", NDS_ADDON_NONE, IniName);
+ win32_CFlash_cfgMode = GetPrivateProfileInt("GBAslot.CFlash", "fileMode", 2, IniName);
+ win32_CFlash_cfgDirectory = GetPrivateProfileStdString("GBAslot.CFlash", "path", "");
+ win32_CFlash_cfgFileName = GetPrivateProfileStdString("GBAslot.CFlash", "filename", "");
+ GetPrivateProfileString("GBAslot.GBAgame", "filename", "", GBAgameName, MAX_PATH, IniName);
cmdline.process_addonCommands();
+
+ switch (slot1_device_type)
+ {
+ case NDS_SLOT1_NONE:
+ case NDS_SLOT1_RETAIL:
+ case NDS_SLOT1_R4:
+ case NDS_SLOT1_RETAIL_NAND:
+ break;
+ default:
+ slot1_device_type = NDS_SLOT1_RETAIL;
+ break;
+ }
+
if(cmdline.is_cflash_configured)
{
addon_type = NDS_ADDON_CFLASH;
@@ -2793,6 +2811,8 @@ int _main()
addon_type = NDS_ADDON_NONE;
break;
}
+
+ slot1Change((NDS_SLOT1_TYPE)slot1_device_type);
addonsChangePak(addon_type);
CommonSettings.wifi.mode = GetPrivateProfileInt("Wifi", "Mode", 0, IniName);
@@ -5078,6 +5098,10 @@ DOKEYDOWN:
TogglePause();
return 0;
+ case IDM_SLOT1:
+ slot1Dialog(hwnd);
+ return 0;
+
case IDM_GBASLOT:
GBAslotDialog(hwnd);
return 0;
diff --git a/desmume/src/windows/pathsettings.cpp b/desmume/src/windows/pathsettings.cpp
index d46c3772d..0f4cec9d8 100644
--- a/desmume/src/windows/pathsettings.cpp
+++ b/desmume/src/windows/pathsettings.cpp
@@ -109,6 +109,7 @@ void WritePathSettings()
WritePrivateProfileString(SECTION, SCREENSHOTKEY, path.pathToScreenshots, IniName);
WritePrivateProfileString(SECTION, AVIKEY, path.pathToAviFiles, IniName);
WritePrivateProfileString(SECTION, CHEATKEY, path.pathToCheats, IniName);
+ WritePrivateProfileInt(SECTION, R4FORMATKEY, path.r4Format, IniName);
WritePrivateProfileString(SECTION, SOUNDKEY, path.pathToSounds, IniName);
WritePrivateProfileString(SECTION, FIRMWAREKEY, path.pathToFirmware, IniName);
WritePrivateProfileString(SECTION, LUAKEY, path.pathToLua, IniName);
@@ -141,6 +142,7 @@ BOOL PathSettings_OnInitDialog(HWND hDlg, HWND hwndFocus, LPARAM lParam)
CheckDlgButton(hDlg, IDC_USELASTVISIT, (path.savelastromvisit) ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(hDlg, IDC_ASSOCIATE, (associate) ? BST_CHECKED : BST_UNCHECKED);
CheckRadioButton(hDlg, IDC_PNG, IDC_BMP, (int)path.imageformat());
+ CheckRadioButton(hDlg, IDC_R4TYPE1, IDC_R4TYPE2, (int)path.r4Format);
// IDC_FORMATEDIT setup
SetDlgItemText(hDlg, IDC_FORMATEDIT, path.screenshotFormat);
@@ -258,6 +260,15 @@ void PathSettings_OnCommand(HWND hDlg, int id, HWND hwndCtl, UINT codeNotify)
SetDlgItemText(hDlg, IDC_CHEATPATHEDIT, path.pathToCheats);
}
break;
+ case IDC_R4TYPE1:
+ CheckRadioButton(hDlg, IDC_R4TYPE1, IDC_R4TYPE2, IDC_R4TYPE1);
+ path.r4Format = path.R4_CHEAT_DAT;
+ break;
+ case IDC_R4TYPE2:
+ CheckRadioButton(hDlg, IDC_R4TYPE1, IDC_R4TYPE2, IDC_R4TYPE2);
+ path.r4Format = path.R4_USRCHEAT_DAT;
+ break;
+
case IDC_BROWSELUA:
{
if(BrowseForPath(path.pathToLua))
diff --git a/desmume/src/windows/resource.h b/desmume/src/windows/resource.h
index 987121c38..981ad8f9c 100644
--- a/desmume/src/windows/resource.h
+++ b/desmume/src/windows/resource.h
@@ -802,6 +802,8 @@
#define IDD_CHEAT_ADD_XX_CODE 10005
#define IDD_GBASLOT_GUITARGRIP 10009
#define IDD_GBASLOT_PIANO 10010
+#define IDD_SLOT1_NONE 10011
+#define IDD_SLOT1_R4 10012
#define IDM_FILE_STOPAVI 40000
#define IDM_SCREENSEP_NONE 40000
#define IDM_FILE_STOPWAV 40001
@@ -876,6 +878,7 @@
#define ID_MAGNIFICATIONFILTER_HQ4X40091 40091
#define ID_FILTRI_HQ4X 40092
#define ID_40093 40093
+#define IDM_SLOT1 40097
#define IDC_LABEL_UP 50000
#define IDC_LABEL_RIGHT 50001
#define IDC_LABEL_LEFT 50002
@@ -976,8 +979,8 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 125
-#define _APS_NEXT_COMMAND_VALUE 40094
-#define _APS_NEXT_CONTROL_VALUE 1050
+#define _APS_NEXT_COMMAND_VALUE 40102
+#define _APS_NEXT_CONTROL_VALUE 1052
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
diff --git a/desmume/src/windows/resources.rc b/desmume/src/windows/resources.rc
index 025e80dc5..1c2c9220c 100644
Binary files a/desmume/src/windows/resources.rc and b/desmume/src/windows/resources.rc differ
diff --git a/desmume/src/windows/slot1_config.cpp b/desmume/src/windows/slot1_config.cpp
new file mode 100644
index 000000000..ea2fa9234
--- /dev/null
+++ b/desmume/src/windows/slot1_config.cpp
@@ -0,0 +1,231 @@
+/* Copyright (C) 2011 DeSmuME team
+
+ This file is part of DeSmuME
+
+ DeSmuME is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DeSmuME is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DeSmuME; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#include "slot1_config.h"
+#include
+#include "resource.h"
+#include "main.h"
+#include "debug.h"
+#include "../slot1.h"
+#include "../NDSSystem.h"
+#include
+
+HWND wndConfigSlot1 = NULL;
+u8 temp_type_slot1 = 0;
+u8 last_type_slot1 = 0;
+char tmp_fat_path[MAX_PATH] = {0};
+HWND OKbutton_slot1 = NULL;
+bool _OKbutton_slot1 = false;
+bool needReset_slot1 = true;
+
+
+INT_PTR CALLBACK Slot1None(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ {
+ _OKbutton_slot1 = TRUE;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+INT_PTR CALLBACK Slot1R4(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ {
+ SetWindowText(GetDlgItem(dialog, IDC_PATH), tmp_fat_path);
+ _OKbutton_slot1 = (tmp_fat_path!="");
+ return TRUE;
+ }
+
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wparam))
+ {
+ case IDC_BROWSE:
+ {
+ BROWSEINFO bp={0};
+
+ bp.hwndOwner=dialog;
+ bp.pidlRoot=NULL;
+ bp.pszDisplayName=NULL;
+ bp.lpszTitle="Select directory for FAT image building";
+ bp.ulFlags=BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_USENEWUI;
+ bp.lpfn=NULL;
+
+ LPITEMIDLIST tmp = SHBrowseForFolder((LPBROWSEINFO)&bp);
+ if (tmp!=NULL)
+ {
+ memset(tmp_fat_path, 0, sizeof(tmp_fat_path));
+ SHGetPathFromIDList(tmp, tmp_fat_path);
+ if (tmp_fat_path[strlen(tmp_fat_path)-1] != '\\')
+ tmp_fat_path[strlen(tmp_fat_path)] = '\\';
+ SetWindowText(GetDlgItem(dialog, IDC_PATH), tmp_fat_path);
+ }
+ if (strlen(tmp_fat_path))
+ EnableWindow(OKbutton_slot1, TRUE);
+ else
+ EnableWindow(OKbutton_slot1, FALSE);
+ break;
+ }
+ }
+ }
+ }
+ return FALSE;
+}
+
+u32 Slot1_IDDs[NDS_SLOT1_COUNT] = {
+ IDD_SLOT1_NONE,
+ IDD_SLOT1_NONE,
+ IDD_SLOT1_R4,
+ IDD_SLOT1_NONE
+};
+
+DLGPROC Slot1_Procs[NDS_SLOT1_COUNT] = {
+ Slot1None,
+ Slot1None,
+ Slot1R4,
+ Slot1None
+};
+
+
+//==============================================================================
+BOOL CALLBACK Slot1Box_Proc(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam)
+{
+ switch(msg)
+ {
+ case WM_INITDIALOG:
+ {
+ OKbutton_slot1 = GetDlgItem(dialog, IDOK);
+ for(int i = 0; i < NDS_SLOT1_COUNT; i++)
+ ComboBox_AddString(GetDlgItem(dialog, IDC_ADDONS_LIST), slot1List[i].name);
+ ComboBox_SetCurSel(GetDlgItem(dialog, IDC_ADDONS_LIST), temp_type_slot1);
+ u8 tmp_info[512];
+ slot1List[temp_type_slot1].info((char *)tmp_info);
+ SetWindowText(GetDlgItem(dialog, IDC_ADDONS_INFO), (char *)tmp_info);
+
+ _OKbutton_slot1 = false;
+ wndConfigSlot1=CreateDialogW(hAppInst, MAKEINTRESOURCEW(Slot1_IDDs[temp_type_slot1]),
+ dialog, (DLGPROC)Slot1_Procs[temp_type_slot1]);
+ if ( (temp_type_slot1 == 0) || (_OKbutton_slot1) )
+ EnableWindow(OKbutton_slot1, TRUE);
+ else
+ EnableWindow(OKbutton_slot1, FALSE);
+ return TRUE;
+ }
+
+ case WM_COMMAND:
+ {
+ switch (LOWORD(wparam))
+ {
+ case IDOK:
+ {
+ int Msg = IDYES;
+ if (romloaded && (needReset_slot1 || (temp_type_slot1!=slot1_device_type)) )
+ {
+ Msg = MessageBox(dialog,
+ "After change slot1 device game will reset!\nAre you sure to continue?", "DeSmuME",
+ MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2);
+ }
+ if (Msg == IDYES)
+ {
+ if (wndConfigSlot1) DestroyWindow(wndConfigSlot1);
+ EndDialog(dialog, TRUE);
+ }
+ }
+ return TRUE;
+ case IDCANCEL:
+ if (wndConfigSlot1) DestroyWindow(wndConfigSlot1);
+ EndDialog(dialog, FALSE);
+ return TRUE;
+
+ case IDC_ADDONS_LIST:
+ if (HIWORD(wparam) == CBN_SELENDOK)
+ {
+ temp_type_slot1 = ComboBox_GetCurSel(GetDlgItem(dialog, IDC_ADDONS_LIST));
+ if (temp_type_slot1 != last_type_slot1)
+ {
+ if (wndConfigSlot1) DestroyWindow(wndConfigSlot1);
+ _OKbutton_slot1 = false;
+ wndConfigSlot1=CreateDialogW(hAppInst,
+ MAKEINTRESOURCEW(Slot1_IDDs[temp_type_slot1]), dialog,
+ (DLGPROC)Slot1_Procs[temp_type_slot1]);
+ if ( (temp_type_slot1 == 0) || (_OKbutton_slot1) )
+ EnableWindow(OKbutton_slot1, TRUE);
+ else
+ EnableWindow(OKbutton_slot1, FALSE);
+ u8 tmp_info[512];
+ slot1List[temp_type_slot1].info((char *)tmp_info);
+ SetWindowText(GetDlgItem(dialog, IDC_ADDONS_INFO), (char *)tmp_info);
+ last_type_slot1 = temp_type_slot1;
+ }
+ }
+ return TRUE;
+ }
+ break;
+ }
+ }
+ return FALSE;
+}
+
+void slot1Dialog(HWND hwnd)
+{
+ strcpy(tmp_fat_path, slot1GetFatDir().c_str());
+ temp_type_slot1 = slot1_device_type;
+ last_type_slot1 = temp_type_slot1;
+ _OKbutton_slot1 = false;
+ needReset_slot1 = true;
+ u32 res=DialogBoxW(hAppInst, MAKEINTRESOURCEW(IDD_GBASLOT), hwnd, (DLGPROC)Slot1Box_Proc);
+ if (res)
+ {
+ switch (temp_type_slot1)
+ {
+ case NDS_SLOT1_NONE:
+ if (temp_type_slot1 != slot1_device_type)
+ needReset_slot1 = true;
+ else
+ needReset_slot1 = false;
+ break;
+ case NDS_SLOT1_RETAIL:
+ break;
+ case NDS_SLOT1_R4:
+ if (strlen(tmp_fat_path))
+ {
+ slot1SetFatDir(tmp_fat_path);
+ WritePrivateProfileString("Slot1","FAT_path",tmp_fat_path,IniName);
+ }
+ break;
+ case NDS_SLOT1_RETAIL_NAND:
+ break;
+ default:
+ return;
+ }
+ WritePrivateProfileInt("Slot1","type",temp_type_slot1,IniName);
+
+ slot1Change((NDS_SLOT1_TYPE)temp_type_slot1);
+ if (romloaded && needReset_slot1)
+ NDS_Reset();
+ return;
+ }
+}
\ No newline at end of file
diff --git a/desmume/src/windows/slot1_config.h b/desmume/src/windows/slot1_config.h
new file mode 100644
index 000000000..e3dab836f
--- /dev/null
+++ b/desmume/src/windows/slot1_config.h
@@ -0,0 +1,27 @@
+/* Copyright (C) 2011 DeSmuME team
+
+ This file is part of DeSmuME
+
+ DeSmuME is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DeSmuME is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DeSmuME; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef __SLOT1_CONFIG_H_
+#define __SLOT1_CONFIG_H_
+#include "../common.h"
+#include
+
+extern void slot1Dialog(HWND hwnd);
+
+#endif
diff --git a/desmume/src/wx/wxDeSmuME_2008.vcproj b/desmume/src/wx/wxDeSmuME_2008.vcproj
index d2681322e..85e57c787 100644
--- a/desmume/src/wx/wxDeSmuME_2008.vcproj
+++ b/desmume/src/wx/wxDeSmuME_2008.vcproj
@@ -1024,6 +1024,10 @@
RelativePath="..\addons\slot1_retail.cpp"
>
+
+