    /*---------------------------------------------------------------------*
            Copyright (C) 1998 Nintendo.

            $RCSfile: leo.h,v $
            $Revision: 1.29 $
            $Date: 1998/12/21 07:30:15 $
     *---------------------------------------------------------------------*/

    #ifndef _LEO_H_
    #define _LEO_H_

    #ifdef _LANGUAGE_C_PLUS_PLUS
    extern "C" {
    #endif

    #include <PR/os.h>
    #include <PR/leoappli.h>

    #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)

    /**************************************************************************
     *
     * Type definitions
     *
     */
    typedef u32     LEOError;

    typedef	u8	LEOSpdlMode;

    typedef u8	LEOStatus;

    typedef struct
    {
      u8    drive;			/* version of hw */
      u8    driver;			/* version of sw */
      u8	deviceType;		/* dev type, always 00 */
      u8	ndevices;		/* # of devices, always 01 */
    } LEOVersion;

    typedef	struct
    {
      u32	startLBA;
      u32	endLBA;
      u32	nbytes;
    } LEOCapacity;

    typedef struct
    {
      u8	pad;
      u8	yearhi;
      u8	yearlo;
      u8	month;
      u8	day;
      u8	hour;
      u8	minute;
      u8	second;
    } LEODiskTime;

    typedef	struct
    {
      u64		lineNumber;
      LEODiskTime	time;
    } LEOSerialNum;

    typedef struct
    {
      u8		gameName[4];
      u8		gameVersion;
      u8		diskNumber;
      u8		ramUsage;
      u8		diskUsage;
      LEOSerialNum	serialNumber;
      u8		company[2];
      u8		freeArea[6];
    } LEODiskID;

    typedef struct
    {
      LEOCmdHeader		header;
      union
      {
        struct
        {
          u32           lba;
          u32           xfer_blks;
          void         *buff_ptr;
          u32           rw_bytes;
    #ifdef _LONGCMD
          u32           size;
    #endif
        } readwrite;
        struct
        {
          u32           lba;
        } seek;
        struct
        {
          void         *buffer_pointer;
        } readdiskid;
        LEODiskTime	    time;
        struct
        {
          u8	    reserve1;
          u8	    reserve2;
          u8	    standby_time;
          u8	    sleep_time;
          u32	    reserve3;
        } modeselect;

      } data;

    } LEOCmd;

    #define	_nbytes		readwrite.rw_bytes
    #define	_result		header.status

    #endif /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */

    /**************************************************************************
     *
     * Global definitions
     *
     */
    #define	LEO_SW_VERSION		6	/* This will be returned by */
    					/* LeoInquiry command       */

    #define	OS_PRIORITY_LEOMGR	OS_PRIORITY_PIMGR

    /*
     * Drive Rom offset address
     */
    #define	DDROM_FONT_START	0x000a0000
    #define	DDROM_WAVEDATA_START	0x00140000

    /*
     * Definition for osLeoSpdlMotor()
     */
    #define ACTIVE			0
    #define	STANDBY			1
    #define	SLEEP			2
    #define	BRAKE			4

    #define LEO_MOTOR_ACTIVE        0
    #define LEO_MOTOR_STANDBY       1
    #define LEO_MOTOR_SLEEP         2
    #define	LEO_MOTOR_BRAKE		4

    #define	NUM_LBAS		4292 	/* total number of LBAs */

    #define BLK_SIZE_ZONE0		19720
    #define BLK_SIZE_ZONE1		18360
    #define BLK_SIZE_ZONE2		17680
    #define BLK_SIZE_ZONE3		16320
    #define BLK_SIZE_ZONE4		14960
    #define BLK_SIZE_ZONE5		13600
    #define BLK_SIZE_ZONE6		12240
    #define BLK_SIZE_ZONE7		10880
    #define BLK_SIZE_ZONE8		9520

    #define	MAX_BLK_SIZE		BLK_SIZE_ZONE0
    #define	MIN_BLK_SIZE		BLK_SIZE_ZONE8

    /*
     * Error codes
     */
    #define LEO_ERROR_GOOD                             0
    #define LEO_ERROR_DRIVE_NOT_READY                  1
    #define LEO_ERROR_DIAGNOSTIC_FAILURE               2
    #define LEO_ERROR_COMMAND_PHASE_ERROR              3
    #define LEO_ERROR_DATA_PHASE_ERROR                 4
    #define LEO_ERROR_REAL_TIME_CLOCK_FAILURE          5
    #define LEO_ERROR_BUSY				   8
    #define LEO_ERROR_INCOMPATIBLE_MEDIUM_INSTALLED    11
    #define LEO_ERROR_UNKNOWN_FORMAT                   11
    #define LEO_ERROR_NO_SEEK_COMPLETE                 21
    #define LEO_ERROR_WRITE_FAULT                      22
    #define LEO_ERROR_UNRECOVERED_READ_ERROR           23
    #define LEO_ERROR_NO_REFERENCE_POSITION_FOUND      24
    #define LEO_ERROR_TRACK_FOLLOWING_ERROR            25
    #define LEO_ERROR_TRACKING_OR_SPDL_SERVO_FAILURE   25
    #define LEO_ERROR_INVALID_COMMAND_OPERATION_CODE   31
    #define LEO_ERROR_LBA_OUT_OF_RANGE                 32
    #define LEO_ERROR_WRITE_PROTECT_ERROR              33
    #define LEO_ERROR_COMMAND_CLEARED_BY_HOST          34
    #define LEO_ERROR_COMMAND_TERMINATED               34
    #define LEO_ERROR_QUEUE_FULL                       35
    #define LEO_ERROR_ILLEGAL_TIMER_VALUE              36
    #define LEO_ERROR_WAITING_NMI			   37
    #define LEO_ERROR_DEVICE_COMMUNICATION_FAILURE     41
    #define LEO_ERROR_MEDIUM_NOT_PRESENT               42
    #define LEO_ERROR_POWERONRESET_DEVICERESET_OCCURED 43
    #define LEO_ERROR_RAMPACK_NOT_CONNECTED		   44
    #define LEO_ERROR_MEDIUM_MAY_HAVE_CHANGED          47
    #define LEO_ERROR_EJECTED_ILLEGALLY_RESUME	   49

    /*
     * Reserved
     */
    #define LEO_ERROR_NOT_BOOTED_DISK		   45
    #define LEO_ERROR_DIDNOT_CHANGED_DISK_AS_EXPECTED  46

    /*
     * Error codes only used in IPL
     */
    #define LEO_ERROR_RTC_NOT_SET_CORRECTLY		   48
    #define LEO_ERROR_DIAGNOSTIC_FAILURE_RESET	   50
    #define LEO_ERROR_EJECTED_ILLEGALLY_RESET	   51

    #if defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS)

    /**************************************************************************
     *
     * Macro definitions
     *
     */
    #define GET_ERROR(x) ((x).header.sense)

    /**************************************************************************
     *
     * Extern variables
     *
     */
    extern	LEODiskID	leoBootID;
    extern	OSPiHandle      *__osDiskHandle; /* For exceptasm to get disk info*/

    /**************************************************************************
     *
     * Function prototypes
     *
     */
    /* Initialize routine */
    extern	s32 LeoCreateLeoManager(OSPri comPri, OSPri intPri,
    				OSMesg *cmdBuf, s32 cmdMsgCnt);
    extern	s32 LeoCJCreateLeoManager(OSPri comPri, OSPri intPri,
    				  OSMesg *cmdBuf, s32 cmdMsgCnt);
    extern	s32 LeoCACreateLeoManager(OSPri comPri, OSPri intPri,
    				  OSMesg *cmdBuf, s32 cmdMsgCnt);
    extern  u32 LeoDriveExist(void);

    /* Synchronous functions */
    extern	s32 LeoClearQueue(void);
    extern	s32 LeoByteToLBA(s32 startLBA, u32 nbytes, s32 *lbas);
    extern	s32 LeoLBAToByte(s32 startLBA, u32 nLBAs, s32 *bytes);
    extern	s32 LeoReadCapacity(LEOCapacity *cap, s32 dir);
    extern	s32 LeoInquiry(LEOVersion *ver);
    extern	s32 LeoTestUnitReady(LEOStatus *status);

    /* Asynchronous functions */
    extern	s32 LeoSpdlMotor(LEOCmd *cmdBlock, LEOSpdlMode mode, OSMesgQueue *mq);
    extern	s32 LeoSeek(LEOCmd *cmdBlock, u32 lba, OSMesgQueue *mq);
    extern	s32 LeoRezero(LEOCmd *cmdBlock, OSMesgQueue *mq);
    extern	s32 LeoReadWrite(LEOCmd *cmdBlock, s32 direction,
    			 u32 LBA, void *vAddr, u32 nLBAs, OSMesgQueue *mq);
    extern	s32 LeoReadDiskID(LEOCmd *cmdBlock, LEODiskID *vaddr, OSMesgQueue *mq);
    extern  s32 LeoSetRTC(LEOCmd *cmdBlock, LEODiskTime *RTCdata, OSMesgQueue *mq);
    extern	s32 LeoReadRTC(LEOCmd *cmdBlock, OSMesgQueue *mq);
    extern  s32 LeoModeSelectAsync(LEOCmd *cmdBlock, u32 standby,
    			       u32 sleep, OSMesgQueue *mq);

    /* Font routines */
    extern	int LeoGetKAdr(int sjis);
    extern	int LeoGetAAdr(int code,int *dx,int *dy, int *cy);
    extern	int LeoGetAAdr2(u32 ccode,int *dx,int *dy, int *cy);

    /* Boot function */
    extern  void LeoBootGame(void *entry);

    #endif  /* defined(_LANGUAGE_C) || defined(_LANGUAGE_C_PLUS_PLUS) */

    #ifdef _LANGUAGE_C_PLUS_PLUS
    }
    #endif

    #endif /* !_LEO_H */