+
                                  -1-


                                                   File: PCPFAST.MEX
                                                   Rev:  Jan 26, 1987


             FAST AUTOMATIC PC PURSUIT CONNECTIONS USING MEX
             ----------ooooooooooOOOOOOOoooooooooo----------

                          by Laurence J. Lavins


 1. P C P F A S T   A B S T R A C T
 ----------------------------------

    A simple user-friendly method has been developed for automatically
    accessing a PC Pursuit city, using the MEX v.1.14 PD communication
    terminal program, running under CP/M-80 (v.2.2). If a BUSY signal
    is received, the access string will be AUTOMATICALLY retransmitted
    every 5-6 seconds until a CONNECT signal is received from Telenet.
    The user may then send commands to the remote Telenet modem in the
    normal manner. This method does not involve any use of a keystring
    file, thus allowing the user to retain the entire capacity of that
    keystring file for other purposes.

                 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

 2. I N T R O D U C T I O N
 --------------------------

    Over the past few months, the number of customers using Telenet's
    PC Pursuit Service has increased dramatically, thus making it very
    difficult to place a call, especially during the few hours of peak
    system usage each day.

    As a consequence of the often prolonged, repetitive and wearisome
    transmissions which must be entered by a caller seeking to estab-
    lish a connection with a distant PC Pursuit city, some means were
    sought to facilitate this process.

    My own computer system is a modified TRS-80 Model 4 equipped with
    a hard disk, a Hayes compatible 300/1200 baud modem, and both the
    TRSDOS 6.2 and CP/M operating systems. With TRSDOS, I usually use
    the XT4 (v.1.6.8) communications terminal program (Copyright 1985
    by Bill Andrus, Fairfax, VA). And with CP/M, my program of choice
    is MEX v.1.14  (Copyright 1984 by Ronald G. Fowler, Ft. Atkinson,
    WI). Both of these communication programs have many nice features,
    and they're both in the public domain for non-commercial private
    use. I understand that the authors of both these programs may now
    also have released other commercial or proprietary versions, with
    added features. Unfortunately, these aren't in the public domain.

    What I attempted to do, therefore, was to see if I could develop
    some rather simple means of adapting either of these two communi-
    cations programs to enable faster and/or more automatic means of
    establishing a PC Pursuit trunk connection to the called city.

                 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-





-
+
                                   -2-

 3. T H E   S P E C I F I C   P R O B L E M
 ------------------------------------------

    When making a call via PC Pursuit, it's first necessary to access
    a Telenet node by calling the local phone number of that Telenet
    node. This presents no problem. Almost all communications terminal
    programs now in wide use provide excellent capabilities for making
    such phone calls. Once a connection has been established with that
    Telenet node, however, the PC Pursuit caller must then request the
    system to set up a connection from that local node to a modem port
    in the city being called. Therein lies the heart of the problem.

    Since there may be hundreds of customers (callers) trying to gain
    access to some limited number of modem ports in any one of the 25
    PC Pursuit cities, the usual response from the system is a "BUSY"
    signal. The callers must then keep calling, and as each port may
    become available, some lucky caller will be connected. Obviously,
    the more access requests a caller can initiate in a given period
    of time, the better will be his chances of getting connected.

    Unfortunately, this element of a call isn't a trivial matter. The
    Telenet protocol requires the following string to be sent out, in
    response to the Telenet network command prompt symbol, "@":

         "C DIALaaa/bb,uuuuuuuu,pppppppp" [cr]

    where: aaa      is the Area Code of the city being called.
           bb       is the baud rate in hundreds, either 3 or 12.
           uuuuuuuu is the User ID (usually 8 bytes).
           pppppppp is the Password (usually 8 bytes).

    Typing this string isn't bad once, or maybe twice. But just think
    what it would be like to manually enter such a string 100 or more
    times in succession! Well OK, you might say, all anyone has to do
    is to set up a macrokey, or function key, or whatever name your
    communications terminal program uses for such things. And both of
    my own two terminal programs, named above, certainly do have such
    features, as do most others in wide use today. I agree. Now we're
    much better off, not having to manually type in such long strings,
    over and over, repetitively.

    But I'm lazy. And I also get mighty fed up just having to keep on
    pressing [CLR] [KEY] or [ESC] [KEY], over and over, in response to
    each and every BUSY signal from Telenet. Even this, done 100, 150
    or 200 times in rapid succession, is enough to drive me away from
    all this high-tech stuff, back to the wastelands of TV.

    Moreover, the XT4 program is limited to a maximum of 10 macrokey
    strings in each data file. Since I insist on using at least 5 of
    these for other purposes, then only a maximum of 5 are available
    in any one data file for these PC Pursuit city strings. Even then
    there's no capacity left for local phone numbers in those cities
    once all 10 keys are used up. So realistically, I'd have to put up
    with the continuous loading, back and forth, among 5 or more data
    files. Not too accomodating.

    MEX fares somewhat better in this regard, although it's not quite
    as convenient for general communication purposes as is XT4, in my
    opinion. Theoretically, MEX allows you to have as many keystrings
    in a single keystring file as there are keys on the keyboard. But


