home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9302 / signals / t / portsig.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-01-19  |  1.8 KB  |  86 lines

  1. UNIT PortSig;
  2.  
  3.  
  4. {$I PORTSIG.INT}
  5.  
  6.  
  7. IMPLEMENTATION
  8.  
  9. TYPE
  10.         SigPORT   = SET OF PortFLAG;
  11.         ChangeREC = RECORD
  12.                       CASE typ : BOOLEAN OF
  13.                         FALSE : (p : CARDINAL);
  14.                         TRUE  : (s : SigPORT);
  15.                     END;
  16.  
  17.         PSIG = ^PortSignalREC;     (* vollst. Def (PortSIGNAL) *)
  18.         PortSignalREC = RECORD
  19.           adr  : CARDINAL;
  20.           flag : PortFLAG;
  21.           w    : ChangeREC;
  22.         END;
  23.  
  24.  
  25. FUNCTION  SignalInit( portadr : CARDINAL; owner : PortFLAG) : PortSIGNAL;
  26. VAR sig : PSIG;
  27. BEGIN
  28.   GetMem( sig, SIZEOF( PortSignalREC));
  29.   sig^.adr := portadr;
  30.   sig^.flag := owner;
  31.   sig^.w.p := 0;
  32.   SignalInit := PortSIGNAL( sig);
  33. END (* init *);
  34.  
  35. FUNCTION  SignalReceived( sig : PortSIGNAL) : BOOLEAN;
  36. BEGIN
  37.   WITH PSIG( sig)^ DO BEGIN
  38.     IF adr = 0 THEN BEGIN
  39.       SignalReceived := TRUE;
  40.     END ELSE BEGIN
  41.       w.p := PORT[adr];
  42.       SignalReceived := flag IN w.s;
  43.     END;
  44.   END;
  45. END (* SignalReceived *);
  46.  
  47. PROCEDURE ClearOwnSignal( sig : PortSIGNAL);
  48. BEGIN
  49.   WITH PSIG( sig)^ DO BEGIN
  50.     w.p := PORT[adr];
  51.     w.s := w.s - [flag];
  52.     PORT[adr] := w.p;
  53.   END;
  54. END (* ClearOwnSignal *);
  55.  
  56. PROCEDURE WaitForSignalAndClear( sig : PortSIGNAL);
  57. BEGIN
  58.   WITH PSIG( sig)^ DO BEGIN
  59.     IF adr <> 0 THEN BEGIN
  60.       REPEAT
  61.       UNTIL SignalReceived( sig);
  62.       ClearOwnSignal( sig);
  63.     END;
  64.   END;
  65. END (* WaitForSignalAndClear *);
  66.  
  67. PROCEDURE SendSignalTo( sig : PortSIGNAL; process : PortFLAG);
  68. BEGIN
  69.   WITH PSIG( sig)^ DO BEGIN
  70.     w.p := PORT[adr];
  71.     w.s := w.s + [process];
  72.     PORT[adr] := w.p;
  73.   END;
  74. END (* SendSignalTo *);
  75.  
  76. PROCEDURE SignalDone( VAR sig : PortSIGNAL);
  77. BEGIN
  78.   IF sig <> NIL THEN BEGIN
  79.     FreeMem( sig, SIZEOF( PortSignalREC));
  80.     sig := NIL;
  81.   END;
  82. END (* SignalDone *);
  83.  
  84.  
  85. END (* PortSig *).
  86.