- 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;
This commit is contained in:
mtabachenko 2010-03-28 20:18:49 +00:00
parent 0f04ee8a90
commit 51ad58c5b1
9 changed files with 103 additions and 38 deletions

View File

@ -1079,7 +1079,10 @@ static void execdiv() {
{
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 @@ static void execdiv() {
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 @@ void FASTCALL MMU_writeToGCControl(u32 val)
}
break;
case CardMode_KEY2:
INFO("Cartridge: KEY2 mode unsupported.\n");
break;
}
@ -1166,7 +1172,8 @@ void FASTCALL MMU_writeToGCControl(u32 val)
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 @@ u32 MMU_readFromGC()
// 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 @@ u32 MMU_readFromGC()
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 @@ void FASTCALL _MMU_ARM9_write32(u32 adr, u32 val)
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:

View File

@ -29,12 +29,10 @@
#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>
#endif
#elif _XBOX
#include <xtl.h> // it`s really need?
#endif
#define FW_CMD_READ 0x3
@ -71,11 +69,24 @@ static const u8 kUninitializedSaveDataValue = 0xFF;
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 @@ static const int save_types[8][2] = {
{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 @@ void BackupDevice::reset_command()
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:

View File

@ -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 @@ private:
void loadfile();
bool _loadfile(const char *fname);
void ensure(u32 addr);
void flush();
bool flushPending, lazyFlushPending;
};
@ -149,5 +154,7 @@ u8 fw_transfer(memory_chip_t *mc, u8 data);
void backup_setManualBackupType(int type);
extern const char *save_names[];
#endif /*__FW_H__*/

View File

@ -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

View File

@ -578,6 +578,11 @@ bool WINCLASS::setMenu(HMENU menu)
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));

View File

@ -236,6 +236,7 @@ public:
HMENU menu);
bool setMenu(HMENU menu);
bool addMenuItem(u32 item, bool byPos, LPCMENUITEMINFO info);
DWORD checkMenu(UINT idd, bool check);
void Show(int mode);

View File

@ -1990,6 +1990,8 @@ joinThread_gdb( void *thread_handle) {
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 @@ int MenuInit()
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,10 +3745,10 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
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 @@ DOKEYDOWN:
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 @@ DOKEYDOWN:
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;

View File

@ -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
//

Binary file not shown.