Saturday, December 3, 2011

Windows ME EMS Memory Support

Windows ME, by default, doesn't support EMS memory for the legacy DOS applications, in the VDM:



If you create a shortcut for a DOS program (in this case I used the MS-DOS prompt, command.com), and view the memory properties, you can see the EMS memory is unavailable.
Also, if you type MEM inside the command prompt to view the available memory, and supported types, there is no EMS (expanded) memory listed, and legacy applications are unable to use it.
It's useless to try with EMM386.EXE, in Windows ME it's unsupported and won't run at all (even if you try to load it manually, with device.com utility, it won't load).

Microsoft says there is an option in system.ini to try to enable EMS memory, by adding this line to the [386Enh] section:
ReservePageFrame=yes

And if there is free memory to enable EMS, it will be enabled.
However, for me this option alone didn't worked, EMS memory was still unavailable.

Relevant Microsoft article:

Then I was still searching on the internet, and found a way to enable it! You can see the results here:



I've used the same virtual machine as I've used in a previous test, for maximal memory support.
Now after the correct settings in the system.ini file, I got EMS memory support.
It works the same as in Windows 9x, the EMS memory is selectable in the properties window, and in the command prompt, with MEM command, it's also listing the available amount.

What was the option required to enable it?
It's called EMMPageFrame=C800
It tells Windows to reserve the EMS page frame at a fixed memory address.
With both options set in the system.ini, it worked for me.

However, not all computer's memory is free and contiguous at this base address (EMS needs at least 32K for page frame), then if Windows cannot start, or EMS memory is still unavailable, try to use a different memory address to reserve for EMS page frame.

More info can be found here (also alternative methods):
http://www.columbia.edu/~em36/wpdos/emswinme.html
http://apolyton.net/showthread.php/38013-MOO-and-Windows-ME-(Expanded-Memory)

The options I've used, written in the relevant section of the SYSTEM.INI file:

[386Enh]
;Try to reserve page frame for EMS memory support
ReservePageFrame=yes
;Enable EMS memory support, provided the C800-D7FF upper memory area is CONTIGUOUS AND FREE when Windows loads.
EMMPageFrame=C800