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