
#ifndef DEVICES_CD_H
#define DEVICES_CD_H
/*
**      $Id: cd.h,v 1.11 93/08/12 13:44:48 jerryh Exp Locker: jerryh $
**
**      cd.device include file
**
**      (C) Copyright 1992 Commodore-Amiga, Inc.
**          All Rights Reserved
*/

#include <exec/types.h>
#include <exec/nodes.h>


/**************************************************************************
 *                                                                        *
 *   CD Commands                                                          *
 *                                                                        *
 **************************************************************************/

#define CD_RESET             1
#define CD_READ              2
#define CD_WRITE             3
#define CD_UPDATE            4
#define CD_CLEAR             5
#define CD_STOP              6
#define CD_START             7
#define CD_FLUSH             8
#define CD_MOTOR             9
#define CD_SEEK             10
#define CD_FORMAT           11
#define CD_REMOVE           12
#define CD_CHANGENUM        13
#define CD_CHANGESTATE      14
#define CD_PROTSTATUS       15

#define CD_GETDRIVETYPE     18
#define CD_GETNUMTRACKS     19
#define CD_ADDCHANGEINT     20
#define CD_REMCHANGEINT     21
#define CD_GETGEOMETRY      22
#define CD_EJECT            23


#define CD_INFO             32
#define CD_CONFIG           33
#define CD_TOCMSF           34
#define CD_TOCLSN           35

#define CD_READXL           36

#define CD_PLAYTRACK        37
#define CD_PLAYMSF          38
#define CD_PLAYLSN          39
#define CD_PAUSE            40
#define CD_SEARCH           41

#define CD_QCODEMSF         42
#define CD_QCODELSN         43
#define CD_ATTENUATE        44

#define CD_ADDFRAMEINT      45
#define CD_REMFRAMEINT      46


/**************************************************************************
 *                                                                        *
 *   Device Driver Error Codes                                            *
 *                                                                        *
 **************************************************************************/

#define CDERR_OPENFAIL       (-1) /* device/unit failed to open           */
#define CDERR_ABORTED        (-2) /* request terminated early             */
#define CDERR_NOCMD          (-3) /* command not supported by device      */
#define CDERR_BADLENGTH      (-4) /* invalid length (IO_LENGTH/IO_OFFSET) */
#define CDERR_BADADDRESS     (-5) /* invalid address (IO_DATA misaligned) */
#define CDERR_UNITBUSY       (-6) /* device opens ok, but unit is busy    */
#define CDERR_SELFTEST       (-7) /* hardware failed self-test            */

#define CDERR_NotSpecified   20   /* general catchall                     */
#define CDERR_NoSecHdr       21   /* couldn't even find a sector          */
#define CDERR_BadSecPreamble 22   /* sector looked wrong                  */
#define CDERR_BadSecID       23   /* ditto                                */
#define CDERR_BadHdrSum      24   /* header had incorrect checksum        */
#define CDERR_BadSecSum      25   /* data had incorrect checksum          */
#define CDERR_TooFewSecs     26   /* couldn't find enough sectors         */
#define CDERR_BadSecHdr      27   /* another "sector looked wrong"        */
#define CDERR_WriteProt      28   /* can't write to a protected disk      */
#define CDERR_NoDisk         29   /* no disk in the drive                 */
#define CDERR_SeekError      30   /* couldn't find track 0                */
#define CDERR_NoMem          31   /* ran out of memory                    */
#define CDERR_BadUnitNum     32   /* asked for a unit > NUMUNITS          */
#define CDERR_BadDriveType   33   /* not a drive cd.device understands    */
#define CDERR_DriveInUse     34   /* someone else allocated the drive     */
#define CDERR_PostReset      35   /* user hit reset; awaiting doom        */
#define CDERR_BadDataType    36   /* data on disk is wrong type           */
#define CDERR_InvalidState   37   /* invalid cmd under current conditions */

#define CDERR_Phase          42   /* illegal or unexpected SCSI phase     */
#define CDERR_NoBoard        50   /* open failed for non-existant board   */



/**************************************************************************
 *                                                                        *
 * Configuration                                                          *
 *                                                                        *
 *       The drive is configured by TagList items defined as follows:     *
 *                                                                        *
 **************************************************************************/

