// /*************************************************************************** // The Disc Image Chef // ---------------------------------------------------------------------------- // // Filename : Apple2.cs // Version : 1.0 // Author(s) : Natalia Portillo // // Component : Apple ][ floppy decoder // // Revision : $Revision$ // Last change by : $Author$ // Date : $Date$ // // --[ Description ] ---------------------------------------------------------- // // Methods and structures for Apple ][ floppy decoding // // --[ License ] -------------------------------------------------------------- // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // ---------------------------------------------------------------------------- // Copyright (C) 2011-2015 Claunia.com // ****************************************************************************/ // //$Id$ using System; using System.Runtime.InteropServices; namespace DiscImageChef.Decoders.Floppy { /// /// Methods and structures for Apple ][ floppy decoding /// public static class Apple2 { /// /// GCR-encoded Apple ][ GCR floppy track /// public struct RawTrack { /// /// Track preamble, set to self-sync 0xFF, between 40 and 95 bytes /// public byte[] gap; public RawSector[] sectors; } /// /// GCR-encoded Apple ][ GCR floppy sector /// public struct RawSector { /// /// Address field /// public RawDataField addressField; /// /// Track preamble, set to self-sync 0xFF, between 5 and 10 bytes /// public byte[] innerGap; /// /// Data field /// public RawDataField dataField; /// /// Track preamble, set to self-sync 0xFF, between 14 and 24 bytes /// public byte[] gap; } /// /// GCR-encoded Apple ][ GCR floppy sector address field /// public struct RawAddressField { /// /// Always 0xD5, 0xAA, 0x96 /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue; /// /// Volume number encoded as: /// volume[0] = (decodedVolume >> 1) | 0xAA /// volume[1] = decodedVolume | 0xAA /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] volume; /// /// Track number encoded as: /// track[0] = (decodedTrack >> 1) | 0xAA /// track[1] = decodedTrack | 0xAA /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] track; /// /// Sector number encoded as: /// sector[0] = (decodedSector >> 1) | 0xAA /// sector[1] = decodedSector | 0xAA /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] sector; /// /// decodedChecksum = decodedVolume ^ decodedTrack ^ decodedSector /// checksum[0] = (decodedChecksum >> 1) | 0xAA /// checksum[1] = decodedChecksum | 0xAA /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public byte[] checksum; /// /// Always 0xDE, 0xAA, 0xEB /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] epilogue; } /// /// GCR-encoded Apple ][ GCR floppy sector data field /// public struct RawDataField { /// /// Always 0xD5, 0xAA, 0xAD /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] prologue; /// /// Encoded data bytes. /// 410 bytes for 5to3 (aka DOS 3.2) format /// 342 bytes for 6to2 (aka DOS 3.3) format /// public byte[] data; public byte checksum; /// /// Always 0xDE, 0xAA, 0xEB /// [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public byte[] epilogue; } } }