/// <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(); }
/// <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(); }
/// <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(); }