update melon (#3113)

* update melon

* frontend work

* make this work (i think?)

* fucking merge conflicts

* bleh
This commit is contained in:
CasualPokePlayer 2022-01-31 17:18:42 -08:00 committed by GitHub
parent 8e7be7c1f2
commit 7ac2e97cb7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 311 additions and 78 deletions

Binary file not shown.

View File

@ -29,6 +29,17 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS
POWER = 0x8000,
}
[StructLayout(LayoutKind.Sequential)]
public new class FrameInfo : LibWaterboxCore.FrameInfo
{
public long Time;
public Buttons Keys;
public byte TouchX;
public byte TouchY;
public byte MicVolume;
public byte GBALightSensor;
}
[Flags]
public enum LoadFlags : uint
{
@ -41,14 +52,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS
}
[StructLayout(LayoutKind.Sequential)]
public new class FrameInfo : LibWaterboxCore.FrameInfo
public class LoadData
{
public long Time;
public Buttons Keys;
public byte TouchX;
public byte TouchY;
public byte MicVolume;
public byte GBALightSensor;
public IntPtr DsRomData;
public int DsRomLength;
public IntPtr GbaRomData;
public int GbaRomLength;
public IntPtr GbaRamData;
public int GbaRamLength;
}
[StructLayout(LayoutKind.Sequential)]
@ -65,7 +76,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS
}
[BizImport(CC)]
public abstract bool Init(LoadFlags flags, FirmwareSettings fwSettings);
public abstract bool Init(LoadFlags flags, LoadData loadData, FirmwareSettings fwSettings);
[BizImport(CC)]
public abstract void PutSaveRam(byte[] data, uint len);

View File

