home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 02 / hitech / utility.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1988-11-10  |  5.4 KB  |  167 lines

  1. (**********************************************************)
  2. (*                                                        *)
  3. (*               Filename UTILITY.PAS                     *)
  4. (*                                                        *)
  5. (*       TOOLBOX-Spezial III  Echtzeitverarbeitung        *)
  6. (*                                                        *)
  7. (*          (C) TOOLBOX und Thomas Lang 1988              *)
  8. (*                                                        *)
  9. (*   Dieses File enthält eine Sammlung von Utilities,     *)
  10. (*   die vom Scheduler sowie von anderen Aufgaben auf-    *)
  11. (*   gerufen werden können. Für bestimmte Teilaufgaben,   *)
  12. (*   wie etwa Berechnung von Zeiten, ist es sogar         *)
  13. (*   nötig, daß diese mit den zur Verfügung gestellten    *)
  14. (*   Utilities bearbeitet werden, um keine Konflikte      *)
  15. (*   zu provozieren. Ein weiterer Vorteil ist, daß        *)
  16. (*   diese eventuelle Änderungen in den Utilities sofort  *)
  17. (*   bei allen Aufgaben wirksam werden und somit alle     *)
  18. (*   mit dem gleichen Stand arbeiten.                     *)
  19. (*                                                        *)
  20. (**********************************************************)
  21.  
  22. Procedure PIncrDW;
  23. Begin
  24.    If DW.AnteilNiedrig<MaxDWNiedrig Then
  25.       DW.AnteilNiedrig:=DW.AnteilNiedrig+1
  26.    Else Begin
  27.       DW.AnteilHoch:=DW.AnteilHoch+1;
  28.       DW.AnteilNiedrig:=0;
  29.       End;
  30. End;
  31.  
  32. Function DWinReal;
  33. Begin
  34.    DWinReal:=(MaxDWNiedrig+1.0)*DW.AnteilHoch
  35.                              +DW.AnteilNiedrig;
  36. End;
  37.  
  38. Procedure RealinDW;
  39. Var
  40.    Hilf:Real;
  41. Begin
  42.    DW.AnteilHoch:=Trunc(R/(MaxDWNiedrig+1));
  43.    Hilf:=DW.AnteilHoch*(MaxDWNiedrig+1.0);
  44.    DW.AnteilNiedrig:=Trunc(R-Hilf);
  45. End;
  46.  
  47. Function TimeNow;             (* muß angepasst werden *)
  48. Var Reg:Register8086;         (* hier für MS-DOS, siehe *)
  49. Begin                         (* aber auch im Text *)
  50.    Reg.AH:= $2c;              (* GetTime=Funktion 2C *)
  51.    MsDos(Reg);                (* und Systemzeit lesen *)
  52.    TimeNow:=Reg.DL+           (* Hundertstel sind Einer *)
  53.             100.0*(Reg.DH+         (* Sekunden *)
  54.               60.0*(Reg.CL+        (* Minuten *)
  55.                60.0*(Reg.CH)));    (* Stunden *)
  56. End;
  57.  
  58. Procedure PutHoch;
  59. Begin
  60.    PLogPutHoch(HochNr);
  61.    With Aufgabe Do Begin
  62.       If Hoch[HochNr] Then    (* Aufgabe steht schon an *)
  63.          HochOverFlow:=HochOverFlow+1
  64.       Else
  65.          Hoch[HochNr]:=True;
  66.       End;
  67. End;
  68.  
  69. Procedure PutFifo;
  70. Begin
  71.    PLogPutFifo(FifoNr,Param);
  72.    With Aufgabe Do Begin
  73.       If (FifoIndexIn=FifoIndexOut)     (* leer oder voll *)
  74.          And (FifoLeer=False) Then      (* schon voll *)
  75.          FifoOverFlow:=FifoOverFlow+1
  76.       Else Begin
  77.          Fifo[FifoIndexIn].Nummer:=FifoNr;
  78.          Fifo[FifoIndexIn].Param:=Param;
  79.          FifoLeer:=False;     (* auf jeden Fall steht *)
  80.                               (* jetzt eine Aufgabe drin *)
  81.          If FifoIndexIn=AnzahlFifo Then
  82.             FifoIndexIn:=1    (* wieder vorne anfangen *)
  83.          Else
  84.             FifoIndexIn:=FifoIndexIn+1;      (* sonst +1 *)
  85.          End;
  86.       End;
  87. End;
  88.  
  89. Procedure PutPerAbs;
  90. Begin
  91.    PLogPutPerAbs(PerNr,AbsZeit);
  92.    With Aufgabe Do Begin
  93.       If Periodic[PerNr].ZuTun Then  (* Aufgabe noch drin *)
  94.          PerOverFlow:=PerOverFlow+1
  95.       Else Begin
  96.          Periodic[PerNr].ZuTun:=True;
  97.          Periodic[PerNr].Zeit:=AbsZeit;
  98.          End;
  99.       End;
  100. End;
  101.  
  102. Procedure PutPerDelta;
  103. Begin
  104.    PLogPutPerDelta(PerNr,DeltaZeit);
  105.    With Aufgabe Do Begin
  106.       If Periodic[PerNr].ZuTun Then  (* Aufgabe noch drin *)
  107.          PerOverFlow:=PerOverFlow+1
  108.       Else Begin
  109.          Periodic[PerNr].ZuTun:=True;
  110.          Periodic[PerNr].Zeit:=TimeNow+DeltaZeit;
  111.          End;
  112.       End;
  113. End;
  114.  
  115. Function FrageJN;
  116. Var
  117.    T:Char;
  118. Begin
  119.    Repeat
  120.       Write(S);               (* String ausgeben *)
  121.       Write(' (J/N) ? ');     (* und als Frage mit J *)
  122.                               (* oder N kennzeichnen *)
  123.  
  124.       Read(KBD,T);            (* lese ohne Echo, evtl. *)
  125.                               (* ist hier Anpassung nötig *)
  126.  
  127.       T:=UpCase(T);           (* Großbuchstabe machen *)
  128.       If (Ord(T)>32) Then     (* keine Escape-Folge *)
  129.          WriteLn(T);          (* also ausgeben *)
  130.  
  131.       If (T<>'J') And (T<>'N') Then     (* Fehler melden *)
  132.          WriteLn('Bitte nur J (=Ja) oder N (=Nein) eingeben');
  133.  
  134.    Until (T='J') Or (T='N');  (* so lange, bis O.k. *)
  135.                               (* dann Wert übergeben *)
  136.    If T='J' Then
  137.       FrageJN:=True
  138.    Else
  139.       FrageJN:=False;
  140. End;                          (* von FrageJN *)
  141.  
  142. Function FrageInteger;
  143. Var
  144.    I:Integer;
  145. Begin
  146.    Repeat
  147.       Write(S);               (* String ausgeben *)
  148.       Write(' (Wertebereich ist ');     (* und Hinweis *)
  149.       Write(Von);
  150.       Write(' bis ');
  151.       Write(Bis);
  152.       Write('): ');
  153.  
  154.       ReadLn(I);              (* einlesen, wobei keine *)
  155.                               (* Fehlerprüfung gemacht *)
  156.                               (* wird, also evtl. wieder *)
  157.                               (* ein Runtime Error auf- *)
  158.                               (* treten kann *)
  159.  
  160.       If (I<Von) Or (I>Bis) Then     (* Fehler melden *)
  161.          WriteLn('Wertebereich beachten!');
  162.  
  163.    Until (I>=Von) And (I<=Bis);    (* so lange, bis O.k. *)
  164.  
  165.    FrageInteger:=I;           (* dann Wert übergeben *)
  166. End;                          (* von FrageInteger *)
  167.