<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Programming at the right level]]></title><description><![CDATA[Posts about programming, computer history and retro computing.]]></description><link>https://nemanjatrifunovic.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!4e3J!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95db00b8-6cf2-42bc-9f62-364971e5fea1_341x341.png</url><title>Programming at the right level</title><link>https://nemanjatrifunovic.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sun, 09 Aug 2026 08:05:09 GMT</lastBuildDate><atom:link href="https://nemanjatrifunovic.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Nemanja Trifunovic]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[nemanjatrifunovic@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[nemanjatrifunovic@substack.com]]></itunes:email><itunes:name><![CDATA[Nemanja Trifunovic]]></itunes:name></itunes:owner><itunes:author><![CDATA[Nemanja Trifunovic]]></itunes:author><googleplay:owner><![CDATA[nemanjatrifunovic@substack.com]]></googleplay:owner><googleplay:email><![CDATA[nemanjatrifunovic@substack.com]]></googleplay:email><googleplay:author><![CDATA[Nemanja Trifunovic]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Road to MS-DOS 2]]></title><description><![CDATA[One little step toward UNIX]]></description><link>https://nemanjatrifunovic.substack.com/p/the-road-to-ms-dos-2</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/the-road-to-ms-dos-2</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 08 Aug 2026 23:01:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Pxan!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>MS-DOS was an unwanted child. Tim Paterson <a href="https://nemanjatrifunovic.substack.com/p/birth-of-86-dos?r=4yo154">developed its predecessor 86-DOS</a> only because he urgently needed some kind of operating system for the 8086-based CPU board his employer Seattle Computer Products (SCP) had already released. He really wanted to create a &#8220;proper&#8221; multitasking system, and knew how to do it, having developed something similar for the Z80 as a school project<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. However, the system was needed quickly, so he and his boss agreed to start with something &#8220;quick and dirty&#8221; that would resemble Digital Research&#8217;s CP/M - a minimal operating system developed in 1974 for Intel 8080 based computers with very little memory.</p><p>Microsoft&#8217;s founders Paul Allen and Bill Gates were also getting ready for 16-bit microprocessors. Unsurprisingly, they decided to bet on a system popular on 16-bit minicomputers: UNIX, developed by AT&amp;T&#8217;s Bell Labs in the early 1970s and freely distributed to universities. In February 1980, Microsoft licensed <a href="https://rakanalysis.wordpress.com/2012/02/14/historical-operating-systems-version-7-unix/">UNIX V7</a> source code from Western Electric (AT&amp;T&#8217;s manufacturing arm). The name was not licensed, so on August 25, 1980, Microsoft announced its own UNIX-based product named XENIX.</p><p>Initially, Allen and Gates had a lot of confidence that the portability and flexibility of UNIX would make XENIX the standard operating system on 16-bit microcomputers. Once they actually had the UNIX source code, it turned out it was a poor fit for the current generation of microprocessors, especially the Intel 8086. Worse, it was a memory hog; it grew a lot since Ken Thompson developed the first version in 1969 on a PDP-7 minicomputer. Soon, Microsoft made an arrangement with SCO, a small company specialized in UNIX consulting, to take over most of the work on porting XENIX to target platforms.</p><p>When IBM revealed its plan to develop an Intel 8088 based personal computer that would start with only 16 KB of RAM, it was obvious that there was no way XENIX could be squeezed into such a constrained environment. Like it or not, IBM needed something like CP/M, and after an <a href="https://nemanjatrifunovic.substack.com/p/the-peak-and-collapse-of-digital?r=4yo154">unsuccessful attempt</a> to license it from Digital Research, <a href="https://nemanjatrifunovic.substack.com/p/kay-nishi-and-the-meeting-that-started?r=4yo154">they went back to Microsoft</a>, which in turn acquired 86-DOS from SCP. The operating system was adjusted for the IBM PC, somewhat polished, renamed PC-DOS and shipped in August 1981. Microsoft retained the rights to sell it to other customers under the name MS-DOS.</p><p>Yet, there was a nagging feeling that a single-tasking CP/M clone was inadequate for the new generation of personal computers. Digital Research released multi-user, multitasking MP/M-86 in September 1981 and announced the single&#8209;user multitasking Concurrent CP/M in early 1982. In response, Microsoft came up with a plan for tiered approach to its operating systems: single-user/single-tasking MS-DOS at the bottom;  multi-user/multitasking XENIX at the top; and in the middle, something called XEDOS: a single-user version of XENIX. This &#8220;pyramid of upward-compatible operating systems&#8221; was announced in a <em>Byte Magazine </em>editorial in January 1982.</p><p>XEDOS was apparently more than a marketing ploy; Microsoft and SCO had tried to remove features from XENIX until it could be usable on the PCs of the era, but with little success. In his 2011 book <em>Idea Man</em>, Paul Allen wrote: &#8220;Even a scaled-down version of Unix was too demanding for the 8086 chip&#8221;.</p><p>In the July 1982 edition of <em>Byte</em>, the second part of an article comparing MS-DOS and CP/M-86 analyzed, among other aspects, the future prospects of the two leading 16-bit operating systems. For CP/M-86, the path was obvious - the next generation Concurrent CP/M-86 had been introduced at the West Coast Computer Faire in March. As for Microsoft, its representatives talked about MS-DOS 2.0 without mentioning XEDOS. It was clear the plan was to extend MS-DOS with new features and &#8220;a number of Xenix-derived utilities&#8221; rather than scale down XENIX. The upward path from MS-DOS to XENIX was not clear.</p><p>The change in plans happened sometime in early 1982, after IBM requested a new version of DOS to ship with its upcoming IBM PC XT model. The XT was a modest incremental improvement over the original PC, and IBM clearly communicated that it expected MS-DOS 2.0 to have similarly restricted scope: supporting the new built-in hard disk was all they really wanted. Keeping the operating system small was much more important to IBM than adding new features. Bill Gates was happy to oblige, but Paul Allen would have none of it: after consulting with lead DOS developers Mark Zbikowski and Aaron Reynolds, Allen became convinced that DOS needed a clean rewrite to support features he felt were essential to keep MS&#8209;DOS relevant.</p><p>The first and most important feature was extending the FAT file system to better support hard disks. Allen wanted to replace the flat file system with a hierarchical structure, similar to UNIX, with a root directory and nested sub-directories as the way to organize files on a disk. One of the consequences would be introducing file handlers instead of the CP/M-like File Control Blocks, although the latter were kept for compatibility.</p><p>The second feature was dynamically loadable drivers. MS DOS 1.x, used the monolithic BIOS module to access all hardware. Any changes, including new peripherals, required recompiling or at least patching the BIOS. In MS-DOS 2.0, BIOS was to be expanded to read installable drivers without modification. A configuration file would be introduced to point BIOS to installed drivers, and it would load them as needed.</p><p>The third major feature was a limited support for background <a href="https://www.pcmag.com/encyclopedia/term/print-spooler">print spooling</a>. The idea was to provide a small utility that would run in the background and take over printer output so applications would no longer have to block while sending data to the printer. Full multitasking, as implemented by UNIX or MP/M was not considered for MS-DOS 2.0.</p><p>In addition, a number of features directly inspired by XENIX were added, including <a href="https://www.computerhope.com/findhlp.htm">find</a>, <a href="https://www.computerhope.com/morehlp.htm">more</a>, <a href="https://www.computerhope.com/sorthlp.htm">sort</a> and <a href="https://www.computerhope.com/fchlp.htm">fc</a>, along with utilities needed to support the new hierarchical file system, such as <a href="https://www.computerhope.com/chdirhlp.htm">chdir</a> and <a href="https://www.computerhope.com/mdhlp.htm">mkdir</a>. Some form of IO redirection was also to be included, but obviously not in-memory pipes, given the single-tasking nature of MS-DOS.<br><br>IBM was not happy with Allen&#8217;s ambitious plans:</p><blockquote><p>But it soon became clear that IBM was committed to keeping DOS 2.0 as close as possible to the eight thousand bytes used by DOS 1.1, so as not to disrupt their existing user base. If our new DOS was too memory hungry, IBM feared that smaller PC systems would run out of room for some popular applications. And they weren&#8217;t accustomed to contractors going beyond their specs, even if it meant they were getting more for their money.</p><p>Paul Allen: Idea Man</p></blockquote><p>Bill Gates was very reluctant to alienate IBM, which he internally called &#8220;the customer&#8221;. After receiving complaints from Boca Raton, he had a shouting match with Paul Allen (who called IBM &#8220;the idiots&#8221;) in front of a terrified Mark Zbikowski. Eventually, Gates gave in and let Allen&#8217;s team implement the features they wanted, as long as the delivery date was met.</p><p>The MS DOS 2.0 team consisted of only six people: Paul Allen, Mark Zbikowski, Aaron Reynolds, Nancy Panners, Chris Peters, and Mani Ulloa<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. Neither of the MS-DOS 1.0 developers (Tim Paterson and Bob O&#8217;Rear) was involved in the 2.0 development.</p><p>The first version of MS-DOS 2.0 shipped with IBM PC XT as PC-DOS 2.0 on March 8, 1983. It required about 20 KB of RAM, far more than MS DOS 1.0, so both versions continued to be sold simultaneously for a while.</p><p>To understand the scale of the rewrite, we can compare the sources for MS-DOS 1.25 and 2.0 in the <a href="https://github.com/microsoft/ms-dos">GitHub repository for MS-DOS</a>. Unfortunately, the comparison is not completely straightforward, as some utilities such as chkdsk and sys are available in binary form only in 1.25 but also with source in 2.0. That said, in the 1.25 source tree, we find only 7 files, including tools such the assembler (ASM.ASM), hex2bin (HEX2BIN.ASM) and a Z80 to 8086 translator (TRANS.ASM). Entire DOS kernel source was in a single file (MSDOS.ASM); ditto for BIOS (IO.ASM) and COMMAND.COM (COMMAND.ASM).</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pxan!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pxan!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png 424w, https://substackcdn.com/image/fetch/$s_!Pxan!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png 848w, https://substackcdn.com/image/fetch/$s_!Pxan!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png 1272w, https://substackcdn.com/image/fetch/$s_!Pxan!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pxan!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png" width="700" height="465" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:465,&quot;width&quot;:700,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51663,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/188254464?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pxan!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png 424w, https://substackcdn.com/image/fetch/$s_!Pxan!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png 848w, https://substackcdn.com/image/fetch/$s_!Pxan!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png 1272w, https://substackcdn.com/image/fetch/$s_!Pxan!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28f81af0-ce4a-49e3-83a5-2464c3be578c_700x465.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Code snippet from XENIX2.ASM in MS-DOS 2.0 source tree</figcaption></figure></div><p>The 2.0 source directory (still a single directory) contains 118 ASM files, plus documentation. The kernel, BIOS and COMMAND.COM are split among many files, trying to reflect their structure. Still, some code was directly transferred:  routines like FNDCLUS, BUFSEC, BUFRD, BUFWRT, DATE16, and READTIME from the original MSDOS.ASM appear with the same names, same comments, and nearly the same code in other files.</p><p>Files called XENIX.ASM and XENIX2.ASM contain implementation of some of the new commands ported from UNIX.</p><p>Not all DOS 1.25 functionality was carried on to 2.0. The assembler, the Z80 to 8086 translator and HEX2BIN are present only in the original MS-DOS. </p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>See Tim Paterson&#8217;s blog post: <a href="https://dosmandrivel.blogspot.com/2007/09/design-of-dos.html">Design of DOS</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>According to <a href="https://www.pcjs.org/documents/books/mspl13/msdos/encyclopedia/section1/">The MS-DOS Encyclopedia</a> which contains many details related to MS-DOS early development.</p></div></div>]]></content:encoded></item><item><title><![CDATA[When Compilers Disagree About UTF‑8 ]]></title><description><![CDATA[Why a Simple ASCII Fast&#8209;Path Tripled Clang&#8217;s Performance but Left GCC Unchanged]]></description><link>https://nemanjatrifunovic.substack.com/p/when-compilers-disagree-about-utf8</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/when-compilers-disagree-about-utf8</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sun, 26 Jul 2026 16:40:39 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!K3ss!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the summer of 2006 I started an <a href="https://github.com/nemtrif/utfcpp">open-source C++ library for handling UTF-8 strings</a>. I wanted it to be portable and to work well with STL but did not go crazy with optimizations at the time. </p><p>Recently, as I started <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-i-manual-decoding">writing about UTF-8 decoding</a>, I spent more time revisiting the internals of the library. The function I decided to optimize decodes a UTF-8 encoded code point:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;cpp&quot;,&quot;nodeId&quot;:&quot;dc373d67-19f2-49af-a3a9-8c84fbab180e&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-cpp">    template &lt;typename octet_iterator&gt;
    utf_error validate_next(octet_iterator&amp; it, octet_iterator end, utfchar32_t&amp; code_point)
    {
        if (it == end)
            return NOT_ENOUGH_ROOM;

        // Save the original value of it so we can go back in case of failure
        // Of course, it does not make much sense with i.e. stream iterators
        octet_iterator original_it = it;

        utfchar32_t cp = 0;
        // Determine the sequence length based on the lead octet
        const int length = utf8::internal::sequence_length(it);

        // Get trail octets and calculate the code point
        utf_error err = UTF8_OK;
        switch (length) {
            case 0:
                return INVALID_LEAD;
            case 1:
                err = utf8::internal::get_sequence_1(it, end, cp);
                break;
            case 2:
                err = utf8::internal::get_sequence_2(it, end, cp);
            break;
            case 3:
                err = utf8::internal::get_sequence_3(it, end, cp);
            break;
            case 4:
                err = utf8::internal::get_sequence_4(it, end, cp);
            break;
        }

        if (err == UTF8_OK) {
            // Decoding succeeded. Now, security checks...
            if (utf8::internal::is_code_point_valid(cp)) {
                if (!utf8::internal::is_overlong_sequence(cp, length)){
                    // Passed! Return here.
                    code_point = cp;
                    ++it;
                    return UTF8_OK;
                }
                else
                    err = OVERLONG_SEQUENCE;
            }
            else
                err = INVALID_CODE_POINT;
        }

        // Failure branch - restore the original value of the iterator
        it = original_it;
        return err;
    }</code></pre></div><p>Pretty straightforward: based on the value of the lead byte, determine the length of the sequence, and then depending on the length, construct the value of the code point by extracting appropriate bit fields from the bytes. After the code point is successfully decoded, perform two more checks: one for validity of the code point, and another for an overlong UTF-8 sequence. If both checks pass, return the success status, and the iterator is moved to the next sequence.</p><p>An opportunity to optimization was the fact that ASCII trivially satisfies all UTF&#8209;8 validity requirements. If it turns out the high bit of the lead byte is zero, we have an &#8220;ASCII character&#8221; - a value in the range of <code>[U+0000, U+007F]</code> which is always valid. All we need to do is zero-extend it and we have our code point.  </p><p>Something like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;cpp&quot;,&quot;nodeId&quot;:&quot;f1ca55aa-0aee-4ade-a737-28ea526bea0a&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-cpp">  template &lt;typename octet_iterator&gt;
    utf_error validate_next(octet_iterator&amp; it, octet_iterator end, utfchar32_t&amp; code_point)
    {
        if (it == end)
            return NOT_ENOUGH_ROOM;

        // Save the original value of it so we can go back in case of failure
        // Of course, it does not make much sense with i.e. stream iterators
        octet_iterator original_it = it;

        utfchar32_t cp = 0;
        // Determine the sequence length based on the lead octet
        const int length = utf8::internal::sequence_length(it);

        // Get trail octets and calculate the code point
        utf_error err = UTF8_OK;
        switch (length) {
            case 0:
                return INVALID_LEAD;
            case 1:
                err = utf8::internal::get_sequence_1(it, end, cp);
                // No need for further validations
                if (err == UTF8_OK) {
                    code_point = cp;
                    ++it;
                    return UTF8_OK;
                } else {
                    it = original_it;
                    return err;
                }
                break; // just to make sure there are no warnings
            case 2:
                err = utf8::internal::get_sequence_2(it, end, cp);
            break;
            case 3:
                err = utf8::internal::get_sequence_3(it, end, cp);
            break;
            case 4:
                err = utf8::internal::get_sequence_4(it, end, cp);
            break;
        }

        if (err == UTF8_OK) {
            // Decoding succeeded. Now, security checks...
            if (utf8::internal::is_code_point_valid(cp)) {
                if (!utf8::internal::is_overlong_sequence(cp, length)){
                    // Passed! Return here.
                    code_point = cp;
                    ++it;
                    return UTF8_OK;
                }
                else
                    err = OVERLONG_SEQUENCE;
            }
            else
                err = INVALID_CODE_POINT;
        }

        // Failure branch - restore the original value of the iterator
        it = original_it;
        return err;
    }</code></pre></div><p>My expectation was to see a visible improvement in handling of sequences of ASCII-only strings, with a minor impact on mixed ASCII/non-ASCII strings. Testing with clang 18.1.3 beat my expectations: For pure ASCII text, UTF-8 decoding throughput tripled, and even for mixed text, the improvement was substantial: around 34%.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!K3ss!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!K3ss!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg 424w, https://substackcdn.com/image/fetch/$s_!K3ss!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg 848w, https://substackcdn.com/image/fetch/$s_!K3ss!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!K3ss!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!K3ss!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg" width="1456" height="693" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:693,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:203827,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/208469126?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!K3ss!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg 424w, https://substackcdn.com/image/fetch/$s_!K3ss!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg 848w, https://substackcdn.com/image/fetch/$s_!K3ss!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!K3ss!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2c2a5be-b947-4f1c-9bf3-542e71aca3d8_1470x700.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I actually submitted the change to GitHub, but then at some point decided to test with gcc. Compilers just never stop surprising me: this time there was no difference for the ASCII text at all! Zero!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ezdo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ezdo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png 424w, https://substackcdn.com/image/fetch/$s_!Ezdo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png 848w, https://substackcdn.com/image/fetch/$s_!Ezdo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png 1272w, https://substackcdn.com/image/fetch/$s_!Ezdo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ezdo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png" width="1456" height="683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:683,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96901,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/208469126?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ezdo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png 424w, https://substackcdn.com/image/fetch/$s_!Ezdo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png 848w, https://substackcdn.com/image/fetch/$s_!Ezdo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png 1272w, https://substackcdn.com/image/fetch/$s_!Ezdo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F02d7b52c-04ed-4cab-91cd-251c522af657_1471x690.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For heavily mixed text the throughput was consistently worse by 3-4%, which was not that surprising.</p><p>Time to get our hands dirty and look at the generated assembly code. Here is what happens for an ASCII code point with original version compiled with g++:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;80934376-121c-40a3-ac2f-8f2e329eba17&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">15e0: ldrb w0, [x22]        ; load byte
