EXMS86: EMS-backed XMS

EXMS86 is a TSR that provides XMS 2.0 memory services by leveraging an EMS 3.2 source. It’s designed for 16-bit DOS computers equipped with EMS hardware such as the Lo-Tech EMS board, Intel AboveBoard, Bocaram XT, etc.

With EXMS86, software that depends on XMS memory can now run on classic systems like the IBM PC and XT.

It's also a great fit for 386 and 486 machines with limited RAM but a generous EMS board. In many cases, the XMS memory provided by EXMS86 is faster than HIMEM-managed extended memory, since EXMS86 operates entirely in real mode.

In addition to providing XMS support, EXMS86 can also repurpose your EMS page frame to create up to 64 KB of UMB, offering extra space to load TSRs and such.

Why?

I wanted my DOSMid MIDI player to support EMS when XMS isn’t available. Sure, I could have added EMS support directly into DOSMid, but that would be so boring.

Instead, I decided to take a more versatile route by building a generic XMS driver. It felt like a more rewarding challenge, and one that could benefit other projects too. So here it is.

That said, a word of caution: unfortunately I don’t own an actual EMS card myself, so testing has been limited. It worked for me in a virtualized setup and I've got numerous positive reports from EMS cards owners, so hopefully it’ll run fine on your hardware, too. Still, don’t rely on it for anything mission-critical.

Have an ISA EMS card that's not fulfilling its destiny? Donate it to my EXMS86 R&D lab! I'll give it purpose, appreciation, a comfy ISA slot to sit in, and maybe even the occasional massage. Postage's on me.

How is it possible?

It is a common misconception that XMS is only possible on 386+ machines.

XMS (v2.0) is fundamentally a memory-copying API. Applications using XMS do not care where the memory comes from. While XMS is commonly associated with RAM located above the 1 MB boundary (often called "extended memory") on 386+ PCs, that's a historical convention, not a technical requirement. Hence it is perfectly possible for a driver to expose memory via the XMS API even if said memory is not part of the system's RAM - like memory from an EMS board.

Download

exms86-0.9.7.zip (22 AUG 2025)
exms86-0.9.6.zip (14 AUG 2025)
exms86-0.9.5.zip (07 AUG 2025)
exms86-0.9.4.zip (06 AUG 2025)
exms86-0.9.3.zip (29 JUL 2025)
exms86-0.9.2.zip (25 JUL 2025)
exms86-0.9.1.zip (19 JUL 2025)
exms86-0.9.zip (16 JUL 2025)

Source code is tracked in subversion:
svn co svn://svn.mateusz.fr/exms86

EXMS86 is published under the terms of the MIT license. Copyright © 2025 Mateusz Viste.