[Contents] [Index] [Help] [Retrace] [browse <] [Browse >]

#ifndef DEVICES_TRACKDISK_H
#define DEVICES_TRACKDISK_H

/*
**
**      $Filename: devices/trackdisk.h $
**      $Release: 2.04 Includes, V37.4 $
**      $Revision: 33.13 $
**      $Date: 90/11/28 $
**
**      trackdisk device structure and value definitions
**
**      (C) Copyright 1985-1999 Amiga, Inc.
**          All Rights Reserved
**
*/

#ifndef EXEC_IO_H
#include "exec/io.h"
#endif

#ifndef EXEC_DEVICES_H
#include "exec/devices.h"
#endif

/*
 *--------------------------------------------------------------------
 *
 * Physical drive constants
 *
 *--------------------------------------------------------------------
 */

/* OBSOLETE -- use the TD_GETNUMTRACKS command! */
/*#define       NUMCYLS 80*/            /*  normal # of cylinders */
/*#define       MAXCYLS (NUMCYLS+20)*/  /* max # cyls to look for during cal */
/*#define       NUMHEADS 2*/
/*#define       NUMTRACKS (NUMCYLS*NUMHEADS)*/

#define        NUMSECS 11
#define NUMUNITS 4

/*
 *--------------------------------------------------------------------
 *
 * Useful constants
 *
 *--------------------------------------------------------------------
 */

/*-- sizes before mfm encoding */
#define        TD_SECTOR 512
#define TD_SECSHIFT 9           /* log TD_SECTOR */

/*
 *--------------------------------------------------------------------
 *
 * Driver Specific Commands
 *
 *--------------------------------------------------------------------
 */

/*
 *-- TD_NAME is a generic macro to get the name of the driver.  This
 *-- way if the name is ever changed you will pick up the change
 *-- automatically.
 *--
 *-- Normal usage would be:
 *--
 *-- char internalName[] = TD_NAME;
 *--
 */

#define TD_NAME "trackdisk.device"

#define TDF_EXTCOM (1<<15)            /* for internal use only! */


#define        TD_MOTOR        (CMD_NONSTD+0)  /* control the disk's motor */
#define        TD_SEEK         (CMD_NONSTD+1)  /* explicit seek (for testing) */
#define        TD_FORMAT       (CMD_NONSTD+2)  /* format disk */
#define        TD_REMOVE       (CMD_NONSTD+3)  /* notify when disk changes */
#define        TD_CHANGENUM    (CMD_NONSTD+4)  /* number of disk changes */
#define        TD_CHANGESTATE  (CMD_NONSTD+5)  /* is there a disk in the drive? */
#define        TD_PROTSTATUS   (CMD_NONSTD+6)  /* is the disk write protected? */
#define        TD_RAWREAD      (CMD_NONSTD+7)  /* read raw bits from the disk */
#define        TD_RAWWRITE     (CMD_NONSTD+8)  /* write raw bits to the disk */
#define        TD_GETDRIVETYPE (CMD_NONSTD+9)  /* get the type of the disk drive */
#define        TD_GETNUMTRACKS (CMD_NONSTD+10) /* # of tracks for this type drive */
#define        TD_ADDCHANGEINT (CMD_NONSTD+11) /* TD_REMOVE done right */
#define        TD_REMCHANGEINT (CMD_NONSTD+12) /* remove softint set by ADDCHANGEINT */
#define TD_GETGEOMETRY (CMD_NONSTD+13) /* gets the disk geometry table */
#define TD_EJECT       (CMD_NONSTD+14) /* for those drives that support it */
#define TD_LASTCOMM     (CMD_NONSTD+15)

/*
 *
 * The disk driver has an "extended command" facility.        These commands
 * take a superset of the normal IO Request block.
 *
 */

#define       ETD_WRITE       (CMD_WRITE|TDF_EXTCOM)
#define       ETD_READ        (CMD_READ|TDF_EXTCOM)
#define       ETD_MOTOR       (TD_MOTOR|TDF_EXTCOM)
#define       ETD_SEEK        (TD_SEEK|TDF_EXTCOM)
#define       ETD_FORMAT      (TD_FORMAT|TDF_EXTCOM)
#define       ETD_UPDATE      (CMD_UPDATE|TDF_EXTCOM)
#define       ETD_CLEAR       (CMD_CLEAR|TDF_EXTCOM)
#define       ETD_RAWREAD     (TD_RAWREAD|TDF_EXTCOM)
#define ETD_RAWWRITE    (TD_RAWWRITE|TDF_EXTCOM)

/*
 *
 * extended IO has a larger than normal io request block.
 *
 */

struct IOExtTD {
      struct  IOStdReq iotd_Req;
      ULONG   iotd_Count;
        ULONG   iotd_SecLabel;
};

/*
 *  This is the structure returned by TD_DRIVEGEOMETRY
 *  Note that the layout can be defined three ways:
 *
 *  1. TotalSectors
 *  2. Cylinders and CylSectors
 *  3. Cylinders, Heads, and TrackSectors.
 *
 *  #1 is most accurate, #2 is less so, and #3 is least accurate.  All
 *  are usable, though #2 and #3 may waste some portion of the available
 *  space on some drives.
 */
