home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* TSRWIND.INC *)
- (* einfache Window-Management-Routinen *)
- (* fuer die TSR-Toolbox *)
- (* ------------------------------------------------------ *)
- CONST WinInit: BOOLEAN = FALSE;
- On = TRUE; Off = FALSE;
- VideoEnable = $08;
- MonoScreen = $B000; ColorScreen = $B800;
- Monochrom = 7;
- MaxWin = 5;
-
- TYPE ScrInhalt = ARRAY [1..4000] OF CHAR;
- WinType = RECORD x1, y1, x2, y2: INTEGER; END;
- Screens = RECORD
- Bild: ScrInhalt;
- Dim : WinType; (* Fenstergroesse *)
- x, y: INTEGER; (* Cursor-Position *)
- Shape : INTEGER; (* Cursorform *)
- END;
-
- VAR Win: RECORD
- Dim : WinType; (* aktuelle Fenstergroesse *)
- Tiefe : INTEGER;
- Keller: ARRAY[1..MaxWin] OF ^Screens;
- END;
- ScreenMode : BYTE ABSOLUTE $0040:$0049;
- MonoBuffer : ScrInhalt ABSOLUTE MonoScreen:$0000;
- ColorBuffer : ScrInhalt ABSOLUTE ColorScreen:$0000;
- Adapter : INTEGER ABSOLUTE $0040:$0063;
- VideoMode : BYTE ABSOLUTE $0040:$0065;
- VideoBuffer : INTEGER;
- (* ------------------------------------------------------ *)
- PROCEDURE Where_Cursor (VAR x, y: INTEGER);
-
- VAR Active_Page : BYTE ABSOLUTE $0040:$0062;
- (* Video Page Index *)
- Crt_Pages : ARRAY[0..7] OF
- INTEGER ABSOLUTE $0040:$0050 ;
- BEGIN
- x := Crt_Pages[active_page];
- (* absolute Cursor-Position *)
- y := Hi(x)+1; x := Lo(x)+1;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE Video (On: BOOLEAN);
- (* Video-Adapter aktivieren/deaktivieren *)
- BEGIN
- IF On THEN Port[Adapter+4] := (VideoMode OR VideoEnable)
- ELSE Port[Adapter+4] := (VideoMode - VideoEnable)
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE InitWindow;
- (* Bibliothek initialisieren. Wird von "MkWindow" einmal *)
- (* aufgerufen *)
- BEGIN
- IF ScreenMode = Monochrom THEN VideoBuffer := MonoScreen
- ELSE VideoBuffer := ColorScreen;
- WITH Win.Dim DO BEGIN
- x1 := 1; y1 := 1; x2 := 80; y2 := 25;
- END;
- Win.Tiefe := 0; WinInit := TRUE;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE WinFrame (x1, y1, x2, y2, Style, TxtColor,
- BckColor: INTEGER);
- (* Rahmen zeichnen *)
- VAR x, y, i, Ver,
- Hor, Elo, Ero, Elu, Eru: INTEGER;
-
- BEGIN
- IF ScreenMode = Monochrom THEN BEGIN
- TxtColor := 7; BckColor := 0;
- END;
- Window(x1, y1, x2, y2);
- TextColor(TxtColor) ;
- TextBackground(BckColor);
- IF Style=1 THEN BEGIN
- Ver := 196; Hor := 179;
- Elo := 218; Ero := 191; Elu := 192; Eru := 217; END
- ELSE BEGIN (* Ecken links/rechts/oben/unten: *)
- Ver := 205; Hor := 186;
- Elo := 201; Ero := 187; Elu := 200; Eru := 188;
- END;
- IF Style <> 0 THEN BEGIN
- GotoXY(1,1); Write(Chr(Elo));
- FOR i := 2 TO x2-x1 DO Write(Chr(Ver));
- Write(Chr(Ero));
- FOR i := 2 TO y2-y1 DO BEGIN
- GotoXY(1,i); Write(Chr(Hor));
- GotoXY(x2-x1+1,i); Write(Chr(Hor));
- END;
- GotoXY(1,y2-y1+1); Write(Chr(Elu));
- FOR i := 2 TO x2-x1 DO Write(Chr(Ver));
- Window(1,1,80,25); GotoXY(x2,y2); Write(Chr(Eru));
- Window(x1+1,y1+1,x2-1,y2-1);
- END;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE MkWindow (x1, y1, x2, y2, Style:INTEGER;
- TxtColor:BYTE;
- BckColor, BrdColor:INTEGER);
- (* neues Fenster erzeugen: x1,y1 Ecke links oben,
- x2,y2 Ecke rechts unten,
- Style Rahmenzeichen,
- BrdColor Fenster-Hintergrund *)
- VAR dummy: INTEGER;
- Regs : Regs8088_;
-
- BEGIN
- IF NOT WinInit THEN InitWindow;
- WITH Win DO Tiefe := Tiefe+1;
- IF Win.Tiefe > MaxWin THEN BEGIN
- WriteLn('FEHLER: Zuviele Fenster offen! '); Halt;
- END;
- Video(Off);
- WITH Win DO BEGIN
- New(Keller[Tiefe]);
- (* alten Bildinhalt auf Keller schieben *)
- IF ScreenMode = 7 THEN Keller[Tiefe]^.Bild := MonoBuffer
- ELSE Keller[Tiefe]^.Bild := ColorBuffer;
- Keller[Tiefe]^.Dim := Dim;
- (* Groesse u. Cursor auf Keller sichern *)
- Where_Cursor(Keller[Win.Tiefe]^.x,Keller[Win.Tiefe]^.y);
- Regs.AH:=3;
- Intr($10,Regs);
- Keller[Win.Tiefe]^.Shape:=Regs.CX;
- END ;
- Video(On) ;
- IF (x2 > 80) THEN BEGIN (* Koordinatenkorrekturen *)
- dummy := x2-80; x1 := x1-dummy; x2 := x2-dummy;
- END;
- IF (y2 > 25) THEN BEGIN
- dummy := y2-25; y1 := y1-dummy; y2 := y2-dummy;
- END;
- WinFrame(x1, y1, x2, y2, Style, TxtColor, BrdColor);
- GotoXY(1,1); TextColor(TxtColor);
- TextBackground(BckColor); ClrScr;
- Win.Dim.x1 := x1+1; Win.Dim.y1 := y1+1;
- Win.Dim.x2 := x2-1; Win.Dim.y2 := y2-1;
- END;
- (* ------------------------------------------------------ *)
- PROCEDURE RmWindow;
- (* oberstes Fenster entfernen *)
- VAR act_color: BYTE; x, y: INTEGER;
- Regs : Regs8088_;
-
- BEGIN
- Video(Off);
- WITH Win DO BEGIN
- (* alter Bildinhalt zurueck und Keller freigeben *)
- IF ScreenMode = 7 THEN
- MonoBuffer := Keller[Tiefe]^.Bild
- ELSE ColorBuffer := Keller[Tiefe]^.Bild;
- Dispose(Keller[Tiefe]);
- Video(On);
- (* altes Fenster u. Cursor-Position reaktiven: *)
- Dim := Keller[Tiefe]^.Dim;
- Window(Dim.x1,Dim.y1,Dim.x2,Dim.y2);
- Regs.AH := 2;
- Regs.BH := Mem[$40:$62];
- Regs.DL := Pred(Keller[Tiefe]^.x);
- Regs.DH := Pred(Keller[Tiefe]^.y);
- Intr($10, Regs);
- Regs.AH := 1;
- Regs.CX := Keller[Tiefe]^.Shape;
- Intr($10, Regs);
- Where_Cursor(x,y);
- act_color:= Mem[VideoBuffer:((x-1+(y-1)*80)*2)+1];
- TextColor(act_color AND $0F);
- TextBackground(act_color DIV 16);
- Tiefe := Tiefe-1;
- END ;
- END;
- (* ------------------------------------------------------ *)
- (* Ende von TSRWIND.PAS *)