You are on page 1of 13

MDGx MAX Speed WinDOwS �Tricks � Secrets � Bugs � Fixes

�����������������http://www.mdgx.com/������������������
��������������������
MS-DOS 6.xx/7.xx/8.00 + Windows 3.1x/95/98/ME
���������������������������������������������
EMM386.EXE + MEMORY MANAGEMENT TECHNICAL DETAILS
������������������������������������������������

NOTES: - Only the EMM386.EXE 16-bit MS-DOS mode memory management part of
Windows 95/98/ME is discussed here.
- For memory management guide + optimization tips see MEMORY.TXT
(included).
- For abbreviations + terms explanations see GLOSSARY.TXT (included):
http://www.mdgx.com/glossary.htm
- For DOS memory types, architecture + mapping technical details see
REGIONS.TXT (included).
- For Microsoft EMM386.EXE + HIMEM.SYS undocumented parameters see
related topics in SECRETS.TXT (included):
http://www.mdgx.com/secrets.htm

CREDITS: Most of this information is found at MicroSoft Knowledge Base (MSKB):


http://support.microsoft.com/

EMM386.TXT Contents:

A. PC/AT MEMORY TYPES:


Conventional Memory Area
384K Upper Memory Area (UMA)
Extended Memory Area (XMS)
Expanded Memory Standard (EMS)
LIM 4.0 Expanded Memory Standard
LIMulators
Expanded Memory Difficulties
B. MICROSOFT EMM386.EXE MEMORY MANAGER:
I. Using DEVICEHIGH + LOADHIGH /S Switch
II. Regions Scanned by EMM386.EXE HIGHSCAN Switch
III. Changes in EMM386.EXE versions 4.49 + 4.95:
Advanced Upper Memory Scanning
Expanded and Extended Memory Sharing
Ability to Provide Upper Memory Regions for Windows
Ability to Load with No Page Frame
NOVCPI Switch for Smaller Load Size
Token Ring Adapter Detection
Quiet Loading
Ability to Provide ROM Shadowing
IV. Troubleshooting MS-DOS + EMM386.EXE 4.49/4.95:
X=A000-F7FF
NOHI
NOEMS
NOVCPI
NOMOVEXBDA
NOTR
V. MS-DOS BUFFERS
VI. EMM386 ERROR MESSAGES
VII. EMM386.EXE ERROR CODES
EMM386.EXE resources:
- See "Reference: Memory Management Terms + System Files @ Wikipedia" in
MEMORY.TXT (included):
http://www.mdgx.com/mem7.htm#WKL
- See "95/98/ME SETUP + MEMORY MANAGERS":
http://www.mdgx.com/newtip20.htm#9SMM
also in MYTIPS95.TXT (part of W95-11D.EXE):
http://www.mdgx.com/95.htm
- See "WINDOWS DOS BOX TIPS":
http://www.mdgx.com/newtip23.htm#WDBT
also in MEMORY.TXT (part of W95-11D.EXE):
http://www.mdgx.com/95.htm
- MS TechNet: EMM386.EXE [MS-DOS 5.00-6.22]:
http://www.microsoft.com/technet/archive/msdos/comm3.mspx
- MS-Dos7 Commands: EMM386.exe:
http://www.lagmonster.org/docs/DOS7/v-emm386-sys.html
- Microsoft DOS EMM386 command:
http://www.computerhope.com/emm386hl.htm
- EMM386.EXE:
http://2dos.homepage.dk/batutil/help/EMM386S.HTM
- MS-DOS v6.22 Help: EMM386.EXE:
http://www.vfrazee.com/ms-dos/6.22/help/emm386.exe.htm
- List of EMM386.EXE articles @ MSKB:
http://search.microsoft.com/results.aspx?q=emm386.exe
- "EMM386.EXE HIDDEN PARAMETERS":
http://www.mdgx.com/secrets.htm#EMM
also in SECRETS.TXT (included).
______________________________________________________________________________
������������������������������������������������������������������������������

A. PC/AT MEMORY TYPES

