home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / dev / m2 / CycloneModules.lha / modules / txt / ExecSupport.mod < prev    next >
Text File  |  1996-11-30  |  5KB  |  202 lines

  1. IMPLEMENTATION MODULE ExecSupport;
  2.  
  3. FROM SYSTEM IMPORT ASSEMBLE,ADDRESS,ADR,CAST,LONGSET;
  4.  
  5. IMPORT ExecL,ExecD,Reg;
  6.  
  7. PROCEDURE NewList(list{Reg.A0}: ExecD.ListPtr); 
  8. (*$ EntryExitCode- *)
  9. BEGIN
  10.   ASSEMBLE(
  11.     MOVE.L    A0,(A0)
  12.     ADDQ.L    #4,(A0)
  13.     CLR.L    4(A0)
  14.     MOVE.L    A0,8(A0)
  15.     RTS
  16.   END);
  17. END NewList;
  18.  
  19. PROCEDURE BeginIO(ioRequest{Reg.A1}: ADDRESS); 
  20. (*$ EntryExitCode- *)
  21. BEGIN
  22.   ASSEMBLE(
  23.     MOVE.L    A6,-(A7)
  24.     MOVE.L    ExecD.IOStdReq.device(A1),A6
  25.     JSR        ExecD.beginIO(A6)
  26.     MOVE.L    (A7)+,A6
  27.     RTS
  28.   END);
  29. END BeginIO;
  30.  
  31. PROCEDURE AbortIO(ioRequest{Reg.A1}: ADDRESS);
  32. (*$ EntryExitCode- *)
  33. BEGIN
  34.   ASSEMBLE(
  35.     MOVE.L    A6,-(A7)
  36.     MOVE.L    ExecD.IOStdReq.device(A1),A6
  37.     JSR     ExecD.abortIO(A6)
  38.     MOVE.L    (A7)+,A6
  39.     RTS
  40.   END);
  41. END AbortIO;
  42.  
  43. PROCEDURE CreatePort(portName: ADDRESS; priority: SHORTINT): ExecD.MsgPortPtr;
  44. VAR
  45.  port: ExecD.MsgPortPtr;
  46.  sig: INTEGER;
  47. BEGIN
  48.  sig:=ExecL.AllocSignal(-1);
  49.  IF sig#ExecD.noSignal THEN
  50.   port:=ExecL.AllocMem(SIZE(ExecD.MsgPort),ExecD.MemReqSet{ExecD.memClear,ExecD.public});
  51.   IF port#NIL THEN
  52.    WITH port^ DO
  53.     WITH node DO
  54.      name:=portName;
  55.      pri:=priority;
  56.      type:=ExecD.msgPort;
  57.     END;
  58.     flags:=ExecD.signal;
  59.     sigTask:=ExecL.FindTask(NIL);
  60.     sigBit:=sig;
  61.     IF node.name#NIL THEN
  62.      ExecL.AddPort(port)
  63.     ELSE
  64.      NewList(ADR(msgList))
  65.     END
  66.    END;
  67.    RETURN port
  68.   ELSE
  69.    ExecL.FreeSignal(sig)
  70.   END
  71.  END;
  72.  RETURN NIL
  73. END CreatePort;
  74.  
  75. PROCEDURE DeletePort(port:ExecD.MsgPortPtr);
  76. BEGIN
  77.  WITH port^ DO
  78.   IF node.name#NIL THEN ExecL.RemPort(port); END;
  79.   node.type:=CAST(ExecD.NodeType,-1);
  80.   msgList.head:=CAST(ExecD.NodePtr,-1);
  81.   ExecL.FreeSignal(sigBit);
  82.   ExecL.FreeMem(port,SIZE(ExecD.MsgPort))
  83.  END
  84. END DeletePort;
  85.  
  86. PROCEDURE CreateTask(taskName: ADDRESS; priority: SHORTINT;
  87.                      initPC: ADDRESS; stackSize: LONGINT): ExecD.TaskPtr;
  88. TYPE
  89.  FakeMemList=RECORD
  90.   node: ExecD.Node;
  91.   numEntries: INTEGER;
  92.   me: ARRAY[0..1] OF ExecD.MemEntry
  93.  END;
  94. VAR
  95.  newTask: ExecD.TaskPtr;
  96.  fakeMemList: FakeMemList;
  97.  ml: POINTER TO FakeMemList;
  98. BEGIN
  99.  stackSize:=CAST(LONGINT,CAST(LONGSET,stackSize+3)*LONGSET{2..31});
  100.  fakeMemList.node.succ:=NIL;
  101.  fakeMemList.node.pred:=NIL;
  102.  fakeMemList.node.type:=ExecD.unknown;
  103.  fakeMemList.node.pri:=0;
  104.  fakeMemList.node.name:=NIL;
  105.  fakeMemList.numEntries:=2;
  106.  fakeMemList.me[0].reqs:=ExecD.MemReqSet{ExecD.public,ExecD.memClear};
  107.  fakeMemList.me[0].length:=SIZE(ExecD.Task);
  108.  fakeMemList.me[1].reqs:=ExecD.MemReqSet{ExecD.memClear};
  109.  fakeMemList.me[1].length:=stackSize;
  110.  
  111.  ml:=ADDRESS(ExecL.AllocEntry(ADR(fakeMemList)));
  112.  IF CAST(LONGINT,ml)<0 THEN RETURN NIL END;
  113.  newTask:=ml^.me[0].addr;
  114.  WITH newTask^ DO
  115.   spLower:=ml^.me[1].addr;
  116.   spUpper:=spLower+stackSize;
  117.   spReg:=spUpper;
  118.   node.type:=ExecD.task;
  119.   node.pri:=priority;
  120.   node.name:=taskName;
  121.   NewList(ADR(memEntry));
  122.   ExecL.AddHead(ADR(memEntry),ADDRESS(ml));
  123.   ExecL.AddTask(newTask,initPC,NIL);
  124.   RETURN newTask
  125.  END
  126. END CreateTask;
  127.  
  128. PROCEDURE DeleteTask(t: ExecD.TaskPtr);
  129. BEGIN
  130.  ExecL.RemTask(t)
  131. END DeleteTask;
  132.  
  133. PROCEDURE CreateExtIO(ioReplyPort: ExecD.MsgPortPtr; size: INTEGER): ADDRESS;
  134. VAR
  135.  ioReq: ExecD.IOStdReqPtr;
  136. BEGIN
  137.  IF ioReplyPort=NIL THEN RETURN NIL; END;
  138.  ioReq:=ExecL.AllocMem(size,ExecD.MemReqSet{ExecD.memClear,ExecD.public});
  139.  IF ioReq=NIL THEN RETURN NIL; END;
  140.  WITH ioReq^.message DO
  141.     node.type:=ExecD.unknown;
  142.     replyPort:=ioReplyPort;
  143.     length:=size
  144.  END;
  145.  RETURN ioReq
  146. END CreateExtIO;
  147.  
  148. PROCEDURE DeleteExtIO(extIOReq: ADDRESS);
  149. VAR
  150.  ioReq: ExecD.IOStdReqPtr;
  151. BEGIN
  152.  IF extIOReq#NIL THEN
  153.   ioReq:=extIOReq;
  154.   WITH ioReq^ DO
  155.    message.node.type:=CAST(ExecD.NodeType,255);
  156.    device:=CAST(ExecD.DevicePtr,-1);
  157.    unit:=CAST(ExecD.UnitPtr,-1);
  158.    ExecL.FreeMem(ioReq,message.length)
  159.   END
  160.  END
  161. END DeleteExtIO;
  162.  
  163. PROCEDURE CreateStdIO(ioReplyPort: ExecD.MsgPortPtr): ExecD.IOStdReqPtr;
  164. BEGIN
  165.  RETURN CreateExtIO(ioReplyPort,SIZE(ExecD.IOStdReq))
  166. END CreateStdIO;
  167.  
  168. PROCEDURE DeleteStdIO(ioStdReq: ExecD.IOStdReqPtr);
  169. BEGIN
  170.  DeleteExtIO(ioStdReq)
  171. END DeleteStdIO;
  172.  
  173. PROCEDURE AllocVecPooled(memPool : ADDRESS;
  174.                          size : LONGCARD):ADDRESS;
  175.  
  176.   VAR newMem : VecPoolPtr;
  177.  
  178.   BEGIN
  179.     INC(size,SIZE(VecPool));
  180.     newMem:=ExecL.AllocPooled(memPool,size);
  181.     IF newMem#NIL THEN
  182.        WITH newMem^ DO
  183.          pool:=memPool;
  184.          fullSize:=size;
  185.        END;
  186.        INC(newMem,SIZE(VecPool));
  187.     END;
  188.     RETURN newMem;
  189.   END AllocVecPooled;
  190.  
  191. PROCEDURE FreeVecPooled(mem : ADDRESS);
  192.  
  193.   BEGIN
  194.     IF mem#NIL THEN
  195.        DEC(mem,SIZE(VecPool));
  196.        ExecL.FreePooled(CAST(VecPoolPtr,mem)^.pool,mem,CAST(VecPoolPtr,mem)^.fullSize);
  197.     END;
  198.   END FreeVecPooled;
  199.  
  200.  
  201. END ExecSupport.
  202.