The interesting trick is to put all of the DOS versions in the same VM, and use a batch file to change between them. One can put all versions of PC-DOS or MS-DOS or Win9x in the same box, because the same boot sector loads all of them.
Currently, I have VPCs PC-DOS and Win9xx. type
C:\>type newdos.bat \exec\attr -z \io.sys \command.com \exec\mcopy io.sys .. \exec\mcopy command.com .. \exec\mcopy dosver.bat .. \exec\attr +z \io.sys if "%1"=="-r" \exec\shutdown -r
attr is Charles Dye's version of attrib, and mcopy is the freedos copy.exe command. The particular choice of utilities is to avoid different switches in command.com (v 5 does not support /y). Although \exec is normally in the path, it's included here so that you can run \newdos.bat from a floppy disk boot.
You change to the directory, eg cd 3000, and run \newdos.bat.
Currently under test, is 0950, 1111, 1998, 2222, 2400, 3000 and 3051. These are stock windows versions, except 2400 (my MS-DOS 7.1 build), and 3051 (the multiboot.ru version). 1999 is reserved for the base of Wengier's DOS, and 2000 for Wengier's dos.
Note that we don't copy autoexec or config. DOSVER.BAT carries the specific DOS information, eg "SET DOSVER=3051", it is called in autoexec, and the path is set to set to c:\exec;c:\%DOSVER%.
Config and autoexec are maintained in a common rexx script, which allows rapid rearrangement of files.
/* INST.BAT REXX autoexec.bat + config.sys */ vpcdir = "c:\drv\vpc"; ms_dir = "c:\drv\ms"; extdir = "c:\drv\ex" bootdir = 'c:'; tempdir = 'c:\temp'; exedir = 'c:\exec' lastdrive='W'; cdrdrv = 'S'; ramdrv= 'R'; ramsize = 8192 lh = 'LH' call auto0; call makefile bootdir || '\config.sys' call auto1; call makefile bootdir || '\autoexec.bat' exit makefile:; parse arg ff; file.0 = rr call stream ff, 'c', 'open write' do rr = 1 to file.0; call lineout ff, file.rr; end call stream ff, 'c', 'close'; say 'Writing' ff'..' return auto0:; rr = 0; /* CONFIG.SYS */ call add "DEVICE="vpcdir"\VMADD386.SYS" call rem title 'REM' call add "LASTDRIVE="lastdrive call add "DOS=HIGH,UMB,NOAUTO" call add "BUFFERS=50" call add "STACKS=0,0" call add "FILES=90" call add "device="ms_dir"\himem.sys" call add "device="extdir"\umbpci.sys /i=CC00-DFFF" call add "DEVICEHIGH="vpcdir"\CDROM.SYS /D:IDECD001 /L:"cdrdrv call add "DEVICE="ms_dir"\IFSHLP.SYS" call add "SHELL="bootdir"\COMMAND.COM" bootdir"\ /P" call add '' return auto1:; rr = 0; /* AUTOEXEC.BAT */ call add '@echo off' call rem title 'REM' call set "DOSVMADD13=INSTALLED" call add 'if !%1 == !! goto :setenv' call add lh vpcdir"\fshare.exe" call add lh vpcdir"\idle.com" call rem lh vpcdir"\mouse.com" call add extdir"\ctmouse.exe" call rem lh ms_dir"\MSCDEX.EXE /D:IDECD001 /L:"cdrdrv" /M:8" call add lh extdir"\shsucdx.com /D:IDECD001,"cdrdrv call add lh extdir"\doskey -i" call add lh extdir"\xmsdsk" ramsize ramdrv": /y" call add ':setenv' call add 'call dosver.bat' call set 'TEMP='tempdir call set 'TMP='tempdir call set 'PROMPT=$p$g' call set 'BLASTER=A220 I5 D1 H5 P330 T6' call add 'PATH='exedir';c:\%dosver%;' call add '' return title:; parse arg rem call add REM "**********************************************" call add REM "**** DOS Virtual Machine Additions *****" call add REM "**********************************************" return rem:; return add:; parse arg tail; rr = rr+1; file.rr = tail; return set:; parse arg tail; rr = rr+1; file.rr = "SET" tail; return
You get hold of say, IBM's rexx.exe from PC-DOS 7, and type "rexx inst", or brexx, the command updates config.sys and autoexec.bat. The file contains "dead" lines, such as the MSCDEX one. REM here is a subroutine on the third-last line, it basically ignores the tail and continues on.
Once you get the DOS version working, it's just a matter of creating the directories like 0950 etc, and placing the files in the correct folders. To boot 0950, one changes to \0950 and runs "\newdos -r"
One should note that a number of commands in the config.sys and autoexec.bat are useful for running DOS in a vm, particularly, Stacks, set blaster= etc.
One can then run a range of ancient and modern utilities to query the DOS version, eg "infer" = msd v 1.0, gives the cd-rom extensions by shsucdx as "2.30".