GBA001/Delta/Settings/Cores/SystemBIOS.swift
Riley Testut 8f7e7280f9 Removes support for 128KB DS firmwares
128KB DS firmwares come from DSi/3DS and aren’t bootable, so we consider them unsupported.
2021-03-10 14:32:09 -06:00

146 lines
4.1 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:
// 256KB or 512KB
// DSi/3DS 128KB firmwares technically work but aren't bootable, so we treat them as unsupported.
return Set([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) })
}
}
}