There are a total of 6 different types of memory (RAM) that can be installed
in your X86/X86-X64 compatible IBM PC/AT computer PC (clone) by using a
Microsoft Operating System (MS OS: MS-DOS or MS Windows):
1. Conventional Memory Area (CMA) = a 1024 KB (1 MB) region, also IMPROPERLY
called "low" memory, consisting of:
A. Low Memory Area (LMA) = a 640 KB region.
B. Upper Memory Area (UMA) = a 384 KB region, also IMPROPERLY called
"high" memory. Must be mapped by a dedicated UMA manager.
2. Extended Memory Area (XMS) = a region of size which matches the amount of
total system RAM minus the CMA. Must be mapped by a dedicated XMS manager.
Abides by the XMS 3.0 standard.
3. Expanded Memory Area (EMS) = a 32-64 MB region within XMS. Must be mapped
by a dedicated EMS manager. Abides by the LIM 4.0 standard.
4. High Memory Area (HMA) = a 64 KB region within XMS located right above CMA.
Must be mapped by a dedicated XMS manager.
See REGIONS.TXT (included) for more details.

Conventional Memory Area

Conventional memory is the first 640 KB of memory in your machine. MS-DOS has
a limit of 1024 KB of addressable memory (conventional memory plus the UMA),
and all MS-DOS applications must run within this memory space. Windows shares
this limitation for running MS-DOS applications, but breaks the 640 KB
limitation for running native Windows applications.
Windows 3.1x/95/98/ME can create multiple DOS Virtual Machines (VMs) and also
allow MS-DOS applications to break the 640 KB barrier if they are written to
use the Microsoft DOS Protected Mode Interface (DPMI) specification. DPMI
allows MS-DOS applications to run in protected mode under Windows, using up to
16 MegaBytes (MB) of extended memory (XMS) directly.
Such DOS programs must be specifically written for DPMI to take advantage of
this feature.

384K Upper Memory Area (UMA)

Between the top of conventional memory at 640K and the start of extended
memory at 1024K lies the 384K UMA. This area doesn't contain physical memory.
Mapped into the 384K UMA are the system BIOS (Basic Input/Output System) ROM
chips and the display adapter memory. When you install other accessory cards,
such as network adapters, video or disk controllers, they may also occupy
space within the 384K UMA. The 384K UMA is always located in the same area of
the IBM compatible computer's address space: from 640K to 1024K (A000-FFFF
hex). There are no exceptions to this rule.
This means that a standard IBM compatible machine with 640K of conventional
memory installed really has 1 MB of address space. The system memory occupies
the first 640K and the 384K UMA occupies the area from 640K to 1M (1024K).
This does not mean that the machine has 1M of memory. A machine with 1M of
physical memory has an address space of 1408K. This consists of the 640K of
conventional memory, the 384K UMA and the 384K of extended memory starting at
1024K.

Extended Memory Area (XMS)

Extended memory is the simplest type of add-on memory to understand.


It is also the type of memory used by all Windows
3.1x/95/98/ME/NT/2000/XP/2003/Vista/2008/7/8/8.1/2012 releases.
Extended memory is a seamless continuation of the original 1M address space on
80286/80386/newer x86 based computers.
Extended memory always starts exactly at 1024K, where the 384K UMA ends. There
are no exceptions to this rule.
It is not possible for an 8086 or 8088 (old) machine to have extended memory.
This is a hardware limitation of these old processors, which can handle only
1024K of total address space (640K of system memory plus the 384K UMA). This
is one reason why Windows cannot run on 8086/8088 based machines, as it
requires a minimum of 1024K (1M) of extended memory for Windows 3.xx, 4096K
(4M) for Windows 95 and 16384K (16M) for Windows 98, 98 Second Edition (SE)
and Millennium Edition (ME).
The 80286 processor can address 16 MegaBytes (MB) of total memory, the 80386
and 80486 processors can address up to 4 GigaBytes (GB) and the Pentium (Pro)
class (80586) and newer (80686 = Pentium II/III/IV + multi-core Intel + AMD)
processors can address up to 4 TeraBytes (TB) of physical memory.
FYI: PC manufacturers used to refer to extended memory as expansion memory,
which is not to be confused with expanded memory.
Windows and all applications running under Windows access extended memory
through the Extended Memory Specification (XMS). Rather than accessing the
extended memory directly, access is made through an XMS driver.
The driver supplied by Microsoft for this purpose is called HIMEM.SYS.
Older MS-DOS applications that check available extended memory through
interrupt 15 (Int15h) service 88H will not see any extended memory with an
XMS driver loaded. Such applications must be rewritten to use the XMS,
instead of interrupt 15, to access XMS properly.

Expanded Memory Standard (EMS)