15e4: tbz  w0, #7, 1700     ; if bit 7 == 0 (ASCII) return immediately
...
1700: add   x22, x22, #1    ; consume 1 byte
1704: cmp   x2, x22         ; check end-of-buffer
1708: b.ne  15e0            ; loop if more input</code></pre></div><p>This is an optimized, heavily inlined build and the last two instructions come from a function calling <code>validate_next</code> in a loop. But it is pretty clear that there are no validation checks in the ASCII branch: the compiler was able to figure out the checks always pass and simply removed them. My optimization did not change a thing - generated code for the ASCII branch remains the same. </p><p>Now clang:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;9159ef17-1aad-4b41-bd3b-3731e539cc1b&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">1870: ldrsb w13, [x20]        ; load byte, sign-extended
1874: and   w12, w13, #0xff   ; w12 = unsigned version
1878: tbnz  w13, #31, 1890    ; if sign bit set, jump to non-ASCII path
187c: mov   w14, wzr          ; no continuation bytes
1880: mov   w15, #1           ; sequence length = 1 byte
1884: mov   x13, x20          ; x13 = pointer to lead byte
1888: mov   w16, w12          ; decoded code point = byte value
188c: b     19ac              ; go to generic validity checks
...
19ac: lsr   w17, w16, #16
19b0: and   w18, w16, #0x1ff800
19b4: cmp   w17, #0x10
19b8: ccmp  w18, w11, #4, ls
19bc: b.eq  2300                 ; invalid code point
19c0: cmp   w16, #0x7f
19c4: b.ls  1860                 ; valid ASCII: advance iterator</code></pre></div><p>Obviously, clang did not eliminate code point validity checks. With my optimization, the code becomes:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;e7cb9e44-0d2c-473f-9d17-51b6137fd983&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">15e0: ldrb w0, [x22]
15e4: tbz  w0, #7, 16c8        # ASCII
...
# ASCII early-return completion
16c8: add   x22, x22, #1
16cc: cmp   x2, x22
16d0: b.ne  15e0</code></pre></div><p>That certainly explains the huge performance improvement with clang.</p><p>What I ended up with was a somewhat bigger change that satisfied both compilers. Instead of checking for code point validity and overlong sequences after decoding is done, I enhanced the <code>get_sequence_*</code> functions to perform validation inline. That preserved all performance gains on clang and led to 15-20% of improvement with gcc and mixed text (no difference for pure ASCII).</p><p>Moral of the story? Compilers are tricky, but spending some time on optimizations can be rewarding.</p>]]></content:encoded></item><item><title><![CDATA[StarLink from 1984]]></title><description><![CDATA[In good old times, StarLink was a board that turned an IBM PC into a multiuser system.]]></description><link>https://nemanjatrifunovic.substack.com/p/starlink-from-1984</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/starlink-from-1984</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 11 Jul 2026 22:04:55 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!p6Ps!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In May 1984, <a href="https://nemanjatrifunovic.substack.com/p/the-peak-and-collapse-of-digital">Digital Research Inc (DRI)</a> announced a product called StarLink<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. It was described as a &#8220;hardware/software combination to expand the IBM PC into a multiuser system&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> . The hardware portion was a board containing an Intel 8088 CPU, 64KB of RAM and four RS-232 interfaces for connecting <a href="https://www.pcmag.com/news/the-forgotten-world-of-dumb-terminals">dumb terminals</a>. The software portion was DRI&#8217;s Concurrent DOS<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> running on the host PC. Such &#8220;multiuser system&#8221; could serve up to five users simultaneously - one working at the PC itself, and four via terminals.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p6Ps!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p6Ps!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png 424w, https://substackcdn.com/image/fetch/$s_!p6Ps!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png 848w, https://substackcdn.com/image/fetch/$s_!p6Ps!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png 1272w, https://substackcdn.com/image/fetch/$s_!p6Ps!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p6Ps!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png" width="813" height="532" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:532,&quot;width&quot;:813,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:569896,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/206571399?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!p6Ps!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png 424w, https://substackcdn.com/image/fetch/$s_!p6Ps!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png 848w, https://substackcdn.com/image/fetch/$s_!p6Ps!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png 1272w, https://substackcdn.com/image/fetch/$s_!p6Ps!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F76cc3486-0391-4ba3-b015-b3889b8b48e8_813x532.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">DRI Micronotes, First Quarter 1984</figcaption></figure></div><p></p><p>The basic idea was to use the multitasking capabilities of Concurrent DOS and replace multiple personal computers with one powerful machine and several &#8220;dumb&#8221; and hopefully inexpensive terminals.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TySt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TySt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png 424w, https://substackcdn.com/image/fetch/$s_!TySt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png 848w, https://substackcdn.com/image/fetch/$s_!TySt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png 1272w, https://substackcdn.com/image/fetch/$s_!TySt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TySt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png" width="720" height="667" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:667,&quot;width&quot;:720,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:265495,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/206571399?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TySt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png 424w, https://substackcdn.com/image/fetch/$s_!TySt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png 848w, https://substackcdn.com/image/fetch/$s_!TySt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png 1272w, https://substackcdn.com/image/fetch/$s_!TySt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fff4ccff0-6b25-4b5c-b0d2-cc0bed97a644_720x667.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Digital Research News, October 1984</figcaption></figure></div><p>DRI had supported this model for a while. Its <a href="https://nemanjatrifunovic.substack.com/p/inside-mpms-process-dispatcher">MP/M operating system</a> introduced in 1979, was designed specifically for multiuser 8&#8209;bit computers, and Concurrent DOS was the latest evolution of that technology on the Intel 8086 architecture. So why was additional hardware needed in the first place?</p><p>MP/M ran on machines built for multiple users. One example was the 8-bit <a href="https://oldcomputers.net/altos-acs8000.html">Altos ACS8000-12A</a>, released in 1981. It had all necessary hardware to support multiple users, including six serial ports, four of which could be used to connect terminals. Later models, such as <a href="https://oldcomputers.net/altos-586.html">Altos 586</a> used the Intel 8086 and could run MP/M-86 or Microsoft XENIX. They were not compatible with IBM PC but, like their predecessors, they provided built-in hardware support for multiple users.</p><p>The IBM PC and XT were designed to be single user personal computers. Turning them into multiuser servers required additional hardware. StarLink came with the board that contained the necessary serial ports, and also an additional CPU and RAM to boost the performance of the system. Without StarLink, a PC running Concurrent DOS could still support terminals connected to its two standard COM ports, but StarLink increased the number to four, plus the comm ports would remain free.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Px8w!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Px8w!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png 424w, https://substackcdn.com/image/fetch/$s_!Px8w!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png 848w, https://substackcdn.com/image/fetch/$s_!Px8w!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png 1272w, https://substackcdn.com/image/fetch/$s_!Px8w!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Px8w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png" width="1210" height="874" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f709f30d-4e89-4afa-8855-15591db37904_1210x874.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:874,&quot;width&quot;:1210,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1125972,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/206571399?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Px8w!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png 424w, https://substackcdn.com/image/fetch/$s_!Px8w!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png 848w, https://substackcdn.com/image/fetch/$s_!Px8w!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png 1272w, https://substackcdn.com/image/fetch/$s_!Px8w!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff709f30d-4e89-4afa-8855-15591db37904_1210x874.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Digital Dialogue, Second Quarter 1984</figcaption></figure></div><p>StarLink was produced by DRI&#8217;s hardware group, formed sometime in 1983 and managed by John Meyer<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a> . The group&#8217;s first product was the <a href="https://www.computerhistory.org/collections/catalog/102645991/">CP/M Gold Card</a>, which allowed Apple II computers to run CP/M software. These expansion cards had been popular since 1980 when Microsoft released its <a href="https://nicole.express/2020/nicole-gets-a-real-computer.html">SoftCard</a>, but by 1984, both Apple II and CP/M were losing ground in business computing.</p><p>StarLink was priced at $1695. The hope was that it would be an attractive option to Altos and similar multiuser systems which started around $8000. However, StarLink required a PC with at least 512KB of RAM and a &#8220;recommended&#8221; 5MB hard disk. These machines were not cheap - an IBM PC XT with 512 KB RAM cost roughly $5000 in 1984. Adding StarLink pushed the total close to the price of an Altos system.</p><p>Then again, unlike Altos, a PC with StarLink could run &#8220;such applications programs as WordStar, MBA Accounting, and Multiplan&#8221;. Yes it could, and also others, like SuperCalc and dBase II. What it could not run was the application that made the IBM PC dominant: <a href="https://www.kornferry.com/insights/briefings-magazine/issue-62/the-dilemma-of-lotus-1-2-3">Lotus 1-2-3</a>. Yes, this was Lotus&#8217;s fault, but it did not matter. People wanted all software developed for IBM PC and PC-DOS to run unmodified on their machines and Concurrent DOS did not provide that level of compatibility.</p><p>One way or another, as with other DRI hardware products, StarLink was not a commercial success and was abandoned sometime in 1985 after the bad times hit DRI hard. John Meyer left the company in September 1985, and together with Don Heiskell and Lee Jay Lorenzen <a href="https://books.google.com/books?id=ejwEAAAAMBAJ&amp;pg=PA53#v=onepage&amp;q&amp;f=false">started Ventura Software</a>.</p><p>The name StarLink got reused. Something called StarLink Plus was advertised in 1987 as a part of <a href="https://winworldpc.com/product/vianet/3x">ViaNet</a>, by Western Digital. In a <em>Byte Magazine </em>advertisement from January 1990, StarLink is a &#8220;service by Galaxy Telecom International in Albuquerque, NM&#8221;.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Nothing to do with SpaceX satellite internet service, except that the latter makes really hard to search the internet for any information about the DRI&#8217;s product.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p><em>Byte</em>, July 1984, pp 46. That&#8217;s the only mention of DRI StarLink in the magazine as far as I am aware. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Apparently, StarLink required a modified version of Concurrent PC-DOS. A copy can be found at <a href="http://www.cpm.z80.de/binary.html">The Unofficial CP/M Web Site</a> - search the page content for &#8220;StarLink&#8221;.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>John Meyer was hired on 8/31/1983 from <a href="https://www.flickr.com/photos/axle81401/albums/72157621958651052/">Sykes Datatronics</a> where he was director of product marketing for telephone management and terminal enhancement systems.</p></div></div>]]></content:encoded></item><item><title><![CDATA[The Peak and Collapse of Digital Research]]></title><description><![CDATA[The History of the Decline and Fall of Digital Research Inc]]></description><link>https://nemanjatrifunovic.substack.com/p/the-peak-and-collapse-of-digital</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/the-peak-and-collapse-of-digital</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sun, 28 Jun 2026 17:07:45 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c3396e05-14a4-4978-9e24-79cae98aa88e_1200x420.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><span>On Thursday, August 21, 1980, Phil Nelson, a technical support representative at DRI&#8217;s headquarters in Pacific Grove, CA, answered a phone call. It was Bill Gates, asking about the status of the CP/M port to the Intel 8086 processor. Nelson replied that CP/M&#8209;86 was scheduled for release by the end of the year. Gates then asked to speak with DRI president Gary Kildall; he explained there were some very important visitors in his office that he intended to send over.</span></p><p><span>It was IBM, looking for a disk operating system for their upcoming IBM PC</span>.</p><h2>Legacy of DRI</h2><p>Digital Research Incorporated (DRI) was one of the most innovative software companies of the late 1970s and early 1980s. CP/M was first implemented by the DRI founder Dr Gary Kildall in 1973/74 - before any commercial microcomputers even existed. The company&#8217;s next operating system MP/M, released in 1979, brought multi-tasking, multi-user support, and built-in networking to eight-bit machines - features that became common on personal computers only in the mid-1990s. Some of the best compilers of the early 1980s were developed by DRI, including PL/I-80, Pascal/MT+, CBASIC, DR FORTRAN and DR C. Graphics were another area where DRI left a significant mark: the GSX graphics library, developed from 1982, was a foundation not only for the GEM desktop environment but for many other graphic applications, including the Ventura Publisher.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TOPt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TOPt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TOPt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TOPt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TOPt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TOPt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg" width="979" height="670" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:670,&quot;width&quot;:979,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:193322,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TOPt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TOPt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TOPt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TOPt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3027c00c-dcfa-467e-bd51-e8e88e41dcc5_979x670.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Concurrent CP/M with Windows</figcaption></figure></div><p>DRI could be described as a &#8220;big fish in a little pond.&#8221; At its peak it employed just over 500 people and generated roughly $55 million in revenue, yet it was the fourth&#8209;largest micro&#8209;software company of the era and held a virtual monopoly on disk operating systems for business microcomputers. By mid&#8209;1991, when Novell acquired the company, it was perhaps two&#8209;thirds of that size in both revenue and headcount; but by then the industry had grown so much that DRI had become almost insignificant.</p><p>The history of the company can be divided into the following periods:</p><ul><li><p>Early days (1976-1980): organic growth from a family shop to an organization with about 40 employees and $6 million in revenue.</p></li><li><p>Rapid growth (1981-1983): venture&#8209;capital investment.</p></li><li><p>Decline (1984-1986): as the market standardized on IBM PC&#8209;compatible machines running MS&#8209;DOS, pushing DRI to the brink of bankruptcy.</p></li><li><p>Survival (1987-1991): reduced in size, the company barely managed to stay in business until it was acquired by Novell.</p></li></ul><p>The first period is relatively well covered in various sources, including Kildall&#8217;s own writings and interviews with his friends and co-workers. The last one, on another hand, is much harder to research; the company was largely forgotten and received little press coverage. Its most successful product from that period was an MS-DOS compatible product called DR DOS. Eventually, Novell acquired DRI as part of a misguided attempt to compete with Microsoft by spending obscene amounts of money on various obsolete technologies.</p><p>This text is focused on the period from 1980 to 1986 starting with the negotiations with IBM and ending with the change in leadership that resulted in prolonged existence of the company, if not in return to relevance.</p><p>If you are looking for a biography of Gary Kildall, this is not it. The closest thing to a biography that I am aware of is the chapter on him in <a href="https://www.goodreads.com/en/book/show/10630.They_Made_America">They Made America: From the Steam Engine to the Search Engine: Two Centuries of Innovators</a> by Harold Evans, Gail Buckland and David Lefer. Kildall is probably the person I mention most in this article, but the story is really about his company, not his personal life.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!b40d!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b40d!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b40d!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b40d!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b40d!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b40d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg" width="271" height="339" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:339,&quot;width&quot;:271,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42483,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b40d!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg 424w, https://substackcdn.com/image/fetch/$s_!b40d!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg 848w, https://substackcdn.com/image/fetch/$s_!b40d!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!b40d!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F819b9dd8-a939-40c4-9ab5-fcb2269632c9_271x339.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Gary A Kildall</figcaption></figure></div><p>While this article is less technical than most of my writing, it is still written by a techie for techies. I assume readers&#8217; familiarity with computer concepts. I focus primarily on engineers at DRI, even though I recognize that many people in non&#8209;technical roles also deserve credit.</p><p>I did not have the opportunity to speak with any former DRI employees<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> and instead relied on various sources: DRI publications (<em>DR News</em> and <em>Digital Dialog</em>); various interviews with Tom Rolander, Gordon Eubanks, Alan Cooper, Lee Lorenzen, Kathy Strutynsky, Dick Williams, Frank Holsworth; archives of old computer magazines; and a few books, including the above mentioned <em>They Made America</em> and <a href="https://www.goodreads.com/en/book/show/41643.Gates">Gates</a> by Stephen Manes and Paul Andrews. No AI tools were used for research and writing, except for spell-checking and grammar<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. The photos were taken from old magazines and DRI publications.</p><h2>Background - Rise of DRI</h2><p>Digital Research Incorporated was officially founded in June 1976 by Dr Gary Kildall and his wife Dorothy McEwen, with assistance of their family lawyer, Gerry Davis, who served on the board for the entire existence of the company. The goal was to commercialize CP/M, which Kildall had developed in 1974. He had hoped to sell CP/M to Intel, just as he had sold them PL/M - the first high-level programming language specifically aimed at Intel-based microcomputers. Kildall was happy with his job at Naval Postgraduate School in Monterey CA and occasional consulting gigs for various high-tech companies based in Silicon Valley. The idea to start a company came from McEwen, who took on the operations while leaving the technical work to Kildall.  They placed an ad at <em>Dr Dobbs&#8217; Journal</em> and started selling CP/M 1.3 to hobbyists for $70 via mail order.</p><p>In the beginning, the business brought barely enough revenue to sustain the small software shop. The deal with IMSAI in 1977 established CP/M as a viable operating system, and from that point the company began to grow. A merger with Microsoft was discussed late that year, but nothing came of it.</p><p>In early 1978, they hired their first full-time employee, John Pierce. By the end of the year the headcount had reached nine and the company moved into a new building - a Victorian house converted into office space. CP/M 1.4 was released the same year and sold for $100 per copy. Sales reached $100K a month with a 57 percent profit margin. Kildall started working on a PL/I compiler.</p><p>The year 1979 was marked by the release of CP/M 2.2 which was a significant re-design of the operating system and the most commercially successful CP/M ever. Also, MP/M 1.0 - a multi-user, multitasking operating system compatible with CP/M was developed and released.</p><p>By August 1980, DRI had expanded into another building and employed 24 full-time staff. The flagship product - CP/M 2.2 was by then the industry standard, but the company was looking toward the 16-bit future: CP/M-86 was being developed as an upgrade path for the existing CP/M customers, while the multi-tasking MP/M was seen as the real future: MP/M-86 was under development by Frank Holsworth who was hired earlier that year. Kildall himself was busy wrapping up the PL/I compiler which he saw as a useful tool for developing both system and business applications for microcomputers.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RvIc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RvIc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RvIc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RvIc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RvIc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RvIc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg" width="1195" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:1195,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:292787,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RvIc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg 424w, https://substackcdn.com/image/fetch/$s_!RvIc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg 848w, https://substackcdn.com/image/fetch/$s_!RvIc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!RvIc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82a5d96c-67a5-4f4e-9913-094f06c4f440_1195x777.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">DRI employees at 801 Lighthouse, Pacific Grove CA</figcaption></figure></div><p>All this success does not mean Kildall was happy with the situation. A brilliant computer scientist, he never had much patience for mundane aspects of running a business; he would much rather work on things that interested him than worry about customer satisfaction. Early on, he offered to sell DRI to the Oakland-based Structured Systems Group, led by Alan Cooper for $70K, but they could not afford it, and Gary Kildall reluctantly carried on, leaving the business operations to his wife as much as possible.</p><p>The arrangement worked, at least while CP/M was generating strong revenue, but the problems became obvious early. Gordon Eubanks later described the organization as very dysfunctional: &#8220;Gary was very laid-back. He didn&#8217;t care that much. Dorothy ran the business and he ran the technical side, and they did not get on.&#8221;</p><h2>End of the Beginning and Beginning of the End</h2><p>By the summer of 1980, 16&#8209;bit microprocessors had been available for some time: Intel&#8217;s 8086 was released in 1978, followed by the Zilog Z8000 in early 1979 and Motorola&#8217;s 68000 later that year. Computer manufacturers (&#8220;OEMs&#8221;) were in no hurry to adopt them, though. Virtually all business microcomputers at that time were based on Zilog Z80 CPU and S-100 bus and ran CP/M.</p><p>The change came from a direction few expected. IBM CEO Frank Cary was so frustrated with his company&#8217;s inability to develop a successful personal computer that he allowed the Entry Level Systems department in Boca Raton, Florida, to bypass the IBM&#8217;s development process and build a computer in a year using of-the-shelf components (including the Intel 8088) and third-party software. The software lead for the project, Jack Sams, immediately contacted Microsoft for a BASIC interpreter. He also hoped to license a disk operating system from Microsoft, but there were none at the time. Instead, Bill Gates directed him to Digital Research.</p><p>The initial meeting between the IBM and DRI took place on Friday, August 22, 1980, at DRI&#8217;s headquarters in Pacific Grove, CA. What exactly happened is impossible to establish, given the widely different accounts from the people who were there<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. According to Jack Sams, the DRI representatives refused to sign the NDA, and the IBM delegation left without even meeting Kildall or starting discussions about licensing of CP/M. The DRI side maintains that Kildall returned from a business trip in the afternoon, signed the NDA, and reached &#8220;an understanding&#8221; with IBM to license CP/M. </p><p>Descriptions of the aftermath also differ: Kildall said he repeatedly tried to contact Sams without success. Sams recalled having phone conversations in which he asked DRI to commit to IBM&#8217;s deadline for delivering CP/M-86 and was turned down.</p><p>Interestingly, there is no controversy about Bill Gates&#8217; role in these early negotiations. All sides agree that he sent the IBM team to Digital Research. Furthermore, after the meeting broke down, he called Kildall to urge him to restart the talks. It was not until a month later that he got convinced by Paul Allen and Kay Nishi that Microsoft should offer an operating system to IBM to save the project.</p><p>Details aside, IBM and DRI were not able to reach the agreement for multiple reasons:</p><p>First, there was DRI&#8217;s attitude toward the opportunity. Claims that Gary Kildall went flying for fun that day are not fair, but Jack Sams and his team had reason to be frustrated. Gates had rescheduled an important meeting with the Atari&#8217;s CEO to meet Sams, personally greeted the IBM visitors in a suit, and even sent a thank&#8209;you note after the meeting. By contrast, Kildall flew off to deliver documentation to a client and left the IBM delegation with his wife and lawyer for the entire morning. Microsoft was eager to put all other projects on hold to help IBM meet its schedule. DRI had no interest in doing such a thing. Kildall had little faith that a big and slow company like IBM could succeed in the fast-moving microcomputer market.</p><p>Second, there was a fundamental technical disagreement. In Kildall&#8217;s view, CP/M was adequate for 8-bit computers with 64 KB of address space, but the new generation of personal computers built around 16-bit processors was ready for multi-tasking operating systems. DRI had already built one - MP/M, and was porting it to the Intel 8086 as MP/M-86<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>. CP/M-86&#8217; s role was merely an upgrade path for the existing CP/M users. IBM was not interested in multi-tasking capabilities of the operating system; they wanted something familiar to existing personal computer users, not to go overboard with innovation.</p><p>Finally, IBM asked to pay one-time fee for CP/M-86 and market it as PC-DOS. DRI insisted on per-copy royalties and keeping the CP/M name. Apparently, they felt caving to IBM&#8217;s requests would cause displeasure from the existing customers and maybe even lawsuits. Interestingly, the important IMSAI deal of 1977 had included both a flat fee and a name change. More recent agreements with Osborne Computer and Microsoft involved one&#8209;time payments without name changes. Kildall later regretted both arrangements and did not want to repeat the mistake.</p><p>One way or another, at some point Jack Sams had had enough and went back to Bill Gates who was much more enthusiastic about participating in the IBM project. Microsoft agreed to provide an operating system. Instead of developing it from scratch, they licensed, and later bought, 86-DOS, recently developed by Seattle Computer Products. 86-DOS implemented the CP/M application interface to ease transition of existing software from the popular 8-bit operating system. Microsoft generously offered the OS to IBM with no per-copy fee but kept the right to license it to other OEMs as MS-DOS.</p><p>The contract between IBM and Microsoft remained secret, and DRI was initially kept in the dark. Eventually, as the release date approached, IBM started sending the API specification to software developers to ensure support for its new machine. It was pretty obvious the API was a copy of CP/M&#8217;s, and Kildall notified IBM of his intention to sue SCP for copyright infringement. </p><p>That caused immediate reaction in Boca Raton. Regardless of the outcome, a lawsuit would have delayed the release of PC-DOS, and that was the last thing IBM wanted to happen. IBM&#8217;s Don Estridge invited Kildall to his headquarters, and on July 21, 1981, the two sides reached an agreement: IBM would market CP/M-86 alongside PC-DOS and pay a per-copy fee, just as DRI had originally asked. There was no agreement on the retail pricing at that time, though.</p><p>On August 12, 1981, Estridge presented the IBM PC at the Waldorf-Astoria in New York City. The only available operating system for the new computer was IBM PC-DOS, priced at $40. Two alternate operating systems were announced for a future date: DRI&#8217;s CP/M-86, at $240 and the UCSD p-System from the Lowel, MA based company SofTech at $260. According to Estridge, it was research conducted by SofTech that determined the pricing for both systems<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a>. Other sources from IBM mentioned the per-copy fee as the reason for the difference, though the fee was nowhere near large enough to justify it. </p><p>The price came as a shock for DRI - it was similar to the retail price of CP/M-86 for direct sales ($250), but was not what they expected from an OEM, especially given the six-to-one difference from PC-DOS. Tom Rolander described it as the biggest shock of his life and &#8220;the loss of innocence&#8221;.</p><p>Interestingly, in November 1984 interview with <em>Computer Language Magazine</em>, Gary Kildall downplayed pricing as the reason for losing to PC-DOS. In his words: &#8220;If we had been prepared with a CP/M-86 strategy we would have been able to do the pricing right, and we would have been prepared for the IBM phenomenon. We were prepared for a multitasking phenomenon&#8221;.</p><p>Timing was another major problem. CP/M-86 was first released in January 1981, more than a year late. Then it took another eight months after the agreement with IBM to release a version for the IBM PC. For the first six months IBM PC was shipping with PC-DOS as the only option.</p><p>Perhaps it did not matter. It was clear that IBM really wanted PC-DOS as the operating system for its new microcomputer. CP/M-86 was a distraction to be handled without going to court and UCSD p-System wasn&#8217;t seen as a viable operating system, but as a runtime for the UCSD Pascal compiler which was popular in education.</p><p>CP/M-86 1.1 for IBM PC was released on April 5. 1982 and by that time over 60,000 IBM PC computers were sold with PC-DOS. The game was over. It would take time to understand just how important that game had been.</p><h2>Venture Capital Arrives</h2><p>In October 1980, Jacqueline &#8220;Jaqui&#8221; Morby<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a>, a vice president at the venture capital firm T.A. Associates, began exploring the possibility of investing in software companies. As she later put it: &#8220;I started simply by browsing through computer trade magazines and paying attention to the largest ads - I said to myself, this must be more than just a garage type operation if it could afford to place a $4,000 ad in a magazine&#8221;. </p><p>Venture capitalists wanted a piece of the microcomputer software market, which in 1981 was estimated at $300 million in annual sales and projected to grow to more than $5 billion by 1985.</p><p>For their part, the Kildalls wanted additional investment to help the company grow and diversify. They had become painfully aware of their shortcomings as business leaders and felt it was time to bring in professional management. </p><p>Morby met Gary Kildall at the San Jose airport. He flew her in his plane to Sacramento and, over lunch, explained his views on the software industry. Kildall strongly believed that a systems software company should stay out of applications to avoid competing with its customers. &#8220;It was a fatal mistake,&#8221; Morby said in 1995. &#8220;One of the fatal mistakes&#8230;,&#8221; she added.</p><p>The project took a few months to complete, but by August 1981 four venture capital firms, led by T.A. Associates had invested in DRI. Morby and another representative of venture capital companies, Larry Mohr, joined DRI&#8217;s board alongside the Kildalls and Davis.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4GN_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4GN_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4GN_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4GN_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4GN_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4GN_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg" width="496" height="702" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:702,&quot;width&quot;:496,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:108580,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!4GN_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg 424w, https://substackcdn.com/image/fetch/$s_!4GN_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg 848w, https://substackcdn.com/image/fetch/$s_!4GN_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!4GN_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb41071e1-3cef-44ea-9d00-388f22403caf_496x702.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In November 1981, at Morby&#8217;s recommendation, John Rowley, who had previously worked at Intel, was hired as COO and took over day&#8209;to&#8209;day management, to the great relief of the Kildalls who were struggling to manage 82 people. Rowley did his best to turn the fast-growing startup into a proper corporation by introducing a management hierarchy, ranking systems and stock options. </p><p>Alan Cooper described Rowley as optimistic and enthusiastic, but unfocused and disorganized. Eubanks called him &#8220;an interesting guy&#8221; but added that he was a not a good choice for DRI.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!hduc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!hduc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hduc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hduc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hduc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!hduc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg" width="489" height="499" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:499,&quot;width&quot;:489,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:48553,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!hduc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg 424w, https://substackcdn.com/image/fetch/$s_!hduc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg 848w, https://substackcdn.com/image/fetch/$s_!hduc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!hduc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa9fb8fc2-1f37-453d-b7b0-cf947c3c99e5_489x499.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">John Rowley, 1983</figcaption></figure></div><p>Some of the old-timers did not appreciate the changes. DRI was quickly shifting from a small business that felt like loving, albeit dysfunctional family into a soulless corporation. Others welcomed the new order. Kathy Strutynsky had been hired by Gary Kildall who stormed into her office at Naval Postgraduate School and with the words &#8220;I can finally afford you&#8221;, grabbed her bag and took her to DRI without even discussing salary. When pay grades were introduced, she got a raise. She never accused her friend of exploiting her: &#8220;Gary only understood whether you liked what you were doing in programming&#8221; she explained many years later. On the other hand, when Frank Holsworth was hired, he boldly asked for a salary almost 40 percent higher than what he was earning at the University of California, and Kildall agreed on the spot. &#8220;Damn!&#8221;, Holsworth thought, &#8220;I should have asked for more&#8221;.</p><p>The company expanded from its two Victorian-style houses into modern office space at 160 Central Ave, Pacific Grove.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nCd_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nCd_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nCd_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nCd_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nCd_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nCd_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg" width="1456" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:236961,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nCd_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nCd_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nCd_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nCd_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc10fa649-811f-4712-b859-6af1d9ced57f_1618x667.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Office building at 160 Central Ave</figcaption></figure></div><h2>The Industry Standard</h2><p>By the end of the 1970s, the business microcomputer world had settled on a de facto standard: hardware built around the S&#8209;100 bus and an Intel 8080&#8209;compatible CPU (usually the Z80), running CP/M. There were thousands of different computer models<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a> that adhered to this standard and could share both software and peripherals. </p><p>Writing portable software for an 8-bit CP/M machine was straightforward as long as only the documented calls were used to interact with the hardware. That meant no graphics, sound or anything else CP/M did not directly support, and it supported very little. Still, the existing software covered word processing, spreadsheet, databases, development tools. Obviously, almost no games.</p><p>When the IBM PC appeared, it quickly became popular enough that many applications (most notably Lotus 1-2-3, released in January 1983) were written specifically for that model and accessed its hardware directly for graphics and performance. </p><p>Unlike Apple, IBM was not able to stop other manufacturers from cloning its flagship microcomputer and soon &#8220;compatibles&#8221; appeared - the first probably being Columbia Data Products&#8217; MPC 1600, released in June 1982. Buyers of these machines expected to run IBM PC applications unmodified, and MS&#8209;DOS compatibility alone was not enough; the hardware had to behave like IBM&#8217;s as well.</p><p>By early 1984, there was consensus about the new &#8220;industry standard&#8221; for business microcomputers: software compatibility with PC-DOS (in other words, MS-DOS) and hardware compatibility with the IBM PC.</p><h2>Quest for Concurrency</h2><p>The first multitasking operating system DRI produced was MP/M. Developed in 1979, it was written single&#8209;handedly by Tom Rolander and ran on 8&#8209;bit Intel 8080&#8209;compatible computers. The following year, Frank Holsworth was hired to write the 16-bit version, and MP/M-86 2.0 for Intel 8086 processors was released in September of 1981.</p><p>MP/M would nowadays probably be described as a &#8220;server&#8221; operating system. It supported multiple users connected to a central machine via dumb terminals. This usage model was common among minicomputers running UNIX or some other timesharing operating system. Several microcomputer manufacturers, such as Altos Computer Systems, followed the same model and largely adopted MP/M.</p><p>It was not necessarily well-suited to personal computers where a single user had a machine for himself. In that world, a user needed to run multiple applications at the same time and easily switch between them as needed. DRI decided to introduce a single-user multitasking version of MP/M, where a user could run multiple programs in virtual consoles on a single screen.    </p><p>The new product ended up being named Concurrent CP/M-86. As Tom Rolander, then head of the Operating Systems Division, explained: &#8220;Concurrency is a better word than multi-tasking. It is friendlier. It means that now you can do more things with your microcomputer at the same time&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a>.</p><p>Concurrent CP/M-86 was announced at the West Coast Computer Faire in March 1982 and released in September for the IBM PC. The minimum system configuration required two floppy disk drives and at least 256 KB of RAM, which was a very high requirement for 1982. The base IBM PC came with only 16 KB of RAM, though 64 KB configurations were more common.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yjys!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yjys!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yjys!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yjys!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yjys!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yjys!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg" width="1456" height="1132" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1132,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:752749,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yjys!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yjys!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yjys!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yjys!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71aa9518-b9cc-4352-8453-a42542e79be6_1656x1288.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">DR News front page displaying Concurrent CP/M in action</figcaption></figure></div><p>In February 1984, Concurrent CP/M Release 3.1 shipped. Multi-user mode was re-introduced and MP/M was retired as a separate product line. It contained some rudimentary support for character-mode windows. An interesting optional feature was the PC-Mode - a compatibility layer that enabled CCP/M users to run &#8220;most&#8221; PC-DOS applications. In reality, it was somewhat compatible with PC-DOS 1.1. It did not support hierarchical file system and other advancements that came with version 2.</p><p>In May, the entire product line was renamed Concurrent PC-DOS and the new version was released in the fall. From that point on, there would be no more new operating systems with CP/M or MP/M in its name.</p><p>Now that DRI had a clearly superior operating system, all it took was to convince people of its value on personal computers. That proved difficult. Users wanted something inexpensive that would run any IBM PC program while taking as little precious memory as possible. Concurrent DOS was none of these things. Peter Norton commented: &#8220;It&#8217;s like turning a passenger car into a dump truck&#8221;.</p><p>Frustrated, Gary Kildall spent years trying to explain why modern hardware deserves better than the simplistic single-tasking MS-DOS. But the time for multitasking on PCs had not yet come. A true visionary, Kildall saw &#8220;what&#8221;, but not &#8220;when&#8221;. In his memoires written a decade later he noted: &#8220;I was competing with an operating system clone, MS-DOS, of my original design, and both operating systems were by this time completely out of date.&#8221;.  </p><p>Concurrent DOS never became a dominant OS on personal computers but was not necessarily a failure either. It found use in office environments to run small servers, much like the original MP/M and later Xenix even after DRI was acquired by Novell.</p><h2>Rise of Languages</h2><p>DRI started and ended as an operating systems company. That said, CP/M itself was developed almost accidentally, to host a compiler for a programming language called PL/M that Gary Kildall had previously created. Kildall&#8217;s core expertise were programming languages, and he kept returning to them even after CP/M made him famous.</p><p>Apart from Kildall, the most important person for starting the DRI Language Division was his friend and former student Gordon Eubanks who had developed a popular BASIC compiler, CBASIC. In June 1981, DRI acquired his company Compiler Systems Inc for $1M. Eubanks felt the amount was very generous: &#8220;all this because Gary was pissed at Microsoft&#8221;.</p><p>Before the acquisition, DRI already produced some programming languages and tools. Kildall&#8217;s PL/I-G compiler was released in December 1980 as PL/I-80. The XLT86 assembly code translator was offered to ease migration from 8-bit platforms. Other programming tools included a macro-assembler, linker, and an indexing library for PL/I called BT-80.</p><p>Over the summer, Eubanks and Kildall approached Mchael &#8220;Mike&#8221; Lehman of MT Microsystems, producers of the excellent Pascal/MT+ compiler. In November, DRI acquired the company. Interestingly, Lehman did not join the Language Division, but the small R&amp;D group recently started by Alan Cooper. He soon got busy developing a C compiler for CP/M, code named MCC (Mike&#8217;s C Compiler). It was released as &#8220;DR C&#8221; in July 1983 and priced at $600. Around that time, Kildall announced internally that all future operating systems would be developed in C; until then, they had been coded in a mix of assembly and Kildall&#8217;s PL/M.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E-wD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E-wD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg 424w, https://substackcdn.com/image/fetch/$s_!E-wD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg 848w, https://substackcdn.com/image/fetch/$s_!E-wD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!E-wD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E-wD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg" width="784" height="1039" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1039,&quot;width&quot;:784,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:185120,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!E-wD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg 424w, https://substackcdn.com/image/fetch/$s_!E-wD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg 848w, https://substackcdn.com/image/fetch/$s_!E-wD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!E-wD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ef3ac86-6fa1-4edf-8b3f-344d481cc668_784x1039.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Ad for Pascal/MT+</figcaption></figure></div><p>Within the Languages Divisions, engineers were assigned to specific products. Rick Rosenbaum was in charge of Pascal and led the ports of Pascal MT/+ compiler to the 16-bit Intel 8086 and Motorola 68000 architectures. Charles &#8220;Chuck&#8221; Spitz took over PL/I from Gary Kildall and Dan Davis, and developed a new compiler back-end for the 8086. Paul Lancaster worked on CBASIC products, and Bob Silberstein on assemblers and linkers for new target architectures.</p><p>By July 1982 the Languages SBC released Pascal/MT+86 for Intel 8086 compatible systems ($600), and two programmer productivity tools: Access Manager - a generic file indexing library ($300) that replaced BT-80, and Display Manager ($400) - a tool for designing input and output forms. One of the main strengths of Access Manager was that it was, unlike its predecessor BT-80, accessible from other programming languages released by DRI, and in a sense could serve as a common file format. Display Manager included both an editor and a runtime for accessing screens in device-independent way.</p><p>Around that time, a deal was made with Micro Focus to market and sell their COBOL compilers: CIS COBOL and Level II COBOL.</p><p>In late 1982 Allen Beebe was hired as director of engineering for the Languages SBC. In the beginning he focused on porting DRI languages to 16-bit platforms.</p><p>Eubanks and Beebe defined &#8220;three charters&#8221; for the DRI Languages SBC: programming languages, development tools and products for learning programming.</p><p>The languages were being ported from 8-bit Intel 8080 compatible platforms to 16-bit Intel 8086 family and Motorola 68000. They were being extended to work not only on CP/M but also on MP/M, UNIX and &#8220;other operating systems&#8221;. </p><p>Sometime that spring, Allen Beebe was promoted to director of the Language SBC, and Eubanks started a new Commercial Systems Division.</p><p>Soon, two &#8220;beginners&#8221; programming languages were announced. In February, DR Logo, a port of <a href="https://el.media.mit.edu/logo-foundation/what_is_logo/logo_programming.html">Logo</a> programming language which was designed as a learning tool. Gary Kildall had coded it himself to give his son a good language for learning programming. On May 27, DRI shipped Personal BASIC, an inexpensive interpreter bundled with an editor, debugger and syntax checker also aimed at beginners.</p><p>In March 1984 DR FORTRAN-77 was scheduled to be released. It was based on the new compiler back-end and compatible with Access Manager, Display Manager and other DRI programming tools. </p><h2>Graphics</h2><p>Early DRI operating systems were graphics-agnostic. It was probably the release of Xerox Star in 1981 that pushed the company to explore the potential of adding graphics to the existing products or even adding new ones. The task fell to Fred Langhorst who joined the R&amp;D group in early 1982.</p><p>The initial plan for entering the graphics field relied on collaboration with the Oregon&#8209;based company Graphic Software Systems Inc. (GSS), which provided a library for drawing graphics primitives called GSS-CORE<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-9" href="#footnote-9" target="_self">9</a> and on top of it GSS-PLOT for plotting data charts. </p><p>DRI formed a graphics group led by Langhorst that initially included a marketing manager, an administrative assistant and three engineers. The group started working on a library that would expose the functionality of the GSS libraries via an interface called Graphical Kernel Standard (GKS) that was standardized by ISO and ANSI. DRI&#8217;s implementation of GKS was named Graphics System Extension (GSX). The plan was to ship GSX with CP/M operating systems (and make it available on others) and to modify DRI programming tools to use it to gain graphics capabilities. Even end-user graphical applications were shyly mentioned - something that was generally against Gary Kildall&#8217;s principles. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WnnW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WnnW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WnnW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WnnW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WnnW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WnnW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg" width="1279" height="942" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:942,&quot;width&quot;:1279,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:185202,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WnnW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg 424w, https://substackcdn.com/image/fetch/$s_!WnnW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg 848w, https://substackcdn.com/image/fetch/$s_!WnnW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!WnnW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3421815-a781-4239-9c38-ddcfc41e5270_1279x942.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Initial Graphics Group</figcaption></figure></div><p>On July 27 1982, Graphic products group was officially promoted to a Strategic Business Center (SBC) with Fred Langhorst as a director, reporting directly to John Rowley. Graphics were seen as a potential high-rate growth opportunity for the company.</p><p>A diagram published in <em>DR News</em> for Q1 1983 showed the architecture of the GSX library in parallel with the CP/M operating system. That was not an accident - GSX was supposed to help with portability for graphics applications just as CP/M had done with character-based business software.</p><p>On April 1, 1983, the agreement with GSS was revised: DRI acquired rights to use their libraries and renamed them accordingly, replacing &#8220;GSS-&#8221; prefix with &#8220;DR-&#8221;. More developers were hired, including the new engineering manager for the SBC Don Heiskell who brought industry experience with graphics software (Langhorst&#8217;s background was mostly in academia). Dana Firth came from DEC as products marketing manager for Graphics.</p><p>In the fall, first concrete results were ready to be announced: the popular CBASIC compiler was ready to use graphics - on either CP/M or MS-DOS as long as GSX was available.</p><p>Even bigger news was the release of the first DRI commercial application: it was DR Graph - a menu driven graphical program that could display or print graphs and charts based on data entered manually or imported from spreadsheets.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YMZD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YMZD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YMZD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YMZD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YMZD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YMZD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg" width="1330" height="553" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:553,&quot;width&quot;:1330,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:132084,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!YMZD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg 424w, https://substackcdn.com/image/fetch/$s_!YMZD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg 848w, https://substackcdn.com/image/fetch/$s_!YMZD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!YMZD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f541cb7-8f48-49e0-b12f-5672fdb5a9c4_1330x553.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A pre-release version of DR Graph</figcaption></figure></div><p>In December &#8216;83 an internal call went out for testing another GSX-based application: DR Draw. It was meant to be used to create presentation graphics for businesses.</p><p>The applications supported not only with printers and plotters, but also the Polaroid Palette - a digital film recorder popular in the 1980s. In May, DR Graph, DR Draw and Polaroid&#8217;s Palette driver were packed together as &#8220;Presentation Master&#8221; and marketed as a solution for creating slides for business presentations.</p><p>The big one had to wait until November: GEM Desktop was announced at COMDEX/Fall &#8216;84 and released on February 28, 1985.</p><p>I already wrote about the history of GEM<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-10" href="#footnote-10" target="_self">10</a> and will not repeat it here. It was a fine piece of software, but the combination of Apple&#8217;s litigation threats and DRI&#8217;s half-hearted marketing efforts ensured it faded into obscurity.</p><p>Yet, a couple of GEM-based applications were developed and continued to be sold for a while. In the May 1989 issue of <em>Byte</em>, there were adds for Gem Desktop, Gem Draw Plus, Gem 1st World Plus, Presentation Team, Desktop Publisher and Gem Artline.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GU1t!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GU1t!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GU1t!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GU1t!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GU1t!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GU1t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg" width="1288" height="1126" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1126,&quot;width&quot;:1288,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:507315,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GU1t!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GU1t!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GU1t!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GU1t!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff7ba5222-0749-4e32-92d3-c3ba95a8527b_1288x1126.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">GEM Graphics products in 1987</figcaption></figure></div><p>By March of 1990, only two survived: a <em>Computerworld</em> article from Mar 26, 1990: &#8220;New versions of Artline and Presentation Team&#8221; mentioned the last remnants of DRI graphics offerings, mostly criticizing them for not running natively under MS Windows. </p><p>Microsoft Windows 3.0 was released on May 22, 1990. DRI leaders saw the writing on the wall and closed the Graphics Unit.</p><h2>The British are Coming</h2><p>In 1982, DRI was quickly expanding: first into larger offices in Monterey area, then into several locations across the United States. In October, international expansion was officially announced. Paul Bailey was appointed Director of European Operations. His first task was to open a sales and support office in the U.K. and then in Germany and France. In January 1983, a small group from Monterey area travelled to England to help set up the office and train new employees. Frank Iveson, who would later become DRI&#8217;s vice president of marketing, was appointed Director of Northern European Operations at that time.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iNRn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iNRn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iNRn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iNRn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iNRn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iNRn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg" width="676" height="699" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:699,&quot;width&quot;:676,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:114940,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iNRn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iNRn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iNRn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iNRn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70d9b38d-9b0c-450e-90fd-75693b880865_676x699.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Gary Kildall and Paul Bailey in October 1982</figcaption></figure></div><p>The U.K. office opened in Newbury, England. Initially it was a sales and support site, but soon the OEM Support Group was started there to help customers adapt DRI operating systems to their hardware. According to <a href="https://jwde.jp/personal.htm.en">Joe Wein</a><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-11" href="#footnote-11" target="_self">11</a> , the first new product that came from the group, DOS Plus, began as a support project for Philips Vienna. They took the abandoned CP/M-86 OS and added the Concurrent DOS PC-Mode emulator to it, imperfect as it was. DOS Plus turned out to be surprisingly successful in Europe; it was bundled not only with the <a href="https://www.homecomputermuseum.nl/en/collectie/philips/philips-yes/">Philips computer</a> it was originally developed for, but also with popular models from Amstrad and Acorn. </p><p>In 1986, the OEM Support Group was renamed the <span data-color="rgb(32, 33, 34)" style="color: rgb(32, 33, 34);">European Development Centre (EDC) and moved to Hungerford, England.</span> Concurrent DOS 4.1 was handed over to EDC, and development continued there, including all versions of Concurrent DOS XM and DR Concurrent DOS 386. The OS was commercially pretty successful in Europe, where customers were less obsessed with IBM than in the US<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-12" href="#footnote-12" target="_self">12</a>.</p><p>DOS Plus, with all its limitations, showed that there was real demand for a drop-in replacement for MS-DOS. In 1987, after receiving $1M investment from Kay Nishi, of all people<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-13" href="#footnote-13" target="_self">13</a>, DRI started planning a product that would be 100% compatible with MS-DOS while still offering technical improvements. The operating system was developed by the EDC, with Joe Wein as the chief architect. It was named DR DOS, and first announced on May 28, 1988, as DR DOS 3.31.</p><p>DR DOS turned out to be the most popular DRI product of its later years. Ironically, it abandoned concurrency that DRI had been so desperately trying to promote since 1979, but was truly compatible with MS-DOS and inexpensive. DR DOS 5.0, released in 1990, was sold as a retail product and caused genuine panic at Microsoft and, one hopes, a smile on Gary Kildall&#8217;s face. </p><h2>At the Peak</h2><p>In the first half of 1982, a major restructuring was implemented. The Operating Systems Division and the Languages Division were promoted to Strategic Business Centers (SBC) with their own independent development and marketing. The idea was to make these key divisions more responsive and allow them to operate almost as independent companies.  </p><p>The new structure was described in detail in the first (August 1982) edition of <em>Digital Dialog</em>, the DRI employee newsletter. It included a complete list of DRI&#8217;s employees - some 200 of them, divided into divisions: R&amp;D, Graphics, Operating Systems, Languages, Finance &amp; Administration, Manufacturing, Operations and Sales. Gary Kildall was President and John Rowly the COO. The three Vice Presidents were: Dorothy McEwen (Operations), Tom Rolander (Operating Systems) and Gordon Eubanks (Languages).</p><p>In 1982, DRI did not appear to be much affected by the rising popularity of the IBM PC, and continued to grow in headcount, products lines and revenue.</p><p>Tom Rolander considered the CP/M &#8216;83 trade show, held Jan 21-23 at Moscone Center, San Francisco, to be the company&#8217;s peak moment. Financially, it was not; DRI&#8217;s revenue would continue to grow for another couple of years. But in terms of presence and visibility, it probably was. The speakers included Alan Kay, Adam Osborne, Dan Bricklin and Dan Fylstra. Among more than 400 exhibitors were companies like Altos, Commodore, DEC, Fujitsu, Hewlett-Packard, NEC, NCR, Osborne, Radio Shack/Tandy, Televideo, Vector, Xerox and Zilog. Some 50,000 people attended.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XxSs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XxSs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XxSs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XxSs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XxSs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XxSs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg" width="768" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:768,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:171531,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XxSs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg 424w, https://substackcdn.com/image/fetch/$s_!XxSs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg 848w, https://substackcdn.com/image/fetch/$s_!XxSs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!XxSs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F94f52d70-b697-4a79-8760-16f0e2f4a870_768x484.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">CP/M &#8216;83 conference</figcaption></figure></div><p>Early 1983 marked the beginning of international expansion. The first international office was established in Newbury, England. The Munich, Germany office was opened next, led by Dieter Kadach, director of Central European operations. On May 12, the Japan office was officially opened with John Rowley hosting the event. Masahiro Morimoto was appointed Director of Pacific Operations and Masaho Okabe President of DRI Japan.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uILe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uILe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uILe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uILe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uILe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uILe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg" width="637" height="850" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:850,&quot;width&quot;:637,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:153713,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uILe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg 424w, https://substackcdn.com/image/fetch/$s_!uILe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg 848w, https://substackcdn.com/image/fetch/$s_!uILe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!uILe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd612e554-e44c-4f49-8dea-1755226868c4_637x850.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In the summer of 1983, another reorganization introduced the Consumer Division and folded the former Strategic Business Centers into the Commercial Systems Division under Allen Beebe. It was renamed the Systems Software Division by early 1984.</p><p>In September, the plan to relocate the headquarters to Garden Court Office Complex in Monterey was announced. At that point, DRI had 427 employees. It would take a year to complete the move.</p><p>By 1983 revenue, DRI was estimated to be the fourth largest software company<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-14" href="#footnote-14" target="_self">14</a>, with sales around $45M. It trailed MicroPro ($60M), Microsoft ($55M), and Lotus ($53M) but was ahead of VisiCorp ($43M) and Ashton-Tate ($35M). </p><h2>Home and Education</h2><p>The Consumer Systems Division was created as a peer to the Commercial Systems Division. It was built from scratch by Ken Harkness, who came from Atari with the idea of producing home and educational software.</p><p>The first products from the new division were transplanted from the Languages group: Personal Basic and DR Logo. Then OWLCAT, Inc., a producer of S.A.T. preparation tutorials, was acquired and added to the Division. An operating system - Personal CP/M, a ROM-able menu-driven variant of 8-bit CP/M 3, was added to the product list as well. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j47C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j47C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j47C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j47C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j47C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j47C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg" width="447" height="634" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:447,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:59728,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!j47C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg 424w, https://substackcdn.com/image/fetch/$s_!j47C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg 848w, https://substackcdn.com/image/fetch/$s_!j47C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!j47C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef001240-c37b-4505-988f-a20386f7b8e9_447x634.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Owlcat advertisement</figcaption></figure></div><p>Kildall and Rolander joined the Division from R&amp;D (formally or not) and started exploring new optical-storage technologies, like video discs. They saw the new types of media as an opportunity to create new kinds of educational software, including electronic encyclopedias. When they suggested to add the technology to the existing product line, the idea was shut down. They then started a separate company, named Activenture Corporation to pursue it.</p><p>As early as April 1984, some analysts were warning that the Consumer Division was not producing the expected results and that growth opportunities in the home and educational market were limited.</p><p>By late 1984, it was clear the division was a failure. Kildall said in an interview: &#8220;The difficulty in concentrating in educational products&#8212; which I&#8217;d like to&#8212; is that there is a much larger margin in commercial software.&#8221;</p><p>The Consumer Division was likely shut down sometime in 1985, although ads for DR Logo continued to appear in computer magazines for a while.</p><h2>Round Three</h2><p>The February 20, 1984 issue of <em>InfoWorld</em> included an article titled &#8220;New developments may decide battle over Unix&#8221;. It quoted Gary Gysin, DRI&#8217;s product manager for operating systems: &#8220;Round one was the 8-bit processor. We provided the standard operating system, CP/M. Round two was the 8088; we lost that one. Round three is the 286 and the 68000. We&#8217;re winning that one.&#8221;</p><p>Back in April 1982, the famous Homebrew Computer Club had been shown the recently announced Intel&#8217;s 80286 CPU. At the same event, it was announced that DRI was developing a new operating system called MP/M-286 specifically for the new processor. DRI was working hard to position itself for the next generation of personal computers, and it was betting on its MP/M - based technology.</p><p>Then, in early 1984 three separate agreements with AT&amp;T, Intel and Motorola marked DRI&#8217;s entry into the UNIX market. </p><p>The Motorola project was really more about porting Concurrent DOS to their VME/10 development system. It did include source-code portability with UNIX. The more interesting agreement was with Intel and AT&amp;T to port UNIX System V to Intel 80286.</p><p>It made sense. AT&amp;T was a technology giant and, after the breakup mandated by antitrust law, was finally allowed to sell computers. The company decided to make use of its popular UNIX operating system and saw DRI as a potential ally against IBM and Microsoft. The offer was hard to refuse - having AT&amp;T in their corner for the &#8220;round three&#8221; sounded more promising than going alone with MP/M-286.</p><p>DRI and AT&amp;T committed to developing something called the &#8220;UNIX System V Applications Library&#8221;. It was hard to pinpoint what exactly that &#8220;library&#8221; would contain: it seems the agreement was open-ended in that regard. Allen Beebe, at the time the director of the Systems Software Division, mentioned that DRI&#8217;s programming languages and tools would be ported to UNIX System V. The May issue of &#8220;Digital News&#8221; had an announcement about DRI and AT&amp;T jointly evaluating third party applications for inclusion in the library.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nK2q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nK2q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nK2q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nK2q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nK2q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nK2q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg" width="451" height="399" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:399,&quot;width&quot;:451,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:46799,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!nK2q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg 424w, https://substackcdn.com/image/fetch/$s_!nK2q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg 848w, https://substackcdn.com/image/fetch/$s_!nK2q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!nK2q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82b2e94d-c4ab-442f-bc69-195ed1e8cdc6_451x399.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>By fall, all the hoopla about DRI and AT&amp;T working together on UNIX suddenly stopped, and in November Kildall even admitted in an interview that he did not like UNIX, although he did like the C programming language and its runtime.</p><p>December issue of <em>Digital Dialog</em> included the photo of the &#8220;UNIX V Team&#8221; which was &#8220;nearing completion&#8221; of porting UNIX System V to the Intel 80286. Intel sent &#8220;formal congratulations&#8221;. Not a word about AT&amp;T. One person in the photo was DRI&#8217;s program manager for the project, Chuck Hickey. In the end, DRI never released the port, but a few months later Hickey founded Microport Systems, and released Unix System V/AT<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-15" href="#footnote-15" target="_self">15</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!U-ot!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!U-ot!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg 424w, https://substackcdn.com/image/fetch/$s_!U-ot!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg 848w, https://substackcdn.com/image/fetch/$s_!U-ot!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!U-ot!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!U-ot!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg" width="1345" height="1105" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1105,&quot;width&quot;:1345,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:360118,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!U-ot!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg 424w, https://substackcdn.com/image/fetch/$s_!U-ot!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg 848w, https://substackcdn.com/image/fetch/$s_!U-ot!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!U-ot!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F29457732-3da0-4aa9-af58-9834b8d1f67a_1345x1105.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>AT&amp;T UNIX PC was introduced on March 26th 1985<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-16" href="#footnote-16" target="_self">16</a>. It was based on the Motorola 68010 CPU. Available software included products from Microsoft (Word, Multiplan), Ashton-Tate and Language Processors. There was no mention of DRI or the &#8220;Applications Library&#8221;. The computer was a commercial failure - Unix personal computers would have to wait for the 21st century; Apple Power Mac G4 running Mac OS X arrived in 2001.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7v5h!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7v5h!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png 424w, https://substackcdn.com/image/fetch/$s_!7v5h!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png 848w, https://substackcdn.com/image/fetch/$s_!7v5h!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png 1272w, https://substackcdn.com/image/fetch/$s_!7v5h!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7v5h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png" width="970" height="1288" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1288,&quot;width&quot;:970,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1187006,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7v5h!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png 424w, https://substackcdn.com/image/fetch/$s_!7v5h!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png 848w, https://substackcdn.com/image/fetch/$s_!7v5h!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png 1272w, https://substackcdn.com/image/fetch/$s_!7v5h!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bc29394-1ff0-456c-88d1-051fc075eb45_970x1288.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Cover page of the May 1985 edition of Byte</figcaption></figure></div><p>One way to explain what happened with the UNIX saga is that at some point (perhaps after IBM announced its 286-based AT model in August 1984) AT&amp;T decided to abandon the idea of basing their UNIX PC on the 80286 and opted for Motorola 68000 instead. DRI was left behind.</p><p>That was the end of DRI&#8217;s big UNIX plans. Yet another expensive distraction.</p><p>At least MP/M-286 was still there. When Frank Holsworth was hired in 1980, he had half&#8209;jokingly offered to develop a <em>proper</em> operating system, as he did not have a great opinion of CP/M, given his UNIX background. Instead, he first worked on MP/M-86, a port of Rolander&#8217;s MP/M to the 8086 CPU. Later, as engineering manager in the Operating Systems Division, he led the design of the first generation of Concurrent CP/M systems, based on MP/M-86.</p><p>Finally, with the arrival of the Intel 80286, Holsworth could design an operating system the way he felt it should be done. It was a masterpiece<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-17" href="#footnote-17" target="_self">17</a> with modular design, dynamically loadable drivers instead of Kildall&#8217;s old BIOS, a brand-new hierarchical file system with support for file sharing and locking, built-in security mechanisms, support for internationalization, memory protection. It was written from ground-up in C with intent to be easily ported to other modern CPUs - specifically Motorola 68000. By the time it was ready for release, MP/M and CP/M brands were out of fashion, and it was confusingly named Concurrent DOS-286.</p><p>One feature meant to differentiate Concurrent DOS-286 from UNIX was its built-in compatibility layer with the &#8220;industry standard&#8221;; applications written for the IBM PC, both &#8220;well-behaved&#8221; and &#8220;poorly behaved&#8221;, including Lotus 1-2-3 were supposed to run within Concurrent DOS-286 virtual consoles. </p><p>The 80286 could operate in a compatibility mode (&#8220;real mode&#8221;) where it behaved just like 8086. Its native mode (&#8220;protected mode&#8221;) offered all the interesting new features, such as much larger address space, memory protection and support for multi-tasking. The problem was that the 80286 would start in real mode and could switch to protected mode, but once switched, it could not return without a reset<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-18" href="#footnote-18" target="_self">18</a>. Concurrent DOS-286 was designed to run in protected mode and emulate 8086 from there rather than relying on real mode.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gmuh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gmuh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png 424w, https://substackcdn.com/image/fetch/$s_!gmuh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png 848w, https://substackcdn.com/image/fetch/$s_!gmuh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png 1272w, https://substackcdn.com/image/fetch/$s_!gmuh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gmuh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png" width="1369" height="1114" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1114,&quot;width&quot;:1369,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:228392,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gmuh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png 424w, https://substackcdn.com/image/fetch/$s_!gmuh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png 848w, https://substackcdn.com/image/fetch/$s_!gmuh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png 1272w, https://substackcdn.com/image/fetch/$s_!gmuh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd975a36f-f73b-4a85-b076-3a5ae854aff1_1369x1114.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Concurrent DOS-286 was already shipping to select customers, when a change in the Intel 80286 hardware broke the emulation and forced a postponement. Before Intel provided an acceptable fix, DRI decided to retarget Concurrent DOS-286 from a general-purpose DOS-compatible OS to a real-time system for manufacturing. It was renamed to FlexOS in October 1986, and a new Flexible Automation business unit was formed from the remnants of the Operating Systems department in the Monterey office to continue its development. FlexOS was successful in its niche but was never going to replace MS&#8209;DOS. </p><p>As for the &#8220;bad guys&#8221;, they were not idle either, but saw even less success with multitasking than DRI. IBM refused to endorse Microsoft&#8217;s Xenix and instead started selling <a href="https://computeradsfromthepast.substack.com/p/unix-review-interviews-ted-dolotta">Interactive Systems' PC/IX</a>. It also released a somewhat multitasking &#8220;operating environment&#8221; called <a href="https://www.dvorak.org/blog/whatever-happened-to-ibms-topview/">TopView</a> which was deemed both memory-hungry and hard to use and was eventually abandoned. Microsoft produced a multitasking <a href="https://www.infoq.com/news/2024/04/msdos-4-open-source/">MS-DOS 4.0</a>, which IBM also rejected. Eventually, the two companies buried the hatchet and jointly began developing a <a href="http://www.os2voice.org/vnl/past_issues/vnl1001h/vnewsf4.htm">next-generation operating system</a>. That took a while&#8230;</p><p>In the end, there was no &#8220;round three&#8221;. Frustratingly, PCs continued running MS-DOS, with the 80826 used simply as a faster 8088/8086.</p><h2>Fall of Languages</h2><p>In May 1983, DRI announced ports of its development tools to PC-DOS. According to Carmen Governale, the Product Marketing Manager of the Languages SBC (<em>PCMag</em> July 1983), &#8220;The fact that CP/M-86 had not done as well as DRI had hoped has nothing to do with our decision to create more portability with our languages&#8221;. Ports to UNIX were also announced.</p><p>It made sense for the Languages SBC to want its products on as many platforms as possible. Unfortunately, by that time the competition started to overwhelm DRI&#8217;s development tools.</p><p>Some never got any real traction to begin with. The PL/I compiler, originally coded by Kildall himself, was praised for its quality but the language itself was (and still is) used almost exclusively on IBM mainframes.</p><p>DR Logo was another example. I remember Logo being mentioned as a good language for learning programming in the mid-1980s, but the schools used BASIC first and later Pascal much more than Logo.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MOlm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MOlm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MOlm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MOlm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MOlm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MOlm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg" width="663" height="967" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:967,&quot;width&quot;:663,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165248,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!MOlm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg 424w, https://substackcdn.com/image/fetch/$s_!MOlm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg 848w, https://substackcdn.com/image/fetch/$s_!MOlm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!MOlm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bb1a099-6e66-4fa1-84dc-a5060d41a2d9_663x967.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">DR Logo ad from 1984</figcaption></figure></div><p>Pascal/MT+ at first competed with similarly priced Microsoft Pascal and while I couldn&#8217;t find any actual numbers about its market share, seemed to be doing fine. Then Borland appeared out of nowhere: Turbo Pascal, designed by Anders Hejlsberg was released on 20 November 1983. Compared to Pascal/MT+ the compiler itself was nothing to write home about in terms of language features and optimization capabilities. But, at $49.95 it was more than ten times cheaper and contained an excellent IDE. It became an instant hit, and Pascal/MT+ was soon struggling. The last release I am aware of was 3.3; it came out in early 1985 with price reduced from $600 to $400. Too little, too late. If it was any consolation, Microsoft Pascal held on a bit longer but was eventually destroyed by Borland as well.</p><p>The most successful DRI language was Eubanks&#8217; CBASIC. In the late 1970s and early 1980s, CBASIC was a popular tool for developing business software for microcomputers and was successfully competing with other BASIC compilers such as Microsoft&#8217;s BASCOM. But then unexpected competition appeared: Ashton-Tate&#8217;s dBASE II was one of the products IBM chose to be ported to the IBM PC in time of its release. As the platform picked up in popularity, dBASE started replacing BASIC dialects as the development platform for business applications. Ads for CBASIC became less frequent after late 1983, and by 1985 it had mostly disappeared. Interestingly, it was offered as an option for FlexOS 286, released in January 1987, which is the latest mention of CBASIC I could find.</p><p>The February 1985 issue of <em>Digital Dialog</em> includes a photo of the Languages Department, then led by John Yu. The team was much larger than the one listed in August 1982. Names that appear in both lists include Rick Rosenbaum, Nancy Zetner and Rich Bielsker.  </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Aw_Y!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg" width="1014" height="1210" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1210,&quot;width&quot;:1014,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:347085,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Aw_Y!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cd6a29-c8a7-43a4-a64d-b25034a678f9_1014x1210.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The plan for 1985 was to complete 40 software development products. It is safe to assume this did not happen. The Languages Department was probably dismantled before the end of the year.</p><p>The &#8220;reorganization&#8221; of the Oct 1986 doesn&#8217;t even mention languages.</p><h2>People of Stature</h2><p>In the March 1985 edition of <em>Byte Magazine</em>, Jerry Pournelle casually remarked that &#8220;Many people of stature seem to have left or are leaving Digital Research&#8221;. By 1985 many of the DRI brightest minds were indeed on the way out, but the process had begun much earlier.</p><p>When Tom Rolander accepted Gary Kildall&#8217;s invitation in 1979 to join DRI, it was a very different place: Rolander worked hard and had a lot of fun at the same time. He and Kildall were both pilots and would often discuss software while flying together. Kildall later described him as his &#8220;copilot in flying and in life&#8221;. Rolander met his wife Lori at the office: &#8220;I don&#8217;t know where else I would&#8217;ve met a woman.&#8221; he said, laughing. When they married, Gary Kildall was the best man. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P-Wq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P-Wq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg 424w, https://substackcdn.com/image/fetch/$s_!P-Wq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg 848w, https://substackcdn.com/image/fetch/$s_!P-Wq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!P-Wq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P-Wq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg" width="582" height="532" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:532,&quot;width&quot;:582,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:84184,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P-Wq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg 424w, https://substackcdn.com/image/fetch/$s_!P-Wq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg 848w, https://substackcdn.com/image/fetch/$s_!P-Wq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!P-Wq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4acbdb3-6315-44b1-996a-4a35035df048_582x532.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Tom Rolander, 1984</figcaption></figure></div><p>Rolander accepted a position of VP of engineering, and enjoyed it while DRI was small. After the VC came in, the organization grew rapidly, and by 1983 he was Director of Operating Systems Division, managing 150 people and having no time for the engineering work he loved so much. One day, he had enough; instead of going to the office, he relaxed drinking beer on a beach. The following day he presented his resignation to Kildall and Rowley. They managed to convince him to stay for a while in R&amp;D - a much smaller group within DRI. In 1984, he and Kildall founded Activenture Corporation, and they both left DRI in June 1985.</p><p>Alan Cooper was a co-founder of Structured Systems Group, one of the first companies to develop business applications for microcomputers. In 1980, he left it to start another business that quickly folded, and in 1981 accepted Gary Kildall&#8217;s invitation to start an R&amp;D department at DRI. He spent less than two years with the company and came up with a few proposals for new products that were never approved; apparently his relationship with John Rowly was not good. The June 1983 edition of Digital Dialog mentioned that he was transferred from R&amp;D to the Graphics SBC as the &#8220;planner and strategist&#8221;. Soon after, he left.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yH5R!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yH5R!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yH5R!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yH5R!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yH5R!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yH5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg" width="616" height="513" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:513,&quot;width&quot;:616,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36237,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yH5R!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg 424w, https://substackcdn.com/image/fetch/$s_!yH5R!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg 848w, https://substackcdn.com/image/fetch/$s_!yH5R!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!yH5R!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4116bd62-6850-4521-80e4-edad04af34e4_616x513.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Alan Cooper, 1983</figcaption></figure></div><p>One of Cooper&#8217;s unused ideas was a visual programming language which he named Ruby (unrelated to the popular web scripting language). He sold it to Microsoft in 1988. Microsoft adapted it and changed the name to Visual Basic; it became the most popular tool for developing business applications in the 1990s.</p><p>Gordon Eubanks had been Kildall&#8217;s student at the Naval Postgraduate School and created a BASIC compiler for CP/M as part of his master&#8217;s thesis. Kildall described him in his memoirs as: &#8220;a prime mover and often, but not always, my friend&#8221;. Eubanks had a great respect for Kildall as a programmer and liked him as a person but would often criticize his attitude towards business.</p><p>At DRI, Eubanks served as VP of the Language Division until promotion to head of Commercial Systems Division. In August 1983, he had enough: &#8220;It became clear to me that Digital Research did not have the will to win and they were losing opportunities. So I went off and did my own thing.&#8221;.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7TmS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7TmS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7TmS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7TmS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7TmS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7TmS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg" width="418" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:306,&quot;width&quot;:418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55138,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7TmS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7TmS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7TmS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7TmS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd295b292-43a7-48c7-a232-4eb44bc1ff55_418x306.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Gordon Eubanks, 1982</figcaption></figure></div><p>Eubanks had a very successful career after DRI. Among other things, he was a CEO of Symantec.</p><p>Mike Lehman founded MT Microsystems with his wife Nancy in 1979 in Solana Beach, California. He developed a Pascal compiler Pascal/MT+ which was considered superior to other offerings, including the popular UCSD Pascal. The Lehmans and their assistant Pattie McCracken<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-19" href="#footnote-19" target="_self">19</a> became DRI employees 61, 62 and 63 in November 1981. Most of his time with DRI, Lehman spent at R&amp;D, developing a C compiler, DR C.</p><p>Lehman left DRI probably in 1984, but definitely before March 1985 when he is mentioned in the Pournelle&#8217;s Byte Magazine article as the author of <a href="https://www.macintoshrepository.org/26043-fastfinder">FastFinder</a> for Macintosh. He must have coded it in Pascal.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!16RK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!16RK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg 424w, https://substackcdn.com/image/fetch/$s_!16RK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg 848w, https://substackcdn.com/image/fetch/$s_!16RK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!16RK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!16RK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg" width="684" height="688" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:688,&quot;width&quot;:684,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:139810,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!16RK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg 424w, https://substackcdn.com/image/fetch/$s_!16RK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg 848w, https://substackcdn.com/image/fetch/$s_!16RK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!16RK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F454a6811-cee6-44ba-bdd9-742e84b957db_684x688.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Mike Lehman, 1983</figcaption></figure></div><p>In March 2005, Lehman posted a <a href="https://groups.google.com/g/comp.os.cpm/c/9nXKO2A5YKM">short text</a> after Dorothy McEwen had died in which he called DRI &#8220;his family&#8221;.</p><p>Fred Langhorst earned a PhD in Computer Aided Design at Purdue University in 1977. At DRI, he started the Graphics Division and led it through various reorganizations through the company&#8217;s growth.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8SeQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8SeQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8SeQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8SeQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8SeQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8SeQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg" width="418" height="307" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:307,&quot;width&quot;:418,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50846,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8SeQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8SeQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8SeQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8SeQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90f2c711-41e6-4a0e-9cbd-bf64c3a4cecb_418x307.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Fred Langhorst, 1983</figcaption></figure></div><p>He left in late 1984 and joined (as the VP of Engineering) Lifetree Software which <a href="https://www.orlandosentinel.com/1985/11/16/gem-write-gives-ibm-owners-apple-styled-word-processing/">released GEM Write</a> in 1985. Later he worked as a GM at various companies including Mentor Graphics and Intel.</p><p>Lee Jay Lorenzen started at Xerox (not PARC, but the Office Products Division in Dallas Texas) where he produced a prototype desktop graphical environment that ran on 8086 platform, called &#8220;Lone Star&#8221;. He was recruited to DRI in early 1983, by his former skip-level manager from Xerox, Jackie Pakarinen<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-20" href="#footnote-20" target="_self">20</a> and led the development of GEM, from first prototype to release.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ydKy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ydKy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ydKy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ydKy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ydKy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ydKy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg" width="1342" height="895" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:895,&quot;width&quot;:1342,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:330719,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ydKy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ydKy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ydKy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ydKy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d876edc-0e0e-4c6e-844f-a3d601596b07_1342x895.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In September 1985, Lorenzen and his boss Don Heiskell resigned from DRI to start Ventura Publishing where they developed one of the most successful early desktop publishing applications: GEM-based <a href="https://www.dosdays.co.uk/topics/Software/ventura.php">Ventura Publisher</a>.</p><p>Kathryn Strutynski worked with Gary Kildal at Naval Postgraduate School (NPS) in Monterey. He recruited her to DRI in early 1979 as employee number four. Strutynski helped Kildall release CP/M 2.2, then led the CP/M-86 development and later became a project manager overseeing Concurrent CP/M, CP/M Plus, and CP/M&#8209;DOS.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!soJb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!soJb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg 424w, https://substackcdn.com/image/fetch/$s_!soJb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg 848w, https://substackcdn.com/image/fetch/$s_!soJb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!soJb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!soJb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg" width="220" height="361" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:361,&quot;width&quot;:220,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:42698,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!soJb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg 424w, https://substackcdn.com/image/fetch/$s_!soJb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg 848w, https://substackcdn.com/image/fetch/$s_!soJb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!soJb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7836f658-6cd4-4f80-ab0f-531dd417bd0e_220x361.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Kathy Strutynski, 1983</figcaption></figure></div><p>In mid-1985, with mass layoffs hitting DRI, Strutynski returned to NPS. &#8220;Gary came to the Navy School and started to cry.&#8221;, she said two decades later<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-21" href="#footnote-21" target="_self">21</a>. </p><h2>At the Bottom</h2><p>In early 1984, DRI was financially at its peak, but the downturn was coming quickly. The company depended heavily on CP/M sales to OEMs, and that market was disappearing. As early as April of 1984, <em>InfoWorld</em> mentioned Digital Research&#8217;s upcoming &#8220;resurgence&#8221; as new products were being announced. In the same month, DRI received some $20M in investments - mostly from AT&amp;T.</p><p>The first layoffs I can pinpoint occurred in early August 1984 during one of the many reorganizations Rowley seemed to be so fond of. The number of impacted employees was probably not large, as it was referred to &#8220;some cutbacks&#8221;, but morale suffered. The October issue of &#8220;Digital Dialog&#8221; included some tough questions from employees to the President. Rowley admitted the growth was slowing but remained characteristically upbeat about the future.</p><p>In December, he sounded openly pessimistic about the outlook for 1985: &#8220;The retail market is experiencing compression of revenues and a general slowdown in the sales of personal computers and related software&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-22" href="#footnote-22" target="_self">22</a>, he said. The consumer market looked especially worrisome, but Rowley hoped GEM would be a commercial success.</p><p>By mid-1985, the situation had deteriorated<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-23" href="#footnote-23" target="_self">23</a>. After another round of layoffs, headcount fell below 300, but even that was not enough as revenues were expected to fall by at least one third from the previous year. Gary Kildall officially resigned as CEO on June 28, though he remained chairman of the board.</p><p>As bad as 1985 was, 1986 was worse. By the end of that year, annual revenue had fallen to $20M. In October, Rowley carried out yet another desperate reorganization; this time 30% of remaining employees were sacked. Only 140 remained in America and another 100 overseas.</p><p>Digital Research was on its last legs. It was $14M in debt and had $10M in cash reserves. Lenders were expected to call the debt at any moment. In November, the board finally fired John Rowley and asked Gary Kildall to find a buyer for the company. Kildall called Bill Gates. When they met in San Francisco, he asked $26M for DRI. Gates replied that the company was not worth more than $10M.</p><p>Kildall refused and bade Gates farewell amicably.</p><h2>Another Call from IBM</h2><p>In 1986, Dick Williams<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-24" href="#footnote-24" target="_self">24</a> was a 23-year IBM veteran and Vice President of the General Products Division, <a href="https://midcenturymodernist.com/2009/culture/ephemera/ibm-general-products-division-1961/">headquartered in San Jose, CA</a>. He was growing unhappy with how things were ran at IBM, and in November, while visiting the White Plains, NY office, he told his boss he would be leaving at the end of the year. That evening, while waiting to board a flight at JFK airport, he skimmed <em>Electronic News</em> magazine, and saw on the front page that Gary Kildall had fired John Rowley and was looking for a new CEO. </p><p>Williams did not know Kildall, but managed to locate and call him from a pay phone at the airport and offered to help. Kildall did not know him either but was desperate enough to agree to meet this random man who claimed to be an IBM vice president. Long story short, on January 8, 1987, Dick Williams started his new job as the CEO and President of Digital Research Inc, an experience he later described as the hardest five years of his life.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IZgX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IZgX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png 424w, https://substackcdn.com/image/fetch/$s_!IZgX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png 848w, https://substackcdn.com/image/fetch/$s_!IZgX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png 1272w, https://substackcdn.com/image/fetch/$s_!IZgX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IZgX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png" width="880" height="834" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:834,&quot;width&quot;:880,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:361931,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/196574463?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IZgX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png 424w, https://substackcdn.com/image/fetch/$s_!IZgX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png 848w, https://substackcdn.com/image/fetch/$s_!IZgX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png 1272w, https://substackcdn.com/image/fetch/$s_!IZgX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1300f19d-3180-42ce-add8-87dd204a1ddc_880x834.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Dick Williams, 1988</figcaption></figure></div><p>With the computer market downturn of 1985/86 finally over, and under the steady hand of the new CEO, DRI managed to reach calmer waters. In April 1988, Marketing Vice President Frank Iveson told <em>Computer Business Review</em> that DRI was not only profitable again but was also paying back the loans taken during the bad years. Annual revenue for fiscal 1987 was reportedly up to $35M. </p><p>FlexOS was being licensed to companies like IBM and Siemens and its development continued in Monterey. Concurrent DOS was developed in England, along with DR DOS which started to make Bill Gates increasingly nervous and forced Microsoft to re-invest in the mostly neglected MS-DOS.</p><p>But DRI never returned to its old days of glory. Even if (barely) profitable, its influence on the industry was gone forever. The company was largely forgotten by the press, and it gets increasingly difficult to find articles about it after 1985.</p><p>After Microsoft Windows finally started being widely adopted in 1990, Williams concluded DRI could not survive long on its own and started looking for a partner to acquire the company. After a year of searching, he finally found one: Novell.</p><h2>Acquisition and Closure</h2><p>On July 16, 1991, the definitive agreement to merge DRI into Novell was signed, and the announcement followed the next day. According to <em>Business Wire</em> on July 17: &#8220;Digital Research, with 273 employees, had revenue of $40.9 million in its fiscal year ended Sept. 30, 1990, up from $36.2 million in fiscal 1989&#8221;. </p><p>In November 1991, after the acquisition was completed, Novell was restructured into three &#8220;Systems Groups&#8221; and Digital Research became one of them.</p><p>Concurrent DOS, renamed to Multiuser DOS a couple of years prior, was sold off in 1992.</p><p>The latest mention of the Monterey offices I could find is a <em>Computer Business Review</em> article from March 8, 1993: &#8220;NOVELL FORMS A DEDICATED SYSTEMS BUSINESS UNIT&#8221; which notes that the new Dedicated Systems Business Unit was formed in the old DRI headquarters.</p><p>In July 1994, Novell sold FlexOS to <a href="https://web.archive.org/web/19980219173150/http://www.isi.com/Products/pSOS/Networking/pNDE.html">Integrated Systems</a> and relocated the remaining engineers to Novell&#8217;s headquarters at Provo, Utah<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-25" href="#footnote-25" target="_self">25</a>. It was roughly ten years after DRI moved into the Garden Court offices, so one can speculate that the lease expired around that time and Novell closed the site.</p><p>The EDC at Hungerford, England<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-26" href="#footnote-26" target="_self">26</a> seems to have remained active into 1995.</p><p>A short <em>Computer Business Review</em> article from August 16, 1994, titled &#8220;NOVELL TO FADE OUT THEIR DOS 7 TO AVOID MICROSOFT<strong>&#8221;</strong> reported that new Novell CEO Robert Frankenberg had decided to abandon DR DOS: &#8220;a big round of lay-offs is in the wind, with some observers saying numbers could go as high as 2,000;&#8221;.</p><p>Gary Kildall did not live to read that article. He died of a cerebral hemorrhage on July 11, 1994, in Monterey.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>I made some attempts to contact former DRI employees, though without success. The story is therefore based on existing sources and not new interviews.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>As a native speaker of a Slavic language, I can&#8217;t get articles right to save my life, even after living in America for more than a quarter of a century. Latin did not have them, why so many modern languages do?</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>And even from people who were not there. Gates described it a couple of years later as &#8220;Gary went flying when IBM came&#8221; which led to even more fantastic stories. Peter Norton&#8217;s version claims Gary Kildall circled in his plane above the heads of the IBM delegation. Kildall&#8217;s co-host of the popular TV show &#8220;The Computer Chronicles&#8221; Stewart Cheifet said that Kildall blew off the IBM delegation because it was his wife&#8217;s birthday on the day they wanted to meet; <a href="https://www.legacy.com/us/obituaries/montereyherald/name/dorothy-mcewen-obituary?id=26905817">Dorothy McEwen was born on March 3rd 1943</a>, and the IBM meeting took place in late August.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>According to Evans, Kildall wrote in the unpublished portion of his memoir that Tom Rolander demonstrated MP/M&#8209;86 to the IBM team at the first meeting. This seems unlikely; at that time MP/M&#8209;86 was still in a very early stage of development. If anything was demonstrated that day, it was more likely the 8&#8209;bit MP/M system.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p><a href="https://computeradsfromthepast.substack.com/p/byte-interviews-ibms-philip-d-estridge">Byte Magazine, NovembByte Interviews IBM's Philip D. Estridge (1983)</a>: </p><p><em><strong>Why were CP/M-86 and UCSD Pascal so much more expensive than PC-DOS?</strong></em></p><p><em>You&#8217;d have to talk to Softech Microsystems, which did the research.</em></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>Jacqueline Morby often nicknamed &#8220;The Queen of Software&#8221; <a href="https://vineyardgazette.com/obituaries/2026/05/28/jacqueline-morby-88">died on May 12, 2026</a>, while this article was being written.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>A <em>PC Mag</em> article <a href="https://www.pcmag.com/news/pc-pioneers-the-forgotten-world-of-s-100-bus-computers">PC Pioneers: The Forgotten World of S-100 Bus Computers</a> offers a glimpse into that world. The complete list is much longer - here is a <a href="https://en.wikipedia.org/wiki/List_of_computers_running_CP/M">Wikipedia collection of the computers running CP/M</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>Unlike Tom Rolander, I don&#8217;t find the name that fortunate. It was eventually changed to Multiuser DOS in the early 1990s.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-9" href="#footnote-anchor-9" class="footnote-number" contenteditable="false" target="_self">9</a><div class="footnote-content"><p>GSS-KERNEL was also mentioned in some contexts, but it seems it was the same thing as GSS-CORE.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-10" href="#footnote-anchor-10" class="footnote-number" contenteditable="false" target="_self">10</a><div class="footnote-content"><p>For a detailed account of GEM&#8217;s origins, see my <a href="https://nemanjatrifunovic.substack.com/p/history-of-the-gem-desktop-environment">History of the GEM Desktop Environmen</a>t, published on Sep 13, 2025. For the post&#8209;DRI history of GEM, see Liam Proven&#8217;s: <a href="https://liam-on-linux.dreamwidth.org/96552.html">The more recent history of DR GEM</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-11" href="#footnote-anchor-11" class="footnote-number" contenteditable="false" target="_self">11</a><div class="footnote-content"><p>More accurately, according to <a href="http://retrotechnology.com/dri/dri_wein.html">Herbert R. Johnson's web page dedicated to Wein</a>. It should be taken with a grain of salt as Wein himself warns &#8220;memory is somewhat hazy about the exact timing and details of the DOS Plus project&#8221;. Some inconsistencies are obvious; for example, he recalls working under Howard Kornstein after joining DRI in 1984, while Kornstein&#8217;s LinkedIn page indicates he joined the company in 1991.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-12" href="#footnote-anchor-12" class="footnote-number" contenteditable="false" target="_self">12</a><div class="footnote-content"><p>In an interview in the February 1987 issue of <em>MicroTimes</em>, Doug Michaels, VP of R&amp;D at SCO, said that &#8220;DRI was much more successful with Concurrent CP/M in Europe by an order of magnitude. In terms of the small multi-user system, Concurrent CP/M is the major competitor in Europe&#8221;.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-13" href="#footnote-anchor-13" class="footnote-number" contenteditable="false" target="_self">13</a><div class="footnote-content"><p>Previously, Nishi had been one of Bill Gates&#8217; closest friends and business partners. He <a href="https://nemanjatrifunovic.substack.com/p/kay-nishi-and-the-meeting-that-started">convinced him to start MS-DOS</a> in 1980. Microsoft ended the partnership with Nishi in 1986 as he was spending obscene amounts of money on advertising projects, such as building a $1M dinosaur robot in Tokyo.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-14" href="#footnote-anchor-14" class="footnote-number" contenteditable="false" target="_self">14</a><div class="footnote-content"><p>The data was shown in the <em>InfoWorld</em> article &#8220;Company Strategies Boomerang,&#8221; published on April 2, 1984.<span> </span></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-15" href="#footnote-anchor-15" class="footnote-number" contenteditable="false" target="_self">15</a><div class="footnote-content"><p>In the April 1987 issue of <em>Your Computer</em>, Microport Systems was described as a &#8220;subsidiary of Digital Research&#8221; at the time of porting UNIX System V to Intel 80286. What probably happened is that DRI decided to cancel the project and allow Hickey to take it over on his own. Similar arrangements were made with other DRI employees who wanted to pursue projects that DRI was not interested in.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-16" href="#footnote-anchor-16" class="footnote-number" contenteditable="false" target="_self">16</a><div class="footnote-content"><p><em>InfoWorld</em>, April 8 1985: &#8220;At Last, AT&amp;T&#8217;s 7300/Unix PC&#8221;.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-17" href="#footnote-anchor-17" class="footnote-number" contenteditable="false" target="_self">17</a><div class="footnote-content"><p>A nice description with more details can be found in the 05/1985 <em>Byte Magazine</em> article aptly named: &#8220;Concurrent DOS-286 Challenges UNIX&#8221;.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-18" href="#footnote-anchor-18" class="footnote-number" contenteditable="false" target="_self">18</a><div class="footnote-content"><p>Bill Gates called 80286 &#8220;brain dead&#8221; for that reason.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-19" href="#footnote-anchor-19" class="footnote-number" contenteditable="false" target="_self">19</a><div class="footnote-content"><p>McCracken stayed with DRI until the Novell acquisition in 1991. In 1999, she helped organize a reunion of former DRI employees. A short interview with her can be found at <a href="https://www.computerhistory.org/collections/catalog/search-catalog/search/people:mccracken-patie-person/">Computer History Museum&#8217;s web site</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-20" href="#footnote-anchor-20" class="footnote-number" contenteditable="false" target="_self">20</a><div class="footnote-content"><p>Jackie Pakarinen joined DRI in 1982 and was a Director of Engineering for the Operating Systems SBC. <a href="https://www.tributearchive.com/obituaries/23147987/jacquelyn-%22jackie%22-pakarinen">She passed away in November 2021</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-21" href="#footnote-anchor-21" class="footnote-number" contenteditable="false" target="_self">21</a><div class="footnote-content"><p>A few short videos featuring Kathy Strutynski can be found at <a href="https://www.computerhistory.org/collections/catalog/search-catalog/search/people:strutynski-kathryn-person/">Computer History Museum</a>,</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-22" href="#footnote-anchor-22" class="footnote-number" contenteditable="false" target="_self">22</a><div class="footnote-content"><p>In fairness, it was not just DRI. The entire industry <a href="https://cafe.com/article/a-large-scale-hangover-from-a-speculative-orgy-the-pain-of-the-mid-1980s-computer-slump/">suffered through 1985/86</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-23" href="#footnote-anchor-23" class="footnote-number" contenteditable="false" target="_self">23</a><div class="footnote-content"><p>Numbers mentioned here come from <strong><a href="https://books.google.com/books?id=2Huij24Zmr0C&amp;pg=PA72#v=onepage&amp;q&amp;f=false">Computerworld </a></strong><a href="https://books.google.com/books?id=2Huij24Zmr0C&amp;pg=PA72#v=onepage&amp;q&amp;f=false"><span>Jul 29, 1985</span></a><span>.</span></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-24" href="#footnote-anchor-24" class="footnote-number" contenteditable="false" target="_self">24</a><div class="footnote-content"><p>The primary source for Dick Williams&#8217; experience at DRI is a video at <a href="https://www.computerhistory.org/collections/catalog/102770488/search/people:williams-dick-person/">Computer History Museum</a>. Williams misremembered a few dates, including his start date with DRI and the year that Microsoft released Windows 3.0.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-25" href="#footnote-anchor-25" class="footnote-number" contenteditable="false" target="_self">25</a><div class="footnote-content"><p>According to a Sep 1995 <a href="https://groups.google.com/g/comp.os.cpm/c/D7pf4-mE7Lw/m/3QX_nmxbM6QJ">usenet post from Curt Geske</a>: &#8220;<span>FlexOS, a commercial RTOS that was the basis for the IBM point sale systems, was retained in Monterey, California until August 1994 when it was sold to ISI. The remaining software engineers were relocated to Provo Utah where arethe core of the Novell Embedded Systems Technology (NEST) group.&#8221;</span> </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-26" href="#footnote-anchor-26" class="footnote-number" contenteditable="false" target="_self">26</a><div class="footnote-content"><p>Howard Kornstein&#8217;s LinkedIn page shows September 1995 as his retirement date. <a href="https://jwde.jp/resume.htm">Joe Wein&#8217;s resume</a> also indicates 1995 as the year he left. According to Wein, some of the former DRI engineers went to work for Caldera after Novell closed the EDC. Caldera UK continued development of DR DOS until February 1999 when it was closed.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Inside MP/M's Process Dispatcher]]></title><description><![CDATA[A look at internal design and source code of the most popular 8-bit multitasking OS]]></description><link>https://nemanjatrifunovic.substack.com/p/inside-mpms-process-dispatcher</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/inside-mpms-process-dispatcher</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sun, 31 May 2026 19:34:56 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c3aef7df-e09e-4b7d-92b8-7316eec71b04_1131x448.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>MP/M, or &#8220;Multi-Programming Monitor Control Program&#8221; is usually described as a multi-tasking and multi-user version of CP/M. I never had the chance to use it myself, but having learned to program on a Z80&#8209;based microcomputer, I was astonished that something like MP/M could even exist on such limited hardware.</p><p>At some point I decided to get a better understanding of MP/M&#8217;s internals - specifically the part that enables multitasking. The source code I examined is for MPM II and can be downloaded from the <a href="http://www.cpm.z80.de/source.html">Digital Research Source Code</a> web page. To make sense of the design, I also relied on the MP/M and MP/M II manuals from <a href="http://www.cpm.z80.de/drilib.html">Tim Olmstead Memorial Digital Research CP/M Library</a>.</p><p>This post is a summary of my findings.</p><h2>Background and History</h2><p>Tom Rolander<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> completed his master&#8217;s degree at the University of Washington in 1976 and soon after was recruited by Intel. There he joined a team that designed and developed RMX/80, a real&#8209;time multitasking operating system for process&#8209;control systems. After leaving Intel and then spending some time consulting for National Semiconductors, Rolander accepted invitation from <a href="https://computerhistory.org/blog/in-his-own-words-gary-kildall/">Gary Kildall</a> to join his company <a href="https://www.digitalresearch.biz/">Digital Research Inc. (DRI)</a> in early 1979. Kildall himself had been consulting for Intel since 1972 and, among other things, created the programming language called <a href="https://www.retrotechnology.com/dri/dri_plm.html">PL/M</a>.</p><p>At that time, DRI&#8217;s only product was an operating system for Intel 8080 compatible computers called <a href="https://www.retrotechnology.com/dri/CPM_history_kildall.txt">CP/M</a>. CP/M was very simple and flexible, which along with its low price made it the most popular OS for the 8-bit business microcomputers. By 1979, Kildall believed it was time to add support for multitasking and multiple users. One motivation was background printing; another was the fact that computer manufacturers like <a href="https://classictech.wordpress.com/computer-companies/altos-computer-systems-san-jose-calif/">Altos</a> started producing multiuser microcomputers. Adding a CP/M compatible operating system that would support them was a logical next step.</p><p>Tom Rolander coded MP/M 1.0 alone, including the core OS, utilities and documentation - he described the experience as &#8220;just a huge amount of fun&#8221;. Soon after, version 1.1 came out, and then in 1981 version 2.0 and finally 2.1 in early 1982.</p><p>The operating system was ported to 16-bit Intel architecture by another talented engineer Frank Holsworth in 1980/81 and named MP/M-86. It was followed by a line of &#8220;Concurrent&#8221; CP/M products which retained the MP/M core design and added features like MS-DOS compatibility. The last incarnation on MP/M family of operating systems was <a href="https://archiveos.org/flexos/">FlexOS</a> which was designed for industrial and point-of-sale applications and outlived DRI by at least a decade.</p><h2>Features</h2><p>In the MP/M 1.0 User&#8217;s Guide, the system is described as &#8220;an upward compatible version of CP/M 2.0 with a number of added facilities&#8221;. The major additions include support for multiple users, each working on a separate terminal, and multiple tasks per user. For application programmers, MP/M introduced <a href="https://www.easytechjunkie.com/what-is-bank-switching.htm">memory bank-switching</a>, inter-process communication (including synchronization), and interrupts. </p><p>Another interesting feature not available in CP/M was resident system processes which remained in memory alongside the OS. MP/M shipped with several standard resident processes (such as the system status display), and users could write their own.</p><p>The system was described as providing &#8220;real-time&#8221; multitasking, which is misleading. MP/M is a cooperative multitasking system that switches tasks at system calls, interrupts, or clock&#8209;tick events. It does not provide deterministic timing guarantees which we would expect from modern real-time systems.</p><p>Unlike Intel&#8217;s RMX which inspired it, MP/M was not intended for process control applications that would require real-time capabilities. It was an alternative to <a href="https://www.cs.cornell.edu/wya/AcademicComputing/text/earlytimesharing.html">minicomputer time-sharing</a> systems for use from multiple &#8220;dumb&#8221; terminals in business environment. Many of these time-sharing systems were also described as &#8220;real-time&#8221; without providing any real time guarantees, so we can assume it was just a difference in terminology.</p><p>Real-time definitions aside, building a preemptive<em> </em>multitasking system for the Intel 8080 compatible 8-bit CPUs was a real feat. The hardware offered no privilege levels, no memory protection, no thread-specific stacks, no trap instruction, no atomic primitives and only a 64&#8209;kilobyte address space. Preemptive multitasking became a common feature on personal computers only in mid-1990s on Windows and in 2001 on Mac<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>.</p><p>As for CP/M compatibility, it was a goal that was only partially achieved. The user guide claims that only &#8220;correctly written&#8221; CP/M programs (i.e. the ones that use only officially documented system calls) would run under MP/M. In practice, programming 8-bit machines relied not only on using undocumented system routines, but even <a href="http://www.z80.info/z80undoc.htm">undocumented CPU instructions</a>.</p><h2>System Design</h2><p>Like CP/M, MP/M is a modular system. The hardware-dependent layer is isolated in a separate module, called XIOS (Extended I/O System) which was implemented by computer manufacturers (OEMs). It is equivalent to the CP/M BIOS but extended to support multiple consoles.</p><p>BDOS (Basic Disc Operating System) is included for compatibility with CP/M; it provides the same system calls. </p><p>XDOS (Extended Disk Operating System) implements MP/M specific system calls including ones for managing tasks, memory and consoles. It contains the nucleus: the kernel that manages process dispatching, queue management, flag management, memory management and system timing.</p><h2>Process Dispatcher</h2><p>The process dispatcher (implemented in NUCLEUS/DISPTCH.ASM) is the heart of the nucleus. It is priority-based, which means that it selects a process with highest priority that is in ready state to transfer the CPU to it. As mentioned, it is not time-driven, but event driven. The events that cause the dispatcher to run are: system calls (BDOS or XDOS), queue operations that cause a process to block, flag wait and set operations, and hardware interrupts.</p><p>The clock interrupt does not directly preempt tasks; instead, it wakes the Tick Process, which then performs delay&#8209;list maintenance and may cause a higher&#8209;priority process to become ready.</p><p>A system process called IDLE with very low priority runs when no other process is ready. </p><p>Each process is associated with a process descriptor structure that contains its priority, status, stack pointer, memory segment, console, BDOS state, and saved CPU registers. The table of descriptors (PDTBL) is defined in NUCLEUS/DATAPG.ASM.</p><p>A process may be running, ready, or in one of several wait states (queue wait, flag wait, delay, poll, attach/detach, etc.).</p><p>Processes that become ready are first placed on the Dispatcher Ready List (DRL). The dispatcher then inserts them into the Ready List (RLR), which is ordered by priority. Processes with equal priority are scheduled in round&#8209;robin fashion by reinserting the running process at the end of its priority group. </p><p>All that happens within the &#8220;dispatch&#8221; routine in NUCLEUS/DISPTCH.ASM:</p><ol><li><p>Interrupts get disabled and a global flag is set to mark the dispatcher is running</p></li><li><p>The current process state is saved into its process descriptor</p></li><li><p>The current process is handled in accordance with its status</p></li><li><p>Devices are polled</p></li><li><p>Processes are moved from DLR to RLR</p></li><li><p>The next active process is selected and its context restored from the PD</p></li><li><p>Interrupts are re-enabled </p></li></ol><p>The code was first written in PL/M, and the original source is (partially) preserved as comments, but the production MP/M II nucleus is written in Intel 8080 assembly. It is possible that MP/M 1.0 was written entirely in PL/M and ported to assembly for version 2.0.</p><h2>Conclusion</h2><p>This concludes my modest look inside the MP/M nucleus. Beyond the dispatcher, the system has other mechanisms worth exploring: queues, flags, resident processes, the delay list&#8230; </p><p>All packed into just a few kilobytes of assembly code. </p><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>To learn more about Tom Rolander&#8217;s life and career, see <a href="https://www.computerhistory.org/collections/catalog/102717254/">Rolander, Tom oral history</a> or <a href="https://www.tomrolander.com/">his personal web site</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>To be fair, there were relatively popular systems in mid-1980 that implemented pre-emptive multitasking, including Sinclair QL and Commodore Amiga. They used much more advanced hardware than MP/M. </p></div></div>]]></content:encoded></item><item><title><![CDATA[Kay Nishi and the Meeting that Started MS-DOS]]></title><description><![CDATA[On a late September Sunday night in 1980, three young men decided to launch MS-DOS]]></description><link>https://nemanjatrifunovic.substack.com/p/kay-nishi-and-the-meeting-that-started</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/kay-nishi-and-the-meeting-that-started</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Tue, 12 May 2026 07:02:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!15bn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>September 28, 1980, was a Sunday, and the Old National Bank Building in Bellevue, WA was mostly empty. Except for eighth floor, occupied by Microsoft - a privately owned software company with about 50 employees at that time. Microsoft&#8217;s employees generally worked long hours, and it was no wonder that on that evening the light was on in a corner office that belonged to Bill Gates. With him were Paul Allen and Kay Nishi<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!15bn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!15bn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg 424w, https://substackcdn.com/image/fetch/$s_!15bn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg 848w, https://substackcdn.com/image/fetch/$s_!15bn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!15bn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!15bn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg" width="612" height="392" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:392,&quot;width&quot;:612,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31697,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/178321493?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!15bn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg 424w, https://substackcdn.com/image/fetch/$s_!15bn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg 848w, https://substackcdn.com/image/fetch/$s_!15bn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!15bn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa094237b-dacf-4b1d-9b4d-d6c9ebe68517_612x392.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Kazuhiko &#8220;Kay&#8221; Nishi, Bill Gates and Paul Allen in 1978</figcaption></figure></div><p>Allen and Gates were childhood friends and co-founders of Microsoft. In 1975, after the first commercially successful microcomputer Altair 8800 was released, they wrote a BASIC interpreter for the new machine without even seeing it and then moved to Albuquerque to be close to MITS - the company that produced Altair.</p><p>By 1978, Microsoft was supplying BASIC for most early home computers. The relationship with MITS deteriorated and the founders decided to move the company to Seattle area. </p><p>Before the move, a young Japanese entrepreneur Kazuhiko &#8220;Key&#8221; Nishi, introduced himself to Bill Gates. The two quickly became friends and Nishi was appointed as Microsoft&#8217;s vice president for Far East, although he still kept running his own company - ASCII Corporation. In 1979 Nishi brought some major Japanese customers to Microsoft, starting with NEC which produced the popular <a href="https://voidstar.blog/nec-pc-8001/">NEC PC 8001</a> personal computer. Japanese market almost overnight became a major source of revenue for Microsoft.</p><blockquote><p>I can&#8217;t celebrate our 50th anniversary without mentioning Kay Nishi, whose partnership and friendship were critical to Microsoft&#8217;s expansion internationally&#8212;in Japan and beyond. Not only is he an amazing thinker (and one of the most under-appreciated leaders in the company&#8217;s history), he&#8217;s also more like me than anybody I&#8217;ve ever met.</p><p>Bill Gates</p></blockquote><p>After Microsoft relocated in early 1979, Nishi spent even more time with Gates and Allen. He helped recruit Steve Ballmer in June 1980. He was in the office when an IBM delegation first visited Microsoft on July 22nd, 1980, and demonstrated some of the Japanese computers that ran Microsoft BASIC.</p><p>During the early phase of IBM&#8217;s secret PC project (&#8220;Project Chess&#8221;), Nishi was involved in talks with IBM&#8217;s hardware engineers, trying to convince them to add more memory, a more powerful CPU and better graphics capabilities, with limited success.</p><p>Soon it became clear the biggest obstacle for the project was the lack of a suitable disk operating system. The obvious solution was Digital Research&#8217;s CP/M, but its port to the 16-bit Intel processors that IBM planned to use was late, and DR repeatedly refused to commit to IBM&#8217;s aggressive schedule. At last, IBM&#8217;s software lead for the project, Jack Sams, lost patience and asked Bill Gates to find an alternative. </p><p>On September 28th, Gates invited Allen and Nishi to his office to break the stalemate. </p><p>Microsoft at that point in time did not sell operating systems; in February 1980, it licensed UNIX source code from AT&amp;T, and in August announced it was working on a UNIX-based operating system called XENIX. It was not a solution for the IBM PC which was too limited to run a real UNIX. Microsoft definitely had expertise to develop a simple operating system for the IBM PC, but the schedule was tight, and Gates was a pessimist by nature; Microsoft had already committed to deliver not only the BASIC interpreter, but also all the compilers they were selling at the time - adding an operating system to the list must have sounded scary.</p><p>It was Kay Nishi who put things in perspective: the amount of code for all the software Microsoft had already agreed to port was some 400 KB of assembly source. Nishi&#8217;s estimate was that the operating system would add no more than 20 KB. Then he jumped and yelled &#8220;Got to do it! Got to do it!&#8221;.</p><p>As it happened, Microsoft did not even have to develop the OS from scratch. Paul Allen knew of an existing operating system for Intel 8086, developed by an employee of Seattle Computer Products, Tim Paterson. The operating system was officially named 86-DOS but was also known by its code name: QDOS, which stood for &#8220;quick and dirty operating system&#8221;. Allen offered to call the SCP&#8217;s owner Rod Brock in the morning and ask to license 86-DOS. Again, Gates was hesitant: betting the critical IBM project on something called &#8220;quick &amp; dirty&#8221;? In the end he agreed.</p><p>Microsoft finally had a plan for an operating system for IBM PC. On September 30th it was presented to IBM at a meeting in Boca Raton. On November 6th, the official contract was signed; Microsoft was the supplier for all system software for Project Chess.</p><p></p><p></p><p></p><p></p><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Sources for this post are the following books: </p><ul><li><p>Ray Duncan: <a href="https://www.pcjs.org/documents/books/mspl13/msdos/encyclopedia/">The MS-DOS Encyclopedia</a></p></li><li><p>Paul Allen: <a href="http://Paul Allen">Idea Man</a></p></li><li><p>Stephen Manes, Paul Andrews: <a href="https://www.goodreads.com/en/book/show/41643.Gates">Gates: How Microsoft&#8217;s Mogul Reinvented an Industry--and Made Himself the Richest Man in America</a></p></li></ul></div></div>]]></content:encoded></item><item><title><![CDATA[Why IBM Turned to Microsoft for BASIC]]></title><description><![CDATA[Not Because of Bill Gates&#8217; Mother]]></description><link>https://nemanjatrifunovic.substack.com/p/why-ibm-turned-to-microsoft-for-basic</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/why-ibm-turned-to-microsoft-for-basic</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 11 Apr 2026 19:36:42 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qwwd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There is a widespread opinion that Microsoft&#8217;s lucrative 1980 contract with IBM must have involved some kind of foul play. After all, it is hard to believe that the computing mammoth like IBM needed a tiny company such as Microsoft to provide system software for its planned entry-level computer. </p><p>As usual, to make an informed conclusion, some wider context is necessary&#8230;</p><h2>Microsoft&#8217;s Monopoly on BASIC Interpreters</h2><p>The critical thing to understand is that Microsoft was a monopoly even before IBM approached it. The market it dominated was small: BASIC interpreters for personal computers, but it was a monopoly, nevertheless. </p><p>Microsoft&#8217;s core product, the BASIC interpreter, ran on almost all popular personal computers at the time<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, including various TRS models, the Commodore PET, Atari machines, and the Apple II.</p><p>The only theoretical alternative was <a href="https://troypress.com/the-dialects-of-tiny-basic/">Tiny Basic</a> - a public domain interpreter developed in 1975 as a reaction to Microsoft BASIC which was considered too expensive. Tandy used Tiny Basic to develop the TRS-80&#8217;s Level I Basic, but even they switched to Microsoft&#8217;s Level II Basic soon after.</p><p>Some computer manufacturers opted to develop their own version of BASIC with varying success. The Apple II initially shipped with a BASIC written by Steve Wozniak (later named Integer BASIC as it supported only integer numbers), but it was replaced by Applesoft BASIC which was a derivative of Microsoft BASIC.</p><p>British home computer makers were more successful in creating their own versions of BASIC interpreters (Acorn&#8217;s excellent BBC BASIC is one such example) or outsourcing its development to local software companies rather than Microsoft (Sinclair contracted Nine Tiles; Amstrad used Locomotive Software). On another hand, Japanese manufacturers almost universally adopted Microsoft BASIC.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qwwd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qwwd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qwwd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qwwd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qwwd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qwwd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg" width="871" height="347" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:347,&quot;width&quot;:871,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62598,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/192509833?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qwwd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qwwd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qwwd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qwwd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F400c5a57-f879-448a-9e2c-f2b880f7d357_871x347.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">From IBM PC BASIC Reference</figcaption></figure></div><p>To cut a long story short: if a company wanted to enter a home computer market in late 1970s and early 1980s, it was expected to include a built-in BASIC interpreter. The realistic options were to either develop one specifically for the new machine or to license Microsoft&#8217;s. Most hardware producers chose latter, as it was less risky, faster and ultimately cheaper. IBM, however, was not only able to produce a BASIC for new hardware; it had already done so multiple times. Why did it end up going to Microsoft anyway?</p><h2>IBM and Small Computers</h2><p>In 1980, IBM was by far the largest computer company in the world, with $26.21 billion in gross income and more than 340,000 employees<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. Its most important products at the time were the mainframe class computers of the <a href="https://www.ibm.com/history/system-370">IBM System/370 family</a> which dominated the industry in the 1970s.</p><p>Yet, there were problems as well; the most pressing one was of legal nature: <a href="https://cs.stanford.edu/people/eroberts/cs181/projects/corporate-monopolies/government_ibm.html">the antitrust lawsuit</a> that was filed in 1969 and was not resolved until 1982 was hanging over the head of the mighty IBM and affected how it conducted business.</p><p>In addition, it became obvious IBM was slow to adopt to new trends in computing. The threat was coming from below: first from the <a href="https://www.computerhistory.org/brochures/minicomputers/">minicomputers</a> produced by companies such as Digital Equipment Corporation (DEC), Hewlett-Packard, Data General and Prime Computer Inc. Then, in 1975, the first commercially successful microcomputers appeared, developed mostly by small startups that operated very differently from IBM. In the beginning, they were used only by hobbyists. Then they spread into K-12 education and finally small businesses began noticing them after the first spreadsheet and text processing applications were released.</p><p>IBM did not ignore the &#8220;small&#8221; machines. It introduced a series of low-end business computers as early as 1969 with <a href="http://www.ibmsystem3.nl/hist.html">System/3</a>. More interesting was the <a href="https://www.computerhistory.org/collections/catalog/102636445/">IBM 5100 Portable Computer</a> first introduced in late 1975, based on the prototype called <a href="https://www.si.edu/object/nmah_334628">SCAMP</a> from 1973. It was heralded by the &#8220;Byte&#8221; magazine as the first personal computer from IBM, despite its high price. Although very innovative, these machines failed to make much impact: they were too expensive and too unfamiliar to computer enthusiasts.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aO1b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aO1b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aO1b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aO1b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aO1b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aO1b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg" width="1456" height="695" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:695,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:251542,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/192509833?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aO1b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg 424w, https://substackcdn.com/image/fetch/$s_!aO1b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg 848w, https://substackcdn.com/image/fetch/$s_!aO1b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!aO1b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe09a78e8-8662-4528-9881-1061212aba96_1564x747.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Byte Magazine, December 1975</figcaption></figure></div><p></p><h2>System/23 DataMaster</h2><p>IBM&#8217;s first attempt to build a commercial microcomputer was the <a href="https://oldcomputers.net/ibm5322.html">IBM System/23 DataMaster</a>. Development began in February 1978 by the Entry Level Systems unit in Boca Raton, FL led by <a href="https://computerhistory.org/profile/william-c-lowe/">Bill Lowe</a>. The computer used Intel&#8217;s 8085 CPU and was designed to be easy to operate in an office environment and to run applications written in BASIC<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. </p><p>An interesting spin-off from the project was the 5100-based desktop computer <a href="https://oldcomputers.net/ibm5120.html">IBM 5120</a>, It was developed in only 90 days by a small team led by Bill Sydnes and released before the DataMaster - a true feat that convinced Lowe it was possible to have a successful fast-track project even inside IBM. </p><p>It was during the development of the DataMaster that IBM first contacted Microsoft to ask about its BASIC interpreter. The man who initiated the contact was the project&#8217;s software lead - <a href="https://www.linkedin.com/in/jack-g-sams-8764a18/">Jack Sams</a>. Sams had been with IBM for over two decades at that time; he was a member of the team that produced the <a href="https://www.ibm.com/history/system-360">IBM System/360</a>. He was also disillusioned with IBM software development practices and proposed purchasing Microsoft BASIC for the DataMaster. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A5G4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A5G4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A5G4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A5G4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A5G4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A5G4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg" width="1536" height="1024" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1536,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:180187,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/192509833?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7bb4b549-52ce-4b36-a004-46a0908539ef_1536x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A5G4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!A5G4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!A5G4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!A5G4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba245dda-6cf5-49b0-b871-c5448d3b2406_1536x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">IBM System/23 DataMaster</figcaption></figure></div><p></p><p>Instead, IBM higher-ups decided to make DataMaster BASIC compatible with <a href="https://s3data.computerhistory.org/brochures/ibm.system34.1970.120641280.pdf">IBM System/34 BASIC</a> and that caused the delay of over a year. Sams decided to avoid making the same mistake again if at all possible.</p><h2>Project Chess</h2><p>The next opportunity came in early July 1980. IBM CEO Frank Cary summoned Lowe to a meeting of the Corporate Management Committee (CMC) in Armonk NY and asked why IBM could not produce something like Apple II. Lowe replied that it was not possible to develop a successful personal computer within the framework of IBM development processes. He suggested to either license an existing computer such as the <a href="https://www.myoldcomputers.com/museum/computers/atari_800.htm">Atari 800</a> or form an Independent Business Unit (IBU) within IBM and let it develop a personal computer in just one year but outside of IBM&#8217;s normal structure. Cary immediately rejected the idea of licensing Atari and asked Lowe to form a small task force and come back in a month with an official proposal for a &#8220;fast&#8209;track&#8221; personal&#8209;computer project.</p><p>The task force (internally known as &#8220;dirty dozen&#8221;) that Lowe assembled right after the July 4th weekend consisted largely of people from the DataMaster project, including Sydnes and Sams. They were determined to not repeat the mistakes which slowed down their previous assignment and decided to quickly develop an early prototype from off-the-shelf components. That prototype would then be given to the third-party software companies who would work on the software in parallel with the Boca Ratton group finishing the hardware.</p><p>While Sydnes was busy building the hardware proof of concept, Sams was collecting information about the possible software vendors. He knew the priority was software that would ship in the computer&#8217;s ROM - the BASIC interpreter. He also knew where to look for it. What he did not know was what kind of company Microsoft really was; he was wary of dealing with an unreliable group of West Coast hippies operating from a bedroom. There was only one way to find out: on Monday, July 21st, 1980, he called Bill Gates and asked to meet the next day.</p><h2>The Initial Meeting - &#8220;Most likely, nothing will happen&#8221;</h2><p>Gates had a meeting with Atari CEO Ray Kassar scheduled for July 22, but he did not want to miss the chance to talk to IBM, so he rescheduled it. He even dressed in a suit (unusual for him) and invited his old friend and new business associate, Steve Ballmer.</p><p>Jack Sams arrived accompanied by Pat Harrington who was in charge of contract administration in the Boca Raton office. After signing nondisclosure agreements, the meeting started. Sams could reveal only that IBM was considering a secret project that, if approved, would need to be completed under a very tight deadline. He made sure to set expectations low: most likely, nothing would come of it, as was often the case with IBM initiatives. </p><p>Gates spoke passionately about the microcomputer industry, the shift to 16&#8209;bit processors, and Microsoft&#8217;s vision of the future. Sams listened attentively. Gates later came to believe that it was his arguments that influenced IBM to choose Intel 8088 for the PC. In fact, the decision had already been made; Sams simply did not want to reveal it.</p><p>On the surface, nothing substantial was decided during that first meeting. Gates later described it as &#8220;IBM asking lots of crazy questions&#8221;. But that was not the point. Sams was impressed both with Gates personally and with Microsoft as a company. Instead of the tiny, informal operation he had expected, he found a firm of roughly forty employees, with proper offices and a list of happy customers.</p><p>After returning to Boca Raton, Sams reported to Lowe that he felt comfortable putting the fate of the project in the hands of the small Bellevue, WA based software company.</p><h2>The Second Meeting - &#8220;By the way, what about CP/M?&#8221;</h2><p>Bill Lowe returned to Armonk on August 6th and presented his plan to the CMC. The committee gave him the approval to form an Independent Business Unit and proceed with the project which was code named &#8220;Chess&#8221;.</p><p>Soon after, Jack Sams called Bill Gates and scheduled a meeting for August 21st. This time the NDA was even thicker and scarier, but Gates again signed it without hesitation. Each side brought four people, including lawyers.</p><p>Sams could finally present IBM&#8217;s plan: a personal computer built around the Intel 8088, assembled from off&#8209;the&#8209;shelf components, and delivered within a year. He offered Microsoft the opportunity to supply not only the BASIC interpreter, but also all the other products they were selling at the time: compilers for FORTRAN, COBOL, Pascal and BASIC, plus a typing tutor and even a game.</p><p>Microsoft had started porting its software to Intel&#8217;s 16-bit platforms a few years earlier; now the bet was about to pay off. The company was ready to fully commit to Project Chess and help the Boca Raton team meet its deadline.</p><p>There was just one more thing to discuss: The IBM PC was supposed to support floppy disk drives, and for that it needed a disk operating system. Sams hoped Microsoft could sublicense Digital Research&#8217;s CP/M, the most popular OS of the time. Microsoft had recently introduced the SoftCard, which transformed an Apple II into a CP/M machine. But it turned out Microsoft could not sublicense CP/M for both legal and technical reasons. The <a href="https://nemanjatrifunovic.substack.com/p/the-late-arrival-of-16-bit-cpm">port of CP/M to Intel 8086</a> was still in progress. However, Gates was happy to personally call Digital Research and help the IBM team arrange a meeting.</p><p>That meeting did not go well. But that&#8217;s a different story&#8230;</p><h2>Conclusion</h2><p>The main reason IBM came to Microsoft for a BASIC interpreter, and eventually the operating system, was the brutal deadline for delivering the new personal computer. IBM was obviously capable of developing system software, but not on such a schedule. Instead, they decided to use outside suppliers for the software, just as they did for the hardware, and once they came to that decision, Microsoft was realistically their only option, at least when it comes to BASIC.</p><p>Publicly, IBM offered another explanation. It was plausible, but not the primary driver:</p><blockquote><p>Let&#8217;s take BASIC as an example. IBM has an excellent BASIC&#8212; it&#8217;s well received, runs fast on mainframe computers, and it&#8217;s a lot more functional than microcomputer BASICs were in 1980. But the number of users was infinitesimal compared to the number of Microsoft BASIC users. Microsoft BASIC had hundreds of thousands of users around the world. How are you going to argue with that?</p><p>IBM&#8217;s Philip D. Estridge</p></blockquote><p>Another theory commonly mentioned is the alleged friendship between IBM&#8217;s president <a href="https://www.ibm.com/history/john-opel">John Opel</a> and Bill Gates&#8217; mother Mary Gates who both served on the board of <a href="https://www.uwkc.org/">United Way</a>. Obviously, we don&#8217;t know whether Mr. Opel ever discussed IBM&#8217;s plans for the ultra-secret personal computer project with Mrs. Gates. What we do know is that IBM wanted all software and almost all hardware developed by third-party suppliers. For a BASIC interpreter, Microsoft was simply the only game in town at the time.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Ars Technica article <a href="https://arstechnica.com/features/2005/12/total-share/">Total share: 30 years of personal computer market share figures</a> offers an interesting insight into the state of the early microcomputer market</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>From <a href="https://www.scribd.com/document/669053144/1970-1984">IBM Milestones: 1970-1984 Overview</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Byte magazine from September 1990 contains an article by David J. Bradley, one of the original IBM PC developers, <a href="https://www.ardent-tool.com/5150/PC_origins.html">The Creation of the IBM PC</a> which describes the influence of the DataMaster on the IBM PC.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Decoding UTF-8. Part VII: Validation]]></title><description><![CDATA[In part V of the UTF-8 decoding series we saw how a simple non-validating decoder might look like, but we emphasized the importance of validation.]]></description><link>https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-vii-validation</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-vii-validation</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 28 Mar 2026 22:23:03 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1c9f2474-c543-429b-ad12-78047e61ee6b_280x201.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In part VI of the UTF-8 decoding series we saw how a simple non-validating decoder might look like, but we emphasized the importance of validation. It is important to remember that in general we cannot assume that a stream of bytes represents valid UTF-8 encoded text. We need to be able to recognize any invalid UTF-8 sequence and deal with it.</p><p>To validate a UTF-8 string we have to perform the following three kinds of checks:</p><ul><li><p>The byte sequence is well-formed.</p></li><li><p>Decoding results in a valid Unicode code point</p></li><li><p>The code point is encoded in the minimal number of bytes (no overlong encoding).</p></li></ul><p>Let&#8217;s look at them in some detail.</p><h2>Validity of Bytes in the Sequence</h2><p>As we have seen in the <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-i-manual-decoding">Part I</a>, a valid UTF-8 encoding of a Unicode code point consists of a leading byte followed by a number of continuation bytes.</p><p>We start the check for validity of a byte sequence by looking at the lead byte. A valid lead byte has to start with one of the following bit fields: </p><ul><li><p><code>0,</code> in which case the lead byte alone encodes a code point.</p></li><li><p><code>110,</code> which starts a two-byte sequence.</p></li><li><p><code>1110, </code>which starts a three-byte sequence</p></li><li><p><code>11110</code>, which starts a four-byte sequence.</p></li></ul><p>Lead bytes that start with any other bit combination are invalid.</p><p>Once we establish the validity of the lead byte and compute the expected sequence length<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, we can perform the next important check: ensure the expected number of valid continuation bytes. A valid continuation byte starts with bits <code>10 </code>and therefore falls in the range <code>0x80-0xBF</code>.</p><p>Depending on the value of the lead byte, we expect between <code>0</code> and <code>3</code> continuation bytes to follow. If there are fewer, it means we have an incomplete sequence; if there are more, we have detected unexpected continuation bytes.</p><h2>Validity of Decoded Code Points</h2><p>Some well-formed UTF-8 sequences are decoded into invalid Unicode code points:</p><ul><li><p>Values greater than <code>U+10FFFF</code>.</p></li><li><p>UTF-16 surrogates.</p></li></ul><p>Unicode 2.0 and later support code points in the range <code>U+0000-U+10FFFF</code>. A well-formed UTF-8 sequence can be used to encode values that fall outside the range and therefore must be detected and reported as invalid.</p><p>Code points in the range <code>U+D800-U+DFFF</code> are reserved for use by <a href="https://datatracker.ietf.org/doc/html/rfc2781">UTF-16 encoding scheme</a> as surrogate pairs. They cannot be used as standalone code points, and any UTF-8 sequence that is decoded to that range is invalid.</p><p>An interesting category to consider is <a href="https://www.unicode.org/versions/corrigendum9.html">noncharacters</a>. These code points are reserved for internal use but can be interchanged and do not cause ill-formed Unicode texts. Some validators still reject them: the current version of <a href="https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt">Markus Kuhn's UTF-8 decoder capability and stress test</a> calls them &#8220;a potential security risk, depending on what use is made of these codes subsequently&#8221;. Yet, as they are explicitly called out as valid code points by the Unicode standard, we are not going to reject them.</p><h2>Overlong Sequences</h2><p>If a Unicode code point is encoded with more bytes than necessary, we have an overlong encoding. For instance, the code point value for &#8216;A&#8217; (U+0041) could be encoded as:</p><ul><li><p><code>0x41</code> (<code>0[1000001]</code>)</p></li><li><p><code>0xC1 0x81</code> (<code>110[00001] 10[000001]</code>)</p></li><li><p><code>0xE0 0x81 0x81</code> (<code>1110[0000] 10[000001] 10[000001]</code>)</p></li></ul><p>Only the one-byte version is legal - the other two are overlong sequences, constructed by padding zeroes and must be rejected by a validator.</p><p>An obvious way to check for an overlong sequence is to complete the decoding and then check that the decoded value corresponds to an expected sequence length. That&#8217;s what we would do in a validating decoder.</p><p>If we are interested in validating without decoding, the task is easier. Overlong sequences can happen in the following three cases:</p><ul><li><p>if a two-byte sequence starts with <code>0xC0 </code>or <code>0xC1</code> it is overlong.</p></li><li><p>if a three-byte sequence starts with <code>0xE0</code> and the first continuation byte is in range [<code>0x80, 0x9F</code>]</p></li><li><p>if a four-byte sequence starts with 0xF0 and the first continuation byte is in range [<code>0x80, 0x9F</code>]. </p></li></ul><h2>Algorithm for Validating UTF-8 Sequences</h2><p>Validating UTF-8 can be performed as a part of decoding, or as a separate process. Here we examine a straightforward approach to validating without fully decoding. The algorithm:</p><ul><li><p>Lead starts with bit <code>0</code>; <em>valid sequence</em>.</p></li><li><p>Lead starts with bits <code>110:</code> two-byte sequence</p><ul><li><p><code>0xC0 </code>or <code>0xC1: </code>overlong two-byte sequence; <em>invalid sequence</em>.</p></li><li><p>No continuation bytes: incomplete sequence; <em>invalid sequence</em>.</p></li><li><p>One continuation byte; <em>valid sequence.</em></p></li></ul></li><li><p>Lead starts with <code>1110</code>: three-byte sequence</p><ul><li><p>If <code>0xE0</code></p><ul><li><p>First continuation byte in range [<code>0x80, 0x9F</code>]: overlong three-byte sequence; <em>invalid sequence</em>.</p></li></ul></li><li><p>If 0xED</p><ul><li><p>First continuation byte in range [<code>0xA0, 0xBF</code>]: UTF-16 surrogate: <em>invalid sequence</em>.</p></li></ul></li><li><p>Less than two continuation bytes: incomplete sequence; <em>invalid sequence</em>.</p></li><li><p>Two continuation bytes: <em>valid sequence</em>.</p></li></ul></li><li><p>Lead starts with <code>11110</code>: four-byte sequence</p><ul><li><p>If <code>0xF0</code></p><ul><li><p>First continuation byte in range [<code>0x80, 0x9F</code>]: overlong four-byte sequence; <em>invalid sequence</em>.</p></li></ul></li><li><p>If in range [<code>0xF5, 0xF7</code>] code points above <code>U+10FFFF</code>; <em>invalid sequence.</em></p></li><li><p>Less than three continuation bytes: incomplete sequence; <em>invalid sequence</em>.</p></li></ul></li><li><p>Lead starts with invalid prefix: <em>invalid sequence</em>.</p><p></p></li></ul><h2>Code example</h2><p>A C function that would implement the algorithm above could look like:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;c&quot;,&quot;nodeId&quot;:&quot;94ab0592-e022-42d5-8fc6-6dedd035515c&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-c">/* Returns 0 if invalid, or sequence length if valid */
int validate_utf8_sequence(const char *str)
{
    const unsigned char *s = (const unsigned char *)str;
    unsigned char c0 = s[0];

    /* Empty string: no code point */
    if (c0 == '\0')
        return 0;

    /* ASCII */
    if ((c0 &amp; 0x80) == 0)
        return 1;

    /* Two&#8209;byte: 110xxxxx */
    if ((c0 &amp; 0xE0) == 0xC0) {
        if (s[1] == '\0')
            return 0; /* truncated */

        unsigned char c1 = s[1];

        if (c0 == 0xC0 || c0 == 0xC1)
            return 0; /* overlong */

        if ((c1 &amp; 0xC0) != 0x80)
            return 0;

        return 2;
    }

    /* Three&#8209;byte: 1110xxxx */
    if ((c0 &amp; 0xF0) == 0xE0) {
        if (s[1] == '\0' || s[2] == '\0')
            return 0; /* truncated */

        unsigned char c1 = s[1];
        unsigned char c2 = s[2];

        if ((c1 &amp; 0xC0) != 0x80)
            return 0;

        if (c0 == 0xE0) {
            if (c1 &lt; 0xA0)
                return 0; /* overlong */
        } else if (c0 == 0xED) {
            if (c1 &gt;= 0xA0)
                return 0; /* surrogate */
        }

        if ((c2 &amp; 0xC0) != 0x80)
            return 0;

        return 3;
    }

    /* Four&#8209;byte: 11110xxx */
    if ((c0 &amp; 0xF8) == 0xF0) {
        if (s[1] == '\0' || s[2] == '\0' || s[3] == '\0')
            return 0; /* truncated */

        unsigned char c1 = s[1];
        unsigned char c2 = s[2];
        unsigned char c3 = s[3];

        if (c0 == 0xF0) {
            if (c1 &lt; 0x90)
                return 0; /* overlong */
        } else if (c0 == 0xF4) {
            if (c1 &gt; 0x8F)
                return 0; /* &gt; U+10FFFF */
        } else if (c0 &gt;= 0xF5) {
            return 0; /* invalid lead */
        }

        if ((c1 &amp; 0xC0) != 0x80)
            return 0;
        if ((c2 &amp; 0xC0) != 0x80)
            return 0;
        if ((c3 &amp; 0xC0) != 0x80)
            return 0;

        return 4;
    }
    /* Invalid lead byte */
    return 0;
}</code></pre></div><p>Inspecting assembly of the function does not show anything interesting. Lots of branches, but <a href="https://nemanjatrifunovic.substack.com/p/when-compiler-optimizations-hurt">as we have seen</a>, modern CPUs handle branches surprisingly well.</p><p>In the next post of the series, we&#8217;ll look at a validating decoder.</p><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>We examined the process of computing the sequence length from the lead byte in several earlier posts.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Gary Kildall, Bill Gates and the "Gentleman's Agreement"]]></title><description><![CDATA["According to industry sources" the two had an informal non&#8209;compete deal.]]></description><link>https://nemanjatrifunovic.substack.com/p/gary-kildall-bill-gates-and-the-gentlemans</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/gary-kildall-bill-gates-and-the-gentlemans</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sun, 08 Mar 2026 01:17:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!AQDN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>In fact, there was an unwritten agreement between Gates and Kildall that Microsoft would stay out of the operating system end of the business, and Kildall would not get into microcomputer languages, according to industry sources.</p><p><a href="https://www.goodreads.com/book/show/41611.Hard_Drive">Hard Drive: Bill Gates and the Making of the Microsoft Empire</a></p></blockquote><p>In 1980, the microcomputer software industry was tiny compared to today&#8217;s <a href="https://www.precedenceresearch.com/software-market">$824 billion global software market size</a> - it was almost certainly under $100 million<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. When it comes to application software, VisiCorp&#8217;s Visicalc led the new spreadsheet market and MicroPro&#8217;s WordStar was the most popular word-processing program. On the systems software side, the market was split between Microsoft and Digital Research Inc (DRI): the former focused on programming languages, and the latter on operating systems, including CP/M which became the standard for 8-bit business computers.</p><p>For a while, or at least until Microsoft released MS-DOS, there was a belief that the leaders of the two companies, Bill Gates and Gary Kildall, had agreed not to compete with each other. It was hearsay and nobody was actually able to point to a source for the claim - people were just passing rumors around:</p><blockquote><p>David Kaplan, the author of the engaging Silicon Boys, says there seemed to be a gentleman&#8217;s agreement that neither would get involved in the other&#8217;s business. &#8220;DRI would stay away from languages, and Microsoft would leave operating systems alone.&#8221;</p><p><em><a href="https://www.goodreads.com/book/show/10630.They_Made_America">They Made America: From the Steam Engine to the Search Engine: Two Centuries of Innovators - Harold Evans, Gail Buckland, David Lefer</a></em>  </p></blockquote><p>Was there anything more than gossip behind the agreement between Kildall and Gates?</p><h2>Synergism and Talks about Merger</h2><p>The entire concept of dividing the system software market into programming languages and operating systems sounds odd nowadays. In the early era of personal computers, disk drives were rare, and many machines booted straight into a BASIC interpreter stored in ROM. The language functioned somewhat like a command line shell in modern operating systems: it was the user interface through which most users interacted with the machine. Early computer culture even assumed that most users would learn at least some programming. In that sense, Microsoft BASIC was system software, if not a full-fledged operating system. It became even closer to that role when disk support was added - originally by Bill Gates himself, and later by Marc McDonald who developed a real file system, called <a href="https://aeb.win.tue.nl/linux/fs/fat/fat-1.html">FAT</a> that was bundled with BASIC. As time went by, Microsoft also developed compilers for FORTRAN, COBOL and even announced APL, though it was never actually released.</p><p>On the other hand, as disk drives became more common, there was a need for a traditional operating system stored on a disk and loaded into RAM where it would provide system calls to applications. Several appeared very early on, including Intel&#8217;s <a href="https://www.retrotechnology.com/dri/isis.html">ISIS</a>, iCOMs <a href="https://collections.museumsvictoria.com.au/items/1172783">FDOS</a> and <a href="https://web.archive.org/web/20050830163836/http://bowkera.com/north_star_computers.htm">NorthStar</a> DOS, but by late 1977 it became clear the winner was DRI&#8217;s CP/M: inexpensive, easily portable and very light on resources. Initially developed in 1973/74<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, before any commercial microcomputers even existed, CP/M was in the beginning used as a teaching tool at Naval Postgraduate School where Kildall taught. First commercial licenses were issued in 1975, and after the deal with IMSAI in 1976, CP/M became the de-facto standard for Intel 8080 based business computers. By 1979, Kildall felt it was time to move on to more capable systems that would support multitasking and networking, and DRI developed MP/M and CP/NET.</p><p>Both Microsoft and DRI recognized that their businesses complemented each other, and the word &#8220;synergy&#8221; started popping up on both sides:</p><blockquote><p>At this time, I was quite friendly with Bill, and we always talked of the &#8220;synergism&#8221; of our two businesses.</p><p>Gary Kildall</p></blockquote><p></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AQDN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AQDN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AQDN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AQDN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AQDN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AQDN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg" width="546" height="430" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:430,&quot;width&quot;:546,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:53457,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/186923211?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!AQDN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg 424w, https://substackcdn.com/image/fetch/$s_!AQDN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg 848w, https://substackcdn.com/image/fetch/$s_!AQDN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!AQDN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F727a154f-a3df-4341-a709-0242bd0c6164_546x430.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Dan Fylstra, Bill Gates and Gary Kildall in 1984</figcaption></figure></div><p></p><blockquote><p>It made our lives a lot easier if someone would just go license CP/M and get that up on their machines and then our stuff would pretty much run as is. And Gary would do likewise. If someone went to him to license CP/M and they were looking for languages, he would refer people to Microsoft. It was a very synergistic kind of thing.</p><p>Steve Wood, Microsoft&#8217;s early employee</p></blockquote><p>At some point, there was even discussion of a merger between the two companies. According to Kildall<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>, &#8220;one day in 1977&#8221; Gates paid him a visit while traveling from Albuquerque to Seattle. The two pioneers of the microcomputer software industry bonded over a home-cooked dinner and complained about their numerous speeding tickets. After the meal, they discussed the possibility of combining their businesses. At that time, Microsoft&#8217;s contract with the original microcomputer maker <a href="https://web.archive.org/web/20120323162001/http://startup.nmnaturalhistory.org/gallery/story.php?ii=47&amp;sid=4">MITS</a> had dissolved and its founders were looking to leave Albuquerque. Gates preferred a move to California and a merger with DRI seemed like a plausible idea; Allen insisted on moving back to Seattle, which is what eventually happened.</p><p>It was a tantalizing &#8220;what-if&#8221; moment:</p><blockquote><p>The combination of Kildall and Gates could have been a killer-deal in those days. I had the operating systems for the decade to come, and he had the opportunistic approach to garner business. But, our attitudes differed entirely, and that could also have been a disaster. I think we both realized this and simply let the &#8220;deal&#8221; die.</p><p>Gary Kildall</p></blockquote><p>But all this talk of &#8220;synergy&#8221; did not mean there was a deal to stay out of each other&#8217;s business. Indeed, if we look at the early history of the two companies, there is plenty of evidence that both were interested in expanding on the other side of the fence.</p><h2>Microsoft and Operating Systems</h2><p>Even if we disregard the fact that Microsoft&#8217;s Standalone BASIC was almost an operating system, it is clear Microsoft considered building a &#8220;real&#8221; operating system from the very beginning:</p><blockquote><p>Early on in New Mexico we talked about developing an operating system. We asked ourselves if we should really be referring all this business to Gary. We always came back with the same answer: We have all this other stuff to do.</p><p> Steve Wood</p></blockquote><p>In 1979, Marc McDonald developed software that was without any doubt an operating system: it was called M-DOS or MIDAS<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>. M-DOS was based on the same FAT filesystem that was shipped with BASIC; it supported multitasking, but not multiple users and, like CP/M, was influenced by the TOPS-10 operating system that ran on DEC&#8217;s PDP-10 mainframes - <a href="https://nemanjatrifunovic.substack.com/p/pdp-10-and-microcomputers?r=4yo154">Microsoft&#8217;s primary development environment in the 1970s</a>. Before M-DOS was completed, though, Microsoft leaders decided to shelve it<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a>.</p><p>In the meantime, in 1978, Intel released the first 16-bit microprocessor: the 8086. Microsoft was one of the few companies ready to bet on the new technology: they hired Jim Lane to write an 8086 simulator for the PDP&#8209;10 and as soon as it was finished Bob O&#8217;Rear started porting the Standalone BASIC to 8086. The product was ready by early 1980 - just in time for one of the first 8086 based systems: <a href="https://dosmandrivel.blogspot.com/2007/11/first-dos-machine.html">Seattle Computer Product&#8217;s S-100 8086 board</a>.</p><p>BASIC was, of course, the priority, but Gates saw the impending shift to 16-bits as a chance to gain a foothold in the operating systems market. In the late 1970s, UNIX was becoming popular at universities, which received not only binaries, but also source code from AT&amp;T that at the time was prohibited from selling it commercially.  </p><p>Gates and Allen decided to bet that UNIX would become the standard for 16-bit microprocessors. In February 1980 Microsoft licensed UNIX source code from Western Electric (the manufacturing arm of AT&amp;T), and on August 25, 1980, announced its own product based on it: XENIX. The new operating system was first released for the DEC PDP-11 minicomputer - the model UNIX was developed on; later it was ported to 16-bit microcomputers.</p><p>One might expect that Microsoft licensing UNIX would have seemed like a serious threat to DRI. Gary Kildall did not see it that way:</p><blockquote><p>UNIX was not in the marketplace we were into. It was mostly for scientific workstations, as it is now. It was never a threat to us in our business markets.</p><p>Gary Kildall</p></blockquote><p>He was right. XENIX achieved some success during the 1980s, but it never came close to becoming the standard for 16-bit personal computers<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a>. It was not a good fit for the 8088 CPU and required more memory than the personal computer models of the early 1980s could usually provide<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a>.</p><p>But spending $2 million on a license for UNIX source code clearly showed that Microsoft was serious about the operating systems. There was no &#8220;agreement&#8221;, written or unwritten, that would keep them out of that market; they just picked the wrong product at first.</p><h2>Digital Research and Programming Languages</h2><p>Gary Kildall is mostly remembered as the author of the CP/M operating system. However, he was above all a programming language expert:</p><ul><li><p>In his PhD thesis <a href="https://haoxintu.github.io/files/1-A%20Unified%20Approach%20to%20Global%20Program%20Optimization.pdf">A unified approach to global program optimization</a>, he proposed a technique for global program&#8209;structure analysis that allowed more effective optimization of generated object code.</p></li><li><p>He designed and implemented <a href="https://www.retrotechnology.com/dri/dri_plm.html">PL/M - the first programming language aimed specifically at microcomputers</a>.</p></li><li><p>He implemented the first PL/I-G compiler for microcomputers, PL/I-80.</p></li><li><p>He designed and implemented <a href="https://www.s100computers.com/Software%20Folder/Assembler%20Collection/Digital%20Research%20XLT86%20Manual.pdf">XLT86 8080 to 8086 Assembly Language Translator</a><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a></p></li><li><p>He developed <a href="https://www.seasip.info/Cpm/drlogo.html">DR Logo</a> - a Logo interpreter for personal computers. </p></li></ul><p>There was never any chance Gary Kildall would abandon his work on languages. In fact, CP/M itself was created as a side effect of his PL/M work - only because he wanted to run the PL/M compiler on an <a href="https://www.computinghistory.org.uk/det/3366/intellec-8/">Intellec-8</a> microcomputer development system rather than cross-compiling it on a PDP-10 mainframe.</p><p>That said, before 1980 Digital Research was not producing programming languages. PL/M was sold to Intel for $20k in 1974 and PL/I-80 was released only in late 1980. The compiler that apparently upset Gates the most was originally not even a DRI product - it was <a href="https://www.dvorak.org/blog/whatever-happened-to-cbasic/">CBASIC</a>, developed and sold by a former student of Gary Kildall - <a href="https://www.computerhistory.org/collections/catalog/102717362/">Gordon Eubanks</a>. It seems that DRI started promoting CBASIC sometime in 1979<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-9" href="#footnote-9" target="_self">9</a>, but did not acquire it until 1981.</p><h2>Aftermath</h2><p>Once IBM decided to license MS-DOS for its IBM PC computer, any semblance of the &#8220;synergy&#8221; between the two companies disappeared: they became fierce competitors. </p><p>Microsoft won decisively, and by 1985 DRI was on the brink of bankruptcy. The board authorized Gary Kildall to find a buyer for the company, and he went to Bill Gates, asking $26 million. Gates did not think the company was worth more than $10 million, and the second attempt to combine the two companies failed. Kildall hired a new CEO, IBM veteran <a href="https://www.computerhistory.org/collections/catalog/102770488/">Dick Williams</a>, who managed to keep the company afloat and eventually sell it to Novell in 1991 for $120 million.</p><p>Gary Kildall died three years later at the age of fifty-two. His old friend and business rival had this to say about him:</p><blockquote><p>Gary Kildall was one of the original pioneers of the PC revolution. He was a very creative computer scientist who did excellent work. Although we were competitors, I always had tremendous respect for his contributions to the PC industry. His untimely death was very unfortunate, and he and his work will be missed.</p><p>Bill Gates, Computer Chronicles  - <a href="https://archive.org/details/GaryKild">Gary Kildall Special</a></p></blockquote><p>In the end, the supposed &#8220;gentleman&#8217;s agreement&#8221; between Kildall and Gates was really just an acknowledgment of the situation as it existed at the time. The two men respected each other&#8217;s work, and for a while their businesses were complementary. Neither believed that arrangement was permanent, and both were ready to cross the boundary when the opportunity presented itself.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>An InfoWorld article <a href="https://books.google.com/books?id=kC4EAAAAMBAJ&amp;pg=PA80#v=onepage&amp;q&amp;f=false">Company Strategies Boomerang</a> presents a list of top 20 microcomputer software companies by 1983 sales.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p><a href="https://www.retrotechnology.com/dri/CPM_history_kildall.txt">The History of CP/</a>M, by Gary Kildall was originally published at <em>Dr. Dobb&#8217;s Journal</em>, Vol.5, No.1, (January 1980) (number 41), page 6-7</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Gary Kildall&#8217;s memoirs <a href="https://www.manhattanrarebooks.com/pages/books/2968/gary-kildall/computer-connections-people-places-and-events-in-the-evolution-of-the-personal-computer-industry?soldItem=true">Computer Connections: People, Places, and Events in the Evolution of the Personal Computer Industry</a> is only partially available to the public.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Pretty much the only reliable source describing this never-released operating system is <a href="https://www.pcjs.org/documents/books/mspl13/msdos/encyclopedia/">The MS-DOS Encyclopedia</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>According to Paul Allen: &#8220;Trying to do a large, full-blown operating system on the 8080 was a lot of work, and it took a lot of memory. The 8080 addresses only 64 K, so with the success of CP/M, we finally concluded that it was best not to press on with that&#8221;.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p><a href="https://computeradsfromthepast.substack.com/p/microtimes-interview-with-doug-and">It seems</a> XENIX later competed with DRI&#8217;s Concurrent CP/M in parts of Europe in the mid&#8209;to&#8209;late 1980s, though by then Microsoft had already sold XENIX to SCO. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>In post <a href="https://nemanjatrifunovic.substack.com/p/could-dos-have-been-a-scaled-down">Could DOS Have Been a Scaled-Down Version of Xenix?</a>  I wrote more about limitations of the IBM PC that made running a full UNIX impractical.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>Kildall described some challenges of assembly language source translation in his <a href="https://computeradsfromthepast.substack.com/p/gary-kildall-has-a-talk-with-pc-magazine">June 1982 interview with PC Magazine</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-9" href="#footnote-anchor-9" class="footnote-number" contenteditable="false" target="_self">9</a><div class="footnote-content"><p>According to a Microsoft&#8217;s marketing manager, the purchase of UNIX source license was a direct response to DRI promoting CBASIC. I find it hard to believe; as we have seen, Microsoft was eying the operating system market pretty much since its inception.</p></div></div>]]></content:encoded></item><item><title><![CDATA[AArch64 Bitfield Move (BFM) Instruction]]></title><description><![CDATA[BFM, UBFM, SBFM, and Aliases]]></description><link>https://nemanjatrifunovic.substack.com/p/aarch64-bitfield-move-bfm-instruction</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/aarch64-bitfield-move-bfm-instruction</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sun, 01 Mar 2026 16:07:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/22ffc119-5c4a-4b52-af13-74060403e768_330x242.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-vi-simplistic">The sixth part of my series on decoding UTF-8</a> was a pretty uninteresting one: in it, I described a basic non-validating UTF-8 decoder. When examining the generated assembly, I saw three different instructions for shifting bits: LSL, BFI and BFXIL. As it turns out, BFI and BFXIL are both aliases of the same instruction: BFM - bitfield move. I decided to learn more about BFM and share my findings here<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><p>A little history first (shocking, I know). Arm32 had the following instructions for moving bitfields: <a href="https://developer.arm.com/documentation/ddi0597/2025-12/Base-Instructions/BFI--Bit-Field-Insert-?lang=en">BFI</a>, <a href="https://developer.arm.com/documentation/ddi0597/2025-12/Base-Instructions/BFC--Bit-Field-Clear-?lang=en">BFC</a>, <a href="https://developer.arm.com/documentation/ddi0597/2025-12/Base-Instructions/UBFX--Unsigned-Bit-Field-Extract-?lang=en">UBFX</a>, and <a href="https://developer.arm.com/documentation/ddi0597/2025-12/Base-Instructions/SBFX--Signed-Bit-Field-Extract-?lang=en">SBFX</a>. Unlike their Arm64 namesakes, they are instructions on their own and not aliases of other instructions. The 64-bit Arm introduces three separate, but related instructions: <a href="https://www.scs.stanford.edu/~zyedidia/arm64/bfm.html">BFM</a>, <a href="https://www.scs.stanford.edu/~zyedidia/arm64/ubfm.html">UBFM</a> and <a href="https://finkmartin.com/aarch64-morello/sbfm.html">SBFM</a>. There are a number of aliases that are easier to use and are implemented in terms of the three basic instructions.</p><p>If I really knew anything about chip design, I would probably speculate that all three core bitfield move instructions share most of the common implementation, but as a software person, I&#8217;ll leave the implementation details to the knowledgeable folks.</p><p>To keep the post relatively short, I&#8217;ll focus on the <code>BFM</code> instruction. Once we understand how it works, the rest of them will be easy enough to understand from the documentation.</p><h2>BFM - Bitfield Move</h2><p>The <code>BFM</code> instruction copies a bitfield (a collection of adjacent bits within a machine word) from the source register to a position in the destination register without changing any other bits.</p><p> According to the <a href="https://developer.arm.com/documentation/dui0801/g/A64-General-Instructions/BFM?lang=en">official documentation</a>:</p><blockquote><p>Bitfield Move copies any number of low-order bits from a source register into the same number of adjacent bits at any position in the destination register, leaving other bits unchanged.</p></blockquote><pre><code>BFM Rd, Rn, #immr, #imms</code></pre><p>Where:</p><ul><li><p><code>Rd</code> is the destination register (<code>Xd</code> for the 64-bit operation, <code>Wd</code> for the 32-bit variant).</p></li><li><p><code>Rn</code> is the source register (<code>Xn</code> for the 64-bit operation, <code>Wn</code> for the 32-bit variant).</p></li><li><p><code>immr</code> is the right rotate amount.</p></li><li><p><code>imms</code> is the leftmost bit number to be moved from the source.</p></li></ul><p>The operation is <a href="https://developer.arm.com/documentation/ddi0602/2025-12/Base-Instructions/BFM--Bitfield-move-?lang=en">described as a sequence of a rotation, masking and insertion</a>, but I find the following explanation easier to understand:</p><p>Depending on the values of the <code>immr</code> and <code>imms</code>, the instruction does one of the two things:</p><ul><li><p>if <code>immr &lt;= imms</code>, copies a bitfield <code>[immr : imms]</code> of the source register to the least significant bits of the destination register: <code>[0 : imms - immr]</code> </p></li><li><p>if <code>immr &gt; imms</code>, copies a bitfield <code>[0 : imms]</code> of the source register to <code>[regsize &#8722; immr : (regsize &#8722; immr) + imms]</code> of the destination register.</p></li></ul><p> where <code>regsize</code> is the destination register size of <code>32</code> or <code>64</code> bits.</p><p>Let&#8217;s look at examples of these two cases<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>:</p><h3>immr is less than or equal to imms</h3><pre><code>// ------------------------------------------------------------
// Load W0 = 0x55667788
// Binary: 0101 0101 0110 0110 0111 0111 1000 1000
// ------------------------------------------------------------
movz    w0, #0x7788
movk    w0, #0x5566, lsl #16

