File QL2KER.DOC
---------------
                        Kermit for the Sinclair QL
                        --------------------------

 AUTHOR       : David Harper
                Dept of Applied Maths and Theoretical Physics
                The University
                P.O. Box 147
                Liverpool  L69 3BX

 EMAIL        : SX36 at UK.AC.LIVERPOOL.IBM

 OPERATING
 SYSTEM       : QDOS (Sinclair QL and derivatives)

 LANGUAGE     : BCPL (Metacomco)

 DATE         : 29 May   1987


 (1) Generating the EXECable program

 This version of QL Kermit is written in BCPL and should be compiled using
 Metacomco's BCPL Development Kit

 There are four source files. They should be renamed as follows (assuming
 that you have disc drives - if not, change FLP to MDV).


     File                 QDOS name               Purpose

  QL2KER.BCP          FLP2_KERMAIN_BCPL      Command parser & executive

  QL2SET.BCP          FLP2_KERSET_BCPL       Handles the SET command

  QL2PRO.BCP          FLP2_KERPROTO_BCPL     Kermit protocol routines

  QL2HDR.BCP          FLP2_KERHDR            Header file - defines globals
                                              and manifest constants


  The header file is imbedded in each of the other three files using the
  BCPL GET directive. Within KERMAIN, KERSET and KERPROTO it is referred
  to as FLP2_KERHDR so if you are using microdrives, you should edit
  each of the three files and change the line

  GET "FLP2_KERHDR"

  to

  GET "MDV2_KERHDR"


  To construct the EXECable program, compile the files KERMAIN, KERSET
  and KERPROTO then use the linker 'BLINK' to join their object code
  files together. The result is a program which can be run under QDOS
  in tandem with other tasks, using QDOS's multi-tasking capability.
  I use the name FLP2_KERMIT_EXE for the EXECable file.