Windows 3.1x/95/98/ME/NT/2000/XP/2003/Vista/2008/7/8/8.1/2012 do not use


expanded memory for their needs (they use XMS instead), but are able to
provide it [Win16 (16-bit) and Win32 (32-bit) Windows OSes only] for
DOS/MS-DOS applications. It is important to understand the concept of expanded
memory if you still run DOS/MS-DOS based programs/games that use EMS.

LIM 4.0 Expanded Memory Standard

Lotus/Intel/Microsoft (LIM) Expanded Memory Specification (EMS) 4.0 supports


up to 64 16K memory pages, which are enough to bank 1M of memory at once.
The page frame itself does not need to be mapped into 4 contiguous 16K pages.
In fact, you need no page frame at all. All EMS versions follow the basic
operating principle of bank switching.

LIMulators

On 80386 (and newer X86/X86-X64) machines, it is possible to use a so-called


386 expanded memory manager (such as EMM386, QEMM386, RM386, 386MAX etc) to
emulate expanded memory (EMS). These LIMulators use the XMS rather than
interrupt 15h memory to emulate expanded memory and are much more efficient.

Expanded Memory Difficulties

LIM 3.2/4.0 expanded memory requires a page frame to work and the page frame
is located within the 384K UMA of your machine. Unfortunately, your EMM is not
the only competitor for that memory space. Add-on boards like: network cards,
SCSI/ESDI/RAID/(E)IDE disk controllers, SVGA video adapters, can all contend
for this address space. Several potential difficulties can arise due to this
contention:
1. LACK OF SPACE. The major problem is simply finding at least 64K of
contiguous free space in which to locate the LIM 3.2 page frame. LIM 4.0 does
not require a 64K page frame but is almost useless without it, as very few
applications have been written to take advantage of the LIM 4.0 specification.
Frequently, the address areas of various adapter cards need to be shuffled to
open a contiguous 64K page frame.
2. MAPPING CONFLICTS. Most 386 EMMs (such as EMM386.EXE) use a search
algorithm to find unused memory addresses between C000 and DFFF located in the
384K UMA to use as page frames. Some adapters do not reserve their address
space until you access the card, so the memory manager can inadvertently map
EMS pages on top of an address the card will request.
This is often true of Token Ring network adapters and can cause hanging and/or
intermittent operation.
In case of problems, the first thing to do is disable expanded memory. This
procedure will determine whether a page conflict is causing your difficulty.
If the problem goes away without expanded memory, the memory manager must be
told to exclude the address the adapter is occupying from consideration as a
page location. Consult your memory manager's manual for info on how to exclude
an address range. The adapter may also have to be moved. This is done in
different ways with different memory managers.
______________________________________________________________________________
B. MICROSOFT EMM386.EXE MEMORY MANAGER

EMM386.EXE (Expanded Memory Manager) is used by MS-DOS and Windows OSes to


provide expanded memory services (EMS) through the LIM 4.0 interface and upper
memory services (UMBs) through the XMS 3.0 interface, which in turn is
provided by the HIMEM.SYS extended memory manager (which MUST load from
CONFIG.SYS/CONFIG.NT at boot time BEFORE EMM386.EXE).
EMM386.EXE enables expanded memory ONLY IF the "RAM" switch is mentioned on
its CONFIG.SYS line.
See MEMORY.TXT + REGIONS.TXT (both included) for more details.
Microsoft EMM386.EXE most recent releases:
- EMM386.EXE version 4.45 ships with MS-DOS 6.00 - 6.21: obsolete, replaced by
version 4.49, also available from Microsoft FTP [218 KB, free]:
ftp://ftp.microsoft.com/softlib/mslfiles/EMM622.EXE
More info @ MSKB:
http://support.microsoft.com/kb/122415
- EMM386.EXE version 4.49 ships with MS-DOS 6.22.
- EMM386.EXE version 4.95 (current + LAST release) ships with MS-DOS
7.00/7.10/8.00 as part of Windows 95/98/ME, also available from [56 KB, free,
includes also HIMEM.SYS v3.95 (current release)]:
http://www.bretjohnson.us/programs/emm98se.zip
WARNING:
OLDER Microsoft HIMEM.SYS v3.10 + EMM386.EXE v4.45/v4.49 memory managers
shipped with MS-DOS 5.0 + 6.xx do NOT PROPERLY detect/enable the ENTIRE
extended memory (SXMS protocol is NOT implemented!) on computers with MORE
than 64 MB RAM installed, and may generate errors/lockups with newer
OSes/programs that take advantage of the extra RAM!
Therefore I STRONGLY RECOMMEND to use the NEWEST Windows 98 SE [a.k.a. MS-DOS
7.10] releases of HIMEM.SYS v3.95 + EMM386.EXE v4.95 (SXMS enabled) with ALL
MS-DOS 5.0 + 6.xx OSes!
See MEMORY.TXT (included) for comprehensive memory management guidelines.

