home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------------------------- *)
- (* TSRWIND.PAS *)
- (* 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 (* gespeicherte Bildschirminformation: *)
- Bild: ScrInhalt; (* Bildschirminhalt *)
- Dim : WinType; (* Fenstergroesse *)
- x, y: INTEGER; (* Cursor-Position *)
- 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);
- BEGIN
- IF On THEN Port[Adapter+4] := (VideoMode OR VideoEnable)
- ELSE Port[Adapter+4] := (VideoMode - VideoEnable)
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE InitWindow;
- 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);
- 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) ; (* Style = 0 ==> kein Rahmen *)
- TextBackground(BckColor); (* Style = 1 ==> einfache Linie *)
- IF Style=1 THEN (* Style = 2 ==> doppelte Linie *)
- BEGIN
- Ver := 196; Hor := 179; (* Ecken links/rechts/oben/unten: *)
- Elo := 218; Ero := 191; Elu := 192; Eru := 217;
- END
- ELSE
- BEGIN
- 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(x1+1,y1+1,x2-1,y2-1); Write(Chr(Eru));
- END;
- END;
- (* ----------------------------------------------------------------------- *)
- PROCEDURE MkWindow (x1, y1, x2, y2, Style:INTEGER;
- TxtColor:BYTE; BckColor, BrdColor:INTEGER);
- VAR dummy: INTEGER;
- BEGIN
- IF NOT WinInit THEN InitWindow;
- WITH Win DO Tiefe := Tiefe+1;
- IF Win.Tiefe > MaxWin THEN (* zuviel Fenster! Programm abbrechen *)
- 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 *)
- Keller[Win.Tiefe]^.x := wherex;
- Keller[Win.Tiefe]^.y := wherey;
- END ;
- Video(On) ;
- IF (x2 > 80) THEN (* Koordinatenkorrekturen *)
- BEGIN 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;
- VAR act_color: BYTE; x, y: INTEGER;
- 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);
- GotoXY(Keller[Tiefe]^.x,Keller[Tiefe]^.y);
- 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;
- (* ----------------------------------------------------------------------- *)