コード例 #1
0
        /// <summary>
        /// Does a "format" of the cyl/head/sec specified by the controller registers.
        /// Does NOT commit to disk, only in memory copy is affected.
        /// </summary>
        private void FormatBlock()
        {
            HardDiskSector sectorData = new HardDiskSector(_cylinder, _head, _sector, _disk.DiskGeometry);

            int dataAddr   = _dataBufferLow | (_dataBufferHigh << 16);
            int headerAddr = _headerAddressLow | (_headerAddressHigh << 16);

            for (int i = 0; i < sectorData.Data.Length; i += 2)
            {
                int word = Memory.MemoryBoard.Instance.FetchWord(dataAddr + (i >> 1));
                sectorData.Data[i]     = (byte)(word & 0xff);
                sectorData.Data[i + 1] = (byte)((word & 0xff00) >> 8);
            }

            // Write the new header data...
            for (int i = 0; i < sectorData.Header.Length; i += 2)
            {
                int word = Memory.MemoryBoard.Instance.FetchWord(headerAddr + (i >> 1));
                sectorData.Header[i]     = (byte)(word & 0xff);
                sectorData.Header[i + 1] = (byte)((word & 0xff00) >> 8);
            }

            // Write the sector to the disk...
            _disk.SetSector(sectorData, _cylinder, _head, _sector);

#if TRACING_ENABLED
            if (Trace.TraceOn)
            {
                Trace.Log(LogType.HardDisk,
                          "Shugart sector format of {0}/{1}/{2} complete, read from memory at {3:x5}",
                          _cylinder, _head, _sector, dataAddr);
            }
#endif
            SetBusyState();
        }
コード例 #2
0
        /// <summary>
        /// Does a read from the cyl/head/sec specified by the controller registers.
        /// </summary>
        private void ReadBlock()
        {
            // Read the sector from the disk...
            HardDiskSector sectorData = _disk.GetSector(_cylinder, _head, _sector);

            int dataAddr   = _dataBufferLow | (_dataBufferHigh << 16);
            int headerAddr = _headerAddressLow | (_headerAddressHigh << 16);

            // Copy the data to the data buffer address
            // and the header to the header address
            for (int i = 0; i < sectorData.Data.Length; i += 2)
            {
                int word = sectorData.Data[i] | (sectorData.Data[i + 1] << 8);
                MemoryBoard.Instance.StoreWord(dataAddr + (i >> 1), (ushort)word);
            }

            for (int i = 0; i < sectorData.Header.Length; i += 2)
            {
                int word = sectorData.Header[i] | (sectorData.Header[i + 1] << 8);
                MemoryBoard.Instance.StoreWord(headerAddr + (i >> 1), (ushort)word);
            }

#if TRACING_ENABLED
            if (Trace.TraceOn)
            {
                Trace.Log(LogType.HardDisk,
                          "Shugart sector read complete from {0}/{1}/{2}, wrote to memory at {3:x5}",
                          _cylinder, _head, _sector, dataAddr);
            }
#endif
            SetBusyState();
        }
コード例 #3
0
        /// <summary>
        /// Does a write to the cyl/head/sec specified by the controller registers.
        /// Does NOT commit to disk, only in memory copy is affected.
        /// </summary>
        private void WriteBlock(bool writeHeader)
        {
            HardDiskSector sectorData = new HardDiskSector(_cylinder, _head, _sector, _disk.DiskGeometry);

            int dataAddr   = _dataBufferLow | (_dataBufferHigh << 16);
            int headerAddr = _headerAddressLow | (_headerAddressHigh << 16);

            for (int i = 0; i < sectorData.Data.Length; i += 2)
            {
                int word = Memory.MemoryBoard.Instance.FetchWord(dataAddr + (i >> 1));
                sectorData.Data[i]     = (byte)(word & 0xff);
                sectorData.Data[i + 1] = (byte)((word & 0xff00) >> 8);
            }

            if (writeHeader)
            {
                for (int i = 0; i < sectorData.Header.Length; i += 2)
                {
                    int word = Memory.MemoryBoard.Instance.FetchWord(headerAddr + (i >> 1));
                    sectorData.Header[i]     = (byte)(word & 0xff);
                    sectorData.Header[i + 1] = (byte)((word & 0xff00) >> 8);
                }
            }
            else
            {
                // Keep the original header data.
                HardDiskSector origSector = _disk.GetSector(_cylinder, _head, _sector);
                origSector.Header.CopyTo(sectorData.Header, 0);
            }

            // Write the sector to the disk...
            _disk.SetSector(sectorData, _cylinder, _head, _sector);

#if TRACING_ENABLED
            if (Trace.TraceOn)
            {
                Trace.Log(LogType.HardDisk,
                          "Shugart sector write complete to {0}/{1}/{2}, read from memory at {3:x5}",
                          _cylinder, _head, _sector, dataAddr);
            }
#endif
            SetBusyState();
        }