I. Using DEVICEHIGH + LOADHIGH /S Switch

You can use the DEVICEHIGH + LOADHIGH switches /S and /L together to control
where programs are loaded in upper memory blocks (UMBs) and how much space
they allocate. Both switches affect the way programs interpret UMBs.
If you load a program with the /L switch, the program only recognizes the
memory regions you specify in the /L parameters. If you load a program with
the /S switch, the program only recognizes the regions you specify and the
amount of memory you specify. These switches are useful if you are optimizing
conventional memory because you can restrict the way a program uses a
particular memory region.
For example, the SMARTDrive utility has the ability to load itself into UMBs:
it is first loaded and initialized in conventional memory and then is
relocated to the largest available UMB it finds. By default SMARTDrive
attempts to load as much of itself as it can into UMBs; other programs will
not be able to use free UMBs because SMARTDrive has used too much space.
Since SMARTDrive does not have to reside in one memory area, you can use your
UMBs more efficiently by forcing SMARTDrive to use only a certain amount of
UMB space. You can accomplish this by using the /L and /S switches together.
The following command line (from AUTOEXEC.BAT) tells SMARTDrive that only
region 0 (located in conventional memory) and 3 (located in upper memory) are
free:
LOADHIGH /L:0;3,42416 /S drive:\path\SMARTDRV.EXE
SMARTDrive is first loaded and initialized in conventional memory (region 0)
and then relocates itself to region 3. Since the /L switch specifies a
minimum size of 42416 Bytes and the /S switch changes this minimum to the
absolute value free in region 3, SMARTDrive only recognizes region 0 and 3 as
free and only recognizes 42416 Bytes available in region 3. Therefore,
SMARTDrive loads 42416 Bytes of itself into region 3 and the rest in region 0.
This loading process results in more free memory in region 3 because
SMARTDrive is not able to relocate all of itself in that region. The next
program you load with the LOADHIGH command has enough space to load completely
into upper memory, and your available conventional memory is increased.

II. Regions Scanned by EMM386.EXE HIGHSCAN Switch

HIGHSCAN switch included in EMM386.EXE versions 4.49/4.95 allows EMM386.EXE


to map expanded memory pages or Upper Memory Blocks (UMBs) over portions of
the Upper Memory Area (UMA) used by system Read Only Memory (ROM).
MS-DOS 6.xx users ONLY (MEMMAKER):
Choosing "Yes" in response to the MemMaker prompt "Scan the upper memory area
aggressively?" causes MemMaker to add HIGHSCAN to the EMM386.EXE DEVICE line.
If you use HIGHSCAN on the DEVICE=drive:\path\EMM386.EXE line in CONFIG.SYS,
EMM386.EXE examines system ROM area starting at memory location F000:0000
(hex).
If EMM386.EXE determines that ROM is duplicated between F000h-F7FFh and
F800h-FFFFh, EMM386.EXE uses the F000h-F7FFh region for expanded memory page
mapping or UMB memory. This adds up to 32K to the UMA.
On some systems EMM386.EXE uses the ROM area used by other devices, which may
result in incorrect operation. The symptoms of this condition vary. For
example, the system may stop responding (hang) or appear to operate normally
until you use a floppy disk drive. Because of these potential problems,
HIGHSCAN is not used by default. In this case, try to use the EMM386.EXE RAM
switch instead, to map the available UMA.

III. Changes in EMM386.EXE versions 4.49 + 4.95

Versions 4.49 + 4.95 of Microsoft Expanded Memory Manager (EMM386.EXE)


provided with MS-DOS 6.22 and 7.xx/8.00 (Windows 95/98/ME) have these
features:
- Advanced Upper Memory Scanning
- Expanded and Extended Memory Sharing
- Ability to Provide Upper Memory Regions for Microsoft Windows
- Ability to Load with NOEMS When No Page Frame Is Available
- NOVCPI Switch for Smaller Load Size
- Automatic IBM Token Ring Adapter Detection (added NOTR switch)
- Quiet Loading
- Ability to Provide ROM Shadowing,
all discussed in detail below.