@ -47,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS
Filename = "melonDS.wbx",
SbrkHeapSizeKB = 2 * 1024,
SealedHeapSizeKB = 4,
InvisibleHeapSizeKB = 4,
InvisibleHeapSizeKB = 4 * 1024,
PlainHeapSizeKB = 4,
MmapHeapSizeKB = 1024 * 1024,
SkipCoreConsistencyCheck = CoreComm.CorePreferences.HasFlag(CoreComm.CorePreferencesFlags.WaterboxCoreConsistencyCheck),
@ -93,15 +93,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS
var message = _syncSettings.FirmwareMessage.Length != 0 ? Encoding.UTF8.GetBytes(_syncSettings.FirmwareMessage) : new byte[1] { 0 };
fwSettings.FirmwareMessageLength = message.Length;
_exe.AddReadonlyFile(roms[0], "game.rom");
if (gbacartpresent)
var loadData = new LibMelonDS.LoadData
{
_exe.AddReadonlyFile(roms[1], "gba.rom");
if (gbasrampresent)
{
_exe.AddReadonlyFile(roms[2], "gba.ram");
}
}
DsRomLength = roms[0].Length,
GbaRomLength = gbacartpresent ? roms[1].Length : 0,
GbaRamLength = gbasrampresent ? roms[2].Length : 0,
};
if (_syncSettings.UseRealBIOS)
{
_exe.AddReadonlyFile(bios7, "bios7.rom");
@ -121,31 +118,30 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS
unsafe
{
fixed (byte* namePtr = &name[0], messagePtr = &message[0])
fixed (byte*
dsRomPtr = roms[0],
gbaRomPtr = gbacartpresent ? roms[1] : null,
gbaRamPtr = gbasrampresent ? roms[2] : null,
namePtr = &name[0],
messagePtr = &message[0])
{
loadData.DsRomData = (IntPtr)dsRomPtr;
loadData.GbaRomData = (IntPtr)gbaRomPtr;
loadData.GbaRamData = (IntPtr)gbaRamPtr;
fwSettings.FirmwareUsername = (IntPtr)namePtr;
fwSettings.FirmwareMessage = (IntPtr)messagePtr;
if (!_core.Init(flags, fwSettings))
if (!_core.Init(flags, loadData, fwSettings))
{
throw new InvalidOperationException("Init returned false!");
}
}
}
_exe.RemoveReadonlyFile("game.rom");
if (gbacartpresent)
{
_exe.RemoveReadonlyFile("gba.rom");
if (gbasrampresent)
{
_exe.RemoveReadonlyFile("gba.ram");
}
}
if (_syncSettings.UseRealBIOS)
/*if (_syncSettings.UseRealBIOS)
{
_exe.RemoveReadonlyFile("bios7.rom");
_exe.RemoveReadonlyFile("bios9.rom");
}
}*/
if (fw != null)
{
_exe.RemoveReadonlyFile("firmware.bin");

View File

@ -0,0 +1,58 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "BizConfig.h"
namespace Config
{
#ifdef JIT_ENABLED
bool JIT_Enable = false;
int JIT_MaxBlockSize = 32;
bool JIT_BranchOptimisations = true;
bool JIT_LiteralOptimisations = true;
bool JIT_FastMemory = true;
#endif
bool ExternalBIOSEnable;
std::string BIOS9Path = "bios9.rom";
std::string BIOS7Path = "bios7.rom";
std::string FirmwarePath = "firmware.bin";
std::string DSiBIOS9Path = "bios9i.rom";
std::string DSiBIOS7Path = "bios7i.rom";
std::string DSiFirmwarePath = "firmwarei.bin";
std::string DSiNANDPath = "nand.bin";
bool DLDIEnable = false;
std::string DLDISDPath = "";
int DLDISize = 0;
bool DLDIReadOnly = true;
bool DLDIFolderSync = false;
std::string DLDIFolderPath = "";
bool DSiSDEnable = false;
std::string DSiSDPath = "";
int DSiSDSize = 0;
bool DSiSDReadOnly = true;
bool DSiSDFolderSync = false;
std::string DSiSDFolderPath = "";
bool FirmwareOverrideSettings;
std::string FirmwareUsername;
int FirmwareLanguage;
int FirmwareBirthdayMonth;
int FirmwareBirthdayDay;
int FirmwareFavouriteColour;
std::string FirmwareMessage;
std::string FirmwareMAC;
bool RandomizeMAC;
int AudioBitrate;
bool FixedBootTime = true;
bool UseRealTime = false;
int TimeAtBoot = 0;
}

View File

@ -0,0 +1,60 @@
#ifndef CONFIG_H
#define CONFIG_H
#include <string>
namespace Config
{
#ifdef JIT_ENABLED
extern bool JIT_Enable;
extern int JIT_MaxBlockSize;
extern bool JIT_BranchOptimisations;
extern bool JIT_LiteralOptimisations;
extern bool JIT_FastMemory;
#endif
extern bool ExternalBIOSEnable;
extern std::string BIOS9Path;
extern std::string BIOS7Path;
extern std::string FirmwarePath;
extern std::string DSiBIOS9Path;
extern std::string DSiBIOS7Path;
extern std::string DSiFirmwarePath;
extern std::string DSiNANDPath;
extern bool DLDIEnable;
extern std::string DLDISDPath;
extern int DLDISize;
extern bool DLDIReadOnly;
extern bool DLDIFolderSync;
extern std::string DLDIFolderPath;
extern bool DSiSDEnable;
extern std::string DSiSDPath;
extern int DSiSDSize;
extern bool DSiSDReadOnly;
extern bool DSiSDFolderSync;
extern std::string DSiSDFolderPath;
extern bool FirmwareOverrideSettings;
extern std::string FirmwareUsername;
extern int FirmwareLanguage;
extern int FirmwareBirthdayMonth;
extern int FirmwareBirthdayDay;
extern int FirmwareFavouriteColour;
extern std::string FirmwareMessage;
extern std::string FirmwareMAC;
extern bool RandomizeMAC;
extern int AudioBitrate;
extern bool FixedBootTime;
extern bool UseRealTime;
extern int TimeAtBoot;
}
#endif

View File

@ -4,10 +4,9 @@
#include "RTC.h"
#include "ARM.h"
#include "NDSCart.h"
#include "NDSCart_SRAMManager.h"
#include "GBACart.h"
#include "Platform.h"
#include "Config.h"
#include "BizConfig.h"
#include "types.h"
#include "frontend/mic_blow.h"
@ -39,9 +38,16 @@ typedef enum
FIRMWARE_OVERRIDE = 0x10,
} LoadFlags;
static const char* bios9_path = "bios9.rom";
static const char* bios7_path = "bios7.rom";
static const char* firmware_path = "firmware.bin";
typedef struct
{
u8* DsRomData;
u32 DsRomLen;
u8* GbaRomData;
u32 GbaRomLen;
u8* GbaRamData;
u32 GbaRamLen;
} LoadData;
static const char* rom_path = "game.rom";
static const char* sram_path = "save.ram";
static const char* gba_rom_path = "gba.rom";
@ -60,72 +66,73 @@ typedef struct
s32 FirmwareMessageLength;
} FirmwareSettings;
EXPORT bool Init(LoadFlags flags, FirmwareSettings* fwSettings)
EXPORT bool Init(LoadFlags flags, LoadData* loadData, FirmwareSettings* fwSettings)
{
Config::ExternalBIOSEnable = !!(flags & USE_REAL_BIOS);
strncpy(Config::BIOS9Path, Config::ExternalBIOSEnable ? bios9_path : no_path, 1023);
Config::BIOS9Path[1023] = '\0';
strncpy(Config::BIOS7Path, Config::ExternalBIOSEnable ? bios7_path : no_path, 1023);
Config::BIOS7Path[1023] = '\0';
strncpy(Config::FirmwarePath, firmware_path, 1023);
Config::FirmwarePath[1023] = '\0';
Config::AudioBitrate = !!(flags & ACCURATE_AUDIO_BITRATE) ? 1 : 2;
Config::FirmwareOverrideSettings = !!(flags & FIRMWARE_OVERRIDE);
biz_skip_fw = !!(flags & SKIP_FIRMWARE);
NDS::SetConsoleType(0);
// time calls are deterministic under wbx, so this will force the mac address to a constant value instead of relying on whatever is in the firmware
// fixme: might want to allow the user to specify mac address?
srand(time(NULL));
Config::RandomizeMAC = true;
Config::AudioBitrate = !!(flags & ACCURATE_AUDIO_BITRATE) ? 1 : 2;
Config::FixedBootTime = true;
Config::UseRealTime = false;
Config::TimeAtBoot = 0;
biz_time = 0;
RTC::RtcCallback = BizRtcCallback;
Config::FirmwareOverrideSettings = !!(flags & FIRMWARE_OVERRIDE);
if (Config::FirmwareOverrideSettings)
{
memcpy(Config::FirmwareUsername, fwSettings->FirmwareUsername, fwSettings->FirmwareUsernameLength);
Config::FirmwareUsername[fwSettings->FirmwareUsernameLength] = 0;
std::string fwUsername(fwSettings->FirmwareUsername, fwSettings->FirmwareUsernameLength);
fwUsername += '\0';
Config::FirmwareUsername = fwUsername;
Config::FirmwareLanguage = fwSettings->FirmwareLanguage;
Config::FirmwareBirthdayMonth = fwSettings->FirmwareBirthdayMonth;
Config::FirmwareBirthdayDay = fwSettings->FirmwareBirthdayDay;
Config::FirmwareFavouriteColour = fwSettings->FirmwareFavouriteColour;
memcpy(Config::FirmwareMessage, fwSettings->FirmwareMessage, fwSettings->FirmwareMessageLength);
Config::FirmwareMessage[fwSettings->FirmwareMessageLength] = 0;
std::string fwMessage(fwSettings->FirmwareMessage, fwSettings->FirmwareMessageLength);
fwMessage += '\0';
Config::FirmwareMessage = fwMessage;
}
if (!NDS::Init()) return false;
GPU::InitRenderer(false);
GPU::SetRenderSettings(false, biz_render_settings);
biz_skip_fw = !!(flags & SKIP_FIRMWARE);
if (!NDS::LoadROM(rom_path, no_path, biz_skip_fw)) return false;
if (flags & GBA_CART_PRESENT) { if (!NDS::LoadGBAROM(gba_rom_path, gba_sram_path)) return false; }
if (!NDS::LoadCart(loadData->DsRomData, loadData->DsRomLen, nullptr, 0)) return false;
if (flags & GBA_CART_PRESENT)
{
if (!NDS::LoadGBACart(loadData->GbaRomData, loadData->GbaRomLen, loadData->GbaRamData, loadData->GbaRamLen))
return false;
}
NDS::LoadBIOS();
if (biz_skip_fw) NDS::SetupDirectBoot("");
NDS::Start();
Config::FirmwareOverrideSettings = false;
return true;
}
namespace NDSCart { extern CartCommon* Cart; }
extern bool NdsSaveRamIsDirty;
EXPORT void PutSaveRam(u8* data, u32 len)
{
if (NDSCart_SRAMManager::SecondaryBufferLength > 0)
NDSCart_SRAMManager::UpdateBuffer(data, len);
NDS::LoadSave(data, len);
NdsSaveRamIsDirty = false;
}
EXPORT void GetSaveRam(u8* data)
{
if (NDSCart_SRAMManager::SecondaryBufferLength > 0)
NDSCart_SRAMManager::FlushSecondaryBuffer(data, NDSCart_SRAMManager::SecondaryBufferLength);
if (NDSCart::Cart) NDSCart::Cart->GetSaveData(data);
}
EXPORT s32 GetSaveRamLength()
{
return NDSCart_SRAMManager::SecondaryBufferLength;
return NDSCart::Cart ? NDSCart::Cart->GetSaveLen() : 0;
}
EXPORT bool SaveRamIsDirty()
{
return NDSCart_SRAMManager::NeedsFlush();
return NdsSaveRamIsDirty;
}
/* excerpted from gbatek
@ -292,8 +299,8 @@ EXPORT void FrameAdvance(MyFrameInfo* f)
{
if (f->Keys & 0x8000)
{
NDS::LoadBIOS(false);
if (biz_skip_fw) NDS::SetupDirectBoot();
NDS::LoadBIOS();
if (biz_skip_fw) NDS::SetupDirectBoot("");
}
NDS::SetKeyMask(~f->Keys & 0xFFF);

View File

@ -5,6 +5,9 @@
#include <thread>
#include <mutex>
#include "Platform.h"
#include "BizConfig.h"
bool NdsSaveRamIsDirty = false;
namespace Platform
{
@ -25,20 +28,44 @@ int GetConfigInt(ConfigEntry entry)
{
const int imgsizes[] = {0, 256, 512, 1024, 2048, 4096};
/*switch (entry)
switch (entry)
{
#ifdef JIT_ENABLED
case JIT_MaxBlockSize: return Config::JIT_MaxBlockSize;
#endif
case DLDI_ImageSize: return imgsizes[Config::DLDISize];
case DSiSD_ImageSize: return imgsizes[Config::DSiSDSize];
}*/
case Firm_Language: return Config::FirmwareLanguage;
case Firm_BirthdayMonth: return Config::FirmwareBirthdayMonth;
case Firm_BirthdayDay: return Config::FirmwareBirthdayDay;
case Firm_Color: return Config::FirmwareFavouriteColour;
case AudioBitrate: return Config::AudioBitrate;
case TimeAtBoot: return Config::TimeAtBoot;
default: break;
}
return 0;
}
bool GetConfigBool(ConfigEntry entry)
{
/*switch (entry)
switch (entry)
{
#ifdef JIT_ENABLED
case JIT_Enable: return Config::JIT_Enable != 0;
case JIT_LiteralOptimizations: return Config::JIT_LiteralOptimisations != 0;
case JIT_BranchOptimizations: return Config::JIT_BranchOptimisations != 0;
case JIT_FastMemory: return Config::JIT_FastMemory != 0;
#endif
case ExternalBIOSEnable: return Config::ExternalBIOSEnable != 0;
case DLDI_Enable: return Config::DLDIEnable != 0;
case DLDI_ReadOnly: return Config::DLDIReadOnly != 0;
case DLDI_FolderSync: return Config::DLDIFolderSync != 0;
@ -46,33 +73,94 @@ bool GetConfigBool(ConfigEntry entry)
case DSiSD_Enable: return Config::DSiSDEnable != 0;
case DSiSD_ReadOnly: return Config::DSiSDReadOnly != 0;
case DSiSD_FolderSync: return Config::DSiSDFolderSync != 0;
}*/
case Firm_RandomizeMAC: return Config::RandomizeMAC != 0;
case Firm_OverrideSettings: return Config::FirmwareOverrideSettings != 0;
case UseRealTime: return Config::UseRealTime != 0;
case FixedBootTime: return Config::FixedBootTime != 0;
default: break;
}
return false;
}
std::string GetConfigString(ConfigEntry entry)
{
/*switch (entry)
switch (entry)
{
case BIOS9Path: return Config::BIOS9Path;
case BIOS7Path: return Config::BIOS7Path;
case FirmwarePath: return Config::FirmwarePath;
case DSi_BIOS9Path: return Config::DSiBIOS9Path;
case DSi_BIOS7Path: return Config::DSiBIOS7Path;
case DSi_FirmwarePath: return Config::DSiFirmwarePath;
case DSi_NANDPath: return Config::DSiNANDPath;
case DLDI_ImagePath: return Config::DLDISDPath;
case DLDI_FolderPath: return Config::DLDIFolderPath;
case DSiSD_ImagePath: return Config::DSiSDPath;
case DSiSD_FolderPath: return Config::DSiSDFolderPath;
}*/
case Firm_Username: return Config::FirmwareUsername;
case Firm_Message: return Config::FirmwareMessage;
default: break;
}
return "";
}
FILE* OpenFile(const char* path, const char* mode, bool mustexist)
bool GetConfigArray(ConfigEntry entry, void* data)
{
return fopen(path, mode);
switch (entry)
{
case Firm_MAC:
{
std::string& mac_in = Config::FirmwareMAC;
u8* mac_out = (u8*)data;
int o = 0;
u8 tmp = 0;
for (int i = 0; i < 18; i++)
{
char c = mac_in[i];
if (c == '\0') break;
int n;
if (c >= '0' && c <= '9') n = c - '0';
else if (c >= 'a' && c <= 'f') n = c - 'a' + 10;
else if (c >= 'A' && c <= 'F') n = c - 'A' + 10;
else continue;
if (!(o & 1))
tmp = n;
else
mac_out[o >> 1] = n | (tmp << 4);
o++;
if (o >= 12) return true;
}
}
return false;
default: break;
}
return false;
}
FILE* OpenLocalFile(const char* path, const char* mode)
FILE* OpenFile(std::string path, std::string mode, bool mustexist)
{
return fopen(path, mode);
return fopen(path.c_str(), mode.c_str());
}
FILE* OpenLocalFile(std::string path, std::string mode)
{
return fopen(path.c_str(), mode.c_str());
}
Thread* Thread_Create(std::function<void()> func)
@ -145,6 +233,17 @@ bool Mutex_TryLock(Mutex* mutex)
return ((std::mutex*) mutex)->try_lock();
}
void WriteNDSSave(const u8* savedata, u32 savelen, u32 writeoffset, u32 writelen)
{
bool NdsSaveRamIsDirty = true;
}
void WriteGBASave(const u8* savedata, u32 savelen, u32 writeoffset, u32 writelen)
{
}
bool MP_Init()
{
return false;

View File

@ -1,10 +1,11 @@
CCFLAGS := -Wno-discarded-qualifiers
CXXFLAGS := -DMELONDS_VERSION="" \
-I./melonDS/src -I./melonDS/src/teakra/include \
-Wall -Wextra -Werror=int-to-pointer-cast \
-Wcast-qual -Wfatal-errors -Wno-missing-braces \
-Wno-unused-parameter -Wno-parentheses -Wno-sign-compare \
-Wno-unused-variable -Wno-unused-function \
-pedantic -std=c++17
-Wfatal-errors -Wno-unused-parameter -Wno-unused-variable \
-Wno-unused-but-set-variable -Wno-sign-compare \
-fno-strict-aliasing -std=c++17
TARGET = melonDS.wbx
@ -73,6 +74,7 @@ SRCS = \
$(addprefix melonDS/src/teakra/src/,$(TEAKRA_SRCS)) \
$(addprefix melonDS/src/fatfs/,$(FATFS_SRCS)) \
$(addprefix melonDS/src/,$(MISC_SRCS)) \
BizConfig.cpp \
BizInterface.cpp \
BizPlatform.cpp

@ -1 +1 @@
Subproject commit 608b7d2f36c986cfb5a31e9ebf016968015d592f
Subproject commit e59387b3fcc8dde8e8df1e1a1c1251c53720c2bc