home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* VSOBJ.PAS *)
- (* *)
- (* ■ VirtualScreen: Objekt, das einen virtuellen Bild- *)
- (* schirm implementiert. *)
- (* *)
- (* (c) 1991 by R.Reichert & toolbox *)
- (* ----------------------------------------------------- *)
- UNIT VSObj;
-
- INTERFACE
-
- USES UBase;
-
- CONST { ReturnCodes: }
- VSOk = 0; { Kein Fehler (defaultmässig) }
- VSXYInvalid = 1; { x und/oder y ungültig }
-
- TYPE
- ScreenMemPtr = ^ScreenMemory;
- ScreenMemory = ARRAY [0..10000] OF WORD;
-
- VirtualScreenPtr = ^VirtualScreen;
- VirtualScreen = OBJECT (Base)
-
- XLength, { X-Länge des vB's }
- YLength, { Y-Länge des vB's }
- ReturnCode : BYTE;
- VSMem : ScreenMemPtr; { Speicher für vB }
-
- CONSTRUCTOR Init (XL, YL : BYTE);
- PROCEDURE Clear; VIRTUAL;
- PROCEDURE ClearPart (x1, y1, x2, y2 : BYTE); VIRTUAL;
- PROCEDURE Fill (Chr:CHAR; Attr:BYTE); VIRTUAL;
- PROCEDURE FillPart
- (x1, y1, x2, y2, Attr : BYTE; Chr : CHAR); VIRTUAL;
- PROCEDURE FillPartAttr
- (x1, y1, x2, y2, Attr : BYTE); VIRTUAL;
- PROCEDURE WriteChr (x,y,Attr:BYTE;Chr:CHAR); VIRTUAL;
- PROCEDURE WriteStr(x,y,Attr:BYTE;Str:STRING); VIRTUAL;
- PROCEDURE WriteAttr (x, y, Attr : BYTE); VIRTUAL;
- PROCEDURE SetReturnCode (Code : BYTE); VIRTUAL;
- FUNCTION GetPartPtr (x,y:BYTE):ScreenMemPtr; VIRTUAL;
- FUNCTION XYInVSMem (x, y : BYTE) : BOOLEAN; VIRTUAL;
- FUNCTION GetAddr (x, y : BYTE) : WORD; VIRTUAL;
- FUNCTION GetReturnCode : INTEGER; VIRTUAL;
- FUNCTION GetXLength : BYTE; VIRTUAL;
- FUNCTION GetYLength : BYTE; VIRTUAL;
- DESTRUCTOR Done; VIRTUAL;
- END;
-
- IMPLEMENTATION
-
- (* ----------------------------------------------------- *)
- (* Belegt für einen xl*yl grossen virtuellen Bildschirm *)
- (* Speicher. *)
- (* ----------------------------------------------------- *)
- CONSTRUCTOR VirtualScreen.Init (XL, YL : BYTE);
- VAR NeededMem : WORD;
- BEGIN
- XLength := XL;
- YLength := YL;
- ReturnCode := VSOk;
- NeededMem := XLength*YLength*2;
- IF XLength*YLength>10000 THEN
- Fail
- ELSE
- IF MemAvail>NeededMem THEN
- GetMem (VSMem, XLength*YLength*2)
- ELSE { wenn es nicht genügend Speicher für }
- Fail; { den virt. Bildschirm hat, kann nicht }
- { gearbeitet werden. }
- END;
-
- (* ----------------------------------------------------- *)
- (* Die folgenden Methoden sind zur Bearbeitung des virtu-*)
- (* ellen Bildschirms gedacht. *)
- (* ----------------------------------------------------- *)
- PROCEDURE VirtualScreen.Clear;
- BEGIN
- Fill (' ', 7);
- END;
-
- PROCEDURE VirtualScreen.ClearPart (x1,y1,x2,y2 :BYTE);
- BEGIN
- FillPart (x1, y1, x2, y2, 7, ' ');
- END;
-
- PROCEDURE VirtualScreen.Fill (Chr : CHAR; Attr: BYTE);
- BEGIN
- FillPart (1, 1, XLength, YLength, Attr, Chr);
- END;
-
- PROCEDURE VirtualScreen.FillPart
- (x1, y1, x2, y2, Attr : BYTE; Chr : CHAR);
- VAR i, j : BYTE;
- BEGIN
- IF XYInVSMem (x1, y1) AND { x und y gültig ? }
- XYInVSMem (x2, y2) THEN
- FOR i := y1 TO y2 DO { ja, also "füllen" }
- FOR j := x1 TO x2 DO
- VSMem^[GetAddr (j, i)] :=
- WORD (Ord(Chr)+Attr SHL 8)
- ELSE
- SetReturnCode (VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.FillPartAttr
- (x1, y1, x2, y2, Attr : BYTE);
- VAR i, j : BYTE;
- BEGIN
- IF XYInVSMem (x1, y1) AND
- XYInVSMem (x2, y2) THEN
- FOR i := y1 TO y2 DO
- FOR j := x1 TO x2 DO
- VSMem^[GetAddr (j, i)] :=
- WORD (Lo (VSMem^[GetAddr (j, i)]) + Attr SHL 8)
- ELSE
- SetReturnCode (VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.WriteChr
- (x, y, Attr : BYTE; Chr : CHAR);
- BEGIN
- IF XYInVSMem (x, y) THEN
- VSMem^[GetAddr (x, y)] := WORD (Ord (Chr)+Attr SHL 8)
- ELSE
- SetReturnCode (VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.WriteStr
- (x, y, Attr : BYTE; Str : STRING);
- VAR i : BYTE;
- BEGIN
- IF XYInVSMem (x, y) AND
- XYInVSMem (Pred (x+Length (Str)), y) THEN
- FOR i := 1 TO Length (Str) DO
- VSMem^[GetAddr (Pred (x+i), y)] :=
- WORD (Ord (Str [i]) + Attr SHL 8)
- ELSE
- SetReturnCode (VSXYInvalid);
- END;
-
- PROCEDURE VirtualScreen.WriteAttr (x, y, Attr : BYTE);
- VAR Addr : WORD;
- BEGIN
- IF XYInVSMem (x, y) THEN BEGIN
- Addr := GetAddr (x, y);
- VSMem^[Addr] := WORD (Lo (VSMem^[Addr]) + Attr SHL 8);
- END ELSE
- SetReturnCode (VSXYInvalid);
- END;
-
-
- PROCEDURE VirtualScreen.SetReturnCode (Code : BYTE);
- BEGIN
- ReturnCode := Code;
- END;
-
- (* ----------------------------------------------------- *)
- (* Liefert einen Zeiger auf den mit x/y beginnenden Be- *)
- (* reich des virtuellen Bildschirms. *)
- (* ----------------------------------------------------- *)
- FUNCTION VirtualScreen.GetPartPtr
- (x, y : BYTE) : ScreenMemPtr;
- BEGIN
- IF XYInVSMem (x, y) THEN
- GetPartPtr := Addr (VSMem^[GetAddr (x, y)])
- ELSE
- SetReturnCode (VSXYInvalid);
- END;
-
- (* ----------------------------------------------------- *)
- (* Prüft, ob x/y im Bereich des virtuellen Bildschirms. *)
- (* ----------------------------------------------------- *)
- FUNCTION VirtualScreen.XYInVSMem (x,y:BYTE) : BOOLEAN;
- BEGIN
- IF (x>0) AND (x<=XLength) AND
- (y>0) AND (y<=YLength) THEN
- XYInVSMem := TRUE
- ELSE
- XYInVSMem := FALSE
- END;
-
- (* ----------------------------------------------------- *)
- (* Liefert die Adresse des Bytes mit der Position x/y *)
- (* im virtuellen Bildschirm RELATIV zur Anfangsposition *)
- (* virtuellen Bidlschirmspeicher. *)
- (* ----------------------------------------------------- *)
- FUNCTION VirtualScreen.GetAddr (x, y : BYTE) : WORD;
- BEGIN
- IF XYInVSMem (x, y) THEN
- GetAddr := Pred (y) * XLength + Pred (x)
- ELSE
- GetAddr := 0;
- END;
-
- FUNCTION VirtualScreen.GetReturnCode : INTEGER;
- BEGIN
- GetReturnCode := ReturnCode;
- SetReturnCode (VSOk);
- END;
-
- FUNCTION VirtualScreen.GetXLength : BYTE;
- BEGIN
- GetXLength := XLength;
- END;
-
- FUNCTION VirtualScreen.GetYLength : BYTE;
- BEGIN
- GetYLength := YLength;
- END;
-
- DESTRUCTOR VirtualScreen.Done;
- BEGIN
- IF VSMem<>NIL THEN
- FreeMem (VSMem, XLength*YLength*2);
- END;
-
- END.
- (* ----------------------------------------------------- *)
- (* Ende von VSOBJ.PAS *)
- (* ----------------------------------------------------- *)