Coherent 3.0

I don’t know why I was so dumb as a kid, but I remember thumbing through various magazines, and always seeing this ad:

Coherent Ad

And isn’t that sounding great?  Lex, Yacc, UUCP, and UNIX functionality on a AT compatible machine for $99!  And then you see reviews like this one from PC Mag:

Now even if you want to you can’t wind the clock back to the late 1970s, but Unix lovers can do the next best thing-pick up a copy of Mark William’s Coherent for $99.95.

Included in this time capsule are all of the utilities that you would have received in an AT&T Unix, Version 7, distribution circa 1978. The package includes a protected-mode multi-user multitasking operating system. over 150 utility programs, a C compiler, an assembler, software development tools, text formatting tools, system management tools, telecommunications utilities, and complete documentation in a very hefty, 1,000-page, perfect bound book. Most of the Unix classics-grep, ed, sed, awk, lex, sh, emacs-are there as well. The only favorites that are missing are vi (which is a text editor) and Dave Korn’s new shell.

Whether Coherent’s views on the Unix system match your own is a matter of taste. In the halcyon late 1970s, the Unix system was a relatively simple affair-lean and clean, and understandable to mere mortals. Since then, in an effort to make Unix the universal solution, countless features and versions have been grafted onto it by innumerable programmers, managers, committees, and boards of directors.

The result stands in stark contrast to the stated goals of Unix’s inventors. Coherent remains true to Unix’s roots and eschews local area networking, graphical user interfaces, menus, mice, and many of the other amenities that present-day DOS users and Unix users have come to expect of modem software.

Coherent’s installation is painless, but only after the agony of freeing up a 7MB or larger partition on an ordinary MFM or RLL disk, on a classic AT architecture machine. Since they are products of the modem era, ESDI and SCSI disks, as well as IBM’s Micro Channel architecture are not supported. Graphic display adapters are tolerated (used in text mode); mice are not supported. Coherent worked flawlessly, though, on my geriatric AT clone.

Coherent has a dual boot facility, so that you can choose to boot either DOS or Coherent during your startup procedures, but unfortunately you can’t run
DOS software from within the Coherent environment.

Mark Williams’president Robert Schwartz explained that the intended audience for Coherent are people who want to learn about or try the Unix system, without the hefty price tag and steep learning curve of the latest Unix versions. Part of Coherent’s advantage in both simplicity and price stems from its origins as a privately developed “clone” product-therefore no AT&T requirements need be met and no per-copy royalty is paid to AT&T. This gives Mark Williams the freedom to set prices as well as compatibility targets.

But learning Unix from Coherent would be a bumpy road. You could certainly master traditional system administration, learn the utilities. And experiment with Unix software development. But you couldn’t learn about networking or the increasingly important X Windows system. Nor could you realistically use Coherent to automate a small business.

Schwartz promises that future versions of Coherent will support 32-bit operation on the 386, and will likely support tighter integration with DOS, some form of window manager. And local area networking. When that occurs, Coherent will be much more like modem Unix systems and, like modem Unix systems, it will have strayed far from its roots.

List Price: Coherent Version 3.0, $99.95.
Requires: A free 7MB or larger hard disk partition, 640K RAM, highly disk drive, MFM or RLL controller.

Mark Williams Co., 601 N.
Skokie Hwy., Lake Bluff. IL
(Kaare Christian)

And then it seemed to my teenage eyes something pretty underwhelming.  So I dove into OS/2, and ignored the idea of having a UNIX like system.  I was still happy to finally move onto a 16-bit machine, and the thought of running stuff from the 1970’s wasn’t that appealing. Such missed opportunities.  But in the last few years, Coherent has been placed under a 3-clause BSD license.

Over at unix4fun, they did unearth some version 3.0 disks!  And yes, it’ll install on PCem/86Box using a 286/386/486 machine.  One issue I had was I first tried to install onto a massive 40Mb disk, and it never would reboot after the install correctly.  However it works great with a 32Mb or smaller disk.  As you can see from Kaare’s review it’ll fit into 7MB of disk space!  At least having to either re-partition or worry about dual booting is a thing of the past.  The disk images are 5.25 disk images, so re-configure your VM appropriately.

Coherent on PCem

As the advertisement says, the installation is a mere four diskettes!  And yes, it really does have a C compiler.  You will need a serial number for Coherent 3.0, which took a while to find, but Peter had one, and has been poking me for the last week+ to finally write this up.  Oh the number is 130500000.  305/Miami connection? Unlikely, but who knows.  Don’t forget to download the hefty manual, Coherent_Revision_8_1992, which is for a later version, but still suitable.

