home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TM40.ZIP / TM1.INC < prev    next >
Encoding:
Text File  |  1985-07-20  |  30.8 KB  |  1,027 lines

  1. (****************************************************************************)
  2. (*                              SEND STRING                                 *)
  3. (****************************************************************************)
  4.    procedure
  5.       store_sout_buffer( ch : char );   FORWARD;
  6.  
  7.    procedure
  8.       send_str( s : strtype );
  9.    var
  10.       i           : integer;
  11.    begin
  12.       delay( sync_time * 4 );
  13.       for i:=1 to length( s ) do
  14.          store_sout_buffer( s[i] );
  15.    end;
  16.  
  17. (****************************************************************************)
  18. (*                         EN-QUE SERIAL PORT INPUT &                       *)
  19. (*                         DE-QUE SERIAL PORT OUTPUT                        *)
  20. (*                             INTERRUPT DRIVEN                             *)
  21. (****************************************************************************)
  22.    procedure
  23.       async_intr_handler;
  24.    begin
  25.       inline ($FB/$50/$53/$51/$52/$57/$56/$06/$1E);
  26.       inline ($2E/$A1/datasegment/$8E/$D8);
  27.       int_ident := port[int_ident_reg];
  28.       repeat
  29.          if int_ident = 4 then begin
  30.             sin_buffer_ptr^[sin_store_ptr] := port[base_com_addr];
  31.             if ascii_mode then begin
  32.                if sin_buffer_ptr^[sin_store_ptr]=XOFF then
  33.                   port[int_enable_reg] := 1;
  34.                if sin_buffer_ptr^[sin_store_ptr]=XON  then
  35.                   port[int_enable_reg] := 3;
  36.             end;
  37.             if sin_store_ptr = sin_buf_size then
  38.                sin_store_ptr := 1
  39.             else
  40.                sin_store_ptr := succ(sin_store_ptr);
  41.             sin_buf_fill_cnt := succ(sin_buf_fill_cnt);
  42.          end
  43.          else begin
  44.             if sout_store_ptr = sout_read_ptr then begin
  45.                port[int_enable_reg] := 1;
  46.                sout_int_off := true;
  47.             end
  48.             else begin
  49.                port[base_com_addr] := sout_buffer_ptr^[sout_read_ptr];
  50.                if sout_read_ptr = sout_buf_size then
  51.                   sout_read_ptr := 1
  52.                else
  53.                   sout_read_ptr := succ(sout_read_ptr);
  54.             end;
  55.          end;
  56.          int_ident := port[int_ident_reg];
  57.       until int_ident = 1;
  58.       port[$20] := $20;
  59.       inline ($1F/$07/$5E/$5F/$5A/$59/$5B/$58/$5D/$5D/$CF);
  60.    end;
  61.  
  62. (****************************************************************************)
  63. (*                           SETUP SERIAL PORT                              *)
  64. (****************************************************************************)
  65.    procedure
  66.       setserial(baudrate,stopbits,databits,parity : integer);
  67.    var
  68.       parameter : integer;
  69.       parn      : byte;
  70.    begin
  71.       case baudrate of
  72.          300  : begin
  73.                    baudrate:=2;
  74.                    sync_time := wait_increment div 4;
  75.                 end;
  76.          1200 : begin
  77.                    baudrate:=4;
  78.                    sync_time := wait_increment div 11;
  79.                 end;
  80.          2400 : begin
  81.                    baudrate:=5;
  82.                    sync_time := wait_increment div 22;
  83.                 end;
  84.          4800 : begin
  85.                    baudrate:=6;
  86.                    sync_time := (wait_increment div 44)+1;
  87.                 end;
  88.          9600 : begin
  89.                    baudrate:=7;
  90.                    sync_time := (wait_increment div 88)+1;
  91.                 end;
  92.       else
  93.          baudrate:=4;
  94.          sync_time := wait_increment div 11;
  95.       end;
  96.       if stopbits=2 then
  97.          stopbits:=1
  98.       else
  99.          stopbits:=0;                     { Default to 1 stop bit }
  100.       parn := parity;
  101.       if databits=7 then
  102.          databits:=2
  103.       else begin
  104.          databits:=3;                     { Default to 8 data bits }
  105.          parn:=0;
  106.       end;
  107.       parameter:=(baudrate shl 5)+(stopbits shl 2)+databits;
  108.       case parn of
  109.          1 : parameter:=parameter+24;
  110.          2 : parameter:=parameter+8;
  111.       end;
  112.       regs.DX := pred(com_port);
  113.       regs.AX := parameter;
  114.       regs.FLAGS := 0;
  115.       intr($14,regs);
  116.       port[modem_control_reg] := $0B;
  117.       port[$21] := port[$21] and turn_IRQ_on;
  118.       port[int_enable_reg] := 1;
  119.       sout_int_off := true;
  120.    end;
  121.  
  122. (****************************************************************************)
  123. (*                         INITIALIZE THE COM PORT                          *)
  124. (****************************************************************************)
  125.    procedure
  126.       init_com_port;
  127.    begin
  128.       base_com_addr := com_addr[ com_port ];
  129.       if base_com_addr = $3F8 then   { Setup vectors and port addresses. }
  130.          begin
  131.             turn_IRQ_on := $EF;
  132.             turn_IRQ_off := $10;
  133.             IRQ_vector_ofs := $0030;
  134.             IRQ_vector_seg := $0032;
  135.          end
  136.       else
  137.          begin
  138.             turn_IRQ_on := $F7;
  139.             turn_IRQ_off := $08;
  140.             IRQ_vector_ofs := $002C;
  141.             IRQ_vector_seg := $002E;
  142.          end;
  143.       sin_store_ptr := 1;
  144.       sin_read_ptr := 1;
  145.       sin_buf_fill_cnt := 0;
  146.       sin_xoff := false;
  147.       sout_store_ptr := 1;
  148.       sout_read_ptr := 1;
  149.       hold_vector_ofs := memw[$0000:IRQ_vector_ofs];
  150.       hold_vector_seg := memw[$0000:IRQ_vector_seg];
  151.       memw[$0000:IRQ_vector_ofs] := ofs(async_intr_handler);
  152.       memw[$0000:IRQ_vector_seg] := CSeg;
  153.       int_enable_reg := base_com_addr + 1;
  154.       int_ident_reg := base_com_addr + 2;
  155.       line_control_reg := base_com_addr + 3;
  156.       modem_control_reg := base_com_addr + 4;
  157.       line_status_reg := base_com_addr + 5;
  158.       modem_status_reg := base_com_addr + 6;
  159.       setserial(baud,stopbits,databits,par);
  160.    end;
  161.  
  162. (****************************************************************************)
  163. (*                       FLUSH SERIAL INPUT BUFFER                          *)
  164. (****************************************************************************)
  165.    procedure
  166.       flush_sin_buff;
  167.    begin
  168.       sin_read_ptr := sin_store_ptr;
  169.       sin_buf_fill_cnt := 0;
  170.    end;
  171.  
  172. (****************************************************************************)
  173. (*                       EN-QUE SERIAL PORT OUTPUT                          *)
  174. (****************************************************************************)
  175.    procedure
  176.       store_sout_buffer;
  177.    var
  178.       new_sout_store_ptr   : integer;
  179.       cnt                  : integer;
  180.    begin
  181.       if sout_store_ptr = sout_buf_size then
  182.          new_sout_store_ptr := 1
  183.       else
  184.          new_sout_store_ptr := succ(sout_store_ptr);
  185.       cnt := 0;
  186.       while new_sout_store_ptr = sout_read_ptr do begin  { Wait for room }
  187.          cnt := succ(cnt);                               { in the queue. }
  188.          if cnt > 40 then begin
  189.             sout_store_ptr := sout_read_ptr;
  190.             continue_transfer := false;
  191.             sout_int_off := true;
  192.             exit;
  193.          end;
  194.          delay( wait_increment );
  195.       end;
  196.       sout_buffer_ptr^[sout_store_ptr] := ord(ch);
  197.       sout_store_ptr := new_sout_store_ptr;
  198.       if sout_int_off then begin
  199.          sout_int_off := false;
  200.          port[int_enable_reg] := 3;
  201.       end;
  202.    end;
  203.  
  204. (****************************************************************************)
  205. (*                        DE-QUE SERIAL PORT INPUT                          *)
  206. (****************************************************************************)
  207.    function
  208.       read_sin_buffer : char;
  209.    begin
  210.       read_sin_buffer := chr(sin_buffer_ptr^[sin_read_ptr]);
  211.       if sin_read_ptr = sin_buf_size then
  212.          sin_read_ptr := 1
  213.       else
  214.          sin_read_ptr := succ(sin_read_ptr);
  215.       sin_buf_fill_cnt := pred(sin_buf_fill_cnt);
  216.       if sin_xoff then begin
  217.          if sin_buf_fill_cnt < sin_buf_drain_lim then begin
  218.             sin_xoff := false;
  219.             store_sout_buffer( chr(xon) );
  220.          end;
  221.          exit;
  222.       end;
  223.       if sin_buf_fill_cnt > sin_buf_fill_lim then begin
  224.          sin_xoff := true;
  225.          store_sout_buffer( chr(xoff) );
  226.       end;
  227.    end;
  228.  
  229. (****************************************************************************)
  230. (*                         DISPLAY PROMPTS LINE                             *)
  231. (****************************************************************************)
  232.    procedure
  233.       clear_pos( i,j : integer );
  234.    begin
  235.       escape_win;
  236.       textcolor( BGcolor );
  237.       textbackground( FGcolor );
  238.       gotoxy(i,j);
  239.       write(' ');
  240.       textcolor( FGcolor );
  241.       textbackground( BGcolor );
  242.       reset_win;
  243.    end;
  244.  
  245.    procedure
  246.       display_prompts;
  247.    begin
  248.       escape_win;
  249.       textcolor( BGcolor );
  250.       textbackground( FGcolor );
  251.       gotoxy(1,25);
  252.       clreol;
  253.       write('   Alt: T=Terminate, R=Receive, X=Transmit, C=Capture, H=Help, S=Chg Params.   ');
  254.       textcolor( FGcolor );
  255.       textbackground( BGcolor );
  256.       reset_win;
  257.    end;
  258.  
  259. (****************************************************************************)
  260. (*                         SAVE CAPTURE BUFFERS                             *)
  261. (****************************************************************************)
  262.    procedure
  263.       save_capture_buffers;
  264.    var
  265.       r        : real;
  266.    begin
  267.       writeln;
  268.       write(' Enter Filename for Capture Buffer Save: ');
  269.       readln(filename);
  270.       if length(filename)=0 then exit;
  271.       assign(recv_file,filename);
  272.       rewrite(recv_file);
  273.       capture_curr := capture_first;
  274.       repeat
  275.          if capture_curr^.capture_store_ptr <= capture_buf_size then
  276.             capture_curr^.capture_buffer[capture_curr^.capture_store_ptr] := ^Z
  277.          else
  278.             capture_curr^.capture_store_ptr := capture_buf_size;
  279.          if capture_curr^.capture_store_ptr > 1 then begin
  280.             r := (capture_curr^.capture_store_ptr / 128.0) + 0.999;
  281.             blockwrite(recv_file,capture_curr^.capture_buffer,trunc(r));
  282.          end;
  283.          capture_curr := capture_curr^.capture_next;
  284.       until capture_curr = nil;
  285.       close(recv_file);
  286.    end;
  287.  
  288. (****************************************************************************)
  289. (*                      ENTER / LEAVE  CAPTURE MODE                         *)
  290. (****************************************************************************)
  291.    procedure
  292.       toggle_capture_mode;
  293.    begin
  294.       if capture_flag then begin
  295.          capture_flag := false;
  296.          mkwin(11,8,67,14,'Exit Capture Mode');
  297.          writeln;
  298.          write(' Do you wish to save capture buffer? ');
  299.          readln(yes_no);
  300.          yes_no := upcase(yes_no[1]);
  301.          if yes_no = 'Y' then
  302.             save_capture_buffers;
  303.          capture_curr := capture_first;
  304.          repeat
  305.             capture_first := capture_curr;
  306.             capture_curr := capture_curr^.capture_next;
  307.             dispose(capture_first);
  308.          until capture_curr = nil;
  309.          rmwin;
  310.          clear_pos(1,25);
  311.       end
  312.       else begin
  313.          capture_flag := true;
  314.          capture_warning := false;
  315.          escape_win;
  316.          gotoxy(1,25);
  317.          write('*');
  318.          reset_win;
  319.          new(capture_first);
  320.          capture_curr := capture_first;
  321.          capture_curr^.capture_store_ptr := 1;
  322.          capture_curr^.capture_next := nil;
  323.       end;
  324.    end;
  325.  
  326. (****************************************************************************)
  327. (*                          CAPTURE A CHARACTER                             *)
  328. (****************************************************************************)
  329.    procedure
  330.       capture( c : char );
  331.    begin
  332.       capture_curr^.capture_buffer[capture_curr^.capture_store_ptr] := c;
  333.       capture_curr^.capture_store_ptr := capture_curr^.capture_store_ptr + 1;
  334.       if capture_curr^.capture_store_ptr > capture_buf_size then begin
  335.          if memory < 5 then
  336.             toggle_capture_mode
  337.          else begin
  338.             new(capture_curr^.capture_next);
  339.             capture_curr := capture_curr^.capture_next;
  340.             capture_curr^.capture_store_ptr := 1;
  341.             capture_curr^.capture_next := nil;
  342.             if (not capture_warning and (memory < 7)) then begin
  343.                capture_warning := true;
  344.                escape_win;
  345.                gotoxy(1,25);
  346.                write('W');
  347.                reset_win;
  348.             end;
  349.          end;
  350.       end;
  351.    end;
  352.  
  353. (****************************************************************************)
  354. (*                           SET SHADE OF COLOR                             *)
  355. (****************************************************************************)
  356.    procedure
  357.       set_intensity;
  358.    begin
  359.       for shade_no := 0 to 7 do
  360.          FG_shade[ shade_no ] := shade_no + intensity_state + blink_state;
  361.       FG := FG mod 8 + intensity_state + blink_state;
  362.    end;
  363.  
  364. (****************************************************************************)
  365. (*                             PROCESS ESCAPE                               *)
  366. (****************************************************************************)
  367.    procedure
  368.       scrwrite( var c : char );  FORWARD;
  369.  
  370.    procedure
  371.       escape_wrt;
  372.    var
  373.       i   : integer;
  374.    begin
  375.       escape_mode := false;
  376.       for i:=1 to length( escape_str ) do
  377.          scrwrite( escape_str[i] );
  378.    end;
  379.  
  380.    procedure
  381.       set_graphics;
  382.    var
  383.       i     : integer;
  384.    begin
  385.       for i:=1 to escape_number do begin
  386.          case escape_register[i] of
  387.             0 : begin
  388.                    intensity_state := 0;
  389.                    blink_state := 0;
  390.                    set_intensity;
  391.                    FG := lightgray;
  392.                    BG := black;
  393.                 end;
  394.             1 : begin
  395.                    intensity_state := 8;
  396.                    set_intensity;
  397.                 end;
  398.             4 : FG := blue;
  399.             5 : begin
  400.                    blink_state := blink;
  401.                    set_intensity;
  402.                 end;
  403.             7 : begin
  404.                    FG := BGcolor;
  405.                    BG := FGcolor;
  406.                 end;
  407.             8 : FG := BG;
  408.            30 : FG := FG_shade[ black     ];
  409.            31 : FG := FG_shade[ red       ];
  410.            32 : FG := FG_shade[ green     ];
  411.            33 : FG := FG_shade[ brown     ];
  412.            34 : FG := FG_shade[ blue      ];
  413.            35 : FG := FG_shade[ magenta   ];
  414.            36 : FG := FG_shade[ cyan      ];
  415.            37 : FG := FG_shade[ lightgray ];
  416.            40 : BG := black;
  417.            41 : BG := red;
  418.            42 : BG := green;
  419.            43 : BG := brown;
  420.            44 : BG := blue;
  421.            45 : BG := magenta;
  422.            46 : BG := cyan;
  423.            47 : BG := lightgray;
  424.          end;
  425.       end;
  426.       textcolor( FG );
  427.       textbackground( BG );
  428.    end;
  429.  
  430.    procedure
  431.       addr_cursor;
  432.    begin
  433.       if scroll_region         then window(1,1,80,24);
  434.       if escape_number=1       then escape_register[2]:=1;
  435.       if escape_register[1]=0  then escape_register[1]:=1;
  436.       if escape_register[2]=0  then escape_register[2]:=1;
  437.       if escape_register[1]=25 then escape_register[1]:=24;
  438.       gotoxy(escape_register[2],escape_register[1]);
  439.       if scroll_region         then window(1,scroll_top,80,scroll_bot);
  440.    end;
  441.  
  442.    procedure
  443.       cursor_up;
  444.    begin
  445.       if escape_register[1]=0 then escape_register[1]:=1;
  446.       my := wherey - escape_register[1];
  447.       gotoxy(wherex,my);
  448.    end;
  449.  
  450.    procedure
  451.       cursor_down;
  452.    begin
  453.       if escape_register[1]=0 then escape_register[1]:=1;
  454.       my := wherey + escape_register[1];
  455.       if my > scroll_last then my:=scroll_last;
  456.       gotoxy(wherex,my);
  457.    end;
  458.  
  459.    procedure
  460.       cursor_right;
  461.    begin
  462.       if escape_register[1]=0 then escape_register[1]:=1;
  463.       mx := wherex + escape_register[1];
  464.       gotoxy(mx,wherey);
  465.    end;
  466.  
  467.    procedure
  468.       index_cursor;
  469.    begin
  470.       mx := wherex;
  471.       my := wherey;
  472.       if my=scroll_last then begin
  473.          textbackground( BGcolor );
  474.          writeln;
  475.          textbackground( BG );
  476.       end
  477.       else
  478.          my := succ( my );
  479.       gotoxy(mx,my);
  480.    end;
  481.  
  482.    procedure
  483.       cursor_left;
  484.    begin
  485.       if escape_type = ' ' then begin
  486.          index_cursor;
  487.          exit;
  488.       end;
  489.       if escape_register[1]=0 then escape_register[1]:=1;
  490.       mx := wherex - escape_register[1];
  491.       gotoxy(mx,wherey);
  492.    end;
  493.  
  494.    procedure
  495.       insert_line;
  496.    var
  497.       i  : byte;
  498.    begin
  499.       if escape_register[1]=0 then escape_register[1]:=1;
  500.       for i:=1 to escape_register[1] do begin
  501.          textbackground( BGcolor );
  502.          insline;
  503.          textbackground( BG );
  504.       end;
  505.    end;
  506.  
  507.    procedure
  508.       rev_index_cursor;
  509.    begin
  510.       my := wherey;
  511.       if wherey=1 then begin
  512.          textbackground( BGcolor );
  513.          insline;
  514.          textbackground( BG );
  515.       end
  516.       else
  517.          my := pred( my );
  518.       gotoxy(wherex,my);
  519.    end;
  520.  
  521.    procedure
  522.       delete_line;
  523.    var
  524.       i  : byte;
  525.    begin
  526.       if escape_type = ' ' then begin
  527.          rev_index_cursor;
  528.          exit;
  529.       end;
  530.       if escape_register[1]=0 then escape_register[1]:=1;
  531.       for i:=1 to escape_register[1] do delline;
  532.    end;
  533.  
  534.    procedure
  535.       delete_char;
  536.    var
  537.       i,j   : byte;
  538.    begin
  539.       my := wherey;
  540.       if escape_register[1]=0 then escape_register[1]:=1;
  541.       if crt_mode = 7 then begin
  542.          for i:=wherex to 80 do begin
  543.             j := i + escape_register[1];
  544.             if j<81 then
  545.                mono_scr[my][i] := mono_scr[my][j]
  546.             else
  547.                mono_scr[my][i].disp_char := ' ';
  548.          end;
  549.       end
  550.       else begin
  551.          for i:=wherex to 80 do begin
  552.             j := i + escape_register[1];
  553.             if j<81 then
  554.                color_scr[my][i] := color_scr[my][j]
  555.             else
  556.                color_scr[my][i].disp_char := ' ';
  557.          end;
  558.       end;
  559.    end;
  560.  
  561.    procedure
  562.       clear_scr;
  563.    var
  564.       i  : byte;
  565.    begin
  566.       if emulation_mode[1]='T' then
  567.          textbackground( BGcolor );
  568.       mx := wherex;
  569.       my := wherey;
  570.       case escape_register[1] of
  571.          0 : begin
  572.                 clreol;
  573.                 for i:=succ(my) to 24 do begin
  574.                    gotoxy(1,i);
  575.                    clreol;
  576.                 end;
  577.                 gotoxy(mx,my);
  578.              end;
  579.          1 : begin
  580.                 for i:=1 to pred(my) do begin
  581.                    gotoxy(1,i);
  582.                    clreol;
  583.                 end;
  584.                 gotoxy(1,my);
  585.                 for i:=1 to mx do write( ' ' );
  586.                 gotoxy(mx,my);
  587.              end;
  588.          2 : clrscr;
  589.       end;
  590.       textbackground( BG );
  591.    end;
  592.  
  593.    procedure
  594.       clear_line;
  595.    var
  596.       i  : byte;
  597.    begin
  598.       if emulation_mode[1]='T' then
  599.          textbackground( BGcolor );
  600.       mx := wherex;
  601.       my := wherey;
  602.       case escape_register[1] of
  603.          0 : clreol;
  604.          1 : begin
  605.                 gotoxy(1,my);
  606.                 for i:=1 to mx do write( ' ' );
  607.              end;
  608.          2 : begin
  609.                 gotoxy(1,my);
  610.                 clreol;
  611.              end;
  612.       end;
  613.       gotoxy(mx,my);
  614.       textbackground( BG );
  615.    end;
  616.  
  617.    procedure
  618.       print_screen;
  619.    var
  620.       i,j    : byte;
  621.    begin
  622.       if crt_mode = 7 then begin
  623.          for j:=1 to 24 do begin
  624.             for i:=1 to 80 do write(lst,mono_scr[j][i].disp_char);
  625.             write(lst,CRLF);
  626.          end;
  627.       end
  628.       else begin
  629.          for j:=1 to 24 do begin
  630.             for i:=1 to 80 do write(lst,color_scr[j][i].disp_char);
  631.             write(lst,CRLF)
  632.          end;
  633.       end;
  634.       write(lst,FF);
  635.    end;
  636.  
  637.    procedure
  638.       printer_control;
  639.    begin
  640.       if escape_str = '?5' then  printer_on := true;
  641.       if escape_str = '?4' then  printer_on := false;
  642.       if escape_str = '5'  then  begin
  643.          printer_control_off := false;
  644.          printer_on := true;
  645.       end;
  646.       if escape_str = '4'  then  begin
  647.          printer_control_off := true;
  648.          printer_on := false;
  649.       end;
  650.       if escape_register[1]=0 then print_screen;
  651.    end;
  652.  
  653.    procedure
  654.       save_cursor;
  655.    begin
  656.       with cursor_hold do begin
  657.          x_coor := wherex;
  658.          y_coor := wherey;
  659.          bscan  := curr_bscan;
  660.          sscan  := curr_sscan;
  661.          ForeG  := FG;
  662.          BackG  := BG;
  663.       end;
  664.    end;
  665.  
  666.    procedure
  667.       restore_cursor;
  668.    begin
  669.       with cursor_hold do begin
  670.          FG := ForeG;
  671.          BG := BackG;
  672.          textcolor( FG );
  673.          textbackground( BG );
  674.          gotoxy( x_coor, y_coor );
  675.          shape_cursor( bscan, sscan );
  676.       end;
  677.    end;
  678.  
  679.    procedure
  680.       clear_tab_stop;
  681.    var
  682.       i   : integer;
  683.    begin
  684.       if escape_register[1]=0 then begin
  685.          if wherex<80 then tab_stop[ wherex ] := 0
  686.       end
  687.       else begin
  688.          for i:=1 to 79 do tab_stop[i] := 0;
  689.       end;
  690.    end;
  691.  
  692.    procedure
  693.       cursor_report;
  694.    var
  695.       s  : string10;
  696.       s1 : string10;
  697.       s2 : string10;
  698.    begin
  699.       str(wherey,s1);
  700.       str(wherex,s2);
  701.       s := ESC + '[' + s1 + ';' + s2 + 'R';
  702.       send_str( s );
  703.    end;
  704.  
  705.    procedure
  706.       xmodem_file_xmit;          FORWARD;
  707.    procedure
  708.       esc_xmit;
  709.    begin
  710.       assign(size_file,filename);
  711.       {$I-}
  712.       reset(size_file);
  713.       {$I+}
  714.       ok := (ioresult = 0);
  715.       if ok then begin
  716.          mkwin(15,4,62,13,'Automatic Transmit');
  717.          writeln(' Transmitting File: ',filename);
  718.          xmodem_file_xmit;
  719.          rmwin;
  720.       end
  721.       else
  722.          store_sout_buffer( CAN );
  723.       escape_mode := false;
  724.    end;
  725.  
  726.    procedure
  727.       xmodem_file_recv;          FORWARD;
  728.    procedure
  729.       esc_recv;
  730.    begin
  731.       mkwin(15,4,62,12,'Automatic Receive');
  732.       writeln(' Receiving File: ',filename);
  733.       setserial(baud,stopbits,8,0);
  734.       batch_mode := false;
  735.       xmodem_file_recv;
  736.       setserial(baud,stopbits,databits,par);
  737.       rmwin;
  738.       escape_mode := false;
  739.    end;
  740.  
  741.    procedure
  742.       process_escape( c : char );
  743.    label
  744.       BBS_STYLE,MORE_ESCAPE;
  745.    var
  746.       ch   : char;
  747.    begin
  748.       if emulation_mode[1]='F' then goto BBS_STYLE;
  749.       if escape_type = '{' then begin
  750.          if c = '}' then filename := escape_str;
  751.          if escape_sub_type = '}' then begin
  752.             case c of
  753.                '0' : escape_mode:=false;
  754.                '1' : esc_recv;
  755.                '2' : escape_mode:=false;
  756.                '3' : esc_xmit;
  757.                '4' : escape_mode:=false;
  758.             end;
  759.          end;
  760.          escape_str := escape_str + c;
  761.          escape_sub_type := c;
  762.          exit;
  763.       end;
  764.       case c of
  765.          '[','(','{'
  766.                  : begin
  767.                       escape_type := c;
  768.                       exit;
  769.                    end;
  770.          '0'     : begin
  771.                       if escape_type <> '(' then goto MORE_ESCAPE;
  772.                       line_drawing_chars := true;
  773.                    end;
  774.          'm'     : set_graphics;
  775.          'f'     : addr_cursor;
  776.          'H'     : begin
  777.                       if escape_type = '[' then
  778.                          addr_cursor
  779.                       else
  780.                          tab_stop[ wherex ] := 1;
  781.                    end;
  782.          'J'     : clear_scr;
  783.          'K'     : clear_line;
  784.          '7'     : begin
  785.                       if escape_type <> ' ' then goto MORE_ESCAPE;
  786.                       save_cursor;
  787.                    end;
  788.          'A'     : cursor_up;
  789.          'B'     : begin
  790.                       if escape_type = '(' then
  791.                          line_drawing_chars := false
  792.                       else
  793.                          cursor_down;
  794.                    end;
  795.          'C'     : cursor_right;
  796.          'D'     : cursor_left;
  797.          'L'     : insert_line;
  798.          'M'     : delete_line;
  799.          'I'     : rev_index_cursor;
  800.          'P'     : delete_char;
  801.          'h'     : begin
  802.                       if escape_register[1]=4 then begin
  803.                          shape_cursor(1,7);
  804.                          insert_mode := true;
  805.                       end;
  806.                       if escape_register[1]=1 then keypad_mode := true;
  807.                    end;
  808.          'l'     : begin
  809.                       if escape_register[1]=4 then begin
  810.                          shape_cursor(6,7);
  811.                          insert_mode := false;
  812.                       end;
  813.                       if escape_register[1]=1 then keypad_mode := false;
  814.                    end;
  815.          'E'     : begin
  816.                       escape_str := CRLF;
  817.                       escape_wrt;
  818.                    end;
  819.          'i'     : printer_control;
  820.          '8'     : begin
  821.                       if escape_type <> ' ' then goto MORE_ESCAPE;
  822.                       restore_cursor;
  823.                    end;
  824.          '='     : keypad_mode := true;
  825.          '>'     : keypad_mode := false;
  826.          'g'     : clear_tab_stop;
  827.          'n'     : cursor_report;
  828.          'Z'     : send_str( ^['[?6c' );
  829.          'c'     : begin
  830.                       if escape_register[1]=0 then
  831.                          send_str( ^['[?6c' );
  832.                    end;
  833.          'r'     : begin
  834.                       scroll_top := escape_register[1];
  835.                       scroll_bot := escape_register[2];
  836.                       window(1,scroll_top,80,scroll_bot);
  837.                       scroll_last := scroll_bot - scroll_top + 1;
  838.                       if ( scroll_top = 1 ) and ( scroll_bot = 24 ) then
  839.                          scroll_region := false
  840.                       else
  841.                          scroll_region := true;
  842.                    end;
  843.          'R'     : ;
  844.          '<'     : ;
  845.       else
  846.          goto MORE_ESCAPE;
  847.       end;
  848.       escape_mode := false;
  849.       exit;
  850.    BBS_STYLE:
  851.       case c of
  852.          '[',' ',LF
  853.                  : exit;
  854.          'm'     : set_graphics;
  855.          'f','H' : addr_cursor;
  856.          'J'     : clear_scr;
  857.          'K','k' : clear_line;
  858.          ^N      : play( escape_str + ' ' );
  859.          CR      : begin
  860.                       play( escape_str + ' ' );
  861.                       escape_str := '';
  862.                       escape_type := ' ';
  863.                       escape_sub_type := ' ';
  864.                       escape_number := 1;
  865.                       escape_register[1] := 0;
  866.                       exit;
  867.                    end;
  868.       else
  869.          goto MORE_ESCAPE;
  870.       end;
  871.       escape_mode := false;
  872.       exit;
  873.    MORE_ESCAPE:
  874.       ch := upcase( c );
  875.       escape_str := escape_str + ch;
  876.       if ch in [ 'A'..'G','L'..'P','T','S','#','+','-','>','<','.','?' ] then
  877.          exit;
  878.       if ch in [ '0'..'9' ] then begin
  879.          escape_register[escape_number] := (escape_register[escape_number] * 10) + ord( ch ) - ord( '0' );
  880.          exit;
  881.       end;
  882.       if ch in [ ';', ',' ] then begin
  883.          escape_number := succ(escape_number);
  884.          escape_register[escape_number] := 0;
  885.          exit;
  886.       end;
  887.       escape_wrt;
  888.       set_graphics;
  889.    end;
  890.  
  891. (****************************************************************************)
  892. (*                             SCREEN HANDLER                               *)
  893. (****************************************************************************)
  894.    procedure
  895.       insert_mode_wrt( ch : char );
  896.    var
  897.       i        : byte;
  898.       c1,c2    : screen_char;
  899.    begin
  900.       my := wherey;
  901.       mx := wherex;
  902.       if crt_mode = 7 then begin
  903.          c1 := mono_scr[my][mx];
  904.          write( ch );
  905.          for i:=mx+1 to 80 do begin
  906.             c2 := mono_scr[my][i];
  907.             mono_scr[my][i] := c1;
  908.             c1 := c2;
  909.          end;
  910.       end
  911.       else begin
  912.          c1 := color_scr[my][mx];
  913.          write( ch );
  914.          for i:=mx+1 to 80 do begin
  915.             c2 := color_scr[my][i];
  916.             color_scr[my][i] := c1;
  917.             c1 := c2;
  918.          end;
  919.       end;
  920.       gotoxy(mx+1,my);
  921.    end;
  922.  
  923.    procedure
  924.       lp_write( c : char);
  925.    begin
  926.       regs.AX := ord( c );
  927.       regs.DX := 0;
  928.       intr( $17,regs );
  929.    end;
  930.  
  931.    procedure
  932.       wrt( c : char );
  933.    begin
  934.       if printer_control_off then write( c );
  935.       if printer_on then lp_write( c );
  936.       if capture_flag then capture( c );
  937.    end;
  938.  
  939.    procedure
  940.       monitor_recv( ch : char );
  941.    begin
  942.       if ch < ' ' then begin
  943.          wrt( '^' );
  944.          wrt( chr( ord( ch ) + 64 ) );
  945.       end
  946.       else
  947.          wrt( ch );
  948.    end;
  949.  
  950.    procedure
  951.       scrwrite;
  952.    var
  953.       i  : byte;
  954.    begin
  955.       if monitor_mode then begin
  956.          monitor_recv( c );
  957.          exit;
  958.       end;
  959.       if escape_mode then begin
  960.          process_escape( c );
  961.          exit;
  962.       end;
  963.       if c > #31 then begin
  964.          auto_wrap := false;
  965.          if c = DEL then exit;
  966.          if line_drawing_chars then begin
  967.             if c > #95 then
  968.                c := char( alt_character[ ord( c ) ] );
  969.          end;
  970.          if insert_mode then begin
  971.             insert_mode_wrt( c );
  972.             exit;
  973.          end;
  974.          if wherex = 80 then auto_wrap := true;
  975.          wrt( c );
  976.          exit;
  977.       end;
  978.       case c of
  979.          NUL   : auto_wrap := false;
  980.          ESC   : begin
  981.                     auto_wrap := false;
  982.                     escape_str := '';
  983.                     escape_type := ' ';
  984.                     escape_sub_type := ' ';
  985.                     escape_number := 1;
  986.                     escape_register[1] := 0;
  987.                     escape_mode := true;
  988.                  end;
  989.          FF    : begin
  990.                     auto_wrap := false;
  991.                     if printer_control_off then clrscr;
  992.                     if printer_on then lp_write( c );
  993.                     if capture_flag then capture( c );
  994.                  end;
  995.          VT,LF : begin
  996.                     if auto_wrap then
  997.                        auto_wrap := false
  998.                     else
  999.                        wrt( LF );
  1000.                  end;
  1001.          CR    : begin
  1002.                     wrt( CR );
  1003.                     if auto_LF[1]='T' then begin
  1004.                        if auto_wrap then
  1005.                           auto_wrap := false
  1006.                        else
  1007.                           wrt( LF );
  1008.                     end;
  1009.                  end;
  1010.          HT    : begin
  1011.                     auto_wrap := false;
  1012.                     i := wherex;
  1013.                     if i <> 80 then begin
  1014.                        repeat
  1015.                           i := succ( i );
  1016.                           if printer_on then lp_write( ' ' );
  1017.                           if capture_flag then capture( ' ' );
  1018.                        until tab_stop[ i ] = 1;
  1019.                        gotoxy(i,wherey);
  1020.                     end;
  1021.                  end;
  1022.       else
  1023.          auto_wrap := false;
  1024.          wrt( c );
  1025.       end;
  1026.    end;
  1027.