home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / bix / display.sys < prev    next >
Text File  |  1986-08-04  |  19KB  |  583 lines

  1. (****************************************************************************)
  2. (*                                                                          *)
  3. (*                         DISPLAY.SYS                                      *)
  4. (*                  NON-GRAPHIC WINDOWING UTILITIES                         *)
  5. (*                                                                          *)
  6. (*        These subroutines use ROM-BIOS calls to perform                   *)
  7. (*        various video display options.  The leftover memory in the        *)
  8. (*        Video Display Area is used to its full advantage.                 *)
  9. (*        A stack of display screens is established and may be accessed     *)
  10. (*        by reference to absolute page number or with Pops and Pushes.     *)
  11. (*        Different Windows may be specified for each screen.               *)
  12. (*        This module includes:                                             *)
  13. (*                                                                          *)
  14. (*  GetMachineType        -F-  Returns String describing Machine Type.      *)
  15. (*  GetDisplayType        -F-  Returns String describing type of Display.   *)
  16. (*  SetCursorPosition     -P-  Display Primitive.                           *)
  17. (*  ReadCursorPostion     -P-  Display Primitive.                           *)
  18. (*  SetActiveDisplayPage  -P-  Display Primitive.                           *)
  19. (*  ScrollWindowUp        -P-  Display Primitive.                           *)
  20. (*  ScrollWindowDown      -P-  Display Primitive.                           *)
  21. (*  WriteCharacterandAttribute -P- Display Primitive.                       *)
  22. (*  WriteCharacter        -P-  Display Primitive.                           *)
  23. (*  CursorUp              -P-  Display Primitive.                           *)
  24. (*  CursorDown            -P-  Display Primitive.                           *)
  25. (*  CursorLeft            -P-  Display Primitive.                           *)
  26. (*  CursorRight           -P-  Display Primitive.                           *)
  27. (*  BackSpace             -P-  Display Primitive.                           *)
  28. (*  WriteChar             -P-  Substituted for Standard ConOut Procedure.   *)
  29. (*  WriteAbs              -P-  Overrides Carriage Return at EOL.            *)
  30. (*  GotoXY                -P-  Sets Cursor Position on Default Page.        *)
  31. (*  GotoXYAbs             -P-  Overrides Current Window Settings.           *)
  32. (*  WhereX                -F-  Returns X cursor position relative to window.*)
  33. (*  WhereY                -F-  Returns Y cursor position relative to window.*)
  34. (*  PageCursorHome        -P-  Homes cursor on selected page.               *)
  35. (*  Window                -P-  Selects window coordinates on default page.  *)
  36. (*  ClrScr                -P-  Clears the default page.                     *)
  37. (*  DisplayLine           -P-  Display Primitive.                           *)
  38. (*  ClrEOL                -P-  Clears to EOL on default page.               *)
  39. (*  SelectPage            -P-  Sets default Screen Page.                    *)
  40. (*  ClearPage             -P-  Resets All Parameters for selected page.     *)
  41. (*  DisplayInit           -P-  ClearPage on all screens in display stack.   *)
  42. (*  DisplayAllocate       -P-  Allocates RAM screen Page.                   *)
  43. (*  DisplayDispose        -P-  DISPOSES RAM already allocated for screen.   *)
  44. (*  StackInit             -P-  Initializes RAM screen stack.                *)
  45. (*  WindowInit            -P-  Initializes Program for All Display Functions*)
  46. (*  WindowExit            -P-  Restores original screen settings.           *)
  47. (*  CopyDisplay           -P-  Copies from one stack position to another.   *)
  48. (*  DisplayHome           -P-  Homes cursor on default page.                *)
  49. (*  DisplayEnd            -P-  Positions cursor at bottom-right of window.  *)
  50. (*  DisplayPush           -P-  Pushes selected screen onto stack.           *)
  51. (*  DisplayPop            -P-  Pops previously PUSHED screen from stack.    *)
  52. (*  SaveScreen            -P-  Saves Screen Contents upon entry to program. *)
  53. (*  RestoreScreen         -P-  Restores data from last SaveScreen.          *)
  54. (*                                                                          *)
  55. (*                                                                          *)
  56. (*    REQUIRES:   DISPDEF.SYS                                               *)
  57. (*                BIOS.SYS                                                  *)
  58. (*                PBIOS.SYS                                                 *)
  59. (*                                                                          *)
  60. (*                                                                          *)
  61. (*          written by:   John Leonard      10/30/1986                      *)
  62. (*                                          12/31/1986                      *)
  63. (*                                           1/02/1986                      *)
  64. (*                                           1/07/1986                      *)
  65. (*                                           4/06/1986                      *)
  66. (*                                           4/17/1986                      *)
  67. (*                                                                          *)
  68. (*     NOT FOR SALE WITHOUT WRITTEN PERMISSION                              *)
  69. (****************************************************************************)
  70.  
  71.  
  72. function GetMachineType : window_string;
  73.    begin
  74.      case mem[$f000:$fffe] of
  75.           $ff : getmachinetype := 'IBM-PC';
  76.           $fe : getmachinetype := 'IBM-XT';
  77.           $fd : getmachinetype := 'PC-JR';
  78.           $fc : getmachinetype := 'IBM-AT';
  79.           $2D : getmachinetype := 'Compaq';
  80.           $9a : getmachinetype := 'Compaq+';
  81.      else       getmachinetype := 'Unknown';
  82.      end; { case mem[$f000:$feee] of }
  83.    end;
  84.  
  85.  
  86. function GetDisplayType : window_string;
  87.    var regs : Bios_Record;
  88.        machinetype : Window_String;
  89.    begin
  90.     machinetype := getmachinetype;
  91.      if machinetype = 'PC-JR' then
  92.         getdisplaytype := machinetype
  93.      else begin
  94.         regs.ah := $12;regs.bh := 3;regs.bl := $10;intr($10,regs);
  95.         if regs.bh < 2 then getdisplaytype := 'EGA'
  96.         else begin
  97.              regs.ah := $0f;intr($10,regs);
  98.              if regs.al = 7 then getdisplaytype := 'Mono'
  99.              else if regs.al < 7 then getdisplaytype := 'CGA'
  100.              else getdisplaytype := 'Unknown';
  101.         end;
  102.      end;
  103.    end;
  104.  
  105.  
  106. procedure SetCursorPosition( page,row,column : integer);
  107.    begin
  108.       if ( page in [0..hardwaretop] ) then begin
  109.          bsetcursorposition( page,row,column);
  110.          wsetcursorposition( page,row,column);
  111.          end
  112.       else
  113.          wsetcursorposition( page,row,column);
  114.    end;
  115.  
  116.  
  117. procedure ReadCursorPosition( page:integer;
  118.              var row,column,s1,s2 : integer);
  119.    begin
  120.       if ( page in [0..hardwaretop] ) then begin
  121.             breadcursorposition( page,row,column,s1,s2);
  122.             wsetcursorposition( page,row,column);
  123.          end
  124.       else
  125.          wreadcursorposition( page,row,column,s1,s2);
  126.    end;
  127.  
  128.  
  129. procedure SetActiveDisplaypage ( i:integer);
  130.    begin
  131.       if not ( i in [0..maxdisplaystack]) then exit;
  132.       if ( i in [0..hardwaretop] )then begin
  133.          bsetactivedisplaypage(i);
  134.          wsetactivedisplaypage(i);
  135.          end
  136.       else
  137.          wsetactivedisplaypage(i);
  138.    end;
  139.  
  140.  
  141. procedure ScrollWindowUp ( lines,xfiller,y1,x1,y2,x2 : integer );
  142.    begin
  143.       with currentscreendata do begin
  144.          if ( page in [0..hardwaretop]) then
  145.             bscrollwindowup( lines,xfiller,y1,x1,y2,x2)
  146.          else
  147.             wscrollwindowup( lines,xfiller,y1,x1,y2,x2);
  148.       end;
  149.    end;
  150.  
  151.  
  152. procedure ScrollWindowDown ( lines,xfiller,y1,x1,y2,x2 : integer );
  153.    begin
  154.       with currentscreendata do begin
  155.          if ( page in [0..hardwaretop]) then
  156.             bscrollwindowdown( lines,xfiller,y1,x1,y2,x2)
  157.          else
  158.             wscrollwindowdown( lines,xfiller,y1,x1,y2,x2);
  159.       end;
  160.    end;
  161.  
  162.  
  163. procedure WriteCharacterandAttribute ( character,page,attribute,num:integer);
  164.    begin
  165.       if ( page in [0..hardwaretop]) then
  166.          bwritecharacterandattribute( character,page,attribute,num)
  167.       else
  168.          wwritecharacterandattribute( character,page,attribute,num);
  169.    end;
  170.  
  171.  
  172. procedure WriteCharacter( character,page,num: integer);
  173.    begin
  174.       if ( page in [0..hardwaretop]) then
  175.          bwritecharacter( character,page,num)
  176.       else
  177.          wwritecharacter( character,page,num);
  178.    end;
  179.  
  180.  
  181. procedure CursorUp;
  182.    var row,column,s1,s2:integer;
  183.    begin
  184.       with currentscreendata do with windowloc[page] do begin
  185.          readcursorposition(page,row,column,s1,s2);
  186.          if row > y1 then
  187.             row := row - 1
  188.          else
  189.             scrollwindowdown(1,DefaultFiller,y1,x1,y2,x2);
  190.          setcursorposition(page,row,column);
  191.       end;
  192.    end;
  193.  
  194.  
  195. procedure CursorDown;
  196.    var row,column,s1,s2 : integer;
  197.    begin
  198.       with currentscreendata do with windowloc[page] do begin
  199.          readcursorposition(page,row,column,s1,s2);
  200.          if row < y2 then
  201.             row := row + 1
  202.          else
  203.             scrollwindowup(1,defaultFiller,y1,x1,y2,x2);
  204.          setcursorposition(page,row,column);
  205.       end;
  206.    end;
  207.  
  208.  
  209. procedure CursorLeft;
  210.    var row,column,s1,s2:integer;
  211.    begin
  212.       with CurrentScreenData do with windowloc[page] do begin
  213.          readcursorposition(page,row,column,s1,s2);
  214.          if column > x1 then
  215.             column := column - 1
  216.          else begin
  217.             column := x2;
  218.             if row > y1 then
  219.                row := row - 1
  220.             else scrollwindowdown(1,DefaultFiller,y1,x1,y2,x2);
  221.          end;
  222.          setcursorposition(page,row,column);
  223.       end;
  224.    end;
  225.  
  226.  
  227. procedure CursorRight;
  228.    var row,column,s1,s2:integer;
  229.    begin
  230.       with CurrentScreenData do with windowloc[page] do begin
  231.          readcursorposition(page,row,column,s1,s2);
  232.          if column < x2 then
  233.             column := column + 1
  234.          else begin
  235.             column := x1;
  236.             if row < y2 then
  237.                row := row + 1
  238.             else scrollwindowup(1,defaultfiller,y1,x1,y2,x2);
  239.          end;
  240.          setcursorposition(page,row,column);
  241.       end;
  242.    end;
  243.  
  244.  
  245. procedure BackSpace;
  246.    begin
  247.       cursorleft;
  248.       with currentscreendata do with windowloc[page] do
  249.          writecharacterandattribute(defaultfiller,page,defaultattribute,1);
  250.    end;
  251.  
  252.  
  253. procedure WriteChar( ch: char);
  254.    var
  255.       row,column,s1,s2 : integer;
  256.    begin
  257.       with CurrentScreenData do begin
  258.          ReadCursorPosition(page,row,column,s1,s2);
  259.          with windowloc[page] do
  260.             case ch of
  261.               #8    : backspace;
  262.               #10   : cursordown;
  263.               #13   : begin
  264.                          column := x1;
  265.                          SetCursorPosition(page,row,column);
  266.                       end;
  267.             else begin
  268.                 WriteCharacterAndAttribute(ord(ch),page,attribute,1);
  269.                 cursorright;
  270.             end;
  271.          end;
  272.       end;
  273.    end;
  274.  
  275.  
  276. procedure WriteAbs( ch: char);
  277.    var
  278.       row,offs,column,s1,s2 : integer;
  279.    begin
  280.       with CurrentScreenData do begin
  281.          ReadCursorPosition(page,row,column,s1,s2);
  282.          case ch of
  283.             #8   : exit;
  284.             #10  : exit;
  285.             #13  : exit;
  286.             ^G   : begin
  287.                      sound(1000);delay(200);nosound;
  288.                    end;
  289.             else begin
  290.                WriteCharacterAndAttribute(ord(ch),page,attribute,1);
  291.                if column< DefaultWidth then column := column + 1;
  292.                setcursorposition(page,row,column);
  293.             end;
  294.          end;
  295.       end;
  296.    end;
  297.  
  298.  
  299. procedure GotoXY(x,y:integer);
  300.    begin
  301.       with currentscreendata do with windowloc[page] do
  302.          SetCursorPosition(page,y+y1-1,x+x1-1)
  303.    end;
  304.  
  305.  
  306. procedure GotoXYAbs(x,y:integer);
  307.    begin
  308.       with CurrentScreenData do with windowloc[page] do
  309.          SetCursorPosition(page,y-1,x-1);
  310.    end;
  311.  
  312.  
  313. function wherex : integer;
  314.    var page,row,column,s1,s2:integer;
  315.    begin
  316.       with currentscreendata do with windowloc[page] do begin
  317.          readcursorposition(page,row,column,s1,s2);
  318.          wherex := column - x1 + 1;
  319.       end;
  320.    end;
  321.  
  322.  
  323. function wherey : integer;
  324.    var row,column,s1,s2 : integer;
  325.    begin
  326.       with currentscreendata do with windowloc[page] do begin
  327.          readcursorposition(page,row,column,s1,s2);
  328.          wherey := row - y1 + 1;
  329.       end;
  330.    end;
  331.  
  332.  
  333. procedure PageCursorHome(i:integer);
  334.    begin
  335.       with CurrentScreenData do with windowloc[i] do
  336.             SetCursorPosition(page,y1,x1);
  337.    end;
  338.  
  339.  
  340. procedure Window( ix1,iy1,ix2,iy2 : integer );
  341.    begin
  342.       with CurrentScreenData do with windowloc[page] do begin
  343.          x1:=ix1-1;y1:=iy1-1;x2:=ix2-1;y2:=iy2-1;
  344.          pagecursorhome(page);
  345.       end;
  346.    end;
  347.  
  348.  
  349. procedure ClrScr;
  350.    var i,j:integer;
  351.    begin
  352.       with CurrentScreenData do with windowloc[page] do begin
  353.          scrollwindowup(0,attribute,y1,x1,y2,x2);
  354.          pagecursorhome(page);
  355.       end;
  356.    end;
  357.  
  358. procedure DisplayLine( page,y,x,attribute,len,begchar,midchar,endchar:Integer;
  359.                 vertical : boolean );
  360.    var i,j:integer;
  361.    begin
  362.       setcursorposition(page,y,x);
  363.       writecharacterandattribute(begchar,page,attribute,1);
  364.       if vertical then begin
  365.          for i := y+1 to (y+len-2) do begin
  366.             setcursorposition(page,i,x);
  367.             writecharacterandattribute(midchar,page,attribute,1);
  368.          end;
  369.          setcursorposition(page,y+len-1,x);
  370.          writecharacterandattribute(endchar,page,attribute,1);
  371.          end
  372.       else begin
  373.          setcursorposition(page,y,x+1);
  374.          writecharacterandattribute(midchar,page,attribute,len-2);
  375.          setcursorposition(page,y,x+len-1);
  376.          writecharacterandattribute(endchar,page,attribute,1);
  377.       end;
  378.    end;
  379.  
  380.  
  381. procedure clreol;
  382.    const vert:boolean=false;
  383.    var oldx,oldy:integer;
  384.    begin
  385.       oldx := wherex;oldy:=wherey;
  386.       with currentscreendata do with windowloc[page] do
  387.       DisplayLine(page,wherey-1,wherex-1,attribute,x2-wherex-1,
  388.          filler,filler,filler,vert);
  389.       gotoxy(oldx,oldy);
  390.    end;
  391.  
  392.  
  393.  
  394. procedure selectpage(i: integer); forward;
  395.  
  396.  
  397. procedure ClearPage( I : integer );
  398.    var oldpage : integer;
  399.    begin
  400.       oldpage := CurrentScreenData.page;
  401.       selectpage( I );
  402.       with currentscreendata do with windowloc[i] do begin
  403.          framed := false;
  404.          hlen := 0;flen:=0;
  405.          xloc := 1;yloc:=1;
  406.       end;
  407.       window(1,1,80,25);clrscr;
  408.       selectpage( oldpage );
  409.    end;
  410.  
  411.  
  412. procedure DisplayInit;
  413.    var i:integer;
  414.    begin
  415.       with CurrentScreenData do begin
  416.          attribute := DefaultAttribute;
  417.          filler    := DefaultFiller;
  418.       end;
  419.       if ( hardwaretop >= 1 ) then
  420.          for i := 1 to hardwaretop do clearpage(i);
  421.    end;
  422.  
  423.  
  424. procedure DisplayAllocate( var pointer: mono_screen_pointer);
  425.    var test : ^integer;
  426.    begin
  427.       new(pointer);
  428.       while ofs(pointer^) <> 0 do begin
  429.          dispose(pointer);
  430.          new(test);
  431.          new(pointer);
  432.       end;
  433.       fillchar(pointer^,sizeof(pointer^),defaultfiller);
  434.    end;
  435.  
  436.  
  437. procedure DisplayDispose( var pointer : mono_screen_pointer);
  438.    begin
  439.       dispose(pointer);
  440.       pointer := nil;
  441.    end;
  442.  
  443.  
  444. procedure SelectPage;
  445.    begin
  446.       if ( i in [0..MaxDisplayStack]) then
  447.          if not ( i in [0..hardwaretop]) then
  448.             if displaystack[i] = nil then begin
  449.                displayallocate(displaystack[i]);
  450.                clearpage(i);
  451.             end;
  452.           setactivedisplaypage(i);
  453.    end;
  454.  
  455.  
  456. procedure StackInit;
  457.    var i:integer;
  458.       ch: char;
  459.    begin
  460.       with CurrentScreenData do
  461.          for i := 0 to hardwaretop do
  462.             DisplayStack[i] := addr(mem[hardb:(defaultregensize*i)]);
  463.       for i := hardwaretop+1 to MaxDisplayStack do
  464.          DisplayStack[i] := nil;
  465.    end;
  466.  
  467.  
  468. procedure WindowInit;
  469.    begin
  470.       with InitialScreenData do begin
  471.          mtype := GetMachineType;
  472.          stype := GetDisplayType;
  473.          regen := memw[$0000:$044C];
  474.          conout:= conoutptr;
  475.          if (stype='Mono') then
  476.          hardb := $B000 else hardb := $B800;
  477.          readcursorposition(0,y,x,s1,s2);
  478.       end;
  479.       memw[$0000:$044C] := DefaultRegenSize;
  480.       conoutptr        := ofs(writechar);
  481.       with CurrentScreenData do begin
  482.          regen  := DefaultRegenSize;
  483.          hardb  := InitialScreenData.hardb;
  484.          filler := DefaultFiller;
  485.          s1     := InitialScreenData.s1;
  486.          s2     := InitialScreenData.s2;
  487.          attribute := DefaultAttribute;
  488.          with windowloc[0] do begin
  489.             xloc:=initialscreendata.x;
  490.             yloc:=initialscreendata.y;
  491.             framed:=false;
  492.             x1:=0;y1:=0;x2:=79;y2:=24;
  493.             hlen:=0;flen:=0;
  494.          end;
  495.       end;
  496.       DisplayInit;
  497.       StackInit;
  498.       Selectpage(0);
  499.       window(1,1,80,25);
  500.    end;
  501.  
  502.  
  503.  
  504. procedure WindowExit;
  505.    var i:integer;
  506.    begin
  507.       setactivedisplaypage(0);
  508.       with InitialScreenData do begin
  509.          memw[$0000:$044C] := regen;
  510.          conoutptr         := conout;
  511.          setcursorposition(0,y,x);
  512.          setcursorsize(s1,s2);
  513.       end;
  514.       for i := hardwaretop+1 to MaxDisplayStack do
  515.          if DisplayStack[i] <> nil then begin
  516.             DisplayDispose(DisplayStack[i]);
  517.          end;
  518.    end;
  519.  
  520.  
  521.  
  522. procedure CopyDisplay( from,tu:integer);
  523.    var row,column,s1,s2:integer;
  524.    begin
  525.      if( not (from in [0..MaxDisplayStack]) and
  526.          not ( tu  in [0..MaxDisplayStack]) ) then exit;
  527.      if(from=tu) then exit;
  528.      if( (from=0) and (tu=0) ) then exit;
  529.      if DisplayStack[from] = nil then DisplayAllocate(DisplayStack[from]);
  530.      if DisplayStack[tu]   = nil then begin
  531.          DisplayAllocate(DisplayStack[tu]);
  532.          clearpage(tu);
  533.      end;
  534.      while  not ((port[$3DA] and 8) = 8 ) do;
  535.      move( DisplayStack[from]^,
  536.            DisplayStack[tu]^,
  537.            sizeof(DisplayStack[from]^) );
  538.      with CurrentScreenData do
  539.         move( windowloc[from],windowloc[tu],sizeof(windowloc[from]) );
  540.      readcursorposition(from,row,column,s1,s2);
  541.      setcursorposition(tu,row,column);
  542.    end;
  543.  
  544.  
  545. procedure DisplayHome;
  546.    begin
  547.       gotoxy(1,1);
  548.    end;
  549.  
  550.  
  551. procedure DisplayEnd;
  552.    begin
  553.       with currentscreendata do with windowloc[page] do
  554.          gotoxyabs(x2+1,y2+1);
  555.    end;
  556.  
  557.  
  558. procedure displaypush(i:integer);
  559.    begin
  560.       displaytop := displaytop - 1;
  561.       copydisplay(i,displaytop);
  562.    end;
  563.  
  564.  
  565. procedure displaypop(i:integer);
  566.    begin
  567.       copydisplay(displaytop,i);
  568.       displaytop := displaytop + 1;
  569.       if displaytop > maxdisplayStack then displaytop := maxdisplaystack;
  570.    end;
  571.  
  572.  
  573. procedure savescreen;
  574.    begin
  575.       copydisplay(0,maxdisplaystack);
  576.    end;
  577.  
  578.  
  579. procedure restorescreen;
  580.    begin
  581.       copydisplay(maxdisplaystack,0);
  582.    end;
  583.