#ifndef HIDESECS20_H
#define HIDESECS20_H    (1)

/*****************************************************************
 *                                                               *
 *  Filename:   hidesecs20.h                                     *
 *  Release:    1.62                                             *
 *  Date:       13.11.1991 17:10                                 *
 *                                                               *
 *  'hidedisk.device' - Sector format definitions.               *
 *  20 sectors version.                                          *
 *                                                               *
 *  (C) Copyright 1991 Stefan Klensch All Rights Reserved        *
 *                                                               *
 *****************************************************************/

#ifndef EXEC_TYPES_H
#include "exec/types.h"
#endif

/*****************************************************************
 * Uncoded header area of AmigaDOS floppy. This is 100 % compa-  *
 * tible with OS 1.x/2.0                                         *
 *****************************************************************/

struct RawMfmHeader {                   /* startof                      */
    UBYTE   rmh_Id;                     /* sector id                    */
    UBYTE   rmh_Track;                  /* tracknumber                  */
    UBYTE   rmh_Sector;                 /* sectornumber                 */
    UBYTE   rmh_ToGap;                  /* sectors to gap               */

    UBYTE   rmh_SecLabel[16];           /* sectorlabel                  */
    };                                  /* endof                        */

typedef struct RawMfmHeader RawMfmHeader;

/*****************************************************************
 * Uncoded header Gcr.                                           *
 * No sectorlabel is available in HDxx mode.                     *
 *****************************************************************/

struct RawGcrHeader {                   /* startof                      */
    UBYTE   rgh_Id;                     /* id of sector                 */
    UBYTE   rgh_Track;                  /* should be on this track      */
    UBYTE   rgh_Sector;                 /* current sector               */
    UBYTE   rgh_ToGap;                  /* sectors until gap            */

    UWORD   rgh_HeaderSum;              /* chksum header, placeholder   */
    ULONG   rgh_DataSum;                /* chksum data, placeholder     */
    };                                  /* endof                        */

typedef struct RawGcrHeader RawGcrHeader;

/*****************************************************************
 * Encoded header MFM.                                           *
 *****************************************************************/

struct MfmMfmHeader {                   /* startof                      */
    ULONG   mmh_DoubleZero;             /* 0xAAAAAAAA                   */
    ULONG   mmh_DoubleSync;             /* 0x44894489                   */

    ULONG   mmh_Header[2];              /* encoded header               */
    UWORD   mmh_SecLabel[16];           /* encoded seclabel             */
    ULONG   mmh_HeaderSum[2];           /* chksum header                */
    ULONG   mmh_DataSum[2];             /* chksum data                  */
    };                                  /* endof                        */

typedef struct MfmMfmHeader MfmMfmHeader;

/*****************************************************************
 * Encoded representation of Gcr header.                         *
 *****************************************************************/

struct GcrGcrHeader {                   /* startof                      */
    ULONG   ggh_DoubleSync;             /* 0xF249F249                   */
    
    UBYTE   ggh_IdToGap[5];             /* header-bytes                 */
    UBYTE   ggh_HdrSumShort[5];         /* hdrsum + shortmask           */

    UBYTE   ggh_DataSum[5];             /* datasum long                 */
    UBYTE   ggh_Pad;                    /* fillbyte 0xAA                */
    };                                  /* endof                        */

typedef struct GcrGcrHeader GcrGcrHeader;

/*****************************************************************
 * RawHeader valid for MFM and GCR                               *
 *****************************************************************/

struct RawHeader {                      /* startof                      */
    UBYTE   rh_Id;                      /* sector id                    */
    UBYTE   rh_Track;                   /* tracknumber                  */
    UBYTE   rh_Sector;                  /* sectornumber                 */
    UBYTE   rh_ToGap;                   /* sectors to gap               */
    };                                  /* endof                        */

typedef struct RawHeader RawHeader;

/*****************************************************************
 * Raw codes of GCR for 16 possible nibbles.                     *
 *****************************************************************/

#define GCR00           (0x09)          /* 0000                         */
#define GCR01           (0x0A)          /* 0001                         */
#define GCR02           (0x0B)          /* 0010                         */
#define GCR03           (0x0D)          /* 0011                         */
#define GCR04           (0x0E)          /* 0100                         */
#define GCR05           (0x0F)          /* 0101                         */
#define GCR06           (0x12)          /* 0110                         */
#define GCR07           (0x13)          /* 0111                         */
#define GCR08           (0x15)          /* 1000                         */
#define GCR09           (0x16)          /* 1001                         */
#define GCR10           (0x17)          /* 1010                         */
#define GCR11           (0x19)          /* 1011                         */
#define GCR12           (0x1A)          /* 1100                         */
#define GCR13           (0x1B)          /* 1101                         */
#define GCR14           (0x1D)          /* 1110                         */
#define GCR15           (0x1E)          /* 1111                         */

