コード例 #1
0
        /// <summary>
        /// Attempts to parse incoming disk data
        /// </summary>
        /// <returns>
        /// TRUE:   disk parsed
        /// FALSE:  unable to parse disk
        /// </returns>
        public override bool ParseDisk(byte[] data)
        {
            // look for standard magic string
            string ident = Encoding.ASCII.GetString(data, 0, 4);

            if (!ident.StartsWith("UDI!") && !ident.StartsWith("udi!"))
            {
                // incorrect format
                return(false);
            }

            if (data[0x08] != 0)
            {
                // wrong version
                return(false);
            }

            if (ident == "udi!")
            {
                // cant handle compression yet
                return(false);
            }

            DiskHeader.DiskIdent      = ident;
            DiskHeader.NumberOfTracks = (byte)(data[0x09] + 1);
            DiskHeader.NumberOfSides  = (byte)(data[0x0A] + 1);

            DiskTracks = new Track[DiskHeader.NumberOfTracks * DiskHeader.NumberOfSides];

            int fileSize = MediaConverter.GetInt32(data, 4);             // not including the final 4-byte checksum

            // ignore extended header
            var extHdrSize = MediaConverter.GetInt32(data, 0x0C);
            int pos        = 0x10 + extHdrSize;

            // process track information
            for (int t = 0; t < DiskHeader.NumberOfTracks; t++)
            {
                DiskTracks[t] = new UDIv1Track
                {
                    TrackNumber = (byte)t,
                    SideNumber  = 0,
                    TrackType   = data[pos++],
                    TLEN        = MediaConverter.GetWordValue(data, pos)
                };
                pos += 2;
                DiskTracks[t].TrackData = new byte[DiskTracks[t].TLEN + DiskTracks[t].CLEN];
                Array.Copy(data, pos, DiskTracks[t].TrackData, 0, DiskTracks[t].TLEN + DiskTracks[t].CLEN);
                pos += DiskTracks[t].TLEN + DiskTracks[t].CLEN;
            }

            return(true);
        }
コード例 #2
0
        /// <summary>
        /// Takes a double-sided disk byte array and converts into 2 single-sided arrays
        /// </summary>
        /// <param name="data"></param>
        /// <param name="results"></param>
        /// <returns></returns>
        public static bool SplitDoubleSided(byte[] data, List <byte[]> results)
        {
            // look for standard magic string
            string ident = Encoding.ASCII.GetString(data, 0, 4);

            if (!ident.StartsWith("UDI!") && !ident.StartsWith("udi!"))
            {
                // incorrect format
                return(false);
            }

            if (data[0x08] != 0)
            {
                // wrong version
                return(false);
            }

            if (ident == "udi!")
            {
                // cant handle compression yet
                return(false);
            }

            byte[] S0 = new byte[data.Length];
            byte[] S1 = new byte[data.Length];

            // header
            var extHdr = MediaConverter.GetInt32(data, 0x0C);

            Array.Copy(data, 0, S0, 0, 0x10 + extHdr);
            Array.Copy(data, 0, S1, 0, 0x10 + extHdr);
            // change side number
            S0[0x0A] = 0;
            S1[0x0A] = 0;

            int pos      = 0x10 + extHdr;
            int fileSize = MediaConverter.GetInt32(data, 4); // not including the final 4-byte checksum

            int s0Pos = pos;
            int s1Pos = pos;

            // process track information
            for (int t = 0; t < (data[0x09] + 1) * 2; t++)
            {
                var TLEN      = MediaConverter.GetWordValue(data, pos + 1);
                var CLEN      = TLEN / 8 + (TLEN % 8 / 7) / 8;
                var blockSize = TLEN + CLEN + 3;

                // 2 sided image: side 0 tracks will all have t as an even number
                try
                {
                    if (t == 0 || t % 2 == 0)
                    {
                        Array.Copy(data, pos, S0, s0Pos, blockSize);
                        s0Pos += blockSize;
                    }
                    else
                    {
                        Array.Copy(data, pos, S1, s1Pos, blockSize);
                        s1Pos += blockSize;
                    }
                }
                catch (Exception ex)
                {
                }


                pos += blockSize;
            }

            // skip checkum bytes for now

            byte[] s0final = new byte[s0Pos];
            byte[] s1final = new byte[s1Pos];
            Array.Copy(S0, 0, s0final, 0, s0Pos);
            Array.Copy(S1, 0, s1final, 0, s1Pos);

            results.Add(s0final);
            results.Add(s1final);

            return(true);
        }