home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / cpm / ros / rosmac.lbr / KP_Z-CLK.IQC / KP_Z-CLK.INC
Encoding:
Text File  |  1985-06-26  |  7.1 KB  |  258 lines

  1. { ROSMAC.INC - Remote Operating System Machine Dependent Routines }
  2. { Modified for Kaypro and Z-clock by Norman Saunders - 5 Apr 85 }
  3.  
  4. const
  5. { Machine specific constants }
  6.  
  7.   DataPort   = $04;          { Data port }
  8.   StatusPort = $06;          { Status port }
  9.   RatePort   = $00;          { Data rate (bps) port }
  10.   BasePort   = $B0;          { Base port for Z-Clock access}
  11.  
  12. { StatusPort commands }
  13.  
  14.   RESCHN     = $18;          { reset channel }
  15.   RESSTA     = $10;          { reset ext/status }
  16.   WRREG1     = $00;          { value to write to register 1 }
  17.   WRREG3     = $C1;          { 8 bits/char, rx enable }
  18.   WRREG4     = $44;          { 16x, 1 stop bit, no parity }
  19.   DTROFF     = $68;          { dtr off, rts off }
  20.   DTRON      = $EA;          { dtr on, 8 bits/char, tx enable, rts on }
  21.   ONINS      = $30;          { error reset }
  22.  
  23. { StatusPort status masks }
  24.  
  25.   DAV        = $01;          { data available }
  26.   TRDY       = $04;          { transmit buffer empty }
  27.   DCD        = $08;          { data carrier detect }
  28.   PE         = $10;          { parity error }
  29.   OE         = $20;          { overrun error }
  30.   FE         = $40;          { framing error }
  31.   ERR        = $60;          { parity, overrun and framing error }
  32.  
  33. { Smartmodem result codes }
  34.  
  35.   OKAY        = '0';         { Command executed with no errors }
  36.   CONNECT300  = '1';         { Carrier detect at 300 bps }
  37.   RING        = '2';         { Ring signal detected }
  38.   NOCARRIER   = '3';         { Carrier lost or never heard }
  39.   ERROR       = '4';         { Error in command execution }
  40.   CONNECT1200 = '5';         { Carrier detect at 1200 bps }
  41.  
  42. { Rate setting commands }
  43.  
  44.   BD300      = 5;            { 300 bps }
  45.   BD1200     = 7;            { 1200 bps }
  46.  
  47. function mdcarck: boolean;
  48. { Check to see if carrier is present }
  49. begin
  50.   port[StatusPort] := RESSTA;
  51.   mdcarck := ((DCD and port[StatusPort]) <> 0)
  52. end;
  53.  
  54. function mdinprdy: boolean;
  55. { Check for ready to input from modem }
  56. var
  57.   bt: byte;
  58. begin
  59.   if (DAV and port[StatusPort]) <> 0
  60.     then
  61.       begin
  62.         port[StatusPort] := 1;
  63.         if (ERR and port[StatusPort]) <> 0
  64.           then
  65.             begin
  66.               port[StatusPort] := ONINS;
  67.               bt := port[DataPort];
  68.               mdinprdy := FALSE
  69.             end
  70.           else mdinprdy := TRUE
  71.       end
  72.     else mdinprdy := FALSE
  73. end;
  74.  
  75. function mdinp: byte;
  76. { Input a byte from modem - no wait - assumed ready }
  77. begin
  78.   mdinp := port[DataPort]
  79. end;
  80.  
  81. procedure mdout(b: byte);
  82. { Output a byte to modem - wait until ready }
  83. begin
  84.   repeat
  85.   until (TRDY and port[StatusPort]) <> 0;
  86.   port[DataPort] := b
  87. end;
  88.  
  89. procedure mdinit;
  90. { Initialize the sio channel and the Hayes Smartmodem 1200 }
  91. const
  92.   sio_init: array[1..9] of byte = (RESCHN, 4, WRREG4, 1, WRREG1, 3, WRREG3, 5, DTROFF);
  93. var
  94.   i: integer;
  95.   mdm_attn : string[2];
  96.   mdm_init : string[41];
  97.   bt       : byte;
  98. begin
  99.   for i := 1 to 9 do
  100.     port[StatusPort] := sio_init[i];        { initialize the SIO channel }
  101.   port[StatusPort] := 5;                    { pull DTR high }
  102.   port[StatusPort] := DTRON;
  103.   mdm_attn := 'AT';
  104.   mdm_init := 'ATE0Q0V0M0X1 S0=0 S2=3 S4=255 S5=255';
  105.   port[RatePort] := BD1200;                 {set the 8116 to 1200 baud}
  106.   delay (500);                              {let the modem settle for a bit}
  107.   for i := 1 to 2 do
  108.     begin
  109.       bt := ord(mdm_attn[i]);               {force the modem to 1200 baud}
  110.       mdout(bt)
  111.     end;
  112.   bt := ord(CR);
  113.   mdout(bt);
  114.   delay (2000);                             {wait a sec...}
  115.   for i := 1 to 41 do
  116.     begin
  117.       bt := ord(mdm_init[i]);               {initialize the modem}
  118.       mdout(bt)
  119.     end;
  120.   bt := ord(CR);
  121.   mdout(bt);
  122.   bt := mdinp;                              { clear any previous rings }
  123.   bt := mdinp
  124. end;
  125.  
  126. function mdring: boolean;
  127. { Determine if the phone is ringing }
  128. begin
  129.   if mdinprdy
  130.     then mdring := (RING = chr(mdinp))
  131.     else mdring := FALSE
  132. end;
  133.  
  134. procedure mdhangup;
  135. { Hangup modem }
  136. var
  137.   i        : integer;
  138.   mdm_hang : string[4];
  139.   bt       : byte;
  140. begin
  141.   repeat
  142.     port[StatusPort] := 5;             { setup to write register 5 }
  143.     port[StatusPort] := DTROFF;        { clear DTR, causing hangup }
  144.     delay(2000);
  145.     port[StatusPort] := 5;
  146.     port[StatusPort] := DTRON;
  147.     if mdcarck
  148.       then
  149.         begin
  150.           mdm_hang := 'ATH0';
  151.           for i := 1 to 3 do
  152.             begin
  153.               bt := ord(ETX);
  154.               mdout(bt)
  155.             end;
  156.           delay(1500);
  157.           for i := 1 to 4 do
  158.             begin
  159.               bt := ord(mdm_hang[i]);
  160.               mdout(bt)
  161.             end;
  162.           bt := ord(CR);
  163.           mdout(bt)
  164.         end;
  165.   until not(mdcarck)
  166. end;
  167.  
  168. procedure mdans;
  169. { Detect and set system to rate at which modem answered phone }
  170. var
  171.   mdm_answ : string[3];
  172.   code     : char;
  173.   i        : integer;
  174.   bt       : byte;
  175. begin
  176.   repeat
  177.   until mdinprdy;
  178.   bt := mdinp;
  179.   mdm_answ := 'ATA';
  180.   for i := 1 to 3 do
  181.     begin
  182.       bt := ord(mdm_answ[i]);
  183.       mdout(bt)
  184.     end;
  185.   bt := ord(CR);
  186.   mdout(bt);
  187.   repeat
  188.   until mdinprdy;
  189.   code := chr(mdinp);
  190.   if code = CONNECT1200
  191.     then
  192.       begin
  193.         port[RatePort] := BD1200;
  194.         rate := 0.02075;
  195.         delay(500);
  196.         bt := mdinp;
  197.         bt := mdinp
  198.       end;
  199.   if code = CONNECT300
  200.     then
  201.       begin
  202.         port[RatePort] := BD300;
  203.         rate := 0.083;
  204.         delay(500);
  205.         bt := mdinp;
  206.         bt := mdinp
  207.       end;
  208.   if code = NOCARRIER
  209.     then mdhangup
  210. end;
  211.  
  212. procedure GetTAD(var t: tad_array);
  213. { Return a 6 element byte array of the current system time in
  214.   seconds, minutes, hours, day, month, and year. }
  215.   var
  216.     i    : integer;
  217.     Time : array [0..12] of byte;           { Array filled in from Z-Clock }
  218.   begin
  219.     for i := 0 to 12 do                     { This section reads the Z-Clock }
  220.       Time[i] := port[BasePort + i];
  221.     t[0] := Time[1] * 10 + Time[0];
  222.     if Time[5] < 4
  223.       then t[2] := Time[5] * 10 + Time[4]
  224.     else if Time[5] >= 8
  225.       then t[2] := (Time[5] - 8) * 10 + Time[4]
  226.       else t[2] := (Time[5] - 4) * 10 + Time[4];
  227.     t[1] := Time[3] * 10 + Time[2];
  228.     if Time[8] >= 4
  229.       then Time[8] := Time[8] - 4;
  230.     t[3] := Time[8] * 10 + Time[7];
  231.     t[4] := Time[10] * 10 + Time[9];
  232.     t[5] := Time[12] * 10 + Time[11]
  233.   end;
  234.  
  235. procedure SetTAD(var t: tad_array);
  236. { Set the system time using  a 6 element byte array }
  237.   var
  238.     i    : integer;
  239.     Time : array [0..12] of byte;           { Array filled in from Z-Clock }
  240.   begin
  241.     Time[0] := 0;
  242.     Time[1] := 0;
  243.     Time[2] := t[1] mod 10;
  244.     Time[3] := t[1] div 10;
  245.     Time[4] := t[2] mod 10;
  246.     Time[5] := t[2] div 10;
  247.     Time[6] := 0;                           { Day of week computed in ROS }
  248.     Time[7] := t[3] mod 10;
  249.     Time[8] := t[3] div 10;
  250.     Time[9] := t[4] mod 10;
  251.     Time[10]:= t[4] div 10;
  252.     Time[11]:= t[5] mod 10;
  253.     Time[12]:= t[5] div 10;
  254.     For i := 0 to 12 do
  255.       port[BasePort + i] := Time[i]
  256.   end;
  257.  
  258.