CP/M-86 Timeline: Difference between revisions
Dr. Shuppet (talk | contribs) |
→Replaced functions: Clarified function 49 |
||
(29 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:Preservation and Documentation]] | [[Category:Preservation and Documentation]] | ||
[[File:CP M-86 version timeline, revision 1.png|thumb|Timeline of CP/M-86 versions up to Concurrent PC DOS 3.2]] | |||
This is a project aiming to document the timeline of various versions of the '''CP/M-86''' operating system, focusing primarily on those released for the IBM PC. | This is a project aiming to document the timeline of various versions of the '''CP/M-86''' operating system, focusing primarily on those released for the IBM PC. | ||
Line 26: | Line 27: | ||
* How were resources used to generate the CCPM.SYS kernel distributed? The typical CCP/M distribution includes everything to develop programs in assembler (ASM86, GENCMD, DDT86), but not GENCCPM and the .CON files. Generating a kernel is needed to include Resident System Processes, was that reserved to hardware manufacturers only? | * How were resources used to generate the CCPM.SYS kernel distributed? The typical CCP/M distribution includes everything to develop programs in assembler (ASM86, GENCMD, DDT86), but not GENCCPM and the .CON files. Generating a kernel is needed to include Resident System Processes, was that reserved to hardware manufacturers only? | ||
* Is it possible to reconstruct the original .CON, .MPM and .H86 files (eventually .A86 disassembled source) from built CPM.SYS, MPM.SYS, PCPM.SYS, and DOSPLUS.SYS kernels? How difficult is it? (The CP/M-86 1.1 BIOS linked below was reconstructed this way, disassembled and annotated.) | |||
* Does the Concurrent DOS 6.0 P_CLI (Supervisor Command Line Interpreter call) interpreter accept DOS or CP/M-86 commands? | * Does the Concurrent DOS 6.0 P_CLI (Supervisor Command Line Interpreter call) interpreter accept DOS or CP/M-86 commands? | ||
== Timeline table == | == Timeline table == | ||
Line 47: | Line 48: | ||
|- | |- | ||
| CP/M-86 for IBM PC and IBM PC XT 1.1 || 2.2 || August 1983<sup>BDOS source date</sup> || CP/M-86 for IBM PC 1.1 || - || IBM PC CP/M single-side (160k) and double-side (320k) floppy disks, IBM XT (and later) fixed disk || [https://winworldpc.com/download/c5be5fc3-8ae2-80a1-c398-c2b211c3a5ef 320k floppy (WinWorld)], [http://www.cpm.z80.de/download/cpm86src.zip BDOS and CCP source code] | | CP/M-86 for IBM PC and IBM PC XT 1.1 || 2.2 || August 1983<sup>BDOS source date</sup> || CP/M-86 for IBM PC 1.1 || - || IBM PC CP/M single-side (160k) and double-side (320k) floppy disks, IBM XT (and later) fixed disk || [https://winworldpc.com/download/c5be5fc3-8ae2-80a1-c398-c2b211c3a5ef 320k floppy (WinWorld)], [http://www.cpm.z80.de/download/cpm86src.zip BDOS and CCP source code] | ||
|- | |||
| CP/M-86 Plus 1.0 for Apricot PC || 3.1 || November 1983<sup>Installation guide</sup> || Likely Concurrent CP/M-86 2.0, partly CP/M-86 1.1<ref group="note>This is a hybrid version between CP/M-86 and CCP/M, having CCP/M's multitasking and BDOS, but CP/M-86's CCP and simple kernel structure</ref> || Simple multitasking || ? || [https://archive.computerhistory.org/resources/access/text/2016/12/102762495-05-01-acc.pdf Installation guide] | |||
|- | |- | ||
| Concurrent CP/M-86 3.1 for IBM PC || 3.1 || 1984-01-01 || Concurrent CP/M-86 2.0 for IBM PC || Multitasking, virtual screens, windowing, DOS application support add-on || Same as above || [https://winworldpc.com/download/c380c388-c3bc-70c3-98c2-b211c3a5c28f 320k floppy 1 (WinWorld)], [http://www.cpm.z80.de/download/ccpmv31.zip source code], [https://winworldpc.com/download/c2bb1e5d-c383-c398-c2b2-11c3a5c28f13 manual (WinWorld)] | | Concurrent CP/M-86 3.1 for IBM PC || 3.1 || 1984-01-01 || Concurrent CP/M-86 2.0 for IBM PC || Multitasking, virtual screens, windowing, DOS application support add-on || Same as above || [https://winworldpc.com/download/c380c388-c3bc-70c3-98c2-b211c3a5c28f 320k floppy 1 (WinWorld)], [http://www.cpm.z80.de/download/ccpmv31.zip source code], [https://winworldpc.com/download/c2bb1e5d-c383-c398-c2b2-11c3a5c28f13 manual (WinWorld)] | ||
Line 63: | Line 66: | ||
[[File:CPM-86 1.0 for IBM PC.png|thumb|CP/M-86 1.0 for IBM PC booted on 86box]] | [[File:CPM-86 1.0 for IBM PC.png|thumb|CP/M-86 1.0 for IBM PC booted on 86box]] | ||
Officially named CP/M-86 for the IBM Personal Computer Version 1.0, this is the first version of CP/M-86 for the IBM PC. It was delayed around eight months after the IBM PC release in August 1981, giving it a late start against IBM PC DOS 1.0, itself a clone of CP/M. | Officially named CP/M-86 for the IBM Personal Computer Version 1.0, this is the first version of CP/M-86 for the IBM PC. It was delayed around eight months after the IBM PC release in August 1981, giving it a late start against IBM PC DOS 1.0, itself a clone of CP/M. Minimum RAM required for the system to boot is 32kB, although at least 48kB is needed to fit a non-trivial application like PIP and STAT. | ||
Unlike DOS, which ships with IBM BASIC as the built-in programming tool, CP/M-86 included ASM86, an 8086 version of the CP/M-80 assembler ASM. The assembler produces .H86 files with machine code, which can be transformed into relocatable executables wit h the GENCMD utility; this is an improvement upon both CP/M-80 and DOS, both of which use memory images (raw binaries) for programs. CP/M-86 manual also metion a LMCMD program for creating .CMD file from Intel 8086 relocatable object files (which are likely produced by Intel tools like the PL/M compiler<sup>citation needed</sup>), but the IBM PC distribution doesn't ship it. | Unlike DOS, which ships with IBM BASIC as the built-in programming tool, CP/M-86 included ASM86, an 8086 version of the CP/M-80 assembler ASM. The assembler produces .H86 files with machine code, which can be transformed into relocatable executables wit h the GENCMD utility; this is an improvement upon both CP/M-80 and DOS, both of which use memory images (raw binaries) for programs. CP/M-86 manual also metion a LMCMD program for creating .CMD file from Intel 8086 relocatable object files (which are likely produced by Intel tools like the PL/M compiler<sup>citation needed</sup>), but the IBM PC distribution doesn't ship it. | ||
Line 70: | Line 73: | ||
To create a system floppy, the floppy formatting utility NEWDISK has to be run with the paramter $S ($DS for a double sided disk). This will copy both the bootloader and the bootstrap kernel onto the disk, similarly to what the SYSGEN utility does for CP/M-80. | To create a system floppy, the floppy formatting utility NEWDISK has to be run with the paramter $S ($DS for a double sided disk). This will copy both the bootloader and the bootstrap kernel onto the disk, similarly to what the SYSGEN utility does for CP/M-80. | ||
=== Concurrent CP/M-86 1.0 === | |||
[[File:Concurrent CPM 1.0 command prompt in 86box.png|thumb|Concurrent CPM 1.0 booted in 86box (IBM PC 1982)]] | |||
While CP/M-86 for IBM PC's only major advantage over PC DOS was easier porting of existing CP/M-80 software, Digital Research also had MP/M-86, an 8086 port of the ambitious multiuser multi-terminal MP/M operating system. The IBM PC was, however, meant to be used by a single user. Digital Research decided to add virtual screens into MP/M-86; the result was released as Concurrent CP/M-86 1.0 a few months after CP/M-86 for IBM PC 1.0. | |||
Concurrent CP/M-86 1.0 has four virtual screens, each one of which can run a CP/M-86 program, enabling users to upgrade their IBM PC hardware to a multitasking OS while keeping their old software. The OS is however limited by both disk space and RAM, since its kernel is 92kB large (compare to CP/M-86 1.1 kernel, which is only 18kB). This makes the system require two 160k floppies to run, the first one for the kernel and help file, the second one for the rest of the system utilities. The maximum memory of the IBM PC is only 256kB, which imposes limitations on how the system is used in practice; with four parallel programs and a ramdisk, one might easily run out of memory. | |||
To make working with a two-floppy system easier, a program named SYSDISK is used specify a "system disk", which is a primitive analogue of Unix PATH: if a program is not found on the current drive, it is searched on the system disk (B: by default). For example if you replace the system disk 1 in drive A: with WordStar, you can still run system commands present on drive B: without switching the default drive or prefixing the command with B:. | |||
A slightly unexpected incompatibility is found with the shell, which is not CCP used in CP/M-86, but a slighly more complex equivalent from MP/M-86 called Terminal Message Process. Known differences include the absence of a DIRS command, DIR [SYS] being used instead to list system files, and more detailed error messages like "Can't Find Command", "Bad File Spec", or "Bdos Err On X: Select" insteaf of "COMMAND?" and "X:?". | |||
=== CP/M-86 for IBM PC 1.1 and CP/M-86 for IBM PC XT 1.1 === | |||
<gallery> | |||
File:CPM-86 1.1 for IBM PC boot screen.png|thumb|CP/M-86 1.1 for IBM PC booted on 86box | |||
File:CPM-86 1.1 SETUP utility.png|thumb|CP/M-86 1.1 SETUP utility main screen on 86box | |||
</gallery> | |||
With a kernel timestamp of March 1983, CP/M-86 for IBM PC 1.1 is an update to CP/M-86 for IBM PC 1.0, suited for situations where one wants to save RAM at the cost of multitasking. Despite being released around the time of the IBM PC XT, its initial version had no fixed disk support. Overall, it is very similar to CP/M-86 1.0, for example it has the same memory requirements. A change visible at first glance is a colored status bar and a new boot message displayed by the new bootloader, which now loads the CP/M-86 kernel from a file named CPM.SYS. For the bootloader to work, CPM.SYS has to be the first file on the floppy. | |||
Command line tools COPYDISK, NEWDISK, FUNCTION, PROTOCOL, and SPEED from CP/M-86 1.1 were replaced with text user interface programs DSKMAINT, FUNCTION, and CONFIG. A new TUI tool called SETUP was instroduced, which allows the configuration of hardware parameters in the kernel and additional functions. Power-On Command Line allows the user to include a command that will be launched on boot; it can only run one command, for running multiple commands, SUBMIT must be used. Memory Disk allows allocating a portion of RAM to store files, which was a key functionality for CP/M-86, since disk access was slowed down by to both hardware limitations and system calls going through several layers (BDOS, CP/M-86 BIOS, IBM PC BIOS). | |||
A later release from August 1983 added fixed disk support, again coming late compared to PC DOS 2.0 released with the IBM PC XT. Also unlike PC DOS 2.0, which was an ambitious release with many new features, CP/M-86 still has no directory support and lacks any Unix compatibility. The HDMAINT utility was added for hard drive formatting, which together with the bigger kernel causes the system not to fit on a single-sided 160k floppy anymore, hence this version is distributed on a double-sided 320k floppy. | |||
=== CP/M-86 Plus 1.0 and derivatives === | |||
[[File:Personal CPM 2.0 for Siemens SICOMP PC 16-20.png|thumb|Personal CPM 2.0 for PC 16-20, a derivative of CP/M-86 Plus, running in 86box]] | |||
CP/M-86 Plus is a relatively unknown version of CP/M-86 created sometimes around November 1983 (based on its installation guide date), initially for the Apricot PC. It combines some MP/M-86 features with the more lightweight CP/M-86, in parallel to CP/M 3 (also called CP/M Plus) for Intel 8080 systems. It also includes some calls that are not in MP/M-86 and Concurrent CP/M-86, but are in CP/M 3. Like MP/M, its kernel CPMP.SYS is build with a GENSYS utility, called GENCPM. A notable difference from MP/M is the use of the classical CP/M BIOS, BDOS, CCP architecture of the kernel; a new feature of CP/M-86 Plus is the CCP being optionally outside the kernel as CCP.CMD. | |||
Some sources claim that CP/M-86 Plus was never released<ref>https://computer.fandom.com/wiki/CP/M-86</ref>, however, others mention it was released for the Apricot PC, and there are screenshots of it running on an Apricot emulator<ref>http://www.seasip.info/Unix/QDAE/screens.html</ref>. Personal CP/M-86, released for the Apricot PC and for Siemens industrial computers, and DOS Plus are derivatives of CP/M-86 Plus. | |||
Siemens PC16-20 is compatible with IBM PC, hence Personal CP/M-86 2.0 for PC16-20 also runs on PC hardware. Its internal version number 1.2 and BDOS version 4.1 suggest a close relationship to DOS Plus 1.2, and its CCP.CMD can be run on DOS Plus. Unlike proper versions of CP/M-86 for the IBM PC, it seems to lack single-sided floppy support. | |||
=== Concurrent CP/M-86 3.1 for IBM PC === | |||
Concurrent CP/M-86 3.1 brings the features of CP/M-86 for IBM PC XT 1.1 like colored status bar and fixed disk support to the Concurrent CP/M-86 line. Like its predecessors, it runs from two floppies with the help of SYSDISK. There is a special release for IBM PC with Starlink communication card, which is the only preserved full release; we have only the first floppy for regular IBM PC, nevertheless it is enough to boot the system because the Starlink release only differs in the kernel. | |||
A new feature of Concurrent CP/M-86 3.1 is windowing: the ability to see more than one virtual screen at once by splitting the physical screens into separate rectangles. It also allows each window to have different colors. The WINDOW tool is used to set up windows from the command line; alternatively, WMENU installs the window manager, allowing interactive manipulation of windows. | |||
== API evolution == | |||
The following information is based directly on publicly available CP/M manuals. Due to subtle changes between structures and register values, and to keep documenting the evolution feasible, only register usage changes will be described for the most part. | |||
=== CP/M-86 1.0 === | |||
The first release of CP/M for the 8086 architecture shows a direct evolution from CP/M 2.2 for the 8080 architecture. Replacing the previous <code>CALL 5</code> interface, BDOS function calls can be entered through the software interrupt facility of the 8086 via the <code>INT 224</code> instruction. The function code is specified in the byte register <code>CL</code> instead of <code>C</code>, with a single parameter provided in register <code>DL</code> instead of <code>E</code> for 8-bit values, <code>DX</code> instead of <code>DE</code> for 16-bit values, and in the <code>DS:DX</code> register pair for addresses. The return value is found in <code>AL</code> instead of <code>A</code> and <code>L</code> for 8-bit values, <code>AX</code> and <code>BX</code> instead of <code>HL</code> and the <code>B</code>, <code>A</code> registers, and in the <code>ES:BX</code> register pair for addresses. | |||
The CP/M-86 1.0 API is an almost superset of the CP/M 2.2 API with the following additional functions: | |||
* Function 50: Direct BIOS Call | |||
* Function 51: Set DMA Segment Base | |||
* Function 52: Get DMA Segment Base | |||
* Function 53: Get Max Memory Available | |||
* Function 54: Get Max Memory at Abs Location | |||
* Function 55: Get Memory Region | |||
* Function 56: Get Absolute Memory Region | |||
* Function 57: Free memory region | |||
* Function 58: Free all memory | |||
* Function 59: Program load | |||
Other changes include: | |||
* Function 0 (System Reset) got updated with an 8-bit parameter that specifies whether the program should stay in memory. | |||
* Function 6 (Direct Console I/O) accepts a new 8-bit parameter 0FEh for <code>DL</code> that checks for the console status. | |||
* The following functions that take an address parameter will use <code>DS:DX</code>: 9 (Print String), 10 (Read Console Buffer), 15 (Open File), 16 (Close File), 17 (Search for First), 19 (Delete File), 20 (Read Sequential), 21 (Write Sequential), 22 (Make File), 23 (Rename File), 30 (Set File Attributes), 33 (Read Random), 34 (Write Random), 35 (Compute File Size), 36 (Set Random Record), 40 (Write Random With Zero Fill). | |||
* Function 26 (Set DMA Address) takes a 16-bit parameter in <code>DX</code> to change only the offset part of the DMA address. The new function 51 (Set DMA Base) can be used to change the segment portion. | |||
* The following functions that return an address parameter will give the result in <code>ES:BX</code>: 27 (Get Addr(Alloc)), 31 (Get Addr(Disk Params)). | |||
=== CP/M-86 1.1 === | |||
This version still reports BDOS version 2.2, just like CP/M-86 1.0. However it offers two additional functions: | |||
* Function 47: Chain To Program | |||
* Function 49: Get SYSDAT Address | |||
=== MP/M-86 2.0 === | |||
From the API perspective, this version is best understood as a port of MP/M II from the 8080 to the 8086. Similarly to the previous MP/M II, most of the MP/M-86 API is compatible with the single tasking CP/M-86. | |||
Just like CP/M-86, BDOS functions can be accessed through the <code>INT 224</code> interface, with register <code>CL</code> containing the function number. Parameters are passed in <code>DL</code>, <code>DX</code> or <code>DS:DX</code>. The return value is returned in both <code>AL</code> and <code>BL</code> for 8-bit results, <code>AX</code> and <code>BX</code> for 16-bit results, and in <code>ES:AX</code> and <code>ES:BX</code> for address results, effectively duplicating the contents of <code>BX</code> in <code>AX</code>. Compared to CP/M-86, a major change is that many functions use <code>CX</code> to report back an error code. | |||
Compared to both: | |||
* Function 0 provides an error code in <code>CX</code> on failure. | |||
* Function 47 provides a 16-bit result. | |||
Compared to MP/M II: | |||
* The CP/M-86 functions 50-59 have been added. | |||
* Function 128-140, 144-153, 157-164 provide an error code in <code>CX</code>. | |||
* Every function that took an address parameter (except function 26) now expects it in <code>DS:DX</code>: 9, 10, 15-17, 19-23, 30, 33-36, 40-43, 100, 102-107, 129, 130, 134-140, 144, 149-152, 155, 157. | |||
* Every function that returned an address parameter now returns it in <code>ES:AX</code> and <code>ES:BX</code>: 27, 31, 154, 156. | |||
* Function 128 (previously called Absolute Memory Request) is now a duplicate of function 129. | |||
* Function 143 only takes an 8-bit parameter instead of a 16-bit one (the high byte used to specify whether the memory of the subprocess should be released on termination). | |||
* Functions 130, 131, 134, 137, 139, 144, 148, 150 provide a 16-bit result instead of none. | |||
* Functions 129, 132, 133, 135, 136, 138, 140, 161, 162 provide a 16-bit result instead of an 8-bit one. | |||
* Function 149 now uses <code>CX</code> to report an error instead of the <code>A</code> register. | |||
* Some functions are renamed: | |||
** Function 129 is renamed from Relocatable Memory Request to Memory Allocation. | |||
** Function 150 is renamed from Send CLI Command to Command Line Interpreter. | |||
** Function 151 is renamed from Call Resident System Process to Call RPL. | |||
** Function 153 is renamed from Get Console Number to Get Console. | |||
** Function 154 is renamed from System Data Address to Get SYSDAT Address | |||
** Function 156 is renamed from Return Process Descriptor Address to Return PD Address. | |||
Compared to CP/M-86: | |||
* The MP/M II functions 38, 39, 41-46, 48, 100-107, 128-164 have been added. | |||
* Functions 3 (Reader Input) and 4 (Punch Output) have been replaced by the MP/M II functions with the same numbers (Raw Console Input and Raw Console Output). | |||
* Function 6 (Direct Console I/O) now has the 0FDh subfunction. | |||
* Functions 7 (Get I/O Byte) and 8 (Set I/O Byte) have been removed. | |||
* Function 0 does not take an argument | |||
* Functions 53-57, 59 provide an error code in <code>CX</code>. | |||
* Functions 13, 28, 37, 57 provide an 8-bit result (function 37 returned 0 on CP/M-86). | |||
* Functions 15-23, 33, 34, 40 provide a 16-bit result instead of an 8-bit one. | |||
* Functions 14, 35, 50 provide a 16-bit result instead of none. | |||
* Some functions are renamed: | |||
** Function 11 is renamed from Get Console Status to Console Status. | |||
** Function 26 is renamed from Set DMA Address to Set DMA Offset. | |||
=== Concurrent CP/M-86 1.0 === | |||
Compared to MP/M-86 2.0, the only changes in the API are a few functions being renamed: | |||
* Function 1 is renamed from Console Input to Virtual Console Input. | |||
* Function 2 is renamed from Console Output to Virtual Console Output. | |||
* Function 163 is renamed from Return MP/M Version Number to Return CCP/M Version Number. | |||
=== CP/M-86 Plus 1.0 === | |||
Both the 8080 and 8086 versions of CP/M saw an update in 1983. The BDOS APIs of both of them incorporated some of the functionality of their multitasking counterparts, which is reflected in MP/M functions appearing in CP/M Plus and Concurrent CP/M functions appearing in CP/M-86 Plus. The BDOS kernel version also got updated, from 2.2 for the single-tasking versions and 3.0 for the multitasking versions, to 3.1 for both the 8-bit and 16-bit CP/M, however this version number was not generally reflected in the product version number. | |||
To get an overview of the API evolution, we will compare the CP/M-86 Plus 1.0 BDOS API to three versions: the 8-bit CP/M Plus, the previous 16-bit single-tasking CP/M-86 1.1, as well as Concurrent CP/M 2.0. | |||
Just like other 8086-based systems, the BDOS is entered via the <code>int 224</code> instruction, with register <code>CL</code> containing the function number. The registers <code>DL</code>, <code>DX</code> and <code>DS:DX</code> contain the input parameter. The returned value is found in <code>AL</code>, <code>AX</code> or <code>ES:AX</code>, with <code>BX</code> containing a copy of <code>AX</code>. Some function return an error code in <code>CX</code>, similarly to the behavior of Concurrent CP/M. | |||
==== Added functions ==== | |||
CP/M-86 Plus 1.0 alters the collection of functions compared to the 8-bit CP/M Plus, CP/M-86 1.1 and Concurrent CP/M. These alterations can be grouped according to whether they add new functionality without removing other functions, replace one function with another one, typically one with a similar scope, or remove some functionality altogether. | |||
* New functions compared to all other versions: 116 (Set File Stamps), 172 (Auxiliary Block Input), 173 (Auxiliary Block Output) are new compared to all 3 versions. | |||
* Functions new to CP/M Plus only: 51-58. These functions appeared in both CP/M-86 and Concurrent CP/M, typically relating to 8086 specific functionality. | |||
* Functions new to CP/M-86 1.1 only: 44-46, 48, 100-107, 152, as well as function 6 subfunction <code>0FDH</code>. These functions appeared in both CP/M Plus and Concurrent CP/M. | |||
* Functions included from CP/M Plus: 60, 99, 108-112. These are new to both CP/M-86 and Concurrent CP/M. | |||
* Functions included from Concurrent CP/M: 141-143, 147, 154. These are new to both CP/M Plus and CP/M-86. | |||
==== Replaced functions ==== | |||
This section lists functions that will behave differently compared to either of the 3 other systems used in this comparison. | |||
Functions that are included from CP/M Plus, replacing the functions in CP/M-86 1.1: | |||
* Function 7, Auxiliary Input Status, replaces Get I/O Byte. | |||
* Function 8, Auxiliary Output Status, replaces Set I/O Byte. | |||
* Function 49, Get/Set System System Variables, replaces Get SYSDAT address in CP/M-86 1.1. Its behavior is slightly different from CP/M Plus Get/Set System Control Block as well, but it fulfills the same functionality. | |||
These function numbers were undefined on Concurrent CP/M. | |||
The other functions are all inherited from CP/M-86 1.1: | |||
* Function 3 (Read Auxiliary Input), 4 (Write Auxiliary Output) replaced Raw Console Input and Raw Console Output from Concurrent CP/M. These numbers had identical functions on CP/M Plus. | |||
* Function 59 (Program Load) extends the function Load Overlay from CP/M Plus. This function was also present on Concurrent CP/M in its extended functionality. | |||
==== Removed functions ==== | |||
Here we list functions that were removed compared to one of the 3 other systems with no functions replacing them. Some of these existed in a vestigial form that returned 0 without doing anything, for compatibility with multitasking systems. | |||
* Function 98 existed on CP/M Plus but it is not included in CP/M-86 Plus. | |||
* Functions 38, 39, 41-43 existed on Concurrent CP/M but were only provided for compatibility on CP/M Plus. The documentation only mentions 39 existing on CP/M-86 Plus 1.0, but it returns 0 without doing anything. | |||
* Functions 128-140, 144-146, 148-151, 153, 155-164 existed on Concurrent CP/M only. | |||
==== Register usage ==== | |||
Compared to the other 3 versions, the input parameter usage is different in these ways: | |||
* Function 0 and 48 now use <code>DL</code> as input. This is new to Concurrent CP/M and for function 0, to CP/M Plus. | |||
* Function 44 uses <code>DX</code> as input, however it still expects a value between 1-128. | |||
* Function 47 does not take an input parameter anymore, compared to CP/M Plus. | |||
* Compared to CP/M Plus, functions 9, 10, 15-17, 19, 20-23, 30, 33-36, 40, 49, 50, 99, 100, 102-107, 112, 152 now rely on the value of <code>DS</code>. | |||
The output parameter usage is different in these ways: | |||
* Functions 47, 53-57, 59, 152 use <code>CX</code> to return an error code, compared to other versions. Only function 47 changed for Concurrent CP/M in this usage. | |||
* Function 0 does not return a value in <code>CX</code>, compared to Concurrent CP/M. | |||
* Functions 28, 105 return an 8-bit value in <code>AL</code>/<code>BL</code>. CP/M Plus did not return a value, while CP/M-86 only returned a value for 28, Concurrent CP/M for 105. | |||
* Functions 15-23, 30, 33, 34, 40, 53-57 now return 16-bit values in <code>AX</code>/<code>BX</code> instead of 8-bit values. Of these, CP/M-86 returned a 16-bit value for function 57, Concurrent CP/M for all but functions 30 and 53-57. All of these functions that existed on CP/M Plus already returned 16-bit values. | |||
* Compared to CP/M-86, functions 14, 35, 47, 50, 57 now return 16-bit values. Functions 47, 50 did not have return values in CP/M Plus. | |||
* Compared to Concurrent CP/M, functions 141, 142, 147 now return 16-bit values. | |||
* Functions 13, 37, 49 no longer provide a return value. CP/M Plus would return an 8-bit value for function 37 and a 16-bit value for 49. Concurrent CP/M returned 8-bit values for 13, 37. No change of behavior took place compared to CP/M-86. | |||
* Compared to CP/M Plus, functions 27 and 31 now provide a return value in <code>ES</code>. | |||
==== New function names ==== | |||
Starting with CP/M-86 Plus 1.0, the official documentation includes identifier-like mnemonics for BDOS functions, alongside longer, descriptive names. Since the mnemonics are new, only changes to the descriptive names will be described here. | |||
The following functions have new names compared to all other versions: | |||
* Function 27 is now called Get Address of Allocation Vector instead of Get Addr(Alloc). | |||
* Function 31 is now called Get Address of DPB Parameter Block instead of Get Addr(Disk Params). | |||
* Function 53 is now called Allocate Maximum Memory instead of Get Max Mem or Get Max Memory Available. | |||
* Function 54 is now called Allocate Absolute Maximum Memory instead of Get Abs Max or Get Max Mem at Abs Location. | |||
* Function 55 is now called Allocate Exact Amount Memory instead of Alloc Mem or Get Memory Region. | |||
* Function 56 is now called Allocate Absolute Exact Memory instead of Alloc Abs Max or Get Absolute Memory Region. | |||
* Function 57 is now called Free Memory instead of Free Mem or Free Memory Region. | |||
The remaining function names are identical to those in one of the other 3 versions: | |||
* Functions 1, 2 had different names in Concurrent CP/M. The names in CP/M-86 1.1 and CP/M Plus are used: Console Input instead of Virtual Console Input and Console Output instead of Virtual Console Output. | |||
* Functions 11, 46 had slightly different wordings in their names in Concurrent CP/M. The names in CP/M-86 1.1 and CP/M Plus are used: Get Console Status instead of Console Status, Get Disk Free Space instead of Get Free Disk Space. | |||
* Functions 3, 4 had different names in CP/M-86. The names in CP/M Plus and Concurrent CP/M are used: Auxiliary Input instead of Reader Input and Auxiliary Output instead of Punch Output. | |||
* Function 49 had a different name in CP/M Plus and a different functionality. The CP/M-86 Plus name is Get/Set System Variables instead of Get/Set System Control Block. | |||
* Function 50 had a slightly different name in CP/M Plus. The name in CP/M-86 1.1 and Concurrent CP/M in used: Direct BIOS Call instead of Direct BIOS Calls. | |||
* Function 26 uses the Concurrent CP/M name Set DMA Offset instead of Set DMA Address. | |||
== Answered questions == | == Answered questions == | ||
Line 84: | Line 289: | ||
A: No. The bootloader will load the kernel, which hangs after starting XIOS. | A: No. The bootloader will load the kernel, which hangs after starting XIOS. | ||
Q: Can Concurrent DOS 6.0 function without DOS layer loaded? | |||
A: No. DOS layer is built into the kernel. | |||
Q: What does LOADCCPM.COM on Concurrent DOS (3.2, 4.1) do? | |||
A: It loads the Concurrent DOS kernel and replaces the running version of DOS with Concurrent DOS. Somehow paradoxically, the boot disks of CDOS 3.2 and 4.1 are CP/M-86 floppies, making LOADCCPM.COM effectively only usable from other Concurrent DOS systems. | |||
== References == | == References == |
Latest revision as of 12:45, 18 March 2023
This is a project aiming to document the timeline of various versions of the CP/M-86 operating system, focusing primarily on those released for the IBM PC.
The various names of the operating system include CP/M-86, CP/M-86 Plus, MP/M-86, Concurrent CP/M-86, Personal CP/M-86, Concurrent DOS, DOS Plus, Concurrent PC DOS (not to be confused with IBM PC DOS), Concurrent DOS 286, Concurrent DOS 386, Concurrent DOS XT, Multiuser DOS (not to be confused with Microsoft's Multitasking DOS 4), and FlexOS.
The most important fact about each version is BDOS, which is the part of the CP/M kernel that interfaces with userspace applications. The BDOS version can be easily deduced via the function 12 system call, however, it doesn't say everything about the API, since Digital Research didn't always update the BDOS number when adding new calls. Original CP/M-86 uses BDOS 2.2, most MP/M-based versions use 3.x and 4.x, Concurrent DOS 6.x uses 6.x.
What to document
For each version, the following information is collected into a table:
- Date of release, or at least the year if unknown
- Release name and version
- Following patches to the release, if any (e.g. CP/M-86 1.1 for IBM PC XT)
- BDOS version, as reported by function 12 (MRTVNO)
- The version's predecessor, if applicable and interesting
- Specific API differences, if applicable
- Present features, especially DOS filesystem support, DOS application support, and multitasking
- Supported media types (e.g. fixed disk, 160k floppies, ...)
- Links to preserved copies: source, binaries, and floppy images, both official and unofficial
- Links to manuals (User's Guide, System Guide, Programmer's Guide), DRI manuals are good sources of information
The CP/M-86 history documentation project channel on Discord is the chat associated with the project, you can join it if you are interested in helping out.
Lingering questions
- How were resources used to generate the CCPM.SYS kernel distributed? The typical CCP/M distribution includes everything to develop programs in assembler (ASM86, GENCMD, DDT86), but not GENCCPM and the .CON files. Generating a kernel is needed to include Resident System Processes, was that reserved to hardware manufacturers only?
- Is it possible to reconstruct the original .CON, .MPM and .H86 files (eventually .A86 disassembled source) from built CPM.SYS, MPM.SYS, PCPM.SYS, and DOSPLUS.SYS kernels? How difficult is it? (The CP/M-86 1.1 BIOS linked below was reconstructed this way, disassembled and annotated.)
- Does the Concurrent DOS 6.0 P_CLI (Supervisor Command Line Interpreter call) interpreter accept DOS or CP/M-86 commands?
Timeline table
Version name | BDOS version | Release date | Based on | Features | Supported media types | Links |
---|---|---|---|---|---|---|
CP/M-86 for IBM PC 1.0 | 2.2 | 1982-04-05[1] | Presumably CP/M 2.2 | - | IBM PC CP/M single-side (160k) and double-side (320k) floppy disks | 160k floppies (WinWorld), manuals (WinWorld) |
Concurrent CP/M-86 1.0 | 3.0[2] | August 1982User's Guide | MP/M-86 2.0[note 1] | Multitasking, virtual screens | As above | 160k floppies (WinWorld), manuals (WinWorld) |
CP/M-86 for IBM PC 1.1 | 2.2 | March 1983Kernel timestamp | CP/M-86 for IBM PC 1.0 | - | As above | 160k floppy 1 + GSX (WinWorld), floppy 2 (files only)[note 2], release notes |
Concurrent CP/M-86 2.0 for IBM PC | 3.1[3] | 1983-04-30XIOS source date | Presumably Concurrent CP/M-86 1.0 | Multitasking, virtual screens | ? | Source code, manuals (WinWorld) |
Concurrent CP/M-86 2.0 for Texas Instruments Professional Computer | Likely 3.1 | 1983-04-30XIOS build date | Presumably Concurrent CP/M-86 2.0 | As above | IBM PC CP/M double-side (320k) floppy disks, "Winchester" fixed disk | 320k floppies (WinWorld) |
CP/M-86 for IBM PC and IBM PC XT 1.1 | 2.2 | August 1983BDOS source date | CP/M-86 for IBM PC 1.1 | - | IBM PC CP/M single-side (160k) and double-side (320k) floppy disks, IBM XT (and later) fixed disk | 320k floppy (WinWorld), BDOS and CCP source code |
CP/M-86 Plus 1.0 for Apricot PC | 3.1 | November 1983Installation guide | Likely Concurrent CP/M-86 2.0, partly CP/M-86 1.1[note 3] | Simple multitasking | ? | Installation guide |
Concurrent CP/M-86 3.1 for IBM PC | 3.1 | 1984-01-01 | Concurrent CP/M-86 2.0 for IBM PC | Multitasking, virtual screens, windowing, DOS application support add-on | Same as above | 320k floppy 1 (WinWorld), source code, manual (WinWorld) |
Concurrent PC DOS 3.2 | 3.2 | 1984-08-30 | Concurrent CP/M-86 3.1 for IBM PC | Multitasking, virtual screens, windowing, DOS-like shell, DOS application support | All above, PC DOS 2.0 single-side (180k) and double-side (360k) floppy disks | 320k/360k floppies (WinWorld) |
Concurrent PC DOS 3.2 Maintenance Release | 3.2 | 1984-10-19 | Concurrent PC DOS 3.2 | Same as above | Same as above | 320k/360k floppies (WinWorld) |
Detailed information
Here you can find detailed information about the most important versions of CP/M-86, which doesn't fit into the table above.
CP/M-86 for IBM PC 1.0
Officially named CP/M-86 for the IBM Personal Computer Version 1.0, this is the first version of CP/M-86 for the IBM PC. It was delayed around eight months after the IBM PC release in August 1981, giving it a late start against IBM PC DOS 1.0, itself a clone of CP/M. Minimum RAM required for the system to boot is 32kB, although at least 48kB is needed to fit a non-trivial application like PIP and STAT.
Unlike DOS, which ships with IBM BASIC as the built-in programming tool, CP/M-86 included ASM86, an 8086 version of the CP/M-80 assembler ASM. The assembler produces .H86 files with machine code, which can be transformed into relocatable executables wit h the GENCMD utility; this is an improvement upon both CP/M-80 and DOS, both of which use memory images (raw binaries) for programs. CP/M-86 manual also metion a LMCMD program for creating .CMD file from Intel 8086 relocatable object files (which are likely produced by Intel tools like the PL/M compilercitation needed), but the IBM PC distribution doesn't ship it.
CPM-86 1.0 for IBM PC is an adaptation of the earlier CP/M-86 codebase developed from 1979 to 1981; the dates of 15 December 1981 and 28 December 1981 can be found on the install media. Unlike later versions, the kernel is not contained in a file named CPM.SYS, instead it is loaded by a bootstrap loader from an unknown location after the boot sector and the directory entry table (needs investigation). All configuration is done by command line tools, there is no text user interface.
To create a system floppy, the floppy formatting utility NEWDISK has to be run with the paramter $S ($DS for a double sided disk). This will copy both the bootloader and the bootstrap kernel onto the disk, similarly to what the SYSGEN utility does for CP/M-80.
Concurrent CP/M-86 1.0
While CP/M-86 for IBM PC's only major advantage over PC DOS was easier porting of existing CP/M-80 software, Digital Research also had MP/M-86, an 8086 port of the ambitious multiuser multi-terminal MP/M operating system. The IBM PC was, however, meant to be used by a single user. Digital Research decided to add virtual screens into MP/M-86; the result was released as Concurrent CP/M-86 1.0 a few months after CP/M-86 for IBM PC 1.0.
Concurrent CP/M-86 1.0 has four virtual screens, each one of which can run a CP/M-86 program, enabling users to upgrade their IBM PC hardware to a multitasking OS while keeping their old software. The OS is however limited by both disk space and RAM, since its kernel is 92kB large (compare to CP/M-86 1.1 kernel, which is only 18kB). This makes the system require two 160k floppies to run, the first one for the kernel and help file, the second one for the rest of the system utilities. The maximum memory of the IBM PC is only 256kB, which imposes limitations on how the system is used in practice; with four parallel programs and a ramdisk, one might easily run out of memory.
To make working with a two-floppy system easier, a program named SYSDISK is used specify a "system disk", which is a primitive analogue of Unix PATH: if a program is not found on the current drive, it is searched on the system disk (B: by default). For example if you replace the system disk 1 in drive A: with WordStar, you can still run system commands present on drive B: without switching the default drive or prefixing the command with B:.
A slightly unexpected incompatibility is found with the shell, which is not CCP used in CP/M-86, but a slighly more complex equivalent from MP/M-86 called Terminal Message Process. Known differences include the absence of a DIRS command, DIR [SYS] being used instead to list system files, and more detailed error messages like "Can't Find Command", "Bad File Spec", or "Bdos Err On X: Select" insteaf of "COMMAND?" and "X:?".
CP/M-86 for IBM PC 1.1 and CP/M-86 for IBM PC XT 1.1
-
CP/M-86 1.1 for IBM PC booted on 86box
-
CP/M-86 1.1 SETUP utility main screen on 86box
With a kernel timestamp of March 1983, CP/M-86 for IBM PC 1.1 is an update to CP/M-86 for IBM PC 1.0, suited for situations where one wants to save RAM at the cost of multitasking. Despite being released around the time of the IBM PC XT, its initial version had no fixed disk support. Overall, it is very similar to CP/M-86 1.0, for example it has the same memory requirements. A change visible at first glance is a colored status bar and a new boot message displayed by the new bootloader, which now loads the CP/M-86 kernel from a file named CPM.SYS. For the bootloader to work, CPM.SYS has to be the first file on the floppy.
Command line tools COPYDISK, NEWDISK, FUNCTION, PROTOCOL, and SPEED from CP/M-86 1.1 were replaced with text user interface programs DSKMAINT, FUNCTION, and CONFIG. A new TUI tool called SETUP was instroduced, which allows the configuration of hardware parameters in the kernel and additional functions. Power-On Command Line allows the user to include a command that will be launched on boot; it can only run one command, for running multiple commands, SUBMIT must be used. Memory Disk allows allocating a portion of RAM to store files, which was a key functionality for CP/M-86, since disk access was slowed down by to both hardware limitations and system calls going through several layers (BDOS, CP/M-86 BIOS, IBM PC BIOS).
A later release from August 1983 added fixed disk support, again coming late compared to PC DOS 2.0 released with the IBM PC XT. Also unlike PC DOS 2.0, which was an ambitious release with many new features, CP/M-86 still has no directory support and lacks any Unix compatibility. The HDMAINT utility was added for hard drive formatting, which together with the bigger kernel causes the system not to fit on a single-sided 160k floppy anymore, hence this version is distributed on a double-sided 320k floppy.
CP/M-86 Plus 1.0 and derivatives
CP/M-86 Plus is a relatively unknown version of CP/M-86 created sometimes around November 1983 (based on its installation guide date), initially for the Apricot PC. It combines some MP/M-86 features with the more lightweight CP/M-86, in parallel to CP/M 3 (also called CP/M Plus) for Intel 8080 systems. It also includes some calls that are not in MP/M-86 and Concurrent CP/M-86, but are in CP/M 3. Like MP/M, its kernel CPMP.SYS is build with a GENSYS utility, called GENCPM. A notable difference from MP/M is the use of the classical CP/M BIOS, BDOS, CCP architecture of the kernel; a new feature of CP/M-86 Plus is the CCP being optionally outside the kernel as CCP.CMD.
Some sources claim that CP/M-86 Plus was never released[4], however, others mention it was released for the Apricot PC, and there are screenshots of it running on an Apricot emulator[5]. Personal CP/M-86, released for the Apricot PC and for Siemens industrial computers, and DOS Plus are derivatives of CP/M-86 Plus.
Siemens PC16-20 is compatible with IBM PC, hence Personal CP/M-86 2.0 for PC16-20 also runs on PC hardware. Its internal version number 1.2 and BDOS version 4.1 suggest a close relationship to DOS Plus 1.2, and its CCP.CMD can be run on DOS Plus. Unlike proper versions of CP/M-86 for the IBM PC, it seems to lack single-sided floppy support.
Concurrent CP/M-86 3.1 for IBM PC
Concurrent CP/M-86 3.1 brings the features of CP/M-86 for IBM PC XT 1.1 like colored status bar and fixed disk support to the Concurrent CP/M-86 line. Like its predecessors, it runs from two floppies with the help of SYSDISK. There is a special release for IBM PC with Starlink communication card, which is the only preserved full release; we have only the first floppy for regular IBM PC, nevertheless it is enough to boot the system because the Starlink release only differs in the kernel.
A new feature of Concurrent CP/M-86 3.1 is windowing: the ability to see more than one virtual screen at once by splitting the physical screens into separate rectangles. It also allows each window to have different colors. The WINDOW tool is used to set up windows from the command line; alternatively, WMENU installs the window manager, allowing interactive manipulation of windows.
API evolution
The following information is based directly on publicly available CP/M manuals. Due to subtle changes between structures and register values, and to keep documenting the evolution feasible, only register usage changes will be described for the most part.
CP/M-86 1.0
The first release of CP/M for the 8086 architecture shows a direct evolution from CP/M 2.2 for the 8080 architecture. Replacing the previous CALL 5
interface, BDOS function calls can be entered through the software interrupt facility of the 8086 via the INT 224
instruction. The function code is specified in the byte register CL
instead of C
, with a single parameter provided in register DL
instead of E
for 8-bit values, DX
instead of DE
for 16-bit values, and in the DS:DX
register pair for addresses. The return value is found in AL
instead of A
and L
for 8-bit values, AX
and BX
instead of HL
and the B
, A
registers, and in the ES:BX
register pair for addresses.
The CP/M-86 1.0 API is an almost superset of the CP/M 2.2 API with the following additional functions:
- Function 50: Direct BIOS Call
- Function 51: Set DMA Segment Base
- Function 52: Get DMA Segment Base
- Function 53: Get Max Memory Available
- Function 54: Get Max Memory at Abs Location
- Function 55: Get Memory Region
- Function 56: Get Absolute Memory Region
- Function 57: Free memory region
- Function 58: Free all memory
- Function 59: Program load
Other changes include:
- Function 0 (System Reset) got updated with an 8-bit parameter that specifies whether the program should stay in memory.
- Function 6 (Direct Console I/O) accepts a new 8-bit parameter 0FEh for
DL
that checks for the console status. - The following functions that take an address parameter will use
DS:DX
: 9 (Print String), 10 (Read Console Buffer), 15 (Open File), 16 (Close File), 17 (Search for First), 19 (Delete File), 20 (Read Sequential), 21 (Write Sequential), 22 (Make File), 23 (Rename File), 30 (Set File Attributes), 33 (Read Random), 34 (Write Random), 35 (Compute File Size), 36 (Set Random Record), 40 (Write Random With Zero Fill). - Function 26 (Set DMA Address) takes a 16-bit parameter in
DX
to change only the offset part of the DMA address. The new function 51 (Set DMA Base) can be used to change the segment portion. - The following functions that return an address parameter will give the result in
ES:BX
: 27 (Get Addr(Alloc)), 31 (Get Addr(Disk Params)).
CP/M-86 1.1
This version still reports BDOS version 2.2, just like CP/M-86 1.0. However it offers two additional functions:
- Function 47: Chain To Program
- Function 49: Get SYSDAT Address
MP/M-86 2.0
From the API perspective, this version is best understood as a port of MP/M II from the 8080 to the 8086. Similarly to the previous MP/M II, most of the MP/M-86 API is compatible with the single tasking CP/M-86.
Just like CP/M-86, BDOS functions can be accessed through the INT 224
interface, with register CL
containing the function number. Parameters are passed in DL
, DX
or DS:DX
. The return value is returned in both AL
and BL
for 8-bit results, AX
and BX
for 16-bit results, and in ES:AX
and ES:BX
for address results, effectively duplicating the contents of BX
in AX
. Compared to CP/M-86, a major change is that many functions use CX
to report back an error code.
Compared to both:
- Function 0 provides an error code in
CX
on failure. - Function 47 provides a 16-bit result.
Compared to MP/M II:
- The CP/M-86 functions 50-59 have been added.
- Function 128-140, 144-153, 157-164 provide an error code in
CX
. - Every function that took an address parameter (except function 26) now expects it in
DS:DX
: 9, 10, 15-17, 19-23, 30, 33-36, 40-43, 100, 102-107, 129, 130, 134-140, 144, 149-152, 155, 157. - Every function that returned an address parameter now returns it in
ES:AX
andES:BX
: 27, 31, 154, 156. - Function 128 (previously called Absolute Memory Request) is now a duplicate of function 129.
- Function 143 only takes an 8-bit parameter instead of a 16-bit one (the high byte used to specify whether the memory of the subprocess should be released on termination).
- Functions 130, 131, 134, 137, 139, 144, 148, 150 provide a 16-bit result instead of none.
- Functions 129, 132, 133, 135, 136, 138, 140, 161, 162 provide a 16-bit result instead of an 8-bit one.
- Function 149 now uses
CX
to report an error instead of theA
register. - Some functions are renamed:
- Function 129 is renamed from Relocatable Memory Request to Memory Allocation.
- Function 150 is renamed from Send CLI Command to Command Line Interpreter.
- Function 151 is renamed from Call Resident System Process to Call RPL.
- Function 153 is renamed from Get Console Number to Get Console.
- Function 154 is renamed from System Data Address to Get SYSDAT Address
- Function 156 is renamed from Return Process Descriptor Address to Return PD Address.
Compared to CP/M-86:
- The MP/M II functions 38, 39, 41-46, 48, 100-107, 128-164 have been added.
- Functions 3 (Reader Input) and 4 (Punch Output) have been replaced by the MP/M II functions with the same numbers (Raw Console Input and Raw Console Output).
- Function 6 (Direct Console I/O) now has the 0FDh subfunction.
- Functions 7 (Get I/O Byte) and 8 (Set I/O Byte) have been removed.
- Function 0 does not take an argument
- Functions 53-57, 59 provide an error code in
CX
. - Functions 13, 28, 37, 57 provide an 8-bit result (function 37 returned 0 on CP/M-86).
- Functions 15-23, 33, 34, 40 provide a 16-bit result instead of an 8-bit one.
- Functions 14, 35, 50 provide a 16-bit result instead of none.
- Some functions are renamed:
- Function 11 is renamed from Get Console Status to Console Status.
- Function 26 is renamed from Set DMA Address to Set DMA Offset.
Concurrent CP/M-86 1.0
Compared to MP/M-86 2.0, the only changes in the API are a few functions being renamed:
- Function 1 is renamed from Console Input to Virtual Console Input.
- Function 2 is renamed from Console Output to Virtual Console Output.
- Function 163 is renamed from Return MP/M Version Number to Return CCP/M Version Number.
CP/M-86 Plus 1.0
Both the 8080 and 8086 versions of CP/M saw an update in 1983. The BDOS APIs of both of them incorporated some of the functionality of their multitasking counterparts, which is reflected in MP/M functions appearing in CP/M Plus and Concurrent CP/M functions appearing in CP/M-86 Plus. The BDOS kernel version also got updated, from 2.2 for the single-tasking versions and 3.0 for the multitasking versions, to 3.1 for both the 8-bit and 16-bit CP/M, however this version number was not generally reflected in the product version number.
To get an overview of the API evolution, we will compare the CP/M-86 Plus 1.0 BDOS API to three versions: the 8-bit CP/M Plus, the previous 16-bit single-tasking CP/M-86 1.1, as well as Concurrent CP/M 2.0.
Just like other 8086-based systems, the BDOS is entered via the int 224
instruction, with register CL
containing the function number. The registers DL
, DX
and DS:DX
contain the input parameter. The returned value is found in AL
, AX
or ES:AX
, with BX
containing a copy of AX
. Some function return an error code in CX
, similarly to the behavior of Concurrent CP/M.
Added functions
CP/M-86 Plus 1.0 alters the collection of functions compared to the 8-bit CP/M Plus, CP/M-86 1.1 and Concurrent CP/M. These alterations can be grouped according to whether they add new functionality without removing other functions, replace one function with another one, typically one with a similar scope, or remove some functionality altogether.
- New functions compared to all other versions: 116 (Set File Stamps), 172 (Auxiliary Block Input), 173 (Auxiliary Block Output) are new compared to all 3 versions.
- Functions new to CP/M Plus only: 51-58. These functions appeared in both CP/M-86 and Concurrent CP/M, typically relating to 8086 specific functionality.
- Functions new to CP/M-86 1.1 only: 44-46, 48, 100-107, 152, as well as function 6 subfunction
0FDH
. These functions appeared in both CP/M Plus and Concurrent CP/M. - Functions included from CP/M Plus: 60, 99, 108-112. These are new to both CP/M-86 and Concurrent CP/M.
- Functions included from Concurrent CP/M: 141-143, 147, 154. These are new to both CP/M Plus and CP/M-86.
Replaced functions
This section lists functions that will behave differently compared to either of the 3 other systems used in this comparison.
Functions that are included from CP/M Plus, replacing the functions in CP/M-86 1.1:
- Function 7, Auxiliary Input Status, replaces Get I/O Byte.
- Function 8, Auxiliary Output Status, replaces Set I/O Byte.
- Function 49, Get/Set System System Variables, replaces Get SYSDAT address in CP/M-86 1.1. Its behavior is slightly different from CP/M Plus Get/Set System Control Block as well, but it fulfills the same functionality.
These function numbers were undefined on Concurrent CP/M.
The other functions are all inherited from CP/M-86 1.1:
- Function 3 (Read Auxiliary Input), 4 (Write Auxiliary Output) replaced Raw Console Input and Raw Console Output from Concurrent CP/M. These numbers had identical functions on CP/M Plus.
- Function 59 (Program Load) extends the function Load Overlay from CP/M Plus. This function was also present on Concurrent CP/M in its extended functionality.
Removed functions
Here we list functions that were removed compared to one of the 3 other systems with no functions replacing them. Some of these existed in a vestigial form that returned 0 without doing anything, for compatibility with multitasking systems.
- Function 98 existed on CP/M Plus but it is not included in CP/M-86 Plus.
- Functions 38, 39, 41-43 existed on Concurrent CP/M but were only provided for compatibility on CP/M Plus. The documentation only mentions 39 existing on CP/M-86 Plus 1.0, but it returns 0 without doing anything.
- Functions 128-140, 144-146, 148-151, 153, 155-164 existed on Concurrent CP/M only.
Register usage
Compared to the other 3 versions, the input parameter usage is different in these ways:
- Function 0 and 48 now use
DL
as input. This is new to Concurrent CP/M and for function 0, to CP/M Plus. - Function 44 uses
DX
as input, however it still expects a value between 1-128. - Function 47 does not take an input parameter anymore, compared to CP/M Plus.
- Compared to CP/M Plus, functions 9, 10, 15-17, 19, 20-23, 30, 33-36, 40, 49, 50, 99, 100, 102-107, 112, 152 now rely on the value of
DS
.
The output parameter usage is different in these ways:
- Functions 47, 53-57, 59, 152 use
CX
to return an error code, compared to other versions. Only function 47 changed for Concurrent CP/M in this usage. - Function 0 does not return a value in
CX
, compared to Concurrent CP/M. - Functions 28, 105 return an 8-bit value in
AL
/BL
. CP/M Plus did not return a value, while CP/M-86 only returned a value for 28, Concurrent CP/M for 105. - Functions 15-23, 30, 33, 34, 40, 53-57 now return 16-bit values in
AX
/BX
instead of 8-bit values. Of these, CP/M-86 returned a 16-bit value for function 57, Concurrent CP/M for all but functions 30 and 53-57. All of these functions that existed on CP/M Plus already returned 16-bit values. - Compared to CP/M-86, functions 14, 35, 47, 50, 57 now return 16-bit values. Functions 47, 50 did not have return values in CP/M Plus.
- Compared to Concurrent CP/M, functions 141, 142, 147 now return 16-bit values.
- Functions 13, 37, 49 no longer provide a return value. CP/M Plus would return an 8-bit value for function 37 and a 16-bit value for 49. Concurrent CP/M returned 8-bit values for 13, 37. No change of behavior took place compared to CP/M-86.
- Compared to CP/M Plus, functions 27 and 31 now provide a return value in
ES
.
New function names
Starting with CP/M-86 Plus 1.0, the official documentation includes identifier-like mnemonics for BDOS functions, alongside longer, descriptive names. Since the mnemonics are new, only changes to the descriptive names will be described here.
The following functions have new names compared to all other versions:
- Function 27 is now called Get Address of Allocation Vector instead of Get Addr(Alloc).
- Function 31 is now called Get Address of DPB Parameter Block instead of Get Addr(Disk Params).
- Function 53 is now called Allocate Maximum Memory instead of Get Max Mem or Get Max Memory Available.
- Function 54 is now called Allocate Absolute Maximum Memory instead of Get Abs Max or Get Max Mem at Abs Location.
- Function 55 is now called Allocate Exact Amount Memory instead of Alloc Mem or Get Memory Region.
- Function 56 is now called Allocate Absolute Exact Memory instead of Alloc Abs Max or Get Absolute Memory Region.
- Function 57 is now called Free Memory instead of Free Mem or Free Memory Region.
The remaining function names are identical to those in one of the other 3 versions:
- Functions 1, 2 had different names in Concurrent CP/M. The names in CP/M-86 1.1 and CP/M Plus are used: Console Input instead of Virtual Console Input and Console Output instead of Virtual Console Output.
- Functions 11, 46 had slightly different wordings in their names in Concurrent CP/M. The names in CP/M-86 1.1 and CP/M Plus are used: Get Console Status instead of Console Status, Get Disk Free Space instead of Get Free Disk Space.
- Functions 3, 4 had different names in CP/M-86. The names in CP/M Plus and Concurrent CP/M are used: Auxiliary Input instead of Reader Input and Auxiliary Output instead of Punch Output.
- Function 49 had a different name in CP/M Plus and a different functionality. The CP/M-86 Plus name is Get/Set System Variables instead of Get/Set System Control Block.
- Function 50 had a slightly different name in CP/M Plus. The name in CP/M-86 1.1 and Concurrent CP/M in used: Direct BIOS Call instead of Direct BIOS Calls.
- Function 26 uses the Concurrent CP/M name Set DMA Offset instead of Set DMA Address.
Answered questions
Q: How does Power-On Command Line work? Concurrent CP/M-86 doesn't seem to have a way to edit this in SETUP.CMD, unlike CP/M-86. CCP/M 3.1 HELP for SYSDISK mentions creating a "startup file" to set system disk on boot, how is this related to Power-On Command Line?
A: Power-On Command Line stores a command at a fixed position between the bootstrap loader and the filesystem, from which it is then read by the kernel and executed at boot. CCP/M doesn't have this feature, instead there is a startup file for each virtual console that runs the command specified in it on boot. The files are named $0$.SUP, ..., $3$.SUP on CCP/M 1.0[6] and STARTUP.0, .. STARTUP.3 on newer versions[7].
Q: How is Concurrent DOS implemented? Is it somehow on top of Concurrent CP/M-86 and auto launched on start, or is it baked deeper into the kernel?
A: Concurrent DOS implements the FAT filesystem and directory support system calls as a part of BDOS 4.0. Unlike earlier versions of CCP/M, there appears to be (needs confirmation) no Terminal Message Process in the kernel; CDOS.COM, the CDOS variant of COMMAND.COM, is used as the command line interpreter.
Q: Can Concurrent DOS 6.0 be run from CP/M-86 media? (Manual mentions it, but the system seems to have no CP/M media support outside of CPM.EXE compatibility program.)
A: No. The bootloader will load the kernel, which hangs after starting XIOS.
Q: Can Concurrent DOS 6.0 function without DOS layer loaded?
A: No. DOS layer is built into the kernel.
Q: What does LOADCCPM.COM on Concurrent DOS (3.2, 4.1) do?
A: It loads the Concurrent DOS kernel and replaces the running version of DOS with Concurrent DOS. Somehow paradoxically, the boot disks of CDOS 3.2 and 4.1 are CP/M-86 floppies, making LOADCCPM.COM effectively only usable from other Concurrent DOS systems.
References
- ↑ https://books.google.cz/books?id=w_OhaFDePS4C&pg=RA2-PA43&redir_esc=y#v=onepage&q&f=false
- ↑ Concurrent CP/M-86 1.0 Programmers' Guide
- ↑ VCMODE source code
- ↑ https://computer.fandom.com/wiki/CP/M-86
- ↑ http://www.seasip.info/Unix/QDAE/screens.html
- ↑ http://www.bitsavers.org/pdf/digitalResearch/concurrent/Concurrent_CPM-86_Users_Guide_Aug82.pdf
- ↑ https://oldcomputers.dyndns.org/public/pub/manuals/ccpm86ug.pdf
Notes
- ↑ The Programmers' Guide mentions "MP/M-86 version number" on page 204 for function 163, which is labeled "Return CCP/M Version Number" at page 214, indicating MP/M-86 was left there from previous version by mistake; version 2.0 is derived from a string in the media
- ↑ The files are mentioned in the release notes, they are not specific to the IBM PC, the example BIOS shown is not for IBM PC. Given the unclear versioning of the files, proof was not yet shown of that it can't be from CP/M-86 1.0.
- ↑ This is a hybrid version between CP/M-86 and CCP/M, having CCP/M's multitasking and BDOS, but CP/M-86's CCP and simple kernel structure