26 using Microsoft.Win32;
28 using System.Collections.Generic;
32 using System.Threading.Tasks;
34 using System.Windows.Controls;
36 using System.Windows.Documents;
37 using System.Windows.Input;
38 using System.Windows.Media;
39 using System.Windows.Media.Imaging;
40 using System.Windows.Navigation;
41 using System.Windows.Shapes;
51 bool _trackWindowOpen =
false;
52 bool _sectorWindowOpen =
false;
55 InitializeComponent();
56 string version =
System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
57 string progName =
"Pasti STX File Reader-Writer " + version;
62 private void btFileClick(
object sender, RoutedEventArgs e) {
63 OpenFileDialog ofd =
new OpenFileDialog();
64 ofd.Filter =
"Pasti file|*.stx|All Files|*.*";
65 bool? ok = ofd.ShowDialog();
67 fileName.Text = ofd.FileName;
68 processFile(ofd.FileName);
75 private void processFile(
string file) {
83 private void btWriteClick(
object sender, RoutedEventArgs e) {
86 MessageBox.Show(
"Nothing to write",
"Error", MessageBoxButton.OK, MessageBoxImage.Error);
90 SaveFileDialog sfd =
new SaveFileDialog();
91 sfd.Filter =
"Pasti file|*.stx|All Files|*.*";
94 bool? ok = sfd.ShowDialog();
96 fileName.Text = sfd.FileName;
107 private void btTrackClick(
object sender, RoutedEventArgs e) {
109 tbStatus.Text =
"Nothing to display";
115 if (Int32.TryParse(tbTrack.Text, out trackNumber) ==
false)
116 tbStatus.Text =
"Invalid track number - please correct and try again";
117 if (Int32.TryParse(tbSide.Text, out sideNumber) ==
false)
118 tbStatus.Text =
"Invalid side number - please correct and try again";
120 if ((trackNumber < 0) || (trackNumber > 84) || (sideNumber < 0) || (sideNumber > 1))
121 tbStatus.Text =
"Track or Side out of range - please correct and try again";
123 tbStatus.Text =
"Nothing to display";
125 if (_trackWindowOpen)
126 _trackWindow.Close();
130 _trackWindow.Closed +=
new EventHandler(trackWindowClosed);
131 _trackWindowOpen =
true;
135 void trackWindowClosed(
object sender, EventArgs e) {
136 _trackWindowOpen =
false;
140 private void btSectorsClick(
object sender, RoutedEventArgs e) {
142 tbStatus.Text =
"Nothing to display";
148 if (Int32.TryParse(tbTrack.Text, out trackNumber) ==
false)
149 tbStatus.Text =
"Invalid track number - please correct and try again";
150 if (Int32.TryParse(tbSide.Text, out sideNumber) ==
false)
151 tbStatus.Text =
"Invalid side number - please correct and try again";
153 if ((trackNumber < 0) || (trackNumber > 84) || (sideNumber < 0) || (sideNumber > 1))
154 tbStatus.Text =
"Track or Side out of range - please correct and try again";
156 tbStatus.Text =
"Nothing to display";
158 if (_sectorWindowOpen)
159 _sectorWindow.Close();
163 _sectorWindow.Closed +=
new EventHandler(sectorWindowClosed);
164 _sectorWindowOpen =
true;
165 _sectorWindow.Show();
169 void sectorWindowClosed(
object sender, EventArgs e) {
170 _sectorWindowOpen =
false;
174 private void btAllSectorsClick(
object sender, RoutedEventArgs e) {
177 tbStatus.Text =
"Nothing to display";
181 SaveFileDialog sfd =
new SaveFileDialog();
182 sfd.Filter =
"Text file|*.txt|All Files|*.*";
183 if (sfd.ShowDialog() ==
true) {
184 displayAllSectorBuffer(_fd, sfd.FileName);
190 public void displayAllSectorBuffer(
Floppy floppy,
string filename) {
191 StringBuilder sb =
new StringBuilder();
193 for (
int track = 0; track < 84; track++) {
194 for (
int side = 0; side < 2; side++) {
196 if (t == null)
continue;
198 sb.Append(String.Format(
"Track {0:D2}.{1} has {2} sectors\n", track, side, t.
sectorCount));
201 sb.Append(String.Format(
" T={0} H={1} N={2} S={3} CRC={4:X4}",
205 sb.Append(String.Format(
" has {0} bytes\n", t.
sectors[sect].
sectorData.Count()));
208 "Good CRC" :
"Bad CRC", (t.
sectors[sect].
fuzzyData != null) ?
"Has Fuzzy bytes" :
""));
211 sb.Append(String.Format(
"\nFuzzy bytes for sector {0}\n", t.
sectors[sect].
fuzzyData.Count()));
215 sb.Append(String.Format(
"\nTiming values for sector {0}\n", t.
sectors[sect].
timmingData.Count()));
219 saveBuffer(timming, sb);
224 sb.Append(
" *** Sector has no data ***\n");
229 using (StreamWriter outputfile =
new StreamWriter(filename)) {
230 outputfile.Write(sb.ToString());
235 public void saveBuffer(byte[] buffer, StringBuilder sb) {
236 for (
int i = 0; i < buffer.Count(); i += 16) {
237 sb.Append(String.Format(
"{0:D5} ", i));
240 for (
int j = 0; j < 16; j++) {
241 if ((i + j) < buffer.Count()) {
242 sb.Append(String.Format(
"{0:X2} ", buffer[i + j]));
243 char ch = Convert.ToChar(buffer[i + j]);
244 ascii += Char.IsControl(ch) ?
"." : ch.ToString();
247 sb.Append(String.Format(
" "));
250 sb.Append(String.Format(
"\n"));
255 private void fileDrop(
object sender, DragEventArgs e) {
256 string[] droppedFiles = null;
257 if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
258 droppedFiles = e.Data.GetData(DataFormats.FileDrop,
true) as
string[];
261 if ((null == droppedFiles) || (!droppedFiles.Any())) {
return; }
262 processFile(droppedFiles[0]);
266 private void dragEnter(
object sender, DragEventArgs e) {
Track[,] tracks
Array of Tracks
Interaction logic for MainWindow.xaml
ushort crc
CRC Value from address field
byte track
Track number from address field
uint sectorCount
Number of sectors for this track
ushort bitPosition
position in the track of the sector address field in bits
byte size
Size value from address field
PastiStatus readPasti(string fileName, Floppy fd)
Read a Pasti file and fills the Floppy structure
Contains information about one Track
void displaySectorBuffer(Floppy floppy, int track, int side)
Draw the content of the buffer
Interaction logic for TrackBuffer.xaml
Contains information about a complete Floppy disk
IDField id
Address field content
const byte CRC_ERR
CRC Error (in Data if RNF=0 else in ID)
Pasti File Sector Descriptor
byte number
Sector number from address field
Sector[] sectors
Array of Sectors
byte[] sectorData
buffer for the sector data
void displayTrackBuffer(Floppy floppy, int track, int side)
Display the content of the Track Information in a textbox
ushort[] timmingData
buffer for timing bytes if necessary
WriteStatus writePasti(string fileName, Floppy fd)
Read a Pasti file and fills the Floppy structure
byte side
Head number from address field
byte[] fuzzyData
buffer for fuzzy mask bytes if necessary
byte fdcFlags
Status returned by the FDC