Skip to content
Andrey ``Bass'' Shcheglov edited this page Feb 19, 2025 · 20 revisions

DOS

Parent Directory

Installation

DOSBox

MS-DOS 6.22 can see no more than 1024 cylinders, which is roughly 504 MB with 16 heads (C/H/S = 1024/16/63) and 8032.5 MB with 255 heads (C/H/S = 1024/255/63). Sector size is assumed to be 512 bytes.

A disk image file of 504 MB (with 16 "heads") can be created using the bximage utility from bochs. A disk image with 255 "heads" can be created using dd:

dd if=/dev/zero of=path/to/hda.img bs=512 count=16450560

Don't forget to make the image file sparse:

fallocate -d path/to/hda.img

MS-DOS can be installed using the following [autoexec] section in dosbox.conf:

[autoexec]
@echo off
imgmount 2 path/to/hda.img -t hdd -fs none -size 512,63,255,1024

rem Install MS-DOS 6.22, Ctrl+F4 to swap floppy images.
boot path/to/disk01.img path/to/disk02.img path/to/disk03.img

Once MS-DOS is installed, be sure to update the boot command arguments:

[autoexec]
@echo off
imgmount 2 path/to/hda.img -t hdd -fs none -size 512,63,255,1024

cls
boot -l c

If extra partitions (D:, E:, F:) are created in the above 8 GB disk (using DOS fdisk), the image file geometry, as reported by Linux fdisk, will be:

Disk hda.img: 7.84 GiB, 8422686720 bytes, 16450560 sectors
Geometry: 255 heads, 63 sectors/track, 1024 cylinders
Units: cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000

Device     Boot Start   End Cylinders  Size Id Type
hda.img1   *        1   261       261    2G  6 FAT16
hda.img2          262  1024       764  5.8G  5 Extended
hda.img5          262   522       261    2G  6 FAT16
hda.img6          523   783       261    2G  6 FAT16
hda.img7          784  1024       241  1.8G  6 FAT16

Yet, upon the very next reboot, MS-DOS will either hang or run into a "divide overflow" error. This problem can be worked around: if MS-DOS setup is re-run from the floppy disks, D:, E:, and F: drives can be formatted during the setup process, and MS-DOS reinstalled. A run of scandisk will be required, as some or all logical drives will have missing FAT backup copies and/or lost clusters.

Still, such a multi-partition disk image will be impossible to correctly mount as a Linux loop device:

If you have VirtualBox installed, the disk image can be converted to the VHD format:

vbox-img convert --srcformat=RAW --srcfilename=hda.img --dstformat=VHD --dstfilename=hda.vhd

If the VHD image is attached to a Hyper-V virtual machine running Linux, fdisk will show exactly the same geometry:

Running dosfsck against /dev/sda1 will report bad file name errors, consistently with the mounted FAT16 file system view:

Still, after all file system errors are fixed, an attempt to boot MS-DOS from the disk image will hang:

At the same time, if the above VHD image is converted back to RAW and re-attached to DOSBox, MS-DOS boots just fine, and scandisk reports no further errors. Yet, it may be more practical to use a 2 GB disk image (C/H/S = 261/255/63) and create just a single FAT16 partition:

dd if=/dev/zero of=path/to/hda.img bs=512 count=4192965

Mounting a hard drive image in Linux

The image file may be later mounted as a loop device (assuming codepage 866 is compiled into the kernel, modprobe nls_cp866):

sudo mount -t vfat -o loop,offset=32256,codepage=866,iocharset=utf8,fmask=133,uid=$(id -u),gid=$(id -g) path/to/hda.img mountpoint/

Video drivers

By default, DOSBox emulates S3 Trio64V+ video card. Drivers for Windows 3.x are available.

The driver package from S3 replaces some of the bitmap fonts (*.fon) files shipped with a localized (e.g.: Russian) version of Windows 3.x. This messes up Cyrillic fonts.

Be sure to back up your *.fon files immediately after Windows installation, and restore the fonts once you've installed S3 video drivers.

Configuration files

Initially, a reasonable config.sys might look like this:

device=c:\dos\himem.sys /testmem:off /verbose
dos=high,umb
device=c:\dos\emm386.exe min=0 noems novcpi verbose highscan

buffers=15,0
fcbs=4,0
files=30
switches=/F
lastdrive=Z

devicehigh=c:\dos\setver.exe

country=007,,c:\dos\country.sys
devicehigh=c:\dos\display.sys CON=(EGA,866,1)
installhigh=c:\dos\nlsfunc.exe c:\dos\country.sys

devicehigh=c:\dos\ramdrive.sys 8192 512 1024 /E
devicehigh=c:\dos\ansi.sys

autoexec.bat:

@echo off

prompt $p$g
path c:\dos
set TEMP=c:\tmp

loadhigh c:\dos\smartdrv.exe /X

mode con codepage prepare=((866) c:\dos\ega.cpi)
mode con codepage select=866
chcp 866
loadhigh keyb ru,866,c:\dos\keyboard.sys

loadhigh c:\dos\doskey /insert

After memmaker is run, it adds /L (and, sometimes, /S) arguments to devicehigh, installhigh, and loadhigh commands. config.sys:

device=c:\dos\emm386.exe min=0 noems novcpi verbose highscan I=B000-B7FF X=C800-C9FF

devicehigh /L:1,12048 =c:\dos\setver.exe
devicehigh /L:1,15792 =c:\dos\display.sys CON=(EGA,866,1)

devicehigh /L:1,5888 =c:\dos\ramdrive.sys 8192 512 1024 /E
devicehigh /L:1,9072 =c:\dos\ansi.sys

autoexec.bat:

loadhigh /L:0;2,45456 /S c:\dos\smartdrv.exe /X

loadhigh /L:2,16208 keyb ru,866,c:\dos\keyboard.sys

loadhigh /L:1,6384 c:\dos\doskey /insert

DOS memory explained

EMM386.EXE

Virtual 8086 mode

Virtual 8086 mode is a sub-mode of Protected mode. In short, Virtual 8086 mode is whereby the CPU (in protected mode) is running an "Emulated" 16bit Real Mode machine.

DOS extenders

  • DOS/4GW and Protected Mode
  • HX DOS Extender is a free DOS extender with built-in Win32 PE file format support. Usually the purpose of a DOS extender is to make protected-mode features available for DOS applications. HX fully supports this goal, but goes some steps further. A Win32 API emulation layer is part of HX which allows many Win32 console applications to run in DOS. This emulation goes far beyond similiar approaches in other extenders (Borland's PowerPack, WDOSX or Phar Lab TNT). Furthermore HX implements - limited - support for windows, DirectDraw, GDI and even OpenGL graphics. This allows to run "simple" Win32 GUI apps in DOS as well.

Programming

Clone this wiki locally