struct DriveGeometry {
      ULONG   dg_SectorSize;          /* in bytes */
      ULONG   dg_TotalSectors;        /* total # of sectors on drive */
      ULONG   dg_Cylinders;           /* number of cylinders */
      ULONG   dg_CylSectors;          /* number of sectors/cylinder */
      ULONG   dg_Heads;               /* number of surfaces */
      ULONG   dg_TrackSectors;        /* number of sectors/track */
        ULONG   dg_BufMemType;          /* preferred buffer memory type */
                                      /* (usually MEMF_PUBLIC) */
      UBYTE   dg_DeviceType;          /* codes as defined in the SCSI-2 spec*/
      UBYTE   dg_Flags;               /* flags, including removable */
        UWORD   dg_Reserved;
};

/* device types */
#define DG_DIRECT_ACCESS      0
#define DG_SEQUENTIAL_ACCESS  1
#define DG_PRINTER            2
#define DG_PROCESSOR          3
#define DG_WORM                       4
#define DG_CDROM              5
#define DG_SCANNER            6
#define DG_OPTICAL_DISK               7
#define DG_MEDIUM_CHANGER     8
#define DG_COMMUNICATION      9
#define DG_UNKNOWN              31

/* flags */
#define DGB_REMOVABLE         0
#define DGF_REMOVABLE           1

/*
** raw read and write can be synced with the index pulse.  This flag
** in io request's IO_FLAGS field tells the driver that you want this.
*/

#define IOTDB_INDEXSYNC       4
#define IOTDF_INDEXSYNC (1<<4)
/*
** raw read and write can be synced with a $4489 sync pattern.  This flag
** in io request's IO_FLAGS field tells the driver that you want this.
*/
#define IOTDB_WORDSYNC        5
#define IOTDF_WORDSYNC (1<<5)


/* labels are TD_LABELSIZE bytes per sector */

#define TD_LABELSIZE 16

/*
** This is a bit in the FLAGS field of OpenDevice.  If it is set, then
** the driver will allow you to open all the disks that the trackdisk
** driver understands.  Otherwise only 3.5" disks will succeed.
*/

#define TDB_ALLOW_NON_3_5     0
#define TDF_ALLOW_NON_3_5       (1<<0)

/*
**  If you set the TDB_ALLOW_NON_3_5 bit in OpenDevice, then you don't
**  know what type of disk you really got.  These defines are for the
**  TD_GETDRIVETYPE command.  In addition, you can find out how many
**  tracks are supported via the TD_GETNUMTRACKS command.
*/

#define       DRIVE3_5        1
#define       DRIVE5_25       2
#define DRIVE3_5_150RPM 3

/*
 *--------------------------------------------------------------------
 *
 * Driver error defines
 *
 *--------------------------------------------------------------------
 */

#define       TDERR_NotSpecified      20      /* general catchall */
#define       TDERR_NoSecHdr          21      /* couldn't even find a sector */
#define       TDERR_BadSecPreamble    22      /* sector looked wrong */
#define       TDERR_BadSecID          23      /* ditto */
#define       TDERR_BadHdrSum         24      /* header had incorrect checksum */
#define       TDERR_BadSecSum         25      /* data had incorrect checksum */
#define       TDERR_TooFewSecs        26      /* couldn't find enough sectors */
#define       TDERR_BadSecHdr         27      /* another "sector looked wrong" */
#define       TDERR_WriteProt         28      /* can't write to a protected disk */
#define       TDERR_DiskChanged       29      /* no disk in the drive */
#define       TDERR_SeekError         30      /* couldn't find track 0 */
#define       TDERR_NoMem             31      /* ran out of memory */
#define       TDERR_BadUnitNum        32      /* asked for a unit > NUMUNITS */
#define       TDERR_BadDriveType      33      /* not a drive that trackdisk groks */
#define       TDERR_DriveInUse        34      /* someone else allocated the drive */
#define TDERR_PostReset         35      /* user hit reset; awaiting doom */

/*
 *--------------------------------------------------------------------
 *
 * public portion of the unit structure
 *
 *--------------------------------------------------------------------
 */

struct TDU_PublicUnit {
      struct  Unit tdu_Unit;          /* base message port */
      UWORD   tdu_Comp01Track;        /* track for first precomp */
      UWORD   tdu_Comp10Track;        /* track for second precomp */
      UWORD   tdu_Comp11Track;        /* track for third precomp */
      ULONG   tdu_StepDelay;          /* time to wait after stepping */
      ULONG   tdu_SettleDelay;        /* time to wait after seeking */
      UBYTE   tdu_RetryCnt;           /* # of times to retry */
      UBYTE   tdu_PubFlags;           /* public flags, see below */
        UWORD   tdu_CurrTrk;            /* track the heads are over... */
                                      /* ONLY ACCESS WHILE UNIT IS STOPPED! */
        ULONG   tdu_CalibrateDelay;     /* time to wait after stepping */
                                      /* during a recalibrate */
        ULONG   tdu_Counter;            /* counter for disk changes... */
                                        /* ONLY ACCESS WHILE UNIT IS STOPPED! */
};

/* flags for tdu_PubFlags */
#define TDPB_NOCLICK  0
#define TDPF_NOCLICK    (1L << 0)

#endif  /* DEVICES_TRACKDISK_H */