From: <mta...@us...> - 2010-03-28 20:18:55
|
Revision: 3449 http://desmume.svn.sourceforge.net/desmume/?rev=3449&view=rev Author: mtabachenko Date: 2010-03-28 20:18:49 +0000 (Sun, 28 Mar 2010) Log Message: ----------- core: - add support for 16Mbit, 32Mbit, 64Mbit, 128Mbit, 256Mbit, 512Mbit flash memory card :) (NAND not implemented yet); - fix a "div by zero" flag; winport: - now savetypes in menu create dynamically; - fix x64 build; Modified Paths: -------------- trunk/desmume/src/MMU.cpp trunk/desmume/src/mc.cpp trunk/desmume/src/mc.h trunk/desmume/src/types.h trunk/desmume/src/windows/CWindow.cpp trunk/desmume/src/windows/CWindow.h trunk/desmume/src/windows/main.cpp trunk/desmume/src/windows/resource.h trunk/desmume/src/windows/resources.rc Modified: trunk/desmume/src/MMU.cpp =================================================================== --- trunk/desmume/src/MMU.cpp 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/MMU.cpp 2010-03-28 20:18:49 UTC (rev 3449) @@ -1079,7 +1079,10 @@ { res = ((num < 0) ? 1 : -1); mod = num; - MMU_new.div.div0 = 1; + + // the DIV0 flag in DIVCNT is set only if the full 64bit DIV_DENOM value is zero, even in 32bit mode + if ((s64)T1ReadQuad(MMU.MMU_MEM[ARMCPU_ARM9][0x40], 0x298) == 0) + MMU_new.div.div0 = 1; } else { @@ -1102,6 +1105,8 @@ NDS_Reschedule(); } +// TODO: +// NAND flash support (used in Made in Ore/WariWare D.I.Y.) template<int PROCNUM> void FASTCALL MMU_writeToGCControl(u32 val) { @@ -1138,6 +1143,7 @@ } break; case CardMode_KEY2: + INFO("Cartridge: KEY2 mode unsupported.\n"); break; } @@ -1166,7 +1172,8 @@ card.transfer_count = 1; } break; - // Nand Write? + + // Nand Write? ---- PROGRAM for INTERNAL DATA MOVE/RANDOM DATA INPUT //case 0x8B: case 0x85: { @@ -1320,6 +1327,7 @@ // Nand Status? case 0xD6: //0x80 == busy + // Made in Ore/WariWare D.I.Y. need set value to 0x80 val = 0x20; //0x20 == ready break; @@ -1344,7 +1352,9 @@ if(card.address >= gameInfo.romsize) { DEBUG_Notify.ReadBeyondEndOfCart(card.address,gameInfo.romsize); + val = 0xFFFFFFFF; } + else //but, this is actually handled by the cart rom buffer being oversized and full of 0xFF. //is this a good idea? We think so. val = T1ReadLong(MMU.CART_ROM, card.address & MMU.CART_ROM_MASK); @@ -3039,7 +3049,7 @@ case REG_SQRTCNT: MMU_new.sqrt.write16((u16)val); return; case REG_DIVCNT: MMU_new.div.write16((u16)val); return; - case REG_POWCNT1: writereg_POWCNT1(32,adr,val); break; + case REG_POWCNT1: writereg_POWCNT1(32,adr,val); break; //fog table: only write bottom 7 bits case eng_3D_FOG_TABLE+0x00: case eng_3D_FOG_TABLE+0x04: case eng_3D_FOG_TABLE+0x08: case eng_3D_FOG_TABLE+0x0C: Modified: trunk/desmume/src/mc.cpp =================================================================== --- trunk/desmume/src/mc.cpp 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/mc.cpp 2010-03-28 20:18:49 UTC (rev 3449) @@ -29,13 +29,11 @@ #include "NDSSystem.h" //temporary hack until we have better error reporting facilities -#ifdef _MSC_VER -#ifdef _XBOX -#include <xtl.h> -#else +#ifdef _WINDOWS #include <windows.h> +#elif _XBOX +#include <xtl.h> // it`s really need? #endif -#endif #define FW_CMD_READ 0x3 #define FW_CMD_WRITEDISABLE 0x4 @@ -71,11 +69,24 @@ static const char* kDesmumeSaveCookie = "|-DESMUME SAVE-|"; -static const u32 saveSizes[] = {512,8*1024,32*1024,64*1024,256*1024,512*1024,1024*1024,0xFFFFFFFF}; +static const u32 saveSizes[] = {512, // 4k + 8*1024, // 64k + 32*1024, // 512k + 64*1024, // 1Mbit + 256*1024, // 2Mbit + 512*1024, // 4Mbit + 1024*1024, // 8Mbit + 2048*1024, // 16Mbit + 4096*1024, // 32Mbit + 8192*1024, // 64Mbit + 16384*1024, // 128Mbit + 32768*1024, // 256Mbit + 65536*1024, // 512Mbit + 0xFFFFFFFF}; static const u32 saveSizes_count = ARRAY_SIZE(saveSizes); //the lookup table from user save types to save parameters -static const int save_types[8][2] = { +static const int save_types[][2] = { {MC_TYPE_AUTODETECT,1}, {MC_TYPE_EEPROM1,MC_SIZE_4KBITS}, {MC_TYPE_EEPROM2,MC_SIZE_64KBITS}, @@ -83,9 +94,32 @@ {MC_TYPE_FRAM,MC_SIZE_256KBITS}, {MC_TYPE_FLASH,MC_SIZE_2MBITS}, {MC_TYPE_FLASH,MC_SIZE_4MBITS}, - {MC_TYPE_FLASH,MC_SIZE_8MBITS} + {MC_TYPE_FLASH,MC_SIZE_8MBITS}, + {MC_TYPE_FLASH,MC_SIZE_16MBITS}, + {MC_TYPE_FLASH,MC_SIZE_32MBITS}, + {MC_TYPE_FLASH,MC_SIZE_64MBITS}, + {MC_TYPE_FLASH,MC_SIZE_128MBITS}, + {MC_TYPE_FLASH,MC_SIZE_256MBITS}, + {MC_TYPE_FLASH,MC_SIZE_512MBITS} }; +const char *save_names[] = { + "EEPROM 4kbit", + "EEPROM 64kbit", + "EEPROM 512kbit", + "FRAM 256kbit", + "FLASH 2Mbit", + "FLASH 4Mbit", + "FLASH 8Mbit", + "FLASH 16Mbit", + "FLASH 32Mbit", + "FLASH 64Mbit", + "FLASH 128Mbit", + "FLASH 256Mbit", + "FLASH 512Mbit" +}; + + void backup_setManualBackupType(int type) { CommonSettings.manualBackupType = type; @@ -354,11 +388,9 @@ case 0: case 1: printf("Catastrophic error while autodetecting save type.\nIt will need to be specified manually\n"); - #ifdef _MSC_VER - #ifndef _XBOX + #ifdef _WINDOWS MessageBox(0,"Catastrophic Error Code: Camel;\nyour save type has not been autodetected correctly;\nplease report to developers",0,0); #endif - #endif addr_size = 1; //choose 1 just to keep the busted savefile from growing too big break; case 2: Modified: trunk/desmume/src/mc.h =================================================================== --- trunk/desmume/src/mc.h 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/mc.h 2010-03-28 20:18:49 UTC (rev 3449) @@ -28,6 +28,7 @@ #include "types.h" #include "emufile.h" +#define MAX_SAVE_TYPES 13 #define MC_TYPE_AUTODETECT 0x0 #define MC_TYPE_EEPROM1 0x1 #define MC_TYPE_EEPROM2 0x2 @@ -43,7 +44,11 @@ #define MC_SIZE_4MBITS 0x080000 #define MC_SIZE_8MBITS 0x100000 #define MC_SIZE_16MBITS 0x200000 +#define MC_SIZE_32MBITS 0x400000 #define MC_SIZE_64MBITS 0x800000 +#define MC_SIZE_128MBITS 0x1000000 +#define MC_SIZE_256MBITS 0x2000000 +#define MC_SIZE_512MBITS 0x4000000 typedef struct { @@ -131,7 +136,7 @@ void loadfile(); bool _loadfile(const char *fname); void ensure(u32 addr); - void flush(); + bool flushPending, lazyFlushPending; }; @@ -149,5 +154,7 @@ void backup_setManualBackupType(int type); +extern const char *save_names[]; + #endif /*__FW_H__*/ Modified: trunk/desmume/src/types.h =================================================================== --- trunk/desmume/src/types.h 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/types.h 2010-03-28 20:18:49 UTC (rev 3449) @@ -28,7 +28,7 @@ #else #define _WINDOWS #ifdef _M_X64 - #define _WIN64 + //#define _WIN64 //already defined in x64 compiler #else //#define _WIN32 //already defined #endif Modified: trunk/desmume/src/windows/CWindow.cpp =================================================================== --- trunk/desmume/src/windows/CWindow.cpp 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/windows/CWindow.cpp 2010-03-28 20:18:49 UTC (rev 3449) @@ -578,6 +578,11 @@ return SetMenu(hwnd, hmenu)!=FALSE; } +bool WINCLASS::addMenuItem(u32 item, bool byPos, LPCMENUITEMINFO info) +{ + return InsertMenuItem(hmenu, item, byPos, info); +} + DWORD WINCLASS::checkMenu(UINT idd, bool check) { return CheckMenuItem(hmenu, idd, MF_BYCOMMAND | (check?MF_CHECKED:MF_UNCHECKED)); Modified: trunk/desmume/src/windows/CWindow.h =================================================================== --- trunk/desmume/src/windows/CWindow.h 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/windows/CWindow.h 2010-03-28 20:18:49 UTC (rev 3449) @@ -236,6 +236,7 @@ HMENU menu); bool setMenu(HMENU menu); + bool addMenuItem(u32 item, bool byPos, LPCMENUITEMINFO info); DWORD checkMenu(UINT idd, bool check); void Show(int mode); Modified: trunk/desmume/src/windows/main.cpp =================================================================== --- trunk/desmume/src/windows/main.cpp 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/windows/main.cpp 2010-03-28 20:18:49 UTC (rev 3449) @@ -1990,6 +1990,8 @@ int MenuInit() { + MENUITEMINFO mm = {0}; + mainMenu = LoadMenu(hAppInst, MAKEINTRESOURCE(MENU_PRINCIPAL)); //Load Menu, and store handle if (!MainWindow->setMenu(mainMenu)) return 0; @@ -2003,6 +2005,23 @@ DeleteMenu(fileMenu, IDM_FILE_RECORDUSERSPUWAV, MF_BYCOMMAND); #endif + for(int i=0; i<MAX_SAVE_TYPES; i++) + { + memset(&mm, 0, sizeof(MENUITEMINFO)); + + mm.cbSize = sizeof(MENUITEMINFO); + mm.fMask = MIIM_TYPE; + mm.fType = MFT_STRING; + mm.dwTypeData = (LPSTR)save_names[i]; + + MainWindow->addMenuItem(IDC_SAVETYPE, false, &mm); + } + memset(&mm, 0, sizeof(MENUITEMINFO)); + mm.cbSize = sizeof(MENUITEMINFO); + mm.fMask = MIIM_TYPE; + mm.fType = MFT_SEPARATOR; + MainWindow->addMenuItem(IDC_SAVETYPE, false, &mm); + return 1; } @@ -3726,11 +3745,11 @@ MainWindow->checkMenu(IDM_CHEATS_DISABLE, CommonSettings.cheatsDisable == true); //Save type - const int savelist[] = {IDC_SAVETYPE1,IDC_SAVETYPE2,IDC_SAVETYPE3,IDC_SAVETYPE4,IDC_SAVETYPE5,IDC_SAVETYPE6,IDC_SAVETYPE7,IDC_SAVETYPE8}; - for(int i=0;i<8;i++) - MainWindow->checkMenu(savelist[i], false); - MainWindow->checkMenu(savelist[CommonSettings.manualBackupType], true); + for(int i=0;i<MAX_SAVE_TYPES;i++) + MainWindow->checkMenu(IDC_SAVETYPE+i, false); + MainWindow->checkMenu(IDC_SAVETYPE+CommonSettings.manualBackupType, true); + // recent/active scripts menu PopulateLuaSubmenu(); @@ -4997,15 +5016,6 @@ WritePrivateProfileInt("Focus", "BackgroundPause", (int)lostFocusPause, IniName); return 0; - case IDC_SAVETYPE1: backup_setManualBackupType(0); return 0; - case IDC_SAVETYPE2: backup_setManualBackupType(1); return 0; - case IDC_SAVETYPE3: backup_setManualBackupType(2); return 0; - case IDC_SAVETYPE4: backup_setManualBackupType(3); return 0; - case IDC_SAVETYPE5: backup_setManualBackupType(4); return 0; - case IDC_SAVETYPE6: backup_setManualBackupType(5); return 0; - case IDC_SAVETYPE7: backup_setManualBackupType(6); return 0; - case IDC_SAVETYPE8: backup_setManualBackupType(7); return 0; - case ID_DISPLAYMETHOD_DIRECTDRAWHW: { Lock lock (win_backbuffer_sync); @@ -5259,7 +5269,14 @@ return 0; default: - return 0; + { + u32 id = LOWORD(wParam); + if ((id >= IDC_SAVETYPE) && (id < IDC_SAVETYPE+MAX_SAVE_TYPES+1)) + { + backup_setManualBackupType(id-IDC_SAVETYPE); + } + return 0; + } } break; Modified: trunk/desmume/src/windows/resource.h =================================================================== --- trunk/desmume/src/windows/resource.h 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/windows/resource.h 2010-03-28 20:18:49 UTC (rev 3449) @@ -80,12 +80,6 @@ #define IDC_COMBO3 162 #define IDC_COMBO4 163 #define IDM_CONFIG 180 -#define IDC_SAVETYPE1 182 -#define IDC_SAVETYPE2 183 -#define IDC_SAVETYPE3 184 -#define IDC_SAVETYPE4 185 -#define IDC_SAVETYPE5 186 -#define IDC_SAVETYPE6 187 #define IDC_FRAMESKIP0 191 #define IDC_FRAMESKIP1 192 #define IDC_FRAMESKIP2 193 @@ -786,7 +780,6 @@ #define IDM_SCREENSEP_COLORBLACK 40025 #define IDM_FILE_RECORDUSERSPUWAV 40026 #define ID_FILE_RECENTROM 40034 -#define IDC_SAVETYPE7 40037 #define IDM_DEFSIZE 40038 #define IDM_3DCONFIG 40040 #define IDM_GBASLOT 40042 @@ -805,7 +798,6 @@ #define ID_RAMSEARCH_CAPTIONTEXT 40064 #define IDM_VIEW3D 40065 #define IDM_LOCKDOWN 40066 -#define IDC_SAVETYPE8 40067 #define IDM_EJECTCARD 40068 #define IDM_SHOWTOOLBAR 40069 #define ID_CONFIG_DISPLAYMETHOD 40070 @@ -907,6 +899,7 @@ #define IDM_RENDER_HQ2XS 60081 #define IDM_RENDER_LQ2X 60082 #define IDM_RENDER_LQ2XS 60083 +#define IDC_SAVETYPE 64000 // Next default values for new objects // Modified: trunk/desmume/src/windows/resources.rc =================================================================== --- trunk/desmume/src/windows/resources.rc 2010-03-27 19:18:57 UTC (rev 3448) +++ trunk/desmume/src/windows/resources.rc 2010-03-28 20:18:49 UTC (rev 3449) @@ -2646,22 +2646,8 @@ |