#ifndef HIDESECS19_H
#define HIDESECS19_H    (1)

/*****************************************************************
 *                                                               *
 *  Filename:   hidesecs19.h                                     *
 *  Release:    1.59                                             *
 *  Date:       13.11.1991 17:09                                 *
 *                                                               *
 *  'hidedisk.device' - Sector format definitions.               *
 *  19 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;             /* 0xDBFFDBFF                   */
    
    UBYTE   ggh_IdToGap[5];             /* header-bytes                 */
    UBYTE   ggh_HeaderSum[4];           /* headercheck (upper 30 bits)  */
    UBYTE   ggh_DataSum[5];             /* datasum long                 */
    };                                  /* 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                         */

/*****************************************************************
 * 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 hidesecs19.i for description.                             *
 *****************************************************************/

#define MFM_SECID       (0xFF)                      
#define GCR_SECID       (19)
#define MFM_SYNC        (0x4489)
#define GCR_SYNC        (0xDBFF)
#define MFM_LSYNC       (0x44894489)
#define GCR_LSYNC       (0xDBFFDBFF)
#define MFM_NULL        (0xAAAA)
#define GCR_NULL        (0xAAAA)
#define MFM_LNULL       (0xAAAAAAAA)
#define GCR_LNULL       (0xAAAAAAAA)
#define MFM_DATASZ      (512 * 2)
#define GCR_DATASZ      ((512 * 5) / 4)
#define MFM_SECSZ       (MFM_DATASZ + sizeof(MfmMfmHeader))
#define GCR_SECSZ       (GCR_DATASZ + sizeof(GcrGcrHeader))
#define MFM_SECTORS     (11)
#define GCR_SECTORS     (19)
#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 hidesecs19.h                                           *
 *****************************************************************/

#endif
