WHAT IS FAST2 AND HOW DOES IT WORK? ----------------------------------- What is FAST2? It is a new transient program for the CP/M (*) disk operating system. It was originally written by by Roger van Valzpah and released by the CP/M user group as FAST. This version was modified by David Bennett of the Alfred Hospital, Melbourne to be compatible with CP/M version 2.0. FAST2 is used in conjunction with other transients to speed up their execution. Of course, nothing but a hardware change can increase the rate at which your CPU executes instructions. But, most transients are "disk bound", that is, they spend a large percentage of their total execution time just waiting for the information they need from the disk. FAST2 uses this fact to increase execution speed by reducing the time spent waiting for the disks. This is accomplished by using two different types of buffering. Firstly, portions of the disk which are frequently accessed (the directory) are held in a buffer, eliminating the need to seek to read them. Secondly, disk accesses are grouped together in time to reduce the amount of time lost to rotational latency and head load delay. HOW TO USE FAST2 ---------------- The normal CP/M command to assemble a file with the name MUMBLE.ASM is: A>ASM MUMBLE To perform the same function under FAST2, simply type: A>FAST2 ASM MUMBLE Thus, in its simplest form, FAST2 can be used as a prefix to any normal CP/M command. This will load FAST2 which will link itself to your operating system and allocate its disk buffers. Then the transient ASM.COM is loaded and given control. The fact that FAST2 is in the system is totally transparent to the transient, except for the reduced memory size. Messages will be printed just before and after the transient is executed to indicate that FAST2 is in control. After execution, you should see something like this on your terminal: A>FAST2 ASM MUMBLE Alfred Hospital FAST 2.01 CP/M ASSEMBLER - VER 1.4 1234 056H USE FACTOR END OF ASSEMBLY FAST terminated A> Where N.NN is the version number of FAST2 that you are using. COMMAND LINE OPTIONS -------------------- The buffering action of FAST2 may be altered with the use of command line options. This is accomplished by following the FAST2 command with an option string enclosed in square brackets ("[" and "]"). A valid option string must consist of a drive specification followed by one or more buffering mode specifications. This group may be repeated for buffering of multiple drives. Examples of typical option strings will be given below. Explicitly specifying the buffering mode is desirable to reach the best trade-off between speed of execution and memory usage. In general, as more buffering is used, execution speed will increase. However, more buffering means more memory usage. The type of buffering selected should be tailored to the disk usage patterns of the transient being executed. For instance, write buffering will offer no speed improvement when a transient only reads the disk. One thing that FAST2 must know is which disk drive is to be buffered. This is communicated to FAST2 simply by using the single letter name of the desired drive (e.g. "A" for disk drive A). As a convenience, the current default drive may be specified with the commercial at sign ("@"). The second thing which FAST2 must know is which mode of buffering is to be used. FAST2 supports three different buffering modes. Each mode may be used individually or in combination with other modes to offer the fastest execution. The three modes available are: Seek buffering Read buffering Write buffering Yes (all of the above) The type of buffering desired is communicated to FAST2 by a single letter in the option string. The letter is simply the first letter of the word which describes the type of buffering (capitalized above). The operation and application of each mode will be discussed below. Thus, a typical FAST2 command line might look like this: B>FAST2 [ASWBSR] ASM MUMBLE.BAA In this example, the .ASM source file is on drive B so read and seek buffering have been specified for that drive. The A drive, on the other hand, is to receive the result of the assembly (the .HEX and .PRN files), so it gets write and seek buffering. BUFFERING MODE DESCRIPTIONS --------------------------- Seek buffering causes the disk directory to be read into a buffer the first time a drive is accessed. From then on, all reads from and writes to the directory can be carried out without moving the disk head from its current position. Thus, transients which access the directory frequently will be sped up considerably by seek buffering. Transients which fall into this category are those which deal with many different files simultaneously, perform operations with temporary files and rename them, read or write large (more than 16K) files, and those which perform random disk I/O. In particular, ASM.COM, MAC.COM, PIP.COM, and ED.COM are examples of such transients. Read buffering causes an entire track from the disk to be read into a buffer the first time any sector is read from that track. This increases execution speed because CP/M typically reads most of one track before going on to the next one. Additionally, the time required to read a whole track is a fairly small percentage increase over the time required to read a single sector. The net effect is that less time is spent waiting for the rotational latency of the disk. This mode of buffering is most beneficial to transients which read disk files sequentially. As a matter of fact, it may slow down transients which read files in a random access mode. Fortunatlly, the vast majority of CP/M transients read the disk sequentially. Examples of such transients are ASM.COM, MAC.COM, PIP.COM, and BASIC-E.COM (if the BASIC program doesn't do random I/O!!). With write buffering, sectors that are to be written to disk are held in a buffer for a time, instead of writing them immediately. Sectors for any given track are held in the buffer until CP/M tries to write to a track that is not buffered. When it is time to change tracks, only those sectors which were changed are actually written before clearing the buffers to make room for the new data. This improves execution speed for the same reasons that read buffering does, i.e. a whole track can be written in about the time it takes to write a single sector. Transients which benifit from this type of buffering typically write to disk sequentially. Examples include ASM.COM, MAC.COM, and ED.COM. DEFAULT PHILOSOPHY ------------------ Two of the qualities generally associated with a good program are versatility and ease of use. FAST2 has been written with these two qualities in mind as the primary design goals. Many times, however, these two goals can be contradictory. A versatile program is one which is capable of a wide variety of tasks or one that fits many different FAST2 Default philosophy applications. This usually means a program with many user selectable options. Forcing the user to type the same frequently used options every time a program is invoked or committing him to remember a long list of options is contradictory to the goal of ease of use. This conflict is resolved by the use of default mechanisms within FAST2. A default mechanism is simply a rule that can be used to make assumptions about the user's wishes when he has not stated them explicitly. Thus, versatility has been retained by allowing the user the ability to specify options explicitly, while the default mechanism frees the user from this tedium much of the time. In short, defaults allow versatility and ease of use to peacefully co-exist in the same program. .cp 3 DEFAULT MECHANISMS IN FAST2 --------------------------- There are two levels of defaults built into FAST2. The first default mechanism is used when either the drive or buffering mode is omitted from an option string. If a drive name is not given, the default drive for CP/M is used (this is equivalent to "@"). If no buffering mode is specified, read and seek buffering are used. Thus, the following two commands would be equivalent. B>FAST2 [BRW] LOAD MUMBLE B>FAST2 [RW] LOAD MUMBLE And so would the following two commands. A>FAST2 [BRS] PIP B:THIS=B:THAT A>FAST2 [B] PIP B:THIS=B:THAT The second default mechanism comes into play when no option string is given on the command line. Instead of executing the transient with no buffering, FAST2 uses a default option string to specify the buffering used. This string is [@RS], giving the user read and seek buffering on the default drive when no option string is present on the command line. The user may, at his option, alter the default option to one which is more suitable for his typical uses. For instance, if you typically use FAST2 for assembling and don't have to worry about running out of memory, a good default string would be [@RWS]. Conversely, if you are running in a small memory system, a good choice would be to change the default option string. HOW TO CHANGE THE DEFAULT OPTION STRING --------------------------------------- The default string is stored in FAST2 at address 0130H. Thus, to change the option string, use SID or DDT to change the existing string. Assuming you have SID this is very easy: A>SID FAST2.COM SID VERS 1.4 NEXT PC END 0A00 0100 94FF #S130 0130 5B "[@RWS] 0136 20 . #^C A>SAVE 9 FASTX.COM If you do not have SID, you'll have to use DDT and figure out the hex for the ASCII string you wish to patch in. Then use the Substitute command to patch the file as above. In either case, test the patched file before killing the old FAST2.COM and renaming the new file to FAST2.COM. .cp 3 WARNINGS N-E-V-E-R CHANGE DISKS WHILE EXECUTING UNDER FAST2!!! And in case you missed that one I'll say it again... YOU MUST ********** N-E-V-E-R N-O-T E-V-E-R ********** CHANGE DISKS WHILE EXECUTING UNDER FAST2!!! (not even if you think you know what you are doing) Wait until you see the message "FAST2 terminated" before even thinking about switching disks. A rather nasty side effect of seek buffering is that it disables the disk change detection mechanism built into CP/M. This means that you will NOT get the warning message "Bdos error on A: R/O" if you forget and change disks without booting. Instead you will get wild and unpredictable effects possibly including destroying your disk directory. This also gives rise to a minor incompatibility with any transients which use the BDOS reset function (BDOS call 13). This function is used in transients which allow the user to change disks without rebooting. Some examples are MBASIC, CBASIC, WORDSTAR, and others. Fortunately they only this BDOS function when an explicit command is used to permit changing disks. FAST2 is compatible with transients of this sort as long as no attempt is made to change disks. One way to avoid trouble is to avoid using FAST2 with any transient which requires user input. Any such transient, by waiting for your reply, would leave you with the opportunity to change disks. To minimise the risk of your running into trouble with such programs, FAST2 watches out for any requests for user input. When such a request is detected, FAST2 immediately writes all modified blocks back to disk. While this gives some protection against lost data, it fails with programs such as Wordstar which monitor console status and only request input after a key is struck. Again, DON'T change disks. COMPATIBILITY ------------- FAST2 is fully compatible with the following transients and can be expected to provide a significant reduction in execution time. CP/M utilities:LOAD, SUBMIT, DUMP, MAC Compilers: ASM, MAC, RMAC, M80, FORTRAN, F80, COBOL-80, PL/I, etc. FAST2 is fully compatible with the following transients, but due to the fact that they require user input, some caution should be exercised when they are used with FAST2. As mentioned above, stopping for input gives the user the chance to inadvertently change disks which CP/M would not be able to detect. If the user is able to guard against this occurrence, he may use FAST2 with these transients and expect a significant reduction in execution time. In particular, the improvement in the speed of PIP is little short of unbelievable. CP/M utilities:PIP, DDT, SID, ZSID Editors: ED, WORDMASTER, WORDSTAR, ED-80 Interpreters: MBASIC, RUN, CRUN, CRUN2, PRUN Other: SELECTOR, ADVENTURE FAST2 is fully compatible with the following transients, but due to the way in which they access the disk, little or no speed improvement can be expected. Special utilities: SYSGEN, MOVCPM, FAST2, COPY Due to an unfortunate memory dependency, STAT (version 1.4) does not correctly report the number of bytes remaining on the disk when it is executed under FAST2. This is no great loss because FAST2 can do little to speed up the execution of STAT. Best results are obtained in situations where the disk is accessed sequentially, especially if large files are read from beginning to end. The following examples indicate some of the results which can be expected using standard single-sided single- density 8 inch diskettes. A>FAST2 [AYBY] PIP B:=*.* This command can be expected to copy a 241k diskette full of data, file by file, in about 80 seconds. With verification, it takes perhaps 100 seconds. A>FAST2 [ARBY] WS Use this command on your Wordstar utility disk to edit text on drive B: (but don't change disks!) and you will marvel at the new version of your editor. It will load overlays in the blink of an eye and save files (e.g. ^KS) in nothing flat. A>FAST2 [ARBY] COBOL CMUMBLE The compilation for a small 100 line program drops from about 90 seconds to less than 40. The biggest gains are in loading overlays of the compiler. A>FAST2 [ARBY] CBASIC BMUMBLE $BF One of the most irritating features of this compiler is that if you switch off the listing, you don't know which lines contain any errors which are detected. Solution: save a listing on disk and with FAST2 the compilation will still take no longer than before. FAST2 MESSAGES -------------- During the course of execution, FAST2 may print any of several different messages. Each of these messages is listed below along with conditions under which it is printed. Alfred Hospital FAST 2.01 This message is printed after the transient to be executed under fast has been successfully loaded, but just before control is transfered to it. This is simply an informatory message and does not signal an error condition. In this message, N.NN is the version number of FAST2 which you are using. FAST terminated This message is printed after the transient has finished execution and all disk buffers have been emptied. This too is simply an informatory message printed under normal conditons. NO COM FILE This message is printed when the transient filename given on the command line cannot be found in the directory. No recovery action can be taken, so the execution complete message is printed and FAST2 re-boots. OUT OF MEMORY This message is printed when the size of the TPA is exceeded while allocating buffers or while loading the transient. In either case, no recovery action can be taken, so the execution complete message is printed and FAST2 re-boots. There are several solutions to the out of memory problem: use less buffering, use smaller transients, or, of course, buy more memory. DISK WRITE ERROR This message is printed when FAST2 attempts to write data to disk and gets the unsuccessful completion flag back from the BIOS. The only recovery action taken is simply the printing of the message, then execution continues normally. This usually indicates a serious error (like a protected disk) and the user should boot and take corrective measures as soon as possible. INVALID OPTION This message is printed whenever an error is detected in the option string being scaned by FAST2. This may be the option string supplied on the command line or the default option string in memory in the unlikely event that it has been incorrectly modified. Some examples of invalid options are the null option ([]), options containing invalid characters ([Q]), or options which specify buffering of the same type for the same drive twice ([ABA]). MEMORY HIT This message is printed whenever FAST2 attempts to write to a memory location and cannot read the data it has just written. The recovery action taken is to print the message and ignore the error. It is usually an indicator of hardware problems in your system and should be looked into immediately. If MEMORY HIT errors are persistent and you have a ROM monitor in your system, you can use FAST2 to help find the memory at fault. Create a special FAST2.COM with a jump to your monitor patched into location 521H. This location is called when a memory hit is detected. The HL register contains the address of the bad byte and a bit in the A register is set for each bad bit in memory. MEMORY ALLOCATION ----------------- When FAST2 is loaded, it automatically relocates itself to the top of the TPA (just like DDT and SID). This action overlays the CCP. A side effect of this is that transients which normally return to the CCP without booting will boot when executed under FAST2. An example of such a transient command is LOAD. As mentioned earlier, the only way a transient can tell that it is being executed under FAST2 is that the size of the TPA is decreased. The amount of memory taken out of the TPA by FAST2 is dependant on the number of buffers which are allocated. .cp 4 The formulas used to determine the amount of memory used are: buffers = NTB * (3 + 131 * SPT) + NSB * (3 + 131 * SID) SID = NDE / 4 mem used = 768 + [buffers] Where: NTB is the Number of Track Buffers allocated SPT is the number of Sectors Per Track NSB is the Number of Sector Buffers allocated SID is the number of Sectors in the Directory NDE is the maximum Number of Directory Entries [ ] indicate rounding up to the next multiple of 256 For a normal 8 inch IBM compatible version of CP/M, all these computations can be replaced by a simple estimating rule: Allow 1024 bytes for FAST2 code overhead, 3409 bytes for each track buffer (R or W), and 2099 bytes for each seek buffer (S). As an example, FAST2 executed without a command line option string will use 1024 + 3409 + 2099 bytes. If this sum is rounded up to the next multiple of 256, the actual memory usage figure becomes 6656 bytes. The maxmimu on a two drive system is the command option [AYBY] which costs 1024 + 4x3409 + 2x2099 or a total of 18.5K (18944 bytes). .