https://www.pcjs.org/blog/2023/10/04/ PCjs Machines Home of the original IBM PC emulator for browsers. * About * Blog * Explorer * Repository * Tools Logo PCjs Blog Thirty Years Ago: MS-DOS 6.00, DoubleSpace, and MultiConfig Over 30 years ago, in March 1993, Microsoft released MS-DOS 6.00, the next major release of MS-DOS after 5.00 shipped in June 1991. In addition to several new full-screen utilities, like DEFRAG to defragment your hard disk (licensed from Symantec), MSBACKUP to efficiently backup your hard disk (also licensed from Symantec), and MSAV to check for viruses (licensed from Central Point Software), there were a number of new command-line programs, such as CHOICE, DELTREE, MOVE, MSCDEX, and SMARTDRV. But the biggest addition to MS-DOS 6.00 was a new feature called DoubleSpace (dubbed "MagicDrive" internally) that automatically compressed everything on your hard disk, providing up to "double" the amount of effective disk space - or more, or less, depending on how compressible your files were overall. DoubleSpace was a significant feature that required changes across the entire system. Most of the action, however, took place inside a new device driver, DBLSPACE.BIN, that stored all your data in a Compressed Volume File (CVF) generally named DBLSPACE.000. In fact, if you booted an older version of MS-DOS (like 5.00), you wouldn't see much more than that: A>DIR C: /A Volume in drive C is HOST_FOR_C Volume Serial Number is 5739-B1B5 Directory of C:\ IO SYS 40470 03-10-93 6:00a MSDOS SYS 38138 03-10-93 6:00a DBLSPACE BIN 51214 03-10-93 6:00a DBLSPACE INI 91 10-03-23 12:26p DBLSPACE 000 131474432 10-03-23 12:26p 5 file(s) 131604345 bytes 2605056 bytes free When MS-DOS 6.00 starts up, it reads DBLSPACE.INI, which usually looks something like this: MaxRemovableDrives=2 FirstDrive=D LastDrive=H MaxFileFragments=115 ActivateDrive=H,C0 and tells the operating system to mount the real drive C: as drive H: instead, and to mount the CVF as drive C: C:\>DIR /C Volume in drive C is MS-DOS_6 Volume Serial Number is 101B-323E Directory of C:\ DOS 09-25-23 10:13p COMMAND COM 52925 03-10-93 6:00a 1.4 to 1.0 WINA20 386 9349 03-10-93 6:00a 5.3 to 1.0 AUTOEXEC BAT 75 09-26-23 8:55a 16.0 to 1.0 CONFIG SYS 109 09-26-23 8:55a 16.0 to 1.0 2.0 to 1.0 average compression ratio 5 file(s) 62458 bytes 253927424 bytes free So our original hard disk, a 128Mb drive, now appears to be almost twice as large - thanks to DoubleSpace. Aside from the new DBLSPACE.BIN driver, the other main piece of DoubleSpace functionality resided in DBLSPACE.EXE, which operated as both a setup and a maintenance program. It provided a friendly UI, making it easy to create additional CVFs, as well as resize, defragment, reformat, unmount, remount, and more. MS-DOS 6.00 DoubleSpace Feel free to tinker with MS-DOS 6.00 on the website: * Microsoft MS-DOS 6.00 (Installed) * Microsoft MS-DOS 6.00 (Installed and Compressed) Legal Woes Microsoft bootstrapped its compression efforts by licensing code from Vertisoft, makers of DoubleDisk, a disk compression product first released in 1989. Starting with Verisoft's code, Microsoft created DBLSPACE.BIN, along with operating system changes that allowed it to be loaded before CONFIG.SYS was processed - so that CONFIG.SYS and any system files loaded from that point forward could be inside the compressed volume instead of outside it. Vertisoft was not directly involved with any of that work, but they did help produce other pieces of functionality, such as code to convert Stacker and SuperStor compressed disks to DoubleSpace - although apparently Stacker conversion was pulled at the last minute, in February 1993, just as MS-DOS 6.00 was being finalized. Or rather, February 1993 would have been "last minute", until the lawsuit filed by Stac in January 1993 forced Microsoft to re-evaluate. Stac claimed that the DoubleSpace infringed two of Stac's patents: 5,016,009 and 4,701,745. For me, life quickly changed on February 13, 1993, when I received this email: From: Paul Maritz Sent: Saturday, February 13, 1993 12:06 PM To: Jeff Parsons; Mark Zbikowski Cc: Ben Slivka; Brad Chase; Brad Silverberg; Jim Allchin; John Mason; Nathan Myhrvold; Rick Rashid Subject: special duty You are both amongst the best x86 assembly language coders that we have at MS. We are thus asking you to help out with a very serious problem that we face - namely the STAC / DOS6 lawsuit. Our lawyers have recommended that we have a backup compression mechanism for DOS6 ready to go as soon as possible. The initial work on this has been done under Rick Rashid in Nathanm's area. They have a C language implementation of a technique that we believe is safe (covered under patents that we have rights to). The challenge is to get this technique into the tightest possible x86 assembly code, as soon as possible. This is where we are asking you to help. Jimall and Bradsi are aware that you will be "stolen" for some weeks. Could you both meet with Rick Rashid as early as possible on Monday to get this effort under way as soon as is possible. Thanks. The next several weeks were probably some of the most stressful that I'd experienced at Microsoft. Looking back, it's amazing to me that with all the critical-path code that was being rewritten at that late date, MS-DOS 6.00 still shipped the following month, in March 1993. I don't recall all the details of the alleged patent infringement, and I'm not sure I ever knew all the details, because frankly, it wasn't necessary for me to know the details. A number of other people had already been working on the problem and had come up with several solutions, and it simply fell to me and MarkZ to implement them in x86 assembly - preferably very fast, bug-free assembly, of course. As far as I can tell now, Stac patent 5,016,009 was the crux of the problem. It combined LZ77 compression with hashing, and while LZ77 compression was fine, and hashing was fine, apparently the combination of the two became a patentable innovation. So we were initially tasked with writing a compressor based on Miller-Wegman, an algorithm that was either not patented or that Microsoft owned or licensed. When that turned out to be too slow, we instead built a compressor (internally known as XCFR or the "Rashid Search Algorithm") that avoided hashing by using a 256x8 look-up table along with a 256-entry LRU table, and also incorporated a new Microsoft Realtime Compression Format (MRCF) for outputting the raw bytes and offset-length pairs. That, of course, meant that the decompressor had to be rewritten as well. With hindsight, it's probably safe to say that Microsoft should not have shipped MS-DOS 6.00 quite so quickly after that rewrite, because unfortunately, our code (well, in the case below, my code) was not, um, bug-free: From: Chuck Strouss To: SYS Astro Team Development Group; Peter Stewart; Jeff Parsons Subject: Bug in DBLSPACE decompress Date: Monday, June 14, 1993 3:40PM In RDCOMP.ASM, near the first JC instruction, there is a bug when a block ends at 10000h and the last several bytes are in a repeat string. It was reported by Temporal Acuity Products. to which I replied: From: Jeff Parsons Sent: Monday, June 14, 1993 4:49 PM To: Chuck Strouss; Ben Slivka; Jim Mathews; Peter Stewart Subject: RE: Bug in DBLSPACE decompress well... shit! This bug was only in the 80386 code path, but that wasn't much consolation. And it was one of at least a half-dozen or so DoubleSpace bugs that Microsoft was aware by June of 1993. Other bugs included: * A particular series of reads, writes, and undeletes may cause an undelete to fail (FAT is marked USED, but MDFAT is left marked FREE; note that MDFAT refers to the "MagicDrive" FAT internal to the CVF) * A particular series of operations followed by undelete may cause a cross link (not taking into account data that may be in buffers) * Read into video memory in planar VGA modes results in garbage display (decompression depends on being able to read previously decompressed data, but VGA memory in these video modes does not read back what was written to it) * If a disk error occurs while updating a cluster, a cross link may be created (error would be on writing to a part of the sector heap that we had not used previously) * When Metro Software's LaserTwin 5.0 TSR is loaded, it intercepts write operations and breaks them up into smaller writes; however, sometimes those smaller writes can end up being ZERO bytes long, which DOS correctly treats as a truncate operation. If that happens when the system is writing to the DoubleSpace CVF, the compressed volume will be truncated (not really a DoubleSpace bug, but a bug with severe consequences) I don't know if the video memory bug was ever fixed. Wikipedia's article on DriveSpace (which was the new name for DoubleSpace as of MS-DOS 6.22) alludes to the problem: A few computer programs, particularly games, were incompatible with DoubleSpace because they effectively bypassed the DoubleSpace driver. But I'm not aware of any problems with games that involved "bypassing" the driver. Any game-related problems were almost certainly due to DoubleSpace decompressing data directly into video memory while the video card's write and read modes differed. Introducing MultiConfig On a happier, or at least less contentious note, MS-DOS 6.00 also introduced a feature known as MultiConfig, which I have some fondness for, because it was something I personally championed and implemented. And - good news - I don't think it had any serious bugs. I don't recall precisely where the idea came from. I think it started as something that I and Naveen Jain, a Program Manager on the team, discussed in early 1992. He created a preliminary spec in February 1992, and then I implemented the feature in March 1992 and updated the spec to match what I had implemented. The code was originally added to Jaguar, which was planned to be the next major update to MS-DOS after 5.00. But at some point, Astro - originally intended as a smaller interim MS-DOS update - grew to the point where it was clearly going to be the next major update, thanks in large part to the addition of DoubleSpace disk compression. When it was clear that Astro would become MS-DOS 6.00, I think management went looking for other low-hanging fruit, such as any new Jaguar features that could be incorporated into Astro relatively easily with minimal risk. MultiConfig fit the bill. However, it wasn't a slam dunk. I had to push for it, because there were a few risk-averse people in management that felt the risk/reward ratio was too high. They claimed that most users would not use this feature (which was true), but that point also worked in my favor: most of the new code would not be executed until and unless someone actually added one or more of the new commands to their CONFIG.SYS. So any risks largely affected only "power users". What is MultiConfig? MultiConfig was a collection of features added to the processing of CONFIG.SYS, to make it easier to start your PC in a particular way without having to boot from a special floppy or edit/copy a new CONFIG.SYS each time. It added some new commands to CONFIG.SYS: * INCLUDE * MENUCOLOR * MENUDEFAULT * MENUITEM * NUMLOCK * SET * SUBMENU and it included some new ways to interact with CONFIG.SYS. The message "Starting MS-DOS..." was added as an indirect means of alerting you that you now had two seconds to press one of several new start-up keys: * F5: Bypass CONFIG.SYS and AUTOEXEC.BAT * F8: Interactively step through CONFIG.SYS You could also tap a Shift key - that was equivalent to pressing F5. Apparently there was an Astro "press tour" in August 1992, and someone in that tour suggested adding the Shift key, so we did. They claimed that holding the Shift key while starting Windows also bypassed certain files and/or functions, but I don't recall to what extent that was true. Additionally, if you didn't want anyone using your machine to bypass or alter CONFIG.SYS, you could add these lines to the file: * SWITCHES=/N: disable all start-up keys * SWITCHES=/F: eliminate the two-second pause /N also implied /F, since if start-up keys were disabled, there was no need to wait two seconds. Note that SWITCHES was not a new command; other older "switches" included: * /K: Forces an enhanced keyboard to behave like a conventional keyboard (DOS 4.0+) * /T: Indicates the BIOS time rollover byte is a flag instead of a counter (DOS 5.0+) * /W: Specifies that the WINA20.386 file has been moved to a directory other than the root directory (DOS 5.0+) Finally, while we're on the subject of the keyboard-related features, I should add that NUMLOCK wasn't really a MultiConfig feature; it was just something I thought would be handy. Recall that early PCs had no BIOS setup screens, and MS-DOS was still an operating system designed to run on any PC, including the original IBM PC. So this CONFIG.SYS command: * NUMLOCK=[ON|OFF] could be used to set your keyboard's initial Num-Lock state. A case could be made for this being a legitimate MultiConfig feature though, since you could select menu items with arrow keys or by pressing the number of a menu item. So if you wanted to use your numeric keypad, then you would want to ensure that Num-Lock matched your preferred selection method. With Great Power Comes... Menus The real power of MultiConfig was the ability to create user-friendly boot menus and let you organize sets of CONFIG.SYS commands into either named or [common] blocks. Blocks began with a bracketed block name (eg, [menu], [common], [doslow]) and ended at the next bracketed block name (or end of file). Here's a simple example: [menu] menuitem=doslow,Load DOS in LOW memory menuitem=doshigh,Load DOS in HIGH memory menudefault=doslow,15 menucolor=15,1 [common] device=c:\dos\himem.sys [doslow] dos=low [doshigh] dos=high [common] device=c:\dos\setver.exe files=30 And the screen that would appear when booting: MS-DOS 6.00 MultiConfig Each menuitem in the [menu] block describes a menu item; the first argument is a block name (eg, doslow, doshigh), and the second argument is a description. Other [menu] block keywords included menudefault, which specifies the default menu item (and optional timeout value in seconds), and menucolor, which selects foreground and background colors for the menu. In the above example, no matter which menu item you selected, HIMEM.SYS would always be loaded first, because it was in a [common] block that appeared before the other blocks. Then all commands in the selected block ([doslow] or [doshigh]) would be processed next, then all the commands in the next [common] block - and so on. Another feature was "forced prompting". If you included a ? after the DEVICE keyword, you would receive an unconditional prompt for that particular driver. For example: device?=c:\dos\setver.exe would always generate the following prompt: DEVICE=C:\DOS\SETVER.EXE [Y,N]? And that feature wasn't limited to device drivers. The following line: dos?=high would also generate a prompt: DOS=HIGH [Y,N]? Menu Overload Below is a more complex example, extracted from an email I wrote back on July 1, 1992 (at 2:34am apparently). This example illustrates how you could use submenu (as opposed to menuitem) to define menu items that referred to other menu blocks, in order to create multi-level menus. Originally, the keyword for that feature was simply menu, but the Astro team (specifically, Betsy Tinney, who helped refine the MultiConfig UI for Astro) suggested a keyword that was clearer. It also shows how you could include named blocks from other blocks. For example, a number of the blocks, like [dosumb], include another block, [dos], that contains commands common to the other blocks. Every block could duplicate those commands itself, but factoring out common sets of commands made for a more maintainable CONFIG.SYS. Blocks named [common] were always processed in the order they appeared, whereas blocks with any other name would be processed whenever (and only whenever) they were explicitly included. Finally, this example also uses the SET command, which defines environment variables to be passed to COMMAND.COM. In addition, a special CONFIG environment variable is automatically set to the name of the block from the final selected menuitem (eg, dosumb). This was useful for batch files like AUTOEXEC.BAT, if they needed to customize their actions according to the selected CONFIG.SYS configuration. [menu] numlock=off menucolor=15,1 menudefault=lanmenu,15 submenu=dosmenu,DOS configurations submenu=lanmenu,LanMan configurations [dosmenu] menudefault=dosumb,15 menuitem=dosumb, DOS 7.00 only menuitem=dosems, DOS 7.00 w/EMS menuitem=dosansi, DOS 7.00 w/ANSI menuitem=dos386max, DOS 7.00 w/386Max menuitem=dosdbg, DOS 7.00 w/Soft-ICE menuitem=cougar, DOS 7.00 w/Cougar [lanmenu] menudefault=winball,15 menuitem=lanman20, DOS 7.00 w/Lanman 2.0 menuitem=lanman21, DOS 7.00 w/Lanman 2.1 w/XNS menuitem=lanman21nb, DOS 7.00 w/Lanman 2.1 w/XNS+NetBeui ;menuitem=lanman21xm,DOS 7.00 w/Lanman 2.1 w/XNS Mono menuitem=lanman21dbg,DOS 7.00 w/Lanman 2.1 w/Soft-ICE menuitem=winball, DOS 7.00 w/Winball [common] set tmp=c:\tmp set linktmp=c:\tmp set temp=c:\win31\temp set dircmd=/l/o set home=d:\tools\bound set init=d:\tools\bound set alias=jeffpar set logname=jeffpar set mailname=jeffpar set basspec=d:\tools\dos set helpfiles=d:\tools\help;c:\src\cougar\dev\tools\help set country=usa-ms set proj=c:\src\cougar\dos\dos86 set lib=d:\tools\windev\lib set include=d:\tools\windev\include;d:\src\myinc set path=d:\tools\dos;d:\tools\bound;d:\tools\windev;c:\lanman\netprog;c:\win31;c:\dos set prompt=$p$g [dos] break=on dos=high,umb files=60 buffers=10 stacks=9,256 lastdrivehigh=z shell=c:\dos\command.com /p c:\dos /e:1024 /z [dosumb] include dos device=c:\win31\himem.sys device=c:\win31\emm386.exe noems i=b000-b7ff x=d800-dfff [dosems] include dos device=c:\win31\himem.sys device=c:\win31\emm386.exe 1024 ram i=b000-b7ff x=d800-dfff frame=e000 [dosansi] include dosumb devicehigh=c:\dos\ansi.sys [dos386max] include dos device=d:\tools\386max\386max.sys [dosdbg] device=c:\s-ice\s-ice.exe /tra 1000 include dos [lanman20] include dosumb include lanman20_drivers include lanman_logon [lanman20_drivers] devicehigh=c:\lanman\drivers\protman\protman.dos /i:c:\lanman devicehigh=c:\lanman\drivers\ethernet\ub\ubnei.dos devicehigh=c:\lanman\drivers\protocol\netbeui\netbeui.dos devicehigh=c:\lanman\drivers\protocol\xns\ubxpw.dos devicehigh=c:\lanman\drivers\protocol\xns\ubloop.dos installhigh c:\lanman\drivers\protman\netbind.exe [lanman21] include dosumb include lanman21_drivers include lanman_logon [lanman21nb] include dosumb include lanman21_drivers install c:\lanman\netprog\load.com netbeui include lanman_logon [lanman21xm] include dosumb install c:\lanman\xnsmono\loadniu.exe -r -d -m:d8 -i:5 -p:4 c:\lanman\xnsmono\exniu2.xfm c:\lanman\xnsmono\1a.lc install c:\lanman\xnsmono\xnsbios.exe -m:d8 -i:5 -p:4 include lanman_logon [lanman21dbg] device=c:\s-ice\s-ice.exe /tra 1000 include dos include lanman21_drivers include lanman_logon [lanman21_drivers] devicehigh=c:\lanman\drivers\protman\protman.dos /i:c:\lanman devicehigh=c:\lanman\drivers\ethernet\ub\ubnei.dos device=c:\lanman\drivers\protocol\ubxns\ubxps.dos install c:\lanman\netprog\netbind.com [lanman_logon] install c:\lanman\netprog\net.exe start workstation install c:\lanman\netprog\net.exe logon jeffpar2 /y ;install c:\lanman\netprog\net.exe use k: \\jeffpar\astro dos6 ;install c:\lanman\netprog\net.exe use j: \\jeffpar\cougar dos7 [winball] include dosumb include lanman21_drivers devicehigh=c:\win31\redirdrv.sys devicehigh=c:\win31\system\vnbhlp.dos shell=c:\dos\command.com /p c:\dos /e:1024 /z /k windb set path=d:\tools\dos;d:\tools\bound;d:\tools\windev;c:\win31;c:\dos [cougar] include dosumb include lanman21_drivers devicehigh=c:\win31\redirdrv.sys devicehigh=c:\win31\system\vnbhlp.dos shell=c:\dos\command.com /p c:\dos /e:1024 /z /k cougar7 set path=d:\tools\dos;d:\tools\bound;d:\tools\windev;c:\win31;c:\dos;d:\cougar [common] installhigh d:\tools\dos\keyfix.com installhigh c:\win31\mouse.com installhigh c:\dos\share.exe installhigh c:\win31\smartdrv.exe 1024 installhigh c:\dos\doskey.com /a /e /x /p /k:128 /f:d:\tools\dos\aliases install c:\dos\mode.com con:rate=30 delay=1 install d:\tools\dos\50.com [GitHub Source] Jeff Parsons Oct 4, 2023 PCjs Explorer * Expand All * Collapse All * Surprise Me * Hardware + All PCs o AT&T # AT&T 6300 @ Color Graphics @ Documentation o CDP # CDP MPC 1600 @ Color Graphics @ Documentation o COMPAQ # Portable @ Monochrome Graphics @ Documentation # DeskPro 286 @ Documentation # DeskPro 386 @ Color Graphics @ Enhanced Graphics @ VGA Display @ Documentation # LTE/286 @ Documentation o IBM # PC (Model 5150) @ Color Graphics @ Monochrome Display @ Dual Displays @ VGA Display @ Documentation # PC XT (Model 5160) @ Color Graphics @ Enhanced Graphics @ Monochrome Display @ Documentation # PC AT (Model 5170) @ Color Graphics @ Enhanced Graphics @ Monochrome Display @ VGA Display with CD-ROM @ Documentation # PCJr (Model 4860) @ Documentation # PC Hard Drives @ Documentation # PC Video Adapters @ Documentation o Zenith # Zenith Z-150 @ Color Graphics @ Documentation + Arcade o Space Invaders + DEC o PDP-10 # KA10 @ PDP-10 KA10 Test @ Documentation # KL10 @ Documentation # Documentation o PDP-11 # PDP-11/20 @ PDP-11/20 with BASIC @ PDP-11/20 with Bootstrap Loader @ PDP-11/20 with Boot Monitor @ PDP-11/20 with Front Panel # PDP-11/45 @ PDP-11/45 with 256Kb @ PDP-11/45 with VT100 # PDP-11/70 @ PDP-11/70 with 4Mb @ PDP-11/70 "Server Array" @ PDP-11/70 with Boot Monitor @ PDP-11/70 with Front Panel @ PDP-11/70 with CPU Exerciser @ PDP-11/70 with RSTS/E @ PDP-11/70 with RT-11 @ PDP-11/70 with XXDP+ @ PDP-11/70 with VT100 @ Documentation # Documentation o ROMs # DEC PDP-11 ROMs # DEC VT100 ROMs # Other DEC ROMs o VT100 # VT100 Terminal # Dual VT100 Terminals # VT100 connected to IBM PC AT + Intel o 8080 Exerciser + LEDs o Game of Life o Lite-Brite o Text Scroller + OSI o Challenger 1P o Challenger 1P "Array" o Challenger 1P with Debugger + TI o TI-42 Calculator # TI-42 # TI-42 with Diagnostics o TI-55 Calculator # TI-55 # TI-55 with Diagnostics o TI-57 Calculator # TI-57 # TI-57 with Diagnostics # TI-57 with Revised ROM * Software + DEC o PDP-10 # Diagnostics @ KA10 - DAKAA - DAKAB - DAKAC - DAKAD - DAKAE - DAKAF - DAKAG - DAKAH - DAKAI - DAKAJ - DAKAK - DAKAL - DAKAM - DAKBA # Languages @ MACRO-10 # Tests @ PDP-10 Mini-Assembler Tests @ PDP-10 Opcode Tests o PDP-11 # Disks @ RK03 - RT-11 4.0 # Tapes @ BASIC - BASIC (Single User) @ Diagnostics - D0AA - D0BA - D0CA - D0DA - D0EA - D0FA - D0GA - D0HA - D0IA - D0JA - D0KA - D0LA - D0MA - D0NA - D0NB - D0NC - D0OA - DEQKC + IBM PC o Applications # IBM @ BASIC - Programs from PC DOS 1.00 - DONKEY.BAS from PC DOS 1.00 @ Multiplan - IBM Multiplan 1.00 # Lotus @ 1-2-3 - 1-2-3 1A - 1-2-3 1A* # Microsoft @ Learning MS-DOS - Learning MS-DOS 1.00 - Learning MS-DOS 1.01 @ Microsoft Chart - Microsoft Chart 2.02 @ Microsoft Excel - Microsoft Excel 2.0 - Microsoft Excel 5.0a @ Microsoft Multiplan - Microsoft Multiplan 1.06 - Microsoft Multiplan 2.00 - Microsoft Multiplan 2.01 - Microsoft Multiplan 3.00 - Microsoft Multiplan 4.00 - Microsoft Multiplan 4.01 - Microsoft Multiplan 4.20 @ Microsoft Word - Microsoft Word 1.10 - Microsoft Word 1.15 - Microsoft Word 2.00 - Microsoft Word 3.00 - Microsoft Word 3.10 - Microsoft Word 5.00 - Microsoft Word 5.0A @ Word for Windows - Word for Windows 2.0c # Other @ dBASE II - dBASE II 2.4 @ dBASE III - dBASE III 1.0 @ Mac Series - Mac Series 1.0 @ SuperCalc - SuperCalc 1.10 @ SuperCalc2 - SuperCalc2 1.00 @ SuperCalc3 - SuperCalc3 1.00 @ ThinkTank - ThinkTank (1987) @ VisiCalc - VisiCalc (1981) @ WordStar - Overview - WordStar 3.20 - WordStar 3.24 - WordStar 3.30 - WordStar 4.00 - WordStar for PCjr o Demos # IBM @ Dealer Demos - IBM PC Dealer Demos @ Exploring the IBM PC - Exploring the IBM PC (CGA) - Exploring the IBM PC (MDA) - Exploring the IBM PC AT 1.00 - Exploring the IBM PC AT 2.00 @ IBM EGA Demos and Utilities - Fantasy Land o Devices # Mouse @ Microsoft Mouse - MS Mouse 2.00 - MS Mouse 2.50 - MS Mouse 4.00 - MS Mouse 5.00 - MS Mouse 5.03 - MS Mouse 6.xx # ROM @ IBM PC ROMs - IBM PC BIOS Sources - IBM PC XT BIOS Sources - IBM PC AT BIOS Sources - IBM EGA BIOS Sources o Diagnostics # COMPAQ @ COMPAQ DeskPro 386 (1986) @ COMPAQ User Programs (1987) @ COMPAQ User Programs (1989) @ COMPAQ SystemPro @ COMPAQ Diagnostics 5.02 @ COMPAQ Diagnostics 5.08 @ COMPAQ Diagnostics 6.12 # IBM Diagnostics @ IBM PC - IBM PC Diagnostics 1.00 - IBM PC Diagnostics 1.02 - IBM PC Diagnostics 1.02 (Adv) - IBM PC Diagnostics 2.02 - IBM PC Diagnostics 2.05 - IBM PC Diagnostics 2.05 (Adv) - IBM PC Diagnostics 2.07 - IBM PC Diagnostics 2.20 (Adv) @ IBM PC AT - IBM PC AT Diagnostics 1.01 (Adv) - IBM PC AT Diagnostics 1.02 - IBM PC AT Diagnostics 2.00 - IBM PC AT Diagnostics 2.07 (Adv) @ IBM PS/2 Model P70 - IBM PS/2 Model P70 Reference 1.01 o Games # IBM @ 101 Monochrome Mazes (1983) # Id Software @ Commander Keen (1991) @ Wolfenstein 3D (1993) # Infocom @ The Hitchhiker's Guide to the Galaxy @ Leather Goddesses of Phobos @ Planetfall @ Zork I: The Great Underground Empire @ Zork II: The Wizard of Frobozz @ Zork III: The Dungeon Master # Microsoft @ Microsoft Adventure @ Flight Simulator (1984) # Other @ Adventures in Math (1983) @ Balance of Power (1985) @ Castle Adventure (1985) @ Dune II (1992) @ Executive Suite (1982) @ Eye of the Beholder (1991) @ Hero's Quest I (1989) @ Invaders Boot Sector (2019) @ King's Quest (1985) @ King's Quest (1987) @ Lemmings (1991) @ Life & Death II (1990) @ Moria (1992) @ Nine Princes in Amber (1985) @ The Oregon Trail (1990) @ The Oregon Trail (1991) @ Populous (1989) @ Rogue (1985) @ Trump Castle (1988) @ Wizardry I (1984) o Languages # Borland @ Turbo Pascal - Borland Turbo Pascal 2.00B - Borland Turbo Pascal 3.00B - Borland Turbo Pascal 3.01A - Borland Turbo Pascal 3.02A - Borland Turbo Pascal 4.00 - Borland Turbo Pascal 5.00 - Borland Turbo Pascal 5.50 - Borland Turbo Pascal 6.00 # Digital Research @ Pascal/MT+ - Pascal/MT+ 3.11 # IBM @ APL - IBM APL 1.00 @ LOGO - IBM LOGO 1.00 @ Assembler - IBM Macro Assembler 1.00 - IBM Macro Assembler 2.00 @ BASIC - Compiler = IBM BASIC Compiler 1.00 = IBM BASIC Compiler 2.00 @ COBOL - IBM COBOL Compiler 1.00 @ FORTRAN - IBM FORTRAN Compiler 1.00 @ Pascal - IBM Pascal Compiler 1.00 # Logitech @ Modula-2/86 - Modula-2/86 1.00 - Modula-2/86 1.10 # Microsoft @ Assembler - Macro Assembler 1.00-1981 - Macro Assembler 1.00 - Macro Assembler 1.06 - Macro Assembler 1.10 - Macro Assembler 1.12 - Macro Assembler 1.25 - Macro Assembler 2.04 - Macro Assembler 3.00 - Macro Assembler 3.01 - Macro Assembler 4.00 - Macro Assembler 5.00 - Macro Assembler 5.10 - Macro Assembler 5.10 (Feb 1988) - Macro Assembler 6.00 - Macro Assembler 6.11 @ BASIC - Compiler = Microsoft BASIC Compiler 5.36 - QBasic = QBasic 1.10 - QuickBASIC = QuickBASIC 1.00 = QuickBASIC 2.00 = QuickBASIC 2.01 = QuickBASIC 3.00 = QuickBASIC 4.00 = QuickBASIC 4.50 - Visual Basic = Visual Basic 1.00 @ C - Microsoft C Compiler 1.03 - Microsoft C Compiler 1.04 - Microsoft C Compiler 2.03 - Microsoft C Compiler 3.00 - Microsoft C Compiler 4.00 - Microsoft C Compiler 5.00 - Microsoft C Compiler 5.10 - Microsoft C Compiler for OS/2 5.10 - Microsoft QuickC for Windows 1.00 @ COBOL - Microsoft COBOL Compiler 1.12 @ FORTRAN - Compiler = Microsoft FORTRAN Compiler 5.00 - PowerStation = Microsoft FORTRAN PowerStation 1.00 @ Pascal - Compiler = Microsoft Pascal Compiler 3.31 = Microsoft Pascal Compiler 4.00 - QuickPascal = QuickPascal 1.00 # Other @ RatBas - RatBas (1982) o SDKs # OS/2 SDKs @ Microsoft - MS OS/2 SDK 1.02 # Windows SDKs @ Windows SDK 1.01 @ Windows SDK 1.03 @ Windows SDK 1.04 @ Windows SDK 3.00 @ Windows SDK 3.10 o Shareware # Books @ DOS Internals (1994) @ Graphics for the IBM PC @ Inside the IBM PC @ Unauthorized Windows 95 @ Undocumented DOS @ The Undocumented PC @ Undocumented Windows # Magazines @ Big Blue Disk @ PC Disk Magazine @ PC Magazine Diskettes @ PC Tech Journal Diskettes # Miscellaneous @ PC-SIG Diskette Library @ PC User Groups @ Small Computer Book Club @ Unprotect Collection o Systems # CP/M-86 @ CP/M-86 1.00 @ CP/M-86 1.1B # DOS @ COMPAQ - COMPAQ MS-DOS 1.10 - COMPAQ MS-DOS 1.11 - COMPAQ MS-DOS 1.12 - COMPAQ MS-DOS 2.11 - COMPAQ MS-DOS 2.12 - COMPAQ MS-DOS 3.00 - COMPAQ MS-DOS 3.10 - COMPAQ MS-DOS 3.20 - COMPAQ MS-DOS 3.31 - COMPAQ MS-DOS 4.01 - COMPAQ MS-DOS 5.00 @ Digital Research - DR DOS 3.31 - DR DOS 3.32 - DR DOS 3.33 - DR DOS 3.34 - DR DOS 3.40 - DR DOS 3.41 - DR DOS 5.00 - DR DOS 6.00 @ IBM - PC DOS 0.90 - PC DOS 1.00 - PC DOS 1.10 - PC DOS 2.00 - PC DOS 2.10 - PC DOS 3.00 - PC DOS 3.10 - PC DOS 3.20 - PC DOS 3.30 - PC DOS 4.00 - PC DOS 4.01 - PC DOS 5.00 - PC DOS 5.02 - PC DOS 6.10 - PC DOS 6.30 - PC DOS 7.00 @ Microsoft - MS-DOS 2.00 - MS-DOS 3.20 - MS-DOS 3.21 - MS-DOS 3.30 - MS-DOS 3.31 - MS-DOS 4.00 - MS-DOS 4.01 - MS-DOS 4.0M - MS-DOS 5.00 - MS-DOS 6.00 - MS-DOS 6.20 - MS-DOS 6.22 # DOS Extensions @ IBM - TopView = TopView 1.00 = TopView 1.01 = TopView 1.10 @ Microsoft - MS-DOS Manager = MS-DOS Manager 1.00 @ Quarterdeck - DESQview = DESQview 1.02 - QEMM-386 = QEMM-386 4.10 = QEMM-386 4.23 = QEMM-386 5.13 = QEMM-386 6.02 @ SoftLogic - Software Carousel = Software Carousel 2.0.3 = Software Carousel 3.0.1 - DoubleDOS = DoubleDOS 2.1 = DoubleDOS 2.1F = DoubleDOS 2.1V - Disk Optimizer = Disk Optimizer 2.0.3 @ Other - Omniview 386 = Omniview 386 4.30 - HomeBase = HomeBase 1.04A # OS/2 @ IBM OS/2 - IBM OS/2 1.0 - IBM OS/2 1.1 - IBM OS/2 1.2 - IBM OS/2 1.3 @ MS OS/2 - MS OS/2 1.0 @ OS/2 Prototype Disks - OS/2 CP-DOS (v7.68) - OS/2 SIZZLE (v7.68.18) - OS/2 FOOTBALL (v7.68.17) - OS/2 FOOTBALL (v4.41.00) - OS/2 1.0 Debugger (1988) # UNIX @ IBM - PC/IX = PC/IX 1.0 - XENIX = XENIX 1.0 = XENIX 2.0 @ Microport - AT&T UNIX System V-AT = AT&T UNIX System V-AT 2.3 @ MINIX - MINIX 1.1 @ QNX - QNX 1.1 - QNX 1.2 @ SCO - Xenix 8086 = Xenix 8086 2.1.3 - Xenix 286 = Xenix 286 2.1.3 = Xenix 286 2.2.1e = Xenix 286 2.2.3b = Xenix 286 2.3.2d - Xenix 386 = Xenix 386 2.2.3b = Xenix 386 2.3.2f = Xenix 386 2.3.4h # Windows @ Microsoft Windows 1.00 @ Microsoft Windows 1.01 @ Microsoft Windows 1.02 @ Microsoft Windows 1.03 @ Microsoft Windows 1.03a @ Microsoft Windows 1.03b @ Microsoft Windows 1.04 @ Microsoft Windows 2.03 @ Microsoft Windows/386 2.0x @ Microsoft Windows/386 2.10 @ Microsoft Windows 2.11 @ Microsoft Windows 3.00 @ Microsoft Windows 3.10 @ Windows for Workgroups 3.11 @ Windows 95 (Build 121) @ Windows 95 (Build 499) @ Windows 95 (RTM) 4.00.950 o Tests # PCx86 CPU Tests # PCx86 TestMonitor # VGA "Black Book" Tests o Utilities # Borland @ Sidekick - Sidekick 1.11C - Sidekick 1.56 @ SideKick Plus - SideKick Plus 1.00A # IBM @ IBM Professional Debug - IBM Professional Debug 1.00 # Microsoft @ Unfiled - MS Unfiled Utilities # Norton Utilities @ Norton Utilities 2.00 @ Norton Utilities 2.01 @ Norton Utilities 3.00 @ Norton Utilities 3.10 @ Norton Utilities 4.00 @ Norton Utilities 4.00 (Adv) @ Norton Utilities 4.50 (Adv) @ Norton Utilities 5.00 @ Norton Utilities 6.01 # Other @ Enhanced DEBUG - Enhanced DEBUG 1.32b @ FlickerFree - FlickerFree 1.0 @ OBJASM - OBJASM 2.0 @ PathMinder - PathMinder 2.11 @ PC Tools - PC Tools 1.03 - PC Tools 4.30 @ PFM (Paul's File Manager) - PFM 3.14 @ Spacemaker - Spacemaker 1.06 @ SPY - SPY 0.1 @ UNP - UNP 4.11 + OSI C1P o 6502 Programs # PCjs @ 6502 Assembler (8K) @ BASIC Extensions @ LIFE # Processor Tests @ BCD Tests @ Overflow Tests o BASIC Programs # OSI @ BASIC MATH @ CHECKING @ COUNTER @ POKER @ PRESIDENTS @ STAR WARS @ TRIG TUTOR # Other @ SEAWOLFE @ SPACEWAR @ STAR TREK @ TANK FOR TWO # PCjs @ CHECKERS @ HANGWOMAN @ LIFE @ OTHELLO @ SOFORECAST @ TUBELIST + PCjs o Tools o Software Archive * Documents + Books o Programming o Microsoft Programmer's Library + Datasheets o Intel o Motorola o National Semiconductor + Magazines o BYTE o DosGetNews() o Microsoft Languages o Microsoft Systems Journal o PC Disk Magazine o PC Tech Journal + Manuals o DEC o IBM o Intel o Microsoft o Motorola + Papers o Research # Electronic Computer Project # Tom Estelita + Photos o Lite-Brite + PCjs Archives o Library o Document Archive o Programming Notes pcjs.org (c) 2012-2023 Jeff Parsons PCjs is released under an MIT License