CPM-PLUS ======== Robert B Davies, 16 Gloucester Street, Wellington, New Zealand. CP/M PLUS (alias CP/M 3) is Digital Research's latest update of their operating system for systems based on 8080 or Z80 microprocessors. I purchased a copy during a recent trip to the USA and now have it running. Here are my thoughts on it after trying it for a few months. OPERATING SYSTEMS --------- ------- First, I need to make a few comments on what an operating system is required to do. It is a program that provides the interface between a user's program and the computer's peripherals such as the disks, keyboard, display etc. In particular, it builds and organizes the disk directories, reads and writes files on disk, loads programs as requested by the user, regains control after the user's program has finished, as well as loading itself from disk when the machine is turned on. A diagram of the set-up for CP/M is given in figure 1. The heart of the system is the machine independent part called the BDOS. The machine dependent part, the BIOS must be written by the computer manufacturer or owner and supplies a more-or-less machine independent interface for the BDOS. It is this splitting of CP/M into the BDOS and BIOS that enables it to be readily adaptable to the large variety of machines on which it runs. The BDOS provides the interface with what ever program (the transient program) is currently in core and translates its complex file and input/output commands into sequences of simple commands for the BIOS. The CCP (console command processor) is a program that is automatically loaded when the machine is turned on or when user programs exit and is responsible for monitoring the keyboard, loading new programs when requested or, in the case of CP/M 2, processing the commands DIR, ERA, USER, REM, SAVE, TYPE. The cold boot loader is automatically loaded when the machine is turned on and is responsible for loading the BIOS and BDOS and then the CCP. The compilers, interpreters and applications programs are supplied by other organizations or at least separately from CP/M. However one does get a whole range of 'utilities' with CP/M including an editor, assembler, a program for copying files and these are usually regarded as part of CP/M although they are separate from the BDOS/BIOS and may be replaced by the user's own utilities. +-----------+ +-----------+ +-----------+ +-----------+ | | | | | | | | | Power-on | | Disks | | Display, | | Other | Hardware | jump | +->| | | keyboard | |peripherals| | | | | | | | | | +-----------+ | +-----------+ +-----------+ +-----------+ | | ^ ^ ^ | | | | | | | | | | | | v v v | | +-----------------------------------------+ | | | | Machine | | | Basic Input Output System (BIOS) | dependent v | | | software +-----------+ | +-----------------------------------------+ | | | ^ ^ | cold-boot |<-+ | data | jump | loader | | buffers | vector | | v | +-----------+ +-----------------------------------------+ | | | +------------->| | Machine | Basic Disk Operating System (BDOS) | independent | | software | | | | | | +-----------------------------------------+ ^ ^ ^ | data | BDOS | locations | buffers | commands | 0-256 v | v __________________________________________________________ / | | | \ +-------+ +-------+ +-------+ +-------+ +-------+ | | | | | | | | |applic-| | CCP | |util- | |comp- | | basic | | ation | transient | | | ities| | ilers| |inter- | |pro- | programs | | | | | | | preter| | grams | +-------+ +-------+ +-------+ +-------+ +-------+ ^ | v +-------+ | | | basic | |program| | | +-------+ Figure 1: CP/M operating system. WHY A NEW VERSION IS NEEDED --- - --- ------- -- ------ CP/M, version 2, was released in 1979. At that time a micro-computer with 64K bytes of memory (ie 64 x 1024 x 8 bits of memory) would have been considered large and most micro-computers would have less. Similarly a floppy disk drive with 1 megabyte of storage (ie 1024 x 1024 x 8 bits) was again a lot of memory. Thus the fact that an 8080 or Z80 micro-processor can address only 64K of memory without complex bank-switching mechanisms wasn't really a problem. Similarly, CP/M 2's restriction that individual files could have a maximum length of 8 megabytes or a disk capacity also of 8 megabytes was no real problem. Further most micro-computer users were enthusiasts who were able and willing to deal with a system that was somewhat awkward to use in places and didn't have very high expectations for 'user friendliness' (or for good documentation). The fact that it worked at all, and, in fact, works reasonably well, was enough to keep most users very happy. CP/M based microcomputers have turned out to be most successful and an enormous amount of software is now available from a large number of software writers. It includes compilers for most of the major computer languages, numerous editors and text processing programs, data-base programs, spread-sheet programs (visicalc clones) and apparently every conceivable business program. However, in 1983, limitations of CP/M 2 are becoming very apparent. Because of the success of the micro-computer, users are becoming less sophisticated. They want answers fast and don't want to have to fight with the operating system or learn to interpret weird error messages. With the advent of the 64K bit memory chip, the price of memory has dropped by a factor of 3 or 4 ( not corrected for inflation or devaluation) and it is hard to imagine purchasing a machine for professional use with less than 64K of memory. At the same time hard disk units with more than 8 megabytes of memory are available at an almost affordable price. The Z80 or 8080 based machines are, of course, suffering from heavy competition from machines like the IBM personal which are based on more advanced chips. Eventually, the 8 bit machines will be completely eclipsed by these advanced machines, at least for the professional user. However, at present, because of the huge amount of software available for 8 bit computers, many manufacturers are still producing these machines. Nevertheless, in order to compete with the 16 bit machines with their much improved address range, one wants to be able to use every trick to increase the memory available to an 8 bit machine. Putting all this together, any upgraded version of CP/M for 8 bit machines should (i) be much more 'user-friendly' (ii) have proper documentation (iii) give the user access to more memory (iv) allow longer files and larger capacity disks (v) run programs that were written for CP/M 2 (vi) be implementable on a wide variety of Z80 or 8080 based machines (vii) be flexible enough to allow manufacturers to add extra features (viii) be ready now. CP/M PLUS ---- ---- First, the name. It seems to be called CP/M PLUS. However, once inside the covers of the documentation, it's CP/M 3. The term CP/M 80 seems to be a generic term referring to the family of CP/Ms for Z80s or 8080s. I ordered a 'raw' version, that is, not configured to any particular system. It came on two eight inch floppy disks and was accompanied by 3kg of documentation. The disks contain the files required to generate the BDOS, an example BIOS, a large HELP file, and numerous utilities including 2 assemblers, a debugging program, an editor, a linker, a library program as well as those required for routine file manipulation. The documentation came in two ring-binder files and consists of 5 modules: the User's Guide, Programmer's Guide, System Guide, Programmer's Utilities Guide and Symbolic Instruction Debugger Reference Manual. There is also a pocket guide to the Symbolic Instruction Debugger. The documentation is well presented and of a high standard. I recognize some parts as being lifted from the old CP/M 2 documentation but its largely new and a complete contrast to Digital Research's documentation for CP/M 2. It is impossible for me to be sure how new users would get on, but my guess they would handle the User's Guide with a little outside help. The rest is for programmers only and, apart from a few minor gaps, is fine for them. Incidentally, why do they call it a User's Guide - surely they expect more than one person to use it. In addition there is an extensive HELP file on disk which covers the same material as the User's Guide. I discuss this later. BANKED AND UNBANKED VERSIONS ------ --- -------- -------- CP/M 3 comes in two versions. The unbanked version is a slightly cut down version which is loaded into a single bank of memory - that is it can utilize a maximum of 64K bytes of memory - and requires the same hardware facilities as CP/M 2. Because is offers more facilities than CP/M 2 it occupies more core, about 13K instead of the 6 or 7K that CP/M requires (on my system) and hence less space is available for the user's programs. The banked version uses 2 or more banks (blocks of 64K bytes) of memory. One of these is used for storing one's program and about 4K of CP/M. The rest of CP/M resides on one of the other banks of memory and any remaining memory is used for disk and directory buffers. I will describe these buffers in the next section. Thus about 60K of memory is available for the user's program and a substantially larger than usual area is available for CP/M. To run banked CP/M 3 one must of course have a computer with at least two banks of memory and the necessary hardware for selecting the bank to be accessed. In addition, to permit communication between banks one must have about 4K of memory, at the top of the memory range, which is accessed independently of which memory block is currently selected. This is known as common memory. My CPU board (model CB2 produced by SSM) purchased in 1980 has 4K of memory which doesn't know anything about bank select and which is accessed in preference to external memory and so very easily provided me with the common memory facility. I don't know whether this was just luck or whether the board's manufacturers predicted the appearance of CP/M 3. My system currently has two 64k blocks of memory and one 16K one and a memory mapped disk drive. I have sketched out a map of its memory allocations in figure 2. Note that a copy of the CCP is stored in memory so that it can be loaded almost instantly without accessing the disk at each warm boot. 64K +---------+ | A | 4K of common memory - accessible +---------+ from all banks 60K +---------+ +---------+ | used by | | | | disk | | | A: used by CP/M |---------| | | B: disk buffer area | | | | | A | |available| | | | for | | | |transient| |---------| | program | | | | | | | | | | B | | | +---------+ | | | | | B | | | | | |---------| | | | | | CCP | 0K +---------+ +====A====+ +---------+ bank 0 bank 1 bank 2 Figure 2. Memory layout for CP/M 3. BLOCKED DISK TRANSFER ------- ---- -------- CP/M programs usually expect to transfer data to and from disks in records of 128 bytes. However the disks themselves frequently work more efficiently if larger blocks, say 1024 bytes, are used. If one wants to read a file sequentially, that is, starting at the beginning and then reading it in order, there is no problem. The operating system reads the first 1024 byte block into a buffer and passes each of the first eight 128 byte records across to the program as they are required. Then the second block is loaded and the process continues. Writing is similarly straight forward. The problem arises when a program is reading from and/or writing to several files. Usually there is only one buffer area for the blocks so if, for example, a program wants to read a 128 byte record from one file and then write a 128 byte record to another, the original 1024 byte block read into the buffer by the initial read will be destroyed by the write operation and will have to be reloaded when the second record is required to be read. In the worst situation each record read will require a disk operation as opposed to one every 1024/128 = 8 record reads and each write will require both a read and a write operation. Similar considerations will apply when one is randomly accessing files - that is reading or writing records in an order that is not sequential. The resulting disk operations are likely to be very slow and subject the disk drive and floppy disks to unnecessary wear. The obvious solution is to use several buffers so each file being read or written can have its own buffer. This is what CP/M 3 does, with the buffers being stored in the extra memory banks so that they don't reduce the space available to programs. To see what difference this makes in practice, I carried out a series of time trials with CP/M 2, the unbanked version of CP/M 3 with only one buffer block and the banked version with a large number of blocks available. The results are given in table 1. The first example was with ratfor, a program which reads a file containing a program written in ratfor ("rational fortran") and translates it to regular fortran. Thus one file is read and another is written. The program makes little attempt to block the input and output. The second example is a regular fortran compile with one file being read and two written. In this case the material does tend to be read and written in chunks so less rereading and rewriting of the buffers might be expected than in the ratfor example. Minor differences in the timings are probably not significant since the timings depend to an extent on the way the files are placed on the disk and this varies from run to run. Since no blocking is required for the disk using 128 byte blocks (a standard single density disk), CP/M 3 does not use its blocking-deblocking code and the timings for the two versions of CP/M 3 are the same. For the disk using 1024 byte records, CP/M 2 and the unbanked (or more accurately the single buffer) version of CP/M 3 perform about as well as for the disk with 128 byte records for the ratfor example and somewhat better for the fortran compile. However gains are made for both examples when the banked version of CP/M 3 is used. In fact, for the ratfor example the difference in disk activity was quite dramatic, almost continuous disk activity was replaced by just an occasional access when the banked version of CP/M 3 was used. The final set of tests was with a virtual disk - that is RAM memory being used to simulate a disk. 'Disk' transfer times are negligible and all 3 operating systems work equally well. I think the increase in speed with CP/M 3 is well worth having but it is not nearly as large as some people would have us believe. A similar system applies to the disk directories. Directory information for each file occupies 32 bytes so multiple buffer deblocking is also used for them. One can also configure CP/M 3 to use more efficient methods of scanning the directories to find a requested file. I can imagine such techniques would be important for high capacity hard disk but cannot detect any difference with my 1 megabyte floppy disks. Note that CP/M 3 does not use the buffers when it does not have to, for example when the disk itself uses 128 byte records or when whole blocks can be loaded directly into memory, say when loading a program. CP/M 3 does not appear to make a cponsistent effort to minimize disk operations with random access files beyond the simple buffering I have just described and so, for normal use, there is no sense in allocating vast amounts of memory to the disk buffers. Operating Disk Timing (seconds) System Ratfor F80 CP/M 3 banked \ 128 byte 93 81 CP/M 3 unbanked / CP/M 2 1K byte 94 67 CP/M 3 unbanked 1K byte 94 63 CP/M 3 banked 1K byte 72 51 CP/M 2 \ CP/M 3 unbanked Semidisk 61 30 CP/M 3 banked / Table 1: Timings for disk operations. OTHER IMPROVEMENTS ----- ------------ We have now covered the best known features of CP/M 3. This section covers the numerous minor differences which, when put together, really make the difference. BDOS commands: The BDOS commands are the commands that the transient program can direct to the BDOS part of the operating system. The include the commands for reading and writing to and from the current console and the auxiliary device (formerly the tape punch/reader), reading and writing to and from files, opening and closing files, setting options and finding the state of the system. CP/M 2.2 has 38 of these, CP/M 3 has 63. The extra ones are for file manipulation, implementing the extra facilities of CP/M 3 and include nice ones such as those for generating an FCB (file control block) from a file name and chaining to another program and a nasty one for returning CP/M 3's serial number. Apart from functions 7 and 8, access IO-byte, and 27, get disk allocation vector, all CP/M 2.2 BDOS functions work in CP/M 3. Maximum disk and file length: These have been increased from 8 megabytes each to 32 and 512 megabytes respectively. Since a disk on my system can hold a maximum of just over 1 megabyte, I haven't tested this. User numbers: As in CP/M 2 files can be assigned to any of 16 user numbers. User numbers are the poor man's version of the subdirectories used on some larger computers. Suppose, for example, the CP/M command "USER 9" has been entered. Then any file generated will be tagged as belonging to user 9 and under CP/M 2 only files so tagged will be accessible and these will be the only files whose names will be listed by a call to DIR. This provides a convenient way for several users (ie people) to use one disk without running into conflict over file names or losing their files amongst those of the other users in a directory listing. Similarly, it is also useful for separating the files of several different projects for a single user. Naturally users of floppy disks will tend to have a disk for each project or user so user numbers are not very important but for hard disk users I imagine that user numbers are essential. The problem in CP/M 2 was that programs would normally access only files tagged with the currently assigned user number so that, in particular, the standard utilities such as PIP, STAT, ED etc had to be stored separately under each user number being used with a consequent waste of space. Worse still, to get them there one would normally user the 'copy from another user area' option of PIP. But one first had to get PIP to that user area from the default user number, user 0. To do this one first loaded PIP with the debugging program DDT, exited, entered the USER command to get to the desired user area, and then used SAVE to save PIP in the appropriate user area. SAVE, however, wants to know the length of the file to be saved. In fact, DDT has printed this out - in hex. But SAVE wants to know it in a decimal number of 256 byte blocks. Its easy to work out, but the whole procedure is awkward and not for the non-computer person. In CP/M 3, if the system can't find a file in the current user area it will look under the system files under user 0 (files can be tagged 'system' and will not show up under a normal directory listing, but they are still there and can be accessed and manipulated), so the duplication of utility routines and adhoc methods of initially copying PIP are avoided. In addition if the current user number is not equal to zero, it is printed out with the system prompt, so one is reminded what user number one is working under. Command line editing (banked version only): A line being entered can be edited without having to delete back to the character to be edited. In addition, the last line entered can be recovered, edited and entered again, so that a line rejected by a program because of syntax errors need not be retyped. A grumble about this facility is that the editing keys have been fixed by Digital Research and may not agree with the corresponding keys used by one favourite editor. Also, one's display unit must backspace without deleting on receiving control-H. One now has the option to make the delete key backspace and delete rather than echo as it does with CP/M 2. Another command line facility enables one to enter several commands on one line. Disk change: CP/M 3 attempts to detect a floppy disk change so that it is not absolutely necessary to do a control-C when changing a disk. If the floppy disk drive sets a flag when the drive door is open then a disk change will always be detected. Otherwise, the directory is sumchecked every time a new program is begun and the sumcheck compared with the previous time this was done. In this situation a disk change will not always be detected and it is probably advisable to enter a control-C, particularly if the next program involves disk writes. Temporary disk: Several programs such as editors, SUBMIT described in the next paragraph, want to generate temporary files to be deleted when they finish executing. The current default disk is often not the appropriate disk for these files. CP/M 3 allows one to designate a particular drive as the default drive for these files. Submit: SUBMIT is another CP/M 2 command that appears in CP/M 3 in a much cleaner form. XSUB is now automatically included in submit (did you ever figure out the rules governing XSUB?). Suppose you frequently wish to enter the same set of commands or a single rather complex command, possibly with some unknown parameters. Then you make a file containing these commands with $1, $2, ... replacing the items you might wish to vary from run to run. Now you can SUBMIT this file, if necessary specifying the unknown the variable parameters, and they will be executed without further intervention. Data to be read by the programs from the terminal or alternatively from the submit file if each such line is preceded by the symbol <. At power-up the the system will look for a file PROFILE.SUB and submit this file, if present. This provides a simple way for setting the directory search order (see below) or displaying a logo when the machine is turned on. Submit files can, themselves, include submit statements, but each level eats up a little more memory - see the section on RSX's below. As in CP/M 2 SUBMIT writes a file to disk containing the submit commands. However, this disk, is the temporary disk, I have just described, and if this is a virtual disk much of the grinding of the disk drive associated with SUBMIT in CP/M 2 can be avoided. Programs can now return a 'return code' which can be used to indicate whether a program performed correctly. SUBMIT files can now contain conditional lines which are executed only if the preceding program returned a successful code. However the extra features of SUBMIT tend to make one think "wouldn't it be nice if it also did this" and I wouldn't be surprised if improved versions appeared. Directory search: Often the files one is working on will be on the drive designated as the default drive. However the utilities and compilers will be on another drive. CP/M 3 allows one to specify a list of up to four drives through which the CCP will search for a program to be executed. Note that this will not work for the (data) files which the program is to access. These must be on the default drive or have their drive names specified. In CP/M 2, to call a program, one simply enters the name of the program with the standard suffix, .COM, omitted. In contrast, one can configure CP/M 3 so that if a command is entered, the CCP attaches the suffix .SUB and attempts to find and submit the resulting file and failing this will try the suffix .COM and attempt to find and execute the resulting file. Since many of my programs are driven from files to be submitted, this is how I have CP/M configured on my machine. Alternatively, one can give .COM files precedence, or one can follow the same protocol as CP/M 2. Disk errors: In CP/M 2 if a disk read error is detected a cryptic error message is returned and the program exits with the loss of any data in core. This can be the source of many tears if one is in, for example, a word processing program and is just saving one's latest best-seller after many hours of work. Of course, one should regularly save a manuscript, so minimizing the possibility of losing a large amount of work through a system failure (or power cut). In CP/M 3 the error message depends on the author of the BIOS. However CP/M 3 gives the opportunity for a program to maintain control after a disk error and so a 'soft landing' can be programmed. IO device assignment: Like CP/M 2, there are five 'logical' devices, the console keyboard, the console display, the printer, the tape reader - now called the auxiliary input device, the tape punch - now called the auxiliary output device. However these can be assigned to a maximum of 16 physical devices defined in the BIOS. Five pairs of locations in the System Control Block (see below) replace the IO byte of CP/M 2 for determining the current assignments. Each logical device can be defined to more than one physical device, if output is to be sent to several devices or input is to be collected from more than one device. PUT and GET: One sometimes wishes to gather up the output from a program and store it in a file: for example one might be testing a program, or one might want sample outputs for documentation. This can be done by using the command PUT before running the program. Similarly program input normally entered via the keyboard can be picked up from a file using GET which is essentially a cut down version of SUBMIT. By using a PUT command followed by a GET command one can feed the output of one program into another simulating the pipes that UNIX addicts are so fond of. PIP and archive: PIP is essentially the same as in CP/M 2. However there is an additional option - the archive option. Files of a disk can be flagged as 'archived'. With the archive option set PIP will copy only files which are not flagged as archived and then flag these files also as archived. This provides a very convenient way of backing up new or modified files on a disk without having to copy the entire disk after each session. Date, password and disk label: Files can be 'time stamped' with their creation dates and either their last access date or last update date. To use this facility the disk directory must be reorganized with each fourth directory entry containing the data for the preceding three files. Thus the maximum number of directory entries will be reduced by a quarter. I haven't tested this facility as my computer does not have a clock. One can also label a disk. This uses another directory entry location. CP/M 3 also provides a facility for password protecting files against either unauthorized reading, writing or deleting. It's only limited protection as one could easily write a program to override it. It's my impression that security devices like this cause more trouble than they are worth. However, if you don't have an Official Information Act in your household you might want the limited amount of protection provided. Help file: CP/M 3 comes with a 62 kilobyte help file describing all the commands associated with CP/M and its standard utilities. It is organized with main headings, sub-topics, sub-sub-topics etc and comes with a little .COM file for accessing it. The help file can readily be edited or added to so you can add explanations of your own programs. It actually works pretty well, however again one keeps feeling 'wouldn't it be nice if they also included this facility'. The 62K length would pose problems for people with low capacity disks. DIR, ERA, REN, TYPE: The directory, erase, rename, type operations, DIR, ERA, REN, TYPE which were carried out by the CCP in CP/M 2 are now carried out by the CCP when in their most elementary form; if called with options they call separate programs stored on files DIR.COM, ERASE.COM, RENAME.COM and TYPE.COM. The options allow one to request a sorted directory with each file size and flags displayed, or request confirmation before erasing a file. RENAME does not have options, however, it prompts for the new and old name if these are not specified in the call and if a file with the new name already exists requests permission to delete it. An additional command DIRSYS is used for listing the names of system files. System control block (SCB): Numerous pieces of information about the current state of the operating system is included in a 100 byte block known as the system control block. This includes the number of console rows and columns, the directory search order, the input/output redirection data, the time and date, the current column position. There is a BDOS command for accessing and, in some cases, altering the SCB. Resident system extensions (RSX's): Frequently one would like to squeeze a some translation between ones program and the BDOS or perhaps add extra BDOS commands. For example, I have an inexpensive imitation of Visi-calc. This program is unable provide the correct cursor positioning commands required by my display. The simplest solution is to trap the console output commands and translate them to a form suitable for my display. CP/M 3 contains the necessary facility for doing this. An RSX is a small chunk of code which is attached to a .COM file and which automatically is attached to the bottom of CP/M when the .COM file is loaded. It intercepts the appropriate BDOS commands and passes the others on to the BDOS unmodified. It may be programmed to vanish when the program ends or stay until it is commanded to detach itself. SUBMIT, GET, PUT and also SAVE (which must be entered before the program to be saved is run) are examples of RSX's. Another obvious application, is to intercept the command that returns CP/M's serial number so you can run your friend's software despite a manufacturer's attempt to prevent sharing software - but you wouldn't do that, would you? THE UTILITIES --- --------- As well as the utilities I have already described, CP/M 3 comes with the utilities ED, MAC, RMAC, LINK, SID, LIB. In one sense it is quite a bargain, the prices of these utilities, if bought separately add up to about the same as the cost of CP/M 3. However, in fact, they don't add very much to the software I already own, and beyond what was required for generating the BIOS won't get much use from me. ED This is an augmented version of Digital Research's well-known editor. I have never used it or its predecessor and while I imagine it would have its uses if I ever came to grips with it, it seems very old fashioned compared with the screen editor I now use. MAC and RMAC MAC is an assembler (i.e. it compiles assembly language programs), very much more powerful than ASM which comes with CP/M 2, with extensive macro facilities. RMAC is a similar assembler which produces relocatable code to be linked into executable files by LINK or Microsoft's L80. RMAC's macro facilities are required for assembling some of the routines for the BIOS. However it accepts only Intel's mnemonics for the machine instructions plus some imitation ones for the Z80 codes. I consider Intel's mnemonics almost impossible to use and so prefer to use Microsoft's macro assembler, M80, which accepts the much more understandable Zilog mnemonics. LINK This is linking program used to link the output from RMAC, Digital's PL1 compiler, and also output from Microsoft's M80 and F80 into executable code. It has a number of options which enable it to produce overlayable code or code that is relocateable at run time. It is required for linking the BIOS for CP/M 3 or for building RSX's. To use the overlay capability one needs either DR's PL1 compiler to get the runtime overlay routines or one will need to do some detective work in order to write one's own. Unfortunately its run time is almost twice as long as for Microsoft's L80 so I won't be using it for linking standard programs. LIB This is a program for building and combining libraries of relocatable files of the type produced by RMAC. I haven't used it yet and cannot say how it compares with the equivalent Microsoft product. SID This is a very much augmented version of DDT (which comes with CP/M 2) and is used for debugging assembly language programs. I used it a little when bringing up CP/M 3. It, too, uses Intel mnemonics and it can be fouled up by Z80 instructions. I won't use it much as I don't do much assembly language programming. COMPATIBILITY WITH CP/M 2 ------------- ---- ---- - Of course, CP/M 3 must be able to run most programs written for CP/M 2 if it is going to have any acceptance. Programs are supposed to communicate only via the BDOS commands - see figure 1. However, some do access the BIOS commands or other parts of CP/M or even access the peripherals directly. The BDOS commands of CP/M 3 are extensions of those of CP/M 2 and so, as a general rule, we would expect programs that obey the rules to work correctly under CP/M 3. One exception is programs that access the disk allocation vector (which shows which disk blocks are allocated and can be used for seeing how much disk space is free). This vector, which is located using BDOS function 27 is not accessible under the banked version of CP/M 3 and so any programs that need it will have to be rewritten. A new BDOS function is available for finding the free disk space. I don't know whether this function is used much in commercial programs but as a last resort one could write an RSX to intercept BDOS function 27 and return the address of a simulated disk allocation vector with the correct free space. Programs which access BIOS functions may or may not work. The disk functions have been modified and in any case they would be unlikely to work under the banked version of CP/M 3 since they expect to be called from the first memory bank. However the character I/O commands should still work. CP/M 3 includes a special BDOS function for accessing the BIOS functions and presumably this gets the banking right. Accessing other parts of CP/M, will work only if those parts are in common memory in the banked version and can still be located correctly. Accessing peripherals directly via IN and OUT instructions should cause no problems. However, other methods of accessing peripherals may cause problems. My system has a memory mapped disk controller - ie, it is accessed by reading and writing to and from memory locations rather than by using IN and OUT instructions. The section of memory used is allocated to the first bank and so direct access to this is not possible under the banked version. Thus, in particular, my disk formating program which wants to access these locations will not run under the banked version and it is necessary for me to maintain an unbanked version to run this program. Some control characters seem to be handled slightly differently. In particular, while ^s is used for stopping output as in CP/M 2, a ^q is now required to restart it, rather than any character apart from ^c. Control characters ^p, ^q, ^s, are intercepted by BDOS function 6 unless it is specially instructed not to and this causes a minor problem for one of my programs, a problem which I could overcome by writing a suitable RSX. The IO-byte used for redirecting output is now replaced by a more sophisticated control mechanism and BDOS functions 7 and 8 now have a different use; this might affect a few programs. The functions of the utility STAT which accessed the IO-byte have now been taken over by a series of utilities, DIR, SHOW, SET but I don't think this will upset many users. One possible area for problems is with systems that use interrupts. An interrupt is a mechanism whereby the hardware can gain temporary control of the processor, perhaps to pick up input from the keyboard or modem or to send another block of text to the printer. I do not know whether interrupts are disabled when a memory bank other than the one holding the program is being used, but if not there will be trouble. ADAPTING CP/M TO YOUR SYSTEM -------- ---- -- ---- ------ The first problem is getting a copy of the raw version of CP/M 3. Digital Research appears to consider it too complicated for the hobbyist to convert it for his/her own system. In fact it isn't, although it is not a project to be undertaken lightly. I doubt whether Digital Research would offer any advice or support for any amateur attempting to this. It is not widely advertized but is available from a limited number of sources. CP/M 3 comes with reasonably detailed instructions. One needs to generate the BIOS (see figure 1), a cut down BIOS for the cold-boot loader and a program to load the cold-boot loader onto the system tracks of a floppy disk. One should start by building a minimal unbanked system and then slowly build it up till one gets the system one wants. Because the BDOS does the disk deblocking, rather than the BIOS, it is possibly a little easier than building an equivalent system for CP/M 2. The instructions for doing the full BIOS were reasonably good but I seemed to need to do a bit of detective work to build the cut-down BIOS for the cold-boot loader. The BIOS including the interface for the Semidisk involved about 1500 lines of code (a few hundred would have been copied from other sources), the cold-boot BIOS involved 270 lines and the program to set up the system tracks 350 lines. A program GENCPM is supplied for putting everything together and the process is much more logical and less mysterious than for CP/M 2. In particular, it seems very reasonable for an amateur who can program in assembly language to modify an existing CP/M 3 BIOS to accommodate any special requirements or new pieces of hardware. FINAL COMMENTS ----- -------- I hope I have indicated some enthusiasm for this new version of CP/M. It is true that many of its features such as help files, the improved directory searching, program chaining can be implemented under CP/M 2. In addition, there still some rough edges, perhaps brought about by the realisation that it is better to have the present version now, rather than the perfect version long after the 8 bit chips are dead and buried. However, within the limitations of being compatible with CP/M 2 and the need to release it sooner rather than later, I think it represents a substantial improvement over CP/M 2, bringing together a large number of new features in a unified manner, which together add up to quite a lot. I think there is the opportunity for a manufacturer to put his/her own mark on the system without making it incompatible with standard CP/M 3. An obvious example would be the addition of a visual CCP, perhaps with icons or pictures for program selection. However, I don't expect many CP/M 3 only programs to appear on the market. CP/M 3 is not really a new system and the casual user would probably not notice any difference except perhaps that the familiar CP/M prompt appears immediately after a program terminates and possibly that some programs that use a lot of disk accesses run a little faster. With further use, however, he/she would find that things go wrong less often. After reading the documentation or using the HELP file he/she would begin using the line editing facilities and perhaps PUT, GET and the improved facilities of SUBMIT and begin to appreciate the host of minor additions. At this point the user might think about reorganizing the way disks are used, particularly if the system has a hard disk. This would involve the use of user numbers, time stamping files, and systematically backing up the working disks using the archive option. A programmer would appreciate some of the extra BDOS commands, the more logical structure and the extra memory. Should you get CP/M 3? If you are given the choice, I think the answer is yes. If you are getting a hard disk system, this is a very strong yes (except that perhaps you shouldn't be buying an 8 bit system), otherwise it really depends on how much you can afford and the size of your system. t impossible to use and