***** NOTE : Metacomco BCPL Development Kit versions 1.nn *****************
*                                                                         *
*  If you don't have a copy of version 2.0 (or later) of Metacomco's      *
*  BCPL compiler, you will need to assemble the file 'qtrap_asm' and      *
*  link it with the other object code files. You should alter the         *
*  header file 'kerhdr' to include a suitable global reference to qtrap.  *
*  Dr Alex Finch's version of qtrap has global number 276 so you should   *
*  include                                                                *
*                                                                         *
*               GLOBAL $( qtrap : 276 $)                                  *
*                                                                         *
*  in 'kerhdr' at some point, or add it to the existing global list.      *
*                                                                         *
*  Versions from 2.0 have qtrap as part of the BCPL library at global 101 *
*  and so they don't require this extra file.                             *
*                                                                         *
***************************************************************************

 (2) Running Kermit

  To run the task, use

  EXEC FLP2_KERMIT_EXE


  You can use EXEC_W if you prefer, but Kermit will run quite happily
  alongside other tasks as long as they don't demand too large a share
  of processor time. Besides, since Kermit doesn't support QDOS commands
  such as DIR, it is useful to be able to switch to SuperBasic for a moment
  to issue such commands directly. This doesn't interfere with Kermit
  in any way, and you can even do it while Kermit is engaged in file-transfer.


  When Kermit is expecting a command, you will see the prompt

  QL-Kermit (Local) >

  and the cursor should be flashing just after the '>'. (If the cursor is
  somewhere else on the screen, e.g. the SuperBasic command window, use
  Control-C to switch between tasks until the Kermit cursor begins to flash.)


 (3) Kermit commands

  Kermit recognises the following commands :

  HELP                                 Lists all recognised commands, with
                                        any operands.


  HELP SET                             List all the settable options


  EXIT )                               End the Kermit task i.e. remove it from
  END  )                                QDOS


  SET <parameter> <value>              Alter one of the settable options -
                                        see next section.


  SHOW                                 Show the values of some of the settable
                                        options.


  SERVER                               Enter server mode operation


  CONNECT                              Open the serial communication line


  DISCONN                              Close the serial communication line
                                        (use this when you wish to change
                                        the line attributes e.g. parity)


  TAKE <local filename>                Take Kermit commands from a file



  SEND <local-file> <remote-file>      Send a file to a remote Kermit


  GET  <remote-file> <local-file>      Fetch a file from a remote serving
                                        Kermit


  RECEIVE <local-file>                 Receive a file from a remote Kermit


  FINISH                               Issue a FINISH command to a remote
                                        serving Kermit.



 (4) Options of the SET command

  The SET command recognises the following options. (*) means that I haven't
  yet implemented this option e.g. block-check type. Items in square brackets
  [ ... ] are optional. N is any non-negative number. CHAR is a single
  character.


  Option           Values                           Notes
  ------           ------                           -----

  BLOCK-CHECK      (*)

  DEBUG            ON [filename] | OFF [CLOSE]      See note 2

  DELAY            N  (less than 60)

  8BIT-PREFIX      ON | OFF                         Do we do 8th-bit prefixing

  END-OF-LINE      CR | LF                          The character we recognise
                                                    as end-of-line

  ESCAPE-CHAR      F1 | F2 | F3 | F4 | F5 |         Key to escape from terminal
                   ESC | CTRL-ESC                   emulation back to Kermit
                                                    command mode

  FLOW-CONTROL     (*)

  HANDSHAKE        CTS | XON | NONE                 Type of handshaking to do
                                                    with the other Kermit. See
                                                    note 3.

  LOG              (*)

  MARKER           N  (0 <= N < 27)                 Start-of-packet character

  PACKET-LENGTH    N  (30 < N < 93)                 Largest packet we want to
                                                    receive


  PADDING          N                                Number of padding chara-
                                                    cters we need to receive

  PAD-CHAR         N  (0 <= N < 32)                 The padding character we
                                                    need to receive

  PARITY           EVEN | ODD | MARK | SPACE |      See note 4
                   NONE


  PAUSE            N

  PREFIX           CHAR                             The character we propose
                                                    to use for 8th-bit prefix

  REPEAT-COUNT     (*)


  RETRY            N                                Our retry threshold

  TIMEOUT          N                                Interval after which we
                                                    should be timed-out


  LINE             1 | 2                            To select port SER1 or SER2
                                                    See note 5

  DIR              (*)

  OVERWRITE        (*)

  BAUD             75 | 150 | 300 | 600 | 1200 |    Baud rate. See note 6
                   2400 | 4800 | 9600


 TERMINAL-TYPE     (*)

 INTERFACE         NONE | RAW | QCONNECT            Type of interface hardware
                                                    in use. See note 1.

 TAKE-ECHO         ON | OFF                         Whether we echo commands
                                                    from TAKE files to the
                                                    screen.




 Notes
 -----

 1. Kermit includes routines to enable it to communicate via the Tandata
  QConnect communications module. This 'little black box' is particularly
  useful in implementing  XON/XOFF handshaking to allow the QL to work
  with mainframes and packet-switch systems (eg Gandalf PACX) that simply
  don't use hardware CTS/RTS handshaking. The QL's serial ports only have
  CTS/RTS capability, and I haven't written any cunning XON/XOFF-handling
  code into Kermit. So if your mainframe uses XON/XOFF, a QConnect box
  might be a good investment. As an added bonus, it comes with a rather
  good  VT100 emulator - Kermit only has glass-teletype at the moment !

 2. The debugging facility writes out details of each packet as it is
  received or sent, plus timeouts (if they occur) and each attempt to
  open a file. By default, debugging reports are sent to the screen
  and may be enabled using SET DEBUG ON and disabled using SET DEBUG OFF.
  However, if you wish to direct the reports to a file, use the form

  SET DEBUG ON file-name

  After this, SET DEBUG ON/OFF enables or disables reporting to that file,
  which remains open. To close a debugging  file, use

  SET DEBUG OFF CLOSE

  This closes the current debugging file (unless debugging is to the screen -
  we don't want to close the screen channel !) and disables debugging. A
  subsequent SET DEBUG ON will output to the screen.

  You may open a new debugging file without closing the previous one. For
  example

  SET DEBUG ON flp2_debug_file1
  ...
  ...
  ...
  SET DEBUG ON flp2_debug_file2

  In this case, flp2_debug_file1 will still be open but Kermit has forgotten
  its channel ID so it can't close it. It will remain open until you stop
  the Kermit job, whereupon QDOS closes all outstanding open files as part
  of its housekeeping.

 3. In the absence of a Tandata QConnect module (Note 1 above), the option
  SET HANDSHAKE XON cannot be honoured, so you shouldn't use it. When using
  raw (i.e. no little black boxes) communications, choose CTS or NONE.

 4. The Tandata QConnect box cannot operate using MARK or SPACE parity.

 5. The QL has two RS232 ports, SER1 and SER2. One of them is configured
  as DTE and the other as DCE. In practical terms this means that you should
  use SER2 (SET LINE 2) if you want to communicate  with a mainframe and
  SER1 (SET LINE 1) if you are Kermitting with another micro which thinks
  that it is a terminal. The Tandata QConnect box will only plug in to SER2,
  so SET INTERFACE QCONNECT and SET LINE 2 must be issued together.

  When I link  my QL with a BBC micro, the Beeb's RS423 socket is connected
  to the the QL's SER1 socket  (via two adaptor leads and a female-female
  gender changer - why do I use two micros that have non-standard serial
  comms hardware ?!).

 6. The QL supports these baud rates : 75, 300, 600, 1200, 2400, 4800, 9600

  If you are using a Tandata QConnect box, the baud rates are 150, 300, 600,
  1200, 2400, 4800, 9600



 (5) General notes about using Kermit


  TERMINAL EMULATION

  Most people will want to use Kermit to transfer files to/from mainframes.
  A simple teletype terminal-emulator is included to allow you to call the
  remote system. If you are using a QConnect box, don't worry about the
  strange message which appears (in red) when you issue the CONNECT
  command. It is simply telling you the command string which it has sent to
  QConnect to set up the connection.


  The terminal emulator will print out any ASCII character in the range 32 to
  126. It interprets a CRLF sequence from the remote system as a single LF,
  which is the QDOS newline character. Backspace (ASCII 08 dec) moves the
  cursor one space to the left and formfeed (ASCII 12 dec) clears the screen.
  Bell (ASCII 07 dec) causes the message '<beep>' to appear (in red) on the
  screen. Any other character in the range 0 to 31 is displayed in the form
  '<#Xnn>' where nn is the hexadecimal representation of the number.
  As far as Bell is concerned, I will probably make this trigger the QDOS
  BEEP routine in the next release.

  The  QL sends all ASCII characters from 0 to 127 (though ASCII 03, CTRL-C,
  can never be sent because it is the key used by QDOS to switch from  one
  task to another). The cursor keys and function keys are ignored, except
  for Left and CTRL-Left which both generate ASCII DEL (127 dec) - so
  CTRL-Left can be used as the delete key just as it is during QDOS buffered
  terminal input.

  The key to be used to escape from terminal emulation back to Kermit command
  mode can be altered using the SET ESCAPE option. To begin with, it is
  the ESC key, but your mainframe might require that you use this key so
  the next best alternative is probably F1 or one of the other function keys.


  FILE TRANSFER

  The status reports during file transfer are fairly basic. Kermit prints
  a message to indicate that it is sending/receiving a file, with the
  name of the file. During transfer, it prints a full-stop '.' after every
  5th packet it receives successfully, but for every packet which it fails
  to receive (either because it timed out, or because the received packet
  was incorrect in some way) it prints out a percent symbol '%'

  A successful file transfer might look like this :



  QL-Kermit (Local) > RECEIVE flp2_datafile1

      Receiving file flp2_datafile1
      ......................

  QL-Kermit (Local) >


  while a transfer which suffered one or two hiccups might appear as


  QL-Kermit (Local) > RECEIVE flp2_datafile1

      Receiving file flp2_datafile1
      .........%....%%.......

  QL-Kermit (Local) >


  Here, three errors occurred but since there are twenty full-stops, the
  average is three errors for 100 packets successfully received so it's
  not as alarming as it might appear.


  SERVER MODE

  Kermit can operate as a server. This is useful when transferring files to
  and from another micro. Kermit recognises two generic exit commands,
  FINISH and LOGOUT. FINISH returns Kermit to the state where it is waiting
  for input from the QL keyboard, while LOGOUT can be used to terminate
  the Kermit task from the other micro.

  Debugging can be carried out in server mode, and status reporting to the
  QL console screen is carried out as in non-server mode.


  TANDATA QCONNECT

  The QConnect device has a few idiosyncracies which affect Kermit. The
  technical information provided by Tandata in the user manual is
  brief and difficult to understand. Some of the things that the manual
  claims QConnect can do are in error - for example, the QL <-> QConnect
  serial line can only operate at 9600 baud. When the QConnect <-> remote
  line is working at a lower speed, this causes serious buffering problems
  inside the QConnect when the QL sends a burst of more than 20 bytes -
  in practise, this means that files can be received by QL-Kermit at any
  baud rate (when it only has to send short packets), but QL-Kermit can
  only send files via a QConnect at 9600 baud. At lower speeds, data packets
  become garbled as they pass through the QConnect.

  Terminal emulation works at lower speeds, however. Perversely,
  the terminal emulation code is a little slow and operation at
  9600 baud sometimes encounters framing errors. I'm afraid that
  4800 is the maximum reliable speed for terminal emulation, but
  file-transfer can only be done at 9600.

  This situation  reflects a design flaw in the QConnect and I shall be
  taking it up with Tandata in the near future. I hope that a subsequent
  release of QL-Kermit will be able to make use of an improved QConnect !


  FILES and QDOS

  Kermit doesn't (at present) do any clever file-name translation when it
  is in server mode and it receives a file name in an R or F packet from
  the other Kermit. So the other Kermit must use full QDOS filenames in
  its SEND and GET commands. I know that this is contrary to the guidelines
  on file nomenclature in the protocol since the file names must contain
  underscores - I'll amend the next release so that underscores can be
  replaced by full-stops. For example, flp2_data_file ought to be sent in
  an R or F packet as flp2.data.file

  Kermit will not overwrite an existing file - the transfer is abandoned
  as if the file name were unacceptable to QDOS. This is where it is
  particularly useful to multi-task Kermit so you can switch to SuperBasic
  to check the directory and delete files.

  I haven't tried to use Kermit with microdrives - it works very well with
  disc drives and RAMdisc, but I will include software buffering in the
  next release so that an entire file can be loaded into a buffer on the
  QL to avoid having to read repeatedly from microdrives. In an ideal world,
  QDOS would be able to do this automatically but the microdrives are
  notoriously slow.


  CATASTROPHES

  Kermit is still imperfect. I'm sure that users can find some way of
  crashing it - at least, I hope so because it means that I can (hopefully)
  correct the error. One or two QDOS errors will prove fatal to Kermit.
  For example, if it is unable to open a serial line (or to close it !),
  this will be detected in the software and Kermit will shut itself down
  with (usually) a message to explain why.

  Some catastrophes are unforeseen  by the program, but they may be picked
  up by the BCPL run-time system. If this happens, the BCPL routine called
  ABORT is called (by BCPL itself, not by Kermit) and a traceback of all
  calling routines is printed  to the screen. The most useful information
  here is the list of the routine names - they appear as the first (non-
  numeric) item on each line and are generally 7 characters long. (The
  run-time system only stores the first 7 characters of each routine name
  for the purpose of error tracing.)

  If Kermit stops with an error report, make a note of what is on the screen
  and (if possible) what Kermit was supposed to be doing when it failed.
  I'd be interested to hear about this.

  (On a slightly mischievous note : you can make the BCPL run-time system
  do an ABORT by typing                     ----

    SET TAKE-ECHO ON

  This is a known bug, but I'm afraid I don't know how to solve it !)



  ACKNOWLEDGEMENTS  (Not the Kermit kind !)

  Several individuals and companies have helped in the production of this
  Kermit and deserve credit.

  First of all, C.G.Selwyn wrote the original version for the Tripos operating
  system. I take responsibility for all of the errors I may have introduced
  into his program in the course of converting it to work under QDOS.
  My thanks to  Mr Selwyn, and to Icarus Sparry of the Microcomputer Unit
  at Bath University who sent me the original program.

  Dr Alex Finch of the Physics Dept at Lancaster University wrote the
  assembler version of the routine 'qtrap' which is needed to compile
  Kermit using Metacomco's BCPL Development Kit prior to version 2.0

  Thanks also to Tandata Marketing Ltd who provided me with the source code
  of their communications package which drives the QConnect device. Their
  programs helped me to understand how the device should be used with
  Kermit.

  Many thanks to Metacomco for sending me a pre-release copy of version 2.0
  of their BCPL development system. This includes a very useful library
  routine for invoking QDOS traps directly.

  Finally, thanks to Mike Lewis of Liverpool University Computer Lab for
  arranging the loan of a line-monitor to me while I was trying to
  understand why the QL/QConnect couldn't send files properly. The line
  monitor proved to be a very useful tool.