// Load W1 = 0xEEFF0011
// Binary: 1110 1110 1111 1111 0000 0000 0001 0001
movz    w1, #0x0011
movk    w1, #0xEEFF, lsl #16

// ------------------------------------------------------------
// Copy bits [8:23] of W1 into low bits of W0
// Bits 8:23 of W1 are: 1111 1111 0000 0000 (FF0)
// Expected result: 0101 0101 0110 0110 1111 1111 0000 0000
// ------------------------------------------------------------
bfm     w0, w1, #8, #23

// Result: w0 = 0x5566FF00</code></pre><p>Here, <code>immr=8</code>, <code>imms=23</code>. Since <code>imms-immr=15</code> we:</p><ol><li><p>Take bits <code>[8:23]</code> of <code>W1</code>: <code>1110 1110 [1111 1111 0000 0000] 0001 0001</code></p></li><li><p>Copy them into <code>[0:15]</code> bits of <code>W0</code>: <code>0101 0101 0110 0110 [1111 1111 0000 0000]</code></p></li></ol><p>The actual machine code generated for the BFM instruction in the example was:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;9ea3b7de-0c11-4fd4-9e10-7e21e251c8bb&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">sf |    opc   | N |  immr  |  imms  |  Wn   |  Wd
0  | 01100110 | 0 | 001000 | 010111 | 00001 | 00000</code></pre></div><h3>immr is greater than imms</h3><p>Sample:</p><pre><code>// ------------------------------------------------------------
// Load W0 = 0x55667788
// Binary: 0101 0101 0110 0110 0111 0111 1000 1000
// ------------------------------------------------------------
movz    w0, #0x7788
movk    w0, #0x5566, lsl #16

