home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
intelmdsa.tar.gz
/
intelmdsa.tar
/
md2ker.plm
< prev
next >
Wrap
Text File
|
1988-08-16
|
17KB
|
580 lines
kermit:
do;
declare true literally '0FFH';
declare false literally '00H';
declare port1cmd literally '0F5H';
declare port1dat literally '0F4H';
declare port1clk literally '0F0H';
declare timing1 literally '036H';
declare port2cmd literally '0F7H';
declare port2dat literally '0F6H';
declare port2clk literally '0F1H';
declare timing2 literally '076H';
declare modesel literally '0F3H';
declare reset literally '040H';
declare EnaTxRx literally '025H';
declare tx$rdy literally '01H';
declare rx$rdy literally '02H';
declare null literally '000H';
declare lf literally '0AH';
declare cr literally '0DH';
declare crlf literally 'cr,lf,null';
declare space literally '20H';
declare dollar literally '24H';
declare buflen literally '122';
declare buffer(buflen) byte;
declare (cmdstr, temp, realspeed) address;
declare cmdptr address public;
declare cmd byte;
declare speed byte public;
declare port byte public;
declare driver byte public ;
declare filename address public;
declare buff1 based filename (50) byte;
declare lfilename address public;
declare buff2 based lfilename (50) byte;
declare debug byte public;
/* here are the subroutines */
co: procedure(char)external;
declare char byte;
end co;
ci: procedure byte external;
end ci;
read: procedure(jfn, buf, max, count, status)external;
declare(jfn, buf, max, count, status)address;
end read;
error: procedure(errnum)external;
declare(errnum)address;
end error;
exit: procedure external; end exit;
finish:
procedure byte external;
end finish;
bye:
procedure byte external;
end bye;
connect:
procedure external;
end connect;
send: procedure byte external;
end send;
get: procedure byte external;
end get;
cwd: procedure byte external;
end cwd;
lsend: procedure byte external;
end lsend;
recv: procedure external;
end recv;
newline:
procedure public;
call co(13);
call co(10);
end newline;
spin: procedure(string)address public;
declare string address;
declare char based string byte;
do while (char <> null) and (char < 021H);
string = string + 1;
end;
return string;
end spin;
strcmp: procedure(s1,s2)byte public;
declare(s1,s2)address;
declare c1 based s1 byte;
declare c2 based s2 byte;
declare retval byte;
retval = 0;
s1 = spin(s1);
s2 = spin(s2);
if not(c1 = c2) then retval = c1 - c2;
do while (c1 > 0) and (c2 > 0) and (retval=0);
retval = c1 - c2;
s1 = s1+1;
s2 = s2+1;
end;
return retval;
end strcmp;
/* TOKEN: returns a pointer to a null-terminated token pointed */
/* to prior to the call by cmdptr. after the call, cmdptr points */
/* to the end of the original string, or the first character after */
/* the null character replacing the first whitespace after the first */
/* token. */
token: procedure address public;
declare result address;
declare char based cmdptr byte;
result = 0;
cmdptr = spin(cmdptr);
if char <> null then
do;
result = cmdptr;
do while char > ' ';
cmdptr = cmdptr + 1;
end;
if char <> null then
do;
char = null;
cmdptr = cmdptr + 1;
end;
end;
return result;
end token;
/* to print out a decimal number */
nout: procedure(n) public;
declare n address;
declare (quotient, digit, curr) address;
declare numbuf(20) byte;
declare index byte;
if n = 0 then
do;
call co('0');
return;
end;
index = 1;
do while (n > 0);
digit = n mod 10;
numbuf(index) = digit+030H;
index = index + 1;
n = n / 10;
end;
do while ((index := index - 1) > 0);
call co(numbuf(index));
end;
end nout;
nin: procedure(string) address public;
declare string address;
declare result address;
declare c based string byte;
result = 0;
if (string <> 0) then do;
string = spin(string);
do while (c >= 030H) and (c <= 039H);
result = result * 10 + (c - 030H);
string = string + 1;
end;
end;
return result;
end nin;
print: procedure(msg) public;
declare msg address;
declare c based msg byte;
do while (c > 0) and (c <> '$');
if c = '\' then
call newline;
else
call co(c);
msg = msg + 1;
end;
end print;
/* IOINIT: this routine takes a port number, 0,1 or 2, and a speed in the */
/* range 1-4 and initializes the require port to work at the required speed. */
/* The routine returns no parameters. */
ioinit: procedure;
declare ispeed byte;
declare baud structure (code(4) byte,
mult(4) byte)
data (40H, 10H, 10H, 08H, 0CFH, 0CFH, 0CEH, 0CEH);
ispeed = speed - 1;
if debug then
do;
call newline;
call print(.('initializing serial port',crlf));
end;
do case port;
do;
if debug then call print(.('port 0 initialized',crlf));
end;
do;
if debug then call print(.('port 1 initialized',crlf));
output(port1cmd) = reset;
output(modesel) = timing1;
output(port1clk) = baud.code(ispeed);
output(port1clk) = 0H;
output(port1cmd) = baud.mult(ispeed);
output(port1cmd) = EnaTxRx;
end;
do;
if debug then call print(.('port 2 initialized',crlf));
output(port2cmd) = reset;
output(modesel) = timing2;
output(port2clk) = baud.code(ispeed);
output(port2clk) = 0H;
output(port2cmd) = baud.mult(ispeed);
output(port2cmd) = EnaTxRx;
end;
end;
end ioinit;
usage: procedure;
call print(.('usage: kermit (300|1200|4800|9600) (1|2)',crlf));
call exit;
end usage;
readln: procedure;
declare (count, status) address;
call read(1, .buffer, buflen, .count, .status);
if status > 0 then
do;
call print(.('READLN FAILED',crlf));
call error(status);
call exit;
end;
buffer(count-2) = 0;
cmdptr = .buffer;
end readln;
help: procedure;
call print(.(' HELP MENU $ ',crlf));
call newline;
call newline;
call print(.(' there are 10 commands used in ISIS-Kermit',crlf));
call print(.(' CONNECT connect to the host as a virtual terminal ',crlf));
call print(.(' The format of CONNECT command is ',crlf));
call print(.(' ISIS-Kermit> Connect',crlf));
call newline;
call print(.(' SEND Send files from the MDS to the other Kermit. ',crlf));
call print(.(' The format of SEND command is ',crlf));
call print(.(' ISIS-Kermit> Send Filename.Ext ',crlf));
call newline;
call print(.(' RECEIVE Receive files from the other Kermit ',crlf));
call print(.(' received filename has at most 6 characters ',crlf));
call print(.(' The format of RECEIVE command is ',crlf));
call print(.(' ISIS-Kermit> Receive',crlf));
call newline;
call print(.(' DEBUG Display packet traffic , packet number ',crlf));
call print(.(' packet contents. ',crlf));
call print(.(' The format of DEBUG command is ',crlf));
call print(.(' ISIS-Kermit> Debug',crlf));
call newline;
call print(.(' LSEND send files from the MDS to VAX-KERMIT . ',crlf));
call print(.(' The format of LSEND command is ',crlf));
call print(.(' ISIS-Kermit> LSEND Listfile.Ext ',crlf));
call print(.(' NOTE : Listfile contains the filenames of files ',crlf));
call print(.(' to be send to the VAX ',crlf));
call newline;
call print(.(' GET Get files from the VAX to the MDS ',crlf));
call print(.(' when VAX-KERMIT is in SERVER mode .',crlf));
call print(.(' The format of GET command is ',crlf));
call print(.(' ISIS-Kermit> Get Filename.Ext ',crlf));
call newline;
call print(.(' CWD Change working directory on the VAX ',crlf));
call print(.(' when VAX-KERMIT is in SERVER mode .',crlf));
call print(.(' The format of CWG command is ',crlf));
call print(.(' ISIS-Kermit> CWD [directory] ',crlf));
call newline;
call print(.(' EXIT EXIT ISIS-Kermit ',crlf));
call print(.(' The format of EXIT command is ',crlf));
call print(.(' ISIS-Kermit> Exit ',crlf));
call newline;
call print(.(' FINISH EXIT From VAX-KERMIT ',crlf));
call print(.(' when VAX-KERMIT is in SERVER mode .',crlf));
call print(.(' The format of FINISH command is ',crlf));
call print(.(' ISIS-Kermit> FINISH ',crlf));
call newline;
call print(.(' BYE Log out from VAX ',crlf));
call print(.(' when VAX-KERMIT is in SERVER mode .',crlf));
call print(.(' The format of BYE command is ',crlf));
call print(.(' ISIS-Kermit> BYE ',crlf));
call newline;
call newline;
end help;
/* to specify the disk driver number ( from 0 to 4 ) which will be used for
file transfer */
setdrnum : procedure;
cmdstr = 0;
do while (cmdstr = 0);
call print(.('disk driver number(0|1|2|3|4) ==> ',null));
call readln;
cmdstr = token;
end;
call newline;
if (strcmp(cmdstr,.('0',null)) = 0) then driver = 0;
else
if (strcmp(cmdstr,.('1',null)) = 0) then driver = 1;
else
if (strcmp(cmdstr,.('2',null)) = 0) then driver = 2;
else
if (strcmp(cmdstr,.('3',null)) = 0) then driver = 3;
else
if (strcmp(cmdstr,.('4',null)) = 0) then driver = 4;
else do;
call print(.('error , try again ' ,crlf));
call exit;
end;
end setdrnum;
/* *** main program *** */
Call newline;
Call newline;
debug = false;
call readln;
cmdstr = 0;
do while (cmdstr = 0);
call print(.('input your desired baud rate (300|1200|4800|9600) ',null));
call readln;
cmdstr = token;
end;
call newline;
if (strcmp(cmdstr,.('9600',null)) = 0) then do;
realspeed = 9600;
speed = 4;
end;
else
if (strcmp(cmdstr,.('4800',null)) = 0) then do;
realspeed = 4800;
speed = 3;
end;
else
if (strcmp(cmdstr,.('1200',null)) = 0) then do;
realspeed = 1200;
speed = 2;
end;
else
if (strcmp(cmdstr,.('300',null)) = 0) then do;
realspeed = 300;
speed = 1;
end;
else call usage;
port = 1;
/* read desired baud rate, if supplied */
temp = token;
if temp > 0 then realspeed = nin(temp);
/* get desired port, if supplied */
temp = token;
if temp > 0 then port = nin(temp);
/* make sure there's garbage on the end of the line */
if token > 0 then call usage;
if (port < 1) or (port > 2) then call usage;
call print(.('Serial port ',null));
call nout(port);
call print(.(', Baud rate ',null));
call nout(realspeed);
call newline;
call ioinit;
do while (true);
cmdstr = 0;
do while (cmdstr = 0);
call print(.('ISIS-Kermit>',null));
call readln;
cmdstr = token;
end;
if ((strcmp(cmdstr,.('connect',null)) = 0) or
(strcmp(cmdstr,.('CONNECT',null)) = 0)) then cmd = 1;
else
if ((strcmp(cmdstr,.('send',null)) = 0) or
(strcmp(cmdstr,.('SEND',null)) = 0)) then cmd = 2;
else
if ((strcmp(cmdstr,.('lsend',null)) = 0) or
(strcmp(cmdstr,.('LSEND',null)) = 0)) then cmd = 3;
else
if ((strcmp(cmdstr,.('get',null)) = 0) or
(strcmp(cmdstr,.('GET',null)) = 0)) then cmd = 4;
else
if ((strcmp(cmdstr,.('cwd',null)) = 0) or
(strcmp(cmdstr,.('CWD',null)) = 0)) then cmd = 5;
else
if ((strcmp(cmdstr,.('receive',null)) = 0) or
(strcmp(cmdstr,.('RECEIVE',null)) = 0)) then cmd = 6;
else
if ((strcmp(cmdstr,.('exit',null)) = 0) or
(strcmp(cmdstr,.('EXIT',null)) = 0)) then cmd = 7;
else
if ((strcmp(cmdstr,.('finish',null)) = 0) or
(strcmp(cmdstr,.('FINISH',null)) = 0)) then cmd = 8;
else
if ((strcmp(cmdstr,.('bye',null)) = 0) or
(strcmp(cmdstr,.('BYE',null)) = 0)) then cmd = 9;
else
if ((strcmp(cmdstr,.('debug',null)) = 0) or
(strcmp(cmdstr,.('DEBUG',null)) = 0)) then cmd = 10;
else
if ((strcmp(cmdstr,.('help',null)) = 0) or
(strcmp(cmdstr,.('HELP',null)) = 0)) then cmd = 11;
else cmd = 0;
if ((cmd < 2) or (cmd > 5))then
if token > 0 then
cmd = 0;
do case cmd;
do; /* cmd = 0 */
call print(.('Syntax error',crlf));
end;
do; /* cmd = 1*/
call connect;
end; /* cmd = 1 */
do;/* send files cmd = 2 */
filename = token;
if (filename = 0)
then
call print(.('No files specified',crlf));
else
if send
then
call print(.(cr,lf,'OK',crlf));
else
call print(.('Send failed',crlf));
end; /* send files cmd = 2 */
do;/* send files cmd = 3 */
lfilename = token;
if (lfilename = 0)
then
call print(.('No list of files specified',crlf));
else
if lsend
then
call print(.(cr,lf,' OK ',crlf));
end; /* send files cmd = 3 */
do;/* get cmd = 4 */
filename = token;
if (filename = 0)
then
call print(.('No files specified',crlf));
else do;
call setdrnum;
if get
then
call print(.(cr,lf,'OK',crlf));
else
call print(.('Get failed',crlf));
end;
end; /* get cmd = 4 */
do;/* change directory cmd = 5 */
call newline;
filename = token;
if (filename = 0)
then
call print(.('No directory specified',crlf));
else do;
if cwd
then
call newline;
else
call print(.(' Can not change working directory',crlf));
end;
call newline;
end; /* change directory cmd = 5 */
do; /* receive cmd = 6 */
filename = token;
call setdrnum;
call recv;
call print(.(cr,lf,'OK',crlf));
end; /* receive cmd = 6 */
do; /* exit cmd = 7 */
call exit;
end ; /* exit cmd = 7 */
do; /* finish cmd = 8 */
call newline;
if finish
then
call print(.('end of SERVER mode on VAX-KERMIT ',crlf));
else
call print(.('SERVER mode on VAX ',crlf));
end; /* finish cmd = 8 */
do; /* bye cmd = 9 */
call newline;
if bye
then
call print(.('logout from VAX-VMS ',crlf));
else
call print(.('login VAX-VMS ',crlf));
end; /* bye cmd = 9 */
do; /* debug cmd = 10 */
debug = not debug;
end; /* bye cmd = 10 */
do; /* help cmd = 11 */
call help;
end ;/* help cmd = 11 */
end; /* case cmd */
end;
end kermit;