Advanced Upper Memory Scanning

EMM386.EXE can now scan the F000h-F7FFh region when the system Read Only
Memory (ROM) is duplicated between F000h-F7FFh and F800h-FFFFh. Also,
EMM386.EXE will include the ROM BASIC area on IBM PS/2 systems.
To enable advanced upper memory scanning, add the HIGHSCAN switch to the
EMM386.EXE line in CONFIG.SYS:
DEVICE=drive:\path\EMM386.EXE HIGHSCAN
On some machines with older BIOSes, specifying HIGHSCAN on the EMM386.EXE
line could hang the system. In such cases replace HIGHSCAN with the less
aggressive RAM switch, which does a similar job in identifying usable Upper
Memory Blocks (UMBs).

Expanded and Extended Memory Sharing

EMM386.EXE 4.49/4.95 can dynamically create, allocate and make available


different memory types (expanded and/or extended) as your system
requirements change:
DEVICE=drive:\path\EMM386.EXE RAM AUTO

Ability to Provide Upper Memory Regions for Windows

EMM386.EXE 4.49/4.95 include the WIN=xxxx-yyyy switch that defines upper


memory regions available for use by Windows. These regions are similar to the
X=xxxx-yyyy regions; memory is not mapped to those areas. But unlike X=
regions, Windows 3.1x/95/98/ME can map their own memory into these upper
memory regions and make more conventional memory available to MS-DOS based
applications running with Windows (example):
DEVICE=drive:\path\EMM386.EXE WIN=D7FF-DFFF

Ability to Load with No Page Frame

EMM386.EXE older than 4.45 do not load if expanded memory support is enabled
and there is not enough contiguous available address space for an expanded
memeory page frame. To support MEMMAKER.EXE, EMM386.EXE 4.49/4.95 display a
warning message and continue to load when this situation occurs:
DEVICE=drive:\path\EMM386.EXE FRAME=NONE

NOVCPI Switch for Smaller Load Size

Previous versions of EMM386.EXE disable both expanded memory and Virtual


Control Program Interface (VCPI) support when the NOEMS switch is used.
EMM386.EXE 4.49/4.95 leave VCPI support enabled by default when the NOEMS
option is used, relying on the expanded and extended memory sharing
enhancement to supply VCPI memory. VCPI support can be disabled with the new
NOVCPI switch.
Using NOEMS and NOVCPI together results in a reduction in the amount of
extended memory used by EMM386.EXE:
DEVICE=drive:\path\EMM386.EXE NOEMS NOVCPI

Token Ring Adapter Detection

EMM386.EXE automatically detects the memory location of IBM Token Ring


adapter cards and prevents the mapping of expanded or upper memory over the
adapter. Token Ring adapter detection can be disabled by using the
undocumented NOTR switch:
DEVICE=drive:\path\EMM386.EXE NOTR
Quiet Loading

By default EMM386.EXE 4.49/4.95 displays messages only if it encounters an


error condition. Adding the /VERBOSE (abbreviated to /V) switch to the EMM386
line in CONFIG.SYS forces EMM386.EXE to display status and error messages
while loading:
DEVICE=drive:\path\EMM386.EXE /V
To display status messages without adding the /V switch, press and hold down
the ALT key while EMM386.EXE is loading.

Ability to Provide ROM Shadowing

EMM386.EXE 4.49/4.95 include the ROM=xxxx-yyyy switch that defines regions of


Read Only Memory (ROM) for EMM386.EXE to "shadow". EMM386.EXE copies the
contents of the ROM to extended memory (RAM) and maps the ROM addresses to
this memory. Specifying this switch can speed up your system if it does not
already use shadow RAM. Most 80486 and all Pentium class and newer systems use
ROM shadowing:
DEVICE=drive:\path\EMM386.EXE ROM=D7FF-DFFF

IV. Troubleshooting MS-DOS + EMM386.EXE 4.49/4.95

If you encounter unexpected behavior (for example the system or a program


hangs) when using EMM386.EXE 4.49/4.95, use these troubleshooting steps:

1. Turn your machine off, and then turn it back on (cold boot) to fully
reinitialize the system.

