$TITLE ('SET MODULE') set$module: /* COPYRIGHT (C) 1985, Trustees of Columbia University in the City of New */ /* York. Permission is granted to any individual or institution to use, */ /* copy, or redistribute this software so long as it is not sold for */ /* profit, provided this copyright notice is retained. /* /* Contains the following public routines: sethelp, set */ do; /* SET: Process the several variations of the SET command */ declare port byte external; declare parity byte external; declare debug byte external; declare maxtry byte external; declare escchar byte external; declare halfduplex byte external; /* true or false */ declare warning$flag byte external; /* how to handle dup file names */ declare take$echo byte external; /* true or false */ declare prompt(20) byte external; /* Kermit command prompt */ declare def$prompt(20) byte external; /* Default command prompt */ declare null literally '000H'; declare true literally '0FFH'; declare false literally '00H'; declare def$drive(5) byte external; declare subcmd byte; declare tokptr address; declare (new$drive based tokptr)(4) byte; print: procedure(msg) external; declare msg address; end print; /* SPIN: Searches a string for a character greater than blank */ spin: procedure (string) address external; declare string address; end spin; nout: procedure(n) external; declare n address; end nout; newline: procedure external; end newline; ioinit: procedure external; end ioinit; token: procedure address external; end token; cmdtail: procedure address external; end cmdtail; nin: procedure (string) address external; declare string address; end nin; ready: procedure (port) byte external; declare port byte; end ready; procbaud: procedure (newbaud) byte external; declare newbaud address; end procbaud; putc: procedure (c, port) external; declare (c, port) byte; end putc; getc: procedure (port) byte external; declare port byte; end getc; ctl: procedure(char) byte external; declare char byte; end ctl; co: procedure(char) external; declare char byte; end co; movevar: procedure(offset, source, dest) byte external; declare offset byte; declare (source, dest) address; end movevar; strcmp: procedure (s1,s2) byte external; declare (s1,s2) address; end strcmp; varcmp: procedure (s1,s2) byte external; declare (s1,s2) address; end varcmp; upcase: procedure (addr) external; declare addr address; end upcase; missop: procedure; call print(.('Missing operand\$')); end missop; badop: procedure; call print(.('Invalid or ambiguous operand\$')); end badop; /* ONIN: Octal number input conversion routine */ onin: 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 >= '0') and (c <= '7'); result = result * 8 + (c - '0'); string = string + 1; end; end; return result; end onin; /* Pause for operator input */ pause: procedure; declare c byte; call print(.('Press to continue...$')); c = getc(0); call newline; end pause; set$gen$help: procedure; call print(.('\SET\\$')); call print(.(' The SET command is used to set various KERMIT $')); call print(.('parameters.\\$')); call print(.('Syntax:\\$')); call print(.(' SET option [value]\\$')); call print(.('The SET options are:\\$')); call print(.(' BAUD-RATE DEBUGGING DISK $')); call print(.('DUPLEX ESCAPE PARITY\$')); call print(.(' PORT PROMPT RETRY $')); call print(.('TAKE-ECHO WARNING\\$')); call print(.('You may request information on all of the $')); call print (.('options by entering\\$')); call print(.(' HELP SET ALL\\$')); end set$gen$help; baudhelp: procedure; call print(.('\SET BAUD-RATE\\$')); call print(.(' The BAUD-RATE option of the SET command is used $')); call print(.('to set the communication\$')); call print(.('baud rate.\\$')); call print(.('Syntax:\\$')); call print(.(' SET BAUD-RATE rate\\$')); call print(.('Legal values for "rate" are 110, 150, 300, 600, $')); call print(.('1200, 2400, 4800, 9600,\$')); call print(.('and 19200.\\$')); end baudhelp; debhelp: procedure; call print(.('\SET DEBUGGING\\$')); call print(.(' The DEBUGGING option of the SET command is used $')); call print(.('to control the display\$')); call print(.('of debugging information.\\$')); call print(.('Syntax:\\$')); call print(.(' SET DEBUGGING [ON/OFF]\\$')); call print(.('"SET DEBUGGING ON" will cause various status $')); call print(.('information to be displayed\$')); call print(.('while Kermit is executing.\\$')); end debhelp; diskhelp: procedure; call print(.('\SET DISK\\$')); call print(.(' The DISK option of the SET command is used $')); call print(.('to set or clear the default\$')); call print(.('ISIS disk drive. The default disk drive will be $')); call print(.('prefixed to any ISIS file\$')); call print(.('name which does not already start with a drive.\\$')); call print(.('Syntax:\\$')); call print(.(' SET DISK [:Fn:]\$')); call print(.(' or\$')); call print(.(' SET DISK [n]\\$')); call print(.('The letter "n" above must be a digit (i.e., $')); call print(.('between 0 and 9). If the disk\$')); call print(.('specification is omitted, there will be no default $')); call print(.('disk.\\$')); end diskhelp; duplhelp: procedure; call print(.('\SET DUPLEX\\$')); call print(.(' The DUPLEX option of the SET command controls $')); call print(.('the display at the local\$')); call print(.('system of characters entered during CONNECT mode.\\$')); call print(.('Syntax:\\$')); call print(.(' SET DUPLEX [FULL/HALF]\\$')); call print(.('Use FULL when the remote system echoes the $')); call print(.('characters you type. Use HALF\$')); call print(.('to get the local Kermit to echo them. Half duplex $')); call print(.('is also called "local echo".\\$')); end duplhelp; eschelp: procedure; call print(.('\SET ESCAPE\\$')); call print(.(' The ESCAPE option of the SET command is used $')); call print(.('to change the escape character\$')); call print(.('for CONNECT mode.\\$')); call print(.('Syntax:\\$')); call print(.(' SET ESCAPE [octal_value]\\$')); call print(.('If the new value is not entered with the command, $')); call print(.('you will be prompted for the\$')); call print(.('new escape character, which you enter literally.\\$')); end eschelp; parhelp: procedure; call print(.('\SET PARITY\\$')); call print(.(' The PARITY option of the SET command is used $')); call print(.('to set the communication\$')); call print(.('parity.\\$')); call print(.('Syntax:\\$')); call print(.(' SET PARITY parity\\$')); call print(.('Legal values for "parity" are NONE, MARK, SPACE, $')); call print(.('EVEN, and NONE.\\$')); end parhelp; porthelp: procedure; call print(.('\SET PORT\\$')); call print(.(' The PORT option of the SET command is used $')); call print(.('to change the I/O port.\\$')); call print(.('Syntax:\\$')); call print(.(' SET PORT port#\\$')); call print(.('Permitted values for "port#" are 1 and 2.\\$')); end porthelp; promhelp: procedure; call print(.('\SET PROMPT\\$')); call print(.(' The PROMPT option of the SET command is used $')); call print(.('to specify the Kermit command prompt.\\$')); call print(.('Syntax:\\$')); call print(.(' SET PROMPT [prompt-string]\\$')); call print(.('The prompt string is limited to 20 characters. $')); call print(.('If no prompt string is entered,\$')); call print(.('the prompt is reset to the original value, "$')); call print(.def$prompt); call print(.('".\\$')); end promhelp; rethelp: procedure; call print(.('\SET RETRY\\$')); call print(.(' The RETRY option of the SET command is used $')); call print(.('to change the number of\$')); call print(.('times that Kermit will retry packet transmission $')); call print(.('before giving up.\\$')); call print(.('Syntax:\\$')); call print(.(' SET RETRY n\\$')); call print(.('Permitted values for "n" are 1 through 255.\\$')); end rethelp; takehelp: procedure; call print(.('\SET TAKE-ECHO\\$')); call print(.(' The TAKE-ECHO option of the SET command is used $')); call print(.('to control the display\$')); call print(.('of commands read from the "TAKE" file.\\$')); call print(.('Syntax:\\$')); call print(.(' SET TAKE-ECHO [ON/OFF]\\$')); call print(.('"SET TAKE-ECHO ON" will cause commands read $')); call print(.('from the "TAKE" file to be\$')); call print(.('displayed on the console.\\$')); end takehelp; warnhelp: procedure; call print(.('\SET WARNING\\$')); call print(.(' The WARNING option of the SET command is used $')); call print(.('to control the handling\$')); call print(.('of local file name conflicts.\\$')); call print(.('Syntax:\\$')); call print(.(' SET WARNING [ON/OFF]\\$')); call print(.('"SET WARNING ON" will cause a warning message $')); call print(.('to be issued when an incoming\$')); call print(.('file has the same name as an existing local file. $')); call print(.('Kermit will then rename the\$')); call print(.('incoming file. "SET WARNING OFF" will cause Kermit $')); call print(.('to overwrite the existing\$')); call print(.('file.\\$')); end warnhelp; /* Display help for the SET command */ sethelp:procedure public; tokptr = token; if tokptr = 0 then call set$gen$help; else do; call upcase(tokptr); /* Convert to uppercase */ if (varcmp(tokptr,.('ALL',null)) >= 1) then do; call baudhelp; call pause; call debhelp; call pause; call diskhelp; call pause; call duplhelp; call pause; call eschelp; call pause; call parhelp; call pause; call porthelp; call pause; call promhelp; call pause; call rethelp; call pause; call takehelp; call pause; call warnhelp; end; else if (varcmp(tokptr,.('BAUD-RATE',null)) >= 1) then call baudhelp; else if (varcmp(tokptr,.('DEBUGGING',null)) >= 2) then call debhelp; else if (varcmp(tokptr,.('DISK',null)) >= 2) then call diskhelp; else if (varcmp(tokptr,.('DUPLEX',null)) >= 2) then call duplhelp; else if (varcmp(tokptr,.('ESCAPE',null)) >= 1) then call eschelp; else if (varcmp(tokptr,.('PARITY',null)) >= 2) then call parhelp; else if (varcmp(tokptr,.('PORT',null)) >= 2) then call porthelp; else if (varcmp(tokptr,.('PROMPT',null)) >= 2) then call promhelp; else if (varcmp(tokptr,.('RETRY',null)) >= 1) then call rethelp; else if (varcmp(tokptr,.('TAKE-ECHO',null)) >= 1) then call takehelp; else if (varcmp(tokptr,.('WARNING',null)) >= 1) then call warnhelp; else do; call badop; call set$gen$help; end; end; end sethelp; set: procedure public; declare newport byte; declare newbaud address; declare newtry address; declare newesc byte; declare offset byte; tokptr = token; if tokptr = 0 then do; call missop; subcmd = 0; end; else do; call upcase(tokptr); /* Convert to uppercase */ if (varcmp(tokptr,.('BAUD-RATE',null)) >= 1) then subcmd = 1; else if (varcmp(tokptr,.('DEBUGGING',null)) >= 2) then subcmd = 2; else if (varcmp(tokptr,.('DISK',null)) >= 2) then subcmd = 3; else if (varcmp(tokptr,.('DUPLEX',null)) >= 2) then subcmd = 4; else if (varcmp(tokptr,.('ESCAPE',null)) >= 1) then subcmd = 5; else if (varcmp(tokptr,.('PARITY',null)) >= 2) then subcmd = 6; else if (varcmp(tokptr,.('PORT',null)) >= 2) then subcmd = 7; else if (varcmp(tokptr,.('PROMPT',null)) >= 2) then subcmd = 8; else if (varcmp(tokptr,.('RETRY',null)) >= 1) then subcmd = 9; else if (varcmp(tokptr,.('TAKE-ECHO',null)) >= 1) then subcmd = 10; else if (varcmp(tokptr,.('WARNING',null)) >= 1) then subcmd = 11; else do; call badop; subcmd = 0; end; end; do case subcmd; /* 0 = illegal subcommand */ do; /* Error already reported */ end; /* 1 = BAUD-RATE subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then call missop; else do; newbaud = nin(tokptr); if (procbaud(newbaud) = true) then call ioinit; else call print(.('Invalid baud rate value entered\$')); end; end; /* 2 = DEBUGGING subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then call missop; else do; call upcase(tokptr); /* Convert to uppercase */ if (varcmp(tokptr,.('ON',null)) >= 2) then debug = true; else if (varcmp(tokptr,.('OFF',null)) >= 2) then debug = false; else call badop; end; end; /* 3 = DISK subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then def$drive(0) = null; /* reset to "no default" */ else do; call upcase(tokptr); /* Convert to uppercase */ if (new$drive(0) >= '0' and new$drive(0) <= '9' and new$drive(1) = null) then do; /* User entered a single digit */ call move(5,.(':F0:',null),.def$drive); def$drive(2) = new$drive(0); end; else if (new$drive(0) = ':' and new$drive(1) = 'F' and new$drive(2) >= '0' and new$drive(2) <= '9' and new$drive(3) = ':' and new$drive(4) = null) then /* User entered a full drive specification */ call move(4,tokptr,.def$drive); else call badop; end; end; /* 4 = DUPLEX subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then call missop; else do; call upcase(tokptr); /* Convert to uppercase */ if (varcmp(tokptr,.('HALF',null)) >= 1) then halfduplex = true; else if (varcmp(tokptr,.('FULL',null)) >= 1) then halfduplex = false; else call badop; end; end; /* 5 = ESCAPE subcommand */ do; tokptr = token; /* Get the operand */ if tokptr <> 0 then do; /* escape character value entered */ newesc = onin(tokptr); /* capture as octal value */ if (newesc > 0 and newesc <= 255) then escchar = newesc; else call print(.('Invalid escape character value entered\$')); end; else do; /* no value entered */ call print(.('Enter new escape character: $')); escchar = getc(0); /* read from console */ call newline; end; end; /* 6 = PARITY subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then call missop; else do; call upcase(tokptr); /* Convert to uppercase */ if (varcmp(tokptr,.('NONE',null)) >= 1) then parity = 0; else if (varcmp(tokptr,.('MARK',null)) >= 1) then parity = 1; else if (varcmp(tokptr,.('SPACE',null)) >= 1) then parity = 2; else if (varcmp(tokptr,.('EVEN',null)) >= 1) then parity = 3; else if (varcmp(tokptr,.('ODD',null)) >= 1) then parity = 4; else call badop; call ioinit; end; end; /* 7 = PORT subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then call missop; else do; newport = nin(tokptr); if (newport = 1 or newport = 2) then do; port = newport; call ioinit; end; else call print(.('Invalid port value entered\$')); end; end; /* 8 = PROMPT subcommand */ do; tokptr = cmdtail; /* Get the rest of the command line */ if tokptr = 0 then offset = movevar(0,.def$prompt,.prompt); else offset = movevar(0,tokptr,.prompt); end; /* 9 = RETRY subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then call missop; else do; newtry = nin(tokptr); if (newtry > 0 and newtry < 256) then maxtry = newtry; else call print(.('Invalid retry value entered$\')); end; end; /* 10 = TAKE-ECHO subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then call missop; else do; call upcase(tokptr); /* Convert to uppercase */ if (varcmp(tokptr,.('ON',null)) >= 2) then take$echo = true; else if (varcmp(tokptr,.('OFF',null)) >= 2) then take$echo = false; else call badop; end; end; /* 11 = WARNING subcommand */ do; tokptr = token; /* Get the operand */ if tokptr = 0 then call missop; else do; call upcase(tokptr); /* Convert to uppercase */ if (varcmp(tokptr,.('ON',null)) >= 2) then warning$flag = true; else if (varcmp(tokptr,.('OFF',null)) >= 2) then warning$flag = false; else call badop; end; end; end; end set; end set$module;