// Load W1 = 0xEEFF0011
// Binary: 1110 1110 1111 1111 0000 0000 0001 0001
movz    w1, #0x0011
movk    w1, #0xEEFF, lsl #16

// ------------------------------------------------------------
// Copy bits [0:7] of W1 to [12:19] bits of W0
// Bits 0:7 of W1 are: 0001 0001 (11)
// Expected result: 0101 0101 0110 0001 0001 0111 1000 1000
// ------------------------------------------------------------
bfm     w0, w1, #20, #7
// Result: w0 = 0x55611788</code></pre><p>Here, <code>immr=20, imms=7, regsize=32, regsize&#8722;immr=12,(regsize&#8722;immr)+imms=19 </code>so we:</p><ol><li><p>Take bits <code>[0:7]</code> of <code>W1</code>: <code>1110 1110 1111 1111 0000 0000 [0001 0001]</code></p></li><li><p>Copy them into <code>[12:19]</code> bits of <code>W0</code>: <code>0101 0101 0110 [0001 0001] 0111 1000 1000</code></p></li></ol><h3>BFM Aliases</h3><p>The following instructions are aliases of BFM:</p><ul><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/bfc_bfm.html">BFC</a> - Bitfield Clear. Clears a selected bitfield in the destination register.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/bfi_bfm.html">BFI</a> -  Bitfield Insert. Inserts the low bits of the source register into a bitfield of the destination register.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/bfxil_bfm.html">BFXIL</a> - Bitfield Extract and Insert Low. Extracts a bitfield from the source register and writes it into the low bits of the destination register.</p></li></ul><h2>UBFM - Unsigned Bitfield Move</h2><p>As we have seen, BFM copies a bitfield to the destination register, but leaves the other bits unchanged. <a href="https://www.scs.stanford.edu/~zyedidia/arm64/ubfm.html">UBFM</a> works exactly the same as BFM, but destination bits outside the bitfield are set to zero.</p><h3>UBFM Aliases</h3><p>Judging by the number of aliases, <code>UBFM</code> is the most popular bitfield move instruction:</p><ul><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/lsl_ubfm.html">LSL (immediate</a>) - Logical Shift Left (immediate). Shifts the source value left by an immediate amount and fills the new low bits with zeros.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/lsr_ubfm.html">LSR (immediate)</a> - Logical Shift Right (immediate). Shifts the source value right by an immediate amount and fills the new high bits with zeros.</p></li><li><p><a href="http://Unsigned Bitfield Insert in Zeros">UBFIZ</a> - Unsigned Bitfield Insert in Zeros. Extracts a bitfield from the low bits of the source register and inserts it into the destination at a specified position, with all other bits set to zero.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/ubfx_ubfm.html">UBFX</a> - Unsigned Bitfield Extract. Extracts a bitfield from the source register, puts it in the low bits of the destination register, and zero&#8209;extends the result.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/uxtb_ubfm.html">UXTB</a> - Unsigned Extend Byte. Zero&#8209;extends the low 8 bits of the source register and writes the result to the destination register.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/uxth_ubfm.html">UXTH</a> - Unsigned Extend Halfword. Zero&#8209;extends the low 16 bits of the source register and writes the result to the destination register.</p></li></ul><h3>SBFM - Signed Bitfield Move</h3><p>Unsurprisingly, <a href="https://www.scs.stanford.edu/~zyedidia/arm64/sbfm.html">SBFM</a> works almost exactly the same as the other two bitfield move instructions. The difference is that it sets the destination bits below the bitfield to zero and the bits above the bitfield to the value of the most significant bit of the bitfield.</p><h3>SBFM Aliases</h3><ul><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/asr_sbfm.html">ASR (immediate)</a> Arithmetic Shift Right (immediate). Shifts the source value right by an immediate amount and fills the high bits with the sign bit (sign-extends it).</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/sbfiz_sbfm.html">SBFIZ</a> Signed Bitfield Insert in Zeros. Extracts a bitfield from the low bits of the source register, inserts it into the destination, clears the bits below it, and sign&#8209;extends above it.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/sbfx_sbfm.html">SBFX</a> Signed Bitfield Extract. Extracts a bitfield from the source register, places it in the low bits of the destination register, and sign&#8209;extends the result.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/sxtb_sbfm.html">SXTB</a> Signed Extend Byte. Extracts an 8-bit value from a register, sign-extends it, and writes the result to the destination register.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/sxth_sbfm.html">SXTH</a> Sign Extend Halfword extracts a 16-bit value, sign-extends it, and writes the result to the destination register.</p></li><li><p><a href="https://www.scs.stanford.edu/~zyedidia/arm64/sxtw_sbfm.html">SXTW</a> Sign Extend Word sign-extends a word and writes the result to the destination register.</p></li></ul><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Raymond Chen&#8217;s blog entry: <a href="https://devblogs.microsoft.com/oldnewthing/20220803-00/?p=106941">The AArch64 processor (aka arm64), part 7: Bitfield manipulation</a> is a good article on the same topic, but I really wanted to focus on BFM and show some code examples.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>I used <a href="https://ret.futo.org/arm64/">Ret -Online Arm64 Assembler and Disassembler</a> to run and examine the samples.</p></div></div>]]></content:encoded></item><item><title><![CDATA[How Much of CP/M’s Design Ended Up in MS‑DOS?]]></title><description><![CDATA[MS-DOS was designed to be API compatible with CP/M. But how much of CP/M&#8217;s internal design carried over?]]></description><link>https://nemanjatrifunovic.substack.com/p/how-much-of-cpms-design-ended-up</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/how-much-of-cpms-design-ended-up</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 31 Jan 2026 14:58:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!fd-B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It is hard to believe there is anything left to say about the controversy over MS-DOS (including its predecessor 86-DOS) being a &#8220;CP/M lookalike&#8221;. By now it is clear that MS&#8209;DOS replicated the CP/M API but did not copy or directly translated any of its source code.</p><p>I still think there is one piece of the puzzle that has received little attention: how much of the CP/M design beyond the API was adopted by MS-DOS? In this article, we will look at the design side of the controversy. As you will see, the most frustrating part was determining which design aspects were actually being disputed, despite years of vague accusations about copying &#8220;the internals&#8221;.</p><p>Readers of my earlier posts know I admire both Dr. Gary Kildall, the author of CP/M, and Tim Paterson, the author of 86&#8209;DOS. It is unfortunate that two great programmers ended up on opposite sides of this argument, and I hope this post is a small step toward closing it for good.</p><h2>Accusations</h2><p>Gary Kildall was never very specific when he claimed that MS&#8209;DOS borrowed CP/M&#8217;s internal design. For example, in his <a href="https://computeradsfromthepast.substack.com/p/gary-kildall-has-a-talk-with-pc-magazine">1982 interview with PC Magazine</a> he said:</p><blockquote><p>Basically, you know the history of PC-DOS&#8212;where it came from, and so forth. It's one of the variety of operating systems we call CP/M lookalikes. It arrived on the scene between CP/M version 1.4 and CP/M 2.2, so it has characteristics of CP/M 1.4 and extensions toward the CP/M 2.2-style file system<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>, but with differences because they were kind of simultaneous in design. There are subtle differences but PC-DOS is fundamentally the same as the 8-bit version of CP/M as far as the user is concerned, and also as far as the program interface. Most of the interface differences between PC-DOS and CP/M are misunderstandings of the CP/M calls by the person who wrote the original PC-DOS implementation, simple things like returning FF rather than 1, things that are of no consequence but just weren&#8217;t done specifically the same.</p></blockquote><p>This is mostly a complaint about PC-DOS appropriating CP/M&#8217;s interface and behavior. The only possible reference to the internal design is his mention of the file system, which I cannot explain, as 86-DOS/MS-DOS/PC-DOS used the FAT file system, which is very different from the CP/M&#8217;s.</p><p>Toward the end of his life, Kildall wrote a memoir: <em>Computer Connections: People, Places, and Events in the Evolution of the Personal Computer Industry</em> in which he was apparently much less diplomatic. Only the first part of the manuscript is publicly available<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>, and that portion contains nothing relevant to this investigation.</p><p>However, the book <a href="https://www.goodreads.com/book/show/10630.They_Made_America">They Made America: From the Steam Engine to the Search Engine: Two Centuries of Innovators</a> contains a chapter on Gary Kildall. The author Sir Harold Evans had access to the full memoir and interviewed some of the people close to Kildall. His coverage of the MS-DOS controversy can be described, to put it mildly, one-sided but still contains several quotes from the unpublished part of the memoir that matter for our purposes.</p><p>Most of these reiterate the API argument:</p><blockquote><p>The first twenty-six function calls of the API in Gates&#8217;s PC-DOS are identical to and taken directly from the CP/M proprietary documents [CP/M manuals].&#8221;</p><p>&#8230;</p><p>If you think Bill Gates invented those function calls, ask him why print string (function 9) ends with a dollar sign. He will not know.&#8221;</p></blockquote><p>There is one place where Kildall actually uses the word &#8220;design&#8221;:</p><blockquote><p>Paterson&#8217;s Seattle DOS was yet another one of the rip-offs of the CP/M design. The CP/M machine code was taken apart, using CP/M&#8217;s own DDT [its debugger], to determine the internal workings of CP/M in order to make a clone of CP/M&#8217;s operation.</p></blockquote><p>Here Kildall speculates that Paterson reverse-engineered CP/M using the <a href="http://www.gaby.de/cpm/manuals/archive/cpm22htm/ch4.htm">DDT debugger</a> to &#8220;determine the internal workings of CP/M". I wish he had been more specific, but it is clear he meant something other than the published system API.</p><p>To find some more concrete and still credible accusations, we will turn to one of Digital Research&#8217;s early leaders: Tom Rolander<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. In 2007, Rolander spoke to Robert Scoble in the podcast episode <a href="https://connectedsocialmedia.com/405/the-rest-of-the-story-how-bill-gates-beat-gary-kildall-in-os-war-part-1/">The rest of the story: How Bill Gates beat Gary Kildall in OS war, Part 1</a>. Among many topics, he offered some concrete claims about MS-DOS appropriating CP/M design. Let&#8217;s start with the most direct one:</p><blockquote><p>Whether Tim Paterson ever looked at a line of code or copied the code is not the issue to me. What he really did is he took it as an architecture. In fact, Gary, if anything, the supreme accomplishment he made was to make it easy to be copied, because Gary used this INT 21 (sic), this interface from an application program through to the operating system that made it transparent. It basically made it so that you couldn't see the actual organization of the data on the disk itself physically. So whether it was a CP/M file system or whether it was a FAT file system, the application program at one level couldn't see that at all, because it just used the int to open a file, read and write a file, and so forth.</p></blockquote><p>At first glance, this is yet another complaint about Paterson using the copyrighted API from Digital Research. But there is an internal architecture aspect of using a single entry for an API. From Evans&#8217; book:</p><blockquote><p>What Paterson essentially did was rewrite the bottom part of the software&#8212;improving the way files were stored and adapting the program to a 16-bit machine&#8212;while copying most of the top part of Kildall&#8217;s operating system interfacing mechanisms. Even if QDOS and CP/M were 80 percent different, as Paterson has insisted, he took almost unaltered Kildall&#8217;s interrupt mechanism&#8212;the key innovation.</p></blockquote><p>The &#8220;interrupt mechanism&#8221; refers to the jump instruction into the BDOS dispatch table that made CP/M adaptable to computers with various amounts of memory.</p><p>There is another controversial aspect of the &#8220;architecture&#8221; we should not forget. In the same podcast, Tom Rolander said:</p><blockquote><p>I think if there's anything that I really think Gary should be remembered for, is being creator, the originator of that layering of the software, so that you were able to take the application program and run it on any piece of hardware. I mean, we all take it for granted right now. At the time that Gary wrote CP/M, people that had little accounting packages or whatever, whether it was the mini-computers or certainly the mainframes at the time, you would have a box of your software that was to run on a Data General Eclipse. You had another box of the software to run on a DEC PDP-11, but the point was that every single application program was specific to a piece of hardware, a hardware vendor, and Gary removed that layer.  </p></blockquote><p>Here Rolander is clearly talking about the component layout of the CP/M, specifically the division of the &#8220;kernel&#8221; into the hardware-independent BDOS and hardware-specific BIOS. This separation allowed manufacturers to easily adapt CP/M to their hardware, as long as it was based on a supported CPU.</p><p>Both of these design elements are about internal workings of CP/M. We will discuss them in some depth after we look at Tim Paterson&#8217;s side of the story.</p><h2>Paterson&#8217;s Responses</h2><p>Tim Paterson defended his work on multiple occasions. Two of his texts that we are going to quote here are <a href="https://www.storiainformatica.it/mydocuments/doshistory/paterson1994-kildall.pdf">The Origins of DOS</a> published in 1994 in response to accusations raised by <a href="https://www.legacy.com/us/obituaries/mercurynews/name/john-wharton-obituary?id=9103161">John Wharton</a>, and his 2007 blog entry <a href="https://dosmandrivel.blogspot.com/2007/08/is-dos-rip-off-of-cpm.html">Is DOS a Rip-Off of CP/M?</a> </p><p>Let&#8217;s start with the blog post. In it, Paterson openly acknowledges that he intentionally implemented the CP/M API:</p><blockquote><p>What may be most surprising about the issue is that there is no significant dispute on the actual relationship between DOS and CP/M. The relationship is simply this: DOS implements the same Application Program Interface (API) as CP/M. The API is how an application program (such as a word processor) asks the operating system to perform a task, such as to read or write a disk file.</p></blockquote><p>Then he reiterates that no CP/M code was copied:</p><blockquote><p>There is no suggestion that I copied any CP/M code when I wrote DOS. (To this day, I have never seen any CP/M code.) And the internal workings of DOS are quite different. For example, unlike CP/M, DOS used the FAT (File Allocation Table) system for organizing disk files, which made it much faster but meant floppy disks were not interchangeable between CP/M and DOS.</p></blockquote><p>I have little to add here. There are no credible claims that Paterson actually copied any CP/M code or directly translated it. There were <a href="https://thenextweb.com/news/theres-a-200k-reward-for-anyone-who-proves-microsoft-ripped-off-ms-dos-source-code">two $100K rewards</a> for anyone who would prove the existence of copied code, and they remain uncollected. Nowadays, when the source code for both operating systems is available, this issue can safely be considered settled<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>.</p><p>Paterson also addresses the part most relevant to our investigation:</p><blockquote><p>One point of disagreement: In his memoirs (quoted by Evans), Kildall claims that I dissected CP/M to learn how it worked. This is not true, and it doesn&#8217;t even make sense. Since DOS worked so differently, there would have been nothing I could learn from CP/M&#8217;s internal workings to help in writing DOS.</p></blockquote><p>Based on the previous quote, it seems clear that by &#8220;internal workings&#8221; Paterson referred to the file systems of the two operating systems. They are indeed completely different and there was no reason for him to debug or disassemble CP/M to learn about them<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a>. Then again, it is not obvious that Kildall wrote about the file systems when he accused Paterson of reverse-engineering CP/M &#8220;internals&#8221;.</p><p>Now, let&#8217;s turn to <em>The Origins of DOS</em>. Just as in the blog post, he acknowledges the API compatibility:</p><blockquote><p>So 86-DOS generally had all the same application visible elements as CP/M&#8212;the function codes, the entry point address, part of the File Control Block layout, etc. I used the 1976 CP/M Interface Guide for my description of the requirements. I also provided some similar commands from the console&#8212;such as DIR, RENAME, ERASE&#8212;although any system would have such functions, regardless of name chosen.</p></blockquote><p>The function codes were necessary for API compatibility. The entry point address (assuming he means the <code>0005h</code> call) is related to the &#8220;interrupt design&#8221; we mentioned earlier - more on that shortly. <a href="https://grokipedia.com/page/File_Control_Block">File Control Block</a>s are part of the API, and Paterson openly acknowledged DOS took them (at least partially) from CP/M, so there is no purpose discussing them here. Console commands fall more under &#8220;look and feel&#8221; than software design.</p><p>In the same text, Paterson emphasizes that his file system (80% of the code) was completely different from CP/M&#8217;s and that he never used any CP/M source code or disassembly. Near the end of the article, he writes:</p><blockquote><p>BIOS (for Basic Input/Output System) was the name given to CP/M&#8217;s hardware dependent layer so that the BDOS (Basic Disk Operating System) and all applications could be hardware independent.</p><p>&#8230;</p><p>I used the term I/O System (never abbreviated) to describe the hardware-dependent layer of 86 DOS, and Microsoft even keeps this layer in a separate file on the disk (IO.SYS) from the machine-independent code (MSDOS.SYS). </p></blockquote><p>My interpretation is that Paterson implicitly acknowledges that his &#8220;I/O System&#8221; (later referred to as the &#8220;MS-DOS BIOS&#8221; in Microsoft documentation) was conceptually inspired by CP/M BIOS. He does not mention it in the paragraph where he lists the similarities between the two operating systems - perhaps because it is not an &#8220;application visible element&#8221;.</p><h2>A Tale of Two Designs</h2><p>Let&#8217;s have a closer look at the two design decisions that we identified as potentially controversial: the component layout (especially the BIOS) and the system call &#8220;interrupt&#8221; mechanism with a single-point entry.</p><h3>Component Layout</h3><p>Based on the <a href="https://vtda.org/docs/computing/DigitalResearch/CPM_1.4_Interface_Guide_1976-78.pdf">CP/M 1.4 Interface Guide</a> (which Paterson likely used as a reference) and a combination of the 86-DOS Programmer&#8217;s Manual and <a href="https://www.pcjs.org/documents/books/mspl13/msdos/encyclopedia/section2/">The MS-DOS Encyclopedia</a>, the following diagram can be drawn to describe the major components of the operating systems:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fd-B!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fd-B!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fd-B!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fd-B!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fd-B!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fd-B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:207761,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/178321556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fd-B!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fd-B!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fd-B!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fd-B!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71ac9ce8-d83b-4aad-82c2-b577dd30bb28_1536x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In both cases:</p><ul><li><p>Applications, including command line shells, invoke a collection of system calls to talk to the operating system kernel.</p></li><li><p>The hardware-independent part of the kernel contains the implementation of those system calls and the file system.</p></li><li><p>The hardware-dependent part of the kernel isolates the hardware components, such as console, disk, serial I/O and printers from the rest of the system. This component is customized for a particular hardware configuration, but its interface to the rest of the kernel is fixed.</p></li></ul><p>In very early versions of CP/M (before 1.3), the entire kernel was a single component. Kildall later split it into the hardware-independent part BDOS, written in PL/M until CP/M 2.0, and the hardware-specific BIOS, written in assembly for each computer model.</p><p>The division between BDOS and BIOS was one of the most important reasons for the popularity of CP/M. Kildall wrote:</p><blockquote><p>I designed a general interface, which I called the BIOS (BASIC I/O System) that a good programmer could change on the spot for their hardware. This little BIOS arrangement was the secret to the success of CP/M.</p></blockquote><p>In his blog post <a href="https://dosmandrivel.blogspot.com/2007/08/contributions-of-cpm.html">The Contributions of CP/M</a>, Tim Paterson sounds a little dismissive of the novelty of the idea:</p><blockquote><p>Certainly the idea of these layers of interfaces was not new to the computer industry. For example, UNIX (like all operating systems) provided an API for application programs, and connected to the hardware with an interface to low-level device driver software. These are equivalent layers to the CP/M&#8217;s BDOS and BIOS, but much more sophisticated. So I am a bit mystified as to what is so revolutionary about CP/M&#8217;s design.</p></blockquote><p>I cannot agree with Paterson here: UNIX (at least the early versions that appeared around the same time or before CP/M) did include low&#8209;level hardware&#8209;interfacing code, but it was compiled directly into the kernel and did not expose a standardized interface. Adding new hardware required modifying the kernel source and recompiling it. Adapting CP/M to new hardware did not require any changes to either BDOS or CCP - only the BIOS had to be re-written and recompiled<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a>.</p><p>Paterson&#8217;s argument about non-originality of BIOS would have been more convincing if he had compared it to the <a href="https://pdp-11.org/os/rt-11">RT-11</a> operating system, which was obviously an inspiration for CP/M. Like CP/M, RT-11 separated the hardware-dependent parts into modules called device handlers. However, BIOS is not the same as RT-11 device handlers: it is a monolithic module that contains a static jump table with 16 entries that are directly called by BDOS. Device handlers were more similar to modern device drivers - they were device-specific, reloadable and relocatable. BIOS is intentionally simpler than the device handlers - it was designed for more primitive hardware and less memory.</p><p>86-DOS was initially developed for the <a href="https://dosmandrivel.blogspot.com/2007/11/first-dos-machine.html">SCP S-100 8086 board</a> which could more accurately be described as a collection of S-100 plug in cards than an integrated computer. It is pretty clear how the operating system would benefit from clean separation of hardware-interfacing code. Therefore, the &#8220;I/O Section&#8221; - more or less the same thing as CP/M BIOS - was adapted. Their APIs are not identical but are very similar and the process of adapting 86-DOS to new hardware was not that different from CP/M&#8217;s.</p><p>In this respect, 86-DOS did adopt the CP/M internal design, and this decision was not driven by API compatibility.</p><h3>System Calls Dispatch Mechanism</h3><p>Now we will look at the &#8220;interrupt mechanism&#8221; that Paterson allegedly copied &#8220;almost unaltered&#8221;. </p><p>Advanced operating systems, including UNIX and nowadays Linux and Windows, run the kernel in a high-privilege mode. User&#8209;mode code invokes system calls via a trap instruction, which raises a software exception and transfers control to a kernel handler. The term &#8220;interrupt&#8221; is usually associated with exceptions caused by hardware but sometimes is used for both hardware and software exceptions.</p><p>For example, UNIX on the DEC PDP-11 computer used the <a href="https://joev.org/2020-08-10-instructions.html">EMT (emulator trap)</a> instruction to invoke system calls from user mode. That instruction caused a kernel-mode handler to run and execute a system call based on the current state of the CPU registers.</p><p>CP/M ran on the 8-bit Intel 8080 CPU which had neither privilege levels nor a trap instruction. The obvious way to implement system calls in such environment would have been to place the system routines at fixed memory addresses and call them directly from the application code. That&#8217;s for instance, how Apple DOS was implemented.</p><p>The problem was - CP/M had to run on systems with varying amounts on RAM and therefore be relocatable while still providing a fixed entry point for system calls, so that application software would not need to be recompiled for each hardware configuration.</p><p>To achieve this, Kildall introduced a &#8220;trap-like&#8221; mechanism. Instead of a software exception which did not exist on Intel 8080, he placed a fixed entry point at address <code>0005h</code>. CP/M at boot time put the following instruction there:</p><pre><code>0005: JMP FBASE</code></pre><p><code>FBASE</code> value was set by the BIOS boot routines (<code>BOOT</code> and <code>WBOOT</code>, &#8220;cold&#8221; and &#8220;warm&#8221; boot respectively) to the memory address of the BDOS entry. This way the application code did not need to know the actual address or size of BDOS which could be different on different machines - it just called <code>0005h</code> with the system call number in register <code>C</code>. Within BDOS there was a simple dispatch table that called the appropriate system call. </p><p>A diagram from CP/M 1.4 Interface Guide gives some insight into this mechanism:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eBk9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eBk9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg 424w, https://substackcdn.com/image/fetch/$s_!eBk9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg 848w, https://substackcdn.com/image/fetch/$s_!eBk9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!eBk9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eBk9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg" width="790" height="865" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:865,&quot;width&quot;:790,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79889,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/178321556?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!eBk9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg 424w, https://substackcdn.com/image/fetch/$s_!eBk9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg 848w, https://substackcdn.com/image/fetch/$s_!eBk9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!eBk9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F48c70ad8-ecee-4662-b2b5-d3db29589be6_790x865.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Obviously, CP/M still required the memory space from <code>0000h</code> to <code>0100h</code> to be available for its &#8220;low storage area&#8221; which prevented some computer models from running the operating system unmodified<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a>. But overall, the solution was effective.</p><p>I think we can all wholeheartedly agree with Rolander and Evans that this design was smart and innovative. But did Paterson actually take it &#8220;almost unaltered&#8221;?</p><p>The Intel 8086 still did not provide privilege levels, but it did introduce the <a href="https://www.felixcloutier.com/x86/intn:into:int3:int1">INT </a>instruction which causes a software interrupt, like the above mentioned EMT on PDP-11 computers. This made Kildall&#8217;s smart design unnecessary, and Tim Paterson took advantage of the instruction: the entry point to 86-DOS and all of its descendants is <code>INT 21h</code><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a>. There was no need to patch the jump target at address <code>0006h</code> from BIOS.</p><p>There is still a &#8220;compatibility&#8221; CALL 5 mechanism that was not recommended for new code and indeed pretty much was never used in DOS programming. The implementation of that compatibility shim is very different than the original CP/M one and perhaps even too clever<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-9" href="#footnote-9" target="_self">9</a>.</p><p>Unsurprisingly, the <code>INT&#8239;21h</code> handler within DOS kernel contains a dispatch table that is equivalent to the BDOS one, but this is simply the straightforward way to implement a system&#8209;call dispatcher; there is no indication Paterson reverse&#8209;engineered CP/M&#8217;s table<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-10" href="#footnote-10" target="_self">10</a>.</p><p>In short, while there is some similarity in design, the claim that Patterson &#8220;took almost unaltered Kildall&#8217;s interrupt mechanism&#8221; is not accurate. The 8086 provided a built&#8209;in facility for software interrupts, and Paterson used it.</p><h2>Conclusion</h2><p>Our little investigation shows that MS&#8209;DOS did adopt CP/M&#8217;s BIOS&#8209;style component layout, but not the internals of CP/M&#8217;s system&#8209;call mechanism. The 8086 made Kildall&#8217;s <code>CALL 5</code> indirection unnecessary, and Paterson used the processor&#8217;s built&#8209;in interrupt instruction instead.</p><p>Not that it really matters. Software designs get reused all the time and borrowing them is far less controversial than copying source code. CP/M itself took a lot from DEC operating systems such as TOPS-10 and especially RT-11. Tracing where the design ideas originate is interesting, but it should not be used to stir up old disputes.</p><p>At this point, CP/M and MS-DOS are part of computing history, and we should be able to compare them and give credit to both of their authors.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Historically, not only PC&#8209;DOS (which is simply a version of MS&#8209;DOS licensed to IBM), but even its predecessor 86&#8209;DOS appeared after CP/M 2.2. However, Tim Paterson did mention using a CP/M manual from 1978 as a reference, which covers version 1.4, and that could explain the confusion.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>The available portion of Kildall&#8217;s memoir can be freely downloaded from the <a href="https://computerhistory.org/blog/in-his-own-words-gary-kildall/">Computer History Museum</a>. Although it does not shed much light on the topic of this post, it is well worth reading,</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Thomas A. Rolander, the author of the MP/M operating system, was a close friend of Gary Kildall. To learn more about him, I encourage you to check Computer History Museum&#8217;s <a href="https://www.computerhistory.org/collections/catalog/102717254/">Rolander, Tom oral history</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>If you are still not convinced, check the results of the <a href="https://zeidmanconsulting.com/DOS_comparisons/">software forensics investigation by Zeiman Consulting</a>. Or compare the source code yourself: CP/M source code can be found at <a href="http://www.cpm.z80.de/source.html">The Unofficial CP/M Web Site</a>. Code for MS-DOS 1.25 that was provided by Tim Paterson himself can be found in a GitHub repository <a href="https://github.com/syeedameen/86-DOS">syeedameen/86-DOS</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>Bill Gates would have had a better case than Kildall if he wanted to claim that Paterson &#8220;ripped off&#8221; his file system - it was Gates and his coworker Marc McDonald who originally designed the FAT filesystem, which Paterson implemented in 86-DOS.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>Strictly speaking there were some additional steps, like writing a boot loader.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>Very popular TRS-80 models I and II could not run CP/M without modifications as their <a href="https://www.trs-80.com/sub-disassem-rom-m1-part-1.htm">ROM mapped to the low memory area</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>A Stack Exchange discussion <a href="https://retrocomputing.stackexchange.com/questions/13929/why-did-the-ms-dos-api-choose-software-interrupts-for-its-interface">Why did the MS-DOS API choose software interrupts for its interface?</a> contains some interesting information on the topic, including a citation from Intel&#8217;s 1978 manuals.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-9" href="#footnote-anchor-9" class="footnote-number" contenteditable="false" target="_self">9</a><div class="footnote-content"><p>In case your head is not spinning enough already, an article by Michal Necasek named <a href="https://www.os2museum.com/wp/who-needs-the-address-wraparound-anyway/">Who needs the address wraparound, anyway?</a> offers some very interesting insight into the implementation of the <code>CALL 5</code> compatibility interface.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-10" href="#footnote-anchor-10" class="footnote-number" contenteditable="false" target="_self">10</a><div class="footnote-content"><p>Not directly related to this discussion - CP/M-86 which was <a href="https://nemanjatrifunovic.substack.com/p/the-late-arrival-of-16-bit-cpm">belatedly</a> released after 86-DOS also uses the <code>INT</code> instruction as a system calls entry point. Not <code>INT 21h</code>, though, but <code>INT E0h</code>. It also maintains <code>CALL 5</code> as a compatibility shim.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Decoding UTF-8. Part VI: Simplistic Non-Validating Decoder]]></title><description><![CDATA[Reconstructing Code Points Without Safety Checks]]></description><link>https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-vi-simplistic</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-vi-simplistic</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Fri, 16 Jan 2026 23:16:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4e3J!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95db00b8-6cf2-42bc-9f62-364971e5fea1_341x341.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In parts 2-5 we spent some time on determining length of a UTF-8 sequence. Now, we move on to actual decoding. We&#8217;ll start not just simple, but simplistic - without validation.</p><p>Validation is important. Not every stream of bytes is valid UTF-8, and assuming it is, leads not only to bugs in functionality, but also <a href="https://capec.mitre.org/data/definitions/80.html">security problems</a>. A UTF-8 decoder needs to operate under assumption that the input stream may not be valid UTF-8 and ready to abort decoding gracefully and report an error when it detects invalid encoding.</p><p>That said, there are some scenarios in which it is OK to skip validation and save some CPU cycles:</p><ul><li><p>The input has already been validated. It is OK to do validation once and then non-validated decoding if the input bytes are immutable.</p></li><li><p>The input is produced by a trusted source. If you are processing strings that you generate internally - i.e. string literals and various resource files that you know are valid UTF-8, it is OK to skip validation.</p></li></ul><p>Here is a minimal C function that performs UTF&#8209;8 decoding without any validation:</p><pre><code>/* A sequence length function we covered in previous posts */
int utf8_sequence_length(unsigned char lead_byte);

