Given that those files are not regular executables, why were they given the COM extension in the first place?
They are executable files. They are loadable binary images. In so far they are exactly like COM files, except, when loaded, they are not loaded at offset 0100h, after a prepared PSP, and started with CS:IP as segment:0100h, but segment:0000h. Programming/assembling sources works exactly like with a COM program, except were a 'regular' COM file source starts with an
ORG 0100h directrive, BIOS and DOS code is assembled with
ORG 0000h instead (*1).
[Insert:] Thanks to a hint by Stephen Kitt pointing out the avaibility of the original sources, it looks as if 86-DOS really used this, as the source starts like this (line 109):
So while the address base 0000h, the assembler output is moved to 0100h. This means the resulting file may have included some 256 bytes infront. But then again, there must have been some kind of merger utility, as with PC-DOS 1.0 IBMBIO and IBMDOS were not loaded as files, but as one continuous blob of 10 Kib from sector 8 onward.
86-DOS did not care about files at all. The directory was only checkt to see if the entries were there, not to use any of the meta information. It wasn't until PC-DOS 2.0 that the file system really got observed.
So for all development and testing purpose they could be as well assembled as COM files as well. While it doesn't matter for the very first version, as soon as a basic system is bootable, further development and debugging can be done in situ, using the (preloaded) OS environment and debugger. All that is necessary to do so is changing the ORG statement to 0100h before compiling.
Why not give them the SYS extension, like MS-DOS and (earlier versions of) DR DOS did?
Sure, it would have been possible - and would as well have made a lot of sense. Then again, it's always easy to see something as obvious in hindsight. Also, we all know how impossible unsensible users are - who would have thought about them unhiding these files and trying to execute? There is no sane reason to do so.
Well, I guess the MS-DOS team had to learn this lesson and it took about a year:
- August 1980: SCP ships 86-DOS 0.1
- September 1980: Microsoft licences 86-DOS for 'some' customer
- April 1981: SCP finishes and ships 86-DOS 1.0 using the
- August 1981: MS delivers 86-DOS 1.14 as PC-DOS 1.0 to IBM, both using
.COM file types for IBMBIO and IBMDOS (*2)
- May 1982: (MS/86)-DOS 1.24 is released by IBM as PC-DOS 1.1, both still with
- June 1982: Microsoft released MS-DOS 1.25. The first version to be used with (mostly) PC compatible machines (*3), as well the first version where the
.SYS file type was used.
IBM never followed that switch, and some manufacturers of compatible systems seem to have continued with a
.COM type (
MSDOS.COM in case of Compaq)
In the end, it's as with many 'why' questions, as Another_Dave already mentions:
"Unless the person who named the files shows up here, I don't see how we can get a definitive answer."
*1 - Today many would not care and make it the same, but back then, saving 256 bytes of RAM was a big thing. After all, the first 86-DOS could boot in as little as 12 KiB, leaving space for user code in systems with as little as 16 KiB of RAM. Something the PC no longer supported, as here the BIOS loads the Boot sector to 07C00h (that's 1 Ki below 32 Ki). Thus 32 KiB was the minimum system for DOS.
*2 - BTW, the whole wigwag is a bit more complex, as IBMBIO contains two parts:
- the machine depended BIOS interface and
- the machine independent SYSINT code, controlling the boot process.
In case of an IBM PC, the machine dependent BIOS interface is rather small and mostly a collection of device drivers, as it uses the ROM-BIOS. For non IBM machines it contained the whole BIOS.
*3 - I still got somewhere an original shrinkwrapped DOS 1.25 for Columbia Data Products' MPC.
.COMis a more accurate extension than
IBMDOS.COMare memory images, loaded as-is by the boot sector (their contents are moved around by
SYSINITduring boot, but that’s nothing a
.COMfile couldn’t do either).
.SYSimplies a device-driver-like structure, which
IO.SYSdon’t have. Execution starts at the beginning of
IO.SYS, just like a
.COMfile, except that there is no PSP before the image.
.SYSextension yet; I don’t even thing that CONFIG.SYS existed either back then. So there was no reason to use .SYS (or any other extension). Hiding the file and calling it .COM seems pretty reasonable.