@string(-hp2vrsn="1.2") @Chapter<HP264x KERMIT (Rover-Kermit)> @Begin<Description,Leftmargin +15,Indent -15,spread 0> @i(Program:)@\John F. Chandler (Harvard/Smithsonian Center for Astrophysics) @i(Language:)@\8080 Assembler @i(Version:)@\@value(-hp2vrsn) @i(Date:)@\August 1987 @i(Documentation:)@\John F. Chandler (CfA) @end<Description> @i<Rover-Kermit Capabilities At A Glance:> @begin<format,leftmargin +2,above 1,below 1> @tabclear()@tabset(3.5inches,4.0inches,4.5inches) Local operation:@\Yes Remote operation:@\No Transfers text files:@\Yes Transfers binary files:@\Yes Wildcard send:@\N/A ^X/^Z interruption:@\Yes Filename collision avoidance:@\N/A Can time out:@\Yes 8th-bit prefixing:@\Yes Repeat count prefixing:@\Yes Alternate block checks:@\Yes Terminal emulation:@\Host Communication settings:@\Host Transmit BREAK:@\Host IBM communication:@\Yes Transaction logging:@\No Session logging (raw download):@\Host Raw upload:@\Host Act as server:@\No Talk to server:@\Yes; SEND, GET, FIN, LOGOUT Advanced commands for servers:@\Yes; GENERIC, HOST, KERMIT Local file management:@\N/A Handle file attributes:@\No Command/init files:@\Host Printer control:@\Host @end<format> @Section<Summary of HP264x-Series Terminals> The 2640-series work stations combine terminal functionality with a variety of programmability and graphics features. The members of the series (all driven by 8080's) share a common set of ROM system entries for display, telecommunications, and device I/O, as well as a built-in loader driven by escape sequences with addresses and data expressed as octal character strings.@index(Loader) The loader is not, however, a linking loader -- it accepts only absolute addresses and data. Various members of the series offer storage devices in the form of cartridge tapes and @Index(Disks)diskettes. However, the diskettes are not used as random access media, rather as fast @Index(Tapes)"tapes". This chapter will speak of all such devices as tapes. The combination of absolute loader and primitive file system tends to push software design toward monolithic programs fitting into preassigned memory regions with immovable, globally known entry vectors. Insofar as the operating system entry vectors are the same among the different members of the series, these restrictions are an advantage in terms of software portability. Another result of these limits is that many customary Kermit functions, such as interactions with the local file system, are infeasible. At the same time, I/O is generally a simple matter for an application program, such as Kermit, since "one call does it all." Rover-Kermit was developed on a 2647, which contains 64K of RAM in addition to 64K of bank-switched ROM. Others in the series generally have no more than 64K total RAM+ROM, and certain system entries will vary accordingly along with the method of calling them. On the 2647, Kermit operates as a memory-resident system extension which can supersede the normal terminal function when needed. The 2647, being highly programmable, can be loaded with alternate state tables to emulate practically any other kind of terminal regardless of whether Kermit is present. The programmability of the others in the series varies -- the 2648, in particular, can not be set up to emulate other terminal types. @Section<Rover-Kermit Description> Since Rover-Kermit runs on a standalone terminal, it is always in control of the screen -- it is always @i<local>@index<Local>. Thus, it always keeps the screen updated with the file name and the packet and retry counts, whether sending or receiving. See below for details of the screen layout. @Index(Interruption)Because it is local, Rover-Kermit also monitors the keyboard and interrupts a file transfer in either direction upon recognizing a CTRL-X or CTRL-Z. As always in such cases, Rover-Kermit can stop unconditionally when sending but must rely on cooperation from the remote Kermit when receiving. @index<Timeout> Rover-Kermit can call a timeout exit from a telecommunications input request and thereby break deadlocks automatically. The timeouts done by Rover-Kermit are "fuzzy" because they depend on the speed of the processor, the verbosity of the operating system code, and on the amount of keyboard activity. For the usual 2-MHz clock rate the timeout should closely approximate that requested by the remote Kermit anywhere up to 64 seconds. However, a request of zero is treated as 64, and requests over 64 are taken modulo 64. The timeout can also be disabled by command. If despite the timeout capability, the transmission appears to be stuck, then manual @Index(Intervention)intervention is probably needed above and beyond the usual response to a timeout (namely to retransmit the last packet or to NAK@Index(NAK) the expected packet to cause the remote host to send it again). In that case, the user may depress the CNTL and both shift keys simultaneously to gain keyboard access to telecommunications. At that point any string of characters up to, and including, a carriage return may be typed at the remote host to prompt further activity. The string will also be echoed locally regardless of the duplex setting. Since Kermit displays all characters transmitted by the remote host (except those within packets), the string will be displayed twice if the remote host also echoes. In any case, the record of the preceding non-packet traffic should indicate what is needed to restart the transmission. If all else fails, the transmission can be @Index(Interruption)halted by pressing the @Index(RESET)"RESET TERMINAL" key. Rover-Kermit will then restart and wait for commands (such as @Index<QUIT>QUIT). One note of warning: halting a transfer to or from tape will result in the abandonment of an entry in the @index(Active File Table) Active File Table. Eventually, the entire table can be filled with abandoned entries, and it will be necessary to @i(Hard Reset)@Index(RESET) the terminal to recover the "lost" entries. @heading<Screen Layout> @Index(Screen) While Rover-Kermit is running, the upper right corner of the screen always shows a list of Kermit commands. The remainder of the top eight lines are used for displaying Kermit's status. Figure @ref(-hp2scr) shows a snapshot of the display after a successful GET. The top line always shows Kermit's version number, and the second line provides a mnemonic label for the third, which displays the data Rover-Kermit will use for Send-Init negotiations. The third line also shows an asterisk under the word Core or Tape to indicate which form of storage is selected, plus the current definitions of the input and output "tape" devices. The fourth line (the Program State line) @Index(Program State) shows the most recent command (or error message from the remote Kermit). The fifth, sixth, and seventh lines show the most recent file transmitted and the packet and retry counts. The eighth line @Index(Message) (the Message line) shows the most recent user prompt or error message, or else the Value-specified parameters after a @Index(PARM)PARM command. The remainder of the screen constitutes a window into the scrolled display workspace of the terminal. Text replies from a remote Server and any non-packet traffic during a transfer are added to the bottom of the workspace. While Rover-Kermit is running, the display can be scrolled by means of the ROLL UP, ROLL DOWN, HOME, and HOME DOWN keys (as during normal operation). @begin<figure,leftmargin +0> @blankspace(1) @bar() @begin(verbatim) Rover Kermit @value(-hp2vrsn) Send, Receive, ... Btpp."8BR Core, Tape, Kermit, ... Parms: ~# @@-#Y1~ Src: L Dst: R * Get File: GOOD.DATA Record: 126 Retries: 0 Transfer done @end(verbatim) @bar() @caption(Screen snapshot after GET command) @tag(-hp2scr) @end(figure) @heading<Rover-Kermit Commands> Rover-Kermit uses a minimal set of commands, each abbreviated to a single letter. Options, if any, will be requested by a subsequent prompt. While you are responding to a prompt, the characters you type will be upcased and displayed on the @Index(Message)Message line, and both DEL and BACKSPACE will back up the cursor and remove the last character from the response string (though not from the display). Other control and function keys will be ignored (except RETURN, which terminates your response). During operation, Rover-Kermit maintains a display of all possible commands (and subcommands where appropriate), but offers no other @Index(HELP)HELP facility. @begin<description,leftmargin +8,indent -8> @Index(SEND)SEND@\Send the current file to the remote Kermit. Kermit will prompt you for the filename, but you need not enter one; if you just type a carriage return, Kermit will use a default name. In the case of a RAM file, the default is the name received with the file. However, for a tape file there is no name available, and the default is "A.B". @Index(RECEIVE)RECEIVE@\Receive file(s) from the remote Kermit. Store them on successive output tape files. Note: if you are receiving into the @Index(RAM file)RAM file, each file received will overwrite any previous one. @Index<GET>GET@\When Rover-Kermit is talking to a Kermit Server on the remote host, you should use the GET command to request the server to send files to you. You will be prompted for the file name. @Index(LOGOUT)LOGOUT@\When talking to a remote Kermit Server, this command shuts down the server and logs it out, and also exits from Rover-Kermit to normal terminal operation. To protect you against inadvertantly striking the "L" key, Kermit prompts you for confirmation of the LOGOUT command. @Index(FINISH)FINISH@\Like LOGOUT, but shuts down the remote server without logging it out. @Index(QUIT)QUIT@\Exit to normal terminal operation. @Index(HOST)@Index(Generic)KERMIT@\Send a command to a remote Kermit Server. You will be prompted for the command type (C for a remote host command, K for a Kermit command, or G for a generic Kermit command) and the text. The command character will not be displayed, but the command will appear on the Message line as you type it. Any reply will be displayed on the screen. @Index(CORE)CORE@\Specifies input/output to the@Index(RAM file) RAM file, up to 32K characters in length. @Index(TAPE)TAPE@\Specifies input/output to the cartridge tape units or other devices. The default device names@index(Device names) under this option are L(eft tape) and R(ight tape) for input and output, respectively, but they may be reversed or set to any of the other possibilities, namely, S(ource), D(estination), G(raphics), N(ull), or U(serio). These represent the SOURCE or DESTINATION assignments in the terminal, the display (graphics for input, alpha for output), a null file, or an optional I/O device. See the terminal documentation for more details. The devices are selected via the PARM command. @Index(SET)@Index(PARM) PARM@\Sets or changes a parameter for Kermit operation. This command is divided into four sub-functions, each in turn abbreviated to a single keystroke (oN, oFf, Char, or Value), and each sub-function can operate on any one of a list of parameters. See below for a detailed description of the parameters and keystroke sequences. @end<description> @Heading<Setting/Changing Parameters> Parameters for Rover-Kermit operation may be set by sequences of keystrokes typed while Kermit is running. Kermit provides a menu of possible options on the Program State line @Index(Program State)to guide in the entry of such sequences. All alphabetic keys are taken as upper case. Sequences consist of at least a "P", a sub-function, and a parameter name. The Value sub-function takes, in addition, a decimal number entered before the parameter name. The number must be entered with no imbedded blanks or commas. The values of all such parameters are displayed (in decimal) on the Message line after a PARM command completes. The Character sub-function, on the other hand, takes a character argument entered after the parameter name. Character parameters are permanently displayed on the third line, but the ON/OFF parameters (other than the eighth-bit flag, which doubles as a character parameter) are not displayed at all. @begin<description,leftmargin +8,indent -8> @Index(Block check type) BLOCK@\PCB<n> sets the block check type to <n>. Available options are 1 and 2. The default is 1. @Index(Buffer length) BUFSZ@\PV<n>B sets Rover-Kermit's buffer length to <n>. The valid range is 20-94, and 94 is the initial value. @Index(Device names) DEST@\PCD<c> sets the output device code to <c>. The default is R, and other possible values are L, S, D, G, N, and U. See also the TAPE command. @Index(Handshake) HNDSHK@\PV<n>H sets the IBM turnaround character to <n>. The default is 17 (XON), but any value 1-31 is valid. @Index(IBM) IBM@\P(N|F)I sets the "IBM" flag. "ON" (the default) means that Rover-Kermit waits for the turnaround character before sending any packets (see HNDSHK above). @Index(Packet character) MARK@\PV<n>M sets the packet start character to <n>. The default is 1 (SOH), but any value 1-31 is valid. @Index(Quote character) QUOTE@\PCQ<c> sets the control quote character to <c>. The default is #. Note: letters may not be used for this character because the command interpreter upcases all keystrokes. @Index(Retry limit) RETRY@\PV<n>R sets the packet retry limit to <n>. The default is 10, but any value 1-199 is valid. @Index(Repeat prefix) RPTQ@\PCR<c> sets the repeat prefix character to <c>. The default is ~. SOURCE@\PCS<c> sets the input device code to <c>. The default is L. Other possible values are R, S, D, G, N, and U. See also the TAPE command. @Index(Timeout) TIME@\PV<n>T sets the timeout limit to <n>. The default is 3, but any value 1-94 is valid. TIMER@\P(N|F)T sets the timer on or off. The default is ON. @Index(Eighth-bit prefix) 8-BIT@\P(N|F)8 sets the 8th bit prefix option on or off. "ON" (the default) permits 8th-bit quoting if the remote Kermit requests it. 8-BIT@\PC8<c> sets the 8th bit prefix character to <c>. Note: letters may not be used for this character because the command interpreter upcases all keystrokes. @end<description> Since Rover-Kermit is permanently resident, its configuration can also be set or examined from without by typing loader sequences or display commands at the operating system. Table @ref<-hp2sets> gives a list of memory locations that may be altered to change the Kermit defaults. Such settings may be combined as desired to obtain any particular configuration, and, since loader commands may come from any source, such commands may be called out from a tape file or sent by the remote host for convenience. Aside from this packaging property and the capacity for setting the I/O to HP-IB devices, these loader commands are obviously less convenient than the usual command sequences. Among other things, they can be executed only when Rover-Kermit is not running. Note: an I/O device code is actually a string ending with a carriage return, stored in a nine-byte array. The carriage return must always follow immediately after the device code. @Index(TIMER)@Index(IBM)@Index(Handshake)@Index(Packet character) @Index(Eighth-bit prefix)@Index(Retry limit)@Index(Quote character) @Index(Repeat prefix)@Index(Device names)@Index(Buffer length) @Index(Timeout)@Index(Block check type) @begin<table,leftmargin +0,use format> @tabclear()@tabset(0.8in,1.6in) @bar() @blankspace(1) @u(Name)@\@ux<Address>@\@ux<Values> BKTP@\106773@\Block check type. Default is 1 (61). BUFSZ@\106732@\Buffer length for INIT. Default is 94. (176). DEST@\107552@\Output device code. Default is R (122). DPTQ@\106725@\Repeat prefix character. Default is ~ (176). HNDSHK@\104144@\IBM turnaround character. Default is XON (21). IBM@\104155@\315 if on, 1 if off. Default is ON. MARK@\105463@\Packet start character. Default is SOH (1). QUOTE@\106720@\Quote character. Default is # (43). RETRY@\105655@\Retry limit. Default is 10. (12). SOURCE@\107605@\Input device code. Default is L (114). TIME@\106741@\Timeout limit for INIT. Default is 3. (43). TIMER@\105116@\312 if on, 332 if off. Default is ON. 8-BIT@\106772@\8th bit quote option. Default is Y (131). @tag<-hp2sets> @caption<Settable locations (addresses and values in octal)> @blankspace(1) @bar() @end<table> For example, to assign the output to a printer on HP-IB#7, enter @Example(<ESC>&c 107552a 110d 43d 67d 15D) To set the output back to the right tape, enter @Example(<ESC>&c 107552a 122d 15D) To set the 8th-bit prefix to lower-case "z", enter @Example(<ESC>&c 106772a 172D) @heading<Error Messages> @Index(Error)@Index(Message) Error messages from Rover-Kermit are largely self-explanatory but brief. For conditions that terminate a file transfer, the same message is both displayed on the screen (on the Message line) and sent to the remote Kermit as an Error packet. In fact, whenever a transfer completes, some message will appear on the Message line, usually accompanied by an audible tone. The beep is suppressed only when a very short file transfer completes normally. @begin<description,leftmargin +21,indent -21> Remote host aborted@\specifies that the remote Kermit issued an error packet. Bad INIT data@\specifies disagreement over the control quote character. I/O error@\specifies a tape I/O error or overflow of the RAM file. Split prefix@\specifies that a byte specification is apparently split between packets. Bad repeat count@\specifies that Rover-Kermit has attempted to decode a non-positive repeat count. Bad packet type@\specifies that Rover-Kermit has received an invalid type of packet. Retry limit - <c>@\specifies that Rover-Kermit has found an error repeatedly up to the retry limit. The last character indicates what kind of error: K => packet out of sequence, N => NAK or ill-formed packet, or T => timeout. No local storage@\specifies that no tape is inserted. @end<description> @section<Rover-Kermit Source language> The Rover-Kermit has been assembled not with a standard 8080 assembler, but with a slightly eccentric one developed on an HP2647. The differences in notation are quite simple, but pervasive. @begin<itemize> A "*" in column 1 denotes a comment. Statement labels are never suffixed with colons. Octal constants are denoted by the suffix "Q". The current location counter is represented by the symbol "*". The operator ":" is used to represent concatenation of two quantities into a two-byte value, low-order byte first. There is a special pseudo-operation "ASCC" for assembling character strings. A string within quotes is assembled into standard ASCII codes. A quotation mark (apostrophe) may be inserted as a pair of quotes in the usual fashion. Control characters may be inserted by including triplets of decimal digits for the desired characters within quotation marks. Unless the string is followed by ",-", the assembler appends a null to the output. For example, @example<@ @ ASCC@ @ 'It''s true!'013''> yields: It's true!<CR><NUL> There is a special pseudo-operation "EJECT" to skip to the next page on the output listing. Quoted character strings are not allowed anywhere except in "ASCC" instructions. There is a function operation "CHAR", which evaluates to the ASCII character value of the next character after the delimiting blank. For example, "CHAR -" evaluates to 55 (octal) and may be used in expressions. There is a function operation "INSTR" which evaluates to the opcode of the symbol after the delimiting blank. For example, "INSTR MOV" evaluates to 100 (octal). @end<itemize> @Section(What's New) The following are the most important of the changes and improvements in release 1.2 of Rover-Kermit. @Begin(itemize) Two-byte checksums. Mnemonic commands for setting parameters. More elaborate display of current settings. ^X/^Z interruption. Retain filespec on RAM file. Display any characters received while waiting for handshake. Fixed bug in creating repeat strings from runs longer than 94. Flush data communication buffer before starting any transaction (except the first in a given session). The ROLL and HOME keys now work for the conversation workspace. @End(itemize) @section<Future Work> Work that could be done in future releases includes: @begin<itemize> Add multi-file transmissions from cartridge tape. Release Active File Blocks in case of error.@index(Active File Table) Add three-@|byte block checks. Encode/decode error packets. Implement "A" packets. @end<itemize>