home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD1.bin / useful / dev / obero / oberon-a / source / amiga / execsupport.mod < prev    next >
Encoding:
Text File  |  1995-01-26  |  6.5 KB  |  261 lines

  1. (***************************************************************************
  2.  
  3.      $RCSfile: ExecSupport.mod $
  4.   Description: Support for clients of exec.library
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 3.2 $
  8.       $Author: fjc $
  9.         $Date: 1995/01/26 02:39:55 $
  10.  
  11.   Copyright © 1994-1995, Frank Copeland.
  12.   This file is part of the Oberon-A Library.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15. ***************************************************************************)
  16.  
  17. <* STANDARD- *> <* INITIALISE- *> <* MAIN- *>
  18. <*$ CaseChk-  IndexChk- LongVars+ NilChk-  *>
  19. <*$ RangeChk- StackChk- TypeChk-  OvflChk- *>
  20.  
  21. MODULE ExecSupport;
  22.  
  23. IMPORT SYS := SYSTEM, Kernel, e := Exec, s := Sets;
  24.  
  25. (*--------------------------------------------------------------------*)
  26. (*
  27.   Exec List handling procedures
  28. *)
  29.  
  30. (*------------------------------------*)
  31. PROCEDURE NewMinList*(VAR list: e.MinList);
  32. (*
  33.  * obsolete -- use NewList() instead!
  34.  *)
  35. BEGIN
  36.   list.head := SYS.ADR(list.tail);
  37.   list.tail := NIL;
  38.   list.tailPred := SYS.ADR(list.head);
  39. END NewMinList;
  40.  
  41.  
  42. (*------------------------------------*)
  43. PROCEDURE MinListEmpty*(VAR list : e.MinList): BOOLEAN;
  44. (*
  45.  * obsolete -- use ListEmpty() instead!
  46.  *)
  47. BEGIN
  48.   RETURN list.tailPred = SYS.ADR(list);
  49. END MinListEmpty;
  50.  
  51.  
  52. (*------------------------------------*)
  53. PROCEDURE NewList* (VAR list : e.CommonList);
  54. BEGIN (* NewList *)
  55.   NewMinList (SYS.VAL (e.MinList, list))
  56. END NewList;
  57.  
  58.  
  59. (*------------------------------------*)
  60. PROCEDURE ListEmpty*(VAR list : e.CommonList): BOOLEAN;
  61. BEGIN
  62.   RETURN ListEmpty (SYS.VAL (e.MinList, list))
  63. END ListEmpty;
  64.  
  65.  
  66. (*--------------------------------------------------------------------*)
  67. (*
  68.   Exec MessagePort procedures.
  69. *)
  70.  
  71.  
  72. (*------------------------------------*)
  73. PROCEDURE IsMsgPortEmpty * (x : e.MsgPortBasePtr) : BOOLEAN;
  74.   VAR mp : e.MsgPortPtr;
  75. BEGIN
  76.   mp := SYS.VAL (e.MsgPortPtr, x);
  77.   RETURN mp.msgList.tailPred = SYS.VAL (e.NodePtr, mp);
  78. END IsMsgPortEmpty;
  79.  
  80.  
  81. (*------------------------------------*)
  82. <*$CopyArrays-*>
  83. PROCEDURE CreatePort * (portName : ARRAY OF CHAR; priority : SHORTINT)
  84.   : e.MsgPortPtr;
  85.  
  86.   VAR sigBit : SHORTINT; mp : e.MsgPortPtr; name : e.LSTRPTR;
  87.  
  88. BEGIN (* CreatePort *)
  89.   sigBit := e.AllocSignal (-1);
  90.   IF sigBit = -1 THEN RETURN NIL END;
  91.  
  92.   Kernel.Allocate (mp, SIZE (e.MsgPort), {e.public, e.clear});
  93.   IF mp = NIL THEN e.FreeSignal (sigBit); RETURN NIL END;
  94.  
  95.   IF portName = "" THEN name := NIL ELSE name := SYS.ADR (portName) END;
  96.   mp.node.name := name;
  97.   mp.node.pri := priority;
  98.   mp.node.type := e.msgPort;
  99.   mp.flags := e.signal;
  100.   mp.sigBit := sigBit;
  101.   mp.sigTask := e.FindTask (e.NILSTR); (* Find THIS task. *)
  102.  
  103.   IF name # NIL THEN e.AddPort (mp)
  104.   ELSE NewList (mp.msgList)
  105.   END;
  106.  
  107.   RETURN mp
  108. END CreatePort;
  109.  
  110. (*------------------------------------*)
  111. PROCEDURE DeletePort * (mp : e.MsgPortPtr);
  112.  
  113. BEGIN (* DeletePort *)
  114.   IF mp = NIL THEN RETURN END;
  115.  
  116.   (* if it was public ... *)
  117.   IF mp.node.name # NIL THEN e.RemPort (mp) END;
  118.  
  119.   (* make it difficult to re-use the port *)
  120.   mp.sigTask := SYS.VAL (e.TaskPtr, -1);
  121.   mp.msgList.head := SYS.VAL (e.NodePtr, -1);
  122.  
  123.   e.FreeSignal (mp.sigBit);
  124.   SYS.DISPOSE (mp)
  125. END DeletePort;
  126.  
  127. (*--------------------------------------------------------------------*)
  128. (*
  129.   Exec IO procedures.
  130. *)
  131.  
  132.  
  133. (*------------------------------------*)
  134. PROCEDURE BeginIO * ( ioReq : e.IORequestBasePtr );
  135.  
  136. BEGIN (* BeginIO *)
  137.   SYS.PUTREG (9, ioReq); (* MOVE.L  ioReq(A5), A1 *)
  138.   SYS.INLINE (
  139.     2C69H, 20,           (* MOVE.L  20(A1), A6    *)
  140.     4EAEH, -001EH )      (* JSR     FFE2(A6)      *)
  141. END BeginIO;
  142.  
  143.  
  144. (*------------------------------------*)
  145. PROCEDURE AbortIO* ( ioReq : e.IORequestBasePtr );
  146. (*
  147.  * obsolete -- prefer to use Exec.AbortIO
  148.  *)
  149. BEGIN
  150.   SYS.PUTREG (9, ioReq); (* MOVE.L  ioReq(A5), A1 *)
  151.   SYS.INLINE (
  152.     2C69H, 20   ,        (* MOVE.L  20(A1), A6    *)
  153.     4EAEH, -36 )         (* JSR     -36(A6)       *)
  154. END AbortIO;
  155.  
  156.  
  157. (*------------------------------------*)
  158. PROCEDURE CreateExtIO *
  159.   ( port   : e.MsgPortPtr;
  160.     ioSize : INTEGER )
  161.   : e.APTR;
  162.  
  163.   VAR ioReq : e.IORequestPtr;
  164.  
  165. BEGIN (* CreateExtIO *)
  166.   IF port = NIL THEN RETURN NIL END;
  167.   Kernel.Allocate (ioReq, ioSize, {e.public, e.clear});
  168.   IF ioReq # NIL THEN
  169.     ioReq.message.node.type := e.replyMsg;
  170.     ioReq.message.length := ioSize;
  171.     ioReq.message.replyPort := port
  172.   END;
  173.   RETURN ioReq
  174. END CreateExtIO;
  175.  
  176. (*------------------------------------*)
  177. PROCEDURE DeleteExtIO ( ioReq : e.APTR );
  178.  
  179.   VAR req : e.IORequestPtr;
  180.  
  181. BEGIN (* DeleteExtIO *)
  182.   IF ioReq # NIL THEN
  183.     req := ioReq;
  184.     req.message.node.succ := SYS.VAL (e.NodePtr, -1);
  185.     req.message.replyPort := SYS.VAL (e.MsgPortPtr, -1);
  186.     SYS.DISPOSE (req)
  187.   END
  188. END DeleteExtIO;
  189.  
  190. (*------------------------------------*)
  191. PROCEDURE CreateStdIO* ( port : e.MsgPortPtr ) : e.IOStdReqPtr;
  192.  
  193. BEGIN (* CreateStdIO *)
  194.   RETURN CreateExtIO (port, SIZE (e.IOStdReq))
  195. END CreateStdIO;
  196.  
  197. (*------------------------------------*)
  198. PROCEDURE DeleteStdIO* ( ioReq : e.IOStdReqPtr );
  199.  
  200. BEGIN (* DeleteStdIO *)
  201.   DeleteExtIO (ioReq)
  202. END DeleteStdIO;
  203.  
  204. (*------------------------------------*)
  205. PROCEDURE CreateTask *
  206.   ( name      : ARRAY OF CHAR;
  207.     pri       : SHORTINT;
  208.     initPC    : e.PROC;
  209.     stackSize : e.ULONG )
  210.   : e.TaskPtr;
  211.  
  212.   VAR
  213.     taskMemList : RECORD [2] (e.Node)
  214.       numEntries : INTEGER;
  215.       entries : ARRAY 2 OF RECORD [2]
  216.         reqs : s.SET32;
  217.         size : LONGINT;
  218.       END;
  219.     END;
  220.     memList : POINTER [2] TO RECORD [2] (e.MemList)
  221.       entries : ARRAY 2 OF e.MemEntry;
  222.     END;
  223.     newTask : e.TaskPtr;
  224.  
  225. BEGIN (* CreateTask *)
  226.   stackSize := SYS.AND (stackSize + 3, 0FFFFFFFCH);
  227.   taskMemList.type := e.unknown;
  228.   taskMemList.pri := 0;
  229.   taskMemList.name := NIL;
  230.   taskMemList.numEntries := 2;
  231.   taskMemList.entries[0].reqs := {e.public, e.clear};
  232.   taskMemList.entries[0].size := SIZE (e.Task);
  233.   taskMemList.entries[1].reqs := {e.memClear};
  234.   taskMemList.entries[1].size := stackSize;
  235.   memList := e.AllocEntry (SYS.ADR (taskMemList));
  236.   IF 31 IN SYS.VAL (SET, memList) THEN RETURN NIL END;
  237.  
  238.   newTask := memList.entries[0].addr;
  239.   newTask.node.type := e.task;
  240.   newTask.node.pri := pri;
  241.   newTask.node.name := SYS.ADR (name);
  242.   newTask.spLower := memList.entries[1].addr;
  243.   newTask.spUpper :=
  244.     SYS.VAL (e.APTR, SYS.VAL (LONGINT, newTask.spLower) + stackSize);
  245.   newTask.spReg := newTask.spUpper;
  246.  
  247.   NewList (newTask.memEntry);
  248.   e.AddHead (newTask.memEntry, memList);
  249.   e.AddTask (newTask, initPC, NIL);
  250.   RETURN newTask
  251. END CreateTask;
  252.  
  253. (*------------------------------------*)
  254. PROCEDURE DeleteTask * ( task : e.TaskPtr );
  255.  
  256. BEGIN (* DeleteTask *)
  257.   e.RemTask (task)
  258. END DeleteTask;
  259.  
  260. END ExecSupport.
  261.