Date : Sun, 14 Apr 1985 10:46:17-MST
From : Jim Forrest <JFORREST@SIMTEL20.ARPA>
Subject: Help needed - TURBO & Anchor XII (Long)
A friend has a Kaypro10 (like mine) and has an Anchor XII modem. His BBS users
are unable to get in at 300 Baud with the following routine, although it
works at 1200 baud and works on a Hayes at 300/1200 fine. Greatly need help.
Jim
begin
mem[$FF7C] := t[0];
mem[$FF7D] := t[1];
mem[$FF7E] := t[2];
mem[$FF7F] := pred(t[3]);
mem[$FF80] := pred(t[4]);
mem[$FF81] := t[5]
end;
const
{ Machine specific constants }
DataPort = $04; { Data port }
StatusPort = $06; { Status port }
RatePort = $00; { Data rate (bps) port }
{ StatusPort commands }
RESCHN = $18; { reset channel }
RESSTA = $10; { reset ext/status }
WRREG1 = $00; { value to write to register 1 }
WRREG3 = $C1; { 8 bits/char, rx enable }
WRREG4 = $44; { 16x, 1 stop bit, no parity }
DTROFF = $68; { dtr off, rts off }
DTRON = $EA; { dtr on, 8 bits/char, tx enable, rts on }
ONINS = $30; { error reset }
{ StatusPort status masks }
DAV = $01; { data available }
TRDY = $04; { transmit buffer empty }
DCD = $08; { data carrier detect }
PE = $10; { parity error }
OE = $20; { overrun error }
FE = $40; { framing error }
ERR = $60; { parity, overrun and framing error }
{ Smartmodem result codes }
OKAY = '0'; { Command executed with no errors }
CONNECT300 = '1'; { Carrier detect at 300 bps }
RING = '2'; { Ring signal detected }
NOCARRIER = '3'; { Carrier lost or never heard }
ERROR = '4'; { Error in command execution }
CONNECT1200 = '5'; { Carrier detect at 1200 bps }
{ Rate setting commands }
BD300 = 5; { 300 bps }
BD1200 = 7; { 1200 bps }
function mdcarck: boolean;
{ Check to see if carrier is present }
begin
port[StatusPort] := RESSTA;
mdcarck := ((DCD and port[StatusPort]) <> 0)
end;
function mdinprdy: boolean;
{ Check for ready to input from modem }
var
bt: byte;
begin
if (DAV and port[StatusPort]) <> 0
then
begin
port[StatusPort] := 1;
if (ERR and port[StatusPort]) <> 0
then
begin
port[StatusPort] := ONINS;
bt := port[DataPort];
mdinprdy := FALSE
end
else mdinprdy := TRUE
end
else mdinprdy := FALSE
end;
function mdinp: byte;
{ Input a byte from modem - no wait - assumed ready }
begin
mdinp := port[DataPort]
end;
procedure mdout(b: byte);
{ Output a byte to modem - wait until ready }
begin
repeat
until (TRDY and port[StatusPort]) <> 0;
port[DataPort] := b
end;
procedure mdinit;
{ Initialize the sio channel and the Hayes Smartmodem 1200 }
const
sio_init: array[1..9] of byte = (RESCHN, 4, WRREG4, 1, WRREG1, 3, WRREG3,
5, DTROFF);
var
i: integer;
mdm_attn : string[2];
mdm_init : string[41];
bt : byte;
begin
for i := 1 to 9 do
port[StatusPort] := sio_init[i]; { initialize the SIO channel }
port[StatusPort] := 5; { pull DTR high }
port[StatusPort] := DTRON;
mdm_attn := 'AT';
mdm_init := 'ATE0Q0V0M0X1 S0=0 S2=3 S4=255 S5=255';
port[RatePort] := BD1200; {set the 8116 to 1200 baud}
delay (500); {let the modem settle for a bit}
for i := 1 to 2 do
begin
bt := ord(mdm_attn[i]); {force the modem to 1200 baud}
mdout(bt)
end;
bt := ord(CR);
mdout(bt);
delay (2000); {wait a sec...}
for i := 1 to 41 do
begin
bt := ord(mdm_init[i]); {initialize the modem}
mdout(bt)
end;
bt := ord(CR);
mdout(bt);
bt := mdinp; { clear any previous rings }
bt := mdinp
end;
function mdring: boolean;
{ Determine if the phone is ringing }
begin
if mdinprdy
then mdring := (RING = chr(mdinp))
else mdring := FALSE
end;
procedure mdhangup;
{ Hangup modem }
var
i : integer;
mdm_hang : string[4];
bt : byte;
begin
repeat
port[StatusPort] := 5; { setup to write register 5 }
port[StatusPort] := DTROFF; { clear DTR, causing hangup }
delay(2000);
port[StatusPort] := 5;
port[StatusPort] := DTRON;
if mdcarck
then
begin
mdm_hang := 'ATH0';
for i := 1 to 3 do
begin
bt := ord(ETX);
mdout(bt)
end;
delay(1500);
for i := 1 to 4 do
begin
bt := ord(mdm_hang[i]);
mdout(bt)
end;
bt := ord(CR);
mdout(bt)
end;
until not(mdcarck)
end;
procedure mdans;
{ Detect and set system to rate at which modem answered phone }
var
mdm_answ : string[3];
code : char;
i : integer;
bt : byte;
begin
repeat
until mdinprdy;
bt := mdinp;
mdm_answ := 'ATA';
for i := 1 to 3 do
begin
bt := ord(mdm_answ[i]);
mdout(bt)
end;
bt := ord(CR);
mdout(bt);
repeat
until mdinprdy;
code := chr(mdinp);
if code = CONNECT1200
then
begin
port[RatePort] := BD1200;
rate := 0.02075;
delay(500);
bt := mdinp;
bt := mdinp
end;
if code = CONNECT300
then
begin
port[RatePort] := BD300;
rate := 0.083;
delay(500);
bt := mdinp;
bt := mdinp
end;
if code = NOCARRIER
then mdhangup
end;