/// <inheritdoc /> public FileSystem?TryLoadFileSystem(Stream stream) { using var reader = new BinaryReader(stream, Encoding.ASCII, true); BiosParameterBlock?_bpb; byte bpbOffset = 0x0B; try { _bpb = BiosParameterBlock.Parse(reader, bpbOffset); //Try to parse the BPB at the standard offset } catch (InvalidDataException) { //BPB likely invalid, check if this is an Acorn 800k disk without one if (CheckForAcorn800k(reader)) { return(new Fat12FileSystem(stream, BiosParameterBlock.DefaultAcornParameters)); } else { //BPB likely invalid, try parsing it at 0x50 in case it's an Apricot disk try { bpbOffset = 0x50; _bpb = BiosParameterBlock.Parse(reader, bpbOffset); } catch (InvalidDataException) { //BPB still invalid, it may not even be there, try to figure out if it's a DOS 1.x disk by looking at file length //(we can do this for raw sector images) and the media descriptor byte if (!BiosParameterBlock.DefaultParametersForSize.TryGetValue(stream.Length, out _bpb)) { return(null); } } } } return(GetFatFromBiosParameterBlock(stream, _bpb)); }