-
+
                                   -3-

    there seems to be a 404 byte limit on each such file, according to
    my arithmetic, which DOES include the two sets of quotes that MEX
    requires to define a string, but DOESN'T include the key symbols
    themselves and equal signs. So maybe you can put 8 or 9 of these
    city strings into each keystring file, using the rest of the 404
    bytes for other commonly used strings, telephone numbers, etc. So
    now, with MEX, we're down to only 3 of these files. For example,
    PCP1.KEY, PCP2.KEY and PCP3.KEY. Not much of an improvement, but a
    little bit maybe. But it's still a crude approach to the problem.

    Another awkward option, of course, is not to prestore any of these
    city strings. But rather, to type them individually, as required,
    just prior to calling a PC Pursuit city, and then storing only that
    one string. The advantage of this, of course, is that you may then
    be able to get by with a single data file. But as far as all that
    continuous typing of 35 byte keystring sequences every time a new
    city has to be called  ... . no thanks!

    And now, finally, that everyone understands that I really am quite
    lazy, the problem boils down to developing an easier, faster and
    more efficient means for dealing with these PC Pursuit city access
    calls, especially in the high-traffic busy hours conditions.

                 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

 4. S E L E C T I O N   O F   M E X
 ----------------------------------

    Despite my own personal preferences for XT4 over MEX for general
    communications purposes, I did decide, for a variety of technical
    reasons, that XT4 in its present form wasn't a suitable candidate
    for this exercise. Conversely, however, and also out of technical
    considerations, MEX seemed to offer some viable possibilities. So
    the remainder of this paper will deal only with MEX.

    I did, of course, reveal my little project to several of my close
    associates. The most profound advice and counsel elicited from all
    these experts was that I wouldn't ever achieve salvation until my
    obsolete "TRASH 80" machines were replaced by Big Blue or one of
    its clones. With a machine of such a color, and software to match,
    I was told, all problems such as this rapidly disappear. Or at the
    very least, I was also advised, if I insisted upon remaining loyal
    to CP/M (shudder!) why not just purchase the expanded proprietary
    version of MEX from Ron Fowler, which might be able to handle this
    class of problem. As a natural born rebel, I now became even more
    obsessed with the problem, and refused to stop thinking about it,
    and continued on, trying out several different approaches.

    So now we're down to the following ground rules:

      (1) A standard CP/M-80 (v.2.2) operating system.

      (2) MEX Version 1.14 PD release. (The earlier v.1.12 would
          probably do just as well for this application, however.)

      (3) Maintain a simple user-friendly approach, using inherent
          features of MEX and CP/M. Minimize changes & additions.

      (4) Nothing of a commercial or proprietary nature is to be
          utilized. Everything shall be in the public domain (PD).

                 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
