Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/BizHawk.Emulation.Cores/Computers/Commodore64/C64FormatFinder.cs
2 views
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace BizHawk.Emulation.Cores.Computers.Commodore64
{
    public static class C64FormatFinder
    {
        public static C64Format GetFormat(byte[] data)
        {
            if (data == null || data.Length < 0x10)
                return C64Format.Unknown;
            using (var mem = new MemoryStream(data))
            {
                var reader = new BinaryReader(mem);
                var header = Encoding.GetEncoding(437).GetString(reader.ReadBytes(0x10));
                if (header.StartsWith("C64 CARTRIDGE   "))
                    return C64Format.CRT;
                if (header.StartsWith("GCR-1541"))
                    return C64Format.G64;
                if (header.StartsWith("C64S tape image "))
                    return C64Format.T64;
                if (header.StartsWith("C64-TAPE-RAW"))
                    return C64Format.TAP;
                if (header.StartsWith("C64File"))
                    return C64Format.P00;
                if (header.StartsWith("P64-1541"))
                    return C64Format.P64;
                if (data[0] == 0x43 && data[1] == 0x15 && data[2] == 0x41 && data[3] == 0x64)
                    return C64Format.X64;
                if (data.Length == 174848 || data.Length == 175531 || data.Length == 196608 || data.Length == 197376)
                    return C64Format.D64;
                if (data.Length == 349696 || data.Length == 351062)
                    return C64Format.D71;
                if (data.Length == 533248)
                    return C64Format.D80;
                if (data.Length == 819200 || data.Length == 822400)
                    return C64Format.D81;
                if (data.Length == 1066496)
                    return C64Format.D82;
            }
            return C64Format.Unknown;
        }
    }
}