home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / beehive / program / bw.arc / BW.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-02-18  |  12.8 KB  |  528 lines

  1. {*
  2.  * BeeWindows 
  3.  *
  4.  * windowing stuff for MicroBee computers and Turbo Pascal
  5.  *
  6.  *}
  7.  
  8. type
  9.  
  10.         {*
  11.          * record of information for each virtual screen
  12.          *}
  13.  
  14.         window_buffer           =       record
  15.  
  16.                 screen          :       array[ 0 .. 1919 ] of byte;
  17.                 xsite           :       byte;
  18.                 ysite           :       byte;
  19.                 xpos            :       byte;
  20.                 ypos            :       byte;
  21.                 xsize           :       byte;
  22.                 ysize           :       byte;
  23.                 xcurs           :       byte;
  24.                 ycurs           :       byte
  25.  
  26.         end;
  27.  
  28.         window                  =       ^window_buffer;
  29.  
  30.         {*
  31.          * a stack is used to store a record of which windows are 
  32.          * on the screen
  33.          *}
  34.  
  35.         window_stack_ptr        =       ^window_node;
  36.  
  37.         window_node             =       record
  38.  
  39.                 window_id       :       window;
  40.                 link            :       window_stack_ptr
  41.  
  42.         end;
  43.  
  44.         any_string              =       string[ 255 ];
  45.  
  46. var
  47.  
  48.         window_screen   :       array[ 0 .. 1919 ] of byte absolute $f000;
  49.  
  50.         window_stack_1  :       window_stack_ptr;
  51.         window_stack_2  :       window_stack_ptr;
  52.  
  53. procedure init_windows;
  54.  
  55. type
  56.  
  57.         bitmap          =       array[ 0 .. 15 ] of byte;
  58.  
  59. var
  60.  
  61.         i               :       integer;
  62.         pcg             :       array[ 0 .. 127 ] of bitmap absolute $f800;
  63.  
  64. const
  65.  
  66.         topleftleft     :       bitmap
  67.                 =       ( 0, 0, 0, 0, 1, 3, 6, 12, 24, 48, 96, 96, 0, 0, 0, 0 );
  68.  
  69.         topleftright    :       bitmap
  70.                 =       ( 0, 63, 96, 192, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
  71.  
  72.         topline         :       bitmap
  73.                 =       ( 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
  74.  
  75.         toprightleft    :       bitmap
  76.                 =       ( 0, 252, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
  77.  
  78.         toprightright   :       bitmap
  79.                 =       ( 0, 0, 0, 0, 128, 192, 96, 48, 24, 12, 6, 6, 0, 0, 0, 0 );
  80.  
  81.         rightline       :       bitmap
  82.                 =       ( 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 0, 0, 0 );
  83.  
  84.         botrightright   :       bitmap
  85.                 =       ( 6, 6, 12, 24, 48, 96, 192, 128, 0, 0, 0, 0, 0, 0, 0, 0 );
  86.  
  87.         botrightleft    :       bitmap
  88.                 =       ( 0, 0, 0, 0, 0, 0, 0, 1, 3, 6, 252, 0, 0, 0, 0, 0 );
  89.  
  90.         botline         :       bitmap
  91.                 =       ( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0 );
  92.  
  93.         botleftright    :       bitmap
  94.                 =       ( 0, 0, 0, 0, 0, 0, 0, 128, 192, 96, 63, 0, 0, 0, 0, 0 );
  95.  
  96.         botleftleft     :       bitmap
  97.                 =       ( 96, 96, 48, 24, 12, 6, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0 );
  98.  
  99.         leftline        :       bitmap
  100.                 =       ( 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 0, 0, 0, 0 );
  101.  
  102. begin
  103.  
  104.         pcg[ 0 ] := topleftleft;
  105.         pcg[ 1 ] := topleftright;
  106.         pcg[ 2 ] := topline;
  107.         pcg[ 3 ] := toprightleft;
  108.         pcg[ 4 ] := toprightright;
  109.         pcg[ 5 ] := rightline;
  110.         pcg[ 6 ] := botrightright;
  111.         pcg[ 7 ] := botrightleft;
  112.         pcg[ 8 ] := botline;
  113.         pcg[ 9 ] := botleftright;
  114.         pcg[ 10 ] := botleftleft;
  115.         pcg[ 11 ] := leftline;
  116.         window_stack_1 := nil;
  117.         window_stack_2 := nil
  118.         
  119. end; { init_windows }
  120.  
  121. function make_window : window;
  122.  
  123. var
  124.  
  125.         w       :       window;
  126.  
  127. begin
  128.  
  129.         new( w );
  130.  
  131.         with w^ do begin
  132.  
  133.                 fillchar( screen, 1920, 32 );
  134.                 xsite := 1;
  135.                 ysite := 1;
  136.                 xpos := 1;
  137.                 ypos := 1;
  138.                 xsize := 78;
  139.                 ysize := 22;
  140.                 xcurs := 1;
  141.                 ycurs := 1
  142.  
  143.         end; { with }
  144.  
  145.         make_window := w
  146.  
  147. end; { make_window }
  148.  
  149. procedure window_draw_window( w : window );
  150.  
  151. var
  152.  
  153.         buf             :       array[ 0 .. 79 ] of byte;
  154.         b, i, s         :       integer;
  155.  
  156. begin
  157.  
  158.         with w^ do begin
  159.  
  160.                 s := xpos + ypos * 80 - 81;
  161.                 move( window_screen[ s ], screen, xsize + 2 );
  162.                 window_screen[ s ] := 128;
  163.                 window_screen[ s + 1 ] := 129;
  164.                 fillchar( window_screen[ s + 2 ], xsize - 2, 130 );
  165.                 window_screen[ s + xsize ] := 131;
  166.                 window_screen[ s + xsize + 1 ] := 132;
  167.  
  168.                 b := xsite + ysite * 80;
  169.                 s := s + 80;
  170.  
  171.                 for i := 1 to ysize do begin
  172.  
  173.                         screen[ i * 80 ] := window_screen[ s ];
  174.                         window_screen[ s ] := 139;
  175.                         move( window_screen[ s + 1 ], buf, xsize );
  176.                         move( screen[ b ], window_screen[ s + 1 ], xsize );
  177.                         move( buf, screen[ b ], xsize );
  178.                         screen[ i * 80 + 79 ] := window_screen[ s + xsize + 1 ];
  179.                         window_screen[ s + xsize + 1 ] := 133;
  180.                         b := b + 80;
  181.                         s := s + 80;
  182.  
  183.                 end; { for }
  184.  
  185.                 move( window_screen[ s ], screen[ 1840 ], xsize + 2 );
  186.                 window_screen[ s ] := 138;
  187.                 window_screen[ s + 1 ] := 137;
  188.                 fillchar( window_screen[ s + 2 ], xsize, 136 );
  189.                 window_screen[ s + xsize ] := 135;
  190.                 window_screen[ s + xsize + 1 ] := 134
  191.  
  192.         end { with }
  193.  
  194. end; { window_draw_window }
  195.  
  196. procedure window_undraw_window( w : window );
  197.  
  198. var
  199.  
  200.         buf             :       array[ 0 .. 79 ] of byte;
  201.         b, i, s         :       integer;
  202.  
  203. begin
  204.  
  205.         with w^ do begin
  206.  
  207.                 s := xpos + ypos * 80 - 81;
  208.                 b := xsite + ysite * 80;
  209.  
  210.                 move( screen, window_screen[ s ], xsize + 2 );
  211.                 s := s + 80;
  212.  
  213.                 for i := 1 to ysize do begin
  214.  
  215.                         window_screen[ s ] := screen[ i * 80 ];
  216.                         move( window_screen[ s + 1 ], buf, xsize );
  217.                         move( screen[ b ], window_screen[ s + 1 ], xsize );
  218.                         move( buf, screen[ b ], xsize );
  219.                         window_screen[ s + xsize + 1 ] := screen[ i * 80 + 79 ];
  220.                         s := s + 80;
  221.                         b := b + 80
  222.  
  223.                 end; { for }
  224.  
  225.                 move( screen[ 1840 ], window_screen[ s ], xsize + 2 )
  226.  
  227.         end { with }
  228.  
  229. end; { window_undraw_window }
  230.  
  231. function window_isonscreen( w : window ) : boolean;
  232.  
  233. var
  234.  
  235.         s       :       window_stack_ptr;
  236.         found   :       boolean;
  237.  
  238. begin
  239.  
  240.         found := false;
  241.         s := window_stack_1;
  242.  
  243.         while ( s <> nil ) and ( not found ) do begin
  244.                 found := ( s^.window_id = w );
  245.                 s := s^.link
  246.         end;
  247.  
  248.         window_isonscreen := found
  249.  
  250. end;
  251.  
  252. procedure break_window( var w : window );
  253.  
  254. begin
  255.  
  256.         if not window_isonscreen( w ) then begin
  257.                 dispose( w );
  258.                 w := nil
  259.         end
  260.  
  261. end;
  262.  
  263. procedure resite_window( w : window; x, y : integer );
  264.  
  265. begin
  266.  
  267.         if not window_isonscreen( w ) then
  268.                 if ( x > 0 ) and ( y > 0 ) and ( x < 79 ) and ( y < 23 ) then
  269.                 begin
  270.  
  271.                         w^.xsite := x;
  272.                         w^.ysite := y
  273.  
  274.                 end
  275.  
  276. end;
  277.  
  278. procedure clean_window( w : window );
  279.  
  280. begin
  281.  
  282.         if not window_isonscreen( w ) then
  283.                 fillchar( w^.screen, 1920, 32 )
  284.  
  285. end;
  286.  
  287. procedure resize_window( w : window; x, y : integer );
  288.  
  289. begin
  290.  
  291.         if not window_isonscreen( w ) then
  292.                 with w^ do begin
  293.  
  294.                         if ( x + xpos > 77 ) then
  295.                                 x := 77 - xpos;
  296.                         if ( y + ypos > 21 ) then
  297.                                 y := 21 - ypos;
  298.  
  299.                         xsize := x;
  300.                         ysize := y
  301.  
  302.                 end
  303.  
  304. end;
  305.  
  306. procedure move_window( w : window; x, y : integer );
  307.  
  308. begin
  309.  
  310.         if not window_isonscreen( w ) then
  311.                 with w^ do begin
  312.  
  313.                         if ( xsize + x > 77 ) then
  314.                                 xsize := 77 - x;
  315.                         if ( ysize + y > 21 ) then
  316.                                 ysize := 21 - y;
  317.  
  318.                         xpos := x;
  319.                         ypos := y
  320.  
  321.                 end
  322.  
  323. end;
  324.  
  325. procedure close_window( w : window );
  326.  
  327. var
  328.  
  329.         s               :       window_stack_ptr;
  330.  
  331. begin
  332.  
  333.         if window_isonscreen( w ) then begin
  334.  
  335.                 repeat
  336.  
  337.                         s := window_stack_1;
  338.                         window_stack_1 := window_stack_1^.link;
  339.  
  340.                         window_undraw_window( s^.window_id );
  341.  
  342.                         s^.link := window_stack_2;
  343.                         window_stack_2 := s;
  344.  
  345.                 until s^.window_id = w;
  346.  
  347.                 s := window_stack_2;
  348.                 window_stack_2 := window_stack_2^.link;
  349.                 dispose( s );
  350.  
  351.                 while window_stack_2 <> nil do begin
  352.  
  353.                         s := window_stack_2;
  354.                         window_stack_2 := window_stack_2^.link;
  355.  
  356.                         window_draw_window( s^.window_id );
  357.  
  358.                         s^.link := window_stack_1;
  359.                         window_stack_1 := s
  360.  
  361.                 end
  362.  
  363.         end
  364.  
  365. end;
  366.  
  367. procedure open_window( w : window );
  368.  
  369. var
  370.  
  371.         s               :       window_stack_ptr;
  372.  
  373. begin
  374.  
  375.         if window_isonscreen( w ) then
  376.                 close_window( w );
  377.  
  378.         new( s );
  379.         s^.window_id := w;
  380.         s^.link := window_stack_1;
  381.         window_stack_1 := s;
  382.         window_draw_window( w )
  383.  
  384. end;
  385.  
  386. procedure wgotoxy( w : window; x, y : integer );
  387.  
  388. begin
  389.  
  390.         if ( x > 0 ) and ( y > 0 ) and ( x < 79 ) and ( y < 23 ) then begin
  391.  
  392.                 w^.xcurs := x;
  393.                 w^.ycurs := y
  394.  
  395.         end
  396.  
  397. end;
  398.  
  399.  
  400. procedure window_update_cursor( w : window );
  401.  
  402. begin
  403.  
  404.         with w^ do begin
  405.  
  406.                 xcurs := succ( xcurs );
  407.                 if xcurs > 78 then begin
  408.  
  409.                         xcurs := 1;
  410.                         ycurs := succ( ycurs );
  411.  
  412.                         if ycurs > 22 then begin
  413.  
  414.                                 ycurs := 1
  415.  
  416.                         end
  417.  
  418.                 end
  419.  
  420.         end
  421.  
  422. end;
  423.  
  424. procedure window_bputc( w : window; c : char );
  425.  
  426. var
  427.  
  428.         b       :       integer;
  429.  
  430. begin
  431.  
  432.         b := w^.xcurs + w^.ycurs * 80;
  433.         w^.screen[ b ] := byte( c );
  434.         window_update_cursor( w )
  435.  
  436. end; { window_bputc }
  437.  
  438. procedure wputc( w : window; c : char );
  439.  
  440. var
  441.  
  442.         s       :       integer;
  443.  
  444. begin
  445.  
  446.         if not window_isonscreen( w ) then
  447.                 window_bputc( w, c )
  448.         else if window_stack_1^.window_id = w then begin
  449.  
  450.                 with w^ do
  451.                         if ( xcurs >= xsite ) and ( xcurs <= ( xsite + xsize ))
  452.                                 and ( ycurs >= ysite ) and ( ycurs <=
  453.                                         ( ysite + ysize )) then begin
  454.  
  455.                                 s := integer(xpos) + integer(xcurs)  - integer(xsite) +
  456.                                         ( integer(ypos) + integer(ycurs) - integer(ysite) ) * 80;
  457.                                 window_screen[ s ] := byte( c );
  458.                                 window_update_cursor( w );
  459.  
  460.                         end
  461.                         else
  462.                                 window_bputc( w, c )
  463.  
  464.         end
  465.  
  466. end; { wputc }
  467.  
  468. procedure wputs( w : window; var s : any_string );
  469.  
  470. var
  471.  
  472.         i               :       integer;
  473.  
  474. begin
  475.  
  476.         for i := 1 to length( s ) do
  477.                 wputc( w, s[ i ] )
  478.  
  479. end; { wputs }
  480.  
  481. procedure save_window( w : window; var fn : any_string );
  482.  
  483. var
  484.  
  485.         f               :       file;
  486.  
  487. begin
  488.  
  489.         if not window_isonscreen( w ) then begin
  490.  
  491.                 assign( f, fn );
  492.                 rewrite( f );
  493.                 blockwrite( f, w^.screen, 15 );
  494.                 close( f )
  495.  
  496.         end
  497.  
  498. end;
  499.  
  500. procedure load_window( w : window; var fn : any_string );
  501.  
  502. var
  503.  
  504.         f               :       file;
  505.  
  506. begin
  507.  
  508.         if not window_isonscreen( w ) then begin
  509.  
  510.                 assign( f, fn );
  511.                 reset( f );
  512.                 blockread( f, w^.screen, 15 );
  513.                 close( f )
  514.  
  515.         end
  516.  
  517. end;
  518.  
  519. procedure wputsxy( w : window; var s : any_string; x, y : integer );
  520.  
  521. begin
  522.  
  523.         wgotoxy( w, x, y );
  524.         wputs( w, s )
  525.  
  526. end;
  527.  
  528.