#define TAGCD_PLAYSPEED         0x0001
#define TAGCD_READSPEED         0x0002
#define TAGCD_READXLSPEED       0x0003
#define TAGCD_SECTORSIZE        0x0004
#define TAGCD_XLECC             0x0005
#define TAGCD_EJECTRESET        0x0006


/**************************************************************************
 *                                                                        *
 * Information                                                            *
 *                                                                        *
 *      Information/Status structure describes current speed settings     *
 *      for read and play commands, sector size, audio attenuation        *
 *      precision, and drive status.                                      *
 *                                                                        *
 **************************************************************************/

struct CDInfo {
                            /*                                Default     */
    UWORD   PlaySpeed;      /* Audio play speed               (75)        */
    UWORD   ReadSpeed;      /* Data-rate of CD_READ command   (Max)       */
    UWORD   ReadXLSpeed;    /* Data-rate of CD_READXL command (75)        */
    UWORD   SectorSize;     /* Number of bytes per sector     (2048)      */
    UWORD   XLECC;          /* CDXL ECC enabled/disabled                  */
    UWORD   EjectReset;     /* Reset on eject enabled/disabled            */
    UWORD   Reserved1[4];   /* Reserved for future expansion              */

    UWORD   MaxSpeed;       /* Maximum speed drive can handle (75, 150)   */
    UWORD   AudioPrecision; /* 0 = no attenuator, 1 = mute only,          */
                            /* other = (# levels - 1)                     */
    UWORD   Status;         /* See flags below                            */
    UWORD   Reserved2[4];   /* Reserved for future expansion              */
    };


/* Flags for Status */

#define CDSTSB_CLOSED    0 /* Drive door is closed                        */
#define CDSTSB_DISK      1 /* A disk has been detected                    */
#define CDSTSB_SPIN      2 /* Disk is spinning (motor is on)              */
#define CDSTSB_TOC       3 /* Table of contents read.  Disk is valid.     */
#define CDSTSB_CDROM     4 /* Track 1 contains CD-ROM data                */
#define CDSTSB_PLAYING   5 /* Audio is playing                            */
#define CDSTSB_PAUSED    6 /* Pause mode (pauses on play command)         */
#define CDSTSB_SEARCH    7 /* Search mode (Fast Forward/Fast Reverse)     */
#define CDSTSB_DIRECTION 8 /* Search direction (0 = Forward, 1 = Reverse) */

#define CDSTSF_CLOSED    0x0001
#define CDSTSF_DISK      0x0002
#define CDSTSF_SPIN      0x0004
#define CDSTSF_TOC       0x0008
#define CDSTSF_CDROM     0x0010
#define CDSTSF_PLAYING   0x0020
#define CDSTSF_PAUSED    0x0040
#define CDSTSF_SEARCH    0x0080
#define CDSTSF_DIRECTION 0x0100


/* Modes for CD_SEARCH */

#define CDMODE_NORMAL   0         /* Normal play at current play speed    */
#define CDMODE_FFWD     1         /* Fast forward play (skip-play forward)*/
#define CDMODE_FREV     2         /* Fast reverse play (skip-play reverse)*/


/**************************************************************************
 *                                                                        *
 * Position Information                                                   *
 *                                                                        *
 *      Position information can be described in two forms: MSF and LSN   *
 *      form.  MSF (Minutes, Seconds, Frames) form is a time encoding.    *
 *      LSN (Logical Sector Number) form is frame (sector) count.         *
 *      The desired form is selected using the io_Flags field of the      *
 *      IOStdReq structure.  The flags and the union are described        *
 *      below.                                                            *
 *                                                                        *
 **************************************************************************/

struct RMSF {

    UBYTE   Reserved;       /* Reserved (always zero) */
    UBYTE   Minute;         /* Minutes (0-72ish)      */
    UBYTE   Second;         /* Seconds (0-59)         */
    UBYTE   Frame;          /* Frame   (0-74)         */
    };

union LSNMSF {

    struct  RMSF MSF;       /* Minute, Second, Frame  */
    ULONG   LSN;            /* Logical Sector Number  */      
    };


