private void DumpTrack(int cylinder, int head) { SA1000Drive drive = _system.HardDrive; int sector = 0; int wordIndex = 0; uint data = 0; List <uint> sectorData = new List <uint>(); // Print lead-in to first sector while (wordIndex < drive.WordsPerTrack) { data = drive.DebugRead(cylinder, head, wordIndex); wordIndex++; if (data == 0x1a141) { break; } else { sectorData.Add(data); } } WriteLine("Lead-in to sector 0:"); PrintSectorData(sectorData); sectorData.Clear(); // Print sector data while (wordIndex < drive.WordsPerTrack) { data = drive.DebugRead(cylinder, head, wordIndex); wordIndex++; if (data == 0x1a141 || wordIndex == drive.WordsPerTrack - 1) { WriteLine(String.Format("Sector {0}:", sector)); PrintSectorData(sectorData); sectorData.Clear(); sector++; } else { sectorData.Add(data); } } }
private void AnalyzeDisk() { SA1000Drive drive = _system.HardDrive; WriteLine(String.Format("Drive is type {0}", drive.Type)); for (int cylinder = 0; cylinder < drive.Geometry.Cylinders; cylinder++) { for (int head = 0; head < drive.Geometry.Heads; head++) { int sector = -1; int field = 0; for (int word = 0; word < drive.WordsPerTrack; word++) { // // Walk the track, looking for sector marks. // There should be 16 sets of: // - Header mark // - Label mark // - Data mark // - CRC mark // In exactly that order // // Verify the header data // uint data = drive.DebugRead(cylinder, head, word); bool isAddressMark = (data & 0x10000) != 0; bool isCRC = (data & 0x20000) != 0; switch (field) { case 0: if (data == 0x1a141) // header { // This is the header mark, increment the sector count // move to next field. sector++; field++; } else if (data == 0x1a143) // label / data { // Unexpected here. WriteLine(String.Format("Unexpected label/data mark before header mark at c/h/s (w) {0}/{1}/{2} ({3})", cylinder, head, sector, word)); } else if (data == 0x2beef) { /* * // Unexpected here. * WriteLine(String.Format("Unexpected CRC before header mark at c/h/s (w) {0}/{1}/{2} ({3})", * cylinder, * head, * sector, * word)); */ } break; case 1: if (data == 0x1a143) // label / data { // This is the label mark, move to next field. field++; } else if (data == 0x1a141) // header { // Unexpected header mark here. WriteLine(String.Format("Unexpected header mark after header mark at c/h/s (w) {0}/{1}/{2} ({3})", cylinder, head, sector, word)); } else if (data == 0x2beef) { /* * // Unexpected here. * WriteLine(String.Format("Unexpected CRC after header mark at c/h/s (w) {0}/{1}/{2} ({3})", * cylinder, * head, * sector, * word)); */ } break; case 2: if (data == 0x1a143) // label / data { // This is the data mark, move to CRC. field++; } else if (data == 0x1a141) // header { // Unexpected header mark here. WriteLine(String.Format("Unexpected header mark after label mark at c/h/s (w) {0}/{1}/{2} ({3})", cylinder, head, sector, word)); } else if (data == 0x2beef) { /* * // Unexpected here. * WriteLine(String.Format("Unexpected CRC after label mark at c/h/s (w) {0}/{1}/{2} ({3})", * cylinder, * head, * sector, * word)); */ } break; case 3: if (data == 0x2beef) // CRC { // This is the CRC, move back to header state. field = 0; } else if (isAddressMark) { // Unexpected header mark here. WriteLine(String.Format("Unexpected address mark after data mark at c/h/s (w) {0}/{1}/{2} ({3})", cylinder, head, sector, word)); } break; } } // Check sector count. Should be 15. if (sector != 15) { WriteLine(String.Format("Unexpected sector count {0} at c/h {1}/{2}", sector, cylinder, head)); } } } }