home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* SCHNITT.PAS *)
- (* Programm zur Überprüfung der Centronics-Schnittstelle *)
- (* (c) 1990 Burkhard Schranz & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Schnittstelle;
- {$R-,V-,D-,L-,S-,I-}
-
- USES centron, Dos, Crt;
-
- TYPE BitmapType=ARRAY[0..7] OF STRING[1];
- BildType = ARRAY[1..6] OF STRING[80];
-
- CONST Bildattr :BYTE = $70;
- StatusAttr :BYTE = $0F;
- Wahlattr :BYTE = $7F;
- BackAttr :BYTE = $70;
- MsgAttr :BYTE = $07;
- BitAttr :BYTE = $70;
-
- xan1 : BYTE = 5;
- yan1 : BYTE = 3;
-
- Statusbild:BildType =
- (
- '┌─── Status Byte ───────────────────────┐',
- '│ │',
- '│ s7 │ s6 │ s5 │ s4 │ s3 │ s2 │ s1 │ s0 │',
- '├────┼────┼────┼────┼────┼────┼────┼────┤',
- '│ │ │ │ │ │ │ │ │',
- '└────┴────┴────┴────┴────┴────┴────┴────┘');
- Databild:BildType =
- (
- '┌─── Data Byte ─────────────────────────┐',
- '│ │',
- '│ d7 │ d6 │ d5 │ d4 │ d3 │ d2 │ d1 │ d0 │',
- '├────┼────┼────┼────┼────┼────┼────┼────┤',
- '│ │ │ │ │ │ │ │ │',
- '└────┴────┴────┴────┴────┴────┴────┴────┘');
- Controlbild:BildType =
- (
- '┌─── Control Byte ──────────────────────┐',
- '│ │',
- '│ c7 │ c6 │ c5 │ c4 │ c3 │ c2 │ c1 │ c0 │',
- '├────┼────┼────┼────┼────┼────┼────┼────┤',
- '│ │ │ │ │ │ │ │ │',
- '└────┴────┴────┴────┴────┴────┴────┴────┘');
-
- VAR Schnittnr:INTEGER; { Nummer der Schnittstelle 1..3 }
- lpt : Centronics_INTERFACE; { Object aus Unit Centron }
- co : BOOLEAN; { Farbmonitor J/N }
- StrDummy : STRING[80]; { Dummy }
- SCR_BASE : WORD; { Segment des Video-Buffers }
-
-
- FUNCTION Color : BOOLEAN; { Testen, ob Farbmodus }
- VAR reg:Registers;
- BEGIN
- reg.AH := 15;
- Intr($10, reg);
- Color := reg.al IN [1, 3];
- END;
-
- PROCEDURE SetBlink(Blink:BOOLEAN);
- { Blink- / Intensitätsbit umschalten }
- VAR reg:Registers;
- BEGIN
- IF NOT Color THEN Exit;
- reg.ah := $10;
- reg.al := 3;
- IF Blink THEN reg.bx := 1
- ELSE reg.bx := 0;
- Intr($10, reg);
- END;
-
- PROCEDURE FillBox(x1, y1, x2, y2 : BYTE;ch, at : BYTE);
- { Fenster mit einem bestimmten Attribut / Zeichen füllen }
- VAR y:INTEGER;
- Attr, I, J:BYTE;
- DWord : WORD;
- BEGIN
- DWord := ch + at SHL 8;
- FOR j := y1 TO y2 DO
- FOR i := x1 TO x2 DO
- MemW[SCR_BASE:Pred(j) * 160 + i + i - 2] := DWord;
- END;
-
- PROCEDURE PutString(x, y : BYTE;VAR s:STRING;Attr : BYTE);
- { String auf den Bilschirm schreiben }
- VAR WAttr, StSeg, StOfs, xi : WORD;
- BEGIN
- WAttr := Attr SHL 8;
- StSeg := Seg(S);
- StOfs := Ofs(S);
- FOR xi := 1 TO Mem[StSeg:StOfs] DO
- MemW[SCR_BASE:(y - 1) * 160 + 2 * (x + xi) - 4] :=
- Mem[StSeg:StOfs + xi] + WAttr;
- END;
-
- PROCEDURE ChangeAttr(x1, y1, x2, y2:INTEGER;Attr:BYTE);
- { Attribut eines Bildschirmbereiches ändern }
- VAR x, y : INTEGER;
- BEGIN
- IF x1<1 THEN x1 := 1; IF x2>80 THEN x2 := 80;
- IF y1<1 THEN y1 := 1; IF y2>25 THEN y2 := 25;
- IF (x1>x2) THEN BEGIN x := x1; x1 := x2; x2 := x; END;
- IF (y1>y2) THEN BEGIN y := y1; y1 := y2; y2 := y; END;
- FOR y := y1 TO y2 DO
- FOR x := x1 TO x2 DO
- Mem[SCR_BASE:Pred(y) * 160 + x + x - 1] := Attr;
- END;
-
- PROCEDURE GetBits(b: BYTE; VAR Bitmap: Bitmaptype);
- VAR i: BYTE;
- BEGIN
- FOR i := 0 TO 7 DO
- IF b AND ($80 SHR i) = ($80 SHR i) THEN
- Bitmap[i] := '1' ELSE Bitmap[i] := '0';
- END;
-
- PROCEDURE Putbox(x, y: INTEGER; VAR Bild: BildType);
- VAR i: INTEGER;
- BEGIN
- FOR i := 1 TO 6 DO
- PutString(x, y + i - 1, bild[i], BildAttr);
- END;
-
- PROCEDURE PutMessage(x, y, col: BYTE);
- BEGIN
- Window(x + 1, y + 1, x + 28, y + 15);
- Fillbox(x, y, x + 28, y + 16, 32, col);
- TextAttr := col;
- Write('STATUS BYTE:', #13, #10,
- ' s0..s2 : keine Bedeutung', #13, #10,
- ' s3 : 0=Error', #13, #10,
- ' s4 : 1=Select', #13, #10,
- ' s5 : 1=Paper out', #13, #10,
- ' s6 : 0=fertig', #13, #10,
- ' s7 : 0=beschäftigt', #13, #10,
- '', #13, #10,
- 'CONTROL BYTE:', #13, #10,
- ' c0 : 0=Strobe', #13, #10,
- ' c1 : 0=Autofeed', #13, #10,
- ' c2 : 0=Init', #13, #10,
- ' c3 : 1=Select', #13, #10,
- ' c4 : 1=bei s6=0 IRQ7', #13, #10,
- ' c5..c7 : keine Bedeutung');
- Window(1, 1, 80, 25);
- END;
-
- PROCEDURE StatusZeile(Msg: STRING);
- VAR S: STRING;
- BEGIN
- s := Msg;
- FillBox(1, 25, 80, 25, 32, statusattr);
- PutString(2, 25, S, statusattr);
- END;
-
- PROCEDURE Grundbild;
- VAR s: STRING;
- BEGIN
- FillBox(1, 1, 80, 25, 176, Backattr);
- FillBox(1, 1, 80, 1, 32, statusattr);
- S := 'Schnittstellenmonitor für Centronics Interface' +
- ' (c) 1990 B.Schranz & toolbox';
- PutString(2, 1, S, statusattr);
- END;
-
- PROCEDURE Putall;
- VAR bm: Bitmaptype;
- i, j: BYTE;
- BEGIN
- FOR i := 1 TO 3 DO BEGIN
- IF i=1 THEN GetBits(lpt.StatusByte, bm);
- IF i=2 THEN GetBits(lpt.DataByte, bm);
- IF i=3 THEN GetBits(lpt.ControlByte, bm);
- FOR j := 0 TO 7 DO
- PutString(xan1 + j * 5 + 3,
- yan1 + (i - 1) * 7 + 4, Bm[j], BitAttr);
- END;
- END;
-
- PROCEDURE Bearbeite;
- VAR reihe, Bit: BYTE;
- ch: INTEGER;
- SBuf: STRING[10];
-
- PROCEDURE BitCol(re, bi, co: BYTE);
- VAR x1, y1: BYTE;
- BEGIN
- x1 := xan1 + (7 - bi) * 5 + 2;
- y1 := yan1 + re * 7 + 2;
- ChangeAttr(x1, y1, x1 + 1, y1, co);
- END;
-
- PROCEDURE ChangeBit(re, bi: BYTE);
- BEGIN
- CASE re OF
- 0:lpt.StatusByte := lpt.StatusByte XOR (1 SHL bi);
- 1:lpt.DataByte := lpt.DataByte XOR (1 SHL bi);
- 2:lpt.ControlByte := lpt.ControlByte XOR (1 SHL bi);
- END;
- END;
-
- BEGIN
- Reihe := 0; Bit := 0;
- WITH lpt DO REPEAT
- Putall;
- BitCol(Reihe, Bit, WahlAttr);
- ch := Ord(UpCase(ReadKey));
- IF ch=0 THEN ch := 255 + Ord(ReadKey);
- BitCol(Reihe, Bit, Bildattr);
- CASE ch OF
- 13:ChangeBit(Reihe, Bit);{Enter}
- 83:Reihe := 0;
- 68:Reihe := 1;
- 67:Reihe := 2;
- 48..55:Bit := ch - 48;
- 330:IF Bit<7 THEN Inc(Bit) ELSE Bit := 0; { links }
- 332:IF Bit>0 THEN Dec(Bit) ELSE Bit := 7; { rechts }
- 327:IF Reihe>0 THEN Dec(Reihe) ELSE Reihe:=2; { oben }
- 335:IF Reihe<2 THEN Inc(Reihe) ELSE Reihe:=0; { unten }
- 314:StatusByte := GetStatus; { F1 }
- 315:BEGIN { F2 }
- WriteData(DataByte);
- StatusByte := GetStatus;
- END;
- 316:BEGIN { F3 }
- WriteControl(controlbyte);
- Statusbyte := GetStatus
- END;
- 317:BEGIN
- IF SchnittNr<3 THEN Inc(SchnittNr) ELSE
- SchnittNr := 1;
- SetPortadress(SchnittNr);
- Str(SchnittNr, SBuf); SBuf := 'LPT' + SBuf;
- PutString(69, 25, SBuf, Statusattr);
- END;
- END;
- UNTIL ch=27;
- END;
-
- PROCEDURE Schnittstellenmonitor;
- BEGIN
- lpt.init(1);
- Grundbild;
- StatusZeile('<F1>Status lesen <F2>Data schreiben ' +
- '<F3>Control schreiben <F4>Port:LPT1 <ESC>');
- Putbox(xan1, yan1 , statusbild);
- Putbox(xan1, yan1 + 7, databild);
- Putbox(xan1, yan1 + 14, controlbild);
- PutMessage(50, 5, Msgattr);
- Bearbeite;
- END;
-
- BEGIN
- co := Color;
- IF Color THEN SCR_BASE := $B800
- ELSE SCR_BASE := $B000;
- IF ParamCount>0 THEN BEGIN
- StrDummy := ParamStr(1);
- IF UpCase(StrDummy[2])='C' THEN co := TRUE;
- IF UpCase(StrDummy[2])='B' THEN co := FALSE;
- END;
- IF co THEN BEGIN
- Bildattr := $F8;
- StatusAttr := $4F;
- Wahlattr := $0F;
- BackAttr := $70;
- MsgAttr := $17;
- BitAttr := $F1;
- END;
- IF color THEN setblink(FALSE);
- Schnittstellenmonitor;
- IF color THEN SetBlink(TRUE);
- TextAttr := 7; ClrScr;
- END.
-
-
-
-
-
-
-