DSi BIOS files can have various hashes, so rather than compare them against an expected hash, we now compare them against unsupported hashes and throw an error if it matches one.
145 lines
4.0 KiB
Swift
145 lines
4.0 KiB
Swift
//
|
|
// SystemBIOS.swift
|
|
// Delta
|
|
//
|
|
// Created by Riley Testut on 1/19/21.
|
|
// Copyright © 2021 Riley Testut. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
import MelonDSDeltaCore
|
|
|
|
protocol SystemBIOS
|
|
{
|
|
var fileURL: URL { get }
|
|
var filename: String { get }
|
|
|
|
var expectedMD5Hash: String? { get }
|
|
var unsupportedMD5Hashes: Set<String> { get }
|
|
|
|
// RangeSet would be preferable, but it's not in Swift stdlib yet.
|
|
@available(iOS 13, *)
|
|
var validFileSizes: Set<ClosedRange<Measurement<UnitInformationStorage>>> { get }
|
|
}
|
|
|
|
extension SystemBIOS
|
|
{
|
|
var filename: String {
|
|
return self.fileURL.lastPathComponent
|
|
}
|
|
|
|
var expectedMD5Hash: String? {
|
|
return nil
|
|
}
|
|
|
|
var unsupportedMD5Hashes: Set<String> {
|
|
return []
|
|
}
|
|
}
|
|
|
|
enum DSBIOS: SystemBIOS, CaseIterable
|
|
{
|
|
case bios7
|
|
case bios9
|
|
case firmware
|
|
|
|
var fileURL: URL {
|
|
switch self
|
|
{
|
|
case .bios7: return MelonDSEmulatorBridge.shared.bios7URL
|
|
case .bios9: return MelonDSEmulatorBridge.shared.bios9URL
|
|
case .firmware: return MelonDSEmulatorBridge.shared.firmwareURL
|
|
}
|
|
}
|
|
|
|
var expectedMD5Hash: String? {
|
|
switch self
|
|
{
|
|
case .bios7: return "df692a80a5b1bc90728bc3dfc76cd948"
|
|
case .bios9: return "a392174eb3e572fed6447e956bde4b25"
|
|
case .firmware: return nil
|
|
}
|
|
}
|
|
|
|
@available(iOS 13, *)
|
|
var validFileSizes: Set<ClosedRange<Measurement<UnitInformationStorage>>> {
|
|
// From http://melonds.kuribo64.net/faq.php
|
|
switch self
|
|
{
|
|
case .bios7:
|
|
// 16KB
|
|
return Set([16].map { Measurement(value: $0, unit: .kibibytes) }.map { $0...$0 })
|
|
case .bios9:
|
|
// 4KB
|
|
return Set([4].map { Measurement(value: $0, unit: .kibibytes) }.map { $0...$0 })
|
|
case .firmware:
|
|
// 128KB, 256KB, or 512KB
|
|
return Set([128, 256, 512].map { Measurement(value: $0, unit: .kibibytes) }.map { $0...$0 })
|
|
}
|
|
}
|
|
}
|
|
|
|
enum DSiBIOS: SystemBIOS, CaseIterable
|
|
{
|
|
case bios7
|
|
case bios9
|
|
case firmware
|
|
case nand
|
|
|
|
var fileURL: URL {
|
|
switch self
|
|
{
|
|
case .bios7: return MelonDSEmulatorBridge.shared.dsiBIOS7URL
|
|
case .bios9: return MelonDSEmulatorBridge.shared.dsiBIOS9URL
|
|
case .firmware: return MelonDSEmulatorBridge.shared.dsiFirmwareURL
|
|
case .nand: return MelonDSEmulatorBridge.shared.dsiNANDURL
|
|
}
|
|
}
|
|
|
|
var unsupportedMD5Hashes: Set<String> {
|
|
switch self
|
|
{
|
|
case .bios7:
|
|
return [
|
|
"c8b9fe70f1ef5cab8e55540cd1c13dc8", // BIOSDSI7.ROM
|
|
"3fbb3f39bd9a96e5d743f138bd4b9907", // BIOSDSI9.ROM
|
|
"87b665fce118f76251271c3732532777", // bios9i.bin
|
|
]
|
|
|
|
case .bios9:
|
|
return [
|
|
"c8b9fe70f1ef5cab8e55540cd1c13dc8", // BIOSDSI7.ROM
|
|
"3fbb3f39bd9a96e5d743f138bd4b9907", // BIOSDSI9.ROM
|
|
"559dae4ea78eb9d67702c56c1d791e81", // bios7i.bin
|
|
]
|
|
|
|
case .firmware: return []
|
|
case .nand: return []
|
|
}
|
|
}
|
|
|
|
@available(iOS 13, *)
|
|
var validFileSizes: Set<ClosedRange<Measurement<UnitInformationStorage>>> {
|
|
// From http://melonds.kuribo64.net/faq.php
|
|
switch self
|
|
{
|
|
case .bios7:
|
|
// 64KB
|
|
return Set([64].map { Measurement(value: $0, unit: .kibibytes) }.map { $0...$0 })
|
|
|
|
case .bios9:
|
|
// 64KB
|
|
return Set([64].map { Measurement(value: $0, unit: .kibibytes) }.map { $0...$0 })
|
|
|
|
case .firmware:
|
|
// 128KB
|
|
return Set([128].map { Measurement(value: $0, unit: .kibibytes) }.map { $0...$0 })
|
|
|
|
case .nand:
|
|
// 200MB - 300MB
|
|
return Set([200...300].map { Measurement(value: $0.lowerBound, unit: .mebibytes) ... Measurement(value: $0.upperBound, unit: .mebibytes) })
|
|
}
|
|
}
|
|
}
|