[Core & UI] Add RAM Area Only (*.ram) Disk Save Type

- It's a bit hacky but it works for *.ndd files.
- For *.d64 files, it might be more problematic for now
This commit is contained in:
LuigiBlood 2019-08-12 23:07:33 +02:00
parent 77b5ca237c
commit affc694149
9 changed files with 140 additions and 31 deletions

View File

@ -271,9 +271,11 @@ enum LanguageStringID
OPTION_CHANGE_FR = 466, OPTION_CHANGE_FR = 466,
OPTION_CHECK_RUNNING = 467, OPTION_CHECK_RUNNING = 467,
OPTION_UNIQUE_SAVE_DIR = 468, OPTION_UNIQUE_SAVE_DIR = 468,
OPTION_IPL_ROM_PATH = 469, OPTION_IPL_ROM_PATH = 469,
OPTION_IPL_ROM_USA_PATH = 470, OPTION_IPL_ROM_USA_PATH = 470,
OPTION_IPL_ROM_TOOL_PATH = 471, OPTION_IPL_ROM_TOOL_PATH = 471,
OPTION_DISKSAVETYPE = 472,
//Rom Browser Tab //Rom Browser Tab
RB_MAX_ROMS = 480, RB_MAX_ROMS = 480,
@ -406,6 +408,10 @@ enum LanguageStringID
BOTTOM_APPLY = 722, BOTTOM_APPLY = 722,
BOTTOM_CLOSE = 723, BOTTOM_CLOSE = 723,
//Disk Save Type
DISKSAVE_SHADOW = 730,
DISKSAVE_RAM = 731,
/********************************************************************************* /*********************************************************************************
* ROM Information * * ROM Information *
*********************************************************************************/ *********************************************************************************/

View File

@ -241,6 +241,7 @@ void CLanguage::LoadDefaultStrings(void)
DEF_STR(OPTION_IPL_ROM_PATH, "Japanese Retail 64DD IPL ROM Path:"); DEF_STR(OPTION_IPL_ROM_PATH, "Japanese Retail 64DD IPL ROM Path:");
DEF_STR(OPTION_IPL_ROM_USA_PATH, "American Retail 64DD IPL ROM Path:"); DEF_STR(OPTION_IPL_ROM_USA_PATH, "American Retail 64DD IPL ROM Path:");
DEF_STR(OPTION_IPL_ROM_TOOL_PATH, "Development 64DD IPL ROM Path:"); DEF_STR(OPTION_IPL_ROM_TOOL_PATH, "Development 64DD IPL ROM Path:");
DEF_STR(OPTION_DISKSAVETYPE, "Disk Save Type:");
//ROM Browser Tab //ROM Browser Tab
DEF_STR(RB_MAX_ROMS, "Max # of ROMs remembered (0-10):"); DEF_STR(RB_MAX_ROMS, "Max # of ROMs remembered (0-10):");
@ -372,6 +373,10 @@ void CLanguage::LoadDefaultStrings(void)
DEF_STR(BOTTOM_APPLY, "Apply"); DEF_STR(BOTTOM_APPLY, "Apply");
DEF_STR(BOTTOM_CLOSE, "Close"); DEF_STR(BOTTOM_CLOSE, "Close");
//Disk Save Type
DEF_STR(DISKSAVE_SHADOW, "Full Disk Copy");
DEF_STR(DISKSAVE_RAM, "Save Area Only");
/********************************************************************************* /*********************************************************************************
* ROM Information * * ROM Information *
*********************************************************************************/ *********************************************************************************/

View File