And yes, it feels just like Unix v7.  The kernel is tiny, 77kb!  It’s really cool for 16-bit era stuff, and really interesting to knock around.  I know there is a few more people out there that want fun things for their 286, and Coherent will certainly scratch that itch.

Additionally on the site are the 3.1 and 3.2 updates to give you thinks like Elvis so it doesn’t feel anywhere near as primitive.  Installing updates and 3rd party packages is covered on page 736 of the manual, or in short you need to know the magical ‘disk set name’ for everything you want to install.  I suppose back then it had stuff like this printed on them.

coh300-ddk.img Drv_110
coh300-rdb.img rdb
coh31update-1.img CohUpd310
coh320update-1.img
coh320update-2.img CohUpd320
coh320-ddk.img

While a ‘dump’ of the source code has been out there, I haven’t really gone through it, so I thought now would be as good as any to take a look at the kernel.  The layout is very similar to v6, so I based this on the file ‘sys1.c’ which appears quite a few times in the trees.  Using a MD5 checksum against the files there appears to be no less than 17 duplicated tress or 7 unique kernels, spread over three years.

cc3b2bef09be7d60d52a01ca908972f7 Jul,24,1991 gtz/relic/d/kernel/USRSRC/coh/sys1.c
cc3b2bef09be7d60d52a01ca908972f7 Jul,24,1991 romana/relic/d/kernel/USRSRC/coh/sys1.c

41797301f9d5771dd10161954df82a5d Jan,13,1992 gtz/relic/d/286_KERNEL/USRSRC/coh/sys1.c
41797301f9d5771dd10161954df82a5d Jan,13,1992 romana/relic/d/286_KERNEL/USRSRC/coh/sys1.c
6b888a45afb3476c5e482fa54fb4dd86 Jul,17,1992 gtz/relic/b/kernel/coh.286/sys1.c
6b888a45afb3476c5e482fa54fb4dd86 Jul,17,1992 romana/relic/b/kernel/coh.286/sys1.c
6b888a45afb3476c5e482fa54fb4dd86 Aug,11,1992 gtz/relic/d/PS2_KERNEL/coh.286/sys1.c
6b888a45afb3476c5e482fa54fb4dd86 Aug,11,1992 romana/relic/d/PS2_KERNEL/coh.286/sys1.c
b90f2659fdecfbfa576d39bc8e54ffa0 Aug,11,1992 romana/relic/d/PS2_KERNEL/coh.386/sys1.c
b90f2659fdecfbfa576d39bc8e54ffa0 Aug,11,1992 gtz/relic/d/PS2_KERNEL/coh.386/sys1.c

6503663ebb9a852007a46d66cd43ac1a Jun,14,1993 gtz/relic/b/kernel/coh.386/sys1.c
6503663ebb9a852007a46d66cd43ac1a Jun,14,1993 romana/relic/b/kernel/coh.386/sys1.c
35bc7569ab99ab340d2ca8bf66a47c46 Aug,9,1993 romana/relic/b/STREAMS/coh.386/sys1.c
35bc7569ab99ab340d2ca8bf66a47c46 Aug,9,1993 gtz/relic/b/STREAMS/coh.386/sys1.c
436f245293c88ceaecd99840c37dcbb4 Nov,15,1993 gtz/hal/r10/coh.386/sys1.c
436f245293c88ceaecd99840c37dcbb4 Nov,15,1993 gtz/src/sys.r12/coh.386/sys1.c
436f245293c88ceaecd99840c37dcbb4 Nov,15,1993 gtz/src/sys.r12/coh.386/r12/sys1.c

Phew!  Naturally the tree structure drifted, but I went ahead and just did a blind import into my CVS server to take a look. And there really does appear in the 1991 versions to be the remnants of either 2.3.37, 3.2.1.  It’s hard to say.

