/*
** bootstrap.h -- This file is a part of the Amiga bootloader.
**
** Copyright 1993, 1994 by Hamish Macdonald
**
** Some minor additions by Michael Rausch 1-11-94
** Modified 11-May-94 by Geert Uytterhoeven
**                      (Geert.Uytterhoeven@cs.kuleuven.ac.be)
**     - inline Supervisor() call
** Modified 10-Jan-96 by Geert Uytterhoeven
**     - The real Linux/m68k boot code moved to linuxboot.[ch]
**
** This file is subject to the terms and conditions of the GNU General Public
** License.  See the file README.legal in the main directory of this archive
** for more details.
**
*/

#include <asm/amigatypes.h>

struct MsgPort {
   u_char fill1[15];
   u_char mp_SigBit;
   u_char fill2[18];
};

struct IOStdReq {
   u_char fill1[20];
   struct Device *io_Device;
   u_char fill2[4];
   u_short io_Command;
   u_char io_Flags;
   char io_Error;
   u_long io_Actual;
   u_long io_Length;
   void *io_Data;
   u_char fill4[4];
};

#define IOF_QUICK       (1<<0)

struct timerequest {
   u_char fill1[28];
   u_short io_Command;
   u_char io_Flags;
   u_char fill2[1];
   u_long tv_secs;
   u_long tv_micro;
};

#define UNIT_VBLANK     1
#define TR_ADDREQUEST   9

struct Library;

static __inline void CloseLibrary(struct Library *library)
{
  register struct ExecBase *a6 __asm("a6") = SysBase;
  register struct Library *a1 __asm("a1") = library;
  __asm __volatile ("jsr %%a6@(-0x19e)"
  : /* no output */
  : "r" (a6), "r" (a1)
  : "a0","a1","d0","d1", "memory");
}

static __inline struct Library *OpenLibrary(char *libName,
                                            unsigned long version)
{
  register struct Library * _res  __asm("d0");
  register struct ExecBase *a6 __asm("a6") = SysBase;
  register u_char *a1 __asm("a1") = libName;
  register unsigned long d0 __asm("d0") = version;
  __asm __volatile ("jsr %%a6@(-0x228)"
  : "=r" (_res)
  : "r" (a6), "r" (a1), "r" (d0)
  : "a0","a1","d0","d1", "memory");
  return _res;
}

struct IORequest;

static __inline char OpenDevice(u_char *devName, u_long unit,
                                struct IORequest *ioRequest, u_long flags)
{
   register char _res __asm("d0");
   register struct ExecBase *a6 __asm("a6") = SysBase;
   register u_char *a0 __asm("a0") = devName;
   register u_long d0 __asm("d0") = unit;
   register struct IORequest *a1 __asm("a1") = ioRequest;
   register u_long d1 __asm("d1") = flags;

   __asm __volatile ("jsr %%a6@(-0x1bc)"
                     : "=r" (_res)
                     : "r" (a6), "r" (a0), "r" (a1), "r" (d0), "r" (d1)
                     : "a0","a1","d0","d1", "memory");
   return(_res);
}

static __inline void CloseDevice(struct IORequest *ioRequest)
{
   register struct ExecBase *a6 __asm("a6") = SysBase;
   register struct IORequest *a1 __asm("a1") = ioRequest;

   __asm __volatile ("jsr %%a6@(-0x1c2)"
                     : /* no output */
                     : "r" (a6), "r" (a1)
                     : "a0","a1","d0","d1", "memory");
}

static __inline char DoIO(struct IORequest *ioRequest)
{
   register char _res __asm("d0");
   register struct ExecBase *a6 __asm("a6") = SysBase;
   register struct IORequest *a1 __asm("a1") = ioRequest;

   __asm __volatile ("jsr %%a6@(-0x1c8)"
                     : "=r" (_res)
                     : "r" (a6), "r" (a1)
                     : "a0","a1","d0","d1", "memory");
   return(_res);
}

static __inline void *CreateIORequest(struct MsgPort *port, u_long size)
{
   register struct Library *_res __asm("d0");
   register struct ExecBase *a6 __asm("a6") = SysBase;
   register struct MsgPort *a0 __asm("a0") = port;
   register u_long d0 __asm("d0") = size;

   __asm __volatile ("jsr %%a6@(-0x28e)"
                     : "=r" (_res)
                     : "r" (a6), "r" (a0), "r" (d0)
                     : "a0","a1","d0","d1", "memory");
   return(_res);
}

static __inline void DeleteIORequest(void *ioRequest)
{
   register struct ExecBase *a6 __asm("a6") = SysBase;
   register void *a0 __asm("a0") = ioRequest;

   __asm __volatile ("jsr %%a6@(-0x294)"
                     : /* no output */
                     : "r" (a6), "r" (a0)
                     : "a0","a1","d0","d1", "memory");
}

static __inline struct MsgPort *CreateMsgPort(void)
{
   register struct MsgPort *_res __asm("d0");
   register struct ExecBase *a6 __asm("a6") = SysBase;

   __asm __volatile ("jsr %%a6@(-0x29a)"
                     : "=r" (_res)
                     : "r" (a6)
                     : "a0","a1","d0","d1", "memory");
   return(_res);
}

static __inline void DeleteMsgPort(struct MsgPort *port)
{
   register struct ExecBase *a6 __asm("a6") = SysBase;
   register struct MsgPort *a0 __asm("a0") = port;

   __asm __volatile ("jsr %%a6@(-0x2a0)"
                     : /* no output */
                     : "r" (a6), "r" (a0)
                     : "a0","a1","d0","d1", "memory");
}
