home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / utils / dskutl / swp-ms10.ark / WINDOW.UNT < prev   
Text File  |  1989-09-27  |  5KB  |  162 lines

  1. {.L-}  { Disable listing by program LISTT }
  2. {*
  3.  * --------------------------------------------------------------------
  4.  *                      W I N D O W   U N I T
  5.  * --------------------------------------------------------------------
  6.  *
  7.  * In this 'unit' a console output filter is incorporated which implements
  8.  * a very simple window mechanism.  A window consists of a number of
  9.  * contiguous lines on the screen which are allowed to scroll.  The lines
  10.  * above the window as well as the lines below the window will not scroll.
  11.  *
  12.  *               I N T E R F A C E   S E C T I O N
  13.  *}
  14.  
  15. {*
  16.  * Uses CONSOLE.UNT
  17.  *}
  18.  
  19. {
  20.    procedure DisableWindow ;
  21.    procedure EnableWindow ;
  22.    procedure InitWindowUnit ;
  23.    procedure SetWindow( TopLine, BottomLine : Integer ) ;
  24. }
  25.  
  26. {*
  27.  *         I M P L E M E N T A T I O N   S E C T I O N
  28.  *}
  29. const
  30. {*
  31.  * The constant WrapAround should reflect the behaviour of the console device.
  32.  * A 'true' value should be specified if an Cr/Lf is inserted after the right-
  33.  * most character on a line is written. A 'false' value should be specified if
  34.  * the cursor stays at the rightmost position, even after writing additional
  35.  * printable characters.
  36.  *}
  37.    WrapAround = True ;  { Wrap to next line if at end of line }
  38.  
  39. var
  40.    WindowEnabled   : Boolean ;  { Scroll only window region }
  41.    WindowTopLine   : Integer ;  { Ordinal of top line of window }
  42.    WindowBottomLine: Integer ;  { Ordinal of bottom line of window }
  43.    WindowConOutPtr : Integer ;  { Original value of ConOutPtr }
  44.  
  45. procedure DisableWindow ;
  46. begin
  47.    WindowEnabled:= False ;
  48. end ;  { of DisableWindow }
  49.  
  50. procedure EnableWindow ;
  51. begin
  52.    WindowEnabled:= True ;
  53. end ;  { of EnableWindow }
  54.  
  55. procedure SetWindow( TopLine, BottomLine: Integer ) ;
  56. {*
  57.  * Define the window.  The ordinal of the top line and the ordinal of the
  58.  * bottom line together define the region which should scroll.  The line
  59.  * ordinals are forced to be in the range [1..GetMaxY].  Moreover, the
  60.  * size of the window will be at least two lines.
  61.  *}
  62.  
  63.  function Min( I, J: Integer ) : Integer ;
  64.  begin
  65.     if I<J then  Min:= I
  66.            else  Min:= J ;
  67.  end ;  { of Min }
  68.  
  69.  function Max( I, J: Integer ) : Integer ;
  70.  begin
  71.     if I<J then  Max:= J
  72.            else  Max:= I ;
  73.  end ;  { of Max }
  74.  
  75. begin
  76.    TopLine   := Min( Max(TopLine   , 1), Pred(GetMaxY) ) ;
  77.    BottomLine:= Min( Max(BottomLine, 2),      GetMaxY  ) ;
  78.    WindowTopLine   := Min( TopLine, Pred(BottomLine) ) ;
  79.    WindowBottomLine:= Max( Succ(TopLine), BottomLine ) ;
  80. end ;  { of SetWindow }
  81.  
  82. procedure WindowConOut( Ch : Char ) ;
  83. {*
  84.  * WindowConOut - Write one character to the console device through a
  85.  *                filter, which implements a simple window mechanism.
  86.  *
  87.  * Turbo Pascal 3.00A contains a bug in this area.  The argument for the
  88.  * console output routine is pushed onto the stack, WITHOUT CLEARING THE
  89.  * UPPER BYTE.  If range checks are actived, argument Ch might be out of
  90.  * the range [$00,$FF], resulting in run-time error 91.
  91.  *}
  92. const
  93.    LineFeed      = ^J ;  { Line feed character code }
  94.    CarriageReturn= ^M ;  { Carriage return character code }
  95.    ConOutFunction=  3 ;  { BIOS console output function code }
  96.  
  97.  procedure ScrollWindow ;
  98.  {*
  99.   * Scroll the 'window' by deleting the top line of the window and inserting
  100.   * a blank line at the bottom of the window.  The cursor position remains
  101.   * at the same position in the TEXT.
  102.   *
  103.   * CAUTION : The procedures GotoXY, DelLine and InsLine generate output,
  104.   *           which should not pass through this filter!
  105.   *}
  106.  var
  107.     XPos: Integer ;  { Current cursor position, X coordinate }
  108.     YPos: Integer ;  { Current cursor position, Y coordinate }
  109.  begin
  110.  {*
  111.   * Save the current cursor position and de-install the window filter.
  112.   *}
  113.     XPos:= WhereX ;
  114.     YPos:= WhereY ;
  115.     ConOutPtr:= WindowConOutPtr ;
  116.  {*
  117.   * Scroll the lines within the window one line up.
  118.   *}
  119.     if WindowTopLine   >      1 then
  120.      begin
  121.       GotoXY( 1, WindowTopLine    ) ;
  122.       DelLine ;
  123.      end ;  { of if }
  124.     if WindowBottomLine<GetMaxY then
  125.      begin
  126.       GotoXY( 1, WindowBottomLine ) ;
  127.       InsLine ;
  128.      end ;  { of if }
  129.  {*
  130.   * Restore the cursor position as well as the window filter.
  131.   *}
  132.     GotoXY( XPos, Pred(YPos) ) ;
  133.     ConOutPtr:= Addr( WindowConOut ) ;
  134.  end ;  { of ScrollWindow }
  135.  
  136. begin
  137.    if WindowEnabled then
  138.      if WhereY=WindowBottomLine then
  139.        if Ch=LineFeed then
  140.          ScrollWindow
  141.        else
  142.          if WrapAround then
  143.            if WhereX=GetMaxX then
  144.              if Ch<>CarriageReturn then
  145.                ScrollWindow ;
  146.  
  147.    Bios( ConOutFunction, Ord(Ch) ) ;
  148. end ;  { of MoreConOut }
  149.  
  150. procedure InitWindowUnit ;
  151. {*
  152.  * Preset the global variables and install the output filter.
  153.  *}
  154. begin
  155.   WindowEnabled   := False ;                 { Set filter state }
  156.   WindowTopLine   := 1 ;                     { Set window to be the .. }
  157.   WindowBottomLine:= GetMaxY ;               {   whole screen }
  158.   WindowConOutPtr := ConOutPtr ;             { Save ptr to original 'filter' }
  159.   ConOutPtr       := Addr( WindowConOut ) ;  { Install output filter }
  160. end ;  { of InitMoreUnit }
  161. {.L+}
  162.