Exemplo n.º 1
0
        private void loadFromStream(Stream stream)
        {
            var crc = CrcUdi.InitValue;
            var hdr = new byte[16];

            stream.Seek(0, SeekOrigin.Begin);
            stream.Read(hdr, 0, hdr.Length);
            crc = CrcUdi.Update(crc, hdr, 0, hdr.Length);

            if (Encoding.ASCII.GetString(hdr, 0, 4) != "UDI!") // check "UDI!"
            {
                Locator.Resolve <IUserMessage>()
                .Error("UDI loader\n\nUnknown *.UDI file identifier!");
                return;
            }

            var size = hdr[4] | hdr[5] << 8 | hdr[6] << 16 | hdr[7] << 24;

            if (stream.Length != (size + 4))
            {
                Locator.Resolve <IUserMessage>()
                .Error("UDI loader\n\nCorrupt *.UDI file!");
                return;
            }
            if (hdr[8] != 0)
            {
                Locator.Resolve <IUserMessage>()
                .Error("UDI loader\n\nUnsupported *.UDI format version!");
                return;
            }

            var cylCount  = hdr[9] + 1;
            var sideCount = hdr[0x0A] + 1;
            var hdr2len   = hdr[0x0C] | hdr[0x0D] << 8 | hdr[0x0E] << 16 | hdr[0x0F] << 24;

            _diskImage.SetPhysics(cylCount, sideCount);

            if (hdr2len > 0)
            {
                byte[] hdr2 = new byte[hdr2len];
                stream.Read(hdr2, 0, hdr2len);
                crc = CrcUdi.Update(crc, hdr2, 0, hdr2.Length);
            }
            //            f.Seek(16 + hdr2len, SeekOrigin.Begin);
            for (var cyl = 0; cyl < cylCount; cyl++)
            {
                for (var side = 0; side < sideCount; side++)
                {
                    stream.Read(hdr, 0, 3);
                    crc = CrcUdi.Update(crc, hdr, 0, 3);
                    var trackType = hdr[0];
                    var trackSize = hdr[1] | hdr[2] << 8;
                    var image     = new byte[2][];
                    image[0] = new byte[trackSize];
                    image[1] = new byte[trackSize / 8 + (((trackSize & 7) != 0) ? 1 : 0)];
                    stream.Read(image[0], 0, image[0].Length);
                    crc = CrcUdi.Update(crc, image[0], 0, image[0].Length);
                    stream.Read(image[1], 0, image[1].Length);
                    crc = CrcUdi.Update(crc, image[1], 0, image[1].Length);
                    _diskImage.GetTrackImage(cyl, side)
                    .AssignImage(image[0], image[1]);
                }
            }

            // check CRC
            stream.Read(hdr, 0, 4);
            var stampCrc = (UInt32)(hdr[0] | hdr[1] << 8 | hdr[2] << 16 | hdr[3] << 24);

            if (stampCrc != crc)
            {
                Locator.Resolve <IUserMessage>()
                .Warning(
                    "UDI loader\n\nCRC ERROR:\nStamp: {0:X8}\nReal: {1:X8}",
                    stampCrc,
                    crc);
            }
        }
Exemplo n.º 2
0
        private void saveToStream(Stream stream)
        {
            stream.SetLength(0);
            stream.Seek(0, SeekOrigin.Begin);

            //var crc = CrcUdi.InitValue;
            var hdr = new byte[16];

            hdr[0] = 0x55;
            hdr[1] = 0x44;
            hdr[2] = 0x49;
            hdr[3] = 0x21;
            // size item (4,5,6,7) later
            hdr[0x08] = 0;
            hdr[0x09] = (byte)(_diskImage.CylynderCount - 1);
            hdr[0x0A] = (byte)(_diskImage.SideCount - 1);
            var hdr2len = 0;

            hdr[0x0C] = (byte)hdr2len;
            hdr[0x0D] = (byte)(hdr2len >> 8);
            hdr[0x0E] = (byte)(hdr2len >> 16);
            hdr[0x0F] = (byte)(hdr2len >> 24);
            stream.Write(hdr, 0, 16);

            if (hdr2len > 0)
            {
                byte[] hdr2 = new byte[hdr2len];
                stream.Write(hdr2, 0, hdr2len);
            }

            for (var cyl = 0; cyl < _diskImage.CylynderCount; cyl++)
            {
                for (var side = 0; side < _diskImage.SideCount; side++)
                {
                    hdr[0] = 0x00; // std MFM track
                    hdr[1] = (byte)_diskImage.GetTrackImage(cyl, side).trklen;
                    hdr[2] = (byte)(_diskImage.GetTrackImage(cyl, side).trklen >> 8);
                    stream.Write(hdr, 0, 3);
                    var image = _diskImage.GetTrackImage(cyl, side).RawImage;
                    stream.Write(image[0], 0, image[0].Length);
                    stream.Write(image[1], 0, image[1].Length);

                    //if(cyl==0&&side==0)
                    //{
                    //   using (FileStream fdbg = new FileStream("00d.dbg", FileMode.Create, FileAccess.ReadWrite, FileShare.Read))
                    //      fdbg.Write(image[0], 0, image[0].Length);
                    //   using (FileStream fdbg = new FileStream("00c.dbg", FileMode.Create, FileAccess.ReadWrite, FileShare.Read))
                    //      fdbg.Write(image[1], 0, image[1].Length);
                    //}
                }
            }

            // set length
            var len = stream.Length;

            hdr[0] = (byte)len;
            hdr[1] = (byte)(len >> 8);
            hdr[2] = (byte)(len >> 16);
            hdr[3] = (byte)(len >> 24);
            stream.Seek(4, SeekOrigin.Begin);
            stream.Write(hdr, 0, 4);

            // set CRC
            stream.Seek(0, SeekOrigin.Begin);
            var tmp = new byte[len];

            stream.Read(tmp, 0, (int)len);
            var crc = CrcUdi.Calculate(tmp, 0, (int)len);

            hdr[0] = (byte)crc;
            hdr[1] = (byte)(crc >> 8);
            hdr[2] = (byte)(crc >> 16);
            hdr[3] = (byte)(crc >> 24);
            stream.Write(hdr, 0, 4);
        }