-
+
                                   -4-

 5. T H E   B A S I C   A P P R O A C H
 --------------------------------------

    After much analysis of the MEX commands and stat variables plus a
    great deal of trial and error, it seemed like it might be possible
    to play some tricks on MEX, using the SENDOUT command and/or the
    READ command, along with some other associated commands and stat
    variables.

    What we'd like to do is to set up the equivalent of some logic of
    the "IF ...   THEN ... " type. Now, it's quite clear that the PD
    version 1.14 of MEX doesn't include such sophisticated commands.
    Specifically, we need to do the following:

      (1) Pre-store a complete set of city access strings. Or as an
          alternative, a single string with symbolic variables. They
          should reside in a data file of semi-permanent nature.

      (2) Initiate the transmission of any one specified access
          string in a simple manner with minimum keystrokes.

      (3) IF a "BUSY" signal is received, THEN repeat the previous
          transmission after a network command prompt appears. This
          is to be done completely automatically, without the user's
          manual intervention, for some specified number of retrans-
          missions. The user should be able to abort this process at
          any time.

      (4) IF a "CONNECT" signal is received, THEN do not repeat the
          previous transmission, but rather allow the user to enter
          the data transfer mode and send commands to the modem at
          the distant PC Pursuit city, in the normal manner.


    At first glance, MEX 1.14 doesn't appear to support the commands
    needed to implement this logical sequence, but closer examination
    reveals that it does, in fact, have the capability. We'll have to
    perform some sleight of hand in order to fool the system, but it
    really can be done. Trust me!

                 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

 6. T H E   S P E C I F I C   S O L U T I O N
 --------------------------------------------

    Here's what we're going to do now to weave our bit of magic with
    MEX. First, the logical structure, then the details. In hindsight
    it seems so simple. So how come it took so long for someone to
    figure it out, dummy?

                 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-

 6.1  THE LOGICAL STRUCTURE
 --------------------------

    The logical basis of the solution here is to use the WTECHO stat
    variable in conjunction with a SENDOUT command. When WTECHO is ON,
    all characters transmitted to the remote terminal (Telenet) via a
    SENDOUT command are compared with the characters echoed back from
    the remote. Since Telenet does echo back whatever we send out, as


-
+
                                   -5-

    any good host terminal should, that cooperation is what makes our
    trickery work. If there's a discrepancy (error) between what we've
    sent out and what's echoed back, then MEX further provides us with
    the means to retransmit. Not only must WTECHO be turned ON, but we
    must also specify a CANCEL character to be sent out to the remote
    upon discovery of the error, and also a TRIGGER character which we
    must look for from the remote to trigger our retransmission of the
    SENDOUT string. Lest I forget, the "error" character that's added
    to the SENDOUT string in order to create the discrepancy between
    the SENDOUT string and its echo in the first place, along with the
    CANCEL and TRIGGER characters are extremely critical and specific.
    It took lots of educated guesswork, plus trial and error, before a
    set of values for these 3 characters  was found that would permit
    a completely workable solution. Unless all the values are set up in
    exactly the correct way, either one of the following may occur:

      (1) There may be no retransmission of the initial call after a
          "BUSY" signal is received.

      (2) There will be continued retransmissions of the original call
          as long as "BUSY" signals are received from Telenet. But then
          after a "CONNECT" signal is received, MEX will "freeze", and
          CP/M must be rebooted to restore your system.

    Additionally, the REPLY and RETRY stat variables should be set up
    properly, but these aren't critical.

    The "error" character mentioned above is a single character which
    is appended to the SENDOUT string IMMEDIATELY FOLLOWING the final
    "^M" carriage return in that string. My theory here, which proved
    to be correct, was that such a character would be saved by MEX for
    comparison purposes when WTECHO is ON, but that it wouldn't really
    be transmitted out via our own modem or echoed back by Telenet in
    the unlikely event that it did get transmitted. Since MEX has been
    designed to save the contents of the string prior to transmission,
    whatever they may be, for comparison purposes, that's exactly what
    we're now going to take advantage of for our own purposes here.

    So far, so good. Now let's go back to the SENDOUT string itself,
    which conforms to the format described back in Section 3. The way
    to make it simpler, at this time, is to execute PREFIX and SUFFIX
    commands as soon as MEX is booted up. Like this, for example:

         PREFIX "C DIAL"
         SUFFIX "//12,uuuuuuuu,pppppppp^Me"

    where  uuuuuuuu is the User ID
           pppppppp is the Password
           e        represents the appended error character

    To initiate transmission, just key in "SENDOUT aaa" for the area
    code of the city you're calling, and hit your [cr] key. The whole
    string, including the PREFIX and SUFFIX, will then be correctly
    sent out by MEX. Note that if a "BUSY" response comes back from
    Telenet, MEX logic will cause a retransmission, provided that all
    the appropriate stat values have been entered. Have patience now,
    we're still developing the logical structure. The specific values
    for the error character and those stat variables will be revealed
    below, shortly.