2. Start MS-DOS 6.xx interactively by pressing F8 as soon as the message


"Starting MS-DOS..." appears. Windows 9x [MS-DOS 7.xx] users need to press
Shift + F8 simultaneously for a similar step-by-step boot confirmation
operation.
This allows to select which CONFIG.SYS and/or AUTOEXEC.BAT commands to
execute by pressing Y (for Yes) or N (for No).

3. When prompted to load EMM386.EXE, choose N. If the problem persists without


loading EMM386.EXE, something other than EMM386.EXE is causing the problem.

4. If the problem disappears when EMM386.EXE is not loaded, edit CONFIG.SYS as


follows using an ASCII text editor (such as EDIT.COM, the default MS-DOS
text/ASCII editor or Notepad, the default Windows text/ASCII editor) and
change the CONFIG.SYS EMM386.EXE line to read:
DEVICE=drive:\path\EMM386.EXE X=A000-F7FF NOHI NOEMS NOVCPI NOMOVEXBDA NOTR
If the problem is specific to the use of the CTRL+ALT+DEL key combination
(warm boot) and EMM386.EXE, add the ALTBOOT parameter to the above line.
WARNING:
Avoid the EMM386.EXE ALTBOOT switch IF using SCSI/(U)DMA/(E)IDE/RAID
add-in/proprietary controllers! The ROM addresses used by these adapters may
CONFLICT with the memory address used by the "ALTernative BOOT" routine,
causing LOCKUPS!

5. Cold boot the machine after making above changes. If the problem persists,
the system may have faulty RAM chips or may require a special machine switch
for HIMEM.SYS. In addition, any BIOS/CMOS settings (such as shadow RAM) may
need to be disabled, or the system ROM BIOS may need to be upgraded for
compatibility with MS-DOS/Windows. Consult your system vendor for information
on CMOS settings and availability of BIOS upgrades.

6. If the problem disappears after loading EMM386.EXE as specified above,


EMM386.EXE itself is not the source of the problem. Instead, the problem may
be related to some service(s) that EMM386.EXE provide(s).

7. If above procedure does not correct the problem, remove each EMM386.EXE
command line option one by one, and then cold boot the machine each time.
If the problem reappears, see further below to find a resolution.

FYI: Troubleshooting system errors/lockups when using EMM386.EXE [PD0470T.TXT,


21 KB, free]:
ftp://ftp.microsoft.com/softlib/mslfiles/PD0470.EXE

X=A000-F7FF

If excluding the entire Upper Memory Area (UMA) resolves a system problem,
EMM386.EXE may be scanning too aggressively and setting up Upper Memory
Blocks (UMBs) on top of some adapter ROM or RAM. Use any available hardware
documentation (including documentation on the add-on hardware devices such as
video, network and disk controller cards) to identify any ROM or RAM present
in the UMA for that device and exclude all pertinent regions (example):
DEVICE=drive:\path\EMM386.EXE X=D800-DFFF
The MicroSoft Diagnostic utility (MSD.EXE) may also be useful in identifying
various mapped memory regions. Run:
MSD
from any DOS prompt, and then press M to display the memory screen.
FYI: See MSD9X.TXT (part of W95-11D.EXE):
http://www.mdgx.com/95.htm
or MSD62.TXT (part of W31-11D.ZIP):
http://www.mdgx.com/31.htm
for MSD usage details.

NOHI

EMM386.EXE has the ability to load a portion of itself into UMBs (Upper Memory
Blocks). If the NOHI option corrects the problem with EMM386.EXE, EMM386.EXE
may be loading into an occupied UMB. Excluding the appropriate ranges in the
UMA may correct this problem (see the "X=A000-F7FF" section above). If all
such regions are excluded, EMM386.EXE cannot be loaded high on the system, and
the NOHI switch must be used:
DEVICE=drive:\path\EMM386.EXE NOHI
Contact your system manufacturer/vendor for additional info on compatibility
with EMM386.EXE.

NOEMS

