Notes on using BYE with ZCPR3 This is an article on my experiences in using ZCPR3 on an RCP/M. It is intended for System Operators (SYSOPs) who are using, or are considering using, ZCPR3 in the RCP/M (with BYE) application. If you have any comments or experiences you would like to share, please feel free to do so at: David McCord, SYSOP The ZCPR3 BBS (415) 489-9005 24 hrs/7 days 300/1200 One of the first things that a potential ZCPR3 sysop should understand is that implementation of ZCPR3 will reduce the Transient Program Area (TPA) available for running the BBS software you are using. In my case, the message system being used is METAL (by Tim Gary)...since it does not require a larger-than-average TPA, I have no problem with a "full" implementation of ZCPR3, which subtracts 5K bytes as compared to a "standard" cp/m or ZCMD arrangement. However, some packages, such as RBBS, do require a large TPA, especially in the compile or link phases of program generation (that darn L80!). Simply be aware that if you are tight on memory space, that ZCPR3 will add to your problems. Having read that, you may be saying, "Well, why would I want to use ZCPR3 on my RCP/M?" There are many advantages to using ZCPR3, whether for your own personal use, or for RCP/M.... -Named Directories Can help you partition your system in an easier-to-understand manner. Also, the "secure" mode of operation with named directories can add an additional level of security to that provided with BYE. -ALIAS capability ALIASes make a lot of things very easy. They can take the "teeth" out of useful programs that normally can't be used in RCP/M environments by "filtering" dangerous command line options. Also, ALIASes can be used as primitive "translators" that will (for instance) translate LDIR LIBNAME to DIR LIBNAME.LBR $L. This means that users who are not familiar with SD (DIR in the example) can still use the old familiar LDIR without actually having the LDIR program on your system! -Flow Control The command line IF/ELSE/FI capabilities allow graceful error recovery, and also allow branching capability. This means that an ALIAS can do different things depending on whether an IF condition is true or false. -MENU capability Allows you to make your system much more user friendly by presenting callers with a list of choices. -Video Applications Video applications are programs that utilize terminal display functions such as clear screen, reverse or dim video, cursor addressing, and more. The Z3TCAP (Terminal CAPabilities) file contains (presently) over sixty terminal types, and the coherent usage of this information by the various ZCPR3 video utilities give you the opportunity to go beyond the "plain vanilla" terminal approach common on RCP/M's these days. So you see, there are many advantages to using ZCPR3 on your RCP/M. I personally think that the power and flexibility of ZCPR3 with not only take the conventional personal computer world by storm, but will also be the operating mode of choice for the RCP/M's of the world. For instance, here are two examples of the uses of ALIAS...In the first example, a simple "translator" approach is shown. The ALIAS file that contains the commands shown will be named LDIR.COM: Line 1:DIR $1.LBR $$L The "$1" is used as with the SUBMIT.COM program provided by Digital Research...it means "substitute the first command line parameter here". Thus, if the user had typed LDIR LIBNAME, LIBNAME would be substituted for $1. The "$$L" part of the command will be resolved as "$L"...the leading $ tells ALIAS that a following $ is to be interpreted literally, and no substitution is to take place. So, if the user had typed LDIR LIBNAME, the ALIAS named LDIR would be invoked, the substitution of LIBNAME for $1 would occur, and the resulting command that the ALIAS would "feed" to ZCPR3 is DIR LIBNAME.LBR $L. The second example shows how an ALIAS can filter out "dangerous" command line options. This is a little more complicated. TCSELECT is a ZCPR3 program, that, when invoked with NO command line parameters (like TCSELECT) simply allows the user to select a terminal type from Z3TCAP file, and loads it into RAM at the appropriate address. This is not dangerous. However, when a user invokes it with a filename parameter (like TCSELECT FILENAME.TYP), the information from the Z3TCAP file is written to that filename. This IS dangerous, because if the user had entered TCSELECT XMODEM.COM, the XMODEM program would be overwritten with the TCAP data. So, the goal is to prevent users from using this feature by using an ALIAS to "filter" command line parameters. The first step is to rename TCSELECT.COM so that it cannot be executed directly; TCSELECT.DAT is what it is renamed to. (Only the SYSOP can do this assuming the REN command is set to check the wheel byte, as in the RCP SYS 1.0C. Remote users typically do not have wheel priviliges.) Then, the ALIAS is created containing the commands shown below. The name of the ALIAS is TCSELECT.COM...so that when the user invokes TCSELECT, the ALIAS will assume control. ALIASes cannot be aborted via control-C; and their commands are not "echoed" on the screen. Remember this when trying to understand the example. EXAMPLE: Line 1:WHL PASSWORD; Line 2:IF EXIST FOO.COM; Line 3:REN TCSELECT.DAT=FOO.COM; Line 4:FI; Line 5:REN FOO.COM=TCSELECT.DAT; Line 6:FOO; Line 7;REN TCSELECT.DAT=FOO.COM; Line 8:WHL EXPLANATION: Line 1: This line uses the WHL command of RCP SYS 1.0c to "set" the WHEEL byte, assuming PASSWORD is the correct wheel password for your system. If PASSWORD was NOT the correct password, WHL "re-sets" the wheel byte, i.e., it clears it. We need to have the wheel byte "set" so that the following REN commands will work. Remember, REN checks the wheel byte and only works if it is in the "set" state. Lines 2-4: These lines will be discussed last. At this point, pretend that they don't exist as the rest of the ALIAS needs to be explained first. Line 5: This command renames the ORIGINAL TCSELECT.COM (Remember, we renamed it to TCSELECT.DAT) to FOO.COM in preparation for the next step. (It could not be renamed to TCSELECT.COM, because name is being used by the ALIAS!) Line 6: This line actually executes the ORIGINAL TCSELECT program. The thing to notice here is that it invokes it with NO command line parameters. Even if the user had typed TCSELECT XMODEM.COM, the parameter XMODEM.COM is not passed! Line 7: After TCSELECT is done (either through selecting a terminal and load RAM or aborted with control-C), it is renamed back to the unexecutable TCSELECT.DAT. Line 8: The WHL command, this time with an incorrect password (actually no password!) will "reset" the wheel byte. Now, to explain what lines 2-4 are all about: Ask yourself what happens when a remote user drops carrier in the middle of running FOO (the original TCSELECT)? BYE will seize control, effectively ABORTING the ALIAS. When the next user goes to the cp/m section (like the message system C command), FOO will already be there! If we did NOT have lines 2-4, Line 5 (because of the way the REN command works under ZCPR3) would ERASE FOO.COM! It does this BEFORE it discovers there is no TCSELECT.DAT...Thus, unless we have some way of checking whether FOO.COM exists, a situation can arise where the original TCSELECT commits suicide! Lines 2-4 check for this situation, Line 2 checks to see if FOO.COM exists using the ZCPR3 IF. If it indeed exists, Line 3 will be executed, renaming it to TCSELECT.DAT, and avoiding the suicide situation. Line 4 is a "marker" that shows where the effect of the IF command on Line 2 ends. If FOO.COM did not exist when that IF command on Line 2 was executed, the flow state would be set to FALSE, and all commands would be ignored until an FI was encountered. So, if FOO.COM did not exist at that point, Line 3 would be ignored. Whew! Although somewhat complicated, this ALIAS can take the "teeth" out of TCSELECT, and keep creeps from overwriting accessible files on your system. (However there's still one minor problem....can you find it? It will be covered in the next section, but look for it as a test...) So, this concludes the discussion of the uses of ALIASes in ZCPR3 RCP/M applications. BYE (the version I am presently using is 3-26) needs some minor additions to take care of some "loose ends" when running with ZCPR3. In particular, BYE should "flush" (clean out) the Multiple Command Line Buffer that ZCPR3 uses to store strings of commands, like for instance ALIASes when they are executed. The following excerpt from my version of BYE illustrates the needed changes: