From cfc128abff187cb0df1fe832f5d5e46781849a6b Mon Sep 17 00:00:00 2001 From: Shawn Hoffman Date: Mon, 2 Feb 2009 22:29:33 +0000 Subject: [PATCH] reorganize SI and EXI interfaces, add a gui for picking devices. XK, that was annoying. Now, you can deal with SI_Channel. This commit changes how memcards are handled a little, now they are .REGION.raw, like .USA.raw, and can be in any dir. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@2075 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Src/Paths.h | 54 ++- Source/Core/Core/Core.vcproj | 12 +- Source/Core/Core/Src/ConfigManager.cpp | 59 ++- Source/Core/Core/Src/ConfigManager.h | 7 + Source/Core/Core/Src/CoreParameter.cpp | 56 ++- Source/Core/Core/Src/CoreParameter.h | 19 +- Source/Core/Core/Src/HW/EXI.cpp | 20 +- Source/Core/Core/Src/HW/EXI.h | 3 +- Source/Core/Core/Src/HW/EXI_Channel.cpp | 27 +- Source/Core/Core/Src/HW/EXI_Channel.h | 24 +- Source/Core/Core/Src/HW/EXI_Device.cpp | 58 ++- Source/Core/Core/Src/HW/EXI_Device.h | 12 +- Source/Core/Core/Src/HW/SI.cpp | 449 ++++-------------- Source/Core/Core/Src/HW/SI.h | 3 +- Source/Core/Core/Src/HW/SI_Channel.cpp | 257 ++++++++++ Source/Core/Core/Src/HW/SI_Channel.h | 111 +++++ Source/Core/Core/Src/HW/SI_Device.cpp | 77 ++- Source/Core/Core/Src/HW/SI_Device.h | 92 ++-- Source/Core/Core/Src/HW/SI_DeviceGBA.cpp | 132 +++++ ...I_DeviceGBAController.h => SI_DeviceGBA.h} | 140 +++--- .../Core/Src/HW/SI_DeviceGBAController.cpp | 99 ---- .../Core/Src/HW/SI_DeviceGCController.cpp | 25 +- .../Core/Core/Src/HW/SI_DeviceGCController.h | 24 +- Source/Core/DolphinWX/Src/ConfigMain.cpp | 235 +++++++-- Source/Core/DolphinWX/Src/ConfigMain.h | 38 +- Source/Core/DolphinWX/Src/FrameTools.cpp | 3 +- 26 files changed, 1199 insertions(+), 837 deletions(-) create mode 100644 Source/Core/Core/Src/HW/SI_Channel.cpp create mode 100644 Source/Core/Core/Src/HW/SI_Channel.h create mode 100644 Source/Core/Core/Src/HW/SI_DeviceGBA.cpp rename Source/Core/Core/Src/HW/{SI_DeviceGBAController.h => SI_DeviceGBA.h} (67%) delete mode 100644 Source/Core/Core/Src/HW/SI_DeviceGBAController.cpp diff --git a/Source/Core/Common/Src/Paths.h b/Source/Core/Common/Src/Paths.h index 862c8ec2b4..50f7c24182 100644 --- a/Source/Core/Common/Src/Paths.h +++ b/Source/Core/Common/Src/Paths.h @@ -36,6 +36,7 @@ #define CACHE_DIR "Cache" #define STATESAVES_DIR "StateSaves" #define SCREENSHOTS_DIR "ScreenShots" +#define DUMP_DIR "Dump" #define LOGS_DIR "Logs" #define MAIL_LOGS_DIR "Mail" @@ -48,10 +49,10 @@ #define DEBUGGER_CONFIG "Debugger.ini" #define TOTALDB "totaldb.dsy" -#define DEFAULT_GFX_PLUGIN PLUGIN_PREFIX "Plugin_VideoOGL" PLUGIN_SUFFIX -#define DEFAULT_DSP_PLUGIN PLUGIN_PREFIX "Plugin_DSP_HLE" PLUGIN_SUFFIX -#define DEFAULT_PAD_PLUGIN PLUGIN_PREFIX "Plugin_PadSimple" PLUGIN_SUFFIX -#define DEFAULT_WIIMOTE_PLUGIN PLUGIN_PREFIX "Plugin_Wiimote" PLUGIN_SUFFIX +#define DEFAULT_GFX_PLUGIN PLUGIN_PREFIX "Plugin_VideoOGL" PLUGIN_SUFFIX +#define DEFAULT_DSP_PLUGIN PLUGIN_PREFIX "Plugin_DSP_HLE" PLUGIN_SUFFIX +#define DEFAULT_PAD_PLUGIN PLUGIN_PREFIX "Plugin_PadSimple" PLUGIN_SUFFIX +#define DEFAULT_WIIMOTE_PLUGIN PLUGIN_PREFIX "Plugin_Wiimote" PLUGIN_SUFFIX #define FONT_ANSI "font_ansi.bin" #define FONT_SJIS "font_sjis.bin" @@ -61,8 +62,8 @@ #define GC_IPL "IPL.bin" #define GC_SRAM "SRAM.raw" -#define GC_MEMCARDA "MemoryCardA.raw" -#define GC_MEMCARDB "MemoryCardB.raw" +#define GC_MEMCARDA "MemoryCardA" +#define GC_MEMCARDB "MemoryCardB" #define WII_MASTERKEY "masterkey.bin" #define WII_MASTERKEY_HEX "masterkey.txt" @@ -76,54 +77,55 @@ // User dirs #define FULL_USERDATA_DIR ROOT_DIR DIR_SEP USERDATA_DIR DIR_SEP -#define FULL_GC_USER_DIR FULL_USERDATA_DIR GC_USER_DIR DIR_SEP +#define FULL_GC_USER_DIR FULL_USERDATA_DIR GC_USER_DIR DIR_SEP //#define GC_USER_EUR_DIR FULL_GC_USER_DIR EUR_DIR //#define GC_USER_USA_DIR FULL_GC_USER_DIR USA_DIR //#define GC_USER_JAP_DIR FULL_GC_USER_DIR JAP_DIR -#define FULL_WII_USER_DIR FULL_USERDATA_DIR WII_USER_DIR DIR_SEP -#define FULL_WII_ROOT_DIR FULL_USERDATA_DIR WII_USER_DIR // This is the "root" for Wii fs, so that it may be used with created devices +#define FULL_WII_USER_DIR FULL_USERDATA_DIR WII_USER_DIR DIR_SEP +#define FULL_WII_ROOT_DIR FULL_USERDATA_DIR WII_USER_DIR // This is the "root" for Wii fs, so that it may be used with created devices #define FULL_GAMECONFIG_DIR FULL_USERDATA_DIR GAMECONFIG_DIR DIR_SEP #define FULL_CONFIG_DIR FULL_USERDATA_DIR CONFIG_DIR DIR_SEP #define FULL_CACHE_DIR FULL_USERDATA_DIR CACHE_DIR DIR_SEP #define FULL_STATESAVES_DIR FULL_USERDATA_DIR STATESAVES_DIR DIR_SEP #define FULL_SCREENSHOTS_DIR FULL_USERDATA_DIR SCREENSHOTS_DIR DIR_SEP +#define FULL_DUMP_DIR FULL_USERDATA_DIR DUMP_DIR DIR_SEP #define FULL_LOGS_DIR FULL_USERDATA_DIR LOGS_DIR DIR_SEP -#define FULL_MAIL_LOGS_DIR FULL_LOGS_DIR MAIL_LOGS_DIR DIR_SEP -#define FULL_MAPS_DIR FULL_USERDATA_DIR MAPS_DIR DIR_SEP +#define FULL_MAIL_LOGS_DIR FULL_LOGS_DIR MAIL_LOGS_DIR DIR_SEP +#define FULL_MAPS_DIR FULL_USERDATA_DIR MAPS_DIR DIR_SEP #define FULL_MEMORY_DUMP_DIR FULL_CACHE_DIR MEMORY_DUMP_FILE // Sys dirs #define FULL_SYSDATA_DIR ROOT_DIR DIR_SEP SYSDATA_DIR DIR_SEP -#define FULL_GC_SYS_DIR FULL_SYSDATA_DIR GC_SYS_DIR DIR_SEP +#define FULL_GC_SYS_DIR FULL_SYSDATA_DIR GC_SYS_DIR DIR_SEP //#define GC_SYS_EUR_DIR FULL_GC_SYS_DIR EUR_DIR //#define GC_SYS_USA_DIR FULL_GC_SYS_DIR USA_DIR //#define GC_SYS_JAP_DIR FULL_GC_SYS_DIR JAP_DIR -#define FULL_WII_SYS_DIR FULL_SYSDATA_DIR WII_SYS_DIR DIR_SEP +#define FULL_WII_SYS_DIR FULL_SYSDATA_DIR WII_SYS_DIR DIR_SEP // Shorts - files // User files -#define CONFIG_FILE FULL_CONFIG_DIR DOLPHIN_CONFIG -#define DEBUGGER_CONFIG_FILE FULL_CONFIG_DIR DEBUGGER_CONFIG -#define TOTALDB_FILE FULL_SYSDATA_DIR TOTALDB +#define CONFIG_FILE FULL_CONFIG_DIR DOLPHIN_CONFIG +#define DEBUGGER_CONFIG_FILE FULL_CONFIG_DIR DEBUGGER_CONFIG +#define TOTALDB_FILE FULL_SYSDATA_DIR TOTALDB -#define GC_SRAM_FILE FULL_USERDATA_DIR GC_USER_DIR DIR_SEP GC_SRAM +#define GC_SRAM_FILE FULL_USERDATA_DIR GC_USER_DIR DIR_SEP GC_SRAM // Sys files -#define FONT_ANSI_FILE FULL_GC_SYS_DIR FONT_ANSI -#define FONT_SJIS_FILE FULL_GC_SYS_DIR FONT_SJIS +#define FONT_ANSI_FILE FULL_GC_SYS_DIR FONT_ANSI +#define FONT_SJIS_FILE FULL_GC_SYS_DIR FONT_SJIS -#define DSP_ROM_FILE FULL_GC_SYS_DIR DSP_ROM -#define DSP_COEF_FILE FULL_GC_SYS_DIR DSP_COEF +#define DSP_ROM_FILE FULL_GC_SYS_DIR DSP_ROM +#define DSP_COEF_FILE FULL_GC_SYS_DIR DSP_COEF -#define WII_MASTERKEY_FILE FULL_WII_SYS_DIR WII_MASTERKEY -#define WII_MASTERKEY_FILE_HEX FULL_WII_SYS_DIR WII_MASTERKEY_HEX -#define WII_EUR_SETTING_FILE FULL_WII_SYS_DIR WII_EUR_SETTING -#define WII_USA_SETTING_FILE FULL_WII_SYS_DIR WII_USA_SETTING -#define WII_JAP_SETTING_FILE FULL_WII_SYS_DIR WII_JAP_SETTING +#define WII_MASTERKEY_FILE FULL_WII_SYS_DIR WII_MASTERKEY +#define WII_MASTERKEY_FILE_HEX FULL_WII_SYS_DIR WII_MASTERKEY_HEX +#define WII_EUR_SETTING_FILE FULL_WII_SYS_DIR WII_EUR_SETTING +#define WII_USA_SETTING_FILE FULL_WII_SYS_DIR WII_USA_SETTING +#define WII_JAP_SETTING_FILE FULL_WII_SYS_DIR WII_JAP_SETTING #endif // PATHS_H diff --git a/Source/Core/Core/Core.vcproj b/Source/Core/Core/Core.vcproj index 747e333b0f..062877517b 100644 --- a/Source/Core/Core/Core.vcproj +++ b/Source/Core/Core/Core.vcproj @@ -618,6 +618,14 @@ RelativePath=".\Src\HW\SI.h" > + + + + @@ -627,11 +635,11 @@ > #include "Boot/Boot.h" +#include "HW/EXI_Device.h" +#include "HW/SI_Device.h" // HyperIris: not sure but a temporary implement enum INTERFACE_LANGUAGE @@ -52,6 +54,11 @@ struct SConfig SCoreStartupParameter m_LocalCoreStartupParameter; + std::string m_strMemoryCardA; + std::string m_strMemoryCardB; + TEXIDevices m_EXIDevice[3]; + TSIDevices m_SIDevice[4]; + // interface language INTERFACE_LANGUAGE m_InterfaceLanguage; // save settings diff --git a/Source/Core/Core/Src/CoreParameter.cpp b/Source/Core/Core/Src/CoreParameter.cpp index 937bc4ab72..30506e40f3 100644 --- a/Source/Core/Core/Src/CoreParameter.cpp +++ b/Source/Core/Core/Src/CoreParameter.cpp @@ -24,6 +24,7 @@ #include "Boot/Boot.h" // Core #include "Boot/Boot_DOL.h" #include "CoreParameter.h" +#include "ConfigManager.h" #include "Core.h" // for bWii SCoreStartupParameter::SCoreStartupParameter() @@ -155,10 +156,10 @@ bool SCoreStartupParameter::AutoSetup(EBootBios _BootBios) } // Setup paths - m_strBios = FULL_GC_SYS_DIR + Region + DIR_SEP GC_IPL; - m_strMemoryCardA = FULL_GC_USER_DIR + Region + DIR_SEP GC_MEMCARDA; - m_strMemoryCardB = FULL_GC_USER_DIR + Region + DIR_SEP GC_MEMCARDB; - m_strSRAM = GC_SRAM_FILE; + CheckMemcardPath(SConfig::GetInstance().m_strMemoryCardA, Region, true); + CheckMemcardPath(SConfig::GetInstance().m_strMemoryCardB, Region, false); + m_strSRAM = GC_SRAM_FILE; + m_strBios = FULL_GC_SYS_DIR + Region + DIR_SEP GC_IPL; if (!File::Exists(m_strBios.c_str())) { LOG(BOOT, "BIOS file %s not found - using HLE.", m_strBios.c_str()); bHLEBios = true; @@ -166,3 +167,50 @@ bool SCoreStartupParameter::AutoSetup(EBootBios _BootBios) return true; } + +void SCoreStartupParameter::CheckMemcardPath(std::string& memcardPath, std::string gameRegion, bool isSlotA) +{ + std::string ext("." + gameRegion + ".raw"); + if (memcardPath.empty()) + { + // Use default memcard path if there is no user defined name + std::string defaultFilename = isSlotA ? GC_MEMCARDA : GC_MEMCARDB; + memcardPath = FULL_GC_USER_DIR + defaultFilename + ext; + } + else + { + std::string filename = memcardPath; + std::string region = filename.substr(filename.size()-7, 3); + bool hasregion = false; + hasregion |= region.compare(USA_DIR) == 0; + hasregion |= region.compare(JAP_DIR) == 0; + hasregion |= region.compare(EUR_DIR) == 0; + if (!hasregion) + { + // filename doesn't have region in the extension + if (File::Exists(filename.c_str())) + { + // If the old file exists we are polite and ask if we should copy it + std::string oldFilename = filename; + filename.replace(filename.size()-4, 4, ext); + if (PanicYesNo("Memory Card filename in Slot %c is incorrect\n" + "Region not specified\n\n" + "Slot %c path was changed to\n" + "%s\n" + "Would you like to copy the old file to this new location?\n", + isSlotA ? 'A':'B', isSlotA ? 'A':'B', filename.c_str())) + { + if (!File::Copy(oldFilename.c_str(), filename.c_str())) + PanicAlert("Copy failed"); + } + } + memcardPath = filename; // Always correct the path! + } + else if (region.compare(gameRegion) != 0) + { + // filename has region, but it's not == gameRegion + // Just set the correct filename, the EXI Device will create it if it doesn't exist + memcardPath = filename.replace(filename.size()-ext.size(), ext.size(), ext);; + } + } +} diff --git a/Source/Core/Core/Src/CoreParameter.h b/Source/Core/Core/Src/CoreParameter.h index 2040c5cfd6..f71d13fed5 100644 --- a/Source/Core/Core/Src/CoreParameter.h +++ b/Source/Core/Core/Src/CoreParameter.h @@ -40,7 +40,7 @@ struct SCoreStartupParameter bool bEnableDebugging; bool bAutomaticStart; bool bBootToPause; bool bUseJIT; - // JIT + // JIT bool bJITUnlimitedCache, bJITBlockLinking; bool bJITOff; bool bJITLoadStoreOff, bJITLoadStorelXzOff, bJITLoadStorelwzOff, bJITLoadStorelbzxOff; @@ -69,9 +69,11 @@ struct SCoreStartupParameter int SelectedLanguage; - bool bWii; bool bWiiLeds; bool bWiiSpeakers; // Wii settings + // Wii settings + bool bWii; bool bWiiLeds; bool bWiiSpeakers; - bool bConfirmStop, bHideCursor, bAutoHideCursor; // Interface settings + // Interface settings + bool bConfirmStop, bHideCursor, bAutoHideCursor; int iTheme; enum EBootBios @@ -98,25 +100,20 @@ struct SCoreStartupParameter std::string m_strWiimotePlugin[MAXWIIMOTES]; std::string m_strFilename; - std::string m_strBios; - std::string m_strMemoryCardA; - std::string m_strMemoryCardB; + std::string m_strBios; std::string m_strSRAM; std::string m_strDefaultGCM; std::string m_strDVDRoot; std::string m_strUniqueID; std::string m_strName; - // + // Constructor just calls LoadDefaults SCoreStartupParameter(); void LoadDefaults(); bool AutoSetup(EBootBios _BootBios); const std::string &GetUniqueID() const { return m_strUniqueID; } + void CheckMemcardPath(std::string& memcardPath, std::string Region, bool isSlotA); }; #endif - - - - diff --git a/Source/Core/Core/Src/HW/EXI.cpp b/Source/Core/Core/Src/HW/EXI.cpp index f9adebfea3..8b470d0e13 100644 --- a/Source/Core/Core/Src/HW/EXI.cpp +++ b/Source/Core/Core/Src/HW/EXI.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -17,11 +17,11 @@ #include "Common.h" #include "ChunkFile.h" +#include "../ConfigManager.h" #include "PeripheralInterface.h" #include "../PowerPC/PowerPC.h" -#include "EXI_Device.h" #include "EXI_Channel.h" namespace ExpansionInterface @@ -36,17 +36,19 @@ CEXIChannel *g_Channels; void Init() { - g_Channels = new CEXIChannel[3]; + g_Channels = new CEXIChannel[NUM_CHANNELS]; g_Channels[0].m_ChannelId = 0; g_Channels[1].m_ChannelId = 1; g_Channels[2].m_ChannelId = 2; - g_Channels[0].AddDevice(EXIDEVICE_MEMORYCARD_A, 0); - g_Channels[0].AddDevice(EXIDEVICE_IPL, 1); - g_Channels[1].AddDevice(EXIDEVICE_MEMORYCARD_B, 0); - //g_Channels[0].AddDevice(EXIDEVICE_ETH, 2); - //g_Channels[1].AddDevice(EXIDEVICE_MIC, 0); - g_Channels[2].AddDevice(EXIDEVICE_AD16, 0); + // m_EXIDevice[0] = SlotA + // m_EXIDevice[1] = SlotB + // m_EXIDevice[2] = Serial Port 1 (ETH) + g_Channels[0].AddDevice(SConfig::GetInstance().m_EXIDevice[0], 0); + g_Channels[0].AddDevice(EXIDEVICE_IPL, 1); + g_Channels[0].AddDevice(SConfig::GetInstance().m_EXIDevice[2], 2); + g_Channels[1].AddDevice(SConfig::GetInstance().m_EXIDevice[1], 0); + g_Channels[2].AddDevice(EXIDEVICE_AD16, 0); } void Shutdown() diff --git a/Source/Core/Core/Src/HW/EXI.h b/Source/Core/Core/Src/HW/EXI.h index 47b6cd0202..f1dda04f16 100644 --- a/Source/Core/Core/Src/HW/EXI.h +++ b/Source/Core/Core/Src/HW/EXI.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -36,4 +36,3 @@ void HWCALL Write32(const u32 _iValue, const u32 _iAddress); } // end of namespace ExpansionInterface #endif - diff --git a/Source/Core/Core/Src/HW/EXI_Channel.cpp b/Source/Core/Core/Src/HW/EXI_Channel.cpp index 875a795080..6de6869eab 100644 --- a/Source/Core/Core/Src/HW/EXI_Channel.cpp +++ b/Source/Core/Core/Src/HW/EXI_Channel.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -16,6 +16,7 @@ // http://code.google.com/p/dolphin-emu/ #include "EXI_Channel.h" +#include "EXI_Device.h" #include "EXI.h" #define EXI_READ 0 @@ -28,7 +29,7 @@ CEXIChannel::CEXIChannel() : m_DMAMemoryAddress(0), - m_DMALength(0), + m_DMALength(0), m_ImmData(0), m_ChannelId(-1) { @@ -53,7 +54,7 @@ CEXIChannel::~CEXIChannel() void CEXIChannel::RemoveDevices() { - for (int i = 0; i < NUM_DEVICES; i++) + for (int i = 0; i < NUM_DEVICES; i++) { if (m_pDevices[i] != NULL) { @@ -101,7 +102,7 @@ bool CEXIChannel::IsCausingInterrupt() if ((m_Status.EXIINT & m_Status.EXIINTMASK) || (m_Status.TCINT & m_Status.TCINTMASK) || - (m_Status.EXTINT & m_Status.EXTINTMASK)) + (m_Status.EXTINT & m_Status.EXTINTMASK)) { return true; } @@ -113,7 +114,7 @@ bool CEXIChannel::IsCausingInterrupt() IEXIDevice* CEXIChannel::GetDevice(u8 _CHIP_SELECT) { - switch(_CHIP_SELECT) + switch(_CHIP_SELECT) { case 1: return m_pDevices[0]; case 2: return m_pDevices[1]; @@ -164,7 +165,7 @@ void CEXIChannel::Read32(u32& _uReturnValue, const u32 _iRegister) _uReturnValue = m_Control.hex; break; - case EXI_IMMDATA: + case EXI_IMMDATA: _uReturnValue = m_ImmData; break; @@ -172,7 +173,7 @@ void CEXIChannel::Read32(u32& _uReturnValue, const u32 _iRegister) _dbg_assert_(EXPANSIONINTERFACE, 0); _uReturnValue = 0xDEADBEEF; } - + } void CEXIChannel::Write32(const u32 _iValue, const u32 _iRegister) @@ -185,12 +186,12 @@ void CEXIChannel::Write32(const u32 _iValue, const u32 _iRegister) { UEXI_STATUS newStatus(_iValue); - // static + // static m_Status.EXIINTMASK = newStatus.EXIINTMASK; m_Status.TCINTMASK = newStatus.TCINTMASK; m_Status.EXTINTMASK = newStatus.EXTINTMASK; m_Status.CLK = newStatus.CLK; - m_Status.ROMDIS = newStatus.ROMDIS; + m_Status.ROMDIS = newStatus.ROMDIS; // Device if (m_Status.CHIP_SELECT != newStatus.CHIP_SELECT) @@ -200,7 +201,7 @@ void CEXIChannel::Write32(const u32 _iValue, const u32 _iRegister) u8 dwDeviceMask = 1 << i; IEXIDevice* pDevice = GetDevice(dwDeviceMask); if (pDevice != NULL) - { + { if (((newStatus.CHIP_SELECT & dwDeviceMask) == dwDeviceMask) && ((m_Status.CHIP_SELECT & dwDeviceMask) == 0)) // device gets activated @@ -211,8 +212,8 @@ void CEXIChannel::Write32(const u32 _iValue, const u32 _iRegister) // device gets deactivated pDevice->SetCS(0); } - } - m_Status.CHIP_SELECT = newStatus.CHIP_SELECT; + } + m_Status.CHIP_SELECT = newStatus.CHIP_SELECT; } // External Status @@ -262,7 +263,7 @@ void CEXIChannel::Write32(const u32 _iValue, const u32 _iRegister) pDevice->ImmWrite(m_ImmData, m_Control.TLEN + 1); m_ImmData = pDevice->ImmRead(m_Control.TLEN + 1); */ break; - + default: _dbg_assert_msg_(EXPANSIONINTERFACE,0,"EXI Imm: Unknown transfer type %i", m_Control.RW); } m_Control.TSTART = 0; diff --git a/Source/Core/Core/Src/HW/EXI_Channel.h b/Source/Core/Core/Src/HW/EXI_Channel.h index bbe8dc3d16..e28f59d82c 100644 --- a/Source/Core/Core/Src/HW/EXI_Channel.h +++ b/Source/Core/Core/Src/HW/EXI_Channel.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -40,18 +40,18 @@ private: u32 hex; struct { - unsigned EXIINTMASK : 1; // 31 + unsigned EXIINTMASK : 1; //31 unsigned EXIINT : 1; //30 unsigned TCINTMASK : 1; //29 unsigned TCINT : 1; //28 - unsigned CLK : 3; //27 + unsigned CLK : 3; //27 unsigned CHIP_SELECT : 3; //24 unsigned EXTINTMASK : 1; //21 unsigned EXTINT : 1; //20 - unsigned EXT : 1; // External Insertion Status (1: External EXI device present) //19 - unsigned ROMDIS : 1; // ROM Disable //18 + unsigned EXT : 1; //19 // External Insertion Status (1: External EXI device present) + unsigned ROMDIS : 1; //18 // ROM Disable unsigned :18; - }; + }; UEXI_STATUS() {hex = 0;} UEXI_STATUS(u32 _hex) {hex = _hex;} }; @@ -60,7 +60,7 @@ private: union UEXI_CONTROL { u32 hex; - struct + struct { unsigned TSTART : 1; unsigned DMA : 1; @@ -73,13 +73,13 @@ private: // STATE_TO_SAVE UEXI_STATUS m_Status; UEXI_CONTROL m_Control; - u32 m_DMAMemoryAddress; - u32 m_DMALength; - u32 m_ImmData; - + u32 m_DMAMemoryAddress; + u32 m_DMALength; + u32 m_ImmData; + // get device IEXIDevice* GetDevice(u8 _CHIP_SELECT); - + // Devices enum { diff --git a/Source/Core/Core/Src/HW/EXI_Device.cpp b/Source/Core/Core/Src/HW/EXI_Device.cpp index 5406984386..aec79b7ec5 100644 --- a/Source/Core/Core/Src/HW/EXI_Device.cpp +++ b/Source/Core/Core/Src/HW/EXI_Device.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -26,10 +26,10 @@ #include "../Core.h" #include "../ConfigManager.h" -///////////////////////////////////////////////////////////////////////////////////////////////////// -// --- interface IEXIDevice --- -///////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// --- interface IEXIDevice --- +////////////////////////////////////////////////////////////////////////// void IEXIDevice::ImmWrite(u32 _uData, u32 _uSize) { while (_uSize--) @@ -56,21 +56,21 @@ u32 IEXIDevice::ImmRead(u32 _uSize) void IEXIDevice::DMAWrite(u32 _uAddr, u32 _uSize) { // _dbg_assert_(EXPANSIONINTERFACE, 0); - while (_uSize--) - { - u8 uByte = Memory::Read_U8(_uAddr++); - TransferByte(uByte); - } + while (_uSize--) + { + u8 uByte = Memory::Read_U8(_uAddr++); + TransferByte(uByte); + } } -void IEXIDevice::DMARead(u32 _uAddr, u32 _uSize) +void IEXIDevice::DMARead(u32 _uAddr, u32 _uSize) { // _dbg_assert_(EXPANSIONINTERFACE, 0); - while (_uSize--) - { - u8 uByte = 0; - TransferByte(uByte); - Memory::Write_U8(uByte, _uAddr++); + while (_uSize--) + { + u8 uByte = 0; + TransferByte(uByte); + Memory::Write_U8(uByte, _uAddr++); } }; @@ -92,11 +92,10 @@ void IEXIDevice::SetCS(int _iCS) { } -///////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// // --- class CEXIDummy --- -///////////////////////////////////////////////////////////////////////////////////////////////////// - -// just a dummy that logs reads and writes +////////////////////////////////////////////////////////////////////////// +// Just a dummy that logs reads and writes // to be used for EXI devices we haven't emulated class CEXIDummy : public IEXIDevice { @@ -112,15 +111,15 @@ public: virtual ~CEXIDummy(){} - void ImmWrite(u32 data, u32 size){LOG(EXPANSIONINTERFACE, "EXI DUMMY %s ImmWrite: %08x",m_strName.c_str(),data);} - u32 ImmRead (u32 size) {LOG(EXPANSIONINTERFACE, "EXI DUMMY %s ImmRead",m_strName.c_str()); return 0;} - void DMAWrite(u32 addr, u32 size) {LOG(EXPANSIONINTERFACE, "EXI DUMMY %s DMAWrite: %08x bytes, from %08x to device",m_strName.c_str(),size,addr);} - void DMARead (u32 addr, u32 size) {LOG(EXPANSIONINTERFACE, "EXI DUMMY %s DMARead: %08x bytes, from device to %08x",m_strName.c_str(),size,addr);} + void ImmWrite(u32 data, u32 size) {LOG(EXPANSIONINTERFACE, "EXI DUMMY %s ImmWrite: %08x", m_strName.c_str(), data);} + u32 ImmRead (u32 size) {LOG(EXPANSIONINTERFACE, "EXI DUMMY %s ImmRead", m_strName.c_str()); return 0;} + void DMAWrite(u32 addr, u32 size) {LOG(EXPANSIONINTERFACE, "EXI DUMMY %s DMAWrite: %08x bytes, from %08x to device", m_strName.c_str(), size, addr);} + void DMARead (u32 addr, u32 size) {LOG(EXPANSIONINTERFACE, "EXI DUMMY %s DMARead: %08x bytes, from device to %08x", m_strName.c_str(), size, addr);} }; -///////////////////////////////////////////////////////////////////////////////////////////////////// -// F A C T O R Y //////////////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// +// F A C T O R Y ///////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// IEXIDevice* EXIDevice_Create(TEXIDevices _EXIDevice) { @@ -131,11 +130,11 @@ IEXIDevice* EXIDevice_Create(TEXIDevices _EXIDevice) break; case EXIDEVICE_MEMORYCARD_A: - return new CEXIMemoryCard("MemoryCardA", SConfig::GetInstance().m_LocalCoreStartupParameter.m_strMemoryCardA, 0); + return new CEXIMemoryCard("MemoryCardA", SConfig::GetInstance().m_strMemoryCardA, 0); break; case EXIDEVICE_MEMORYCARD_B: - return new CEXIMemoryCard("MemoryCardB", SConfig::GetInstance().m_LocalCoreStartupParameter.m_strMemoryCardB, 1); + return new CEXIMemoryCard("MemoryCardB", SConfig::GetInstance().m_strMemoryCardB, 1); break; case EXIDEVICE_IPL: @@ -145,7 +144,7 @@ IEXIDevice* EXIDevice_Create(TEXIDevices _EXIDevice) case EXIDEVICE_AD16: return new CEXIAD16(); break; - + case EXIDEVICE_MIC: return new CEXIMic(1); break; @@ -157,4 +156,3 @@ IEXIDevice* EXIDevice_Create(TEXIDevices _EXIDevice) } return NULL; } - diff --git a/Source/Core/Core/Src/HW/EXI_Device.h b/Source/Core/Core/Src/HW/EXI_Device.h index 699574eb48..3328d41124 100644 --- a/Source/Core/Core/Src/HW/EXI_Device.h +++ b/Source/Core/Core/Src/HW/EXI_Device.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -23,25 +23,25 @@ class IEXIDevice { private: - // byte transfer function for this device + // Byte transfer function for this device virtual void TransferByte(u8& _byte) {}; public: - // immediate copy functions + // Immediate copy functions virtual void ImmWrite(u32 _uData, u32 _uSize); virtual u32 ImmRead(u32 _uSize); - // dma copy functions + // DMA copy functions virtual void DMAWrite(u32 _uAddr, u32 _uSize); virtual void DMARead (u32 _uAddr, u32 _uSize); virtual bool IsPresent(); virtual void SetCS(int _iCS); - // update + // Update virtual void Update(); - // is generating interrupt ? + // Is generating interrupt ? virtual bool IsInterruptSet(); virtual ~IEXIDevice() {}; diff --git a/Source/Core/Core/Src/HW/SI.cpp b/Source/Core/Core/Src/HW/SI.cpp index 76ac6b4c13..ad87d372ac 100644 --- a/Source/Core/Core/Src/HW/SI.cpp +++ b/Source/Core/Core/Src/HW/SI.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -15,117 +15,30 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ - -////////////////////////////////////////////////////////////////////////////////////////// -// Include -// ŻŻŻŻŻŻŻŻŻŻ #include "Common.h" #include "ChunkFile.h" +#include "../ConfigManager.h" #include "PeripheralInterface.h" -#include "../PluginManager.h" - #include "SI.h" -#include "SI_Device.h" -#include "SI_DeviceGCController.h" -////////////////////////////// +#include "SI_Channel.h" namespace SerialInterface { -////////////////////////////////////////////////////////////////////////////////////////// -// Declarations -// ŻŻŻŻŻŻŻŻŻŻ -void RunSIBuffer(); -void UpdateInterrupts(); -///////////////////////////////////// - - // SI Interrupt Types enum SIInterruptType { INT_RDSTINT = 0, INT_TCINT = 1, }; -static void GenerateSIInterrupt(SIInterruptType _SIInterrupt); // SI number of channels enum { - NUMBER_OF_CHANNELS = 0x04 -}; - -// SI Internal Hardware Addresses -enum -{ - SI_CHANNEL_0_OUT = 0x00, - SI_CHANNEL_0_IN_HI = 0x04, - SI_CHANNEL_0_IN_LO = 0x08, - SI_CHANNEL_1_OUT = 0x0C, - SI_CHANNEL_1_IN_HI = 0x10, - SI_CHANNEL_1_IN_LO = 0x14, - SI_CHANNEL_2_OUT = 0x18, - SI_CHANNEL_2_IN_HI = 0x1C, - SI_CHANNEL_2_IN_LO = 0x20, - SI_CHANNEL_3_OUT = 0x24, - SI_CHANNEL_3_IN_HI = 0x28, - SI_CHANNEL_3_IN_LO = 0x2C, - SI_POLL = 0x30, - SI_COM_CSR = 0x34, - SI_STATUS_REG = 0x38, - SI_EXI_CLOCK_COUNT = 0x3C, -}; - -// SI Channel Output -union USIChannelOut -{ - u32 Hex; - struct - { - unsigned OUTPUT1 : 8; - unsigned OUTPUT0 : 8; - unsigned CMD : 8; - unsigned : 8; - }; -}; - -// SI Channel Input High u32 -union USIChannelIn_Hi -{ - u32 Hex; - struct - { - unsigned INPUT3 : 8; - unsigned INPUT2 : 8; - unsigned INPUT1 : 8; - unsigned INPUT0 : 6; - unsigned ERRLATCH : 1; // 0: no error 1: Error latched. Check SISR. - unsigned ERRSTAT : 1; // 0: no error 1: error on last transfer - }; -}; - -// SI Channel Input Low u32 -union USIChannelIn_Lo -{ - u32 Hex; - struct - { - unsigned INPUT7 : 8; - unsigned INPUT6 : 8; - unsigned INPUT5 : 8; - unsigned INPUT4 : 8; - }; -}; - -// SI Channel -struct SSIChannel -{ - USIChannelOut m_Out; - USIChannelIn_Hi m_InHi; - USIChannelIn_Lo m_InLo; - ISIDevice* m_pDevice; + NUMBER_OF_CHANNELS = 4 }; // SI Poll: Controls how often a device is polled @@ -155,17 +68,17 @@ union USIComCSR struct { unsigned TSTART : 1; - unsigned CHANNEL : 2; // determines which SI channel will be used the communication interface. + unsigned CHANNEL : 2; // determines which SI channel will be used the communication interface. unsigned : 5; unsigned INLNGTH : 7; unsigned : 1; - unsigned OUTLNGTH : 7; // Communication Channel Output Length in bytes + unsigned OUTLNGTH : 7; // Communication Channel Output Length in bytes unsigned : 4; - unsigned RDSTINTMSK : 1; // Read Status Interrupt Status Mask - unsigned RDSTINT : 1; // Read Status Interrupt Status - unsigned COMERR : 1; // Communication Error (set 0) - unsigned TCINTMSK : 1; // Transfer Complete Interrupt Mask - unsigned TCINT : 1; // Transfer Complete Interrupt + unsigned RDSTINTMSK : 1; // Read Status Interrupt Status Mask + unsigned RDSTINT : 1; // Read Status Interrupt Status + unsigned COMERR : 1; // Communication Error (set 0) + unsigned TCINTMSK : 1; // Transfer Complete Interrupt Mask + unsigned TCINT : 1; // Transfer Complete Interrupt }; USIComCSR() {Hex = 0;} USIComCSR(u32 _hex) {Hex = _hex;} @@ -175,37 +88,37 @@ union USIComCSR union USIStatusReg { u32 Hex; - struct + struct { - unsigned UNRUN3 : 1; // (RWC) write 1: bit cleared read 1 main proc underrun error - unsigned OVRUN3 : 1; // (RWC) write 1: bit cleared read 1 overrun error - unsigned COLL3 : 1; // (RWC) write 1: bit cleared read 1 collision error - unsigned NOREP3 : 1; // (RWC) write 1: bit cleared read 1 response error - unsigned WRST3 : 1; // (R) 1: buffer channel0 not copied - unsigned RDST3 : 1; // (R) 1: new Data available - unsigned : 2; // 7:6 - unsigned UNRUN2 : 1; // (RWC) write 1: bit cleared read 1 main proc underrun error - unsigned OVRUN2 : 1; // (RWC) write 1: bit cleared read 1 overrun error - unsigned COLL2 : 1; // (RWC) write 1: bit cleared read 1 collision error - unsigned NOREP2 : 1; // (RWC) write 1: bit cleared read 1 response error - unsigned WRST2 : 1; // (R) 1: buffer channel0 not copied - unsigned RDST2 : 1; // (R) 1: new Data available - unsigned : 2; // 15:14 - unsigned UNRUN1 : 1; // (RWC) write 1: bit cleared read 1 main proc underrun error - unsigned OVRUN1 : 1; // (RWC) write 1: bit cleared read 1 overrun error - unsigned COLL1 : 1; // (RWC) write 1: bit cleared read 1 collision error - unsigned NOREP1 : 1; // (RWC) write 1: bit cleared read 1 response error - unsigned WRST1 : 1; // (R) 1: buffer channel0 not copied - unsigned RDST1 : 1; // (R) 1: new Data available - unsigned : 2; // 23:22 - unsigned UNRUN0 : 1; // (RWC) write 1: bit cleared read 1 main proc underrun error - unsigned OVRUN0 : 1; // (RWC) write 1: bit cleared read 1 overrun error - unsigned COLL0 : 1; // (RWC) write 1: bit cleared read 1 collision error - unsigned NOREP0 : 1; // (RWC) write 1: bit cleared read 1 response error - unsigned WRST0 : 1; // (R) 1: buffer channel0 not copied - unsigned RDST0 : 1; // (R) 1: new Data available + unsigned UNRUN3 : 1; // (RWC) write 1: bit cleared read 1: main proc underrun error + unsigned OVRUN3 : 1; // (RWC) write 1: bit cleared read 1: overrun error + unsigned COLL3 : 1; // (RWC) write 1: bit cleared read 1: collision error + unsigned NOREP3 : 1; // (RWC) write 1: bit cleared read 1: response error + unsigned WRST3 : 1; // (R) 1: buffer channel0 not copied + unsigned RDST3 : 1; // (R) 1: new Data available + unsigned : 2; // 7:6 + unsigned UNRUN2 : 1; // (RWC) write 1: bit cleared read 1: main proc underrun error + unsigned OVRUN2 : 1; // (RWC) write 1: bit cleared read 1: overrun error + unsigned COLL2 : 1; // (RWC) write 1: bit cleared read 1: collision error + unsigned NOREP2 : 1; // (RWC) write 1: bit cleared read 1: response error + unsigned WRST2 : 1; // (R) 1: buffer channel0 not copied + unsigned RDST2 : 1; // (R) 1: new Data available + unsigned : 2; // 15:14 + unsigned UNRUN1 : 1; // (RWC) write 1: bit cleared read 1: main proc underrun error + unsigned OVRUN1 : 1; // (RWC) write 1: bit cleared read 1: overrun error + unsigned COLL1 : 1; // (RWC) write 1: bit cleared read 1: collision error + unsigned NOREP1 : 1; // (RWC) write 1: bit cleared read 1: response error + unsigned WRST1 : 1; // (R) 1: buffer channel0 not copied + unsigned RDST1 : 1; // (R) 1: new Data available + unsigned : 2; // 23:22 + unsigned UNRUN0 : 1; // (RWC) write 1: bit cleared read 1: main proc underrun error + unsigned OVRUN0 : 1; // (RWC) write 1: bit cleared read 1: overrun error + unsigned COLL0 : 1; // (RWC) write 1: bit cleared read 1: collision error + unsigned NOREP0 : 1; // (RWC) write 1: bit cleared read 1: response error + unsigned WRST0 : 1; // (R) 1: buffer channel0 not copied + unsigned RDST0 : 1; // (R) 1: new Data available unsigned : 1; - unsigned WR : 1; // (RW) write 1 start copy, read 0 copy done + unsigned WR : 1; // (RW) write 1 start copy, read 0 copy done }; USIStatusReg() {Hex = 0;} USIStatusReg(u32 _hex) {Hex = _hex;} @@ -223,12 +136,40 @@ union USIEXIClockCount }; // STATE_TO_SAVE -static SSIChannel g_Channel[NUMBER_OF_CHANNELS]; -static USIPoll g_Poll; -static USIComCSR g_ComCSR; -static USIStatusReg g_StatusReg; -static USIEXIClockCount g_EXIClockCount; -static u8 g_SIBuffer[128]; +CSIChannel *g_Channel; // Save the channel state here? +static USIPoll g_Poll; +static USIComCSR g_ComCSR; +static USIStatusReg g_StatusReg; +static USIEXIClockCount g_EXIClockCount; +static u8 g_SIBuffer[128]; + +static void GenerateSIInterrupt(SIInterruptType _SIInterrupt); +void RunSIBuffer(); +void UpdateInterrupts(); + + +void Init() +{ + g_Channel = new CSIChannel[NUMBER_OF_CHANNELS]; + + for (int i = 0; i < NUMBER_OF_CHANNELS; i++) + { + g_Channel[i].m_ChannelId = i; + g_Channel[i].AddDevice(SConfig::GetInstance().m_SIDevice[i], i); + } + + g_Poll.Hex = 0; + g_ComCSR.Hex = 0; + g_StatusReg.Hex = 0; + g_EXIClockCount.Hex = 0; + memset(g_SIBuffer, 0xce, 128); +} + +void Shutdown() +{ + delete [] g_Channel; + g_Channel = 0; +} void DoState(PointerWrap &p) { @@ -238,48 +179,6 @@ void DoState(PointerWrap &p) p.Do(g_StatusReg); p.Do(g_EXIClockCount); p.Do(g_SIBuffer); -} - - -////////////////////////////////////////////////////////////////////////////////////////// -// Initialize the Serial Interface -// ŻŻŻŻŻŻŻŻŻŻ -void Init() -{ - // TODO: allow dynamic attaching/detaching of plugins - // maybe this code should be in the pad plugin loader at all? - for (int i = 0; i < NUMBER_OF_CHANNELS; i++) - { - g_Channel[i].m_Out.Hex = 0; - g_Channel[i].m_InHi.Hex = 0; - g_Channel[i].m_InLo.Hex = 0; - - // Access the pad and check the MAXPADS limit - Common::PluginPAD* pad = CPluginManager::GetInstance().GetPad(i); - - // Check if this pad is attached for the current plugin - if (pad != NULL && (pad->PAD_GetAttachedPads() & (1 << i))) - g_Channel[i].m_pDevice = new CSIDevice_GCController(i); - else - g_Channel[i].m_pDevice = new CSIDevice_Dummy(i); - } - - g_Poll.Hex = 0; - g_ComCSR.Hex = 0; - g_StatusReg.Hex = 0; - g_EXIClockCount.Hex = 0; - memset(g_SIBuffer, 0xce, 128); -} -////////////////////////////////////// - - -void Shutdown() -{ - for (int i = 0; i < NUMBER_OF_CHANNELS; i++) - { - delete g_Channel[i].m_pDevice; - g_Channel[i].m_pDevice = NULL; - } } void Read32(u32& _uReturnValue, const u32 _iAddress) @@ -294,104 +193,19 @@ void Read32(u32& _uReturnValue, const u32 _iAddress) return; } - // registers - switch (_iAddress & 0x3FF) - { - //=================================================================================================== - // Channel 0 - //=================================================================================================== - case SI_CHANNEL_0_OUT: - _uReturnValue = g_Channel[0].m_Out.Hex; - return; + // (shuffle2) these assignments are taken from EXI, + // the iAddr amounted to the same, so I'm guessing the rest are too :D + unsigned int iAddr = _iAddress & 0x3FF; + unsigned int iRegister = (iAddr >> 2) % 5; + unsigned int iChannel = (iAddr >> 2) / 5; - case SI_CHANNEL_0_IN_HI: - g_StatusReg.RDST0 = 0; - UpdateInterrupts(); - _uReturnValue = g_Channel[0].m_InHi.Hex; - return; - - case SI_CHANNEL_0_IN_LO: - g_StatusReg.RDST0 = 0; - UpdateInterrupts(); - _uReturnValue = g_Channel[0].m_InLo.Hex; - return; - - //=================================================================================================== - // Channel 1 - //=================================================================================================== - case SI_CHANNEL_1_OUT: - _uReturnValue = g_Channel[1].m_Out.Hex; - return; - - case SI_CHANNEL_1_IN_HI: - g_StatusReg.RDST1 = 0; - UpdateInterrupts(); - _uReturnValue = g_Channel[1].m_InHi.Hex; - return; - - case SI_CHANNEL_1_IN_LO: - g_StatusReg.RDST1 = 0; - UpdateInterrupts(); - _uReturnValue = g_Channel[1].m_InLo.Hex; - return; - - //=================================================================================================== - // Channel 2 - //=================================================================================================== - case SI_CHANNEL_2_OUT: - _uReturnValue = g_Channel[2].m_Out.Hex; - return; - - case SI_CHANNEL_2_IN_HI: - g_StatusReg.RDST2 = 0; - UpdateInterrupts(); - _uReturnValue = g_Channel[2].m_InHi.Hex; - return; - - case SI_CHANNEL_2_IN_LO: - g_StatusReg.RDST2 = 0; - UpdateInterrupts(); - _uReturnValue = g_Channel[2].m_InLo.Hex; - return; - - //=================================================================================================== - // Channel 3 - //=================================================================================================== - case SI_CHANNEL_3_OUT: - _uReturnValue = g_Channel[3].m_Out.Hex; - return; - - case SI_CHANNEL_3_IN_HI: - g_StatusReg.RDST3 = 0; - UpdateInterrupts(); - _uReturnValue = g_Channel[3].m_InHi.Hex; - return; - - case SI_CHANNEL_3_IN_LO: - g_StatusReg.RDST3 = 0; - UpdateInterrupts(); - _uReturnValue = g_Channel[3].m_InLo.Hex; - return; - - case SI_POLL: _uReturnValue = g_Poll.Hex; return; - case SI_COM_CSR: _uReturnValue = g_ComCSR.Hex; return; - case SI_STATUS_REG: _uReturnValue = g_StatusReg.Hex; return; - - case SI_EXI_CLOCK_COUNT: _uReturnValue = g_EXIClockCount.Hex; return; - - default: - LOG(SERIALINTERFACE, "(r32-unk): 0x%08x", _iAddress); - _dbg_assert_(SERIALINTERFACE,0); - break; - } - - // error - _uReturnValue = 0xdeadbeef; + if (iChannel < NUMBER_OF_CHANNELS) + g_Channel[iChannel].Read32(_uReturnValue, iAddr); } void Write32(const u32 _iValue, const u32 _iAddress) { - LOGV(SERIALINTERFACE, 3, "(w32): 0x%08x 0x%08x", _iValue,_iAddress); + LOGV(SERIALINTERFACE, 3, "(w32): 0x%08x 0x%08x", _iValue, _iAddress); // SIBuffer if ((_iAddress >= 0xCC006480 && _iAddress < 0xCC006500) || @@ -401,101 +215,12 @@ void Write32(const u32 _iValue, const u32 _iAddress) return; } - // registers - switch (_iAddress & 0x3FF) - { - case SI_CHANNEL_0_OUT: g_Channel[0].m_Out.Hex = _iValue; break; - case SI_CHANNEL_0_IN_HI: g_Channel[0].m_InHi.Hex = _iValue; break; - case SI_CHANNEL_0_IN_LO: g_Channel[0].m_InLo.Hex = _iValue; break; - case SI_CHANNEL_1_OUT: g_Channel[1].m_Out.Hex = _iValue; break; - case SI_CHANNEL_1_IN_HI: g_Channel[1].m_InHi.Hex = _iValue; break; - case SI_CHANNEL_1_IN_LO: g_Channel[1].m_InLo.Hex = _iValue; break; - case SI_CHANNEL_2_OUT: g_Channel[2].m_Out.Hex = _iValue; break; - case SI_CHANNEL_2_IN_HI: g_Channel[2].m_InHi.Hex = _iValue; break; - case SI_CHANNEL_2_IN_LO: g_Channel[2].m_InLo.Hex = _iValue; break; - case SI_CHANNEL_3_OUT: g_Channel[3].m_Out.Hex = _iValue; break; - case SI_CHANNEL_3_IN_HI: g_Channel[3].m_InHi.Hex = _iValue; break; - case SI_CHANNEL_3_IN_LO: g_Channel[3].m_InLo.Hex = _iValue; break; + int iAddr = _iAddress & 0x3FF; + int iRegister = (iAddr >> 2) % 5; + int iChannel = (iAddr >> 2) / 5; - case SI_POLL: - g_Poll.Hex = _iValue; - break; - - case SI_COM_CSR: - { - USIComCSR tmpComCSR(_iValue); - - g_ComCSR.CHANNEL = tmpComCSR.CHANNEL; - g_ComCSR.INLNGTH = tmpComCSR.INLNGTH; - g_ComCSR.OUTLNGTH = tmpComCSR.OUTLNGTH; - g_ComCSR.RDSTINTMSK = tmpComCSR.RDSTINTMSK; - g_ComCSR.TCINTMSK = tmpComCSR.TCINTMSK; - - g_ComCSR.COMERR = 0; - - if (tmpComCSR.RDSTINT) g_ComCSR.RDSTINT = 0; - if (tmpComCSR.TCINT) g_ComCSR.TCINT = 0; - - // be careful: runsi-buffer after updating the INT flags - if (tmpComCSR.TSTART) RunSIBuffer(); - UpdateInterrupts(); - } - break; - - case SI_STATUS_REG: - { - USIStatusReg tmpStatus(_iValue); - - // just update the writable bits - g_StatusReg.NOREP0 = tmpStatus.NOREP0 ? 1 : 0; - g_StatusReg.COLL0 = tmpStatus.COLL0 ? 1 : 0; - g_StatusReg.OVRUN0 = tmpStatus.OVRUN0 ? 1 : 0; - g_StatusReg.UNRUN0 = tmpStatus.UNRUN0 ? 1 : 0; - - g_StatusReg.NOREP1 = tmpStatus.NOREP1 ? 1 : 0; - g_StatusReg.COLL1 = tmpStatus.COLL1 ? 1 : 0; - g_StatusReg.OVRUN1 = tmpStatus.OVRUN1 ? 1 : 0; - g_StatusReg.UNRUN1 = tmpStatus.UNRUN1 ? 1 : 0; - - g_StatusReg.NOREP2 = tmpStatus.NOREP2 ? 1 : 0; - g_StatusReg.COLL2 = tmpStatus.COLL2 ? 1 : 0; - g_StatusReg.OVRUN2 = tmpStatus.OVRUN2 ? 1 : 0; - g_StatusReg.UNRUN2 = tmpStatus.UNRUN2 ? 1 : 0; - - g_StatusReg.NOREP3 = tmpStatus.NOREP3 ? 1 : 0; - g_StatusReg.COLL3 = tmpStatus.COLL3 ? 1 : 0; - g_StatusReg.OVRUN3 = tmpStatus.OVRUN3 ? 1 : 0; - g_StatusReg.UNRUN3 = tmpStatus.UNRUN3 ? 1 : 0; - - // send command to devices - if (tmpStatus.WR) - { - g_StatusReg.WR = 0; - g_Channel[0].m_pDevice->SendCommand(g_Channel[0].m_Out.Hex); - g_Channel[1].m_pDevice->SendCommand(g_Channel[1].m_Out.Hex); - g_Channel[2].m_pDevice->SendCommand(g_Channel[2].m_Out.Hex); - g_Channel[3].m_pDevice->SendCommand(g_Channel[3].m_Out.Hex); - - g_StatusReg.WRST0 = 0; - g_StatusReg.WRST1 = 0; - g_StatusReg.WRST2 = 0; - g_StatusReg.WRST3 = 0; - } - } - break; - - case SI_EXI_CLOCK_COUNT: - g_EXIClockCount.Hex = _iValue; - break; - - case 0x80: - LOG(SERIALINTERFACE, "WII something at 0xCD006480"); - break; - - default: - _dbg_assert_(SERIALINTERFACE,0); - break; - } + if (iChannel < NUMBER_OF_CHANNELS) + g_Channel[iChannel].Write32(_iValue, iAddr); } void UpdateInterrupts() diff --git a/Source/Core/Core/Src/HW/SI.h b/Source/Core/Core/Src/HW/SI.h index 36a1967344..e95f767a5b 100644 --- a/Source/Core/Core/Src/HW/SI.h +++ b/Source/Core/Core/Src/HW/SI.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -33,4 +33,5 @@ void HWCALL Read32(u32& _uReturnValue, const u32 _iAddress); void HWCALL Write32(const u32 _iValue, const u32 _iAddress); }; // end of namespace SerialInterface + #endif diff --git a/Source/Core/Core/Src/HW/SI_Channel.cpp b/Source/Core/Core/Src/HW/SI_Channel.cpp new file mode 100644 index 0000000000..6ffe51c4bd --- /dev/null +++ b/Source/Core/Core/Src/HW/SI_Channel.cpp @@ -0,0 +1,257 @@ +// Copyright (C) 2003-2009 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "SI_Channel.h" +#include "SI.h" +#include "PeripheralInterface.h" +#include "../PowerPC/PowerPC.h" + +#include "SI.cpp" +using namespace SerialInterface; + +CSIChannel::CSIChannel() +{ + m_Out.Hex = 0; + m_InHi.Hex = 0; + m_InLo.Hex = 0; + + m_pDevice = SIDevice_Create(SI_DUMMY, m_ChannelId); + _dbg_assert_(SERIALINTERFACE, m_pDevice != NULL); +} + +CSIChannel::~CSIChannel() +{ + RemoveDevice(); +} + +void CSIChannel::AddDevice(const TSIDevices _device, int _iDeviceNumber) +{ + //_dbg_assert_(SERIALINTERFACE, _iSlot < NUM_DEVICES); + + // delete the old device + RemoveDevice(); + + // create the new one + m_pDevice = SIDevice_Create(_device, _iDeviceNumber); + _dbg_assert_(SERIALINTERFACE, m_pDevice != NULL); +} + +void CSIChannel::RemoveDevice() +{ + if (m_pDevice != NULL) + { + delete m_pDevice; + m_pDevice = NULL; + } +} + +void CSIChannel::Read32(u32& _uReturnValue, const u32 _iAddr) +{ + // registers + switch (_iAddr) + { + ////////////////////////////////////////////////////////////////////////// + // Channel 0 + ////////////////////////////////////////////////////////////////////////// + case SI_CHANNEL_0_OUT: + _uReturnValue = m_Out.Hex; + return; + + case SI_CHANNEL_0_IN_HI: + g_StatusReg.RDST0 = 0; + UpdateInterrupts(); + _uReturnValue = m_InHi.Hex; + return; + + case SI_CHANNEL_0_IN_LO: + g_StatusReg.RDST0 = 0; + UpdateInterrupts(); + _uReturnValue = m_InLo.Hex; + return; + + ////////////////////////////////////////////////////////////////////////// + // Channel 1 + ////////////////////////////////////////////////////////////////////////// + case SI_CHANNEL_1_OUT: + _uReturnValue = m_Out.Hex; + return; + + case SI_CHANNEL_1_IN_HI: + g_StatusReg.RDST1 = 0; + UpdateInterrupts(); + _uReturnValue = m_InHi.Hex; + return; + + case SI_CHANNEL_1_IN_LO: + g_StatusReg.RDST1 = 0; + UpdateInterrupts(); + _uReturnValue = m_InLo.Hex; + return; + + ////////////////////////////////////////////////////////////////////////// + // Channel 2 + ////////////////////////////////////////////////////////////////////////// + case SI_CHANNEL_2_OUT: + _uReturnValue = m_Out.Hex; + return; + + case SI_CHANNEL_2_IN_HI: + g_StatusReg.RDST2 = 0; + UpdateInterrupts(); + _uReturnValue = m_InHi.Hex; + return; + + case SI_CHANNEL_2_IN_LO: + g_StatusReg.RDST2 = 0; + UpdateInterrupts(); + _uReturnValue = m_InLo.Hex; + return; + + ////////////////////////////////////////////////////////////////////////// + // Channel 3 + ////////////////////////////////////////////////////////////////////////// + case SI_CHANNEL_3_OUT: + _uReturnValue = m_Out.Hex; + return; + + case SI_CHANNEL_3_IN_HI: + g_StatusReg.RDST3 = 0; + UpdateInterrupts(); + _uReturnValue = m_InHi.Hex; + return; + + case SI_CHANNEL_3_IN_LO: + g_StatusReg.RDST3 = 0; + UpdateInterrupts(); + _uReturnValue = m_InLo.Hex; + return; + + case SI_POLL: _uReturnValue = g_Poll.Hex; return; + case SI_COM_CSR: _uReturnValue = g_ComCSR.Hex; return; + case SI_STATUS_REG: _uReturnValue = g_StatusReg.Hex; return; + + case SI_EXI_CLOCK_COUNT: _uReturnValue = g_EXIClockCount.Hex; return; + + default: + // (shuffle2) FIX! + //LOG(SERIALINTERFACE, "(r32-unk): 0x%08x", _iAddress); + _dbg_assert_(SERIALINTERFACE, 0); + break; + } + + // error + _uReturnValue = 0xdeadbeef; +} + +void CSIChannel::Write32(const u32 _iValue, const u32 iAddr) +{ + // registers + switch (iAddr) + { + case SI_CHANNEL_0_OUT: m_Out.Hex = _iValue; break; + case SI_CHANNEL_0_IN_HI: m_InHi.Hex = _iValue; break; + case SI_CHANNEL_0_IN_LO: m_InLo.Hex = _iValue; break; + case SI_CHANNEL_1_OUT: m_Out.Hex = _iValue; break; + case SI_CHANNEL_1_IN_HI: m_InHi.Hex = _iValue; break; + case SI_CHANNEL_1_IN_LO: m_InLo.Hex = _iValue; break; + case SI_CHANNEL_2_OUT: m_Out.Hex = _iValue; break; + case SI_CHANNEL_2_IN_HI: m_InHi.Hex = _iValue; break; + case SI_CHANNEL_2_IN_LO: m_InLo.Hex = _iValue; break; + case SI_CHANNEL_3_OUT: m_Out.Hex = _iValue; break; + case SI_CHANNEL_3_IN_HI: m_InHi.Hex = _iValue; break; + case SI_CHANNEL_3_IN_LO: m_InLo.Hex = _iValue; break; + + case SI_POLL: + g_Poll.Hex = _iValue; + break; + + case SI_COM_CSR: + { + USIComCSR tmpComCSR(_iValue); + + g_ComCSR.CHANNEL = tmpComCSR.CHANNEL; + g_ComCSR.INLNGTH = tmpComCSR.INLNGTH; + g_ComCSR.OUTLNGTH = tmpComCSR.OUTLNGTH; + g_ComCSR.RDSTINTMSK = tmpComCSR.RDSTINTMSK; + g_ComCSR.TCINTMSK = tmpComCSR.TCINTMSK; + + g_ComCSR.COMERR = 0; + + if (tmpComCSR.RDSTINT) g_ComCSR.RDSTINT = 0; + if (tmpComCSR.TCINT) g_ComCSR.TCINT = 0; + + // be careful: RunSIBuffer after updating the INT flags + if (tmpComCSR.TSTART) RunSIBuffer(); + UpdateInterrupts(); + } + break; + + case SI_STATUS_REG: + { + USIStatusReg tmpStatus(_iValue); + + // just update the writable bits + g_StatusReg.NOREP0 = tmpStatus.NOREP0 ? 1 : 0; + g_StatusReg.COLL0 = tmpStatus.COLL0 ? 1 : 0; + g_StatusReg.OVRUN0 = tmpStatus.OVRUN0 ? 1 : 0; + g_StatusReg.UNRUN0 = tmpStatus.UNRUN0 ? 1 : 0; + + g_StatusReg.NOREP1 = tmpStatus.NOREP1 ? 1 : 0; + g_StatusReg.COLL1 = tmpStatus.COLL1 ? 1 : 0; + g_StatusReg.OVRUN1 = tmpStatus.OVRUN1 ? 1 : 0; + g_StatusReg.UNRUN1 = tmpStatus.UNRUN1 ? 1 : 0; + + g_StatusReg.NOREP2 = tmpStatus.NOREP2 ? 1 : 0; + g_StatusReg.COLL2 = tmpStatus.COLL2 ? 1 : 0; + g_StatusReg.OVRUN2 = tmpStatus.OVRUN2 ? 1 : 0; + g_StatusReg.UNRUN2 = tmpStatus.UNRUN2 ? 1 : 0; + + g_StatusReg.NOREP3 = tmpStatus.NOREP3 ? 1 : 0; + g_StatusReg.COLL3 = tmpStatus.COLL3 ? 1 : 0; + g_StatusReg.OVRUN3 = tmpStatus.OVRUN3 ? 1 : 0; + g_StatusReg.UNRUN3 = tmpStatus.UNRUN3 ? 1 : 0; + + // send command to devices + if (tmpStatus.WR) + { + g_StatusReg.WR = 0; + m_pDevice->SendCommand(m_Out.Hex); + m_pDevice->SendCommand(m_Out.Hex); + m_pDevice->SendCommand(m_Out.Hex); + m_pDevice->SendCommand(m_Out.Hex); + + g_StatusReg.WRST0 = 0; + g_StatusReg.WRST1 = 0; + g_StatusReg.WRST2 = 0; + g_StatusReg.WRST3 = 0; + } + } + break; + + case SI_EXI_CLOCK_COUNT: + g_EXIClockCount.Hex = _iValue; + break; + + case 0x80: + LOG(SERIALINTERFACE, "WII something at 0xCD006480"); + break; + + default: + _dbg_assert_(SERIALINTERFACE,0); + break; + } +} diff --git a/Source/Core/Core/Src/HW/SI_Channel.h b/Source/Core/Core/Src/HW/SI_Channel.h new file mode 100644 index 0000000000..d2e877b3d2 --- /dev/null +++ b/Source/Core/Core/Src/HW/SI_Channel.h @@ -0,0 +1,111 @@ +// Copyright (C) 2003-2009 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ +#ifndef _SICHANNEL_H +#define _SICHANNEL_H + +#include "Common.h" + +#include "SI_Device.h" + +class CSIChannel +{ +private: + // SI Internal Hardware Addresses + enum + { + SI_CHANNEL_0_OUT = 0x00, + SI_CHANNEL_0_IN_HI = 0x04, + SI_CHANNEL_0_IN_LO = 0x08, + SI_CHANNEL_1_OUT = 0x0C, + SI_CHANNEL_1_IN_HI = 0x10, + SI_CHANNEL_1_IN_LO = 0x14, + SI_CHANNEL_2_OUT = 0x18, + SI_CHANNEL_2_IN_HI = 0x1C, + SI_CHANNEL_2_IN_LO = 0x20, + SI_CHANNEL_3_OUT = 0x24, + SI_CHANNEL_3_IN_HI = 0x28, + SI_CHANNEL_3_IN_LO = 0x2C, + SI_POLL = 0x30, + SI_COM_CSR = 0x34, + SI_STATUS_REG = 0x38, + SI_EXI_CLOCK_COUNT = 0x3C, + }; + + // SI Channel Output + union USIChannelOut + { + u32 Hex; + struct + { + unsigned OUTPUT1 : 8; + unsigned OUTPUT0 : 8; + unsigned CMD : 8; + unsigned : 8; + }; + }; + + // SI Channel Input High u32 + union USIChannelIn_Hi + { + u32 Hex; + struct + { + unsigned INPUT3 : 8; + unsigned INPUT2 : 8; + unsigned INPUT1 : 8; + unsigned INPUT0 : 6; + unsigned ERRLATCH : 1; // 0: no error 1: Error latched. Check SISR. + unsigned ERRSTAT : 1; // 0: no error 1: error on last transfer + }; + }; + + // SI Channel Input Low u32 + union USIChannelIn_Lo + { + u32 Hex; + struct + { + unsigned INPUT7 : 8; + unsigned INPUT6 : 8; + unsigned INPUT5 : 8; + unsigned INPUT4 : 8; + }; + }; +public: // HAX + // SI Channel + USIChannelOut m_Out; + USIChannelIn_Hi m_InHi; + USIChannelIn_Lo m_InLo; + ISIDevice* m_pDevice; + +//public: + // ChannelId for debugging + u32 m_ChannelId; + + CSIChannel(); + ~CSIChannel(); + + void AddDevice(const TSIDevices _device, int _iSlot); + + // Remove the device + void RemoveDevice(); + + void Read32(u32& _uReturnValue, const u32 _iRegister); + void Write32(const u32 _iValue, const u32 _iRegister); +}; + +#endif diff --git a/Source/Core/Core/Src/HW/SI_Device.cpp b/Source/Core/Core/Src/HW/SI_Device.cpp index 2f05c2729c..6c6e56a60e 100644 --- a/Source/Core/Core/Src/HW/SI_Device.cpp +++ b/Source/Core/Core/Src/HW/SI_Device.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -16,11 +16,12 @@ // http://code.google.com/p/dolphin-emu/ #include "SI_Device.h" +#include "SI_DeviceGCController.h" +#include "SI_DeviceGBA.h" -// ===================================================================================================== -// --- base class --- -// ===================================================================================================== - +////////////////////////////////////////////////////////////////////////// +// --- interface ISIDevice --- +////////////////////////////////////////////////////////////////////////// int ISIDevice::RunBuffer(u8* _pBuffer, int _iLength) { #ifdef _DEBUG @@ -29,7 +30,7 @@ int ISIDevice::RunBuffer(u8* _pBuffer, int _iLength) char szTemp[256] = ""; int num = 0; while(num < _iLength) - { + { char szTemp2[128] = ""; sprintf(szTemp2, "0x%02x ", _pBuffer[num^3]); strcat(szTemp, szTemp2); @@ -39,32 +40,58 @@ int ISIDevice::RunBuffer(u8* _pBuffer, int _iLength) { LOG(SERIALINTERFACE, szTemp); szTemp[0] = '\0'; - } + } } - LOG(SERIALINTERFACE, szTemp); + LOG(SERIALINTERFACE, szTemp); #endif return 0; }; -// ===================================================================================================== -// --- dummy device --- -// ===================================================================================================== - -CSIDevice_Dummy::CSIDevice_Dummy(int _iDeviceNumber) : - ISIDevice(_iDeviceNumber) -{} - -int CSIDevice_Dummy::RunBuffer(u8* _pBuffer, int _iLength) +////////////////////////////////////////////////////////////////////////// +// --- class CSIDummy --- +////////////////////////////////////////////////////////////////////////// +// Just a dummy that logs reads and writes +// to be used for SI devices we haven't emulated +class CSIDevice_Dummy : public ISIDevice { - reinterpret_cast(_pBuffer)[0] = 0x00000000; // no device - return 4; -} +public: + CSIDevice_Dummy(int _iDeviceNumber) : + ISIDevice(_iDeviceNumber) + {} -bool CSIDevice_Dummy::GetData(u32& _Hi, u32& _Low) -{ - return false; -} + virtual ~CSIDevice_Dummy(){} -void CSIDevice_Dummy::SendCommand(u32 _Cmd) + int RunBuffer(u8* _pBuffer, int _iLength) + { + // (shuffle2) Logging of this function will be done above, in ISIDevice::RunBuffer + // No device. (shuffle2) Maybe this should be SI_ERROR_NO_RESPONSE? + reinterpret_cast(_pBuffer)[0] = 0x00000000; + return 4; + } + + bool GetData(u32& _Hi, u32& _Low) {LOG(SERIALINTERFACE, "SI DUMMY %i GetData", this->m_iDeviceNumber); return false;} + void SendCommand(u32 _Cmd) {LOG(SERIALINTERFACE, "SI DUMMY %i SendCommand: %08x", this->m_iDeviceNumber, _Cmd);} +}; + +////////////////////////////////////////////////////////////////////////// +// F A C T O R Y ///////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +ISIDevice* SIDevice_Create(TSIDevices _SIDevice, int _iDeviceNumber) { + switch(_SIDevice) + { + case SI_DUMMY: + return new CSIDevice_Dummy(_iDeviceNumber); + break; + + case SI_GC_CONTROLLER: + return new CSIDevice_GCController(_iDeviceNumber); + break; + + case SI_GBA: + return new CSIDevice_GBA(_iDeviceNumber); + break; + } + return NULL; } diff --git a/Source/Core/Core/Src/HW/SI_Device.h b/Source/Core/Core/Src/HW/SI_Device.h index b38e9df2b4..f92774a6ff 100644 --- a/Source/Core/Core/Src/HW/SI_Device.h +++ b/Source/Core/Core/Src/HW/SI_Device.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -20,89 +20,57 @@ #include "Common.h" -#define SI_ERROR_NO_RESPONSE 0x0008 // nothing is attached -#define SI_ERROR_UNKNOWN 0x0040 // unknown device is attached -#define SI_ERROR_BUSY 0x0080 // still detecting +// Devices can reply with these, but idk if we'll ever use them... +#define SI_ERROR_NO_RESPONSE 0x0008 // Nothing is attached +#define SI_ERROR_UNKNOWN 0x0040 // Unknown device is attached +#define SI_ERROR_BUSY 0x0080 // Still detecting // Device types -#define SI_TYPE_MASK 0x18000000u -#define SI_TYPE_N64 0x00000000u +#define SI_TYPE_MASK 0x18000000u // ??? #define SI_TYPE_GC 0x08000000u -// GameCube -#define SI_GC_WIRELESS 0x80000000u -#define SI_GC_NOMOTOR 0x20000000u // no rumble motor +// GC Controller types +#define SI_GC_NOMOTOR 0x20000000u // No rumble motor #define SI_GC_STANDARD 0x01000000u -// WaveBird -#define SI_WIRELESS_RECEIVED 0x40000000u // 0: no wireless unit -#define SI_WIRELESS_IR 0x04000000u // 0: IR 1: RF -#define SI_WIRELESS_STATE 0x02000000u // 0: variable 1: fixed -#define SI_WIRELESS_ORIGIN 0x00200000u // 0: invalid 1: valid -#define SI_WIRELESS_FIX_ID 0x00100000u // 0: not fixed 1: fixed -#define SI_WIRELESS_TYPE 0x000f0000u -#define SI_WIRELESS_LITE_MASK 0x000c0000u // 0: normal 1: lite controller -#define SI_WIRELESS_LITE 0x00040000u // 0: normal 1: lite controller -#define SI_WIRELESS_CONT_MASK 0x00080000u // 0: non-controller 1: non-controller -#define SI_WIRELESS_CONT 0x00000000u -#define SI_WIRELESS_ID 0x00c0ff00u -#define SI_WIRELESS_TYPE_ID (SI_WIRELESS_TYPE | SI_WIRELESS_ID) - -// "Complete" IDs -#define SI_N64_CONTROLLER (SI_TYPE_N64 | 0x05000000) -#define SI_N64_MIC (SI_TYPE_N64 | 0x00010000) -#define SI_N64_KEYBOARD (SI_TYPE_N64 | 0x00020000) -#define SI_N64_MOUSE (SI_TYPE_N64 | 0x02000000) -#define SI_GBA (SI_TYPE_N64 | 0x00040000) -#define SI_GC_CONTROLLER (SI_TYPE_GC | SI_GC_STANDARD) -#define SI_GC_RECEIVER (SI_TYPE_GC | SI_GC_WIRELESS) -#define SI_GC_WAVEBIRD (SI_TYPE_GC | SI_GC_WIRELESS | SI_GC_STANDARD | SI_WIRELESS_STATE | SI_WIRELESS_FIX_ID) -#define SI_GC_KEYBOARD (SI_TYPE_GC | 0x00200000) -#define SI_GC_STEERING (SI_TYPE_GC | 0x00000000) - - class ISIDevice { protected: int m_iDeviceNumber; public: + // Constructor + ISIDevice(int _iDeviceNumber) : + m_iDeviceNumber(_iDeviceNumber) + {} - // constructor - ISIDevice(int _iDeviceNumber) : - m_iDeviceNumber(_iDeviceNumber) - { } - virtual ~ISIDevice() { } + // Destructor + virtual ~ISIDevice() {} - // run the SI Buffer + // Run the SI Buffer virtual int RunBuffer(u8* _pBuffer, int _iLength); - // return true on new data + // Return true on new data virtual bool GetData(u32& _Hi, u32& _Low) = 0; - // send a command directly (no detour per buffer) + // Send a command directly (no detour per buffer) virtual void SendCommand(u32 _Cmd) = 0; }; -// ===================================================================================================== -// dummy - no device attached -// ===================================================================================================== - -class CSIDevice_Dummy : public ISIDevice +// SI Device IDs +enum TSIDevices { -public: - - // constructor - CSIDevice_Dummy(int _iDeviceNumber); - - // run the SI Buffer - virtual int RunBuffer(u8* _pBuffer, int _iLength); - - // return true on new data - virtual bool GetData(u32& _Hi, u32& _Low); - - // send a command directly - virtual void SendCommand(u32 _Cmd); + SI_DUMMY = 0, + SI_N64_MIC = 0x00010000, + SI_N64_KEYBOARD = 0x00020000, + SI_N64_MOUSE = 0x02000000, + SI_N64_CONTROLLER = 0x05000000, + SI_GBA = 0x00040000, + SI_GC_CONTROLLER = (SI_TYPE_GC | SI_GC_STANDARD), + SI_GC_KEYBOARD = (SI_TYPE_GC | 0x00200000), + SI_GC_STEERING = SI_TYPE_GC, // (shuffle2)I think the "chainsaw" is the same (Or else it's just standard) }; +extern ISIDevice* SIDevice_Create(TSIDevices _SIDevice, int _iDeviceNumber); + #endif diff --git a/Source/Core/Core/Src/HW/SI_DeviceGBA.cpp b/Source/Core/Core/Src/HW/SI_DeviceGBA.cpp new file mode 100644 index 0000000000..7967436b95 --- /dev/null +++ b/Source/Core/Core/Src/HW/SI_DeviceGBA.cpp @@ -0,0 +1,132 @@ +// Copyright (C) 2003-2009 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "SI_Device.h" +#include "SI_DeviceGBA.h" + +////////////////////////////////////////////////////////////////////////// +// --- GameBoy Advance --- +////////////////////////////////////////////////////////////////////////// + +CSIDevice_GBA::CSIDevice_GBA(int _iDeviceNumber) : + ISIDevice(_iDeviceNumber) +{ +} + +int CSIDevice_GBA::RunBuffer(u8* _pBuffer, int _iLength) +{ + // for debug logging only + ISIDevice::RunBuffer(_pBuffer, _iLength); + + int iPosition = 0; + while(iPosition < _iLength) + { + // read the command + EBufferCommands command = static_cast(_pBuffer[iPosition ^ 3]); + iPosition++; + + // handle it + switch(command) + { + // NOTE: All "Send/Recieve" mentioned here is from dolphin's perspective, + // NOT the GBA's + // This means "Send"s are seen as CMDs to the GBA, and are therefor IMPORTANT :p + // Also this means that we can randomly fill recieve bits and try for a fake gba... + // for example, the ORd bits in RESET and STATUS are just some values to play with + case CMD_RESET: + { + //Device Reset + //Send 0xFF + //Recieve 0x00 + //Recieve 0x04 + //Recieve from lower 8bits of SIOSTAT register + + *(u32*)&_pBuffer[0] = SI_GBA|2; + iPosition = _iLength; // break the while loop + LOG(SERIALINTERFACE, "GBA CMD_RESET"); + } + break; + case CMD_STATUS: + { + //Type/Status Data Request + //Send 0x00 + //Recieve 0x00 + //Recieve 0x04 + //Recieve from lower 8bits of SIOSTAT register + + *(u32*)&_pBuffer[0] = SI_GBA|8; + iPosition = _iLength; // break the while loop + LOG(SERIALINTERFACE, "GBA CMD_STATUS"); + } + break; + case CMD_WRITE: + { + //GBA Data Write (to GBA) + //Send 0x15 + //Send to Lower 8bits of JOY_RECV_L + //Send to Upper 8bits of JOY_RECV_L + //Send to Lower 8bits of JOY_RECV_H + //Send to Upper 8bits of JOY_RECV_H + //Receive from lower 8bits of SIOSTAT register + + LOG(SERIALINTERFACE, "GBA CMD_WRITE"); + } + break; + case CMD_READ: + { + //GBA Data Read (from GBA) + //Send 0x14 + //Receive from Lower 8bits of JOY_TRANS_L + //Receive from Upper 8bits of JOY_TRANS_L + //Receive from Lower 8bits of JOY_TRANS_H + //Receive from Upper 8bits of JOY_TRANS_H + //Receive from lower 8bits of SIOSTAT register + + LOG(SERIALINTERFACE, "GBA CMD_READ"); + } + break; + default: + { + LOG(SERIALINTERFACE, "unknown GBA command (0x%x)", command); + iPosition = _iLength; + } + break; + } + } + + return iPosition; +} + +////////////////////////////////////////////////////////////////////////// +// GetData +////////////////////////////////////////////////////////////////////////// +bool +CSIDevice_GBA::GetData(u32& _Hi, u32& _Low) +{ + LOG(SERIALINTERFACE, "GBA GetData Hi: 0x%x Low: 0x%x", _Hi, _Low); + + return true; +} + +////////////////////////////////////////////////////////////////////////// +// SendCommand +////////////////////////////////////////////////////////////////////////// +void +CSIDevice_GBA::SendCommand(u32 _Cmd) +{ + LOG(SERIALINTERFACE, "GBA SendCommand: (0x%x)", _Cmd); +} diff --git a/Source/Core/Core/Src/HW/SI_DeviceGBAController.h b/Source/Core/Core/Src/HW/SI_DeviceGBA.h similarity index 67% rename from Source/Core/Core/Src/HW/SI_DeviceGBAController.h rename to Source/Core/Core/Src/HW/SI_DeviceGBA.h index e41b630631..c1416f0e39 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGBAController.h +++ b/Source/Core/Core/Src/HW/SI_DeviceGBA.h @@ -1,62 +1,78 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program 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, version 2.0. - -// This program 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 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -// ===================================================================================================== -// GameBoy Advance -// ===================================================================================================== - -class CSIDevice_GBA : public ISIDevice -{ -private: - - // commands - enum EBufferCommands - { - CMD_RESET = 0xFF, - CMD_STATUS = 0x00, - CMD_WRITE = 0x15, - CMD_READ = 0x14 - }; - - //0x4000158 - JOYSTAT - Receive Status Register (R/W) (ON THE GBA) - //Bit Explanation - //0 Not used - //1 Receive Status Flag (0=Remote GBA is/was receiving) (Read Only?) - //2 Not used - //3 Send Status Flag (1=Remote GBA is/was sending) (Read Only?) - //4-5 General Purpose Flag (Not assigned, may be used for whatever purpose) - //6-15 Not used - //-------------------------------------- - //Bit 1 is automatically set when writing to local JOY_TRANS. - //Bit 3 is automatically reset when reading from local JOY_RECV. - - int DeviceNum; - -public: - - // constructor - CSIDevice_GBA(int _iDeviceNumber); - - // run the SI Buffer - virtual int RunBuffer(u8* _pBuffer, int _iLength); - - // return true on new data - virtual bool GetData(u32& _Hi, u32& _Low); - - // send a command directly - virtual void SendCommand(u32 _Cmd); -}; +// Copyright (C) 2003-2009 Dolphin Project. + +// This program 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, version 2.0. + +// This program 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 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#ifndef _SI_DEVICEGBA_H +#define _SI_DEVICEGBA_H + +////////////////////////////////////////////////////////////////////////// +// GameBoy Advance +////////////////////////////////////////////////////////////////////////// + +class CSIDevice_GBA : public ISIDevice +{ +private: + + // Commands + enum EBufferCommands + { + CMD_RESET = 0xFF, + CMD_STATUS = 0x00, + CMD_WRITE = 0x15, + CMD_READ = 0x14 + }; + + struct FAKE_JOYSTAT + { + unsigned unused : 1; + unsigned stat_rec : 1; + unsigned unused2 : 1; + unsigned stat_send : 1; + unsigned genpurpose : 2; + unsigned unused3 :10; + }; + ////////////////////////////////////////////////////////////////////////// + //0x4000158 - JOYSTAT - Receive Status Register (R/W) (ON THE GBA) + ////////////////////////////////////////////////////////////////////////// + // NOTE: I am guessing that JOYSTAT == SIOSTAT, may be wrong + //Bit Expl. + //0 Not used + //1 Receive Status Flag (0=Remote GBA is/was receiving) (Read Only?) + //2 Not used + //3 Send Status Flag (1=Remote GBA is/was sending) (Read Only?) + //4-5 General Purpose Flag (Not assigned, may be used for whatever purpose) + //6-15 Not used + //-------------------------------------- + //0b0000000000 00 0 0 0 0 + //______________________________________ + //Bit 1 is automatically set when writing to local JOY_TRANS. + //Bit 3 is automatically reset when reading from local JOY_RECV. + +public: + + // Constructor + CSIDevice_GBA(int _iDeviceNumber); + + // Run the SI Buffer + virtual int RunBuffer(u8* _pBuffer, int _iLength); + + // Return true on new data + virtual bool GetData(u32& _Hi, u32& _Low); + + // Send a command directly + virtual void SendCommand(u32 _Cmd); +}; +#endif diff --git a/Source/Core/Core/Src/HW/SI_DeviceGBAController.cpp b/Source/Core/Core/Src/HW/SI_DeviceGBAController.cpp deleted file mode 100644 index b3710497c6..0000000000 --- a/Source/Core/Core/Src/HW/SI_DeviceGBAController.cpp +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (C) 2003-2009 Dolphin Project. - -// This program 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, version 2.0. - -// This program 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 2.0 for more details. - -// A copy of the GPL 2.0 should have been included with the program. -// If not, see http://www.gnu.org/licenses/ - -// Official SVN repository and contact information can be found at -// http://code.google.com/p/dolphin-emu/ - -#include "SI_Device.h" -#include "SI_DeviceGBAController.h" -#include "../PluginManager.h" - -#include "EXI_Device.h" - -CSIDevice_GBA::CSIDevice_GBA(int _iDeviceNumber) : - ISIDevice(_iDeviceNumber) -{ -} - -int CSIDevice_GBA::RunBuffer(u8* _pBuffer, int _iLength) -{ - // for debug logging only - ISIDevice::RunBuffer(_pBuffer, _iLength); - - int iPosition = 0; - while(iPosition < _iLength) - { - // read the command - EBufferCommands command = static_cast(_pBuffer[iPosition ^ 3]); - iPosition++; - - // handle it - switch(command) - { - case CMD_RESET: - { - *(u32*)&_pBuffer[0] = SI_GBA; - iPosition = _iLength; // break the while loop - LOG(SERIALINTERFACE, "SI-GBA CMD_RESET"); - } - break; - case CMD_STATUS: //Same behavior as CMD_RESET: send 0x0004, then lower 8 bits of SIOSTAT - { - *(u32*)&_pBuffer[0] = SI_GBA; - iPosition = _iLength; // break the while loop - LOG(SERIALINTERFACE, "SI-GBA CMD_STATUS"); - } - break; - case CMD_WRITE: - { - LOG(SERIALINTERFACE, "SI-GBA CMD_WRITE"); - } - break; - case CMD_READ: - { - LOG(SERIALINTERFACE, "SI-GBA CMD_READ"); - } - break; - default: - { - LOG(SERIALINTERFACE, "unknown SI-GBA command (0x%x)", command); - //PanicAlert("SI: Unknown command"); - iPosition = _iLength; - } - break; - } - } - - return iPosition; -} - -// __________________________________________________________________________________________________ -// GetData -// -bool -CSIDevice_GBA::GetData(u32& _Hi, u32& _Low) -{ - LOG(SERIALINTERFACE, "SI-GBA GetData Hi: (0x%x) Low: (0x%x)", _Hi, _Low); - - return true; -} - -// __________________________________________________________________________________________________ -// SendCommand -// -void -CSIDevice_GBA::SendCommand(u32 _Cmd) -{ - LOG(SERIALINTERFACE, "SI-GBA SendCommand: (0x%x)", _Cmd); -} diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp index a9bab50773..66227fe6d5 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -25,9 +25,9 @@ #include "EXI_Device.h" #include "EXI_DeviceMic.h" -// ===================================================================================================== +////////////////////////////////////////////////////////////////////////// // --- standard gamecube controller --- -// ===================================================================================================== +////////////////////////////////////////////////////////////////////////// CSIDevice_GCController::CSIDevice_GCController(int _iDeviceNumber) : ISIDevice(_iDeviceNumber) @@ -45,23 +45,23 @@ CSIDevice_GCController::CSIDevice_GCController(int _iDeviceNumber) : int CSIDevice_GCController::RunBuffer(u8* _pBuffer, int _iLength) { - // for debug logging only + // For debug logging only ISIDevice::RunBuffer(_pBuffer, _iLength); int iPosition = 0; while(iPosition < _iLength) { - // read the command + // Read the command EBufferCommands command = static_cast(_pBuffer[iPosition ^ 3]); iPosition++; - // handle it + // Handle it switch(command) { case CMD_RESET: { *(u32*)&_pBuffer[0] = SI_GC_CONTROLLER; // | SI_GC_NOMOTOR; - iPosition = _iLength; // break the while loop + iPosition = _iLength; // Break the while loop } break; @@ -109,11 +109,10 @@ int CSIDevice_GCController::RunBuffer(u8* _pBuffer, int _iLength) return iPosition; } -// __________________________________________________________________________________________________ +////////////////////////////////////////////////////////////////////////// // GetData -// +////////////////////////////////////////////////////////////////////////// // Return true on new data (max 7 Bytes and 6 bits ;) -// bool CSIDevice_GCController::GetData(u32& _Hi, u32& _Low) { @@ -131,7 +130,7 @@ CSIDevice_GCController::GetData(u32& _Hi, u32& _Low) _Low |= (u32)((u8)PadStatus.triggerLeft << 8); _Low |= (u32)((u8)PadStatus.substickY << 16); _Low |= (u32)((u8)PadStatus.substickX << 24); - SetMic(PadStatus.MicButton); + SetMic(PadStatus.MicButton); // This is dumb and should not be here // F|RES: // i dunno if i should force it here @@ -141,9 +140,9 @@ CSIDevice_GCController::GetData(u32& _Hi, u32& _Low) return true; } -// __________________________________________________________________________________________________ +////////////////////////////////////////////////////////////////////////// // SendCommand -// +////////////////////////////////////////////////////////////////////////// void CSIDevice_GCController::SendCommand(u32 _Cmd) { diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCController.h b/Source/Core/Core/Src/HW/SI_DeviceGCController.h index b7d9029fc5..f44606059d 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCController.h +++ b/Source/Core/Core/Src/HW/SI_DeviceGCController.h @@ -1,4 +1,4 @@ -// Copyright (C) 2003-2008 Dolphin Project. +// Copyright (C) 2003-2009 Dolphin Project. // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,15 +18,15 @@ #ifndef _SI_DEVICEGCCONTROLLER_H #define _SI_DEVICEGCCONTROLLER_H -// ===================================================================================================== +////////////////////////////////////////////////////////////////////////// // standard gamecube controller -// ===================================================================================================== +////////////////////////////////////////////////////////////////////////// class CSIDevice_GCController : public ISIDevice { private: - // commands + // Commands enum EBufferCommands { CMD_INVALID = 0xFFFFFFFF, @@ -41,10 +41,10 @@ private: u8 unk_1; u8 uOriginStickX; u8 uOriginStickY; - u8 uSubStickStickX; // ??? - u8 uSubStickStickY; // ??? - u8 uTrigger_L; // ??? - u8 uTrigger_R; // ??? + u8 uSubStickStickX; // ??? + u8 uSubStickStickY; // ??? + u8 uTrigger_L; // ??? + u8 uTrigger_R; // ??? u8 unk_4; u8 unk_5; u8 unk_6; @@ -75,16 +75,16 @@ private: public: - // constructor + // Constructor CSIDevice_GCController(int _iDeviceNumber); - // run the SI Buffer + // Run the SI Buffer virtual int RunBuffer(u8* _pBuffer, int _iLength); - // return true on new data + // Return true on new data virtual bool GetData(u32& _Hi, u32& _Low); - // send a command directly + // Send a command directly virtual void SendCommand(u32 _Cmd); }; #endif diff --git a/Source/Core/DolphinWX/Src/ConfigMain.cpp b/Source/Core/DolphinWX/Src/ConfigMain.cpp index 2cc42cf0a9..067d8ed833 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.cpp +++ b/Source/Core/DolphinWX/Src/ConfigMain.cpp @@ -15,7 +15,6 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ -// Include #include // System #include @@ -28,14 +27,14 @@ #include "ConfigManager.h" #include "Frame.h" -// Declarations and definitions + extern CFrame* main_frame; -// Event table + BEGIN_EVENT_TABLE(CConfigMain, wxDialog) EVT_CLOSE(CConfigMain::OnClose) -EVT_BUTTON(ID_CLOSE, CConfigMain::CloseClick) +EVT_BUTTON(wxID_CLOSE, CConfigMain::CloseClick) EVT_CHECKBOX(ID_INTERFACE_CONFIRMSTOP, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_INTERFACE_HIDECURSOR, CConfigMain::CoreSettingsChanged) @@ -43,8 +42,7 @@ EVT_CHECKBOX(ID_INTERFACE_AUTOHIDECURSOR, CConfigMain::CoreSettingsChanged) EVT_RADIOBOX(ID_INTERFACE_THEME, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_INTERFACE_WIIMOTE_LEDS, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_INTERFACE_WIIMOTE_SPEAKERS, CConfigMain::CoreSettingsChanged) - -EVT_CHOICE(ID_INTERFACE_LANG, CConfigMain::InterfaceLanguageChanged) +EVT_CHOICE(ID_INTERFACE_LANG, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_ALLWAYS_HLEBIOS, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_USEDYNAREC, CConfigMain::CoreSettingsChanged) @@ -55,6 +53,15 @@ EVT_CHECKBOX(ID_IDLESKIP, CConfigMain::CoreSettingsChanged) EVT_CHECKBOX(ID_ENABLECHEATS, CConfigMain::CoreSettingsChanged) EVT_CHOICE(ID_GC_SRAM_LNG, CConfigMain::GCSettingsChanged) +EVT_CHOICE(ID_GC_EXIDEVICE_SLOTA, CConfigMain::GCSettingsChanged) +EVT_BUTTON(ID_GC_EXIDEVICE_SLOTA_PATH, CConfigMain::GCSettingsChanged) +EVT_CHOICE(ID_GC_EXIDEVICE_SLOTB, CConfigMain::GCSettingsChanged) +EVT_BUTTON(ID_GC_EXIDEVICE_SLOTB_PATH, CConfigMain::GCSettingsChanged) +EVT_CHOICE(ID_GC_EXIDEVICE_SP1, CConfigMain::GCSettingsChanged) +EVT_CHOICE(ID_GC_SIDEVICE0, CConfigMain::GCSettingsChanged) +EVT_CHOICE(ID_GC_SIDEVICE1, CConfigMain::GCSettingsChanged) +EVT_CHOICE(ID_GC_SIDEVICE2, CConfigMain::GCSettingsChanged) +EVT_CHOICE(ID_GC_SIDEVICE3, CConfigMain::GCSettingsChanged) EVT_CHOICE(ID_WII_BT_BAR, CConfigMain::WiiSettingsChanged) EVT_CHECKBOX(ID_WII_IPL_SSV, CConfigMain::WiiSettingsChanged) @@ -80,7 +87,6 @@ EVT_BUTTON(ID_WIIMOTE_CONFIG, CConfigMain::OnConfig) END_EVENT_TABLE() -// Window class CConfigMain::CConfigMain(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& position, const wxSize& size, long style) : wxDialog(parent, id, title, position, size, style) { @@ -116,8 +122,8 @@ CConfigMain::~CConfigMain() { } - -// Enable or disable objects +////////////////////////////////////////////////////////////////////////// +// Used to restrict changing of some options while emulator is running void CConfigMain::UpdateGUI() { if(Core::GetState() != Core::CORE_UNINITIALIZED) @@ -130,14 +136,16 @@ void CConfigMain::UpdateGUI() OptimizeQuantizers->Disable(); SkipIdle->Disable(); EnableCheats->Disable(); - - GamecubePage->Disable(); + // Disable GC Stuff, but devices should be dynamic soon + GCSystemLang->Disable(); + GCEXIDevice[0]->Disable(); GCEXIDevice[1]->Disable(); GCEXIDevice[2]->Disable(); + GCMemcardPath[0]->Disable(); GCMemcardPath[1]->Disable(); + GCSIDevice[0]->Disable(); GCSIDevice[1]->Disable(); GCSIDevice[2]->Disable(); GCSIDevice[3]->Disable(); WiiPage->Disable(); PathsPage->Disable(); PluginPage->Disable(); } } -// ========================== void CConfigMain::CreateGUIControls() { @@ -170,17 +178,17 @@ void CConfigMain::CreateGUIControls() Notebook->AddPage(PluginPage, wxT("Plugins")); + ////////////////////////////////////////////////////////////////////////// // General page - // Core Settings - // Basic Settings + // Core Settings - Basic UseDualCore = new wxCheckBox(GeneralPage, ID_USEDUALCORE, wxT("Enable Dual Core"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); UseDualCore->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bUseDualCore); SkipIdle = new wxCheckBox(GeneralPage, ID_IDLESKIP, wxT("Enable Idle Skipping"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); SkipIdle->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bSkipIdle); EnableCheats = new wxCheckBox(GeneralPage, ID_ENABLECHEATS, wxT("Enable Cheats"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); EnableCheats->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableCheats); - // Advanced Settings + // Core Settings - Advanced AllwaysHLEBIOS = new wxCheckBox(GeneralPage, ID_ALLWAYS_HLEBIOS, wxT("HLE the BIOS all the time"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); AllwaysHLEBIOS->SetValue(SConfig::GetInstance().m_LocalCoreStartupParameter.bHLEBios); UseDynaRec = new wxCheckBox(GeneralPage, ID_USEDYNAREC, wxT("Enable the JIT dynarec"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); @@ -286,19 +294,62 @@ void CConfigMain::CreateGUIControls() sGeneralPage->Layout(); + ////////////////////////////////////////////////////////////////////////// // Gamecube page + // IPL settings sbGamecubeIPLSettings = new wxStaticBoxSizer(wxVERTICAL, GamecubePage, wxT("IPL Settings")); -/* - arrayStringFor_GCSystemLang.Add(wxT("English")); - arrayStringFor_GCSystemLang.Add(wxT("German")); - arrayStringFor_GCSystemLang.Add(wxT("French")); - arrayStringFor_GCSystemLang.Add(wxT("Spanish")); - arrayStringFor_GCSystemLang.Add(wxT("Italian")); - arrayStringFor_GCSystemLang.Add(wxT("Dutch")); -*/ GCSystemLangText = new wxStaticText(GamecubePage, ID_GC_SRAM_LNG_TEXT, wxT("System Language:"), wxDefaultPosition, wxDefaultSize); GCSystemLang = new wxChoice(GamecubePage, ID_GC_SRAM_LNG, wxDefaultPosition, wxDefaultSize, arrayStringFor_GCSystemLang, 0, wxDefaultValidator); GCSystemLang->SetSelection(SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage); + // Devices + wxStaticBoxSizer *sbGamecubeDeviceSettings = new wxStaticBoxSizer(wxVERTICAL, GamecubePage, wxT("Device Settings")); + // EXI Devices + wxStaticText *GCEXIDeviceText[3]; + GCEXIDeviceText[0] = new wxStaticText(GamecubePage, ID_GC_EXIDEVICE_SLOTA_TEXT, wxT("Slot A"), wxDefaultPosition, wxDefaultSize); + GCEXIDeviceText[1] = new wxStaticText(GamecubePage, ID_GC_EXIDEVICE_SLOTB_TEXT, wxT("Slot B"), wxDefaultPosition, wxDefaultSize); + GCEXIDeviceText[2] = new wxStaticText(GamecubePage, ID_GC_EXIDEVICE_SP1_TEXT, wxT("SP1 "), wxDefaultPosition, wxDefaultSize); + GCEXIDeviceText[2]->SetToolTip(wxT("Serial Port 1 - This is the port the network adapter uses")); + const wxString SlotDevices[] = {"null","Memory Card", "Mic"}; + const wxString SP1Devices[] = {"null","BBA"}; + GCEXIDevice[0] = new wxChoice(GamecubePage, ID_GC_EXIDEVICE_SLOTA, wxDefaultPosition, wxDefaultSize, 3, SlotDevices, 0, wxDefaultValidator); + GCEXIDevice[1] = new wxChoice(GamecubePage, ID_GC_EXIDEVICE_SLOTB, wxDefaultPosition, wxDefaultSize, 3, SlotDevices, 0, wxDefaultValidator); + GCEXIDevice[2] = new wxChoice(GamecubePage, ID_GC_EXIDEVICE_SP1, wxDefaultPosition, wxDefaultSize, 2, SP1Devices, 0, wxDefaultValidator); + GCMemcardPath[0] = new wxButton(GamecubePage, ID_GC_EXIDEVICE_SLOTA_PATH, wxT("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator); + GCMemcardPath[1] = new wxButton(GamecubePage, ID_GC_EXIDEVICE_SLOTB_PATH, wxT("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT, wxDefaultValidator); + for (int i = 0; i < 3; ++i) + { + bool isMemcard = false; + if (SConfig::GetInstance().m_EXIDevice[i] == EXIDEVICE_MEMORYCARD_A) + isMemcard = GCEXIDevice[i]->SetStringSelection(SlotDevices[1]); + else if (SConfig::GetInstance().m_EXIDevice[i] == EXIDEVICE_MEMORYCARD_B) + isMemcard = GCEXIDevice[i]->SetStringSelection(SlotDevices[1]); + else if (SConfig::GetInstance().m_EXIDevice[i] == EXIDEVICE_MIC) + GCEXIDevice[i]->SetStringSelection(SlotDevices[2]); + else if (SConfig::GetInstance().m_EXIDevice[i] == EXIDEVICE_ETH) + GCEXIDevice[i]->SetStringSelection(SP1Devices[1]); + else + GCEXIDevice[i]->SetStringSelection(wxT("null")); + if (!isMemcard && i < 2) + GCMemcardPath[i]->Disable(); + } + //SI Devices + wxStaticText *GCSIDeviceText[4]; + GCSIDeviceText[0] = new wxStaticText(GamecubePage, ID_GC_SIDEVICE_TEXT, wxT("Port 1"), wxDefaultPosition, wxDefaultSize); + GCSIDeviceText[1] = new wxStaticText(GamecubePage, ID_GC_SIDEVICE_TEXT, wxT("Port 2"), wxDefaultPosition, wxDefaultSize); + GCSIDeviceText[2] = new wxStaticText(GamecubePage, ID_GC_SIDEVICE_TEXT, wxT("Port 3"), wxDefaultPosition, wxDefaultSize); + GCSIDeviceText[3] = new wxStaticText(GamecubePage, ID_GC_SIDEVICE_TEXT, wxT("Port 4"), wxDefaultPosition, wxDefaultSize); + const wxString SIDevices[] = {"null","Standard Controller"}; + GCSIDevice[0] = new wxChoice(GamecubePage, ID_GC_SIDEVICE0, wxDefaultPosition, wxDefaultSize, 2, SIDevices, 0, wxDefaultValidator); + GCSIDevice[1] = new wxChoice(GamecubePage, ID_GC_SIDEVICE1, wxDefaultPosition, wxDefaultSize, 2, SIDevices, 0, wxDefaultValidator); + GCSIDevice[2] = new wxChoice(GamecubePage, ID_GC_SIDEVICE2, wxDefaultPosition, wxDefaultSize, 2, SIDevices, 0, wxDefaultValidator); + GCSIDevice[3] = new wxChoice(GamecubePage, ID_GC_SIDEVICE3, wxDefaultPosition, wxDefaultSize, 2, SIDevices, 0, wxDefaultValidator); + for (int i = 0; i < 4; ++i) + { + if (SConfig::GetInstance().m_SIDevice[i] == SI_GC_CONTROLLER) + GCSIDevice[i]->SetStringSelection(SIDevices[1]); + else + GCSIDevice[i]->SetStringSelection(SIDevices[0]); + } sGamecube = new wxBoxSizer(wxVERTICAL); sGamecubeIPLSettings = new wxGridBagSizer(0, 0); @@ -306,10 +357,30 @@ void CConfigMain::CreateGUIControls() sGamecubeIPLSettings->Add(GCSystemLang, wxGBPosition(0, 1), wxGBSpan(1, 1), wxALL, 5); sbGamecubeIPLSettings->Add(sGamecubeIPLSettings); sGamecube->Add(sbGamecubeIPLSettings, 0, wxEXPAND|wxALL, 5); + wxBoxSizer *sEXIDevices[4]; + wxBoxSizer *sSIDevices[4]; + for (int i = 0; i < 3; ++i) + { + sEXIDevices[i] = new wxBoxSizer(wxHORIZONTAL); + sEXIDevices[i]->Add(GCEXIDeviceText[i], 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); + sEXIDevices[i]->Add(GCEXIDevice[i], 0, wxALL, 5); + if (i < 2) + sEXIDevices[i]->Add(GCMemcardPath[i], 0, wxALL, 5); + sbGamecubeDeviceSettings->Add(sEXIDevices[i]); + } + for (int i = 0; i < 4; ++i) + { + sSIDevices[i] = new wxBoxSizer(wxHORIZONTAL); + sSIDevices[i]->Add(GCSIDeviceText[i], 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); + sSIDevices[i]->Add(GCSIDevice[i], 0, wxALL, 5); + sbGamecubeDeviceSettings->Add(sSIDevices[i]); + } + sGamecube->Add(sbGamecubeDeviceSettings, 0, wxEXPAND|wxALL, 5); GamecubePage->SetSizer(sGamecube); sGamecube->Layout(); + ////////////////////////////////////////////////////////////////////////// // Wii page sbWiimoteSettings = new wxStaticBoxSizer(wxVERTICAL, WiiPage, wxT("Wiimote Settings")); arrayStringFor_WiiSensBarPos.Add(wxT("Bottom")); arrayStringFor_WiiSensBarPos.Add(wxT("Top")); @@ -328,10 +399,6 @@ void CConfigMain::CreateGUIControls() WiiAspectRatioText = new wxStaticText(WiiPage, ID_WII_IPL_AR_TEXT, wxT("Aspect Ratio:"), wxDefaultPosition, wxDefaultSize); WiiAspectRatio = new wxChoice(WiiPage, ID_WII_IPL_AR, wxDefaultPosition, wxDefaultSize, arrayStringFor_WiiAspectRatio, 0, wxDefaultValidator); WiiAspectRatio->SetSelection(m_SYSCONF[IPL_AR]); -/* - arrayStringFor_WiiSystemLang = arrayStringFor_GCSystemLang; - arrayStringFor_WiiSystemLang.Insert(wxT("Japanese"), 0); -*/ WiiSystemLangText = new wxStaticText(WiiPage, ID_WII_IPL_LNG_TEXT, wxT("System Language:"), wxDefaultPosition, wxDefaultSize); WiiSystemLang = new wxChoice(WiiPage, ID_WII_IPL_LNG, wxDefaultPosition, wxDefaultSize, arrayStringFor_WiiSystemLang, 0, wxDefaultValidator); WiiSystemLang->SetSelection(m_SYSCONF[IPL_LNG]); @@ -358,6 +425,7 @@ void CConfigMain::CreateGUIControls() sWii->Layout(); + ////////////////////////////////////////////////////////////////////////// // Paths page sbISOPaths = new wxStaticBoxSizer(wxVERTICAL, PathsPage, wxT("ISO Directories")); ISOPaths = new wxListBox(PathsPage, ID_ISOPATHS, wxDefaultPosition, wxDefaultSize, arrayStringFor_ISOPaths, wxLB_SINGLE, wxDefaultValidator); @@ -396,6 +464,7 @@ void CConfigMain::CreateGUIControls() PathsPage->SetSizer(sPaths); sPaths->Layout(); + ////////////////////////////////////////////////////////////////////////// // Plugins page sbGraphicsPlugin = new wxStaticBoxSizer(wxHORIZONTAL, PluginPage, wxT("Graphics")); GraphicSelection = new wxChoice(PluginPage, ID_GRAPHIC_CB, wxDefaultPosition, wxDefaultSize, NULL, 0, wxDefaultValidator); @@ -442,7 +511,7 @@ void CConfigMain::CreateGUIControls() - m_Close = new wxButton(this, ID_CLOSE, wxT("Close"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); + m_Close = new wxButton(this, wxID_CLOSE); wxBoxSizer* sButtons = new wxBoxSizer(wxHORIZONTAL); sButtons->Add(0, 0, 1, wxEXPAND, 5); @@ -463,10 +532,10 @@ void CConfigMain::CreateGUIControls() void CConfigMain::OnClose(wxCloseEvent& WXUNUSED (event)) { - Destroy(); + EndModal((bRefreshList || bRefreshCache) ? wxID_OK : wxID_CLOSE); - /* First check that we did successfully populate m_SYSCONF earlier, otherwise don't - save anything, it will be a corrupted file */ + // First check that we did successfully populate m_SYSCONF earlier, otherwise don't + // save anything, it will be a corrupted file if(m_bSysconfOK) { // Save SYSCONF with the new settings @@ -491,9 +560,8 @@ void CConfigMain::CloseClick(wxCommandEvent& WXUNUSED (event)) Close(); } - - -// Core settings +////////////////////////////////////////////////////////////////////////// +// Core AND Interface settings void CConfigMain::CoreSettingsChanged(wxCommandEvent& event) { switch (event.GetId()) @@ -521,6 +589,11 @@ void CConfigMain::CoreSettingsChanged(wxCommandEvent& event) case ID_INTERFACE_WIIMOTE_SPEAKERS: SConfig::GetInstance().m_LocalCoreStartupParameter.bWiiSpeakers = WiimoteStatusSpeakers->IsChecked(); break; + case ID_INTERFACE_LANG: + SConfig::GetInstance().m_InterfaceLanguage = (INTERFACE_LANGUAGE)InterfaceLang->GetSelection(); + bRefreshList = true; + bRefreshCache = true; + break; case ID_ALLWAYS_HLEBIOS: // Core SConfig::GetInstance().m_LocalCoreStartupParameter.bHLEBios = AllwaysHLEBIOS->IsChecked(); @@ -546,18 +619,90 @@ void CConfigMain::CoreSettingsChanged(wxCommandEvent& event) } } +////////////////////////////////////////////////////////////////////////// +// GC settings void CConfigMain::GCSettingsChanged(wxCommandEvent& event) { + int sidevice = 0; switch (event.GetId()) { case ID_GC_SRAM_LNG: SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage = GCSystemLang->GetSelection(); break; + + case ID_GC_EXIDEVICE_SLOTA: + switch (event.GetSelection()) + { + case 1: // memcard + SConfig::GetInstance().m_EXIDevice[0] = EXIDEVICE_MEMORYCARD_A; + break; + case 2: // mic + SConfig::GetInstance().m_EXIDevice[0] = EXIDEVICE_MIC; + break; + default: + SConfig::GetInstance().m_EXIDevice[0] = EXIDEVICE_DUMMY; + break; + } + GCMemcardPath[0]->Enable(event.GetSelection() == 1); + break; + case ID_GC_EXIDEVICE_SLOTA_PATH: + ChooseMemcardPath(SConfig::GetInstance().m_strMemoryCardA, true); + break; + case ID_GC_EXIDEVICE_SLOTB: + switch (event.GetSelection()) + { + case 1: // memcard + SConfig::GetInstance().m_EXIDevice[1] = EXIDEVICE_MEMORYCARD_B; + break; + case 2: // mic + SConfig::GetInstance().m_EXIDevice[1] = EXIDEVICE_MIC; + break; + default: + SConfig::GetInstance().m_EXIDevice[1] = EXIDEVICE_DUMMY; + break; + } + GCMemcardPath[1]->Enable(event.GetSelection() == 1); + break; + case ID_GC_EXIDEVICE_SLOTB_PATH: + ChooseMemcardPath(SConfig::GetInstance().m_strMemoryCardB, false); + break; + case ID_GC_EXIDEVICE_SP1: // The only thing we emulate on SP1 is the BBA + SConfig::GetInstance().m_EXIDevice[2] = event.GetSelection() ? EXIDEVICE_ETH : EXIDEVICE_DUMMY; + break; + + case ID_GC_SIDEVICE3: + sidevice++; + case ID_GC_SIDEVICE2: + sidevice++; + case ID_GC_SIDEVICE1: + sidevice++; + case ID_GC_SIDEVICE0: + ChooseSIDevice(std::string(event.GetString().mb_str()), sidevice); + break; } } +void CConfigMain::ChooseMemcardPath(std::string& strMemcard, bool isSlotA) +{ + std::string filename = std::string(wxFileSelector(wxT("Choose a file to open"), + wxT(FULL_GC_USER_DIR), wxT(isSlotA ? GC_MEMCARDA:GC_MEMCARDB), wxEmptyString, + wxT("Gamecube Memory Cards (*.raw,*.gcp)|*.raw;*.gcp")).mb_str()); + if (!filename.empty()) + strMemcard = filename; +} +void CConfigMain::ChooseSIDevice(std::string deviceName, int deviceNum) +{ + TSIDevices tempType; + if (deviceName.compare("Standard Controller") == 0) + tempType = SI_GC_CONTROLLER; + else + tempType = SI_DUMMY; + SConfig::GetInstance().m_SIDevice[deviceNum] = tempType; +} + +////////////////////////////////////////////////////////////////////////// // Wii settings void CConfigMain::WiiSettingsChanged(wxCommandEvent& event) { @@ -585,8 +730,7 @@ void CConfigMain::WiiSettingsChanged(wxCommandEvent& event) } } - - +////////////////////////////////////////////////////////////////////////// // Paths settings void CConfigMain::ISOPathsSelectionChanged(wxCommandEvent& WXUNUSED (event)) { @@ -645,12 +789,11 @@ void CConfigMain::DVDRootChanged(wxFileDirPickerEvent& WXUNUSED (event)) SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDVDRoot = DVDRoot->GetPath().ToAscii(); } - -// Plugins settings - -// Update plugin filenames +////////////////////////////////////////////////////////////////////////// +// Plugin settings void CConfigMain::OnSelectionChanged(wxCommandEvent& WXUNUSED (event)) { + // Update plugin filenames GetFilename(GraphicSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin); GetFilename(DSPSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin); for (int i = 0; i < MAXPADS; i++) @@ -739,15 +882,3 @@ bool CConfigMain::GetFilename(wxChoice* _pChoice, std::string& _rFilename) return(false); } - -void CConfigMain::InterfaceLanguageChanged( wxCommandEvent& event ) -{ - switch (event.GetId()) - { - case ID_INTERFACE_LANG: - SConfig::GetInstance().m_InterfaceLanguage = (INTERFACE_LANGUAGE)InterfaceLang->GetSelection(); - break; - } - bRefreshList = true; - bRefreshCache = true; -} diff --git a/Source/Core/DolphinWX/Src/ConfigMain.h b/Source/Core/DolphinWX/Src/ConfigMain.h index 8df07a8410..cfe9a0d2b4 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.h +++ b/Source/Core/DolphinWX/Src/ConfigMain.h @@ -36,6 +36,7 @@ class CConfigMain const wxSize& size = wxDefaultSize, long style = wxDEFAULT_DIALOG_STYLE); virtual ~CConfigMain(); + void OnClick(wxMouseEvent& event); void CloseClick(wxCommandEvent& event); void OnSelectionChanged(wxCommandEvent& event); @@ -72,7 +73,10 @@ class CConfigMain wxGridBagSizer* sGamecubeIPLSettings; wxArrayString arrayStringFor_GCSystemLang; wxStaticText* GCSystemLangText; - wxChoice* GCSystemLang; + wxChoice* GCSystemLang; + wxChoice *GCEXIDevice[3]; + wxButton *GCMemcardPath[2]; + wxChoice *GCSIDevice[4]; wxBoxSizer* sWii; // Wii settings wxStaticBoxSizer* sbWiimoteSettings; @@ -205,7 +209,7 @@ class CConfigMain ID_WIIPAGE, ID_PATHSPAGE, ID_PLUGINPAGE, - ID_CLOSE, + ID_ALLWAYS_HLEBIOS, ID_USEDYNAREC, ID_USEDUALCORE, @@ -213,9 +217,6 @@ class CConfigMain ID_OPTIMIZEQUANTIZERS, ID_IDLESKIP, ID_ENABLECHEATS, - ID_ENABLEISOCACHE, - ID_GC_SRAM_LNG_TEXT, - ID_GC_SRAM_LNG, ID_INTERFACE_CONFIRMSTOP, // Interface settings ID_INTERFACE_HIDECURSOR_TEXT, ID_INTERFACE_HIDECURSOR, ID_INTERFACE_AUTOHIDECURSOR, @@ -223,9 +224,24 @@ class CConfigMain ID_INTERFACE_LANG_TEXT, ID_INTERFACE_LANG, ID_INTERFACE_THEME, + ID_GC_SRAM_LNG_TEXT, + ID_GC_SRAM_LNG, + ID_GC_EXIDEVICE_SLOTA_TEXT, + ID_GC_EXIDEVICE_SLOTA, + ID_GC_EXIDEVICE_SLOTA_PATH, + ID_GC_EXIDEVICE_SLOTB_TEXT, + ID_GC_EXIDEVICE_SLOTB, + ID_GC_EXIDEVICE_SLOTB_PATH, + ID_GC_EXIDEVICE_SP1_TEXT, + ID_GC_EXIDEVICE_SP1, + ID_GC_SIDEVICE_TEXT, + ID_GC_SIDEVICE0, + ID_GC_SIDEVICE1, + ID_GC_SIDEVICE2, + ID_GC_SIDEVICE3, + ID_WII_BT_BAR_TEXT, ID_WII_BT_BAR, - ID_WII_IPL_SSV, ID_WII_IPL_PGS, ID_WII_IPL_E60, @@ -233,6 +249,7 @@ class CConfigMain ID_WII_IPL_AR, ID_WII_IPL_LNG_TEXT, ID_WII_IPL_LNG, + ID_ISOPATHS, ID_ADDISOPATH, ID_REMOVEISOPATH, @@ -240,6 +257,7 @@ class CConfigMain ID_DEFAULTISO, ID_DVDROOT_TEXT, ID_DVDROOT, + ID_WIIMOTE_ABOUT, ID_WIIMOTE_CONFIG, ID_WIIMOTE_TEXT, @@ -258,11 +276,13 @@ class CConfigMain ID_GRAPHIC_CB }; - void CreateGUIControls(); void UpdateGUI(); + void CreateGUIControls(); + void UpdateGUI(); void OnClose(wxCloseEvent& event); void CoreSettingsChanged(wxCommandEvent& event); - void InterfaceLanguageChanged(wxCommandEvent& event); void GCSettingsChanged(wxCommandEvent& event); + void ChooseMemcardPath(std::string& strMemcard, bool isSlotA); + void ChooseSIDevice(std::string deviceName, int deviceNum); void WiiSettingsChanged(wxCommandEvent& event); void ISOPathsSelectionChanged(wxCommandEvent& event); void AddRemoveISOPaths(wxCommandEvent& event); @@ -270,9 +290,7 @@ class CConfigMain void DVDRootChanged(wxFileDirPickerEvent& event); void FillChoiceBox(wxChoice* _pChoice, int _PluginType, const std::string& _SelectFilename); - void CallConfig(wxChoice* _pChoice); - bool GetFilename(wxChoice* _pChoice, std::string& _rFilename); }; diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index 23ff824cb4..104c898208 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -510,8 +510,7 @@ void CFrame::OnStop(wxCommandEvent& WXUNUSED (event)) void CFrame::OnConfigMain(wxCommandEvent& WXUNUSED (event)) { CConfigMain ConfigMain(this); - ConfigMain.ShowModal(); - if (ConfigMain.bRefreshList) + if (ConfigMain.ShowModal() == wxID_OK) m_GameListCtrl->Update(ConfigMain.bRefreshCache); }