home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 03 / spiel / drucker.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-09-04  |  3.9 KB  |  125 lines

  1. (**********************************************************)
  2. (*                                                        *)
  3. (*   Filename DRUCKER.PAS                                 *)
  4. (*                                                        *)
  5. (*   TOOLBOX-Spezial III Echtzeitverarbeitung             *)
  6. (*                                                        *)
  7. (*   (C) TOOLBOX und Thomas Lang 1988                     *)
  8. (*                                                        *)
  9. (*   Dieses File enthält den Teil des Spiels, der den     *)
  10. (*   Druckerstatus überwacht, dazu wird Periodic 3 be-    *)
  11. (*   nutzt. Wenn Zeichen zum Drucken im Buffer sind, so   *)
  12. (*   werden einige davon ausgegeben. Daneben werden die   *)
  13. (*   Prozeduren zum Aufnehmen von Zeichen in den          *)
  14. (*   DruckerBuffer zur Verfügung gestellt.                *)
  15. (*                                                        *)
  16. (**********************************************************)
  17.  
  18. Procedure DruckChar;
  19. Begin
  20.    If (DruckIn<>DruckOut) Or (DruckLeer=True) Then Begin
  21.       DruckBuffer[DruckIn]:=Ch;
  22.       If DruckIn=DruckBufLen Then
  23.          DruckIn:=1
  24.       Else
  25.          DruckIn:=DruckIn+1;
  26.       DruckLeer:=False;
  27.       End;
  28. End;
  29.  
  30. Procedure DruckLn;
  31. Begin
  32.    DruckChar(Chr(13));        (* Carriage Return *)
  33.    DruckChar(Chr(10));        (* und Line Feed *)
  34. End;
  35.  
  36. Procedure DruckText;
  37. Var
  38.    I,J:Integer;
  39. Begin
  40.    I:=Length(S);
  41.    If I>0 Then
  42.       For J:=1 To I Do
  43.          DruckChar(S[J]);
  44. End;
  45.  
  46. Procedure DruckInteger;
  47. Var
  48.    S:String[6];
  49. Begin
  50.    Str(I:Anzahl,S);           (* diese Konvertierung von *)
  51.                               (* Integer in String ist *)
  52.                               (* bei Turbo-Pascal wie in *)
  53.                               (* vielen Basic-Versionen, *)
  54.                               (* evtl. anpassen *)
  55.    DruckText(S);
  56. End;
  57.  
  58. Procedure PPeriodic3;
  59. Var
  60.    Reg:Register8086;          (* Deklaration in Utilities *)
  61.    Status:Byte;
  62.    Anzahl:Integer;
  63.  
  64. Procedure DruckStatus;        (* lokale Prozedur *)
  65. Begin
  66.    Reg.AH:=2;                 (* Funktion 2, Check Status *)
  67.    Intr($17,Reg);             (* DruckerInterrupt *)
  68.    Status:=Reg.AH And $B9;    (* Bits rausfiltern für: *)
  69.                               (*    Not Busy *)
  70.                               (*    No Paper *)
  71.                               (*    Selected *)
  72.                               (*    IO-Error *)
  73.                               (*    TimeOut  *)
  74. End;
  75.  
  76. Procedure DruckStatusAusgeben;     (* noch eine lokale *)
  77. Begin
  78.    GotoXY(DruckSpalte,DruckZeile);
  79.    If Status<>$90 Then Begin  (* Not Busy und Selected *)
  80.       If ((Status And 8)=8)             (* I/O-Error *)
  81.          Or (Status=0) Then             (* Port nicht da *)
  82.          Write('Fehler ')
  83.       Else If (Status And 1)=1 Then
  84.          Write('TimeOut')
  85.       Else If (Status And $20)=$20 Then
  86.          Write('Papier ')
  87.       Else If (Status And $7F)=Status Then
  88.          Write('Busy   ')
  89.       Else
  90.          Write('Fehler ');
  91.       End
  92.    Else
  93.       Write('Ok     ');
  94. End;
  95.  
  96. Begin                         (* von PPeriodic3 *)
  97.    Reg.DX:=DruckerNummer;
  98.    Anzahl:=1;
  99.    DruckStatus;
  100.    While (Anzahl<DruckAnz) And (DruckLeer=False) And
  101.          (Status=$90) Do Begin
  102.             Reg.AH:=0;        (* Funktion 0, Print Char *)
  103.             Reg.AL:=Ord(DruckBuffer[DruckOut]);
  104.             Intr($17,Reg);    (* DruckerInterrupt *)
  105.             If (DruckOut=DruckBufLen) Then
  106.                DruckOut:=1
  107.             Else
  108.                DruckOut:=DruckOut+1;
  109.             If (DruckOut=DruckIn) Then
  110.                DruckLeer:=True;
  111.             Anzahl:=Anzahl+1;
  112.             DruckStatus;
  113.             End;
  114.  
  115.    DruckStatusAusgeben;
  116.    If (DruckLeer=False) Then
  117.       PutPerDelta(3,DruckDeltaNoch)
  118.    Else Begin
  119.       If RestDrucken Then
  120.          Ende:=True           (* alles beendet *)
  121.       Else
  122.          PutPerDelta(3,DruckDeltaNix);
  123.       End;
  124. End;
  125.