13 thoughts on “Coherent 3.0

  1. Hi!

    Typo: serial ends with 500000 🙂

    Make your own serials for coherent v3.x or earlier:

    romana/relic/d/support/serial_no/unumber.c:1:/*
    romana/relic/d/support/serial_no/unumber.c:2: * Check serial number. If it is correct print in stdout serial number
    romana/relic/d/support/serial_no/unumber.c:3: * exit status is 0. If serial number is wrong exit status is 1.
    romana/relic/d/support/serial_no/unumber.c:4: */
    romana/relic/d/support/serial_no/unumber.c:5:#include “unumber.h”
    romana/relic/d/support/serial_no/unumber.c:6:
    romana/relic/d/support/serial_no/unumber.c:7:void unu_usage();
    romana/relic/d/support/serial_no/unumber.c:8:
    romana/relic/d/support/serial_no/unumber.c:9:main(argc, argv)
    romana/relic/d/support/serial_no/unumber.c:10:int argc;
    romana/relic/d/support/serial_no/unumber.c:11:int *argv[];
    romana/relic/d/support/serial_no/unumber.c:12:{
    romana/relic/d/support/serial_no/unumber.c:13: int c, susp, suspen;
    romana/relic/d/support/serial_no/unumber.c:14:
    romana/relic/d/support/serial_no/unumber.c:15: if (argc != 2)
    romana/relic/d/support/serial_no/unumber.c:16: unu_usage();
    romana/relic/d/support/serial_no/unumber.c:17:
    romana/relic/d/support/serial_no/unumber.c:18: sscanf(argv[1], “%1d%3d%5d”, &c, &susp, &suspen);
    romana/relic/d/support/serial_no/unumber.c:19: if ( c VERSIONS)
    romana/relic/d/support/serial_no/unumber.c:20: exit(1);
    romana/relic/d/support/serial_no/unumber.c:21:
    romana/relic/d/support/serial_no/unumber.c:22: c–;
    romana/relic/d/support/serial_no/unumber.c:23: if (((suspen ^ magic3[c]) % magic2[c]) != (susp ^ magic1[c]) ||
    romana/relic/d/support/serial_no/unumber.c:24: strlen(argv[1]) > 9)
    romana/relic/d/support/serial_no/unumber.c:25: exit(1);
    romana/relic/d/support/serial_no/unumber.c:26: else
    romana/relic/d/support/serial_no/unumber.c:27: exit(0);
    romana/relic/d/support/serial_no/unumber.c:28:}
    romana/relic/d/support/serial_no/unumber.c:29:
    romana/relic/d/support/serial_no/unumber.c:30:/*
    romana/relic/d/support/serial_no/unumber.c:31: * Usage of program unumber.
    romana/relic/d/support/serial_no/unumber.c:32: */
    romana/relic/d/support/serial_no/unumber.c:33:void
    romana/relic/d/support/serial_no/unumber.c:34:unu_usage()
    romana/relic/d/support/serial_no/unumber.c:35:{
    romana/relic/d/support/serial_no/unumber.c:36: printf(“unumber suspension_number\n”);
    romana/relic/d/support/serial_no/unumber.c:37: exit(1);
    romana/relic/d/support/serial_no/unumber.c:38:}
    romana/relic/d/support/serial_no/unumber.h:1:/*
    romana/relic/d/support/serial_no/unumber.h:2: * Crypts variables
    romana/relic/d/support/serial_no/unumber.h:3: */
    romana/relic/d/support/serial_no/unumber.h:4:#define VERSIONS 9
    romana/relic/d/support/serial_no/unumber.h:5:
    romana/relic/d/support/serial_no/unumber.h:6:extern int magic1[];
    romana/relic/d/support/serial_no/unumber.h:7:extern int magic2[];
    romana/relic/d/support/serial_no/unumber.h:8:extern int magic3[];
    romana/relic/d/support/serial_no/numtab.c:1:/*
    romana/relic/d/support/serial_no/numtab.c:2: * Table of crypts numbers
    romana/relic/d/support/serial_no/numtab.c:3: */
    romana/relic/d/support/serial_no/numtab.c:4:int magic1[] = {275, 341, 547, 745, 395, 846, 172, 598, 785};
    romana/relic/d/support/serial_no/numtab.c:5:int magic2[] = {211, 463, 371, 185, 782, 146, 857, 143, 846};
    romana/relic/d/support/serial_no/numtab.c:6:int magic3[] = {17125, 12417, 14983, 1311, 16985, 13198,
    romana/relic/d/support/serial_no/numtab.c:7: 12254, 15197, 14365};

    • did anyone untangle the source drop? I know it basically arrived 20+ years too late. I just took a peek and there is so much duplication, and so many things actually have version 2.3.37 on them, I get the feeling that the bulk of Coherent actually never really was updated.

  2. Ah, Coherent. I inherited the floppies & manual from someone in 1992 or so, but I only had an 8088 machine at the time.

    Now at work, there was an AT class machine sitting unused, but I certainly didn’t have permission to reformat the hard drive. So I studied the manuals, and examined the install disks. I don’t remember the details now, but I managed to figure out how to partially boot a Coherent system just off the install disks, without touching the hard drive.

    The experience helped me when I later found about “floppy-only” Linuxes, like “tomsrtbt”. How much of a system CAN you make without touching the hard drive? Anyway, I don’t think I ever fully installed Coherent before I sold it away.

    • /me z triggered

      I am jealous. Botox can do guest posts on neozeed’s turrbosuperr(tm) bloghosting, but(t) I cannot :’^(( sniff-sniff.

      Anyway, made a 1.44 coherent 3.0 live image, if anybody would like to get. It was a hell to made and needed several accidentally left secret hints and handwritten remarks found in scanned coherent documents. And pcem, too. Image had been tested on a real-life 486.

      • if you want to do a guest post, all you have to do is email me the material and suffer through me trying to get the formatting right. I don’t know what the botox stuff is about, I guess more eye rolling drama.

        email me, or Escargot, you know where I am.

    • Such a shame to be so close to being able to use something, but never really able to do so.

      I know the feeling, for the longest time I had 32bit envy pretty bad. Id just gotten a 286 part by part, but everywhere I went everyone had at least a 386 or 486, and most of them played solitaire.

      Not to mention what a massive PITA re-partitioning was. I was so crazy happy when I finally got a 386sx-16 with a fully populated 4MB motherboard. I could finally run OS/2 2.0 to only find out that 4MB really isn’t enough. And that CGA is really less than satisfactory. I’d helped a re-seller install SCO Xenix 386, and snagged a copy + the license and wow… without any compiler it was absolutely worthless to me.

      • I did the same, running OS/2 2.0 in 4MB RAM on 486DLC-33. Often I’d edit CONFIG.SYS to set the PROTSHELL= line to run TSHELL, eschewing the Workplace Shell GUI altogether. At the time it worked pretty well, and felt a bit like using DESQview – or a lot like the original OS/2 1.0 task switcher, as I learned many years later.

        I was able to run the OS/2 version of Borland C++ 1.0 to build native 32-bit VIO apps in one full-screen window, referring to an INF in another (using a text mode INF viewer) and reading FidoNet mail using Msged in another. Good stuff. 🙂

        • After the fact, but I actually like the Citrix multiuser 2.0 feel. It’s a shame the kernel is a pre-release that won’t run any OS/2 32bit stuff.

          But at the same time, it’s great to have moved way beyond those days. Now that we live in an era of disposable (sub $100 USD) 64bit machines, it’s hard to imagine such limitations

          • You should be glad you did not have a C-compiler. ( SCO Xenix-386) I tried the C compiler, ( it was on the dev disks, not the runtime disks ).

            Simple programs would compile fine, but as the size grew, it would at first crash… then later it would corrupt your swap partition, ( even when it was on another drive ), and later it would trash your root file system… We even tried to have 4 HDs, one /, one /usr, one /etc, and one swap, and it got further… but at some point… it would always trash the root…

            Then the switch to Microport… dear god… the C-compiler could compile anything… it could fill 500k with error messages.

            I had friends that worked for Coherent/Microport/MtXinu.

            I would love to play around on a life Coherent 3.0 boot disk…

            more info please…

          • The C compiler for Xenix is Microsoft C 5.0 386. It’s the same one they used to make Windows NT, and OS/2 2.0. It’s very particular in how it likes to do things, but if you don’t try to get fancy, and stick to K&R or if they told you up front it’s Microsoft C, then it’s easier to deal with. There also was a port of GCC to Xenix, which actually isn’t half bad. Although it was version 1.x, and you had to deal with the COFF encapsulation for later OS types, but in straight Xenix version 3, it’s x.out a strange thing not too unlike a.out.

            the boot disks for 3.0 were in the post, if I’m not mistaken. Although just installing a full system in PCemu/86Box is far more rewarding.

  3. Looks like PCem on Windows? I’ve build 13.1 on Debian 8 and OSX and then installed COHERENT 3.0 on a 286/25 box, works nicely. Video is here:
    https://youtu.be/LpVYGQWFrc0

    Keep in mind it is a 16bit OS, using 16bit integers for the filesystem stuff. So a filesystem cannot be larger than 65536 * 512 bytes.

    Better get the 3.0 manual from unix4fun, the 16bit release is quite different from the 32bit releases.

    Not that I like emacs that much, but microemcas in combination with the C compiler options is quite powerful. That was outstanding in 1990, that the compiler opens the source right at the error line in microemacs.

    The product id’s aren’t magical at all, just mount a floppy disk read-only and look at it’s root directory. And ‘man install’ has all the nasty details of course.

    Good article, thanks for writing it up.

  4. In the meantime I have build a COHERENT 3.2 PCem VM with the complete sources for the whole system. This allows to build 3.2 with a single shell script from the sources on a second HD connected to the VM, which boots the self compiled system after the build is through. This VM is similar to a development system used in 1992 @ MWC, should allow anyone to make whatever changes.

    QEMU 3.1.0 now is able to boot 3.2, but still have issues, better use PCem for now.

    All stuff is available at: https://www.autometer.de/unix4fun/coherent/index.html

Leave a Reply