/*
*     SYS.H.STDTYPES
*
*     18-12-91 INH Original
*     29-11-94     Mode types added
*     20-03-95     Callback descriptor added
*/

/* Fundamental definitions ------------- */

#ifndef __SYS_H_STDTYPES
#define __SYS_H_STDTYPES

#define NotUsed(a)  (void) a;

#ifndef NULL
#define NULL 0
#endif

#ifndef BOOL
#define BOOL int
#endif
#ifndef bool
#define bool int
#endif
#ifndef true
#define true 1
#define false 0
#endif
#ifndef TRUE
#define TRUE 1
#define FALSE 0
#endif

typedef unsigned char      BYTE; /* 8 bit unsigned */
typedef unsigned short int WORD; /* 16 bit unsigned */
typedef short    int       INT16; /* 16 bit signed */
typedef unsigned int       LONG;  /* 32 bit unsigned */
typedef unsigned int       uint;  /* convenient-size unsigned */


/* Function pointers, various kinds */

typedef int  (*RdFnPtr) (int addr);          /* Pointer to read function */
typedef void (*WrFnPtr) (int addr,int data); /* Pointer to write function */
typedef void (*OneIntFnPtr) ( int );         /* Ptr to fn taking one int */
typedef void (*BlockXferFnPtr) (BYTE *ARM_addr, int seg, int ofs, int len);


typedef void (*HPCFnPtr) ( BYTE * );        /* HPC dispatch function */
typedef bool (*EvtFnPtr) ( void );          /* Pointer to void function */
typedef bool (*CfgFnPtr) ( char * );        /* Config handler */

/* Callback descriptor, as passed to SetCallback SWI */

/* This definition is duplicated in Module.C.PCNE2, and is
   assumed in Module.s.DivaRM and Module.s.PCIO */

typedef struct _cb_descr
{
  int          tag;
  OneIntFnPtr  fn;
  int          R0val;
  int          R12val;
  struct _cb_descr * next;
}
  Callback;

/* Handler structure - defines routines associated with a slot in
    memory or I/O space */

typedef struct
{
  RdFnPtr  Read8, Read16;
  WrFnPtr  Write8, Write16;
  int      R12value;
} Handler;


/* DMA handler structure - describes routines provided by devices
    for handling DMA transfers */


typedef struct
{
  void (*NotifyFn)   ( uint mode, uint PCaddr, uint len );
  uint (*TransferFn) ( uint mode, uint PCaddr, uint len,
                         BYTE *ARMaddr );
  int  R12_val;
}
  DMA_handler;

#define DMAMODE_NONE 0
#define DMAMODE_WR   1
#define DMAMODE_RD   2

#define DMAMODE_REV  8
#define DMAMODE_DEMAND 0x00
#define DMAMODE_SINGLE 0x10
#define DMAMODE_BLOCK  0x20

#define XFER_TC_BIT     0x80000000
#define XFER_LEN_MASK   0x7FFFFFFF

/* HPC Handler structure ------------- */

typedef struct _HPC_HANDLER
{
  struct _HPC_HANDLER *next;

  int      ServiceID;
  int      flags;
#define HPC_NORMAL     0
  bool     requesting;

  HPCFnPtr DispatchFn;
  int      R12_val;
}
  HPC_handler;


/* Additional RISCOS35 features -------------------------- */

/* Mode definitions */

typedef struct
{
  int ModeSelFlags;
#define MSF_DEFAULT 1

  int Xres;
  int Yres;
  int ClrDepth;
#define CD_1BPP 0
#define CD_2BPP 1
#define CD_4BPP 2
#define CD_8BPP 3
#define CD_16BPP 4
#define CD_32BPP 5

  int FrameRate;
#define FR_DEFAULT (-1)

#define MV_MAX 5
  int ModeVars[MV_MAX];
#define MV_MODEFLAGS 0
#define MV_NCOLOUR   3
#define MV_END (-1)

}
  ModeSelector;

typedef struct
{
  int size;
  int provider;
  int x;
  int y;
  int bpp_index;
  int frame;
  char name[20];
}
  ModeEnumerated; /* Structs as returned by Service_EnumerateScreenModes */

typedef union
{
  int            ModeNum;
#define MN_NO_MODE (-1)

  ModeSelector *pModeSel;
}
  ModeSpec;


/* Values for RISCOS35 sprite */

#define SPR_4BPP_MODE   27
  /* Mode 27 */
#define SPR_8BPP_MODE   28
  /* Mode 28 */
#define SPR_16BPP_MODE  ( 1 | (90 << 1) | (90 << 14) | (5 << 27) )
  /* New format, 90-dpi X res, 90-dpi Y res, 16bpp image */
#define SPR_32BPP_MODE  ( 1 | (90 << 1) | (90 << 14) | (6 << 27) )
  /* New format, 90-dpi X res, 90-dpi Y res, 32bpp image */



#endif
