From eeb824d035ac8bf0c6cf2046a0fbf4346790163f Mon Sep 17 00:00:00 2001 From: CasualPokePlayer <50538166+CasualPokePlayer@users.noreply.github.com> Date: Sat, 4 Nov 2023 05:32:17 -0700 Subject: [PATCH] add in Chinese / Korean language options, remove unneeded firmware checks --- .../Nintendo/NDS/MelonDS.ISettable.cs | 3 + .../Consoles/Nintendo/NDS/NDSFirmware.cs | 76 +------------------ 2 files changed, 5 insertions(+), 74 deletions(-) diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.ISettable.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.ISettable.cs index e60e4ec33f..6770a52b21 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.ISettable.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/MelonDS.ISettable.cs @@ -329,11 +329,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS German, Italian, Spanish, + Chinese, + Korean, } [DisplayName("Firmware Language")] [Description("Language in firmware. Only applicable if firmware override is in effect.")] [DefaultValue(Language.English)] + [TypeConverter(typeof(DescribableEnumConverter))] public Language FirmwareLanguage { get; set; } public enum Month : int diff --git a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/NDSFirmware.cs b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/NDSFirmware.cs index 5f0908e05c..b60bb5e150 100644 --- a/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/NDSFirmware.cs +++ b/src/BizHawk.Emulation.Cores/Consoles/Nintendo/NDS/NDSFirmware.cs @@ -6,6 +6,7 @@ using BizHawk.Common; namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS { // mostly a c++ -> c# port of melon's firmware verification code + // TODO: a lot of this has been removed as it's not really needed anymore (our c++ code forces correctness everywhere) internal static class NDSFirmware { public static void MaybeWarnIfBadFw(byte[] fw, Action warningCallback) @@ -16,86 +17,13 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.NDS return; } - var fwMask = fw.Length - 1; - var badCrc16s = string.Empty; - - if (!VerifyCrc16(fw, 0x2C, (fw[0x2C + 1] << 8) | fw[0x2C], 0x0000, 0x2A)) - { - badCrc16s += " Wifi "; - } - - if (!VerifyCrc16(fw, 0x7FA00 & fwMask, 0xFE, 0x0000, 0x7FAFE & fwMask)) - { - badCrc16s += " AP1 "; - } - - if (!VerifyCrc16(fw, 0x7FB00 & fwMask, 0xFE, 0x0000, 0x7FBFE & fwMask)) - { - badCrc16s += " AP2 "; - } - - if (!VerifyCrc16(fw, 0x7FC00 & fwMask, 0xFE, 0x0000, 0x7FCFE & fwMask)) - { - badCrc16s += " AP3 "; - } - - if (!VerifyCrc16(fw, 0x7FE00 & fwMask, 0x70, 0xFFFF, 0x7FE72 & fwMask)) - { - badCrc16s += " USER0 "; - } - - if (!VerifyCrc16(fw, 0x7FF00 & fwMask, 0x70, 0xFFFF, 0x7FF72 & fwMask)) - { - badCrc16s += " USER1 "; - } - - if (badCrc16s != string.Empty) - { - warningCallback("Bad Firmware CRC16(s) detected! Firmware might not work! Bad CRC16(s): " + badCrc16s); - return; - } - if (fw.Length != 0x20000) // no code in DSi firmware { + // TODO: is this hashing strat actually a good idea? CheckDecryptedCodeChecksum(fw, warningCallback); } } - private static unsafe ushort Crc16(byte* data, int len, int seed) - { - Span poly = stackalloc ushort[8] { 0xC0C1, 0xC181, 0xC301, 0xC601, 0xCC01, 0xD801, 0xF001, 0xA001 }; - - for (var i = 0; i < len; i++) - { - seed ^= data[i]; - - for (var j = 0; j < 8; j++) - { - if ((seed & 0x1) != 0) - { - seed >>= 1; - seed ^= (poly[j] << (7 - j)); - } - else - { - seed >>= 1; - } - } - } - - return (ushort)(seed & 0xFFFF); - } - - private static unsafe bool VerifyCrc16(byte[] fw, int startaddr, int len, int seed, int crcaddr) - { - var storedCrc16 = (ushort)((fw[crcaddr + 1] << 8) | fw[crcaddr]); - fixed (byte* start = &fw[startaddr]) - { - var actualCrc16 = Crc16(start, len, seed); - return storedCrc16 == actualCrc16; - } - } - [DllImport("libfwunpack", CallingConvention = CallingConvention.Cdecl)] private static extern bool GetDecryptedFirmware(byte[] fw, int fwlen, out IntPtr decryptedFw, out int decryptedlen);