home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TOOL_INC.ZIP / DISPLN.INC < prev    next >
Encoding:
Text File  |  1988-01-29  |  4.8 KB  |  215 lines

  1.  
  2. (*
  3.  * displn - utility library for fast string display
  4.  * Written by Samuel H. Smith, 7-Feb-86 (rev. 23-apr-87)
  5.  *
  6.  *)
  7.  
  8. const
  9.    low_attr:         integer = 7;
  10.    norm_attr:        integer = 15;
  11.    back_attr:        integer = 0;
  12.    default_disp_seg: integer = $B800;
  13.    slowdisplay:      boolean = false;
  14.  
  15. type
  16.    popup_string = string[255];
  17.  
  18.    screenloc =         record
  19.          character:          char;
  20.          attribute:          byte;
  21.    end;
  22.    videoram =          array [0..1999] of screenloc;
  23.    videoptr =          ^videoram;
  24.  
  25.    window_rec = record
  26.       x1,y1,x2,y2: integer;
  27.       attr:        byte;
  28.    end;
  29.  
  30.    registers =     record
  31.          ax, bx, cx, dx, bp, si, di, ds, es, flags:         integer;
  32.    end;
  33.  
  34. var
  35.    cur_window:   window_rec;
  36.    disp_mem:     videoptr;
  37.    disp_seg:     integer;
  38.  
  39.  
  40. procedure normvideo;
  41. begin
  42.    textcolor(norm_attr);
  43.    textbackground(back_attr);
  44.    cur_window.attr := norm_attr + back_attr shl 4;
  45. end;
  46.  
  47. procedure lowvideo;
  48. begin
  49.    textcolor(low_attr);
  50.    textbackground(back_attr);
  51.    cur_window.attr := low_attr + back_attr shl 4;
  52. end;
  53.  
  54. procedure old_window(x1,y1,x2,y2: integer);  {redefine the old window
  55.                                               command so it can still be
  56.                                               used by other procs}
  57. begin
  58.    window(x1,y1,x2,y2);
  59. end;
  60.  
  61. procedure window(a1,b1,a2,b2: integer);    {make a new version of window
  62.                                             that saves the current state}
  63. begin
  64.    with cur_window do
  65.    begin
  66.       x1 := a1; y1 := b1;
  67.       x2 := a2; y2 := b2;
  68.       old_window(x1,y1,x2,y2);
  69.    end;
  70. end;
  71.  
  72. function invisible: boolean;   {is this the invisible program under doubledos?}
  73. var
  74.    reg:  registers;
  75. begin
  76.    reg.ax := $e400;   {doubledos return program status}
  77.    msdos(reg);
  78.    invisible := (lo(reg.ax) = 2) or slowdisplay;
  79. end;
  80.  
  81.  
  82. procedure disp (s:                  popup_string);
  83.                                      {very fast dma string display}
  84. var
  85.    index:              integer;
  86.    i:                  integer;
  87.    c:                  char;
  88.    len:                integer;
  89.    max_index:          integer;
  90.  
  91. begin
  92.    len := ord(s[0]);     {length (s);}
  93.  
  94.    if invisible or (len < 4) then
  95.                      {can't do dma screens if invisble under doubledos.
  96.                       this is slower than write for short strings}
  97.    begin
  98.       write(s);
  99.       exit;
  100.    end;
  101.  
  102.    with cur_window do
  103.    begin
  104.       disp_mem := ptr(disp_seg,0);
  105.  
  106.       index :=(wherey + y1 - 2)* 80 +(wherex + x1 - 2);
  107.       max_index := y2*80;
  108.  
  109.       for i := 1 to len do
  110.       begin
  111.          c := s [i];
  112.  
  113.          case c of
  114.             ^H:   index := index - 1;
  115.  
  116.             ^J:   begin
  117.                      index := index + 80;
  118.                      if index >= max_index then
  119.                      begin
  120.                         write(^J);
  121.                         index := index - 80;
  122.                      end;
  123.                   end;
  124.  
  125.             ^M:   index := (index div 80)* 80 + x1 - 1;
  126.  
  127.             ^G:   write(^G);
  128.  
  129.             else  begin
  130.                      with disp_mem^[index] do
  131.                      begin
  132.                         character := c;
  133.                         attribute := attr;
  134.                      end;
  135.  
  136.                      index := succ(index);
  137.  
  138.                      if index >= max_index then
  139.                      begin
  140.                         index := index - 80;
  141.                         writeln;
  142.                      end;
  143.                   end;
  144.          end;
  145.       end;
  146.  
  147.  
  148. (* place cursor at end of displayed string *)
  149.  
  150.       gotoxy((index mod 80)- x1 + 2,(index div 80)- y1 + 2);
  151.    end;
  152. end;
  153.  
  154. procedure displn(s: popup_string);       {fast display and linefeed}
  155. begin
  156.    disp(s);
  157.    writeln;
  158. end;
  159.  
  160. procedure init_disp;     {call once before anything else in this library}
  161. begin
  162.    disp_seg := default_disp_seg;   {this needs to check for mono}
  163.    window(1,1,80,25);
  164.    normvideo;
  165. end;
  166.  
  167. (***** demo main program - delete when this is used as a library ***)
  168.  
  169. var
  170.    i: integer;
  171.  
  172. begin
  173.    clrscr;
  174.    for i := 1 to 24 do
  175.    begin
  176.       gotoxy(1,i);
  177.       write(i:2);
  178.       write('--Testing slow string display calls');
  179.    end;
  180.  
  181.    window(40,5,80,20);
  182.    for i := 1 to 14 do
  183.    begin
  184.       gotoxy(1,i);
  185.       write(i:2);
  186.       write('--Testing slow string display calls');
  187.    end;
  188.  
  189.    window(1,1,80,25);
  190.    delay(1000);
  191.  
  192.    init_disp;
  193.    clrscr;
  194.  
  195.    for i := 1 to 24 do
  196.    begin
  197.       gotoxy(1,i);
  198.       write(i:2);
  199.       disp('--Testing fast string display calls');
  200.    end;
  201.  
  202.    window(40,5,80,20);
  203.    for i := 1 to 14 do
  204.    begin
  205.       gotoxy(1,i);
  206.       write(i:2);
  207.       disp('--Testing fast string display calls');
  208.    end;
  209.  
  210.    window(1,1,80,25);
  211.    gotoxy(1,24);
  212. end.
  213.  
  214.  
  215.