/* Returns the code point and advances *p by the number of bytes consumed. */
unsigned int utf8_decode(const unsigned char **p) {
    const unsigned char *s = *p;
    unsigned int cp;

    switch(utf8_sequence_length(s[0])) {
        case 1:
            cp = s[0];
            *p += 1;
            break;
        case 2:
            cp = ((s[0] &amp; 0x1F) &lt;&lt; 6) |
                  (s[1] &amp; 0x3F);
            *p += 2;
            break;
        case 3:
            cp = ((s[0] &amp; 0x0F) &lt;&lt; 12) |
                 ((s[1] &amp; 0x3F) &lt;&lt; 6) |
                  (s[2] &amp; 0x3F);
            *p += 3;
            break;
        default:
            cp = ((s[0] &amp; 0x07) &lt;&lt; 18) |
                 ((s[1] &amp; 0x3F) &lt;&lt; 12) |
                 ((s[2] &amp; 0x3F) &lt;&lt; 6) |
                  (s[3] &amp; 0x3F);
            *p += 4;
            break;
    }

    return cp;
}</code></pre><p>The function does what we described in: <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-i-manual-decoding">Decoding UTF-8. Part I: Manual Decoding</a>.</p><ul><li><p>A one-byte sequence is decoded by taking the low 7 bits from the byte (simply casting the unsigned char to unsigned int).</p></li><li><p>A two-byte sequence is decoded by laying out the five low bits from the first byte (<code>s[0] &amp; 0x1F) </code>to bits 6-10 ( <code>&lt;&lt; 6</code>) and the six low bits from the second byte (<code>s[1] &amp; 0x3F</code>) to bits 0-5.</p></li><li><p>For a three-byte sequence we lay out the four low bits from the first byte (<code>s[0] &amp; 0x0F) </code>to bits 12-15<code> </code>(<code>&lt;&lt; 12</code>), then the six low bits from the second byte (<code>s[1] &amp; 0x3F</code>) to bits 6-11 ( <code>&lt;&lt; 6</code>),  and finally the six low bits from the third byte (<code>s[2] &amp; 0x3F</code>) to bits 0-5.</p></li><li><p>For a four-byte sequence we lay out the three low bits from the first byte (<code>s[0] &amp; 0x07</code>) to bits 18-21 (<code>&lt;&lt; 18</code>), then the six low bits from the second byte (<code>s[1] &amp; 0x3F</code>) to bits 12-17 ( <code>&lt;&lt; 12</code>), then the six low bits from the third byte (<code>s[2] &amp; 0x3F</code>) to bits 6-11 ( <code>&lt;&lt; 6</code>), and finally the six low bits from the fourth byte (<code>s[3] &amp; 0x3F</code>) to bits 0-5.</p></li></ul><p>Assembly (clang 18.1 on aarch64 with -O2) for the three-byte sequence:</p><pre><code>// The three-byte sequence: 1110fghi 10jklmno 10pqrstu
// Starts with: w0 - zero-extended first byte (1110fghi),
//              x20 - start of the sequence
// Ends with: w0 - final codepoint: 00000000 00000000 fghijklm nopqrstu

   and     w8, w0, #0xf              // Extract fghi bits from first byte
   lsl     w0, w8, #12               // Into bits 12-15

   ldrb    w8, [x20, #1]             // Load second byte
   bfi     w0, w8, #6, #6            // Insert jklmno bits into bits 6-11

   ldrb    w8, [x20, #2]             // Load third byte
   bfxil   w0, w8, #0, #6            // Insert pqrstu bits into bits 0-5

   mov     w8, #3                    // length = 3
   b       .utf8_decode_epilog       // go to the function epilog</code></pre><p>Pretty much straightforward. Note how a different instruction is used for each byte:</p><ul><li><p><code>lsl</code>: moves bits upward into an empty register.</p></li><li><p><code>bfi</code>: inserts bits into a middle part of the register</p></li><li><p><code>bfxil</code>: extracts low bits and inserts them into a low part of the register </p></li></ul><p>One interesting thing I learned from inspecting this assembly snippet is that <a href="https://www.scs.stanford.edu/~zyedidia/arm64/bfi_bfm.html">BFI</a> and <a href="https://www.scs.stanford.edu/~zyedidia/arm64/bfxil_bfm.html">BFXIL</a> instructions are aliases for <a href="https://www.scs.stanford.edu/~zyedidia/arm64/bfm.html">BFM</a>. The former inserts a bitfield into a destination register at a specified position, and the latter extracts a bitfield from the source and place it into low-order bits of the destination<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><p>In the next part, we&#8217;ll extend the simple decoder with validation.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Raymond Chen in his blog entry <a href="https://devblogs.microsoft.com/oldnewthing/20220803-00/?p=106941">The AArch64 processor (aka arm64), part 7: Bitfield manipulation</a> complains how the (U)BFM instruction &#8220;hurts his brain&#8221; and is thankful for the aliases. Frankly, I am not a fan of aliases - in my mind assembly should map faithfully to machine code.</p></div></div>]]></content:encoded></item><item><title><![CDATA[The Late Arrival of 16-bit CP/M]]></title><description><![CDATA[How CP/M 2.2&#8217;s Success Delayed the 8086 Port &#8212; and Whether It Really Mattered]]></description><link>https://nemanjatrifunovic.substack.com/p/the-late-arrival-of-16-bit-cpm</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/the-late-arrival-of-16-bit-cpm</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sun, 28 Dec 2025 22:03:09 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ec99a6e7-a7d0-4676-b4d7-b267fbbb064d_1536x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The story of how MS-DOS became the industry standard for the 16-bit business computers at the expense of Digital Research&#8217;s CP/M is somewhat of a legend among fans of computing history. The event has been described in books, articles and documentaries, with most of them focusing on entertaining details such as corporate drama, back-stabbing and nepotism<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><p>Some of the more serious accounts mention one important detail of the story: DRI was late with the port of the CP/M to the Intel 8086. When IBM representatives visited in August of 1980, looking for an operating system for their upcoming PC, only the 8-bit version of CP/M could be demonstrated. IBM eventually turned to Microsoft and selected what became MS&#8209;DOS.</p><p>In this article, we will examine why CP/M&#8209;86 was delayed and, in the end, speculate how much that delay actually mattered.</p><h2>PL/I Development</h2><p>To understand why the CP/M port to the Intel 8086 was delayed, we need to go back to 1978. The current version of CP/M was 1.4, and it was already the industry standard as an operating system for 8-bit business microcomputers.</p><p>At the time, Digital Research founder Dr. Gary Kildall felt that microcomputers needed a high-level application language - something better suited to application development than his PL/M, which was essentially a systems language<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>. At first, he considered Pascal. Then he received a call from Boston&#8209;based computer scientist Dr. Robert Freiburghouse, who invited him to join an ANSI standards committee working on the PL/I&#8209;G dialect. Kildall was familiar with PL/I and did not have a good opinion of it, but after attending several committee meetings he realized he liked the &#8220;Subset G&#8221; proposal and decided to implement a compiler.</p><p>The plan was to complete the new compiler in nine months. Instead, development stretched to more than two years; the compiler was finally released in late 1980 under the name PL/I&#8209;80.</p><p>DRI&#8217;s PL/I received praises for its quality<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a> - after all compilers were Gary Kildall&#8217;s core expertise - yet it saw little adoption and no real market success. Commercial applications for microcomputers continued to be written mostly in assembly languages for another decade. Kildall himself later described the PL/I project as a &#8220;huge diversion&#8221;.</p><p>Worse, prioritizing the PL/I-G project at the expense of CP/M led to a major crisis.</p><h2>Kathryn Strutynski and Release of CP/M 2</h2><p>Originally, CP/M was written as a monolithic piece of software. Once it began to be adopted to various Intel-based microcomputers, Kildall decomposed it into the part that was hardware-independent (BDOS) and the part that had to be re-written for each new machine (BIOS)<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a>. In theory, a computer manufacturer (OEM) could implement its own BIOS using the documentation without any help from DRI. This modular design was another factor that helped CP/M gain popularity.</p><p>Unfortunately, certain assumptions about the disk geometry remained hard-coded into BDOS: the system assumed <a href="https://www.seasip.info/Cpm/format14.html">single&#8209;sided, single&#8209;density 8&#8243; floppy disks with 77 tracks, 26 sectors per track and 128 bytes per sector</a>. Then, larger disks appeared: double&#8209;density 8&#8243; disks, 5.25&#8243; disks with capacities above 300 KB, and most importantly hard disks started to get used with microcomputers. CP/M 1.4 was quickly becoming inadequate.</p><p>Kildall realized that the solution required another redesign, <a href="https://www.seasip.info/Cpm/format22.html">with the disk characteristics moved from BDOS to BIOS</a> so OEMs could define them. The actual implementation of the new design still required time and effort, and customers were growing impatient. </p><p>At that point, DRI had only one technical employee besides Gary Kildall: John Pierce<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a>, whose main responsibility was customer support. Fortunately, the finances looked good, so Kildall went to his former employer, Naval Postgraduate School (NPS) and recruited an old friend: Kathryn &#8220;Kathy&#8221; Strutynski - in his words, &#8220;an astute programmer&#8221;. Strutynski became DRI&#8217;s fourth employee, and soon she was busy working on CP/M 2<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iDLv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iDLv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iDLv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iDLv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iDLv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iDLv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg" width="607" height="427" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:427,&quot;width&quot;:607,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:61000,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/182044523?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iDLv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg 424w, https://substackcdn.com/image/fetch/$s_!iDLv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg 848w, https://substackcdn.com/image/fetch/$s_!iDLv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!iDLv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd2f65648-1029-4bee-b3d5-5b5fa579c362_607x427.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Kathryn Strutynski in 1983 with coworkers at DRI</figcaption></figure></div><p>According to Strutynski, they had only one computer with a hard drive. She would work on it until 2 A.M., and then Kildall would take over. It took the two of them about six weeks to complete the 2.0 release. After that, Kildall went back to his PL/I project, and Strutynski wrote an improved version, CP/M 2.2, that became the most popular edition of the operating system ever released. She earned the nickname &#8220;Mother of CP/M 2&#8221;.</p><h2>Struggles with CP/M-86 </h2><p>From that point on, Kathy Strutynski was in charge of CP/M, and the next step in its evolution was a port to Intel&#8217;s new 16-bit CPU, the 8086.</p><p>This was the first attempt to port CP/M to another microprocessor. The operating system had originally been developed for the 8-bit Intel 8080, and until then it had been released only for that instruction set architecture, even though most CP/M machines built after 1977 used the more advanced Zilog Z80<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a>.</p><p>The scope of the project was intentionally limited: CP/M-86 was envisioned as a pretty much direct translation of CP/M 2.2 to the 8086 architecture. The only significant new feature would be the use of the much larger address space of the 16&#8209;bit processor. That allowed multiple programs to be loaded into memory simultaneously, even though they could not run concurrently. Major new features such as multitasking and networking were left to separate projects called MP/M and CP/NET, led by another of Kildall&#8217;s friends and new employee of DRI, Tom Rolander.</p><p>Given the modest project goals and the proven capabilities of its lead, the original estimate for its release (by the end of 1979) looked reasonable. The 8086 had been designed specifically to make the migration straightforward: translation tables were provided by the Intel manuals. In fact, DRI later released a source-to-source compiler from 8080 to 8086 assembly called XLT86.</p><p>Yet the deadline slipped by more than a year. Ironically, the main reason was the success of CP/M 2.2. Strutynski had to spend way too much time helping OEMs adapt CP/M to their hardware. Because of the modular design of the operating system, the manufacturers were in theory able to write their own BIOS. In practice, they needed a lot of handholding from DRI, and most of that work fell on Strutynski.</p><p>Among the multitude of customers that asked her for help was Microsoft. After seeing VisiCalc on an Apple II, Paul Allen realized the potential of the machine which was previously used mostly in education and by hobbyists. Instead of porting all existing Microsoft products<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a> to the 6502-based computer, Allen came to an idea to develop a hardware card that would contain a Z80 processor and turn the Apple II into a CP/M compatible computer. The device was named <a href="https://nicole.express/2020/nicole-gets-a-real-computer.html">SoftCard</a> and was initially prototyped by a small hardware manufacturer called <a href="https://www.s100computers.com/Hardware%20Folder/Seattle%20Computer%20Products/History/History.htm">Seattle Computer Products</a> (SCP). CP/M was licensed from DRI and it was Strutynski who worked closely with Allen to adapt the operating system to the new card.</p><blockquote><p>I went to Microsoft and my daughter went and we worked on the SoftCard and she slept on Paul Allen&#8217;s couch and I worked on trying to get the code tight enough to fit on the card.</p><p>Kathryn Strutynski</p></blockquote><p>The SoftCard was a surprising success. For a time it was not only the major source of revenue for Microsoft, but (according to Bill Gates) the most popular hardware platform on which CP/M ran. In fact, many Apple II users believed CP/M was a Microsoft product (the copyright message displayed by the card mentioned Microsoft, but not DRI) which later caused confusion when IBM representatives began searching for an operating system for the IBM PC.</p><p>All these success stories helped establish CP/M 2.2 as the de-facto standard for the eight-bit business computers in the early 1980s. Unfortunately, they also drained DRI&#8217;s limited engineering resources, and CP/M&#8209;86 slipped behind schedule.</p><p>In hindsight, it is easy to criticize DRI for investing effort on projects such as PL/I and MP/M instead of focusing on CP/M-86. However, in 1979/1980 it was not clear how close the shift to 16-bits was and which CPU was going to lead. Intel was the first to market with the 8086, but Zilog soon followed with the Z8000 architecture, and then in late 1979 Motorola released the excellent 68000, which IBM even considered for the PC. </p><p>Few OEMs were asking for an 8086 version of CP/M. One that did was SCP - the same company that helped Microsoft design SoftCard. They needed a disk operating system for their 8086 board released in November 1979. In April 1980, after CP/M-86 was still nowhere to be seen, they lost patience and asked their young engineer Tim Paterson to develop a &#8220;quick and dirty&#8221; OS similar to CP/M that would hopefully boost the sales of their board<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-9" href="#footnote-9" target="_self">9</a>. That little operating system, officially named 86-DOS, was eventually purchased by Microsoft and renamed MS-DOS. Paterson has stated on multiple occasions that he would never have begun developing it had CP/M&#8209;86 been available on time.</p><p>When CP/M&#8209;86 finally appeared in early 1981, it initially sold well. DRI&#8217;s newsletter &#8220;Digital Research News&#8221; for the fourth quarter of 1981 came with an article titled &#8220;CP/M-86 Captures Leading Share in 16-Bit World Market&#8221; which estimated that 25% of 16-bit microcomputers were using CP/M-86. The situation quickly changed after IBM PC was released with &#8220;IBM PC DOS&#8221; (rebranded MS-DOS) being offered for a fraction of the price of CP/M-86.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dxLu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dxLu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dxLu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dxLu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dxLu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dxLu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg" width="1345" height="757" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:757,&quot;width&quot;:1345,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:285233,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/182044523?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dxLu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg 424w, https://substackcdn.com/image/fetch/$s_!dxLu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg 848w, https://substackcdn.com/image/fetch/$s_!dxLu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!dxLu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb3c6c1fd-d938-4c3b-8e52-56db8bcf3cba_1345x757.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Digital Research News Volume 1 No 1</figcaption></figure></div><h2>The Aftermath and What-Ifs</h2><p>Although CP/M-86 was never given a fighting chance against PC DOS, the 8-bit versions of CP/M (renamed CP/M-80) continued to sell well for a while. DRI&#8217;s revenues were $6 million in 1981 and grew to $44.6 million in 1983. The company&#8217;s headcount peaked at over 500 employees, including staff in three international offices<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-10" href="#footnote-10" target="_self">10</a>.</p><p>However, by 1985 it was clear that MS-DOS on PC-compatible computers had won. DRI faced layoffs and the departure of many key employees, including Kathy Strutynski who returned to NPS seeking a more secure employment<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-11" href="#footnote-11" target="_self">11</a>. She <a href="https://www.legacy.com/us/obituaries/montereyherald/name/kathryn-strutynski-obituary?pid=143631450">passed away in 2010</a>. Reduced in size, DRI remained in business until 1991 when it was acquired by Novell. The sale made Gary Kildall very rich, but not happy; he died in 1994 at the age of 52, embittered and struggling with alcoholism.</p><p>Some analysts believe that releasing CP/M-86 in December 1979 as planned would have forced IBM to strike a deal with DRI, preventing 86&#8209;DOS from ever being created. In that scenario, DRI could have followed up with the multitasking <a href="https://winworldpc.com/product/concurrent-cpm-86/1x">Concurrent CP/M</a> and with the addition of the <a href="https://nemanjatrifunovic.substack.com/p/history-of-the-gem-desktop-environment">GEM desktop environment</a>, the PC industry would have had a true multitasking graphical OS by 1985.</p><p>In my opinion, a timely release of CP/M-86 would have changed little. The reasons DRI and IBM were not able to reach the deal were complex and the readiness of CP/M-86 would have done little to resolve them. Microsoft would simply have developed a new operating system from scratch to keep the IBM PC project alive - something they were perfectly capable of doing. They had already created (but never released) M-DOS for the 8-bit computers that was more advanced than CP/M, and their Standalone Basic, which included a FAT filesystem, had already been ported to the 8086. After all, the early disk operating systems consisted of just a few kilobytes of machine code.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Searching for &#8220;The Man Who Could/Should Have Been Bill Gates&#8221; will return a ton of low-quality content about the topic. Instead, I suggest reading an excellent article by Jimmy Maher: <a href="https://arstechnica.com/gadgets/2017/06/ibm-pc-history-part-1/">The complete history of the IBM PC, part one: The deal of the century</a>. The book <a href="https://www.goodreads.com/book/show/1427580.Fire_in_the_Valley">Fire in the Valley: The Making of The Personal Computer</a> by Paul Freiberger and Michael Swaine also contains a good description of the events. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>According to the partially published Kildall&#8217;s book <em>Computer Connections</em></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>One such review was published at <a href="https://www.rogerarrick.com/archive/DigitalResearch/PL180/PL180InfoWorldReview1981.pdf">InfoWorld Software Review</a> in 1981.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Dr Gary Kildall: <a href="https://www.digitalresearch.biz/GARY&amp;CPM.HTM">CP/M: A Family of 8-and 16-Bit Operating Systems</a>, originally published in the Byte Magazine.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>Among many duties John Pierce had at DRI was a company photographer. Some of the very interesting photographs of the early DRI can be found <a href="https://www.hogranch.com/digital.research/">at his website</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>A series of short video interviews with Kathryn Strutynski from 2006 can be found at the <a href="https://www.computerhistory.org/collections/catalog/search-catalog/search/keyword:Strutynski/">Computer History Museum Catalog</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>8-bit releases of CP/M ran on the 8080 - compatible processors, such as Intel 8085 and Zilog Z80.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>Microsoft&#8217;s main product - the BASIC interpreter was already shipping with the Apple II. The rest of them - mostly various compilers were written for CP/M.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-9" href="#footnote-anchor-9" class="footnote-number" contenteditable="false" target="_self">9</a><div class="footnote-content"><p>If you are interested in the history of the development of 86-DOS, check out my article <a href="https://nemanjatrifunovic.substack.com/p/birth-of-86-dos">Birth of 86-DOS</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-10" href="#footnote-anchor-10" class="footnote-number" contenteditable="false" target="_self">10</a><div class="footnote-content"><p>According to <a href="https://www.goodreads.com/book/show/10630.They_Made_America">They Made America</a> by Harold Evans. DRI was a private company and there are no public financial records.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-11" href="#footnote-anchor-11" class="footnote-number" contenteditable="false" target="_self">11</a><div class="footnote-content"><p>After she went back to NPS, Kildall came to visit and &#8220;started to cry&#8221;.</p></div></div>]]></content:encoded></item><item><title><![CDATA[An Old-School Introduction to Position Independent Code]]></title><description><![CDATA[Understanding the Concept of Position&#8209;Independent Code Using the Apple II]]></description><link>https://nemanjatrifunovic.substack.com/p/an-old-school-introduction-to-position</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/an-old-school-introduction-to-position</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Mon, 22 Dec 2025 01:27:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c8f3b608-eb56-41ec-aa42-e0d7ac6e67c7_283x136.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Position&#8209;independent code is fundamentally simple: it is machine code that can execute correctly regardless of the memory address at which it is loaded.</p><p>Most texts on the subject look intimidating though, including some very well written ones, such as Eli Bendersky&#8217;s <a href="https://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries">Position Independent Code (PIC) in shared libraries</a>. The topic often appears complicated because it is usually explained in the context of building shared libraries for Linux; a domain that requires discussing linkers, loaders, the ELF format, and other complex mechanisms. I felt it would be easier to understand the core idea of position&#8209;independent code by using a much simpler computer, so I went back to the dawn of personal computing and picked the original Apple II.</p><p>Some of the reasons I chose Apple II for this exercise are:</p><ul><li><p>It was built around the MOS 6502 - a very simple 8-bit CPU with a small address space, no virtual memory, one accumulator register. In one of my previous posts, I argued that <a href="https://nemanjatrifunovic.substack.com/p/6502-is-a-good-starting-point-for">6502 is a Good Starting Point for Beginning Assembly Programming</a>.</p></li><li><p>It includes a built&#8209;in machine&#8209;code monitor and mini&#8209;assembler which are handy for entering and testing machine code. Most other machines from that era would require to use BASIC commands like <code>PEEK</code> and <code>POKE</code> which is doable but less comfortable.</p></li><li><p>I have never had a chance to work with an Apple II<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a> and this is my excuse to finally try it.</p></li></ul><p>To be clear: in this article, mu goal is simply to describe the concept of position-independent code. I am not going to investigate techniques making full Apple II programs position&#8209;independent<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>.</p><h2>Setup</h2><p>I do not have access to an actual Apple II computer. Instead, I used the <a href="https://github.com/AppleWin/AppleWin">AppleWin</a> emulator in Apple ][ 48K mode which emulates the original Apple II from 1977 with 48 KB RAM and with Integer BASIC, Machine Language Monitor and Mini Assembler in ROM. I used <em>APPLE II USER&#8217;S GUIDE</em> by Lon Poole and Steven Cook to learn how to use the Monitor and Mini-Assembler; there was no need for BASIC.</p><p>To read this article, you don&#8217;t need any of that. What is needed is some basic understanding of computer architecture and assembly programming (with any instruction set). If you were never exposed to these topics but still have some programming experience, just spend half an hour playing with <a href="https://skilldrick.github.io/easy6502/">Easy 6502</a> web page, and you will be ready to follow the rest of this post.</p><h2>An Obviously Position Independent Program</h2><p>Let&#8217;s start with a minimal program that is position independent. It will first clear the screen and then print letter &#8216;A&#8217; in the upper left corner.</p><p>I used the Mini-Assembler to enter the code. The listing is here:</p><pre><code>*300L                                   
                                        
0300-   20 58 FC    JSR   $FC58
0303-   A9 C1       LDA   #$C1 
0305-   8D 00 04    STA   $0400
0308-   60          RTS        
...</code></pre><ul><li><p>The <a href="http://www.6502.org/users/obelisk/6502/reference.html#JSR">JSR</a> instruction at address <code>0300</code> calls the monitor routine at <code>$FC58</code> (HOME) to clear the screen. The entry point of the routine is fixed, so it works regardless of where our program itself is loaded.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#LDA">LDA</a> loads the accumulator with <code>$C1</code>, which is normal (i.e. not inverse or flashing) code for letter &#8216;A&#8217; in Apple II character set. It is calculated as the ASCII code for the symbol <code>($41) + $80</code>.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#STA">STA</a> stores the accumulator value (currently <code>$C1</code>) to memory location <code>$400</code>, the beginning of the text screen buffer. Again, this address is absolute and does not depend on our program&#8217;s position in memory.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#RTS">RTS</a> returns to the caller - in our case the Apple Monitor.</p></li></ul><p>Running the code produces the expected result:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cSJK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cSJK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png 424w, https://substackcdn.com/image/fetch/$s_!cSJK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png 848w, https://substackcdn.com/image/fetch/$s_!cSJK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png 1272w, https://substackcdn.com/image/fetch/$s_!cSJK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cSJK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png" width="399" height="163" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:163,&quot;width&quot;:399,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3241,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/158256448?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!cSJK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png 424w, https://substackcdn.com/image/fetch/$s_!cSJK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png 848w, https://substackcdn.com/image/fetch/$s_!cSJK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png 1272w, https://substackcdn.com/image/fetch/$s_!cSJK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F23a39b0a-317d-4a70-8545-17dbb522a38e_399x163.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>To prove the code is truly position independent, we can copy it to address <code>$320</code>, erase the original program at <code>$300</code> and run it:</p><pre><code><code>*320&lt;300.308M
*300:00 00 00 00 00 00 00 00 00
*320L
0320-   20 58 FC    JSR   $FC58         
0323-   A9 C1       LDA   #$C1          
0325-   8D 00 04    STA   $0400         
0328-   60          RTS
*320G</code></code></pre><p>As expected, the result is exactly the same as above.</p><h2>A Loop</h2><h3>Position Independent Loop</h3><p>Let&#8217;s see whether a simple loop is position independent. In this example we&#8217;ll extend the program to write letters &#8220;<em>ABCDEF</em>&#8221; at the top left corner of the screen.</p><p>We&#8217;ll need to keep track of two &#8220;variables&#8221;: the current character to print (stored in register <code>A</code>, just as before), and the current screen position (stored as an offset in register <code>X</code>, counting from the beginning of the text screen area). We&#8217;ll loop until <code>X</code> reaches the value <code>6</code> while incrementing both <code>A</code> and <code>X</code> on each iteration.</p><pre><code>*300L

0300-   20 58 FC    JSR   $FC58   
0303-   A2 00       LDX   #$00 
0305-   A9 C1       LDA   #$C1
0307-   9D 00 04    STA   $0400,X 
030A-   18          CLC  
030B-   69 01       ADC   #$01 
030D-   E8          INX    
030E-   E0 06       CPX   #$06 
0310-   D0 F5       BNE   $0307 
0312-   60          RTS    

*300G</code></pre><ul><li><p>JSR clears the screen, just as above.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#LDX">LDX</a> initializes register <code>X</code> to <code>0</code>.</p></li><li><p>LDA loads register <code>A</code> with the display code for the first character, &#8216;A&#8217;, just as before.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#STA">STA</a> stores the value of the accumulator to the screen memory. Note that we use a different opcode for STA here: <code>9D</code>, vs <code>8D</code> we used above. The difference is in the address mode: here the <a href="http://www.6502.org/users/obelisk/6502/addressing.html#ABX"> Absolute, X addressing mode</a> adds value of <code>X</code> to the address specified in the operand. For instance, if the operand is <code>$400</code> and <code>X</code> contains <code>$01</code>, the value of <code>A</code> will be stored at <code>$401</code>.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#CLC">CLC</a> clears Carry flag, so it does not affect the following instruction.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#ADC">ADC</a> increases the value in the accumulator which changes the value of the character we write on the screen.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#INX">INX</a> increases the value of the <code>X</code> register and points us to the next screen position.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#CPX">CPX</a> compares the contents of register <code>X</code> to <code>$06</code> and sets zero flag if they are equal.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#BNE">BNE</a> branches back to the STA instruction at <code>$0307</code> if the zero flag is not set.</p></li><li><p>RTS returns to the caller.</p></li></ul><p>The result is:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6Eif!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Eif!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png 424w, https://substackcdn.com/image/fetch/$s_!6Eif!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png 848w, https://substackcdn.com/image/fetch/$s_!6Eif!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png 1272w, https://substackcdn.com/image/fetch/$s_!6Eif!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Eif!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png" width="284" height="204" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:204,&quot;width&quot;:284,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3583,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/158256448?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6Eif!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png 424w, https://substackcdn.com/image/fetch/$s_!6Eif!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png 848w, https://substackcdn.com/image/fetch/$s_!6Eif!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png 1272w, https://substackcdn.com/image/fetch/$s_!6Eif!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc8ef3c70-a51c-46dc-a4d7-ffbdaa76603b_284x204.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Most instructions are obviously position-independent, just as in the first example. The exception is BNE at address <code>$310</code>:</p><pre><code>0310-   D0 F5       BNE   $0307</code></pre><p>At first glance, the jump target looks absolute: <code>$0307</code>. If that was literally encoded in the instruction our program would not be position independent. But this is just the disassembler being smart: the <a href="http://www.6502.org/users/obelisk/6502/reference.html#BNE">BNE instruction</a> takes relative offset as the operand. The actual machine code displayed in the same line shows the operand value of <code>$F5</code>. Why? The distance between the next instruction and the target address is <code>$307 - $312 = $F5</code> (negative <code>11</code> decimal).</p><p>Again, let&#8217;s move the program from address <code>$300</code> to <code>$320</code>, clear out the original copy and see whether it works:</p><pre><code>*320L                                   
                                        
0320-   20 58 FC    JSR   $FC58         
0323-   A2 00       LDX   #$00          
0325-   A9 C1       LDA   #$C1          
0327-   9D 00 04    STA   $0400,X       
032A-   18          CLC                 
032B-   69 01       ADC   #$01          
032D-   E8          INX                 
032E-   E0 06       CPX   #$06          
0330-   D0 F5       BNE   $0327         
0332-   60          RTS 

*320G                </code></pre><p>Yep, it&#8217;s the same. And if we look at the BNE line, we can see what the disassembler did: it updated the displayed target to <code>$0327</code>, but the actual operand, the relative offset, remains <code>$F5</code>.</p><pre><code>0330-   D0 F5       BNE   $0327</code></pre><h3>Position Dependent Loop</h3><p>As we have seen, BNE uses a one&#8209;byte relative offset, which allows it to jump up to <code>127</code> bytes backward or <code>128</code> bytes forward from the current instruction. That works fine in our example, but if the body of the loop was large enough, we would need to use the JMP instruction instead:</p><pre><code>*300L

0300-   20 58 FC    JSR   $FC58   
0303-   A2 00       LDX   #$00    
0305-   A9 C1       LDA   #$C1    
0307-   9D 00 04    STA   $0400,X  
030A-   18          CLC      
030B-   69 01       ADC   #$01 
030D-   E8          INX        
030E-   E0 06       CPX   #$06 
0310-   F0 03       BEQ   $0315 
0312-   4C 07 03    JMP   $0307 
0315-   60          RTS

*300G</code></pre><p>The only difference from the position-independent loop is that we replaced the BNE instruction with BEQ + JMP pair. BEQ was necessary to exit the loop, as JMP is not conditionally executed. The important detail is that JMP uses an absolute address, and here it jumps to an address inside the program itself.</p><p>To prove the program is position dependent, we&#8217;ll move it to <code>$320</code> and zero out the original copy at <code>$300</code>:</p><pre><code>*320&lt;300.315M
*300:00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*320L
0320-   20 58 FC    JSR   $FC58         
0323-   A2 00       LDX   #$00          
0325-   A9 C1       LDA   #$C1          
0327-   9D 00 04    STA   $0400,X       
032A-   18          CLC                 
032B-   69 01       ADC   #$01          
032D-   E8          INX                 
032E-   E0 06       CPX   #$06          
0330-   F0 03       BEQ   $0335         
0332-   4C 07 03    JMP   $0307         
0335-   60          RTS                 
*320G</code></pre><p>The program prints &#8216;A&#8217; but then crashes, as expected. JMP still points to address <code>$0307</code> which now contains zeroes.</p><h2>Global Data</h2><p>Now, we&#8217;ll try printing the word &#8220;<em>HELLO</em>&#8221; in the top-left corner of the screen. The main difference from the previous program is that the character values cannot be calculated - instead we read them from memory, and the memory is a part of the program, just as the instructions. On the Apple II there are no ELF sections to keep data separate from code, so we&#8217;ll just place the text immediately after the RTS instruction:</p><pre><code>*300L

0300-   20 58 FC    JSR   $FC58   
0303-   A2 00       LDX   #$00    
0305-   BD 11 03    LDA   $0311,X 
0308-   9D 00 04    STA   $0400,X 
030B-   E8          INX           
030C-   E0 05       CPX   #$05    
030E-   D0 F5       BNE   $0305   
0310-   60          RTS
0311-   C8          INY                 
0312-   C5 CC       CMP   $CC           
0314-   CC CF 00    CPY   $00CF

*300G</code></pre><ul><li><p>JSR calls HOME to clear the screen as always.</p></li><li><p>LDX  initializes <code>X</code> to <code>0</code>. As before, we use <code>X</code> both to index into the screen buffer and to index into the message.</p></li><li><p><a href="http://www.6502.org/users/obelisk/6502/reference.html#LDA">LDA</a> loads the current character from memory using absolute,X addressing. The message bytes are placed immediately after the RTS, so the base address is <code>$0311</code>. Note how using the same index for both the data and the screen position keeps the loop simple.</p></li><li><p>STA writes the character to the appropriate location on the text screen.</p></li><li><p>INX increases <code>X</code> to get the next character and move the position on the screen.</p></li><li><p>CPX checks whether we&#8217;ve reached the end of the string (5 characters).</p></li><li><p>BNE loops back if we have not.</p></li><li><p>RTS returns to the monitor.</p></li><li><p>The five bytes after RTS: <code>C8 C5 CC CC CF</code> correspond to characters &#8216;H&#8217; &#8216;E&#8217; &#8216;L&#8217; &#8216;L&#8217; &#8216;O&#8217; in Apple II character set (ASCII codes + <code>$80</code>)</p></li></ul><p>The result is as expected:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dULm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dULm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png 424w, https://substackcdn.com/image/fetch/$s_!dULm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png 848w, https://substackcdn.com/image/fetch/$s_!dULm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png 1272w, https://substackcdn.com/image/fetch/$s_!dULm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dULm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png" width="283" height="136" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/deb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:136,&quot;width&quot;:283,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3482,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/158256448?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!dULm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png 424w, https://substackcdn.com/image/fetch/$s_!dULm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png 848w, https://substackcdn.com/image/fetch/$s_!dULm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png 1272w, https://substackcdn.com/image/fetch/$s_!dULm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdeb76e4c-e5a0-43a6-a910-734bad45d601_283x136.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>What happens if we move the program to <code>$320</code>?</p><pre><code>*320&lt;300.315M
*320L                                   
                                        
0320-   20 58 FC    JSR   $FC58     
0323-   A2 00       LDX   #$00     
0325-   BD 31 03    LDA   $0331,X
0328-   9D 00 04    STA   $0400,X
032B-   E8          INX          
032C-   E0 05       CPX   #$05
032E-   D0 F5       BNE   $0325 
0330-   60          RTS                 
0331-   C8          INY                 
0332-   C5 CC       CMP   $CC           
0334-   CC CF 00    CPY   $00CF         </code></pre><p>As we can see, the <code>LDA</code> instruction at $0325 still loads from the absolute base address <code>$0311</code>. That address did not change when we moved the program.</p><p>Let&#8217;s erase the old program, and run the relocated one:</p><pre><code>*300:00 00 00 00 00 00 00 00 00 00 00 00
 00 00 00 00 00 00 00 00 00
*320G</code></pre><p>Again, as expected, the result is not &#8220;HELLO&#8221;:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9h65!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9h65!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png 424w, https://substackcdn.com/image/fetch/$s_!9h65!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png 848w, https://substackcdn.com/image/fetch/$s_!9h65!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png 1272w, https://substackcdn.com/image/fetch/$s_!9h65!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9h65!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png" width="293" height="116" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3db9847f-c794-400d-a717-5b742febfc3f_293x116.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:116,&quot;width&quot;:293,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3428,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/158256448?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9h65!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png 424w, https://substackcdn.com/image/fetch/$s_!9h65!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png 848w, https://substackcdn.com/image/fetch/$s_!9h65!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png 1272w, https://substackcdn.com/image/fetch/$s_!9h65!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3db9847f-c794-400d-a717-5b742febfc3f_293x116.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The program now reads whatever bytes happen to be at address <code>$0311</code>, which are zeros after we erased the old program. I miscalculated the size of the program by one when zeroing it out, so the final letter &#8216;O&#8217; is still being printed.</p><h2>Conclusion</h2><p>For a program to be position independent, it must avoid absolute references to its own code and data. Any internal jump or data access has to be expressed through relative addressing so the program can run correctly no matter where it is loaded. Absolute addresses are safe only when they refer to external routines that live at fixed, well&#8209;known locations, such as the Apple II&#8217;s ROM monitor, or an operating system.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>I remember seeing an Apple II in early 1985 when I visited a computer lab at a local University, but it was way too expensive to be owned by individuals in 1980&#8217;s Yugoslavia.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>For a good article on techniques for making 6502 machine code position independent, I suggest Lawrence Woodman&#8217;s article: <a href="https://techtinkering.com/articles/position-independent-code-6502-on-the-commodore-vic-20/">Position Independent Code (6502) on the Commodore VIC-20</a>. There is an associated YouTube video, and a GitHub repository.</p></div></div>]]></content:encoded></item><item><title><![CDATA[PDP-10 and Microcomputers]]></title><description><![CDATA[Some key early software for microcomputers was developed on DEC mainframes]]></description><link>https://nemanjatrifunovic.substack.com/p/pdp-10-and-microcomputers</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/pdp-10-and-microcomputers</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 08 Nov 2025 00:04:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G8ne!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most of us imagine the microcomputer revolution as small groups of nerdy kids working in garages and bedrooms to build technology that would change the world. It is less known that much of the early software for the micros was developed on powerful mainframes and minicomputers, often on <a href="https://www.columbia.edu/cu/computinghistory/pdp10.html">Digital Equipment Corporation&#8217;s PDP-10</a>, a 36-bit mainframe designed for timesharing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G8ne!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G8ne!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G8ne!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G8ne!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G8ne!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G8ne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg" width="1057" height="922" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:922,&quot;width&quot;:1057,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:199625,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/174658034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G8ne!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg 424w, https://substackcdn.com/image/fetch/$s_!G8ne!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg 848w, https://substackcdn.com/image/fetch/$s_!G8ne!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!G8ne!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd4fe9b-13ed-4f41-a4d4-87cab999adfa_1057x922.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p>Some important early microcomputer software products were developed or prototyped on the PDP-10:</p><ul><li><p>Digital Research&#8217;s CP/M - the first commercial operating system for microcomputers.</p></li><li><p>Microsoft&#8217;s early products, including the Altair BASIC.</p></li><li><p>VisiCalc - the first spreadsheet application for personal computers.</p></li></ul><h2>CP/M</h2><p>In 1973, Dr. Gary Kildall worked full-time as an assistant professor at Naval Postgraduate School (NPS) at Monterey, California, and part-time as a consultant for Intel<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. He wrote simulators and cross-assemblers for Intel&#8217;s early microprocessors: the 4004, 8008, and 8080. </p><p>Kildall proposed developing a high&#8209;level language for those microprocessors, called <a href="https://www.retrotechnology.com/dri/dri_plm.html">PL/M</a>. Convincing Intel took some effort as even Intel&#8217;s cofounder and coinventor of the integrated circuit Bob Noyce did not see microprocessors as viable general-purpose CPUs at that time.</p><p>The plan was to first develop a cross-compiler for Intel&#8217;s microprocessors on a PDP-10 mainframe in FORTRAN and then use it to bootstrap a compiler that would run on the <a href="https://www.oldcomputermuseum.com/intellec-8.html">Intellec-8 development system</a>. The cross-compiler was done successfully, but hosting the compiler on the Intellec-8 faced a serious problem: lack of reliable and fast storage.</p><p>Fortunately, a new storage device called floppy disk was getting cheaper, and Shugart Associates donated one to Kildall. He still wasn&#8217;t able to actually use it, as he lacked a disk controller, so he returned to the PDP-10 and used his cross-compiler and simulators to develop a small operating system for 8080-based machines which he called CP/M.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uh3C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uh3C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png 424w, https://substackcdn.com/image/fetch/$s_!uh3C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png 848w, https://substackcdn.com/image/fetch/$s_!uh3C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png 1272w, https://substackcdn.com/image/fetch/$s_!uh3C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uh3C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png" width="560" height="384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:384,&quot;width&quot;:560,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6651,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/174658034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uh3C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png 424w, https://substackcdn.com/image/fetch/$s_!uh3C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png 848w, https://substackcdn.com/image/fetch/$s_!uh3C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png 1272w, https://substackcdn.com/image/fetch/$s_!uh3C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9d3c9ee-0b60-4d4f-b1ab-f2d1bc66e5d0_560x384.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>CP/M was minimalistic, as it was designed to run with very limited amount of memory, but it is clear that it was influenced by the PDP-10 operating system TOPS-10. It used three-letter file extensions, including standard ones like EXE and TXT. Some CP/M commands were directly ported from TOPS-10.</p><p>Gary Kildall was a visionary, innovator, and educator, but not a businessman. He wanted to sell CP/M to Intel for $20,000 and continue teaching at NPS. Intel declined the offer, but soon the first commercial microcomputers appeared and they needed an operating system. Gary&#8217;s wife Dorothy saw a business opportunity and the Kildalls formed a company - Digital Research Inc. (DRI).</p><p>CP/M became an industry standard for 8-bit business computers. Although IBM PC clones that ran Microsoft&#8217;s MS DOS operating system (itself a CP/M lookalike) took over by the mid-1980s, CP/M and its successors such as DR-DOS remained viable alternatives until the rise of Windows.</p><h2>Microsoft BASIC</h2><p>In October 1968 a group of University of Washington employees and graduate students founded a timesharing startup called The Computer Center Corporation, nick-named C-Cubed<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a>.</p><p>C-Cubed leased a PDP-10 computer from DEC - serial number 36<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. The deal with DEC included reduced fees in exchange for testing their operating system TOPS-10. The company started looking for testers, and it just turned out that a computer course in a local private school - Lakeside<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a> had run out of money. C-Cubed offered the students free time on their terminals in return for reporting bugs. Among the students who took up the offer were Paul Allen and Bill Gates.</p><p>They loved the computer<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a>, learned programming in PDP-10 assembly and continued using it until C-Cubed went out of business in early 1970. That was only the beginning. In November 1970 they secured a gig with Information Services Inc. to help write a payroll program in COBOL<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a>, and in late 1972 they joined a <a href="https://case.edu/ech/articles/t/trw-inc">TRW Inc</a> project to develop a real-time operating and dispatch system, (RODS) for the Bonneville Power Administration&#8217;s electrical grid. The project did not progress well, but Allen and Gates were allowed to work on their own project off hours.</p><p>They had an idea to build a traffic control application based on Intel&#8217;s first 8-bit microprocessor: 8008. Allen built a set of tools to develop code for 8008 on PDP-10, including a simulator, cross-assembler and debugger. They eventually completed the system, called it Traf-O-Data and even sold it to three customers. The money they earned was not worth the effort, but the experience and tools they built in the process were.</p><p>In December 1974, Paul Allen bought an issue of Popular Electronics with a new computer called the Altair 8800 on the front page. By then the two friends lived in Cambridge, Massachusetts - Allen was working for Honeywell and Gates attended Harvard University. They saw an opportunity and offered to write a BASIC interpreter for the new microcomputer. The old development tools for the 8008 were adjusted to the new 8080 processor and they went to work.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TG-l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TG-l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TG-l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TG-l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TG-l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TG-l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg" width="739" height="544" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:544,&quot;width&quot;:739,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:89520,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/174658034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TG-l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg 424w, https://substackcdn.com/image/fetch/$s_!TG-l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg 848w, https://substackcdn.com/image/fetch/$s_!TG-l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!TG-l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F56daa2ea-71a8-4781-af20-555b0f6b3989_739x544.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>They used a PDP-10 computer at Harvard&#8217;s Aiken Computation Lab, called Harv-10<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a>, on which they completed the interpreter by late February. Allen flew to New Mexico, demonstrated the software to MITS (producers of Altair), and soon after the two friends moved to Albuquerque to work on their new project full time. They started a company and called it Micro-Soft, later renamed to Microsoft.</p><p>Microsoft continued using various PDP-10 computers as their primary development machines<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a> into the 1980s until microcomputers finally became powerful enough to host productive development environments.</p><h2>VisiCalc</h2><p>In June 1973 Dan Bricklin graduated from MIT with a Bachelor of Science in electrical engineering and computer science. His grades were not good enough to get him into graduate programs he was interested in, and he began looking for a job. He interviewed with Digital Equipment Corp. (DEC) and accepted a position with a group that was developing a computerized typesetter system<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-9" href="#footnote-9" target="_self">9</a>.</p><p>The first product Bricklin worked on within DEC was <a href="https://dl.acm.org/doi/pdf/10.1145/775284.775285">TYPESET-10</a>, a typesetting system that ran on DEC&#8217;s PDP-10 mainframes<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-10" href="#footnote-10" target="_self">10</a>. Later he worked on a word processing system called WPS-8 that ran on DEC&#8217;s low-end PDP-8 minicomputer.</p><p>In 1976, DEC moved Bricklin&#8217;s office to New Hampshire, and he started working at a producer of cash registers called Fasfax where he led the programming department and used Forth and assembly on microcomputers.</p><p>In 1977, Dan Bricklin decided to go back to school and earn an MBA from Harvard. At one lesson, in the spring of 1978, in his own words<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-11" href="#footnote-11" target="_self">11</a> he started &#8220;daydreaming&#8221; of a calculator that could be moved around like a mouse<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-12" href="#footnote-12" target="_self">12</a>. He decided to prototype a software version of his calculator. For that, he used Harvard&#8217;s PDP-10 timesharing computer<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-13" href="#footnote-13" target="_self">13</a> to which he was connected via a <a href="https://terminals-wiki.org/wiki/index.php/DEC_VT05">DEC VT05</a> terminal and wrote the prototype in BASIC. During the development of that first prototype he decided to organize the numbers into named rows and columns.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9vgQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9vgQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png 424w, https://substackcdn.com/image/fetch/$s_!9vgQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png 848w, https://substackcdn.com/image/fetch/$s_!9vgQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png 1272w, https://substackcdn.com/image/fetch/$s_!9vgQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9vgQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png" width="560" height="384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:384,&quot;width&quot;:560,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2936,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/174658034?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9vgQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png 424w, https://substackcdn.com/image/fetch/$s_!9vgQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png 848w, https://substackcdn.com/image/fetch/$s_!9vgQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png 1272w, https://substackcdn.com/image/fetch/$s_!9vgQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb10c0851-5f90-4ca2-bc62-bd4aebb6b343_560x384.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The second prototype followed a few months later on a borrowed Apple II computer with a <a href="https://www.willegal.net/appleii/appleii-paddles.htm">game paddle</a> acting as a mouse.</p><p>The production version of VisiCalc was coded by Bricklin&#8217;s friend Bob Frankston. He did not use a PDP-10, but a similar mainframe timesharing system: MIT&#8217;s Honeywell 6180<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-14" href="#footnote-14" target="_self">14</a> running Multics. The main reason was that Frankston had learned how to cross-develop code for 6502 microprocessors on Multics while consulting with a small company named <a href="https://en.wikipedia.org/wiki/ECD_Corporation">ECD Corporation</a><a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-15" href="#footnote-15" target="_self">15</a>. He worked at night when compute time was cheaper, sharing the computer with Honeywell developers who worked on the Ada programming language.</p><p>VisiCalc became the &#8220;killer app&#8221; for Apple II and the model for every spreadsheet application that followed.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Sources I used for the chapter on CP/M include: <a href="https://nemanjatrifunovic.substack.com/publish/post/174658034">The History of CP/M by Gary Kildall</a>, <a href="https://www.goodreads.com/book/show/10630.They_Made_America">They Made America: From the Steam Engine to the Search Engine: Two Centuries of Innovators by Harold Evans</a>, <em>Computer Connections</em> by Gary Kildall and <a href="https://www.theregister.com/2024/08/02/cpm_50th_anniversary">50 years ago, CP/M started the microcomputer revolution by Liam Proven</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>The main source for the chapter on Microsoft is <a href="https://www.goodreads.com/book/show/10139649-idea-man">Idea Man by Paul Allen</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>From an <a href="https://americanhistory.si.edu/comphist/gates.htm">interview with Bill Gates by David Allison</a>. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>The article <a href="https://tatler.lakesideschool.org/7088/science-technology/a-history-of-cs-at-lakeside/">A History of CS at Lakeside</a> has more details about Allen and Gate&#8217;s adventures with computers at their school.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>After the testing was over, the boys hacked the administrator account to get more computer time by tapping into other users&#8217; accounts. They were caught before they could do any damage and at first were banned from accessing the computer, but after a couple of months C-Cubed invited them back and offered more free computer time in exchange for improving the BASIC compiler.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p>They did not enjoy the experience. According to Paul Allen: &#8220;COBOL was a cumbersome, wordy language, and the accounting program a slog.&#8221;</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>More about Bill Gate&#8217;s days at Harvard: <a href="https://www.thecrimson.com/article/2025/6/7/bill-gates-reunion-1975/">When Bill Gates Wrote Microsoft&#8217;s First Code on a Harvard Mainframe</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>For a while they leased computer time from the Albuquerque school district, then switched to &#8220;a faster one in Denver&#8221;.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-9" href="#footnote-anchor-9" class="footnote-number" contenteditable="false" target="_self">9</a><div class="footnote-content"><p>The main source for the chapter on VisiCalc is <a href="https://conservancy.umn.edu/items/82511821-e518-42f4-89da-90a7e14fc0e0">Oral history interview with Dan Bricklin and Bob Frankston</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-10" href="#footnote-anchor-10" class="footnote-number" contenteditable="false" target="_self">10</a><div class="footnote-content"><p>By that time the PDP-10 was officially renamed to DECsystem-10, but was still informally referred to by its original name.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-11" href="#footnote-anchor-11" class="footnote-number" contenteditable="false" target="_self">11</a><div class="footnote-content"><p>From Bricklin&#8217;s web site <a href="http://www.bricklin.com/history/saiidea.htm">Bricklin.com: The Idea</a>. Some sources mention Dan Bricklin getting the idea for spreadsheets after watching a professor manually calculate a financial model on a blackboard, but Bricklin himself did not mention it. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-12" href="#footnote-anchor-12" class="footnote-number" contenteditable="false" target="_self">12</a><div class="footnote-content"><p>Mouse devices were very uncommon at that time, but Bricklin was aware of their existence.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-13" href="#footnote-anchor-13" class="footnote-number" contenteditable="false" target="_self">13</a><div class="footnote-content"><p>It is quite possible that Bricklin used the same PDP-10 computer (Harv-10) as Gates and Allen three years earlier.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-14" href="#footnote-anchor-14" class="footnote-number" contenteditable="false" target="_self">14</a><div class="footnote-content"><p> According to <a href="https://www.multicians.org/site-mit.html">Multics: Site History: MIT</a>, the original Multics machine, the GE-645 was replaced by an H-6180 in 1972.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-15" href="#footnote-anchor-15" class="footnote-number" contenteditable="false" target="_self">15</a><div class="footnote-content"><p><a href="https://rmf.vc/ImplementingVisiCalc">Implementing VisiCalc</a> contains Frankston&#8217;s account of the VisiCalc development.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Decoding UTF-8. Part V: Benchmarking Sequence Length Calculations]]></title><description><![CDATA[Measuring throughput of some methods for determining UTF-8 sequence lengths]]></description><link>https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-v-benchmarking</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-v-benchmarking</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 25 Oct 2025 21:58:34 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ZQbI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In Parts II, III, and IV of this series on decoding UTF-8, we examined several methods for determining the length of a UTF-8 encoded byte sequence. We presented the algorithms and inspected the generated assembly, but we did not measure performance. In this post we run simple tests to compare the throughput of the three methods.</p><h2>Test Descriptions</h2><p>To recap, the three methods we compare here are:</p><p>The &#8220;bitmask&#8221; method, described in <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-ii-determining">Decoding UTF-8. Part II: Determining Sequence Length - a Straightforward Approach</a>:</p><pre><code>int utf8_sequence_length(unsigned char lead_byte) {
    if ((lead_byte &amp; 0x80) == 0) {
        // Single byte (0opqrstu)
        return 1;
    } else if ((lead_byte &amp; 0xE0) == 0xC0) {
        // Two-byte sequence (110xxxxx)
        return 2;
...
}</code></pre><p>The &#8220;lookup&#8221; method, described in <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-iii-determining">Decoding UTF-8. Part III: Determining Sequence Length - A Lookup Table</a>:</p><pre><code><code>int utf8_sequence_length(unsigned char lead_byte) {
 // Hard-coded lookup table for UTF-8 lead byte lengths
 static const unsigned char lookup[256] = {
...
};

  // Access the hard-coded table to determine the sequence length
  return lookup[lead_byte];
}</code></code></pre><p>The &#8220;countlz&#8221; method, which uses hardware support for counting leading zeros in a byte, described in <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-iv-determining">Decoding UTF-8. Part IV: Determining Sequence Length - Counting Leading Bits</a>:</p><pre><code><code>int utf8_sequence_length(unsigned char lead_byte) {
    switch (std::countl_one(lead_byte)) {
        case 0: return 1;
        case 2: return 2;
        case 3: return 3;
        case 4: return 4;
        default: return 0; // invalid lead
    }
}</code></code></pre><p> There are two sets of data in the test:</p><ol><li><p>Pure ASCII text.</p></li><li><p>Cyrillic text with ASCII HTML tags.</p></li></ol><p>I used two different compilers:</p><ol><li><p>Clang 18.1.3</p></li><li><p>GCC 13.3.0</p></li></ol><p>The results presented in this article were obtained on a Microsoft Surface laptop with a Snapdragon X1E80100 12-core CPU @ 3.40 GHz and 16 GB RAM, running Ubuntu 22.04 under WSL 2.</p><p>The code for the benchmarks can be found at: <a href="https://github.com/nemtrif/utfbench/tree/main/seqlen">https://github.com/nemtrif/utfbench/tree/main/seqlen</a> </p><p>My expectations based on the generated assembly were:</p><ul><li><p>For the ASCII text, I expected the straightforward &#8220;bitmask&#8221; method to perform best, as the data is very friendly to branch prediction, and the branch executed is very efficient. I expected the &#8220;countlz&#8221; method to perform somewhat worse, and the &#8220;lookup&#8221; method to perform worst.</p></li><li><p>For the ASCII/Cyrillic mix, I thought branch prediction would be much less effective and the branchless variants would perform better. I expected &#8220;countlz&#8221; to be fastest, followed by &#8220;lookup&#8221;.</p></li></ul><p>Let&#8217;s see how good my predictions were.</p><h2>Clang 18.1.3 Results</h2><p>The code was compiled with:</p><pre><code>clang++ -O2 --std=c++20</code></pre><p>The results for ASCII text are:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZQbI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZQbI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZQbI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZQbI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZQbI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZQbI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg" width="1456" height="875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:875,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:77367,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/173590281?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZQbI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ZQbI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ZQbI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ZQbI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2f075eb1-6f39-4e44-b9d2-2d8a57d93c47_1653x993.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">ASCII Text</figcaption></figure></div><p>I did expect the &#8220;bitmask&#8221; version to perform best. For ASCII text the hot path executes a TBNZ that checks the highest bit, sets the return value to 1, and jumps to the function epilogue (assuming the function is not inlined). That said, the sixfold difference between the bitmask and table-based methods was surprising.</p><p>The same setup but with Cyrillic HTML produced the following results:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fvI8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fvI8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fvI8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fvI8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fvI8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fvI8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg" width="1456" height="875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:875,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:79867,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/173590281?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!fvI8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg 424w, https://substackcdn.com/image/fetch/$s_!fvI8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg 848w, https://substackcdn.com/image/fetch/$s_!fvI8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!fvI8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fbbfb17-103b-441a-ae88-9a3e496ca618_1653x993.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Cyrillic HTML</figcaption></figure></div><p>I expected the mix of Cyrillic and ASCII characters to confuse the branch predictor, and it did, but the &#8220;bitmask&#8221; method was still twice as fast as the &#8220;lookup&#8221; method. The &#8220;countlz&#8221; method performing worst was definitely a surprise given the small size of the compiler-generated lookup table and the hardware-assisted bit counting.</p><h2>GCC 13.3.0 Results</h2><p>The code was compiled with:</p><pre><code>g++ -O2 --std=c++20</code></pre><p>The results for ASCII text:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qNk_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qNk_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qNk_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qNk_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qNk_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qNk_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg" width="1456" height="875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:875,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83085,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/173590281?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qNk_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg 424w, https://substackcdn.com/image/fetch/$s_!qNk_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg 848w, https://substackcdn.com/image/fetch/$s_!qNk_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!qNk_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6dd2c0ea-2b01-46a4-acc8-69fcd9b90444_1653x993.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">ASCII Text</figcaption></figure></div><p>The only noteworthy difference between these results and Clang&#8217;s is the performance of the countlz method, which processed almost five times more data when compiled with GCC. The detailed explanation can be found in my recent article <a href="https://nemanjatrifunovic.substack.com/p/when-compiler-optimizations-hurt">When Compiler Optimizations Hurt Performance</a> where we saw how a compiler-generated lookup table meant to optimize <code>switch-case</code> statements actually hurt performance. GCC did not perform the optimization and that is the reason it produced better code. </p><p>Benchmark with Cyrillic HTML produced the following results:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ai_N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ai_N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ai_N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ai_N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ai_N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ai_N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg" width="1456" height="875" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:875,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:80122,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/173590281?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ai_N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ai_N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ai_N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ai_N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb6ecf159-cdb1-4509-915c-c859bf2b4806_1653x993.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Cyrillic HTML</figcaption></figure></div><p>There is little difference between GCC and Clang. The &#8220;countlz&#8221; method was hurt by branches and it ended up being roughly equivalent to the lookup method. </p><h2>Conclusion</h2><p>If there is a conclusion to be made from this exercise, it is to be very careful about avoiding branches by creating lookup tables - either manually or via compiler optimizations.</p><p>The boring, straightforward &#8220;bitmask&#8221; method easily won, even when data was not helping the branch predictor. Memory access turned out to be more expensive even without any cache misses.</p><p></p><p></p><p></p><p></p><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Getting Started with the Fuse Emulator for ZX Spectrum]]></title><description><![CDATA[A gentle introduction to the Free Unix Spectrum Emulator]]></description><link>https://nemanjatrifunovic.substack.com/p/getting-started-with-the-fuse-emulator</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/getting-started-with-the-fuse-emulator</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 18 Oct 2025 00:11:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!-ee7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The <a href="https://www.bbc.com/news/articles/cpvzp80jv07o">Sinclair ZX Spectrum</a> was one of the best-selling home computers ever released. Its popularity and simplicity led to development of many emulators over the years.</p><p>Unfortunately, most emulators are eventually abandoned by their developers. One of the oldest ZX Spectrum emulators still under active development is <a href="https://fuse-emulator.sourceforge.net/">Fuse - the Free Unix Spectrum Emulator</a>. First released in 1999 by <a href="https://www.shadowmagic.org.uk/">Philip Kendall</a>, the emulator remains Unix-first, although it&#8217;s also available on macOS, Windows, Android, and a few other systems.</p><p>Fuse emulates Sinclair&#8217;s original Spectrum models, Amstrad&#8217;s successors, and even some clones like the Pentagon. It does not support the modern ZX Spectrum Next; for Next emulation options, see the <a href="https://wiki.specnext.dev/Emulators">SpecNext Wiki</a>.</p><p>This little guide is a getting-started introduction that walks you through the installation and basic usage of Fuse on Windows without covering any advanced topics.</p><h2>Installation</h2><p>The installer can be downloaded from the official SourceForge page: <a href="https://sourceforge.net/projects/fuse-emulator/">https://sourceforge.net/projects/fuse-emulator/</a>.</p><p>By default, the emulator installs to <code>C:\Program Files (x86)\Fuse</code>, since it is a 32-bit build.</p><p>Note the file <strong>fuse.html</strong> in that directory. It contains the list and short descriptions of most command-line options for Fuse, as well as the menu commands and key shortcuts. You may find it handy later as you get more familiar with the emulator, but we will not need it right now.</p><h2>Starting Fuse and Loading a Game</h2><p>When you start Fuse for the first time, the following screen will appear:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ZlKS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ZlKS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png 424w, https://substackcdn.com/image/fetch/$s_!ZlKS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png 848w, https://substackcdn.com/image/fetch/$s_!ZlKS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png 1272w, https://substackcdn.com/image/fetch/$s_!ZlKS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ZlKS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png" width="645" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:645,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8733,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ZlKS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png 424w, https://substackcdn.com/image/fetch/$s_!ZlKS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png 848w, https://substackcdn.com/image/fetch/$s_!ZlKS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png 1272w, https://substackcdn.com/image/fetch/$s_!ZlKS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffd2bcc4e-9c40-4ecb-ab44-63994c210de2_645x559.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Chances are it will actually be much smaller, so the first thing to do is resize it by dragging the bottom-right corner until it&#8217;s large enough to work with.</p><p>Programs for the original ZX Spectrum were distributed mostly on cassette audio tapes. Most titles are preserved in <a href="https://worldofspectrum.org/faq/reference/formats.htm">emulator file formats</a> - the most popular one being TZX. Loading a program into Fuse is as simple as finding a <code>tzx</code> file and dragging it onto the emulator window.</p><p>For example, here is how to load the legendary Jetpac game.</p><ul><li><p>Search online for something like &#8220;world of spectrum jetpac&#8221;</p></li><li><p>Most likely, the top page in the search result will be <a href="https://worldofspectrum.net/item/0009362/">Jetpac - World of Spectrum Classic</a></p></li><li><p>Download <a href="https://spectrumcomputing.co.uk/zxdb/sinclair/entries/0009362/Jetpac.tzx.zip">Jetpac.tzx.zip</a>. You may also want to download or at least read the instructions contained in the file <code>Jetpac.txt</code> linked from that page</p></li><li><p>Extract the zip file to get file <code>Jetpac.tzx</code>.</p></li><li><p>Drag <code>Jetpac.tzx</code> onto the Fuse window (or you can use File, Open from the menu if you want). The result should look like this:</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jlac!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jlac!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png 424w, https://substackcdn.com/image/fetch/$s_!Jlac!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png 848w, https://substackcdn.com/image/fetch/$s_!Jlac!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png 1272w, https://substackcdn.com/image/fetch/$s_!Jlac!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jlac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png" width="950" height="557" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:557,&quot;width&quot;:950,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:27920,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Jlac!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png 424w, https://substackcdn.com/image/fetch/$s_!Jlac!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png 848w, https://substackcdn.com/image/fetch/$s_!Jlac!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png 1272w, https://substackcdn.com/image/fetch/$s_!Jlac!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcd7f4277-8db5-4f24-8e1a-92ed2d3c8f1d_950x557.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Enjoy the game:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!w9VE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!w9VE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png 424w, https://substackcdn.com/image/fetch/$s_!w9VE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png 848w, https://substackcdn.com/image/fetch/$s_!w9VE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png 1272w, https://substackcdn.com/image/fetch/$s_!w9VE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!w9VE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png" width="640" height="480" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:480,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2841,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!w9VE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png 424w, https://substackcdn.com/image/fetch/$s_!w9VE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png 848w, https://substackcdn.com/image/fetch/$s_!w9VE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png 1272w, https://substackcdn.com/image/fetch/$s_!w9VE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5eeaf91b-b4d6-44a5-9e68-7e99f14edd0a_640x480.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>You can reset the emulator by selecting Machine, Reset&#8230; on the Fuse menu, or by hitting F5.</p><p></p><h2>Beyond Games - Using the Keyboard</h2><p>Unless you have the Spectrum keyboard layout memorized, make sure to select &#8220;Keyboard&#8230;&#8221; from the Help menu. An image of the original Spectrum 48K keyboard will show up:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-ee7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-ee7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png 424w, https://substackcdn.com/image/fetch/$s_!-ee7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png 848w, https://substackcdn.com/image/fetch/$s_!-ee7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png 1272w, https://substackcdn.com/image/fetch/$s_!-ee7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-ee7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png" width="644" height="849" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:849,&quot;width&quot;:644,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:38203,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-ee7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png 424w, https://substackcdn.com/image/fetch/$s_!-ee7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png 848w, https://substackcdn.com/image/fetch/$s_!-ee7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png 1272w, https://substackcdn.com/image/fetch/$s_!-ee7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb5bbe2ff-ff6f-4b72-aa26-9c4912fdfaab_644x849.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>Some key mappings to remember:</p><ul><li><p>Spectrum CAPS SHIFT key maps to SHIFT key on a PC keyboard;</p></li><li><p>Spectrum SYMBOL SHIFT key maps to CTRL on a PC keyboard;</p></li><li><p>Spectrum BREAK SPACE key maps to the space bar on a PC keyboard.</p></li></ul><p>Press the &#8220;P&#8221; key, and the screen should look like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!a_jn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a_jn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png 424w, https://substackcdn.com/image/fetch/$s_!a_jn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png 848w, https://substackcdn.com/image/fetch/$s_!a_jn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png 1272w, https://substackcdn.com/image/fetch/$s_!a_jn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a_jn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png" width="641" height="549" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:549,&quot;width&quot;:641,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:9014,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!a_jn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png 424w, https://substackcdn.com/image/fetch/$s_!a_jn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png 848w, https://substackcdn.com/image/fetch/$s_!a_jn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png 1272w, https://substackcdn.com/image/fetch/$s_!a_jn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa63d28f1-5b17-4def-9a55-8bfc1f9d8dc9_641x549.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now type the following:</p><pre><code> "Hello Speccy"</code></pre><p>and press the ENTER key. Note that the quote sign is on the P key and to type it you need to press Ctrl+P.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FQCH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FQCH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png 424w, https://substackcdn.com/image/fetch/$s_!FQCH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png 848w, https://substackcdn.com/image/fetch/$s_!FQCH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png 1272w, https://substackcdn.com/image/fetch/$s_!FQCH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FQCH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png" width="636" height="555" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ee58e925-109f-4ec7-940b-725ba47a2179_636x555.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:555,&quot;width&quot;:636,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8166,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FQCH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png 424w, https://substackcdn.com/image/fetch/$s_!FQCH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png 848w, https://substackcdn.com/image/fetch/$s_!FQCH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png 1272w, https://substackcdn.com/image/fetch/$s_!FQCH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fee58e925-109f-4ec7-940b-725ba47a2179_636x555.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>To get started with the 48K ZX Spectrum, make sure to check the official <a href="http://www.retro8bitcomputers.co.uk/Content/downloads/manuals/ZX-Spectrum-48K-Manual.pdf">ZX Spectrum Introduction</a>, written by Steven Vickers and Robin Bradbeer. Not everything in the book applies to the emulator, but the chapter about keyboard use is essential. </p><p>If you are intimidated by the 48K keyboard, switch to a later model which enables typing commands without the shortcuts. To do that, From the &#8220;Machine&#8221; menu pick &#8220;Select&#8230;&#8221; (or just press F9) and select the model you want to use. My suggestion is Spectrum 128K. Once you select it, the emulator will reset, and the screen will look like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!p2lq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!p2lq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png 424w, https://substackcdn.com/image/fetch/$s_!p2lq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png 848w, https://substackcdn.com/image/fetch/$s_!p2lq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png 1272w, https://substackcdn.com/image/fetch/$s_!p2lq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!p2lq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png" width="641" height="559" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:559,&quot;width&quot;:641,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10118,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!p2lq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png 424w, https://substackcdn.com/image/fetch/$s_!p2lq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png 848w, https://substackcdn.com/image/fetch/$s_!p2lq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png 1272w, https://substackcdn.com/image/fetch/$s_!p2lq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F452ea51f-3a12-4f36-b18e-08e23c26145e_641x559.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>By using the arrow keys, select the second option: 128 BASIC, and the screen looks like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EqNw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EqNw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png 424w, https://substackcdn.com/image/fetch/$s_!EqNw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png 848w, https://substackcdn.com/image/fetch/$s_!EqNw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png 1272w, https://substackcdn.com/image/fetch/$s_!EqNw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EqNw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png" width="643" height="558" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:558,&quot;width&quot;:643,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8698,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!EqNw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png 424w, https://substackcdn.com/image/fetch/$s_!EqNw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png 848w, https://substackcdn.com/image/fetch/$s_!EqNw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png 1272w, https://substackcdn.com/image/fetch/$s_!EqNw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feadbc84e-fc57-453e-8a4d-7b1b37a1edaa_643x558.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now you can type without any shortcuts:</p><pre><code>print "Hello Speccy 128" </code></pre><p>(note that quotes are still <code>Ctrl+P</code>) and the screen will look like:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SiDb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SiDb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png 424w, https://substackcdn.com/image/fetch/$s_!SiDb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png 848w, https://substackcdn.com/image/fetch/$s_!SiDb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png 1272w, https://substackcdn.com/image/fetch/$s_!SiDb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SiDb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png" width="640" height="556" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:556,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:8896,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/168591359?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!SiDb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png 424w, https://substackcdn.com/image/fetch/$s_!SiDb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png 848w, https://substackcdn.com/image/fetch/$s_!SiDb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png 1272w, https://substackcdn.com/image/fetch/$s_!SiDb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa62d1ee5-6d78-4e80-aa7d-f606f04a9c9b_640x556.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Check out the <a href="https://worldofspectrum.net/ZXSpectrum128Manual/sp128pfc.html">ZX Spectrum 128 Introduction</a> manual</p><h2>Resources for Programming ZX Spectrum</h2><p>If you are interested in learning BASIC programming, the book to use is <a href="https://worldofspectrum.org/ZXBasicManual/">SINCLAIR ZX SPECTRUM BASIC Programming</a> by Steven Vickers.</p><p>The next step is <a href="https://archive.org/details/spectrum-machine-language-for-the-absolute-beginner">Williem Tang's "Spectrum Machine Language For The Absolute Beginner"</a>.</p><p>If you want to make any non-trivial programs for ZX Spectrum, developing directly on Fuse is not optimal. Instead, use a modern PC to edit the code, cross-compile it, then load the resulting <code>tzx</code> or snapshot into Fuse for testing. </p><p>Setting up such an environment is a topic for another post.</p><p></p>]]></content:encoded></item><item><title><![CDATA[When Compiler Optimizations Hurt Performance]]></title><description><![CDATA[Branches can perform better than table lookups]]></description><link>https://nemanjatrifunovic.substack.com/p/when-compiler-optimizations-hurt</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/when-compiler-optimizations-hurt</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sun, 12 Oct 2025 19:15:37 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/51f6aa53-fefd-406e-a809-bfd26f964c7d_733x279.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Recently I have been working on benchmarks comparing techniques for calculating UTF-8 sequence lengths.</p><p>The method I described in <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-iv-determining">Decoding UTF-8. Part IV: Determining Sequence Length - Counting Leading Bits</a> uses hardware-assisted counting of leading zero bits:</p><pre><code>#include &lt;bit&gt;
int utf8_sequence_length(unsigned char lead_byte) {
    switch (std::countl_one(lead_byte)) {
        case 0: return 1;
        case 2: return 2;
        case 3: return 3;
        case 4: return 4;
        default: return 0; // invalid lead
    }
}</code></pre><p>I was pretty disappointed with the performance of this function. It was processing between 438 MB/s and 462 MB/s of text data which was far less than the &#8220;naive&#8221; method described at <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-ii-determining">Decoding UTF-8. Part II: Determining Sequence Length - a Straightforward Approach</a>.</p><p>As we saw in the Part IV post, the compiler (clang++ 18.1.3, aarch64) emits a small lookup table to avoid branching:</p><pre><code>        adrp    x9, .Lswitch.table.utf8_sequence_length(unsigned char)
        add     x9, x9, :lo12:.Lswitch.table.utf8_sequence_length(unsigned char)
        ldr     w0, [x9, w8, uxtw #2]
...
.Lswitch.table.utf8_sequence_length(unsigned char):
        .word   1
        .word   0
        .word   2
        .word   3
        .word   4</code></pre><p>The lookup table generated by the compiler is a <a href="https://mathworld.wolfram.com/Degenerate.html">degenerate case</a> of a jump table, which is a <a href="https://developer.arm.com/documentation/ka002584/latest/">common optimization for switch-case statements</a>. The &#8220;naive&#8221; code from Part II uses branching instructions instead and processes over 2000 MB/s. Obviously, the branch predictor did its magic for the case of pure ASCII text, but the performance gap still surprised me<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>.</p><p>Playing with the <a href="https://perfwiki.github.io/main/">Linux perf tool</a> on a WSL Linux installation turned to be a pretty frustrating experience. It did point me to a very high number of cycles stalled in the back-end which often indicates that CPU is waiting for memory, but I couldn&#8217;t get <a href="https://perfwiki.github.io/main/tutorial/#source-level-analysis-with-perf-annotate">perf annotate</a> to work. </p><p>In any case, what I had was enough to let me try disabling jump tables; with </p><pre><code>clang++ -O2 -fno-jump-tables --std=c++20 </code></pre><p>the switch-case part of the function compiles to:</p><pre><code>        cmp     w0, #2
        b.gt    .LBB0_4
        cbz     w0, .LBB0_6
        cmp     w0, #2
        b.eq    .LBB0_5
.LBB0_3:
        mov     w0, wzr
        ret
.LBB0_4:
        cmp     w0, #3
        ccmp    w0, #4, #4, ne
        b.ne    .LBB0_3
.LBB0_5:
        ret
.LBB0_6:
        mov     w0, #1
        ret</code></pre><p>Lo and behold, the performance became comparable to the &#8220;naive&#8221; function from Part II.</p><p>I repeated the experiment using GNU g++ for AArch64. In that case, <code>-fno-jump-tables</code> had no effect because g++ never emitted a lookup table.</p><p>Not surprisingly, it turned out I was not the first to come up with this observation. For instance, there is an excellent article by Julian Squires from 2017 on the same topic, but focusing on x86-x64 platform: <a href="https://www.cipht.net/2017/10/03/are-jump-tables-always-fastest.html">Are Jump Tables Always Fastest?</a></p><p></p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>To avoid spoilers for my upcoming article on benchmarking different techniques for determining UTF-8 sequence length, I present only benchmarks with ASCII text.</p></div></div>]]></content:encoded></item><item><title><![CDATA[History of the GEM Desktop Environment]]></title><description><![CDATA[How a gem was cut and then lost]]></description><link>https://nemanjatrifunovic.substack.com/p/history-of-the-gem-desktop-environment</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/history-of-the-gem-desktop-environment</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sat, 13 Sep 2025 12:42:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lOGQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Sometime in 1988, the keyboard of my <a href="https://www.computinghistory.org.uk/det/424/Sinclair-ZX-Spectrum-48k/">Sinclair ZX Spectrum 48K</a> was finally broken beyond repair, and I asked my parents for a 128K version of the same computer. Instead, they surprised me with an <a href="https://www.oldcomputers.net/atari520st.html">Atari 520 ST</a>. It was my first real-world experience with a graphical desktop environment, complete with windows, icons, and a mouse.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lOGQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lOGQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png 424w, https://substackcdn.com/image/fetch/$s_!lOGQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png 848w, https://substackcdn.com/image/fetch/$s_!lOGQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png 1272w, https://substackcdn.com/image/fetch/$s_!lOGQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lOGQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png" width="652" height="410" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d6eb9464-719d-456b-a287-23555c903d92_652x410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:410,&quot;width&quot;:652,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:6462,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/172128508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lOGQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png 424w, https://substackcdn.com/image/fetch/$s_!lOGQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png 848w, https://substackcdn.com/image/fetch/$s_!lOGQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png 1272w, https://substackcdn.com/image/fetch/$s_!lOGQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd6eb9464-719d-456b-a287-23555c903d92_652x410.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The ST was an amazing machine, not only compared to my poor old &#8220;Speccy&#8221; and similar cheap home computers, but even to the IBM PC compatibles in my school&#8217;s comp-sci lab, which cost at least twice as much.</p><p>Decades later, I decided to learn more about the graphical desktop that ran on the Atari ST - GEM by Digital Research Inc. This post is the result of my modest research project.</p><p>Much of my source material comes from the <a href="https://computerhistory.org/">Computer History Museum</a>. If you enjoy the article and feel generous, please consider making a donation to the museum.</p><h2>Xerox Lone Star</h2><p>In July 1981, Lee Jay Lorenzen, a recent graduate from Southern Methodist University, began working at Xerox&#8217;s Office Products Division in Dallas, Texas<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-1" href="#footnote-1" target="_self">1</a>. He was hired to work on the 16-bit version of the recently released <a href="https://oldcomputers.net/xerox-820.html">Xerox 820 personal computer</a> (code named Worm, as it was supposed to eat Apple). Once inside Xerox, Lorenzen got access to the <a href="https://guidebookgallery.org/articles/thexeroxstararetrospective">Xerox Star</a>, the first commercially available computer with a graphical desktop, inspired by the legendary <a href="https://www.computerhistory.org/revolution/input-output/14/347">Xerox Alto</a> workstation.</p><p>Impressed by the Star&#8217;s capabilities, but not its price, Lorenzen set out to design an 8086-based personal computer that would have similar user interface to the Star&#8217;s but with a more reasonable price tag. The prototype was named Lone Star, and Lorenzen made a video<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-2" href="#footnote-2" target="_self">2</a> to promote it within Xerox.</p><p>In a nutshell, the Lone Star was a desktop computer based on Intel 8086 CPU, with 128 KB of RAM, 8 KB of ROM, optional 5.25&#8221; floppy drives, and running the CP-M/86 operating system. The interesting part was the graphical desktop environment, which was obviously influenced by the Xerox Star - with menus, a message bar, icons and windows. It was coded in Digital Research&#8217;s <a href="http://www.cpm.z80.de/manuals/pmt68kpg.pdf">Pascal/MT+</a>.</p><p>The Lone Star was noticed within Xerox, and Lorenzen even travelled to Palo Alto to demonstrate it to the famous PARC research group<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-3" href="#footnote-3" target="_self">3</a>. The follow-on to the Xerox 820 ended up being <a href="https://www.computinghistory.org.uk/det/36134/Xerox-820-16-8-Personal-Computer/">Xerox 820 16/8</a> - a much less ambitious machine without a graphical desktop. However, one of Lorenzen&#8217;s former managers who had moved to Digital Research Inc. (DRI) was impressed enough by his work to recruit him there.</p><h2>Gem is a Pure Crystal</h2><p>Lee Jay Lorenzen joined DRI in January 1983<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-4" href="#footnote-4" target="_self">4</a> and started at the Operating Systems Department, led by Frank Holsworth. His first project was a character-oriented windowing system for Concurrent CP/M<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-5" href="#footnote-5" target="_self">5</a>. In August 1983, after seeing VisiCorp&#8217;s operating environment Visi On<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-6" href="#footnote-6" target="_self">6</a>, Lorenzen and another developer in the same team Jason Loveman decided they could do better. They came up with the first prototype of a graphical desktop environment and demonstrated it in late 1983. The prototype was developed on an Apple Lisa computer running an internal port of Concurrent CP/M for the Motorola 68000 CPU.</p><p>Lorenzen named the prototype &#8220;Crystal&#8221; - he had heard of an IBM project code name &#8220;Glass&#8221;<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-7" href="#footnote-7" target="_self">7</a> and, without a doubt inspired by name games at Xerox, wanted to one-up it.</p><p>The success of the demo earned Lorenzen a transfer to the Graphics Department under Don Heiskell, creator of the <a href="http://www.cpm.z80.de/roche/GSX13ART.TXT">GSX graphics library</a>. Within the department, a new team was formed to develop the desktop environment. Lorenzen was the lead, and other members included Gregg Morris and Lowell Webster with Tim Oren and Andrew Muir joining later<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-8" href="#footnote-8" target="_self">8</a>. A separate team worked on GEM applications such as Paint, Draw and Graphing.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W_Nq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W_Nq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg 424w, https://substackcdn.com/image/fetch/$s_!W_Nq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg 848w, https://substackcdn.com/image/fetch/$s_!W_Nq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!W_Nq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W_Nq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg" width="895" height="598" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:598,&quot;width&quot;:895,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:165673,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://nemanjatrifunovic.substack.com/i/172128508?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W_Nq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg 424w, https://substackcdn.com/image/fetch/$s_!W_Nq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg 848w, https://substackcdn.com/image/fetch/$s_!W_Nq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!W_Nq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feb7b776e-bca3-4cd6-9a8a-fa1bc40ae671_895x598.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>By the time the project officially started, it was clear that DRI&#8217;s CP/M-86 operating system had lost the battle for the PC market and the new target platform for GEM was set to be MS-DOS. That meant not only dealing with the 640KB memory restriction<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-9" href="#footnote-9" target="_self">9</a> but abandoning the multitasking for the time being.</p><p>The graphics environment was essentially ready by late 1984. It turned out the name &#8220;Crystal&#8221; was not available, so they renamed it to Gem: the most valuable crystal. Lorenzen decided to pretend it was an acronym: Graphic Environment Manager.</p><p>GEM was officially introduced at COMDEX in November 1984 and was generally well received, with two major criticisms:</p><ul><li><p>Initially, GEM ran on IBM machines, but not on clones like Compaq. The restriction was lifted soon after.</p></li><li><p>GEM ran well on the top-of-the-line systems like IBM PC AT but was sluggish on less expensive and more popular 8088-based machines.</p></li></ul><p>On February 23, 1985, Lee Jay Lorenzen demonstrated the desktop environment on The Computer Chronicles<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-10" href="#footnote-10" target="_self">10</a>. </p><p>On February 28, 1985, GEM 1.1 shipped.</p><h2>Atari ST and TOS</h2><p>In January 1984, while the GEM project was still in its early stages, Commodore&#8217;s founder and CEO Jack Tramiel suddenly left the company after a fight with chairman Irving Gould. Never one to quit, he founded Tramiel Technology Ltd. and in July grabbed the opportunity to buy Atari from Warner Communications<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-11" href="#footnote-11" target="_self">11</a>. Tramiel took with him a number of talented engineers from Commodore, including <a href="https://prabook.com/web/shiraz.shivji/1887876">Shiraz Shivji</a>, and began work on a next generation home computer. The goal was to have it ready for the January 1985 Consumer Electronics Show (CES).</p><p>The main decisions about the hardware were made before the Atari takeover: the machine would be based on Motorola&#8217;s 68000 processor with advanced graphics and built-in <a href="https://www.techtarget.com/whatis/definition/MIDI-Musical-Instrument-Digital-Interface">MIDI</a>. For software, the team knew they wanted a modern graphical user interface with bitmap graphics. They also knew they did not have time to develop the operating system from scratch, so they contacted DRI.</p><p>All that Digital Research could demo to the Tramiel&#8217;s team at the time was Lorenzen&#8217;s Crystal prototype that ran on an Apple Lisa. They were not impressed; one of the ex-Commodore engineers called it &#8220;smoke and mirrors&#8221;. However, the only alternative was Microsoft, and they had even less to show, so the decision was made to go with DRI.</p><p>In September 1984, Atari&#8217;s software team traveled to Monterey to port the new PC version of GEM to the 68000 CPU. In the beginning, the 68000 port ran on top of CP/M-68K, but it was clear they needed a more modern OS, with a hierarchical file system. DRI&#8217;s Jason Loveman (who had originally worked with Lorenzen on the first GEM prototype) started developing a new disk operating system named GEMDOS<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-12" href="#footnote-12" target="_self">12</a> specifically for that purpose.</p><p>The entire situation was pretty hectic for a while: DRI&#8217;s graphics group worked on the PC version of GEM on MS-DOS; Atari developers were porting it to Apple Lisas running CP/M-68K; and Loveman was building GEMDOS. Against all odds, they succeeded. The operating system for Atari ST consisting of GEM running on top of GEMDOS was named TOS which simply meant &#8220;the operating system&#8221;, although many believed &#8220;T&#8221; actually stood for &#8220;Tramiel&#8221;.</p><p>Atari 520 ST, soon nicknamed &#8220;Jackintosh&#8221;, <a href="https://www.goto10retro.com/p/atari-st-40th-anniversary">was introduced at the 1985 Consumer Electronics Show in Las Vegas</a> and became an immediate hit. GEM ran smoothly on the powerful ST&#8217;s hardware, and there were no clones to worry about. Atari developed its branch of GEM independently of Digital Research until 1993, when the Atari ST line of computers was discontinued.</p><h2>Apple&#8217;s Lawsuit Threat and GEM 2</h2><p>By 1985, Apple&#8217;s hopes that the Macintosh would take the world by storm as the IBM PC had four years earlier proved unfounded. At the same time, efforts to bring a graphical desktop to PCs looked promising, and Apple resorted to legal action to stop them, or at least slow them down. Microsoft Windows, half-baked as it was at its first release, was an obvious target, but even before that, Apple sent its lawyers to DRI and threatened with a lawsuit. Their claim was that GEM copied Macintosh&#8217;s &#8220;look and feel&#8221;.  </p><p>According to Lee Jay Lorenzen, it was Bill Gates who convinced Apple to go after DRI first:</p><blockquote><p>I said, "Bill, did you do this? I heard that you sent Apple to pester Digital Research," and he owned up to it! I've always had good interactions with Bill. I know his reputation in the industry, but to me, personally, he's always been a supporter. He certainly didn't lie about it. He said, "Yes, they came over bugging me about the UI, and I said, &#8216;Windows is kind of like a Macintosh, but what's really like a Macintosh is GEM at Digital Research. Why don't you go hassle them for a while?&#8217;"</p></blockquote><p>Lorenzen argued that he had &#8220;stolen&#8221; his design from Xerox, not Apple, but it is hard to deny that Gates had a point<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-13" href="#footnote-13" target="_self">13</a>. Apple&#8217;s user interface was, of course, inspired by the Xerox Alto, but the Lisa (and later the Macintosh) introduced significant innovations that GEM adopted<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-14" href="#footnote-14" target="_self">14</a>. Superficially, GEM did look like a color version of Macintosh, albeit it lacked some functionality and built-in applications.<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-15" href="#footnote-15" target="_self">15</a></p><p>Ultimately, DRI&#8217;s leadership chose not to face Apple at court. They reached an agreement<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-16" href="#footnote-16" target="_self">16</a> to modify GEM to look less like the Macintosh. The result was GEM 2.0, with two non-resizable file windows permanently on the desktop, without icons and no &#8220;trash bin&#8221;.</p><p>GEM 2.0 was released in March 1986 and Lorenzen was credited as one of the four authors. By that time, though, he had left Digital Research to cofound Ventura Software<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-17" href="#footnote-17" target="_self">17</a>.</p><p>Interestingly enough, Apple never went after Atari, and TOS continued to be based on GEM 1.0.</p><h2>End of GEM</h2><p>The &#8220;crippled&#8221; versions of GEM still saw some success. A very popular PC clone in Europe, the <a href="https://www.retromobe.com/2016/10/amstrad-pc1512-1986.html">Amstrad PC 1512</a> used GEM as its primary desktop environment, as did <a href="https://www.ataripc.net/">Atari PC computers</a>. But by that point it was clear that DRI did not really back its desktop environment. In a <a href="https://vintagecomputer.net/cisc367/PC-Letter_19880118.pdf">report from January 1988</a>, Stewart Alsop II had this to say about GEM:</p><blockquote><p>There are other systems that some people - primary the designers - would like to include as contenders. These include Digital Research&#8217;s Gem, which started out fairly strong but appears to have suffered from a lack of leadership. The interface is the closest to the Macintosh in structure and approach, but Digital Research has never been able to provide it with a complete or workable keyboard interface (using the home key to select an object just doesn&#8217;t make sense) nor to present enough of a marketing strategy to win over any major OEMS.</p></blockquote><p>The last commercial GEM release was version 3.11, published in November 1988. The project was led by of one of the original authors, Lowell Webster<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-18" href="#footnote-18" target="_self">18</a>.</p><p>A few more versions were released internally or bundled with other products<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-19" href="#footnote-19" target="_self">19</a>. An interesting offshoot was ViewMax which served as a graphical shell for DR DOS - the most successful product of Digital Research&#8217;s final years<a class="footnote-anchor" data-component-name="FootnoteAnchorToDOM" id="footnote-anchor-20" href="#footnote-20" target="_self">20</a>.</p><p>Novell acquired DRI in 1991 and sold its technologies to Caldera in 1996. Caldera eventually <a href="https://www.theregister.com/1999/04/27/gem_the_gui_that_beat/">open-sourced GEM</a>. According to <a href="https://forum.vcfed.org/index.php?threads/what-is-the-difference-between-opengem-freegem-and-owens-freegem.43865/">a VCF forum discussion</a>, three major distributions of the open-sourced GEM appeared: <a href="http://www.deltasoft.com/">FreeGEM</a>, <a href="https://www.owenrudge.net/GEM/">Owen&#8217;s Free GEM</a> and <a href="https://sourceforge.net/projects/opengem/files/opengem/">OpenGEM</a>. Code and binaries for all three can still be found online, but development ended by the late 2000s. </p><p>Sadly, GEM remains only as a part of computing history.</p><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-1" href="#footnote-anchor-1" class="footnote-number" contenteditable="false" target="_self">1</a><div class="footnote-content"><p>Most information about Lorenzen and his work was collected from the Computer History Museum&#8217;s <a href="https://www.computerhistory.org/collections/catalog/102738270/">Lorenzen, Lee oral history</a></p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-2" href="#footnote-anchor-2" class="footnote-number" contenteditable="false" target="_self">2</a><div class="footnote-content"><p>The video <a href="https://www.youtube.com/watch?v=EMBGRZftS30">Lee Lorenzen -- Lone Star Prototype in August, 1982.mp</a>4 is available on YouTube. The quality of the video is not great, but it is still very interesting.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-3" href="#footnote-anchor-3" class="footnote-number" contenteditable="false" target="_self">3</a><div class="footnote-content"><p>Several articles about GEM mention that it was developed by a former Xerox PARC employee. It is pretty clear that Lorenzen never worked at PARC; he was employed by Xerox Office Products Division in Dallas, Texas. </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-4" href="#footnote-anchor-4" class="footnote-number" contenteditable="false" target="_self">4</a><div class="footnote-content"><p>Interesting details about the early development of GEM can be found in <a href="https://archive.computerhistory.org/resources/access/text/2017/03/102770745-05-01-acc.pdf">Digital Dialog, Vol 3, No 8</a> </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-5" href="#footnote-anchor-5" class="footnote-number" contenteditable="false" target="_self">5</a><div class="footnote-content"><p>I assume the product was <a href="https://doc.lagout.org/science/0_Computer%20Science/0_Computer%20History/old-hardware/digitalResearch/concurrent/4007-1010_Concurrent_CPM_with_Windows_Technical_Note_for_IBM_PC_Feb84.pdf">Concurrent CP/M . with Windows  Operating System</a>, released in 1984.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-6" href="#footnote-anchor-6" class="footnote-number" contenteditable="false" target="_self">6</a><div class="footnote-content"><p><a href="https://win1.krnl386.com/overview/competitors/vision.php">Visi On</a> was released in December 1983 but was first demonstrated a year earlier, so it is not clear when Lorenzen first saw it.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-7" href="#footnote-anchor-7" class="footnote-number" contenteditable="false" target="_self">7</a><div class="footnote-content"><p>Glass was eventually released under the name <a href="https://win1.krnl386.com/overview/competitors/topview.php">IBM TopView</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-8" href="#footnote-anchor-8" class="footnote-number" contenteditable="false" target="_self">8</a><div class="footnote-content"><p>The GEM 1.1 Desktop Info dialog lists six authors: Lee Jay Lorenzen, Gregg Morris, Lowell Webster, Tim Oren, Andrew Muir, and Jim Bourne</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-9" href="#footnote-anchor-9" class="footnote-number" contenteditable="false" target="_self">9</a><div class="footnote-content"><p>To work around the memory limits, GEM used something Lorenzen calls &#8220;set-aside&#8221; mode: when an application launched, the desktop environment unloaded from memory and reloaded after the application exited.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-10" href="#footnote-anchor-10" class="footnote-number" contenteditable="false" target="_self">10</a><div class="footnote-content"><p>The video is available on YouTube: <a href="https://youtu.be/oNF6rhTCFQo?si=tyHOfXth4C26llYS">Computer Chronicles - GEM by Digital Research</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-11" href="#footnote-anchor-11" class="footnote-number" contenteditable="false" target="_self">11</a><div class="footnote-content"><p><a href="https://www.atarimagazines.com/startv3n1/threeyearsofst.html">3 Years With the S</a>T by Jeffrey Daniels was written in 1988 when Tramiel&#8217;s Atari was at its peak.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-12" href="#footnote-anchor-12" class="footnote-number" contenteditable="false" target="_self">12</a><div class="footnote-content"><p>A chapter from the book <a href="http://cd.textfiles.com/crawlycrypt1/program/books/progem/gemdos.15">PROFESSIONAL GEM</a> by Tim Oren contains some history of GEM development, including the Atari port.  </p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-13" href="#footnote-anchor-13" class="footnote-number" contenteditable="false" target="_self">13</a><div class="footnote-content"><p>It did not save him from a lawsuit. After Windows 2.0 was released, <a href="https://legal.thomsonreuters.com/blog/1988-apple-sues-microsoft/">Apple sued Microsoft for copyright infringement</a>, but Microsoft won.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-14" href="#footnote-anchor-14" class="footnote-number" contenteditable="false" target="_self">14</a><div class="footnote-content"><p>A presentation by Jason Perkins at Vintage Computer Festival East 2020 where he compares the UIs of Xerox Star and Apple Lisa <a href="https://www.youtube.com/watch?v=pBiWtJJN5zk">is available on YouTube</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-15" href="#footnote-anchor-15" class="footnote-number" contenteditable="false" target="_self">15</a><div class="footnote-content"><p>Collections of GEM screenshots can be found at <a href="http://toastytech.com/guis/indexgem.html">toastytech</a> website and <a href="https://www.seasip.info/Gem/screens.html">seasip.info</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-16" href="#footnote-anchor-16" class="footnote-number" contenteditable="false" target="_self">16</a><div class="footnote-content"><p>The New York Times article <a href="https://www.nytimes.com/1985/10/01/business/digital-research-to-modify-gem.html">Digital Research To Modify GEM</a> published on October 1, 1985, quotes Judy Mervis of Digital Research stating that DRI agreed to make GEM &#8220;less similar in operation and appearance to Apple's programs that run on Mcintosh&#8221;.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-17" href="#footnote-anchor-17" class="footnote-number" contenteditable="false" target="_self">17</a><div class="footnote-content"><p>Ventura Software produced the popular desktop publishing software <a href="https://en.wikipedia.org/wiki/Ventura_Publisher">Ventura Publisher</a> that was initially based on GEM, with DRI&#8217;s permission. Interestingly, it was distributed by Xerox.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-18" href="#footnote-anchor-18" class="footnote-number" contenteditable="false" target="_self">18</a><div class="footnote-content"><p>A short video interview with Lowell Webster can be found at <a href="https://www.computerhistory.org/collections/catalog/102770350/">Computer History Museum</a> website. It seems it was filmed during a Digital Research reunion.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-19" href="#footnote-anchor-19" class="footnote-number" contenteditable="false" target="_self">19</a><div class="footnote-content"><p>A list of the major versions of GEM on PC can be found at <a href="https://www.seasip.info/Gem/versions.html">seasip.info/Gem/versions.html</a>.</p></div></div><div class="footnote" data-component-name="FootnoteToDOM"><a id="footnote-20" href="#footnote-anchor-20" class="footnote-number" contenteditable="false" target="_self">20</a><div class="footnote-content"><p>Gary Kildall presented ViewMax in an <a href="https://youtu.be/YewNEAIkbG4">episode of The Computer Chronicles</a>.</p></div></div>]]></content:encoded></item><item><title><![CDATA[Decoding UTF-8. Part IV: Determining Sequence Length - Counting Leading Bits]]></title><description><![CDATA[In the first part of this series, we saw how to manually decode a UTF-8 sequence.]]></description><link>https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-iv-determining</link><guid isPermaLink="false">https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-iv-determining</guid><dc:creator><![CDATA[Nemanja Trifunovic]]></dc:creator><pubDate>Sun, 07 Sep 2025 20:18:12 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!4e3J!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95db00b8-6cf2-42bc-9f62-364971e5fea1_341x341.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In the <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-i-manual-decoding">first part</a> of this series, we saw how to manually decode a UTF-8 sequence. In <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-ii-determining">part two</a>, we started looking into determining sequence length. <a href="https://nemanjatrifunovic.substack.com/p/decoding-utf-8-part-iii-determining">Part three</a> was about avoiding branches when calculating sequence length with a lookup table.</p><p>Now, we will see how we can use some help from the hardware to accomplish the same task: based on the lead byte, calculate the UTF-8 sequence length. I recommend reading my recent post <a href="https://nemanjatrifunovic.substack.com/p/counting-leading-zeros-in-a-byte">Counting Leading Zeros in a Byte</a> to get familiar with the standard C and C++ functions for counting leading zeroes in a byte and the assembly instructions they use.</p><p>We will use a C++ 20 <a href="https://en.cppreference.com/w/cpp/numeric/countl_one.html">std::countl_one()</a> function from &lt;bit&gt; header to get the number of consecutive set bits, starting from the most significant bit. As we saw in the part one:</p><ul><li><p>Having 0 set bits on the left side means the most significant bit is zero. If a lead byte starts with zero, it means it is the only byte in the sequence - the length is 1.</p></li><li><p>1 set bit means the byte starts with the 10 sequence - these are continuation bytes, so we report an invalid lead</p></li><li><p>2 set bits mean the lead byte starts with 110; the sequence length is 2.</p></li><li><p>3 set bits mean the lead byte starts with 1110; the sequence length is 3.</p></li><li><p>4 set bits mean the lead byte starts with 11110; the sequence length is 4</p></li><li><p>Anything else indicates an invalid lead byte.</p></li></ul><p>Without further ado, here is the code:</p><pre><code>#include &lt;bit&gt;
int utf8_sequence_length(unsigned char lead_byte) {
    switch (std::countl_one(lead_byte)) {
        case 0: return 1;
        case 2: return 2;
        case 3: return 3;
        case 4: return 4;
        default: return 0; // invalid lead
    }
}</code></pre><p>Note that we do not catch all invalid values of the lead byte here. It is OK, as long as we do proper validation at some point.</p><p>Let&#8217;s have a look at the generated assembly (clang 18.1, aarch64, -O2 --std=c++20):</p><pre><code><code>utf8_sequence_length(unsigned char):
        mov     w8, #255
        bics    w9, w8, w0
        clz     w9, w9
        bics    wzr, w8, w0
        mov     w8, #8
        sub     w9, w9, #24
        csel    w8, w8, w9, eq
        cmp     w8, #4
        b.hi    .LBB0_2
        adrp    x9, .Lswitch.table.utf8_sequence_length(unsigned char)
        add     x9, x9, :lo12:.Lswitch.table.utf8_sequence_length(unsigned char)
        ldr     w0, [x9, w8, uxtw #2]
        ret
.LBB0_2:
        mov     w0, wzr
        ret

.Lswitch.table.utf8_sequence_length(unsigned char):
        .word   1
        .word   0
        .word   2
        .word   3
        .word   4</code></code></pre><p>Like x86-64, Aarch64 instruction set does not have an instruction for counting leading ones - therefore we need to invert the bits and count zeros. That&#8217;s what <a href="https://developer.arm.com/documentation/100076/0100/A64-Instruction-Set-Reference/A64-General-Instructions/CLZ">CLZ</a> instruction does. The switch-case statement generated a small lookup table and there is no branching except to check for the invalid value (something that a branch predictor will be able to deal with).</p><p>In the next post in the series, I plan to discuss some benchmarks that compare the three methods of calculating a UTF-8 sequence length. </p>]]></content:encoded></item></channel></rss>