(*          ____________________________________
 *      // /                                    \      //
 *     //  \       Amiga Run Time System        /     //
 * \\ //   /        4.02 / 23.02.91 / bp        \ \\ //
 *  \X/    \____________________________________/  \X/
 *)

DEFINITION MODULE Arts;

(*$ LargeVars:=FALSE
    LongAlign:=FALSE
    NameChk:=FALSE
 *)

FROM SYSTEM IMPORT
  ADDRESS,LONGSET,BPTR;

CONST
  maxModName=32; maxKeys=3;

TYPE
  (* Typ für M2Debug: Arts.StrPtr *)
  StrPtr=POINTER TO ARRAY [0..63] OF CHAR;
  ErrorType=
   (trap,exception,system,assertion,breakPoint,explicit);
  SysErr=(halt,illCase,fctReturn,stkOvl,illCall);
  ErrorFrame=RECORD
    pc: ADDRESS;
    dRegs: ARRAY [0..7] OF LONGINT;
    aRegs: ARRAY [8..15] OF ADDRESS;
    CASE error: ErrorType OF
    | trap: trapNr: INTEGER;
    | exception: exceptionMask: LONGSET
    | system: sysErr: SysErr
    | assertion,breakPoint,explicit:
    END;
    header,body: ADDRESS
  END;
  ModType=(none,mod,lib,noImp);
  ModKeys=ARRAY [0..maxKeys-1] OF CARDINAL;
  ModName=ARRAY [0..maxModName-1] OF CHAR;

VAR
 (*
  *   Umgebungsvariablen von M2Amiga.
  *
  *   Einzig returnVal darf verändert,
  *   alle anderen nur gelesen werden!!
  *)

  wbStarted: BOOLEAN;
 (*
  *  TRUE: Start von Workbench, FALSE: Start von CLI
  *)

  returnVal: LONGINT;
 (*
  *  Dies ist der Rückgabewert an das Dos,
  *  kann beliebig gesetzt werden.
  *  Bei Workbench-Start wird returnVal als INTEGER
  *  in das Feld length der WBStartupMsg eingetragen.
  *)

  startupMsg: ADDRESS;
 (*
  *  Zeiger auf die Workbench.WBStartup Message
  *  Nur gültig bei Workbench-Start (wbStarted),
  *  sonst NIL!
  *)

  dosCmdBuf: ADDRESS;
  dosCmdLen: LONGINT;
 (*
  *  Adresse und Länge der CLI-Argumente.
  *  Nur gültig bei CLI-Start (NOT wbStarted)!
  *)

  programName: ADDRESS;
 (*
  * Zeiger auf den Aufrufnamen des Programmes.
  * Der String endet mit 0C.
  *)

  thisTask:  ADDRESS;
 (*
  *  Zeiger auf den eigenen Task/Process
  *)

  oldCurrentDir:BPTR;
 (*
  *  CurrentDir bei Programmstart
  *)

  errorFrame: ErrorFrame;
 (*
  * errorFrame wird bei einem Laufzeitfehler mit den
  * aktuellen Werten gefüllt.
  *)


  kickVersion: INTEGER;
 (*
  * Die Version der exec.library (32,33,36,...)
  * Hiermit kann die Version von Kickstart,Workbench
  * festgestellt werden.
  *)

 (*
  * Für Erweiterungen der ENTWICKLER!
  * Verhindert eine ständige Neudefinition von Arts.
  *)
  reserved2: ADDRESS;
  reserved3: ADDRESS;
  reserved4: ADDRESS;

(* Diese Prozedur ist IMMER die erste jedes Programms,
 * NIEMALS aufrufen!!!!
 *)
PROCEDURE Startup(cl{0}:LONGINT; cb{8}:ADDRESS): LONGINT;

(* Compiler Unterstützung *)
PROCEDURE StkChk(need{0}: LONGINT);
 (* SystemError(halt) = HALT *)
PROCEDURE SystemError(err{0}: SysErr);
PROCEDURE Mulu32(x{0},y{1}: LONGINT): LONGINT;
 (* D0=REM, D1=QUO *)
PROCEDURE Divu32(x{0},y{1}: LONGINT): LONGINT;
PROCEDURE Muls32(x{0},y{1}: LONGINT): LONGINT;
 (* D0=REM, D1=QUO *)
PROCEDURE Divs32(x{0},y{1}: LONGINT): LONGINT;
(* Nur für die "automatischen" Libraries! *)
PROCEDURE OpenLib(version{0}:LONGINT;
                  name{9}:ADDRESS):ADDRESS;
PROCEDURE CloseLib(base{9}:ADDRESS);

(* Laufzeitunterstützung *)
PROCEDURE Assert(condition: BOOLEAN; msg: ADDRESS);
PROCEDURE BreakPoint(msg: ADDRESS);
PROCEDURE Error(header,body: ADDRESS);
PROCEDURE Requester(header,body,pos,neg:ADDRESS):BOOLEAN;
PROCEDURE Terminate;
PROCEDURE Exit(retVal{0}:LONGINT);

END Arts.
