home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / OB3.2D3.DMS / in.adf / Interfaces / ExecSupport.mod < prev    next >
Encoding:
Text File  |  1992-11-02  |  7.0 KB  |  282 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                                                                         *)
  3. (*  Amiga Oberon Interface Module:                    Date: 02-Nov-92      *)
  4. (*                                                                         *)
  5. (*   © 1992 by Fridtjof Siebert                                            *)
  6. (*                                                                         *)
  7. (*-------------------------------------------------------------------------*)
  8.  
  9. MODULE ExecSupport;
  10.  
  11. IMPORT e * := Exec,
  12.        ol  := OberonLib,
  13.        sys := SYSTEM;
  14.  
  15. CONST
  16.   TASK = 0;
  17.   STACK = 1;
  18.   NUMENTRIES = 2;
  19.  
  20. TYPE
  21.   FakeMemEntry = STRUCT
  22.                    reqs: LONGSET;
  23.                    length: LONGINT;
  24.                  END;
  25.  
  26.   FakeMemList = STRUCT (node: e.Node)
  27.                   numEntries: INTEGER;
  28.                   me: ARRAY NUMENTRIES OF FakeMemEntry;
  29.                 END;
  30.  
  31. CONST
  32.   TaskMemTemplate = FakeMemList(NIL,NIL,0,0,NIL,    (* node *)
  33.                                 NUMENTRIES,
  34.                                 LONGSET{e.public,e.memClear},
  35.                                 sys.SIZE(e.Task),
  36.                                 LONGSET{e.memClear},
  37.                                 0);
  38.  
  39.  
  40. (*-------------------------------------------------------------------------*)
  41.  
  42.  
  43. PROCEDURE NewList*(VAR list: e.CommonList);
  44. BEGIN
  45.   WITH list: e.MinList DO
  46.     list.head := sys.ADR(list.tail);
  47.     list.tail := NIL;
  48.     list.tailPred := sys.ADR(list.head);
  49.   END;
  50. END NewList;
  51.  
  52.  
  53. PROCEDURE ListEmpty*(VAR list: e.CommonList): BOOLEAN;
  54. BEGIN
  55.   RETURN list(e.MinList).tailPred = sys.ADR(list);
  56. END ListEmpty;
  57.  
  58.  
  59. PROCEDURE NewMinList*(VAR list: e.MinList);
  60. (*
  61.  * obsolete
  62.  *   "Use NewList() instead!"
  63.  *)
  64. BEGIN
  65.   list.head := sys.ADR(list.tail);
  66.   list.tail := NIL;
  67.   list.tailPred := sys.ADR(list.head);
  68. END NewMinList;
  69.  
  70.  
  71. PROCEDURE MinListEmpty*(VAR list: e.MinList): BOOLEAN;
  72. (*
  73.  * obsolete
  74.  *   "Use ListEmpty() instead!"
  75.  *)
  76. BEGIN
  77.   RETURN list.tailPred = sys.ADR(list);
  78. END MinListEmpty;
  79.  
  80.  
  81. PROCEDURE IsMsgPortEmpty*(x: e.MsgPortPtr): BOOLEAN;
  82. BEGIN
  83.   RETURN x.msgList.tailPred = sys.ADR(x^);
  84. END IsMsgPortEmpty;
  85.  
  86.  
  87. (*-------------------------------------------------------------------------*)
  88.  
  89.  
  90. PROCEDURE BeginIO*(ioRequest:e.IORequestPtr);
  91. (*
  92.  * obsolete
  93.  *   "Prefer to use Exec.Do/SendIO"
  94.  *)
  95.  
  96. (* $EntryExitCode- *)
  97. BEGIN
  98.   sys.INLINE(
  99.     0226FU, 00004U,            (*   move.l  4(A7),A1                   *)
  100.     02C69U, 00014U,            (*   move.l  20(A1),A6                  *)
  101.     04EAEU, 0FFE2U,            (*   jsr     -30(A6)                    *)
  102.     02257U,                    (*   move.l  (A7),A1                    *)
  103.     0504FU,                    (*   addq    #8,A7                      *)
  104.     04ED1H                     (*   jmp     (A1)                       *)
  105.   ); (* INLINE *)
  106. END BeginIO;
  107.  
  108.  
  109. PROCEDURE AbortIO*(ioRequest:e.IORequestPtr);
  110. (*
  111.  * obsolete
  112.  *   "Prefer to use Exec.AbortIO"
  113.  *)
  114.  
  115. (* $EntryExitCode- *)
  116. BEGIN
  117.   sys.INLINE(
  118.     0226FH, 00004H,            (*   move.l  4(A7),A1                   *)
  119.     02C69H, 00014H,            (*   move.l  20(A1),A6                  *)
  120.     04EAEH, 0FFDCH,            (*   jsr     -36(A6)                    *)
  121.     02257H,                    (*   move.l  (A7),A1                    *)
  122.     0504FH,                    (*   addq    #8,A7                      *)
  123.     04ED1H                     (*   jmp     (A1)                       *)
  124.   ); (* INLINE *)
  125. END AbortIO;
  126.  
  127.  
  128. (*-------------------------------------------------------------------------*)
  129.  
  130.  
  131. PROCEDURE CreatePort*(portName:ARRAY OF CHAR;
  132.                       priority:SHORTINT):e.MsgPortPtr; (* $CopyArrays- *)
  133. (* Private Ports werden mit dem Namen "" erzeugt. *)
  134.  
  135. VAR
  136.   sigBit: SHORTINT;
  137.   Port: e.MsgPortPtr;
  138.   oldmemreqs: LONGSET;
  139.   name: e.APTR;
  140.  
  141. BEGIN
  142.   sigBit := e.AllocSignal(-1);
  143.   IF sigBit<0 THEN RETURN NIL END;
  144.   oldmemreqs := ol.MemReqs;
  145.   INCL(ol.MemReqs,e.public);
  146.   NEW(Port);
  147.   ol.MemReqs := oldmemreqs;
  148.   IF Port=NIL THEN
  149.     e.FreeSignal(sigBit);
  150.     RETURN NIL
  151.   END;
  152.   IF portName[0]=0X THEN name := NIL ELSE name := sys.ADR(portName) END;
  153.   Port.node.name := name;
  154.   Port.node.pri  := priority;
  155.   Port.node.type := e.msgPort;
  156.   Port.flags     := e.signal;
  157.   Port.sigBit    := sigBit;
  158.   Port.sigTask   := e.FindTask(NIL);
  159.   IF name#NIL THEN e.AddPort(Port)
  160.               ELSE NewList(Port.msgList) END;
  161.   RETURN Port;
  162. END CreatePort;
  163.  
  164.  
  165. PROCEDURE DeletePort*(port:e.MsgPortPtr);
  166.  
  167.  
  168. BEGIN
  169.   IF port.node.name#NIL THEN e.RemPort(port) END;
  170.   port.node.type := -1;
  171.   port.msgList.head := sys.VAL(sys.ADDRESS,-1);
  172.   e.FreeSignal(port.sigBit);
  173.   DISPOSE(port);
  174. END DeletePort;
  175.  
  176.  
  177. (*-------------------------------------------------------------------------*)
  178.  
  179.  
  180. PROCEDURE CreateExtIO*(ioReplyPort:e.MsgPortPtr;
  181.                       size:INTEGER): e.APTR;
  182.  
  183. VAR
  184.   ioReq: e.IORequestPtr;
  185.   oldmemreqs: LONGSET;
  186.  
  187. BEGIN
  188.   IF ioReplyPort=NIL THEN RETURN NIL END;
  189.   oldmemreqs := ol.MemReqs;
  190.   INCL(ol.MemReqs,e.public);
  191.   ol.New(ioReq,size);
  192.   ol.MemReqs := oldmemreqs;
  193.   IF ioReq=NIL THEN RETURN NIL END;
  194.   ioReq.message.node.type := e.unknown;
  195.   ioReq.message.length := size;
  196.   ioReq.message.replyPort := ioReplyPort;
  197.   RETURN ioReq;
  198. END CreateExtIO;
  199.  
  200.  
  201. PROCEDURE DeleteExtIO*(extIOReq:e.APTR);
  202.  
  203. BEGIN
  204.   IF extIOReq#NIL THEN DISPOSE(extIOReq) END;
  205. END DeleteExtIO;
  206.  
  207.  
  208. PROCEDURE CreateStdIO*(ioReplyPort:e.MsgPortPtr):e.IOStdReqPtr;
  209.  
  210. BEGIN
  211.   RETURN CreateExtIO(ioReplyPort,sys.SIZE(e.IOStdReq));
  212. END CreateStdIO;
  213.  
  214.  
  215. PROCEDURE DeleteStdIO*(ioStdReq:e.IOStdReqPtr);
  216.  
  217. BEGIN
  218.   DeleteExtIO(ioStdReq);
  219. END DeleteStdIO;
  220.  
  221.  
  222. (*-------------------------------------------------------------------------*)
  223.  
  224.  
  225. PROCEDURE CreateTask*(taskName  : ARRAY OF CHAR;
  226.                       priority  : SHORTINT;
  227.                       initPC    : e.PROC;
  228.                       stackSize : LONGINT): e.TaskPtr; (* $CopyArrays- *)
  229. (* If SmallData is used, the tasks userdate is set to SYSTEM.REG(13).
  230.  * As soon as this task accesses global Variables, A5 has to be
  231.  * set using SYSTEM.SETREG(13,Exec.exec.thisTask.userdata).
  232.  *)
  233.  
  234. VAR
  235.   newTask: e.TaskPtr;
  236.   fakememlist: FakeMemList;
  237.   ml: UNTRACED POINTER TO STRUCT (memList : e.MemList)
  238.                    me: ARRAY NUMENTRIES OF e.MemEntry;
  239.                  END;
  240.  
  241. BEGIN
  242.   stackSize := sys.VAL(LONGINT,sys.VAL(LONGSET,stackSize + 3) * (-LONGSET{0..1}));
  243.  
  244.   fakememlist := TaskMemTemplate;
  245.   fakememlist.me[STACK].length := stackSize;
  246.  
  247.   ml := e.AllocEntry(sys.ADR(fakememlist));
  248.   IF 31 IN sys.VAL(LONGSET,ml) THEN RETURN NIL END;
  249.  
  250.   newTask := ml.me[TASK].addr;
  251.   newTask.spLower := sys.VAL(LONGINT,ml.me[STACK].addr);
  252.   newTask.spUpper := sys.VAL(LONGINT,newTask.spLower)+stackSize;
  253.   newTask.spReg   := newTask.spUpper;
  254.  
  255.   newTask.node.type := e.task;
  256.   newTask.node.pri  := priority;
  257.   newTask.node.name := sys.ADR(taskName);
  258. (* $IF SmallData *)
  259.   newTask.userData := sys.REG(13);
  260. (* $END *)
  261.  
  262.   NewList(newTask.memEntry);
  263.   e.AddHead(newTask.memEntry,ml);
  264.  
  265.   e.AddTask(newTask,initPC,NIL);
  266.  
  267.   RETURN newTask;
  268.  
  269. END CreateTask;
  270.  
  271.  
  272. PROCEDURE DeleteTask*(t:e.TaskPtr);
  273.  
  274. BEGIN
  275.   e.RemTask(t);
  276. END DeleteTask;
  277.  
  278.  
  279. END ExecSupport.
  280.  
  281.  
  282.