#ifndef _INLINE_RETINA_H
#define _INLINE_RETINA_H

#include "retina_defs.h" 

/*
__BEGIN_DECLS
*/

#ifndef BASE_EXT_DECL
#ifndef C_ONLY
#define BASE_EXT_DECL 
#else
#define BASE_EXT_DECL extern struct Library * RetinaBase;
#endif
#endif
#ifndef BASE_PAR_DECL
#define BASE_PAR_DECL
#define BASE_PAR_DECL0 void
#endif
#ifndef BASE_NAME
#ifndef C_ONLY
#define BASE_NAME RetinaLib::RetinaBase
#else
#define BASE_NAME RetinaBase
#endif
#endif

static __inline struct RetinaScreen * 
Retina_OpenScreen (BASE_PAR_DECL unsigned short int width,
                   unsigned short int height,
                   unsigned long int ID,
                   unsigned long int Flags,
                   struct TagList * Tags
                  )
{
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  register struct RetinaScreen * res __asm("d0");
  register unsigned short int d0 __asm("d0") = width;
  register unsigned short int d1 __asm("d1") = height;
  register unsigned long int d2 __asm("d2") = ID;
  register unsigned long int d3 __asm("d3") = Flags;
  register struct TagList * a0  __asm("a0") = Tags;
  __asm __volatile ("jsr a6@(-186)"
  : "=r" (res)
  : "r" (a6), "r" (a0), "r" (d0), "r" (d1), "r" (d2), "r" (d3)
  : "d0", "memory");
  return res;
}

static __inline void 
Retina_WriteRect (BASE_PAR_DECL unsigned char * Mem,
                   unsigned short int MemX,
                   unsigned short int MemY,
                   unsigned short int MemWidth,
                   unsigned long int Mode,
                   struct RetinaScreen * Scr,
                   unsigned short int ScrX,
                   unsigned short int ScrY,
                   unsigned short int SizeX,
                   unsigned short int SizeY
                  )
{
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  register unsigned short int d0 __asm("d0") = MemX;
  register unsigned short int d1 __asm("d1") = MemY;
  register unsigned short int d2 __asm("d2") = MemWidth;
  register unsigned long int  d3 __asm("d3") = Mode;
  register unsigned short int d4 __asm("d4") = ScrX;
  register unsigned short int d5 __asm("d5") = ScrY;
  register unsigned short int d6 __asm("d6") = SizeX;
  register unsigned short int d7 __asm("d7") = SizeY;
  register unsigned char *    a0 __asm("a0") = Mem;
  register struct RetinaScreen * a1 __asm("a1") = Scr;
  __asm __volatile ("jsr a6@(-318)"
  : /* "=r" (_res) */
  : "r" (d0), "r" (d1), "r" (d2), "r" (d3), "r" (d4), "r" (d5), "r" (d6), "r" (d7),
    "r" (a0), "r" (a1), "r" (a6)
  : "d0", "memory");
  /* return res; */
}

static __inline void 
Retina_CloseScreen (struct RetinaScreen * Scr) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  register struct RetinaScreen *  a0 __asm("a0") = Scr;
  __asm __volatile ("jsr a6@(-192)"
  : /* "=r" (_res) */
  : "r" (a0), "r" (a6)
  : "d0", "memory");
  /* return res; */
}

static __inline void 
Retina_ScreenToFront (struct RetinaScreen * Scr) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  register struct RetinaScreen *  a0 __asm("a0") = Scr;
  __asm __volatile ("jsr a6@(-198)"
  : /* "=r" (_res) */
  : "r" (a0), "r" (a6)
  : "d0", "memory");
  /*return res; */
}

static __inline void 
Retina_ScreenToBack (struct RetinaScreen * Scr) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  register struct RetinaScreen *  a0 __asm("a0") = Scr;
  __asm __volatile ("jsr a6@(-276)"
  : /* "=r" (_res) */
  : "r" (a0), "r" (a6)
  : "d0", "memory");
  /*return res; */
}

static __inline void 
Retina_SwapBitMap (struct RetinaScreen * Scr) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  register struct RetinaScreen *  a0 __asm("a0") = Scr;
  __asm __volatile ("jsr a6@(-282)"
  : /* "=r" (_res) */
  : "r" (a0), "r" (a6)
  : "d0", "memory");
  /*return res; */
}

static __inline void 
Retina_OwnRetina (void) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  __asm __volatile ("jsr a6@(-354)"
  : /* "=r" (_res) */
  : "r" (a6)
  : "memory");
  /*return res; */
}

static __inline void 
Retina_DisownRetina (void) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  __asm __volatile ("jsr a6@(-360)"
  : /* "=r" (_res) */
  : "r" (a6)
  : "memory");
  /*return res; */
}

static __inline void 
Retina_WaitTOF (void) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  __asm __volatile ("jsr a6@(-204)"
  : /* "=r" (_res) */
  : "r" (a6)
  : "memory");
  /*return res; */
}

static __inline unsigned char * 
Retina_SetSegmentPtr ( long adr) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  register unsigned char *  _res __asm("d0");
  register unsigned long a0 __asm("a0") = adr;
  __asm __volatile ("jsr a6@(-150)"
  : "=r" (_res)
  : "r" (a0), "r" (a6)
  : "d0", "memory");
  return _res;
}

static __inline struct RetinaMonitor * 
Retina_FindMonitor ( unsigned long monid) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  register struct RetinaMonitor *  _res __asm("d0");
  register unsigned long d0 __asm("d0") = monid;
  __asm __volatile ("jsr a6@(-174)"
  : "=r" (_res)
  : "r" (d0), "r" (a6)
  : "d0", "memory");
  return _res;
}

static __inline void 
Retina_DisplayOff (void) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  __asm __volatile ("jsr a6@(-60)"
  : /* "=r" (_res) */
  : "r" (a6)
  : "memory");
  /*return res; */
}

static __inline void 
Retina_DisplayOn (void) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  /* register    _res __asm("d0"); */
  __asm __volatile ("jsr a6@(-66)"
  : /* "=r" (_res) */
  : "r" (a6)
  : "memory");
  /*return res; */
}

static __inline void 
Retina_LoadPalette (struct RetinaScreen * scr, unsigned short first, unsigned short count, unsigned char * table) {
  BASE_EXT_DECL
  register struct Library *a6 __asm("a6") = BASE_NAME;
  register struct RetinaScreen * a0 __asm("a0") = scr;
  register unsigned char * a1 __asm("a1") = table;
  register unsigned short d0 __asm("d0") = first;
  register unsigned short d1 __asm("d1") = count;
  /* register    _res __asm("d0"); */
  __asm __volatile ("jsr a6@(-138)"
  : /* "=r" (_res) */
  : "r" (a6), "r" (a0), "r" (d0), "r" (d1), "r" (a1)
  : "memory");
  /*return res; */
}

#undef BASE_EXT_DECL
#undef BASE_PAR_DECL
#undef BASE_PAR_DECL0
#undef BASE_NAME

/*
__END_DECLS
*/

#endif /* _INLINE_RETINA_H */
