On Sat, 2 Jul 2016, Eric Christopherson wrote:
Genius.
Clever? yes. Genius? no, or you would
have to count too many of us.
But I would have thought CP/M would at least require a
.com file to
have a header.
http://peetm.com/blog/?p=55
NO.
A .COM file is a pure image of memory, starting at location 100h.
The "header" or "zero page" or "program segment prefix" is
generated on
the fly during the loading of the program.
(There is a lot more to know about it)
The Zero Page is 256 bytes of data structures. Among those are a copy of
the command line (placed at 80h), and, if there was a filename as an
argument on the command line, a fully parsed File Control Block for that
filename (placed at location 5Ch)
(There is a lot more to know about it)
The first thing that I did in CP/M was to create a zero length program.
it seemed intuitively obvious as a needed capability.
Didn't everybody realize that and do it?
It never occurred to me to try to SELL it! In those days, there was
almost an assumption that price would be proportional to program length.
For those who wanted "source code" for it:
SAVE 0
A:JMP100.COM
(SAVE was one of the five CP/M internal commands, ERA,REN,DIR,TYPE)
Since program loading created the data structures from 0 through 0FFh, but
0 bytes did NOT alter the TPA (Transient Program Area), it provided a way
at the command line to do a jump to location 100h, which could sometimes
restart or regain control from some kinds of program crashes.
Headers for executable came along with MS-DOS. (already present in
many/most operating systems other than CP/M & MS-DOS)
In MS-DOS, a .COM file is STILL a pure image of memory, starting at
location 100h.
But, an MS-DOS .EXE file is the form of MS-DOS executable that DOES have a
header.
The .EXE header starts with "MZ". Having a fixed beginning lets the
computer recognize which files are .COM and which are .EXE without
resorting to filename. 'Course that does prevent you from creating a .COM
file that starts with
DEC BP
POP DX
since that will be indistinguishable from the marker of a .EXE file.
Why "MZ", instead of something else, maybe even something that would NEVER
be used in a .COM? Initials of Mark Zbikowski. Who was he? As little
is known about him as is about Howard Fullmer ("Parasitic Engineering"
and chief engineer for Morrow)
The result is that at the MS-DOS command line, if you type something, the
command processor (
COMMAND.COM) checks its list of internal commands.
If found, it executes it.
If not found, it looks for that a matching filename with .COM, and executes it.
If not found, it looks for .EXE and executes it.
If not found, it looks for .BAT and executes it.
If not found, it gripes. ("BAD COMMAND OR FILENAME")
(There is a lot more to know about it)
If what was found was .COM or .EXE, then it starts by looking at the first
two bytes of the file. It actually DOES NOT MATTER if you rename or
MIS-name a .COM as .EXE, or MIS-name a .EXE as .COM! The differentiation
is done by whether the first two bytes are "MZ". MIS-naming a .EXE .COM
will cause it to be found (and run) before one with otherwise same name
with .EXE extension. Do you need examples of why you might want to?
(There is a lot more to know about it)
If it is not "MZ", then it creates a program segment prefix, loads the
file into RAM starting at 100h, and jumps to 100h.
If it IS "MZ", then the .EXE loader processes the header of the file.
.EXE was present in MS-DOS since before release of 1.00, I seriously doubt
that his earliest ports to MS-DOS were "before the EXE file format
existed".
--
Grumpy Ol' Fred cisin at
xenosoft.com