/*****************************************************************
 * Packed GCR codes. Will be relinked to most frequents.         *
 *****************************************************************/

#define GCRS00          (0x06)          /* s0                           */
#define GCRS01          (0x0A)          /* s1                           */
#define GCRS02          (0x0E)          /* s2                           */
#define GCRS03          (0x0F)          /* s3                           */

#define GCRSHORTS       (4)             /* 4 shorts available           */
#define GCRSHORTBITS    (4)             /* short bits                   */

/*****************************************************************
 * Normal gcr codes for rest.                                    *
 *****************************************************************/

#define GCRL00          (0x09)          /* l00                          */
#define GCRL01          (0x0A)          /* l01                          */
#define GCRL02          (0x0B)          /* l02                          */
#define GCRL03          (0x0E)          /* l03                          */
#define GCRL04          (0x0F)          /* l04                          */
#define GCRL05          (0x12)          /* l05                          */
#define GCRL06          (0x13)          /* l06                          */
#define GCRL07          (0x16)          /* l07                          */
#define GCRL08          (0x17)          /* l08                          */
#define GCRL09          (0x19)          /* l09                          */
#define GCRL10          (0x1A)          /* l10                          */
#define GCRL11          (0x1D)          /* l11                          */

#define GCRLONGS        (12)            /* 12 longs                     */
#define GCRLONGBITS     (5)             /* long bits                    */

/*****************************************************************
 * Maximum number of bits possible.                              *
 *****************************************************************/

#define PGCR_MAXBITS    (64 * 5 * 12 + 64 * 4 * 4)  /* == 608 bytes     */

/*****************************************************************
 * Tracksize of floppy raw. Measured from index->index.          *
 * 12.5 KBytes is default, less for security.                    *
 *****************************************************************/

#define RAWTRACK_SZ (12650)

/*****************************************************************
 * CONSTANTS FOR MFM AND GCR                                     *
 * See hidesecs20.i for description.                             *
 *****************************************************************/

#define MFM_SECID       (0xFF)                      
#define GCR_SECID       (20)
#define MFM_SYNC        (0x4489)
#define GCR_SYNC        (0xF249)
#define MFM_LSYNC       (0x44894489)
#define GCR_LSYNC       (0xF249F249)
#define MFM_NULL        (0xAAAA)
#define GCR_NULL        (0xAAAA)
#define MFM_LNULL       (0xAAAAAAAA)
#define GCR_LNULL       (0xAAAAAAAA)
#define MFM_DATASZ      (512 * 2)
#define GCR_DATASZ      (608)
#define MFM_SECSZ       (MFM_DATASZ + sizeof(MfmMfmHeader))
#define GCR_SECSZ       (GCR_DATASZ + sizeof(GcrGcrHeader))
#define MFM_SECTORS     (11)
#define GCR_SECTORS     (20)
#define MFM_TRACKSZ     (MFM_SECTORS * MFM_SECSZ)
#define GCR_TRACKSZ     (GCR_SECTORS * GCR_SECSZ)
#define MFM_RAWGAP      (RAWTRACK_SZ - MFM_TRACKSZ)
#define GCR_RAWGAP      (RAWTRACK_SZ - GCR_TRACKSZ)
#define MFM_SECURE      (160)
#define GCR_SECURE      (96)
#define MFM_GAP         (MFM_RAWGAP + MFM_SECURE)
#define GCR_GAP         (GCR_RAWGAP + GCR_SECURE)
#define MFM_WRITESZ     (MFM_GAP + MFM_TRACKSZ + 2)
#define GCR_WRITESZ     (GCR_GAP + GCR_TRACKSZ + 2)
#define MFM_READSZ      (MFM_GAP + MFM_TRACKSZ)
#define GCR_READSZ      (GCR_GAP + GCR_TRACKSZ)
#define MFM_BUFSZ       ((2 * MFM_GAP) + MFM_TRACKSZ + 8)
#define GCR_BUFSZ       ((2 * GCR_GAP) + GCR_TRACKSZ + 8)

/*****************************************************************
 * Maximum bufsz of both for alloc.                              *
 *****************************************************************/

#define TRACK_BUFSZ     (MFM_BUFSZ + 16)    /* max. is mfm size         */

/*****************************************************************
 * END of hidesecs20.h                                           *
 *****************************************************************/

#endif
