diff --git a/desmume/ChangeLog b/desmume/ChangeLog index 2f440432a..6cef5e509 100644 --- a/desmume/ChangeLog +++ b/desmume/ChangeLog @@ -4,8 +4,11 @@ General/Core: bug: return Z1 and Z2 from TSC (fixes some touch logic) bug: fix a ton of old, broken cpu opcodes and CP15 logic enh: substantial improvements to wifi emulation + enh: more realistic exception handling + enh: piano controller emulation Graphics: + bug: edge marking colors were wrong Windows: diff --git a/desmume/src/Makefile.am b/desmume/src/Makefile.am index 9bb9034c0..59ad4ed2a 100644 --- a/desmume/src/Makefile.am +++ b/desmume/src/Makefile.am @@ -48,7 +48,7 @@ libdesmume_a_SOURCES = \ utils/decrypt/decrypt.h utils/decrypt/header.cpp utils/decrypt/header.h \ utils/task.cpp utils/task.h \ addons.cpp addons.h \ - addons/compactFlash.cpp addons/gbagame.cpp addons/none.cpp addons/rumblepak.cpp addons/guitarGrip.cpp addons/expMemory.cpp fs.h \ + addons/compactFlash.cpp addons/gbagame.cpp addons/none.cpp addons/rumblepak.cpp addons/guitarGrip.cpp addons/expMemory.cpp addons/piano.cpp fs.h \ cheatSystem.cpp cheatSystem.h \ texcache.cpp texcache.h rasterize.cpp rasterize.h \ metaspu/metaspu.cpp metaspu/metaspu.h \ diff --git a/desmume/src/addons.cpp b/desmume/src/addons.cpp index 27fbbd61b..4fb642b79 100644 --- a/desmume/src/addons.cpp +++ b/desmume/src/addons.cpp @@ -36,6 +36,7 @@ extern ADDONINTERFACE addonRumblePak; extern ADDONINTERFACE addonGBAgame; extern ADDONINTERFACE addonGuitarGrip; extern ADDONINTERFACE addonExpMemory; +extern ADDONINTERFACE addonPiano; //extern ADDONINTERFACE addonExternalMic; ADDONINTERFACE addonList[NDS_ADDON_COUNT] = { @@ -44,7 +45,8 @@ ADDONINTERFACE addonList[NDS_ADDON_COUNT] = { addonRumblePak, addonGBAgame, addonGuitarGrip, - addonExpMemory + addonExpMemory, + addonPiano, }; ADDONINTERFACE addon = addonCFlash; // default none pak diff --git a/desmume/src/addons.h b/desmume/src/addons.h index 341d4e48a..ef9f09f0a 100644 --- a/desmume/src/addons.h +++ b/desmume/src/addons.h @@ -63,6 +63,7 @@ enum { NDS_ADDON_GBAGAME, // gba game in slot NDS_ADDON_GUITARGRIP, // Guitar Grip NDS_ADDON_EXPMEMORY, // Memory Expansion + NDS_ADDON_PIANO, // Piano //NDS_ADDON_EXTERNALMIC, NDS_ADDON_COUNT // use for counter addons - MUST TO BE LAST!!! }; @@ -89,5 +90,6 @@ extern void addonsReset(); // Reset addon extern BOOL addonsChangePak(u8 type); // change current adddon extern void guitarGrip_setKey(bool green, bool red, bool yellow, bool blue); // Guitar grip keys +extern void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic); //piano keys #endif diff --git a/desmume/src/addons/piano.cpp b/desmume/src/addons/piano.cpp new file mode 100644 index 000000000..3d6706704 --- /dev/null +++ b/desmume/src/addons/piano.cpp @@ -0,0 +1,147 @@ +/* Copyright (C) 2010 DeSmuME team + + This file is part of DeSmuME + + DeSmuME is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DeSmuME is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DeSmuME; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#include "../addons.h" +#include + +static u16 pianoKeyStatus = 0; + +static BOOL piano_init(void) { return (TRUE); } +static void piano_reset(void) +{ + //INFO("piano: Reset\n"); + pianoKeyStatus = 0; +} + +static void piano_close(void) {} +static void piano_config(void) {} +static void piano_write08(u32 adr, u8 val) +{ + //INFO("piano: write 08 at 0x%08X = %02X\n", adr, val); +} +static void piano_write16(u32 adr, u16 val) +{ + //INFO("piano: write 16 at 0x%08X = %04X\n", adr, val); +} +static void piano_write32(u32 adr, u32 val) +{ + //INFO("piano: write 32 at 0x%08X = %08X\n", adr, val); +} +extern int currFrameCounter; +static u8 piano_read08(u32 adr) +{ + //INFO("piano: read 08 at 0x%08X\n", adr); + + //the actual keyboard output + + //byte:bit + //0x09FFFFFE:0 = C + //0x09FFFFFE:1 = C# + //0x09FFFFFE:2 = D + //0x09FFFFFE:3 = D# + //0x09FFFFFE:4 = E + //0x09FFFFFE:5 = F + //0x09FFFFFE:6 = F# + //0x09FFFFFE:7 = G + //0x09FFFFFE:0 = G# + //0x09FFFFFE:1 = A + //0x09FFFFFF:2 = A# + //0x09FFFFFF:3 = ? + //0x09FFFFFF:4 = ? + //0x09FFFFFF:5 = B + //0x09FFFFFF:6 = hiC + //0x09FFFFFF:7 = ? + + //deassert bit if key is pressed + + //LOG("PIANO: %04X\n",pianoKeyStatus); + + if(adr == 0x09FFFFFE) return ~(pianoKeyStatus&0xFF); + if(adr == 0x09FFFFFF) return ~((pianoKeyStatus>>8)&0xFF); + + return (0xFF); +} +static u16 piano_read16(u32 adr) +{ + //LOG("piano: read 16 at 0x%08X\n", adr); + + //sufficient for the device to be identified + if(adr == 0x080000BE) return (0x07FF); + if(adr == 0x0801FFFE) return (0x07FF); + + return (0xFFFF); +} +static u32 piano_read32(u32 adr) +{ + //LOG("piano: read 32 at 0x%08X\n", adr); + return (0xFFFFFFFF); +} +static void piano_info(char *info) { strcpy(info, "Piano for EasyPiano"); } + +void piano_setKey(bool c, bool cs, bool d, bool ds, bool e, bool f, bool fs, bool g, bool gs, bool a, bool as, bool b, bool hic) +{ + //0x09FFFFFE:0 = C + //0x09FFFFFE:1 = C# + //0x09FFFFFE:2 = D + //0x09FFFFFE:3 = D# + //0x09FFFFFE:4 = E + //0x09FFFFFE:5 = F + //0x09FFFFFE:6 = F# + //0x09FFFFFE:7 = G + //0x09FFFFFE:0 = G# + //0x09FFFFFE:1 = A + //0x09FFFFFF:2 = A# + //0x09FFFFFF:3 = ? + //0x09FFFFFF:4 = ? + //0x09FFFFFF:5 = B + //0x09FFFFFF:6 = hiC + //0x09FFFFFF:7 = ? + +#define BIT(N,v) ((v)?(1<<(N)):0) + pianoKeyStatus = + BIT(0,c) | + BIT(1,cs) | + BIT(2,d) | + BIT(3,ds) | + BIT(4,e) | + BIT(5,f) | + BIT(6,fs) | + BIT(7,g) | + BIT(8,gs) | + BIT(9,a) | + BIT(10,as) | + BIT(13,b) | + BIT(14,hic) + ; + pianoKeyStatus = pianoKeyStatus; +} + +ADDONINTERFACE addonPiano = { + "Piano", + piano_init, + piano_reset, + piano_close, + piano_config, + piano_write08, + piano_write16, + piano_write32, + piano_read08, + piano_read16, + piano_read32, + piano_info}; diff --git a/desmume/src/armcpu.cpp b/desmume/src/armcpu.cpp index dc1325eb8..0f82b696e 100644 --- a/desmume/src/armcpu.cpp +++ b/desmume/src/armcpu.cpp @@ -570,11 +570,6 @@ u32 armcpu_exec() u32 cFetch = 0; u32 cExecute = 0; - if(NDS_ARM9.instruct_adr == 0x0201125C) - { - int zzz=9; - } - //this assert is annoying. but sometimes it is handy. //assert(ARMPROC.instruct_adr!=0x00000000); #ifdef DEVELOPER diff --git a/desmume/src/debug.cpp b/desmume/src/debug.cpp index 9f6b6e8da..c8d4a1e09 100644 --- a/desmume/src/debug.cpp +++ b/desmume/src/debug.cpp @@ -66,6 +66,12 @@ void HandleDebugEvent_ACL_Exception() armcpu_exception(DebugEventData.cpu(),EXCEPTION_DATA_ABORT); } + +static bool CheckRange(u32 adr, u32 min, u32 len) +{ + return (adr>=min && adr + + diff --git a/desmume/src/windows/DeSmuME_2008.vcproj b/desmume/src/windows/DeSmuME_2008.vcproj index 74fb085a2..a9adab96d 100644 --- a/desmume/src/windows/DeSmuME_2008.vcproj +++ b/desmume/src/windows/DeSmuME_2008.vcproj @@ -1,7 +1,7 @@ + + diff --git a/desmume/src/windows/gbaslot_config.cpp b/desmume/src/windows/gbaslot_config.cpp index f52ef9bef..30dfdb725 100644 --- a/desmume/src/windows/gbaslot_config.cpp +++ b/desmume/src/windows/gbaslot_config.cpp @@ -38,6 +38,7 @@ ADDON_CFLASH_MODE tmp_CFlashMode = ADDON_CFLASH_MODE_RomPath; HWND OKbutton = NULL; bool _OKbutton = false; SGuitar tmp_Guitar; +SPiano tmp_Piano; bool needReset = true; //these are the remembered preset values for directory and filename @@ -342,14 +343,100 @@ INT_PTR CALLBACK GbaSlotGuitarGrip(HWND dialog, UINT msg,WPARAM wparam,LPARAM lp return FALSE; } +INT_PTR CALLBACK GbaSlotPiano(HWND dialog, UINT msg,WPARAM wparam,LPARAM lparam) +{ + int which = 0; + + switch(msg) + { + case WM_INITDIALOG: + { + _OKbutton = TRUE; + SendDlgItemMessage(dialog,IDC_PIANO_C,WM_USER+44,tmp_Piano.C,0); + SendDlgItemMessage(dialog,IDC_PIANO_CS,WM_USER+44,tmp_Piano.CS,0); + SendDlgItemMessage(dialog,IDC_PIANO_D,WM_USER+44,tmp_Piano.D,0); + SendDlgItemMessage(dialog,IDC_PIANO_DS,WM_USER+44,tmp_Piano.DS,0); + SendDlgItemMessage(dialog,IDC_PIANO_E,WM_USER+44,tmp_Piano.E,0); + SendDlgItemMessage(dialog,IDC_PIANO_F,WM_USER+44,tmp_Piano.F,0); + SendDlgItemMessage(dialog,IDC_PIANO_FS,WM_USER+44,tmp_Piano.FS,0); + SendDlgItemMessage(dialog,IDC_PIANO_G,WM_USER+44,tmp_Piano.G,0); + SendDlgItemMessage(dialog,IDC_PIANO_GS,WM_USER+44,tmp_Piano.GS,0); + SendDlgItemMessage(dialog,IDC_PIANO_A,WM_USER+44,tmp_Piano.A,0); + SendDlgItemMessage(dialog,IDC_PIANO_AS,WM_USER+44,tmp_Piano.AS,0); + SendDlgItemMessage(dialog,IDC_PIANO_B,WM_USER+44,tmp_Piano.B,0); + SendDlgItemMessage(dialog,IDC_PIANO_HIC,WM_USER+44,tmp_Piano.HIC,0); + if (temp_type != addon_type) + needReset = true; + else + needReset = false; + + return TRUE; + } + + case WM_USER+46: + SendDlgItemMessage(dialog,IDC_PIANO_C,WM_USER+44,tmp_Piano.C,0); + SendDlgItemMessage(dialog,IDC_PIANO_CS,WM_USER+44,tmp_Piano.CS,0); + SendDlgItemMessage(dialog,IDC_PIANO_D,WM_USER+44,tmp_Piano.D,0); + SendDlgItemMessage(dialog,IDC_PIANO_DS,WM_USER+44,tmp_Piano.DS,0); + SendDlgItemMessage(dialog,IDC_PIANO_E,WM_USER+44,tmp_Piano.E,0); + SendDlgItemMessage(dialog,IDC_PIANO_F,WM_USER+44,tmp_Piano.F,0); + SendDlgItemMessage(dialog,IDC_PIANO_FS,WM_USER+44,tmp_Piano.FS,0); + SendDlgItemMessage(dialog,IDC_PIANO_G,WM_USER+44,tmp_Piano.G,0); + SendDlgItemMessage(dialog,IDC_PIANO_GS,WM_USER+44,tmp_Piano.GS,0); + SendDlgItemMessage(dialog,IDC_PIANO_A,WM_USER+44,tmp_Piano.A,0); + SendDlgItemMessage(dialog,IDC_PIANO_AS,WM_USER+44,tmp_Piano.AS,0); + SendDlgItemMessage(dialog,IDC_PIANO_B,WM_USER+44,tmp_Piano.B,0); + SendDlgItemMessage(dialog,IDC_PIANO_HIC,WM_USER+44,tmp_Piano.HIC,0); + return TRUE; + + case WM_USER+43: + //MessageBox(hDlg,"USER+43 CAUGHT","moo",MB_OK); + which = GetDlgCtrlID((HWND)lparam); + switch(which) + { + case IDC_PIANO_C: tmp_Piano.C = wparam; break; + case IDC_PIANO_CS: tmp_Piano.CS = wparam; break; + case IDC_PIANO_D: tmp_Piano.D = wparam; break; + case IDC_PIANO_DS: tmp_Piano.DS = wparam; break; + case IDC_PIANO_E: tmp_Piano.E = wparam; break; + case IDC_PIANO_F: tmp_Piano.F = wparam; break; + case IDC_PIANO_FS: tmp_Piano.FS = wparam; break; + case IDC_PIANO_G: tmp_Piano.G = wparam; break; + case IDC_PIANO_GS: tmp_Piano.GS = wparam; break; + case IDC_PIANO_A: tmp_Piano.A = wparam; break; + case IDC_PIANO_AS: tmp_Piano.AS = wparam; break; + case IDC_PIANO_B: tmp_Piano.B = wparam; break; + case IDC_PIANO_HIC: tmp_Piano.HIC = wparam; break; + + } + + SendDlgItemMessage(dialog,IDC_PIANO_C,WM_USER+44,tmp_Piano.C,0); + SendDlgItemMessage(dialog,IDC_PIANO_CS,WM_USER+44,tmp_Piano.CS,0); + SendDlgItemMessage(dialog,IDC_PIANO_D,WM_USER+44,tmp_Piano.D,0); + SendDlgItemMessage(dialog,IDC_PIANO_DS,WM_USER+44,tmp_Piano.DS,0); + SendDlgItemMessage(dialog,IDC_PIANO_E,WM_USER+44,tmp_Piano.E,0); + SendDlgItemMessage(dialog,IDC_PIANO_F,WM_USER+44,tmp_Piano.F,0); + SendDlgItemMessage(dialog,IDC_PIANO_FS,WM_USER+44,tmp_Piano.FS,0); + SendDlgItemMessage(dialog,IDC_PIANO_G,WM_USER+44,tmp_Piano.G,0); + SendDlgItemMessage(dialog,IDC_PIANO_GS,WM_USER+44,tmp_Piano.GS,0); + SendDlgItemMessage(dialog,IDC_PIANO_A,WM_USER+44,tmp_Piano.A,0); + SendDlgItemMessage(dialog,IDC_PIANO_AS,WM_USER+44,tmp_Piano.AS,0); + SendDlgItemMessage(dialog,IDC_PIANO_B,WM_USER+44,tmp_Piano.B,0); + SendDlgItemMessage(dialog,IDC_PIANO_HIC,WM_USER+44,tmp_Piano.HIC,0); + PostMessage(dialog,WM_NEXTDLGCTL,0,0); + return true; + } + return FALSE; +} + u32 GBAslot_IDDs[NDS_ADDON_COUNT] = { IDD_GBASLOT_NONE, IDD_GBASLOT_CFLASH, IDD_GBASLOT_RUMBLEPAK, IDD_GBASLOT_GBAGAME, IDD_GBASLOT_GUITARGRIP, - // todo - IDD_GBASLOT_NONE + IDD_GBASLOT_NONE, //expmem + IDD_GBASLOT_PIANO }; DLGPROC GBAslot_Procs[NDS_ADDON_COUNT] = { @@ -357,9 +444,9 @@ DLGPROC GBAslot_Procs[NDS_ADDON_COUNT] = { GbaSlotCFlash, GbaSlotRumblePak, GbaSlotGBAgame, - //todo GbaSlotGuitarGrip, - GbaSlotNone + GbaSlotNone, //expmem + GbaSlotPiano }; @@ -450,6 +537,7 @@ void GBAslotDialog(HWND hwnd) strcpy(tmp_cflash_path, win32_CFlash_cfgDirectory.c_str()); strcpy(tmp_gbagame_filename, GBAgameName); memcpy(&tmp_Guitar, &Guitar, sizeof(Guitar)); + memcpy(&tmp_Piano, &Piano, sizeof(Piano)); tmp_CFlashMode = CFlash_Mode; _OKbutton = false; needReset = true; @@ -501,6 +589,27 @@ void GBAslotDialog(HWND hwnd) else needReset = false; break; + case NDS_ADDON_PIANO: + memcpy(&Piano, &tmp_Piano, sizeof(tmp_Piano)); + Piano.Enabled = true; + WritePrivateProfileInt("GBAslot.Piano","C",Piano.C,IniName); + WritePrivateProfileInt("GBAslot.Piano","CS",Piano.CS,IniName); + WritePrivateProfileInt("GBAslot.Piano","D",Piano.D,IniName); + WritePrivateProfileInt("GBAslot.Piano","DS",Piano.DS,IniName); + WritePrivateProfileInt("GBAslot.Piano","E",Piano.E,IniName); + WritePrivateProfileInt("GBAslot.Piano","F",Piano.F,IniName); + WritePrivateProfileInt("GBAslot.Piano","FS",Piano.FS,IniName); + WritePrivateProfileInt("GBAslot.Piano","G",Piano.G,IniName); + WritePrivateProfileInt("GBAslot.Piano","GS",Piano.GS,IniName); + WritePrivateProfileInt("GBAslot.Piano","A",Piano.A,IniName); + WritePrivateProfileInt("GBAslot.Piano","AS",Piano.AS,IniName); + WritePrivateProfileInt("GBAslot.Piano","B",Piano.B,IniName); + WritePrivateProfileInt("GBAslot.Piano","HIC",Piano.HIC,IniName); + if (temp_type != addon_type) + needReset = true; + else + needReset = false; + break; case NDS_ADDON_EXPMEMORY: break; default: diff --git a/desmume/src/windows/inputdx.cpp b/desmume/src/windows/inputdx.cpp index da5567ed8..99f923375 100644 --- a/desmume/src/windows/inputdx.cpp +++ b/desmume/src/windows/inputdx.cpp @@ -246,10 +246,11 @@ SJoypad DefaultJoypad[16] = { SJoypad Joypad[16]; +SGuitar Guitar; SGuitar DefaultGuitar = { false, 'E', 'R', 'T', 'Y' }; -SGuitar Guitar; -u8 guitarState = 0; +SPiano Piano; +SPiano DefaultPiano = { false, 'Z', 'S', 'X', 'D', 'C', 'V', 'G', 'B', 'H', 'N', 'J', 'M', VK_OEM_COMMA }; bool allowUpAndDown = false; @@ -362,6 +363,15 @@ static void ReadGuitarControl(const char* name, WORD& output) } } +static void ReadPianoControl(const char* name, WORD& output) +{ + UINT temp; + temp = GetPrivateProfileInt("GBAslot.Piano",name,-1,IniName); + if(temp != -1) { + output = temp; + } +} + void LoadHotkeyConfig() { SCustomKey *key = &CustomKeys.key(0); @@ -399,6 +409,24 @@ static void LoadGuitarConfig() #undef DO } +static void LoadPianoConfig() +{ + memcpy(&Piano,&DefaultPiano,sizeof(Piano)); + + //Piano.Enabled = true; +#define DO(X) ReadPianoControl(#X,Piano.X); + DO(C); DO(CS); + DO(D); DO(DS); + DO(E); + DO(F); DO(FS); + DO(G); DO(GS); + DO(A); DO(AS); + DO(B); + DO(HIC); +#undef DO +} + + static void LoadInputConfig() { memcpy(&Joypad,&DefaultJoypad,sizeof(Joypad)); @@ -2412,6 +2440,7 @@ void input_init() LoadInputConfig(); LoadHotkeyConfig(); LoadGuitarConfig(); + LoadPianoConfig(); di_init(); FeedbackON = input_feedback; @@ -2509,6 +2538,25 @@ void input_acquire() bool gB=!S9xGetState(Guitar.BLUE); guitarGrip_setKey(gG, gR, gY, gB); } + + //etc. same as above + if (Piano.Enabled) + { + bool c=!S9xGetState(Piano.C); + bool cs=!S9xGetState(Piano.CS); + bool d=!S9xGetState(Piano.D); + bool ds=!S9xGetState(Piano.DS); + bool e=!S9xGetState(Piano.E); + bool f=!S9xGetState(Piano.F); + bool fs=!S9xGetState(Piano.FS); + bool g=!S9xGetState(Piano.G); + bool gs=!S9xGetState(Piano.GS); + bool a=!S9xGetState(Piano.A); + bool as=!S9xGetState(Piano.AS); + bool b=!S9xGetState(Piano.B); + bool hic=!S9xGetState(Piano.HIC); + piano_setKey(c,cs,d,ds,e,f,fs,g,gs,a,as,b,hic); + } } // only runs once per frame (always after input_acquire has been called at least once). diff --git a/desmume/src/windows/inputdx.h b/desmume/src/windows/inputdx.h index 6aab0e854..fe0b8fe98 100644 --- a/desmume/src/windows/inputdx.h +++ b/desmume/src/windows/inputdx.h @@ -132,7 +132,13 @@ struct SGuitar { WORD BLUE; }; +struct SPiano { + BOOL Enabled; + WORD C,CS,D,DS,E,F,FS,G,GS,A,AS,B,HIC; +}; + extern SGuitar Guitar; +extern SPiano Piano; #endif diff --git a/desmume/src/windows/main.cpp b/desmume/src/windows/main.cpp index 1f61bcfc7..a8247ed2d 100644 --- a/desmume/src/windows/main.cpp +++ b/desmume/src/windows/main.cpp @@ -2496,6 +2496,7 @@ int _main() input_init(); if (addon_type == NDS_ADDON_GUITARGRIP) Guitar.Enabled = true; + if (addon_type == NDS_ADDON_PIANO) Piano.Enabled = true; LOG("Init NDS\n"); @@ -2550,6 +2551,8 @@ int _main() break; case NDS_ADDON_EXPMEMORY: break; + case NDS_ADDON_PIANO: + break; default: addon_type = NDS_ADDON_NONE; break; diff --git a/desmume/src/windows/resource.h b/desmume/src/windows/resource.h index 3a271daf7..ad5f6ccd1 100644 --- a/desmume/src/windows/resource.h +++ b/desmume/src/windows/resource.h @@ -367,12 +367,17 @@ #define IDC_ADDONS_LIST 1033 #define IDC_BUTTON3 1033 #define IDC_SOUND_UNMUTE_ALL 1033 +#define IDC_PIANO_C 1033 #define IDC_ADDONS_INFO 1034 #define IDC_BORDER 1034 +#define IDC_PIANO_CS 1034 #define IDC_BBROWSE 1035 +#define IDC_PIANO_D 1035 #define IDC_PATHIMG 1036 +#define IDC_PIANO_DS 1036 #define IDC_PATH 1037 #define IDC_PATHGAME 1037 +#define IDC_PIANO_E 1037 #define IDC_RFILE 1038 #define IDC_RFOLDER 1039 #define IDC_BBROWSE2 1040 @@ -380,13 +385,22 @@ #define IDC_BRESTART 1042 #define IDC_BVIEW 1043 #define IDC_BSEARCH 1044 +#define IDC_PIANO_F 1044 #define IDC_RADIO1 1045 +#define IDC_PIANO_FS 1045 #define IDC_RADIO2 1046 +#define IDC_PIANO_GS 1046 #define IDC_RADIO3 1047 +#define IDC_PIANO_B 1047 #define IDC_RADIO4 1048 +#define IDC_PIANO_A 1048 #define IDC_RADIO5 1049 +#define IDC_PIANO_AS 1049 #define IDC_RADIO6 1050 +#define IDC_PIANO_G 1050 #define IDC_RADIO7 1051 +#define IDC_PIANO_DS3 1051 +#define IDC_PIANO_HIC 1051 #define IDC_RADIO8 1052 #define IDC_LIST1 1056 #define IDC_BADD_AR 1057 @@ -759,6 +773,7 @@ #define IDC_IOREG 6001 #define IDD_CHEAT_ADD_XX_CODE 10005 #define IDD_GBASLOT_GUITARGRIP 10009 +#define IDD_GBASLOT_PIANO 10010 #define IDM_FILE_STOPAVI 40000 #define IDM_SCREENSEP_NONE 40000 #define IDM_FILE_STOPWAV 40001 @@ -915,9 +930,9 @@ // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 121 +#define _APS_NEXT_RESOURCE_VALUE 122 #define _APS_NEXT_COMMAND_VALUE 40079 -#define _APS_NEXT_CONTROL_VALUE 1033 +#define _APS_NEXT_CONTROL_VALUE 1037 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/desmume/src/windows/resources.rc b/desmume/src/windows/resources.rc index 32a3c3821..5cbf629d5 100644 Binary files a/desmume/src/windows/resources.rc and b/desmume/src/windows/resources.rc differ