home *** CD-ROM | disk | FTP | other *** search
- Const
- Bell = #07;
- Color_Screen_Address = $B800;
- Mono_Screen_Address = $B000;
- Screen_Length = 4000;
- Type
- String40 = String[40];
- Screen_Type = Array[ 1 .. Screen_Length ] Of Byte;
- Screen_Ptr = ^Screen_Image_Type;
- Screen_Image_Type = Record
- Screen_Image: Screen_Type;
- End;
- Saved_Screen_Ptr = ^Saved_Screen_Type;
- Saved_Screen_Type = Record
- Screen_Image : Screen_Type;
- Screen_Row : Integer;
- Screen_Column : Integer;
- Screen_X1 : Integer;
- Screen_Y1 : Integer;
- Screen_X2 : Integer;
- Screen_Y2 : Integer;
- End;
- Var
- Actual_Screen : Screen_Ptr;
- Saved_Screen : Saved_Screen_Ptr;
- UpperLeft_Column, UpperLeft_Row, LowerRight_Column,
- LowerRight_Row : Integer;
- (*----------------------------------------------------------------------*)
- Procedure Get_Screen_Address;
- Var
- Regs : Record (* 8088 registers *)
- Ax, Bx, Cx, Dx, Bp, Si, Di, Ds, Es, Flags : Integer
- End;
- Begin (* Get_Screen_Address *)
- Regs.Ax := 15 SHL 8;
- INTR( $10 , Regs );
- If ( Regs.Ax AND $FF ) <> 7 Then
- Actual_Screen := PTR( Color_Screen_Address , 0 )
- Else
- Actual_Screen := PTR( Mono_Screen_Address , 0 );
- UpperLeft_Column := 1;
- UpperLeft_Row := 1;
- LowerRight_Column := 80;
- LowerRight_Row := 25;
- End (* Get_Screen_Address *);
- (*----------------------------------------------------------------------*)
- Procedure Save_Screen( Var Saved_Screen_Pointer : Saved_Screen_Ptr );
- Begin (* Save_Screen *)
- New( Saved_Screen_Pointer );
- With Saved_Screen_Pointer^ Do
- Begin
- Screen_X1 := UpperLeft_Column;
- Screen_Y1 := UpperLeft_Row;
- Screen_X2 := LowerRight_Column;
- Screen_Y2 := LowerRight_Row;
- Screen_Row := WhereY;
- Screen_Column := WhereX;
- Move( Actual_Screen^.Screen_Image, Screen_Image, Screen_Length );
- End;
- End (* Save_Screen *);
- (*----------------------------------------------------------------------*)
- Procedure Restore_Screen( Var Saved_Screen_Pointer : Saved_Screen_Ptr );
- Begin (* Restore_Screen *)
- With Saved_Screen_Pointer^ Do
- Begin
- Window( Screen_X1, Screen_Y1, Screen_X2, Screen_Y2 );
- Move( Screen_Image, Actual_Screen^.Screen_Image, Screen_Length );
- GoToXY( Screen_Column, Screen_Row );
- End;
- Dispose( Saved_Screen_Pointer );
- End (* Restore_Screen *);
- (*----------------------------------------------------------------------*)
- Procedure Draw_Menu_Frame( UpperLeftX, UpperLeftY,
- LowerRightX, LowerRightY : Integer;
- Frame_Color, Text_Color : Integer;
- Menu_Title: String40 );
- Var
- I,L,LT : Integer;
- Title_Offset : Integer;
- Begin (* Draw_Menu_Frame *)
- If UpperLeftX < 2 then UpperLeftX := 2;
- If UpperLeftY < 2 then UpperLeftY := 2;
- If LowerRightX > 79 then LowerRightX := 79;
- If LowerRightY > 24 then LowerRightY := 24;
- Window( UpperLeftX-1, UpperLeftY-1, LowerRightX+1, LowerRightY+1 );
- Clrscr; Window(1,1,80,25);
- GoToXY( UpperLeftX, UpperLeftY );
- L := LowerRightX - UpperLeftX;
- LT := LENGTH( Menu_Title );
- If LT > ( L - 5 ) Then Menu_Title[0] := CHR( L - 5 );
- TextColor( Frame_Color );
- Write('╒');
- For I := ( UpperLeftX + 1 ) To ( LowerRightX - 1 ) Do Write('═');
- Write('╕');
- If LT > 0 Then Begin
- Title_Offset := ((LowerRightX-UpperLeftX-LT-4) div 2) + 1;
- GoToXY( UpperLeftX+Title_Offset, UpperLeftY);
- Write('[ ',Menu_Title,' ]'); End;
- For I := UpperLeftY+1 To LowerRightY-1 Do
- Begin
- GoToXY( UpperLeftX , I ); Write( '│' );
- GoToXY( LowerRightX , I ); Write( '│' );
- End;
- GoToXY( UpperLeftX, LowerRightY );
- Write( '╘' );
- For I := UpperLeftX+1 To LowerRightX-1 Do Write( '═' );
- Write( '╛' );
- Window( UpperLeftX+1, UpperLeftY+1, LowerRightX-1, LowerRightY-1 );
- UpperLeft_Column := UpperLeftX+1;
- UpperLeft_Row := UpperLeftY+1;
- LowerRight_Column := LowerRightX-1;
- LowerRight_Row := LowerRightY-1;
- Clrscr;
- TextColor( Text_Color );
- End;