#ifndef SYSTEM_MISC_H
#define SYSTEM_MISC_H TRUE

/*
**  $VER: misc.h V0.9B
**
**  (C) Copyright 1996-1997 DreamWorld Productions.
**      All Rights Reserved.
**
*/

#ifndef DPKERNEL_H
#include <dpkernel/dpkernel.h>
#endif

/****************************************************************************
** Object Referencing structure.
*/

#define REFVERSION     1
#define TAGS_REFERENCE ((ID_SPCTAGS<<16)|ID_REFERENCE)

struct Reference {
  struct Head Head;   /* [00] Standard header */
  APTR   Next;        /* [12] Next reference */
  APTR   Prev;        /* [16] Previous reference */
  WORD   ObjectID;    /* [20] ID of the object */
  WORD   Pad;         /* [22] Reserved */
  APTR   ObjectName;  /* [24] Name of the object */
  APTR   ModName;     /* [28] Name of the module containing the object */
  __asm  LONG (*CheckFile)(register __a0 struct File *, register __a1 APTR Buffer);
  WORD   ModNumber;   /* [36] Module ID number */

  /* Private fields below */

  struct Segment *Segment;
  struct Module  *Module;
};

#define REFA_ObjectID   (TWORD|20)
#define REFA_ObjectName (TAPTR|24)
#define REFA_ModName    (TAPTR|28)
#define REFA_CheckFile  (TAPTR|32)
#define REDA_ModNumber  (TWORD|36)

/****************************************************************************
** Universal Structure, used in the CopyStructure() routine.
*/

#define UNVERSION     1
#define TAGS_UNIVERSE ((ID_SPCTAGS<<16)|ID_UNIVERSE)

struct Universe {
  struct Head Head;
  APTR   Palette;
  WORD   Planes;
  WORD   ScrWidth;
  WORD   ScrHeight;
  WORD   Width;
  WORD   ByteWidth;
  WORD   Height;
  APTR   Task;
  LONG   Frequency;
  LONG   AmtColours;
  WORD   ScrMode;
  WORD   ScrType;
  APTR   Source;
  APTR   d;
  APTR   Rasterlist;
  WORD   ScrXOffset;
  WORD   ScrYOffset;
  WORD   BmpYOffset;
  WORD   BmpXOffset;
  WORD   Channel;
  WORD   Priority;
  LONG   Length;
  WORD   Octave;
  WORD   Volume;
};

/****************************************************************************
** The SysObject structure.  Private.
*/

#define SOVERSION      1
#define TAGS_SYSOBJECT ((ID_SPCTAGS<<16)|ID_SYSOBJECT)

struct SysObject {
  struct Head Head;
  struct SysObject *Prev;  /* Previous object in list */
  struct SysObject *Next;  /* Next object in list */
  WORD   ObjectID;         /* Unique ID of the object, eg ID_PICTURE */
  WORD   ClassID;          /* Class reference ID */
  BYTE   *Name;            /* Full name of the object */
  __asm LONG (*CopyToUnv)(register __a0 struct Universe *, register __a1 struct Head *);
  __asm LONG (*CopyFromUnv)(register __a0 struct Universe *, register __a1 struct Head *);
  __asm WORD (*CheckFile)(register __a0 struct File *, register __a1 APTR Buffer);
  __asm struct Head * (*Load)(register __a0 struct File *);
  __asm LONG (*Display)(register __a0 APTR Object);
  __asm struct Head * (*Get)(void);
  __asm void (*Free)(register  __a0 APTR Object);
  __asm LONG (*Init)(register  __a0 APTR Object, register __a1 APTR Container);
  __asm LONG (*Read)(register  __a0 APTR Object, register __a1 APTR Buffer, register __d0 LONG Length);
  __asm LONG (*Write)(register __a0 APTR Object, register __a1 APTR Buffer, register __d0 LONG Length);
  __asm LONG (*Open)(register  __a0 struct File *, register __d0 LONG Flags);
  __asm void (*Hide)(register  __a0 APTR Object);
  __asm void (*Close)(register __a0 struct File *);
  __asm LONG (*Save)(register  __a0 APTR Object,   register __a1 struct File *DestFile);
  __asm LONG (*Query)(register __a0 APTR Object);
  __asm LONG (*Activate)(register __a0 APTR Object);
  __asm LONG (*Deactivate)(register __a0 APTR Object);
  __asm LONG (*Draw)(register __a0 APTR Object);
  __asm LONG (*Clear)(register __a0 APTR Object);
  __asm LONG (*Reset)(register __a0 APTR Object);
  __asm LONG (*Flush)(register __a0 APTR Object);
  __asm LONG (*TagTrigger)(register __a0 LONG *TagPos, register __a1 struct Head *);
  struct SysObject *Master;
  __asm LONG (*Lock)(register __a0 APTR Object);
  __asm void (*Unlock)(register __a0 APTR Object);
  __asm LONG (*Detach)(register __a0 APTR Object, register __a1 APTR Parent);
};

#define SOA_Prev        (TAPTR|12)
#define SOA_Next        (TAPTR|16)
#define SOA_ObjectID    (TWORD|20)
#define SOA_ClassID     (TWORD|22)
#define SOA_Name        (TAPTR|24)
#define SOA_CopyToUnv   (TAPTR|28)
#define SOA_CopyFromUnv (TAPTR|32)
#define SOA_CheckFile   (TAPTR|36)
#define SOA_Load        (TAPTR|40)
#define SOA_Display     (TAPTR|44)
#define SOA_Get         (TAPTR|48)
#define SOA_Free        (TAPTR|52)
#define SOA_Init        (TAPTR|56)
#define SOA_Read        (TAPTR|60)
#define SOA_Write       (TAPTR|64)
#define SOA_Open        (TAPTR|68)
#define SOA_Hide        (TAPTR|72)
#define SOA_Close       (TAPTR|76)
#define SOA_Save        (TAPTR|80)
#define SOA_Query       (TAPTR|84)
#define SOA_Activate    (TAPTR|88)
#define SOA_Deactivate  (TAPTR|92)
#define SOA_Draw        (TAPTR|96)
#define SOA_Clear       (TAPTR|100)
#define SOA_Reset       (TAPTR|104)
#define SOA_Flush       (TAPTR|108)
#define SOA_TagTrigger  (TAPTR|112)
/*#define SOA_Master    (TAPTR|116)*/
#define SOA_Lock        (TAPTR|120)
#define SOA_Unlock      (TAPTR|124)
#define SOA_Detach      (TAPTR|128)

#endif /* SYSTEM_MISC_H */
