├── ipf ├── ipf.ico ├── update.png ├── App.xaml ├── BufferWindow.xaml ├── App.xaml.cs ├── Properties │ ├── Settings.settings │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ ├── Settings.Designer.cs │ └── Resources.resx ├── App.config ├── Floppy.cs ├── ipf.dox ├── MainWindow.xaml ├── BufferWindow.xaml.cs ├── utilities.cs ├── ipf.csproj ├── MainWindow.xaml.cs ├── IPFStruct.cs └── IPFWriter.cs ├── pasti ├── PastiStruct.cs ├── App.config ├── Properties │ ├── Settings.settings │ ├── Settings.Designer.cs │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ └── Resources.resx ├── App.xaml ├── App.xaml.cs ├── BufferWindow.xaml ├── pasti.dox ├── MainWindow.xaml ├── FloppyStruct.cs ├── BufferWindow.xaml.cs ├── pasti.csproj ├── MainWindow.xaml.cs ├── PastiRead.cs └── PastiWrite.cs ├── kfstream ├── App.config ├── Properties │ ├── Settings.settings │ ├── Settings.Designer.cs │ ├── AssemblyInfo.cs │ ├── Resources.Designer.cs │ └── Resources.resx ├── App.xaml ├── App.xaml.cs ├── content.xaml ├── content.xaml.cs ├── MainWindow.xaml ├── KFStream.csproj ├── KFWriter.cs ├── MainWindow.xaml.cs └── ProcessStream.cs ├── README.md ├── AIR.sln ├── .gitattributes └── .gitignore /ipf/ipf.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DrCoolzic/AIR/HEAD/ipf/ipf.ico -------------------------------------------------------------------------------- /ipf/update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DrCoolzic/AIR/HEAD/ipf/update.png -------------------------------------------------------------------------------- /pasti/PastiStruct.cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DrCoolzic/AIR/HEAD/pasti/PastiStruct.cs -------------------------------------------------------------------------------- /kfstream/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /pasti/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /kfstream/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /pasti/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /pasti/App.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /kfstream/App.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ipf/App.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /pasti/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | using System.Windows; 8 | 9 | namespace Pasti { 10 | /// 11 | /// Interaction logic for App.xaml 12 | /// 13 | public partial class App : Application { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /kfstream/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | using System.Windows; 8 | 9 | namespace KFStream { 10 | /// 11 | /// Interaction logic for App.xaml 12 | /// 13 | public partial class App : Application { 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ipf/BufferWindow.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /kfstream/content.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /pasti/BufferWindow.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /ipf/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Configuration; 4 | using System.Data; 5 | using System.Linq; 6 | using System.Threading.Tasks; 7 | using System.Windows; 8 | 9 | namespace ipf { 10 | /// 11 | /// Interaction logic for App.xaml 12 | /// 13 | public partial class App : Application { 14 | // used to save size and position 15 | private void Application_Exit(object sender, ExitEventArgs e) { 16 | ipf.Properties.Settings.Default.Save(); 17 | } 18 | 19 | } 20 | 21 | 22 | } 23 | -------------------------------------------------------------------------------- /ipf/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 0 7 | 8 | 9 | 0 10 | 11 | 12 | 600 13 | 14 | 15 | 900 16 | 17 | 18 | True 19 | 20 | 21 | -------------------------------------------------------------------------------- /pasti/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.34014 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace pasti.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /kfstream/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.34209 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace KFStream.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /ipf/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 0 15 | 16 | 17 | 0 18 | 19 | 20 | 600 21 | 22 | 23 | 900 24 | 25 | 26 | True 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /ipf/Floppy.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | namespace ipf { 8 | 9 | /// 10 | /// Store the content of a gap element including the gap value 11 | /// 12 | public class GapElement { 13 | public uint gapBytes; 14 | public byte value; 15 | public GapType type; 16 | } 17 | 18 | /// 19 | /// Store the content of a data element. The sample is a list 20 | /// 21 | public class DataElem { 22 | public uint dataBytes; 23 | public List value; 24 | public DataType type; 25 | } 26 | 27 | /// 28 | /// Store the sector/bloc information 29 | /// 30 | public class Sector { 31 | public uint dataBits; 32 | public uint gapBits; 33 | public List gapElems = new List(); 34 | public List dataElems = new List(); 35 | public BlockFlags flags = BlockFlags.None; 36 | } 37 | 38 | /// 39 | /// Store information about one track 40 | /// 41 | public class Track { 42 | public uint trackBytes; 43 | public uint dataBits; 44 | public uint gapBits; 45 | public Density density; 46 | public uint startBitPos; 47 | public uint blockCount; 48 | public TrackFlags trackFlags; 49 | public List sectors = new List(); 50 | } 51 | 52 | /// 53 | /// Store information about all tracks of a FD 54 | /// 55 | /// We also store the info record to be able to rewrite the same info record 56 | public class Floppy { 57 | public Track[,] tracks; 58 | public InfoRecord info; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /ipf/ipf.dox: -------------------------------------------------------------------------------- 1 | /*! @mainpage IPF File Reader /Writer 2 | 3 |
Copyright (C) 2014 Jean Louis-Guerin\n\n 4 | This file is part of the Atari Image Reader (AIR) project.\n 5 | The Atari Image Reader project may be used and distributed without restriction provided 6 | that this copyright statement is not removed from the file and that any 7 | derivative work contains the original copyright notice and the associated 8 | disclaimer.\n 9 | The Atari Image Reader project is free software; you can redistribute it 10 | and/or modify it under the terms of the GNU General Public License 11 | as published by the Free Software Foundation; either version 2 12 | of the License, or (at your option) any later version.\n 13 | The Atari Image Reader project is distributed in the hope that it will be useful, 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | See the GNU General Public License for more details.\n\n 17 | You should have received a copy of the GNU General Public License 18 | along with the Atari Universal FD Image Tool project; if not, write to the Free Software 19 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n
20 | 21 | @section _intro Introduction 22 | The IPF Reader / Writer is a simple program that reads and writes an IPF file. 23 | It displays in the main window the structure of the IPF file 24 | The main goal of this program is to provide an example of how to read / write an IPF File 25 | 26 | @section progdes Program Description 27 | TODO 28 | 29 | @section proguse Program Usage 30 | Usage should be obvious ... 31 | 32 | @author Jean Louis-Guerin 33 | 34 | */ 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /pasti/pasti.dox: -------------------------------------------------------------------------------- 1 | /*! @mainpage Pasti Reader 2 | 3 |
Copyright (C) 2014 Jean Louis-Guerin\n\n 4 | This file is part of the Atari Image Reader (AIR) project.\n 5 | The Atari Image Reader project may be used and distributed without restriction provided 6 | that this copyright statement is not removed from the file and that any 7 | derivative work contains the original copyright notice and the associated 8 | disclaimer.\n 9 | The Atari Image Reader project is free software; you can redistribute it 10 | and/or modify it under the terms of the GNU General Public License 11 | as published by the Free Software Foundation; either version 2 12 | of the License, or (at your option) any later version.\n 13 | The Atari Image Reader project is distributed in the hope that it will be useful, 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 16 | See the GNU General Public License for more details.\n\n 17 | You should have received a copy of the GNU General Public License 18 | along with the Atari Universal FD Image Tool project; if not, write to the Free Software 19 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n
20 | 21 | @section _intro Introduction 22 | The Pasti Reader is a simple program that reads a Pasti file. 23 | It displays in a window the structure of the PastiFile 24 | The main goal of this program is to provide an example of how to read a Pasti File 25 | 26 | @section progdes Program Description 27 | TODO 28 | 29 | @section proguse Program Usage 30 | This is a Windows Presentation Foundation (WPF) program. 31 | TODO 32 | 33 | @author Jean Louis-Guerin 34 | $Revision: 1.0 $ 35 | $Date: January 2014 $ 36 | */ 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /kfstream/content.xaml.cs: -------------------------------------------------------------------------------- 1 | using KFStreamPackage; 2 | using System; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using System.Windows; 8 | using System.Windows.Controls; 9 | using System.Windows.Data; 10 | using System.Windows.Documents; 11 | using System.Windows.Input; 12 | using System.Windows.Media; 13 | using System.Windows.Media.Imaging; 14 | using System.Windows.Shapes; 15 | 16 | namespace KFStream { 17 | /// 18 | /// Interaction logic for content.xaml 19 | /// 20 | public partial class ContentWindow : Window { 21 | public ContentWindow() { 22 | InitializeComponent(); 23 | } 24 | 25 | 26 | /// 27 | /// Display the flux array for the specified revolution 28 | /// 29 | public void displayFlux(FluxData data, FluxDataRev[] dataRev, int rev) { 30 | 31 | displayBuffer.FontFamily = new FontFamily("Consolas"); 32 | displayBuffer.FontSize = 16; 33 | displayBuffer.FontStyle = FontStyles.Normal; 34 | displayBuffer.FontWeight = FontWeights.Normal; 35 | 36 | displayBuffer.AppendText(String.Format("Revolution {0} has {1} transitions --- time {2} µs\n\n", 37 | rev + 1, dataRev[rev].fluxCount, dataRev[rev].revolutionTime / 1000)); 38 | int firstFlux = dataRev[rev].firstFluxIndex; 39 | int lastFlux = firstFlux + dataRev[rev].fluxCount; 40 | for (int i = firstFlux; i < lastFlux; i += 16) { 41 | displayBuffer.AppendText(String.Format("{0:D5} ", i - firstFlux)); 42 | for (int j = 0; j < 16; j++) { 43 | if ((i + j) < lastFlux) { 44 | int flux = data.fluxValue[i + j]; 45 | displayBuffer.AppendText(String.Format("{0:D4} ", flux)); 46 | } 47 | } 48 | displayBuffer.AppendText(String.Format("\n")); 49 | } 50 | } 51 | } 52 | } 53 | 54 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AIR 2 | === 3 | Atari Image File Reader 4 | 5 | The Atari Image-file Reader-Writer (AIR) public domain project is a collection of programs 6 | that demonstrate how to read or write several of the Atari Image file formats. The source 7 | of the programs can be used as a reasonable example if you need to read or write image files. 8 | While reading or writing the image file the program displays a lot of information about the 9 | internal content of the file. It should be used in conjunction with the image file format 10 | description that I also provide. 11 | 12 | The programs have a nice WPF (Windows Presentation Foundation) Graphical User Interface and are developed in C#. 13 | 14 | Currently the AIR project is composed of 15 | - Pasti File format Reader-Writer 16 | - IPF File format Reader-Writer 17 | - KryoFlux Raw stream file Reader-Writer 18 | 19 | The Atari Image file Reader/Writer project is free software; you can redistribute it 20 | and/or modify it under the terms of the GNU General Public License 21 | as published by the Free Software Foundation; either version 3 22 | of the License, or (at your option) any later version. 23 | https://gnu.org/licenses/gpl.html 24 | 25 | The different Atari image file formats are described in my Atari FD Image Format page http://info-coach.fr/atari/software/Images-formats.php 26 | - Atari Standard Image File Formats http://info-coach.fr/atari/documents/_mydoc/FD_Image_File_Format.pdf 27 | - Interchangeable Preservation Format (IPF) Documentation http://info-coach.fr/atari/documents/_mydoc/IPF-Documentation.pdf 28 | - Pasti File (STX) Documentation http://info-coach.fr/atari/documents/_mydoc/Pasti-documentation.pdf 29 | - Kryoflux Raw Stream File Documentation http://info-coach.fr/atari/documents/_mydoc/kryoflux_stream_protocol.pdf 30 | 31 | Specific documentations can be downloaded from Atari Documentation from DrCoolZic page http://info-coach.fr/atari/documents/myDoc.php 32 | -------------------------------------------------------------------------------- /kfstream/MainWindow.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 18 |