#ifndef SYSTEM_MODULES_H
#define SYSTEM_MODULES_H 1

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

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

/*****************************************************************************
** Module Object.
*/

#define MODVERSION  1
#define TAGS_MODULE ((ID_SPCTAGS<<16)|ID_MODULE)

struct Module {
  struct Head Head;        /* [00] Standard header */
  WORD   Number;           /* [12] Number of the associated module */
  APTR   ModBase;          /* [14] Ptr to function jump table */
  struct Segment *Segment; /* [18] Segment pointer */
  WORD   TableType;        /* [22] Type of table */
  WORD   empty;            /* [24] */
  LONG   emp;              /* [26] */
  LONG   Version;          /* [30] Version of the module */
  LONG   Revision;         /* [34] Revision of the module */
  struct ModHeader *Table; /* [38] Header */
  BYTE   *Name;            /* [42] Name of the module */
};

#define MODA_Number    (12|TWORD)
#define MODA_TableType (22|TWORD)
#define MODA_Version   (30|TLONG)
#define MODA_Revision  (34|TLONG)
#define MODA_Name      (42|TAPTR)

/*****************************************************************************
** Module file header.
*/

#define MODULE_HEADER_V1 0x4D4F4401

struct ModHeader {
  LONG Version;
  __asm LONG (*Init)(register __a0 struct Module *, register __a1 APTR DPKBase,
                     register __a2 struct VBase *,
                     register __d0 LONG dpkVersion,
                     register __d1 LONG dpkRevision);
  __asm void (*Close)(register __a0 struct Module *);
  __asm LONG (*Expunge)(void);
  WORD  TableType;      /* Type of function table to generate */
  WORD  OpenCount;      /* Amount of programs with this module open */
  BYTE  *Author;        /* Author of the module */
  LONG  *FuncList;      /* Pointer to function list */
  LONG  CPUNumber;      /* CPU that this module is compiled for */
  LONG  ModVersion;     /* Version of this module */
  LONG  ModRevision;    /* Revision of this module */
  LONG  MinDPKVersion;  /* Minimum DPK version required */
  LONG  MinDPKRevision; /* Minimum DPK revision required */
  __asm LONG (*Open)(register __a0 struct Module *);
  APTR  ModBase;        /* Generated function base for given CPU */
  BYTE  *Copyright;     /* Copyright details */
  BYTE  *Date;          /* Date of compilation */
  BYTE  *Name;          /* Name of the module */
  WORD  DPKTable;       /* Type of function table to get from DPK */
  WORD  emp;            /* Reserved */
};

/*****************************************************************************
** This structure is private.
*/

struct ModEntry {
  struct ModEntry  *Next;     /* Next module in list */
  struct ModEntry  *Prev;     /* Previous module in list */
  struct Segment   *Segment;  /* Module segment */
  struct ModHeader *Header;   /* Pointer to module header */
  WORD   ModuleID;            /* Module ID */
  WORD   empty;               /* Reserved */
  BYTE   *Name;               /* Name of the module */
};

struct LVOFunction {
  WORD Jump;
  LONG Code;
};

/****************************************************************************/

#define CPU_68000  1
#define CPU_68010  2
#define CPU_68020  3
#define CPU_68030  4
#define CPU_68040  5
#define CPU_68060  6

#endif /* SYSTEM_MODULES_H */