If the NOEMS parameter corrects the problem with EMM386.EXE, EMM386.EXE may
be inadvertently conflicting with some hardware ROM or RAM address in the UMA
when attempting to establish an expanded memory (EMS) page frame. If EMS is
required to run MS-DOS-based applications, use the parameter FRAME=xxxx or Mx
(where xxxx and respectively x is the defined hex address) to explicitly
specify the placement of the EMS page frame in a nonconflicting region
(using the E000-F000 64K region to allocate the page frame in this example):
DEVICE=drive:\path\EMM386.EXE FRAME=E000
or (example using the same region for the page frame):
DEVICE=drive:\path\EMM386.EXE M9
If no applications/games require expanded memory (EMS), simply continue to use
the NOEMS parameter:
DEVICE=drive:\path\EMM386.EXE NOEMS

NOVCPI

The NOVCPI switch disables Virtual Control Program Interface (VCPI) support
and can be used only in conjunction with the NOEMS parameter. If using NOVCPI
corrects the problem, the application may not be fully compatible with the
EMM386.EXE VCPI allocation scheme. Either continue using NOVCPI, or do not
load EMM386.EXE when using the application:
DEVICE=drive:\path\EMM386.EXE NOVCPI

NOMOVEXBDA

Some (older) machines use the last KiloByte of conventional memory for an
Extended BIOS Data Area (EBDA). By default EMM386.EXE remaps this memory area
into the UMA (Upper Memory Area) instead of conventional memory. If this
causes unexpected system behavior, the NOMOVEXBDA parameter MUST be used:
DEVICE=drive:\path\EMM386.EXE NOMOVEXBDA

NOTR

The EMM386.EXE detection code searches for the presence of a Token Ring
network adapter. This detection code may cause some computers to hang. The
NOTR switch can be used to disable this search in such cases:
DEVICE=drive:\path\EMM386.EXE NOTR

For more details on EMM386.EXE command line syntax:


- MS-DOS 6.xx users: run:
HELP EMM386.EXE
from any DOS prompt.
- Windows 95/98/ME users: use Notepad to read the "EMM386.EXE" topic in
MSDOSDRV.TXT, a text file located in your main Windows folder:
http://support.microsoft.com/kb/234868

V. MS-DOS BUFFERS

A BUFFER is a portion of memory that DOS sets aside for buffering disk I/O
(Input/Output).
DOS stores directories and partial blocks here. DOS must read a full sector
of information from the disk. If the application asks for an amount of
information that is not an exact multiple of the sector size then the whole
sector must be stored somewhere while DOS gives the partial amount asked for
to the application that asked for it. DOS uses the BUFFERS to store
directories because it needs somewhere to store information for its own use.
DOS keeps one BUFFER in the kernel to make sure that it has at least one at
all times. The rest are loaded as "Added Data".
In MS-DOS 4.xx up to 8.00 [a.k.a. Windows ME] the size of each BUFFER is
fixed at 528 Bytes.
You actually need only one BUFFER. Any program that claims it needs more is
really only making a recommendation. Of course, your system will probably run
slower if you have only one BUFFER, but no more than one is actually needed
to operate. Consult your OS/software manuals for suggestions on how many
BUFFERS you should allocate.
Disk cache tools (like Microsoft SMARTDRV.EXE) may perform some of the same
services as DOS BUFFERS. If you use a disk cache consult the disk cache
documentation when deciding how many BUFFERS to allocate.
BUFFERS is actually an area of RAM which is available for buffering disk I/O
(In/Out).
They are not used by the count. Having 20 BUFFERS means that you allow 10 KB
(20 x 528 Bytes) of disk buffering.
The BUFFERS line can be specified only in CONFIG.SYS.
If you are using Microsoft SmartDrive 4.xx/5.xx (SMARTDRV.SYS/SMARTDRV.EXE)
to cache your disk(s) reads/writes and Windows/WfWG 3.1x or Windows 95/98/ME
32-bit Fast Disk Access (FBDA), you need ONLY 11 BUFFERS, specified by this
CONFIG.SYS line:
BUFFERS=11
especially on Pentium class or newer CPUs equipped with
(E)IDE/(U)ATA/RAID/SCSI drive controllers.
More info @ MSKB:
http://support.microsoft.com/kb/156332
More than that is not needed and won't fit into the High Memory Area (HMA),
forcing any additional BUFFERS to load into conventional RAM, thus decreasing
the amount of memory available to DOS programs/games.
More info @ MSKB:
http://support.microsoft.com/kb/78434

VI. EMM386 ERROR MESSAGES

If EMM386 displays a message like:


