home *** CD-ROM | disk | FTP | other *** search
- (**********************************************************)
- (* *)
- (* Filename DRUCKER.PAS *)
- (* *)
- (* TOOLBOX-Spezial III Echtzeitverarbeitung *)
- (* *)
- (* (C) TOOLBOX und Thomas Lang 1988 *)
- (* *)
- (* Dieses File enthält den Teil des Spiels, der den *)
- (* Druckerstatus überwacht, dazu wird Periodic 3 be- *)
- (* nutzt. Wenn Zeichen zum Drucken im Buffer sind, so *)
- (* werden einige davon ausgegeben. Daneben werden die *)
- (* Prozeduren zum Aufnehmen von Zeichen in den *)
- (* DruckerBuffer zur Verfügung gestellt. *)
- (* *)
- (**********************************************************)
-
- Procedure DruckChar;
- Begin
- If (DruckIn<>DruckOut) Or (DruckLeer=True) Then Begin
- DruckBuffer[DruckIn]:=Ch;
- If DruckIn=DruckBufLen Then
- DruckIn:=1
- Else
- DruckIn:=DruckIn+1;
- DruckLeer:=False;
- End;
- End;
-
- Procedure DruckLn;
- Begin
- DruckChar(Chr(13)); (* Carriage Return *)
- DruckChar(Chr(10)); (* und Line Feed *)
- End;
-
- Procedure DruckText;
- Var
- I,J:Integer;
- Begin
- I:=Length(S);
- If I>0 Then
- For J:=1 To I Do
- DruckChar(S[J]);
- End;
-
- Procedure DruckInteger;
- Var
- S:String[6];
- Begin
- Str(I:Anzahl,S); (* diese Konvertierung von *)
- (* Integer in String ist *)
- (* bei Turbo-Pascal wie in *)
- (* vielen Basic-Versionen, *)
- (* evtl. anpassen *)
- DruckText(S);
- End;
-
- Procedure PPeriodic3;
- Var
- Reg:Register8086; (* Deklaration in Utilities *)
- Status:Byte;
- Anzahl:Integer;
-
- Procedure DruckStatus; (* lokale Prozedur *)
- Begin
- Reg.AH:=2; (* Funktion 2, Check Status *)
- Intr($17,Reg); (* DruckerInterrupt *)
- Status:=Reg.AH And $B9; (* Bits rausfiltern für: *)
- (* Not Busy *)
- (* No Paper *)
- (* Selected *)
- (* IO-Error *)
- (* TimeOut *)
- End;
-
- Procedure DruckStatusAusgeben; (* noch eine lokale *)
- Begin
- GotoXY(DruckSpalte,DruckZeile);
- If Status<>$90 Then Begin (* Not Busy und Selected *)
- If ((Status And 8)=8) (* I/O-Error *)
- Or (Status=0) Then (* Port nicht da *)
- Write('Fehler ')
- Else If (Status And 1)=1 Then
- Write('TimeOut')
- Else If (Status And $20)=$20 Then
- Write('Papier ')
- Else If (Status And $7F)=Status Then
- Write('Busy ')
- Else
- Write('Fehler ');
- End
- Else
- Write('Ok ');
- End;
-
- Begin (* von PPeriodic3 *)
- Reg.DX:=DruckerNummer;
- Anzahl:=1;
- DruckStatus;
- While (Anzahl<DruckAnz) And (DruckLeer=False) And
- (Status=$90) Do Begin
- Reg.AH:=0; (* Funktion 0, Print Char *)
- Reg.AL:=Ord(DruckBuffer[DruckOut]);
- Intr($17,Reg); (* DruckerInterrupt *)
- If (DruckOut=DruckBufLen) Then
- DruckOut:=1
- Else
- DruckOut:=DruckOut+1;
- If (DruckOut=DruckIn) Then
- DruckLeer:=True;
- Anzahl:=Anzahl+1;
- DruckStatus;
- End;
-
- DruckStatusAusgeben;
- If (DruckLeer=False) Then
- PutPerDelta(3,DruckDeltaNoch)
- Else Begin
- If RestDrucken Then
- Ende:=True (* alles beendet *)
- Else
- PutPerDelta(3,DruckDeltaNix);
- End;
- End;