home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / signals / ts / portsig.mod < prev    next >
Encoding:
Modula Implementation  |  1993-01-19  |  1.9 KB  |  89 lines

  1. IMPLEMENTATION MODULE PortSig;
  2.  
  3. (*%T _OS2*)
  4. FROM IODLL      IMPORT Input,Output;
  5. (*%E*)
  6. (*%F _OS2*)
  7. FROM SYSTEM     IMPORT In,Out;
  8. (*%E*)
  9. FROM Storage    IMPORT ALLOCATE,DEALLOCATE;
  10. IMPORT Str;
  11.  
  12.  
  13. (*%T _OS2*)
  14. CONST     In    ::= Input;
  15.           Out   ::= Output;
  16. (*%E*)
  17.  
  18.  
  19. TYPE    SigPORT           = SET OF PortFLAG;
  20.  
  21.         PortSIGNAL        = POINTER TO PortSignalREC;
  22.         PortSignalREC     = RECORD
  23.                               adr  : CARDINAL;
  24.                               flag : PortFLAG;
  25.                             END;
  26.  
  27. PROCEDURE SignalInit( portadr : CARDINAL; owner : PortFLAG) : PortSIGNAL;
  28. VAR sig : PortSIGNAL;
  29. BEGIN
  30.   ALLOCATE( sig, SIZE( sig^));
  31.   sig^.adr := portadr;
  32.   sig^.flag := owner;
  33.   RETURN sig;
  34. END SignalInit;
  35.  
  36. PROCEDURE SignalReceived( sig : PortSIGNAL) : BOOLEAN;
  37. BEGIN
  38.   IF sig^.adr = 0 THEN
  39.     RETURN TRUE;
  40.   ELSE
  41.     RETURN sig^.flag IN SigPORT( In( sig^.adr));
  42.   END;
  43. END SignalReceived;
  44.  
  45. PROCEDURE ClearOwnSignal( sig : PortSIGNAL);
  46. VAR val : SigPORT;
  47. BEGIN
  48.   val := SigPORT( In( sig^.adr));
  49.   EXCL( val, sig^.flag);
  50.   Out( sig^.adr, SHORTCARD( val));
  51. END ClearOwnSignal;
  52.  
  53. PROCEDURE WaitForSignalAndClear( sig : PortSIGNAL);
  54. BEGIN
  55.   IF sig^.adr # 0 THEN
  56.     REPEAT
  57.     UNTIL SignalReceived( sig);
  58.     ClearOwnSignal( sig);
  59.   END;
  60. END WaitForSignalAndClear;
  61.  
  62. PROCEDURE SendSignalTo( sig : PortSIGNAL; process : PortFLAG);
  63. VAR val : SigPORT;
  64. BEGIN
  65.   val := SigPORT( In( sig^.adr));
  66.   INCL( val, process);
  67.   Out( sig^.adr, SHORTCARD( val));
  68. END SendSignalTo;
  69.  
  70. PROCEDURE SignalIsSet( sig : PortSIGNAL; process : PortFLAG) : BOOLEAN;
  71. BEGIN
  72.   IF sig^.adr = 0 THEN
  73.     RETURN TRUE;
  74.   ELSE
  75.     RETURN process IN SigPORT( In( sig^.adr));
  76.   END;
  77. END SignalIsSet;
  78.  
  79. PROCEDURE SignalDone( VAR sig : PortSIGNAL);
  80. BEGIN
  81.   IF sig # NIL THEN
  82.     DEALLOCATE( sig, SIZE( sig^));
  83.     sig := NIL;
  84.   END;
  85. END SignalDone;
  86.  
  87.  
  88. END PortSig.
  89.