home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / BBS / C128PICS.ARC / C1650.MCH next >
Text File  |  1991-08-11  |  4KB  |  187 lines

  1. { PICS.MCH -
  2.       Pascal Integrated Communications System Machine Dependent Routines }
  3.  
  4. { File:        C1650.MCH
  5.   Description: This driver set is designed to support a Commodore 1650 Modem
  6.   Date:        7/7/89
  7.   Author:      Peter B. Carter
  8. }
  9.  
  10. {** System routines **}
  11.  
  12. procedure di;
  13. begin
  14.      inline($f3);
  15. end;
  16.  
  17. procedure ei;
  18. begin
  19.      inline($fb);
  20. end;
  21.  
  22. function inbc(io : integer) : integer;
  23. {input from true 16b i/o space}
  24. var
  25.    ret_val : integer;
  26. begin
  27.      inline(
  28.      $ed/$4b/io/               {ld   bc,(io)}
  29.      $ed/$68/                  {in   l,(c)        ; input data off true 16b io space}
  30.      $26/0/                    {ld   h,0          ; zero high nibble}
  31.      $22/ret_val               {ld   (ret_val),hl}
  32.      );
  33.      inbc:=ret_val;
  34. end;
  35.  
  36. procedure outbc(io, data : integer);
  37. {output to true 16b i/o space}
  38. begin
  39.      inline(
  40.      $3a/data/                 {ld   a,(data)}
  41.      $ed/$4b/io/               {ld   bc,(io)}
  42.      $ed/$79                   {out  (c),a}
  43.      );
  44. end;
  45.  
  46.  
  47. procedure system_init;
  48. { Initialization to be done once when ROS first starts }
  49.   begin
  50.        mem[$fd4e]:=1; {8n1}
  51.        outbc($dd03,38); {ddr}
  52.        clock:=true;
  53.        mem[$fd22]:=0;
  54.        write(chr(26),chr(27),')');
  55.   end;
  56.  
  57.  
  58. procedure putstat(st: StrStd);
  59. { Display 'st' on status line }
  60.   const
  61.     status_line    = 25;                    { Line used for system status }
  62.     last_line      = 24;                    { Last line on screen }
  63.   begin
  64.     GotoXY(1, status_line);
  65.     ClrEol;
  66.     write(st);
  67.     GotoXY(1, last_line)
  68.   end;
  69.  
  70. {** Remote channel routines **}
  71.  
  72. procedure ch_init;
  73. { Initialize the remote channel }
  74.   begin
  75.   end;
  76.  
  77. procedure ch_on;
  78. { Turn on remote channel (usually by enabling DTR) }
  79. var
  80.    data : byte;
  81. begin
  82.      data:=inbc($dd01);
  83.      data:=data or 32;
  84.      outbc($dd01,data);
  85. end;
  86.  
  87. procedure ch_off;
  88. { Turn on remote channel (usually by disabling DTR) }
  89. var
  90.    data : byte;
  91. begin
  92.      data:=inbc($dd01);
  93.      data:=data and 223;
  94.      outbc($dd01,data);
  95. end;
  96.  
  97. function ch_carck: boolean;
  98. { Check to see if carrier is present }
  99. begin
  100.      if (inbc($dd01) and 16) = 0 then ch_carck:=true else ch_carck:=false;
  101. end;
  102.  
  103. function ch_ring : boolean;
  104. { Check to see if line is ringing }
  105. begin
  106.      if (inbc($dd01) and 8) = 8 then ch_ring:=true else ch_ring:=false;
  107. end;
  108.  
  109. function ch_inprdy: boolean;
  110. { Check for ready to input from port }
  111. begin
  112.      if (mem[$fd4f] and 1) = 1 then ch_inprdy:=true else ch_inprdy:=false;
  113. end;
  114.  
  115. function ch_inp: byte;
  116. { Input a byte from port - no wait - assumed ready }
  117. var
  118.    ch : byte;
  119. begin
  120.      ch:=mem[$fd51];
  121.      di;
  122.      mem[$fd4f]:=mem[$fd4f] and $fe;
  123.      ei;
  124.      ch_inp:=ch;
  125. end;
  126.  
  127. procedure ch_purge;
  128. {purge rs232 buffer (if any)}
  129. var
  130.    bt : byte;
  131. begin
  132.      while (mem[$fd4f] and 33) <> 0 do while ch_inprdy do bt:=ch_inp;
  133. end;
  134.  
  135. procedure ch_out(bt: byte);
  136. { Output a byte to port - wait until ready }
  137. begin
  138.     repeat
  139.     until (mem[$fd4f] and 128) = 0;
  140.     mem[$fd50]:=bt;
  141.     di;
  142.     mem[$fd4f]:=mem[$fd4f] or $80;
  143.     ei;
  144. end;
  145.  
  146. procedure set_timer(val : integer);
  147. var
  148.    lh : array[0..1] of byte absolute val;
  149. begin
  150.      di;
  151.      outbc($dc07,lh[1]);
  152.      outbc($dc06,lh[0]);
  153.      outbc($dc0f,$11);
  154.      ei;
  155. end;
  156.  
  157. procedure ch_set(r: integer);
  158. { Set the bps rate }
  159. begin
  160.     case r of
  161.       300 : begin
  162.                  set_timer(1136);
  163.                  mem[$fd52]:=3;
  164.                  rate:=300;
  165.             end;
  166.       450 : begin
  167.         set_timer(757);
  168.                 mem[$fd52]:=4;
  169.         rate:=450;
  170.             end;
  171.       1200: begin
  172.                  set_timer(284);
  173.                  mem[$fd52]:=12;
  174.                  rate:=1200;
  175.             end;
  176.     end;
  177. end;
  178.  
  179. procedure system_de_init;
  180. { De-initialization to be done once when ROS terminates }
  181.   begin
  182.        outbc($dd01,2); {dtr ok}
  183.        write(chr(27),')');
  184.        ch_set(300);
  185.   end;
  186.  
  187.