diff --git a/Assets/dll/melonDS.wbx.zst b/Assets/dll/melonDS.wbx.zst old mode 100644 new mode 100755 index e3181ce8342..8de47ce4497 Binary files a/Assets/dll/melonDS.wbx.zst and b/Assets/dll/melonDS.wbx.zst differ diff --git a/waterbox/melon/BizConsoleCreator.cpp b/waterbox/melon/BizConsoleCreator.cpp index 53983eef177..ff5fe93a860 100644 --- a/waterbox/melon/BizConsoleCreator.cpp +++ b/waterbox/melon/BizConsoleCreator.cpp @@ -63,6 +63,17 @@ static std::unique_ptr CreateBiosImage(u8* biosData, u32 biosLength, std::opt return std::move(bios); } +static bool isValidMacAddress(const melonDS::MacAddress& mac) +{ + // Invalid 48bit MAC address: FF:FF:FF:FF:FF:FF + const bool isAll0xFF = mac[0] == 0xFF && mac[1] == 0xFF && mac[2] == 0xFF && mac[3] == 0xFF && mac[4] == 0xFF && mac[5] == 0xFF; + + // Broadcast channel 48bit MAC address: 03:09:BF:XX:XX:XX + const bool isBroadsast = mac[0] == 0x03 && mac[1] == 0x09 && mac[2] == 0xBF; + + return !isAll0xFF || !isBroadsast; +} + static void SanitizeExternalFirmware(melonDS::Firmware& firmware) { auto& header = firmware.GetHeader(); @@ -84,7 +95,17 @@ static void SanitizeExternalFirmware(melonDS::Firmware& firmware) memset(&header.Bytes[0x28], 0xFF, 2); } - memcpy(&header.Bytes[0x2C], &defaultHeader.Bytes[0x2C], 0x136); + memcpy(&header.Bytes[0x2C], &defaultHeader.Bytes[0x2C], 10); + + // MAC address offset is 0x36, so we skip writing from 0x36 to 0x3B (48 bit) + // to avoid copying melonDS default MAC address 0x0009BF112233 + // only if the external firmware MAC address is valid + if (!isValidMacAddress(header.MacAddr)) + { + memcpy(&header.Bytes[0x36], &defaultHeader.Bytes[0x36], 6); + } + + memcpy(&header.Bytes[0x3C], &defaultHeader.Bytes[0x3C], 0x126); memset(&header.Bytes[0x162], 0xFF, 0x9E); if (isDSiFw)