"EMM386 has detected error ?? in XXXXXXXX.EXE"
this indicates that the processor has reported an exception error to EMM386.
An exception error typically occurs when an application gives the CPU an
instruction under invalid or unexpected conditions.
In most cases these errors are related to a specific program. If you are
receiving an error that does not occur with any particular application, the
error might be caused by a device driver or a TSR (Terminate and Stay
Resident program). To avoid EMM386 errors:

* Identify the program involved. See if the error occurs when the program is
not running. If you suspect a memory resident program/TSR/device driver:
- try bypassing it when your computer starts,
- get an updated (current) version from your program vendor,
- REMark the offending command line by adding:
- REM or ; (semicolon) in front of it in your CONFIG.SYS,
- REM or :: (double colon) in front of it in your AUTOEXEC.BAT,
and then cold reboot your computer.

* Disable EMM386. If a particular application is to blame, disabling EMM386


might allow that application to generate an error message. Disabling EMM386
will also change your memory configuration so the error may no longer occur.

* Change the order in which devices/drivers/TSRs load from your CONFIG.SYS


and/or AUTOEXEC.BAT files. This may help because some errors occur ONLY under
specific memory conditions.

* Error 12 message: a stack is being used incorrectly.


DOS uses a maximum of 16 STACKS for itself, and any number greater than 16 is
a waste of memory anyway. Each stack can have a maximum value of 512 Bytes, in
128 Bytes increments. Example:
STACKS=16,512
Windows itself does not benefit from increased stack size. It is actually the
combination of EMM386.EXE, SMARTDRV.EXE and the Mouse driver combined with any
MS-DOS mode (legacy) TSRs/devices/drivers already installed on the system that
can cause problems.
SMARTDRV.EXE and the Mouse driver hook the timer interrupt. EMM386.EXE and
SMARTDRV.EXE hook the keyboard interrupt. When these hooks are added to a
machine running network software or other TSRs that hook the same interrupts,
the stack space requirements exceed 128 Bytes (default stack size) and a stack
overflow error may occur.
More info @ MSKB:
http://support.microsoft.com/kb/82774
For details on the CONFIG.SYS STACKS command:
- MS-DOS 6.xx users: run:
HELP STACKS
from any DOS prompt.
- Windows 95/98/ME users: use Notepad to read the "STACKS/STACKSHIGH" topic in
CONFIG.TXT, a text file located in your main Windows folder, or go to:
http://support.microsoft.com/kb/234853
- See this MSKB article:
http://support.microsoft.com/kb/84300
Workarounds:

1. Add/modify the STACKS line in your CONFIG.SYS to read:


STACKS=12,256
to provide 12 DOS STACKS of 256 Bytes each (minimum for playing safe).
If you believe this is not enough, increase the STACKS number to 16 (maximum
needed):
STACKS=16,256
Reboot when done.
This also avoids another error message generated by a too low STACKS number:
"Stack overflow. System halted."

2. Add/modify the STACKS line in your CONFIG.SYS to read:


STACKS=0,0
to revert back to older MS-DOS 3.xx stack handling, ONLY IF you believe you
do NOT have ANY MS-DOS/Windows applications/games that require stack switching
to operate.
The STACKS=0,0 line actually speeds up your system, even on faster Pentium
class and newer computers. If you determined that none of your programs need
stack handling, set the STACKS line to 0 in your CONFIG.SYS (see above) to
save (upper) memory space and decrease I/O processing time.
Disabling stack switching works for most MS-DOS programs, but may cause stack
overflow errors for others, especially older ones. Stack overflow errors can
cause completely unpredictable results since interrupts occur at random times.
Therefore if using older MS-DOS programs, it is preferable to leave stack
switching active (see workaround 1 above).

* Error 13 message: an application may be trying to use protected mode without


cooperating with EMM386. You may need to obtain an updated VCPI compliant
version of that particular program/game from the vendor or not load EMM386.EXE
when using it.

VII. EMM386.EXE ERROR CODES

Code Meaning
------------------------------------
0 Divide error
1 Debugger interrupt
2 Nonmaskable interrupt
3 Breakpoint
4 Overflow interrupt
5 Array boundary violation
6 Invalid opcode
7 Coprocessor not available
8 Double fault
9 Coprocessor segment overrun
10 Invalid task state segment
11 Segment not present
12 Stack exception
13 General protection violation
14 Page fault
16 Coprocessor error

More info @ MSKB:


http://support.microsoft.com/kb/78557
______________________________________________________________________________
������������������������������������������������������������������������������

You might also like