/**************************************************************************
 *                                                                        *
 * CD Transfer Lists                                                      *
 *                                                                        *
 *      A CDXL node is a double link node; however only single linkage    *
 *      is used by the device driver.  If you wish to construct a         *
 *      transfer list manually, it is only neccessary to define the       *
 *      mln_Succ pointer of the MinNode.  You may also use the Exec       *
 *      list functions by defining a List or MinList structure and by     *
 *      using the AddHead/AddTail functions to create the list.  This     *
 *      will create a double-linked list.  Although a double-linked       *
 *      list is not required by the device driver, you may wish use it    *
 *      for your own purposes.  Don't forget to initialize the            *
 *      the List/MinList before using it!                                 *
 *                                                                        *
 **************************************************************************/

struct  CDXL {

    struct MinNode    Node;            /* double linkage                  */
    char             *Buffer;          /* data destination (word aligned) */
    LONG              Length;          /* must be even # bytes            */
    LONG              Actual;          /* bytes transferred               */
    APTR              IntData;         /* interrupt server data segment   */
    VOID              (*IntCode)();    /* interrupt server code entry     */
    };


/**************************************************************************
 *                                                                        *
 * CD Table of Contents                                                   *
 *                                                                        *
 *      The CD_TOC command returns an array of CDTOC entries.             *
 *      Entry zero contains summary information describing how many       *
 *      tracks the disk has and the play-time of the disk.                *
 *      Entries 1 through N (N = Number of tracks on disk) contain        *
 *      information about the track.                                      *
 *                                                                        *
 **************************************************************************/

struct TOCSummary {

    UBYTE        FirstTrack; /* First track on disk (always 1)            */
    UBYTE        LastTrack;  /* Last track on disk                        */
    union LSNMSF LeadOut;    /* Beginning of lead-out track (end of disk) */
    };


struct TOCEntry {

    UBYTE        CtlAdr;     /* Q-Code info                  */
    UBYTE        Track;      /* Track number                 */
    union LSNMSF Position;   /* Start position of this track */
    };


union CDTOC {

    struct TOCSummary Summary;  /* First entry (0) is summary information */
    struct TOCEntry   Entry;    /* Entries 1-N are track entries          */
    };



/**************************************************************************
 *                                                                        *
 * Q-Code Packets                                                         *
 *                                                                        *
 *      Q-Code packets are only returned when audio is playing.           *
 *      Currently, only position packets are returned (ADR_POSITION)      *
 *      The other ADR_ types are almost never encoded on the disk         *
 *      and are of little use anyway.  To avoid making the QCode          *
 *      structure a union, these other ADR_ structures are not defined.   *
 *                                                                        *
 **************************************************************************/

struct QCode {

    UBYTE        CtlAdr;        /* Data type / QCode type           */
    UBYTE        Track;         /* Track number                     */
    UBYTE        Index;         /* Track subindex number            */
    UBYTE        Zero;          /* The "Zero" byte of Q-Code packet */
    union LSNMSF TrackPosition; /* Position from start of track     */
    union LSNMSF DiskPosition;  /* Position from start of disk      */
    };


#define CTLADR_CTLMASK 0xF0   /* Control field */

#define CTL_CTLMASK    0xD0   /* To be ANDed with CtlAdr before compared  */

#define CTL_2AUD       0x00   /* 2 audio channels without preemphasis     */
#define CTL_2AUDEMPH   0x10   /* 2 audio channels with preemphasis        */
#define CTL_4AUD       0x80   /* 4 audio channels without preemphasis     */
#define CTL_4AUDEMPH   0x90   /* 4 audio channels with preemphasis        */
#define CTL_DATA       0x40   /* CD-ROM Data                              */

#define CTL_COPYMASK   0x20   /* To be ANDed with CtlAdr before compared  */

#define CTL_COPY       0x20   /* When true, this audio/data can be copied */

#define CTLADR_ADRMASK 0x0F   /* Address field                            */

#define ADR_POSITION   0x01   /* Q-Code is position information           */
#define ADR_UPC        0x02   /* Q-Code is UPC information (not used)     */
#define ADR_ISRC       0x03   /* Q-Code is ISRC (not used)                */
#define ADR_HYBRID     0x05   /* This disk is a hybrid disk               */


#endif