-
+

                        -6-

    Now, if everything being done is clearly understood, let's go one
    step further beyond the basic SENDOUT command. This brings us to
    the READ command. It may appear to be a little difficult to grasp
    at first, but it's quite simple. Look at it like this: All we're
    doing is to take the SENDOUT command, along with its whole string
    (no need here for PREFIX and SUFFIX commands) and enter it into a
    file on disk. Let's use the default drive (usually A:), and also
    let's arbitrarily (because I say so) name this file P.MEX. You can
    use any old word processor or text editor of your choice to create
    and store this file. It'll look like this:

      File Name: P.MEX

      Contents:  SENDOUT "C DIALaaa//12,uuuuuuuu,pppppppp^Me"

    See, nothing to it. The contents of this file are all included on
    a single text line. After you've saved this file on the disk, key
    in the command "TYPE P" directly from MEX,  or "TYPE P.MEX" from
    CP/M, in order to verify that this file really contains what you
    think you wrote and saved. Since we used the MEX default extension
    for this filename, we don't need to use the extension when calling
    this file from within MEX. (Ain't that clever now, huh?) If you're
    still hangin' in there, don't let go. You've almost got both feet
    up onto this step now.

    So guess what needs to be done now to execute the SENDOUT command
    that's written into file P.MEX?  If you said READ P, you're right
    on! Congratulations! If you didn't guess correctly, please review
    what we've done so far and also review the MEX documentation. And
    now we've only got two steps left to reach the top landing.

    Everybody aboard now? Alright, let's move on up. And here's where
    you might have just a wee bit more difficulty. MEX has a marvelous
    bit of its own duplicity that permits us to say one thing when we
    really mean another, kinda like some females I've known. Just look
    again at that one line SENDOUT command in the P.MEX file:

      SENDOUT "C DIALaaa//12,uuuuuuuu,pppppppp^Me"

    I'm going to surgically remove the 3-digit area code, "aaa", and
    in its place, let's put something else, like "{1}". This numeral,
    ENCLOSED WITHIN BRACES, is called a formal parameter. It may also
    be referred to as a variable symbol. Whatever you want to call it
    is OK with me. Just remember that IT MUST BE ENCLOSED WITHIN THOSE
    BRACES. Now, go back to your word processor and change the SENDOUT
    command, and then save it to filename P.MEX, like this:

      SENDOUT "C DIAL{1}//12,uuuuuuuu,pppppppp^Me"

    As you might have guessed, there's no free lunches around here. So
    the payment has to be made up at the READ command by appending the
    "aaa", where it's now referred to as an actual parameter. Whatever
    numbers we enter into the actual parameter will be substituted for
    the formal parameter when the READ command is executed. So our READ
    command will now look like this:

      READ P aaa [cr]    instead of    READ P [cr]

    The numerals used for variable symbols refer back to the actual
    parameters in the READ command, in sequential order. If you had a


-
+
                                   -7-

    mind to do so, you could replace the baud rate 12 with {2}, as an
    example. Then you would have to follow the aaa in the READ command
    with a 3 or a 12. (I personally always use 12, even for 300 baud
    transmission. It works, and a 1200 baud port seems easier to come
    by than a 300 baud port.)

    Whew! I'm all out of breath. So let's take a short breather, just
    long enough to make sure that everything so far is clearly under-
    stood. OK?  Everyone still here?

    Ready now for the final push. The top landing is only a small step
    away. This last step takes us to the EXTEND stat switch variable.
    We're going to turn it on. And you ask me how come? And I say back
    to you because I say so, and also because I'm lazy, and if we turn
    on this switch, then MEX will let us forget to write the READ into
    the READ command line. How's that for doublespeak, huh? So try it,
    you'll like it! And so we now can use just:

       P aaa [cr]    instead of    READ P aaa [cr]

    It should be very clear to you readers at this point that MEX has
    allowed us to make up a phantom command, which will be executed by
    MEX like any other legitimate intrinsic MEX command. What's more,
    even if you still don't understand how it works, you don't have to.
    All you gotta do, dummy, is press a P and an Area Code number. OK?
    Now that's simple enough to satisfy the original groundrules!

    Moreover, none of the valuable 404 bytes in the MEX keystring file
    needs to be used for city access strings. You can use the entire
    file for all your other strings, like commands, names, telephone
    numbers, BBS passwords, or whatever else. So you see, we don't have
    to pay a penalty in that department anymore either.

                 -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-


 6.2   HERE'S THE FINAL DETAILS  -  NOW GO GETTUM, KEMOSABE!
 -----------------------------------------------------------

    If you waded through all the preceding stuff, and understand any
    of it, you've earned the right to the final critical details and
    values. And even if none of it makes sense to you, just take your
    numbers and good riddance! I also once thought about saying "to be
    continued next month." But I don't want to be bothered with doing
    another paper any more than anyone out there really wants to bother
    reading one. So here's the goodies:


      Error character:  @   (Critical value. Others may cause freeze.)

      Stat CANCEL:      ^M  (Critical value. Others may cause freeze.)
      Stat ERRID:       Switch OFF (Not critical, but may save time.)
      Stat EXTEND:      Switch ON (Needed for the phantom command.)
      Stat REPLY:       6 sec. (Timeout factor. Not critical.)
      Stat RETRY:       255  (Max retransmissions. User may change.)
      Stat TRIGGER:     @  (Critical value. Telenet command prompt.)
      Stat WTECHO:      Switch ON  (Mandatory setting.)

      Abort the loop:   CTRL-C  (This can be done at any time)



-
+
                                   -8-


 7. S O M E   W O R D S   O F   W I S D O M
 ------------------------------------------

    Here's just a few more finishing touches now, plus review of some
    of the lessons learned. There's some important new information in
    here too, regarding the actual operation of this PCPFAST method of
    accessing a PCP city, so please read it all very carefully to make
    sure that you have a clear understanding of what you must do.

    (1)  Set up a READ file P.MEX, or whatever other name you want to
         use, and store it on disk. It should contain the one-line
         SENDOUT command and string described above, with the formal
         parameter {1} in place of the area code. Remember the braces!
         Also, don't forget to append the error character, "@", to the
         end of the string, immediately following the "^M".

    (2)  Set up the principal stat variables, as shown just above.
         Make sure that there are no active PREFIX or SUFFIX strings.

    (3)  Set up and load your PCP.PHN and PCP.KEY files into MEX for
         use with PCP. Enter all your phone numbers, strings, etc.
         Don't forget to execute COLD first to clear out other data.

    (4)  CLONE this MEX config for exclusive use with PCP. And name it
         MEXP.COM, perhaps. Then, when you want to use MEX for calling
         PC Pursuit, just call up MEXP from CP/M, and you're all set.

    (5)  After a connection has been established with a local Telenet
         node, use ESC-E to return to MEX command mode. Then key in
         P aaa [cr] to initiate the SENDOUT command in the READ file,
         for area code aaa. If all modem ports in the destination PCP
         city are occupied, you'll get a "BUSY" response, and MEX will
         retransmit an access request approximately every 5.6 seconds.
         You may abort at any time with a CTRL-C, or equivalent key.

    (6)  When a "CONNECT" is received, you'll see it. Now do a CTRL-C
         to abort the READ file. You'll probably time out, and go into
         the command mode. Enter T [cr] to go into terminal mode, then
         follow up with one or two [cr] entries until you see the "@"
         network command prompt symbol. Now THIS IS IMPORTANT for you
         to understand, so PLEASE READ CAREFULLY: As a result of what
         was done to manipulate MEX, you ARE connected to the called
         city at this point, but can't send any commands to its modem
         because you're now in the network command mode, as indicated
         by the "@" prompt.  You must be in the data transfer mode to
         send commands to that modem. To go to the data transfer mode,
         enter CONT [cr]. Then you may send commands to that modem in
         the normal manner. Hint: Put "CONT^M" into your PCP.KEY file.
         (CONT isn't a generally published Telenet command, so please
         make a note of it somewhere.)

    (7)  It's probably a good idea to switch WTECHO OFF after you've
         established connection, but not essential. The ON state can
         possibly disrupt the normal operation of some keystrings. You
         can easily set up READ files for turning Stat WTECHO ON and
         OFF. They're much easier and faster to use than entering the
         full STAT commands. I use W.MEX and WF.MEX for filenames. If
         you do this, don't forget to turn WTECHO ON again before the
         next PC Pursuit call is initiated.


-
+
                                   -9-


 8. T H E   F I N A L   W O R D
 ------------------------------

    Good luck to everyone using this method of accessing PC Pursuit
    with MEX. It works just fine for me, and I see no reason why it
    shouldn't work just as well for anyone else.

    Hopefully, others will do some of their own experimentation, and
    perhaps come up with improvements, suggestions, etc. which may be
    beneficial to the entire CP/M - MEX user community. Constructive
    comments and feedback along such lines are sincerely requested.


    If anyone wants to reach me, I can be contacted as follows:

       By U.S. Mail:    P.O. Box 1503, Havertown, PA 19083

       By voice phone:  (215) 878-9608  or 878-9609

       By E-Mail:    Drexel Hill Northstar RCP/M  (215) 623-4040
                     Exclusive-80                 (215) 739-9512
                     (Both BBS's are accessible via PC Pursuit)


                     -----------   Larry Lavins
                                   Philadelphia, PA
                                   Jan 26, 1987
END OF FILE