home *** CD-ROM | disk | FTP | other *** search
- UNIT PortSig;
-
-
- {$I PORTSIG.INT}
-
-
- IMPLEMENTATION
-
- TYPE
- SigPORT = SET OF PortFLAG;
- ChangeREC = RECORD
- CASE typ : BOOLEAN OF
- FALSE : (p : CARDINAL);
- TRUE : (s : SigPORT);
- END;
-
- PSIG = ^PortSignalREC; (* vollst. Def (PortSIGNAL) *)
- PortSignalREC = RECORD
- adr : CARDINAL;
- flag : PortFLAG;
- w : ChangeREC;
- END;
-
-
- FUNCTION SignalInit( portadr : CARDINAL; owner : PortFLAG) : PortSIGNAL;
- VAR sig : PSIG;
- BEGIN
- GetMem( sig, SIZEOF( PortSignalREC));
- sig^.adr := portadr;
- sig^.flag := owner;
- sig^.w.p := 0;
- SignalInit := PortSIGNAL( sig);
- END (* init *);
-
- FUNCTION SignalReceived( sig : PortSIGNAL) : BOOLEAN;
- BEGIN
- WITH PSIG( sig)^ DO BEGIN
- IF adr = 0 THEN BEGIN
- SignalReceived := TRUE;
- END ELSE BEGIN
- w.p := PORT[adr];
- SignalReceived := flag IN w.s;
- END;
- END;
- END (* SignalReceived *);
-
- PROCEDURE ClearOwnSignal( sig : PortSIGNAL);
- BEGIN
- WITH PSIG( sig)^ DO BEGIN
- w.p := PORT[adr];
- w.s := w.s - [flag];
- PORT[adr] := w.p;
- END;
- END (* ClearOwnSignal *);
-
- PROCEDURE WaitForSignalAndClear( sig : PortSIGNAL);
- BEGIN
- WITH PSIG( sig)^ DO BEGIN
- IF adr <> 0 THEN BEGIN
- REPEAT
- UNTIL SignalReceived( sig);
- ClearOwnSignal( sig);
- END;
- END;
- END (* WaitForSignalAndClear *);
-
- PROCEDURE SendSignalTo( sig : PortSIGNAL; process : PortFLAG);
- BEGIN
- WITH PSIG( sig)^ DO BEGIN
- w.p := PORT[adr];
- w.s := w.s + [process];
- PORT[adr] := w.p;
- END;
- END (* SendSignalTo *);
-
- PROCEDURE SignalDone( VAR sig : PortSIGNAL);
- BEGIN
- IF sig <> NIL THEN BEGIN
- FreeMem( sig, SIZEOF( PortSignalREC));
- sig := NIL;
- END;
- END (* SignalDone *);
-
-
- END (* PortSig *).
-