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 / CPM / BBSING / BBS / TURBOBBS.ARK / MACHDEP.INC < prev    next >
Text File  |  1986-12-20  |  6KB  |  273 lines

  1. const
  2.   iodata    = 4;    {Z80 SIO port addresses for Kaypros}
  3.   iocontrol = 6;    {Your machine may differ significantly}
  4.   iorate    = 0;    {in addresses and serial port hardware.}
  5.  
  6. procedure lineout(message: line); forward;
  7.  {lineout is in IO.INC - don't change this declaration!}
  8.  
  9. procedure clearstatus;
  10.  
  11. {Resets latching status flags on SIO chip -
  12.  replace with empty procedure if not needed}
  13.  
  14.   begin
  15.     port[iocontrol] :=16;
  16.   end;
  17.  
  18. function outready: boolean;
  19.  
  20. {Returns true if serial output port is
  21.  ready to transmit a new character}
  22.  
  23.   begin
  24.     clearstatus;
  25.     outready := (port[iocontrol] and 4) > 0;
  26.   end;
  27.  
  28. procedure xmitchar(ch: char);
  29.  
  30. {Transmits ch when serial output port is ready,
  31.    unless we're in the local mode.}
  32.  
  33.   begin
  34.     if not local then begin
  35.       repeat until outready;
  36.       port[iodata] := ord(ch);
  37.     end;
  38.   end;
  39.  
  40. function cts: boolean;
  41.  
  42. {This function returns true if a carrier tone is present on the modem
  43.  and is frequently checked to see if the caller is still present.
  44.  It always returns "true" in the local mode.}
  45.  
  46.   begin
  47.     clearstatus;
  48.     cts := ((port[iocontrol] and 32) = 32) or local;
  49.   end;
  50.  
  51. function inready: boolean;
  52.  
  53. {Returns true if we've got a character received
  54.  from the serial port or keyboard.}
  55.  
  56.   begin
  57.     inready := keypressed or ((port[iocontrol] and 1) > 0);
  58.   end;
  59.  
  60. function recvchar: char;
  61.  
  62. {Returns character from serial input port,
  63.   REGARDLESS of the status of inready.}
  64.  
  65.   begin
  66.     recvchar := chr(port[iodata]);
  67.   end;
  68.  
  69. procedure setbaud(speed: rate);
  70.  
  71. {For changing the hardware baud rate setting}
  72.  
  73.   begin
  74.     case speed of
  75.       slow: port[iorate] := 5;     { 300 baud}
  76.       fast: port[iorate] := 7;     {1200 baud}
  77.     end;
  78.     baud := speed;
  79.   end;
  80.  
  81. procedure clearSIO;
  82.  
  83. { Initializes serial I/O chip - a Z80 SIO in this case:
  84.   sets up for 8 bits, no parity and one stop bit on both
  85.   transmit and receive, and allows character transmission
  86.   with CTS low. Also sets RTS line high. }
  87.  
  88.   begin
  89.     port[iocontrol] := $18;
  90.     port[iocontrol] := 4;
  91.     port[iocontrol] := $44;
  92.     port[iocontrol] := 3;
  93.     port[iocontrol] := $C1;
  94.     port[iocontrol] := 5;
  95.     port[iocontrol] := $EA;
  96.   end;
  97.  
  98. procedure clearmodem;        (* Modem Dependent *)
  99.  
  100. {Sets modem for auto-answer, CTS line as carrier detect, no command echo}
  101.  
  102.   var buffer: line;
  103.       loop  : byte;
  104.       ch    : char;
  105.  
  106.   begin
  107.     buffer := cr + cr + '<O3N4N5N0Q>';
  108.     for loop := 1 to length(buffer) do begin
  109.       ch := buffer[loop];
  110.       xmitchar(ch);
  111.     end;
  112.     writeln;
  113.     write('Delaying...');
  114.     delay(5000); {Delays while modem digests initialization codes}
  115.     writeln;
  116.   end;
  117.  
  118. procedure setup;
  119.  
  120. {Hardware initializion for system to start BBS program} 
  121.  
  122.   begin
  123.     port[8] := 12; { Sets Kaypro 2-84 Serial Printer port to 4800 baud }
  124.     write(esc + 'B7'); { Protects 25th line of Kaypro 2-84 display }
  125.     setbaud(fast);
  126.     clearSIO;
  127.     clearmodem;
  128.   end;
  129.  
  130. function badframe: boolean;
  131.  
  132. {Indicates Framing Error on serial I/O chip - return false if not available.}
  133.  
  134.   begin
  135.     port[iocontrol] := 1;
  136.     badframe := (port[iocontrol] and 64) = 64;
  137.   end;
  138.  
  139. procedure dropRTS;
  140.  
  141. { Lowers RS-232 RTS line - used to inhibit auto-answer
  142.    and to cause modem to hang up }
  143.  
  144.   begin
  145.     port[iocontrol] := 5;
  146.     port[iocontrol] := $68;
  147.   end;
  148.  
  149. procedure raiseRTS;
  150.  
  151. (* Raises RTS line to enable auto-answer *)
  152.  
  153.   begin
  154.     port[iocontrol] := 5;
  155.     port[iocontrol] := $EA;
  156.   end;
  157.  
  158. procedure setlocal;
  159.  
  160. {Sets local flag true and inhibits modem auto-answer}
  161.  
  162.   begin
  163.     dropRTS; {Inhibits Rixon auto-answer}
  164.     local := true;
  165.   end;
  166.  
  167. procedure clearlocal;
  168.  
  169. {Clears local flag and allows modem auto-answer}
  170.  
  171.   begin
  172.     raiseRTS; {Enables Rixon Auto-answer}
  173.     local := false;
  174.   end;
  175.  
  176. procedure unload;
  177.  
  178. {Halts Kaypro disk drives - normally they run for about 15 secs.}
  179.  
  180.   begin
  181.     port[20] := (port[20] and $EF);
  182.   end;
  183.  
  184. procedure dispcaller;
  185.  
  186. {Displays caller's name on protected 25th line of host CRT;
  187.  Replace with empty procedure if not desired.}
  188.  
  189.   begin
  190.     write(esc + 'B6' + esc + '=' + chr(56) + ' ');
  191.     write(caller);
  192.     if clockin then write(' called at ' + timeon);
  193.     write(#24 + esc + 'C6');    {#24 = clear to end of line}
  194.   end;
  195.  
  196. procedure hangup;
  197.  
  198. {Signals modem to hang up - in this case by lowering RTS line for 500 msec.}
  199.  
  200.   begin
  201.     if cts then lineout('--- Disconnected ---' + cr + lf);
  202.     dropRTS;
  203.     delay(500);
  204.     raiseRTS;
  205.     if local then clearlocal else repeat until not cts;
  206.   end;
  207.  
  208. {Real-time clock support begins here - this routine is called
  209.  even if there is NO clock, so leave it and set clockin accordingly}
  210.  
  211. const
  212.   rtca    = $20;  {Kaypro 4/84 and (modified) Kaypro 2/84 }
  213.   rtcs    = $22;  {real-time clock control registers: will}
  214.   rtcd    = $24;  {differ significantly on other hardware.}
  215.  
  216. procedure clock(var month,date,hour,min,sec: byte);
  217.  
  218. {Returns with month in range 1(Jan)..12(Dec),
  219.  date in 1..length of month, hour in 0..23 (24-hr clock),
  220.  minute and second in 0..59}
  221.  
  222.   var
  223.     temp: byte;
  224.  
  225.   function bcd_to_dec(bcd: byte): byte;
  226.  
  227.   {Converts 2-digit/byte BCD to decimal}
  228.  
  229.     begin
  230.       bcd_to_dec := (bcd and 15) + 10 * (bcd div 16);
  231.     end;
  232.  
  233.   function inport(loc: byte): byte;
  234.  
  235.   {Reads Kaypro clock port data from register loc}
  236.  
  237.     begin
  238.       port[rtca] := loc;
  239.       inport := bcd_to_dec(port[rtcd]);
  240.     end;
  241.  
  242.   procedure setupclock;
  243.  
  244.   {Sets Kaypro internal I/O port to address clock}
  245.  
  246.     var
  247.       junk: byte;
  248.  
  249.     begin
  250.       port[rtcs] := $CF;
  251.       port[rtcs] := $E0;
  252.       port[rtcs] := $03;
  253.       junk := inport($14);
  254.     end;
  255.  
  256.   begin
  257.     if clockin then begin
  258.       setupclock;
  259.       repeat
  260.         sec   := inport(2);
  261.         min   := inport(3);
  262.         hour  := inport(4);
  263.         date  := inport(6);
  264.         month := inport(7);
  265.         temp  := inport(2);
  266.       until temp = sec; {Make sure clock hasn't changed during reading}
  267.     end;
  268.   end;
  269. t(7);
  270.         temp  := inport(2);
  271.       until temp = sec; {Make sure clock hasn't changed during reading}
  272.     end;
  273.