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