@ -27,7 +27,9 @@ m_ErrorMsg(EMPTY_STRING),
m_DiskBufAddress(0), m_DiskBufAddress(0),
m_DiskSysAddress(0), m_DiskSysAddress(0),
m_DiskIDAddress(0), m_DiskIDAddress(0),
m_DiskRomAddress(0) m_DiskRomAddress(0),
m_DiskRamAddress(0),
m_isShadowDisk(false)
{ {
} }
@ -48,6 +50,7 @@ bool CN64Disk::LoadDiskImage(const char * FileLoc)
WriteTrace(TraceN64System, TraceDebug, "Attempt to load shadow file."); WriteTrace(TraceN64System, TraceDebug, "Attempt to load shadow file.");
if (!AllocateAndLoadDiskImage(ShadowFile.c_str())) if (!AllocateAndLoadDiskImage(ShadowFile.c_str()))
{ {
m_isShadowDisk = false;
WriteTrace(TraceN64System, TraceDebug, "Loading Shadow file failed"); WriteTrace(TraceN64System, TraceDebug, "Loading Shadow file failed");
UnallocateDiskImage(); UnallocateDiskImage();
if (!AllocateAndLoadDiskImage(FileLoc)) if (!AllocateAndLoadDiskImage(FileLoc))
@ -55,6 +58,10 @@ bool CN64Disk::LoadDiskImage(const char * FileLoc)
return false; return false;
} }
} }
else
{
m_isShadowDisk = true;
}
char RomName[5]; char RomName[5];
m_FileName = FileLoc; m_FileName = FileLoc;
@ -91,6 +98,8 @@ bool CN64Disk::LoadDiskImage(const char * FileLoc)
GenerateLBAToPhysTable(); GenerateLBAToPhysTable();
InitSysDataD64(); InitSysDataD64();
DetectRamAddress();
LoadDiskRAMImage();
if (g_Disk == this) if (g_Disk == this)
{ {
@ -112,7 +121,9 @@ bool CN64Disk::SaveDiskImage()
return true; return true;
} }
//Assume the file extension is *.ndd (it is the only case where it is loaded) //Assume the file extension is *.ndd / *.d64
if (m_DiskFormat == DiskFormatMAME || m_isShadowDisk || g_Settings->LoadDword(Setting_DiskSaveType) == 0)
{
stdstr ShadowFile = m_FileName; stdstr ShadowFile = m_FileName;
ShadowFile[ShadowFile.length() - 1] = 'r'; ShadowFile[ShadowFile.length() - 1] = 'r';
@ -127,23 +138,38 @@ bool CN64Disk::SaveDiskImage()
m_DiskFile.SeekToBegin(); m_DiskFile.SeekToBegin();
ForceByteSwapDisk(); ForceByteSwapDisk();
if (m_DiskFormat == DiskFormatMAME)
{
//If original file was MAME format, just copy
WriteTrace(TraceN64System, TraceDebug, "64DD disk is MAME format");
}
else if (m_DiskFormat == DiskFormatSDK)
{
//If original file was SDK format, we need to convert it back
WriteTrace(TraceN64System, TraceDebug, "64DD disk is SDK format");
}
if (!m_DiskFile.Write(m_DiskImage, m_DiskFileSize)) if (!m_DiskFile.Write(m_DiskImage, m_DiskFileSize))
{ {
m_DiskFile.Close(); m_DiskFile.Close();
WriteTrace(TraceN64System, TraceError, "Failed to write file"); WriteTrace(TraceN64System, TraceError, "Failed to write file");
return false; return false;
} }
}
else
{
stdstr ShadowFile = m_FileName;
ShadowFile[ShadowFile.length() - 1] = 'm';
ShadowFile[ShadowFile.length() - 2] = 'a';
ShadowFile[ShadowFile.length() - 3] = 'r';
WriteTrace(TraceN64System, TraceDebug, "Trying to open %s (RAM File)", ShadowFile.c_str());
m_DiskFile.Close();
if (!m_DiskFile.Open(ShadowFile.c_str(), CFileBase::modeWrite | CFileBase::modeCreate | CFileBase::modeNoTruncate))
{
WriteTrace(TraceN64System, TraceError, "Failed to open %s (RAM File)", ShadowFile.c_str());
return false;
}
m_DiskFile.SeekToBegin();
ForceByteSwapDisk();
if (!m_DiskFile.Write(GetDiskAddressRam(), m_DiskFileSize - m_DiskRamAddress))
{
m_DiskFile.Close();
WriteTrace(TraceN64System, TraceError, "Failed to write file");
return false;
}
}
m_DiskFile.Close(); m_DiskFile.Close();
return true; return true;
@ -403,6 +429,45 @@ bool CN64Disk::AllocateAndLoadDiskImage(const char * FileLoc)
return true; return true;
} }
bool CN64Disk::LoadDiskRAMImage()
{
if (m_DiskFormat == DiskFormatMAME || m_isShadowDisk)
return true;
CFile ramfile;
stdstr filename = m_FileName;
filename[filename.length() - 1] = 'm';
filename[filename.length() - 2] = 'a';
filename[filename.length() - 3] = 'r';
WriteTrace(TraceN64System, TraceDebug, "Trying to open %s", filename);
if (!ramfile.Open(filename.c_str(), CFileBase::modeRead))
{
WriteTrace(TraceN64System, TraceError, "Failed to open %s", filename);
return false;
}
if (ramfile.GetLength() != m_DiskFileSize - m_DiskRamAddress)
{
ramfile.Close();
WriteTrace(TraceN64System, TraceError, "RAM save file is the wrong size");
return false;
}
ForceByteSwapDisk();
ramfile.SeekToBegin();
if (ramfile.Read(GetDiskAddressRam(), m_DiskFileSize - m_DiskRamAddress) != (m_DiskFileSize - m_DiskRamAddress))
{
ramfile.Close();
WriteTrace(TraceN64System, TraceError, "Failed to read RAM save data");
return false;
}
ForceByteSwapDisk();
return true;
}
void CN64Disk::ByteSwapDisk() void CN64Disk::ByteSwapDisk()
{ {
uint32_t count; uint32_t count;
@ -713,6 +778,23 @@ void CN64Disk::GenerateLBAToPhysTable()
} }
} }
void CN64Disk::DetectRamAddress()
{
if (m_DiskFormat == DiskFormatMAME)
{
//Not supported
m_DiskRamAddress = 0;
}
else if (m_DiskFormat == DiskFormatSDK)
{
m_DiskRamAddress = LBAToByte(0, RAM_START_LBA[m_DiskType]);
}
else //if (m_DiskFormat == DiskFormatD64)
{
m_DiskRamAddress = m_DiskRomAddress + LBAToByte(SYSTEM_LBAS, *(uint16_t*)(&GetDiskAddressSys()[0xE2]));
}
}
uint32_t CN64Disk::LBAToVZone(uint32_t lba) uint32_t CN64Disk::LBAToVZone(uint32_t lba)
{ {
for (uint32_t vzone = 0; vzone < 16; vzone++) { for (uint32_t vzone = 0; vzone < 16; vzone++) {

View File

@ -30,6 +30,7 @@ public:
uint8_t * GetDiskAddressSys() { return m_DiskImage + m_DiskSysAddress; } uint8_t * GetDiskAddressSys() { return m_DiskImage + m_DiskSysAddress; }
uint8_t * GetDiskAddressID() { return m_DiskImage + m_DiskIDAddress; } uint8_t * GetDiskAddressID() { return m_DiskImage + m_DiskIDAddress; }
uint8_t * GetDiskAddressRom() { return m_DiskImage + m_DiskRomAddress; } uint8_t * GetDiskAddressRom() { return m_DiskImage + m_DiskRomAddress; }
uint8_t * GetDiskAddressRam() { return m_DiskImage + m_DiskRamAddress; }
uint8_t * GetDiskHeader() { return m_DiskHeader; } uint8_t * GetDiskHeader() { return m_DiskHeader; }
void SetDiskAddressBuffer(uint32_t address) { m_DiskBufAddress = address; } void SetDiskAddressBuffer(uint32_t address) { m_DiskBufAddress = address; }
uint32_t GetDiskAddressBlock(uint16_t head, uint16_t track, uint16_t block, uint16_t sector, uint16_t sectorsize); uint32_t GetDiskAddressBlock(uint16_t head, uint16_t track, uint16_t block, uint16_t sector, uint16_t sectorsize);
@ -46,6 +47,7 @@ private:
bool AllocateDiskImage(uint32_t DiskFileSize); bool AllocateDiskImage(uint32_t DiskFileSize);
bool AllocateDiskHeader(); bool AllocateDiskHeader();
bool AllocateAndLoadDiskImage(const char * FileLoc); bool AllocateAndLoadDiskImage(const char * FileLoc);
bool LoadDiskRAMImage();
void ByteSwapDisk(); void ByteSwapDisk();
void ForceByteSwapDisk(); void ForceByteSwapDisk();
void SetError(LanguageStringID ErrorMsg); void SetError(LanguageStringID ErrorMsg);
@ -56,6 +58,7 @@ private:
void InitSysDataD64(); void InitSysDataD64();
void DeinitSysDataD64(); void DeinitSysDataD64();
void GenerateLBAToPhysTable(); void GenerateLBAToPhysTable();
void DetectRamAddress();
uint32_t LBAToVZone(uint32_t lba); uint32_t LBAToVZone(uint32_t lba);
uint32_t LBAToByte(uint32_t lba, uint32_t nlbas); uint32_t LBAToByte(uint32_t lba, uint32_t nlbas);
uint16_t LBAToPhys(uint32_t lba); uint16_t LBAToPhys(uint32_t lba);
@ -76,11 +79,13 @@ private:
uint32_t m_DiskSysAddress; uint32_t m_DiskSysAddress;
uint32_t m_DiskIDAddress; uint32_t m_DiskIDAddress;
uint32_t m_DiskRomAddress; uint32_t m_DiskRomAddress;
uint32_t m_DiskRamAddress;
LanguageStringID m_ErrorMsg; LanguageStringID m_ErrorMsg;
Country m_Country; Country m_Country;
stdstr m_RomName, m_FileName, m_DiskIdent; stdstr m_RomName, m_FileName, m_DiskIdent;
uint8_t m_DiskFormat; //0 = MAME, 1 = SDK, 2 = D64 uint8_t m_DiskFormat; //0 = MAME, 1 = SDK, 2 = D64
uint8_t m_DiskType; uint8_t m_DiskType;
bool m_isShadowDisk;
//Disk Defines //Disk Defines
#define MAX_LBA 0x10DB #define MAX_LBA 0x10DB

View File

@ -53,6 +53,11 @@ enum SAVE_CHIP_TYPE
SaveChip_Auto = -1, SaveChip_Eeprom_4K, SaveChip_Eeprom_16K, SaveChip_Sram, SaveChip_FlashRam SaveChip_Auto = -1, SaveChip_Eeprom_4K, SaveChip_Eeprom_16K, SaveChip_Sram, SaveChip_FlashRam
}; };
enum SAVE_DISK_TYPE
{
SaveDisk_ShadowFile = 0, SaveDisk_RAMFile = 1,
};
enum FUNC_LOOKUP_METHOD enum FUNC_LOOKUP_METHOD
{ {
FuncFind_Default = -1, FuncFind_PhysicalLookup = 1, FuncFind_VirtualLookup = 2, FuncFind_ChangeMemory = 3, FuncFind_Default = -1, FuncFind_PhysicalLookup = 1, FuncFind_VirtualLookup = 2, FuncFind_ChangeMemory = 3,

View File

@ -137,6 +137,7 @@ void CSettings::AddHowToHandleSetting(const char * BaseDirectory)
AddHandler(Setting_LanguageDirDefault, new CSettingTypeRelativePath("Lang", "")); AddHandler(Setting_LanguageDirDefault, new CSettingTypeRelativePath("Lang", ""));
AddHandler(Setting_LanguageDir, new CSettingTypeApplicationPath("Lang Directory", "Directory", Setting_LanguageDirDefault)); AddHandler(Setting_LanguageDir, new CSettingTypeApplicationPath("Lang Directory", "Directory", Setting_LanguageDirDefault));
AddHandler(Setting_SyncViaAudioEnabled, new CSettingTypeTempBool(false, "SyncViaAudioEnabled")); AddHandler(Setting_SyncViaAudioEnabled, new CSettingTypeTempBool(false, "SyncViaAudioEnabled"));
AddHandler(Setting_DiskSaveType, new CSettingTypeApplication("Settings", "Disk Save Type", (uint32_t)1));
AddHandler(Default_RDRamSize, new CSettingTypeApplication("Defaults", "RDRAM Size", 0x400000u)); AddHandler(Default_RDRamSize, new CSettingTypeApplication("Defaults", "RDRAM Size", 0x400000u));
AddHandler(Default_UseHleGfx, new CSettingTypeApplication("Defaults", "HLE GFX Default", true)); AddHandler(Default_UseHleGfx, new CSettingTypeApplication("Defaults", "HLE GFX Default", true));

View File

@ -64,6 +64,7 @@ enum SettingID
Setting_EnableDisk, Setting_EnableDisk,
Setting_SyncViaAudioEnabled, Setting_SyncViaAudioEnabled,
Setting_Enhancement, Setting_Enhancement,
Setting_DiskSaveType,
//Default Settings //Default Settings
Default_RDRamSize, Default_RDRamSize,

View File

@ -1379,6 +1379,8 @@ BEGIN
EDITTEXT IDC_IPL_TL_DIR,7,78,184,12,ES_AUTOHSCROLL EDITTEXT IDC_IPL_TL_DIR,7,78,184,12,ES_AUTOHSCROLL
PUSHBUTTON "...",IDC_SELECT_IPL_TL_DIR,197,78,14,12 PUSHBUTTON "...",IDC_SELECT_IPL_TL_DIR,197,78,14,12
LTEXT "Development 64DD IPL ROM Path:",IDC_IPLDIR_TL_TXT,9,67,145,10 LTEXT "Development 64DD IPL ROM Path:",IDC_IPLDIR_TL_TXT,9,67,145,10
LTEXT "Save File Type:",IDC_DISKSAVETYPE_TXT,9,106,83,10
COMBOBOX IDC_DISKSAVETYPE,95,104,115,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
END END

View File

@ -695,6 +695,8 @@
#define IDC_IPL_TL_DIR 1544 #define IDC_IPL_TL_DIR 1544
#define IDC_SELECT_IPL_TL_DIR 1545 #define IDC_SELECT_IPL_TL_DIR 1545
#define IDC_IPLDIR_TL_TXT 1546 #define IDC_IPLDIR_TL_TXT 1546
#define IDC_DISKSAVETYPE_TXT 1547
#define IDC_DISKSAVETYPE 1548
#define ID_POPUPMENU_PLAYGAMEWITHDISK 40008 #define ID_POPUPMENU_PLAYGAMEWITHDISK 40008
#define ID_POPUPMENU_ADDSYMBOL 40013 #define ID_POPUPMENU_ADDSYMBOL 40013
#define ID_POPUPMENU_VIEWDISASM 40017 #define ID_POPUPMENU_VIEWDISASM 40017
@ -753,9 +755,9 @@
// //
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 217 #define _APS_NEXT_RESOURCE_VALUE 219
#define _APS_NEXT_COMMAND_VALUE 40092 #define _APS_NEXT_COMMAND_VALUE 40092
#define _APS_NEXT_CONTROL_VALUE 1541 #define _APS_NEXT_CONTROL_VALUE 1549
#define _APS_NEXT_SYMED_VALUE 102 #define _APS_NEXT_SYMED_VALUE 102
#endif #endif
#endif #endif