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;
This commit is contained in:
parent
0f04ee8a90
commit
51ad58c5b1
|
@ -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:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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__*/
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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.
Loading…
Reference in New Issue