Hubbry Logo
Expanded memoryExpanded memoryMain
Open search
Expanded memory
Community hub
Expanded memory
logo
8 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
Contribute something
Expanded memory
Expanded memory
from Wikipedia

Several expanded-memory pages are bank-switched in the page frame, part of the upper memory area.

In DOS memory management, expanded memory is a system of bank switching that provided additional memory to DOS programs beyond the limit of conventional memory (640 KiB).

Expanded memory is an umbrella term for several incompatible technology variants. The most widely used variant was the Expanded Memory Specification (EMS), which was developed jointly by Lotus Software, Intel, and Microsoft, so that this specification was sometimes referred to as "LIM EMS". LIM EMS had three versions: 3.0, 3.2, and 4.0. The first widely implemented version was EMS 3.2, which supported up to 8 MiB of expanded memory and uses parts of the address space normally dedicated to communication with peripherals (upper memory) to map portions of the expanded memory. EEMS, an expanded-memory management standard competing with LIM EMS 3.x, was developed by AST Research, Quadram and Ashton-Tate ("AQA"); it could map any area of the lower 1 MiB. EEMS ultimately was incorporated in LIM EMS 4.0, which supported up to 32 MiB of expanded memory and provided some support for DOS multitasking as well. IBM, however, created its own expanded-memory standard called XMA.

The use of expanded memory became common with games and business programs such as Lotus 1-2-3 in the late 1980s through the mid-1990s, but its use declined as users switched from DOS to protected-mode operating systems such as Linux, IBM OS/2, and Microsoft Windows.

Background

[edit]
A section of the lower 1 MiB address space provides a "window" into several megabytes of Expanded Memory

The 8088 processor of the IBM PC and IBM PC/XT can address one megabyte (MiB, or 220 bytes) of memory. It inherited this limit from the 20-bit external address bus (and overall memory addressing architecture) of the Intel 8086. The designers of the PC allocated the lower 640 KiB (655360 bytes) of address space for read-write program memory (RAM), called conventional memory, and the remaining 384 KiB of memory space is reserved for uses such as the system BIOS, video memory, and memory on expansion peripheral boards.

Even though the IBM PC AT, introduced in 1984, uses the 80286 chip that can address up to 16 MiB of RAM as extended memory, it can only do so in protected mode. The scarcity of software compatible with protected mode (no standard DOS applications can run in it) meant that the market was still open for another solution.[1]

To make more memory accessible, a bank switching scheme was devised, where only selected parts of the additional memory is accessible at any given time. Originally, a single 64 KiB (216 bytes) window of memory, called a page frame, was used; later this was made more flexible. Programs are written in a specific way to access expanded memory. The window between conventional memory and expanded memory can be adjusted to access different locations within the expanded memory.

A first attempt to use a bank switching technique was made by Tall Tree Systems with its JRAM boards,[2] but these did not catch on.[1] (Tall Tree Systems later made EMS-based boards using the same JRAM brand.)

Expanded Memory Specification (EMS)

[edit]

Lotus Development, Intel, and Microsoft cooperated to develop the EMS standard (aka LIM EMS). The first publicly available version of EMS, version 3.0 allows access of up to 4 MiB of expanded memory.[citation needed] This was increased to 8 MiB with version 3.2 of the specification. The final version of EMS, version 4.0 increased the maximum amount of expanded memory to 32 MiB and supports additional functionality.

Microsoft thought that bank switching was an inelegant and temporary, but necessary stopgap measure. Slamming his fist on the table during an interview Bill Gates said of expanded memory, "It's garbage! It's a kludge! … But we're going to do it". The companies planned to launch the standard at the Spring 1985 COMDEX, with many expansion-card and software companies announcing their support.[3][4] AST Research, STB Systems, Persyst, Quadram, and Tecmar quickly designed EMS-compliant cards to compete with Intel's own Above Board expansion card. By mid-1985 some already called EMS a de facto standard.[5]

The first public version of the EMS standard, called EMS 3.0 was released in 1985; EMS 3.0, however, saw almost no hardware implementations before being superseded by EMS 3.2. EMS 3.2 uses a 64 KiB region in the upper 384 KiB (upper memory area) divided into four 16 KiB pages, which can be used to map portions of the expanded memory.[1]

Quadram, AST, and Ashton-Tate created the Enhanced EMS (EEMS) standard. EEMS, a superset of EMS 3.2, allows any 16 KiB region in lower RAM to be mapped to expanded memory, as long as it was not associated with interrupts or dedicated I/O memory such as network or video cards. Thus, entire programs can be switched in and out of the extra RAM. EEMS also added support for two sets of mapping registers. These features are used by early DOS multitasker software such as DESQview. 1987's LIM EMS 4.0 specification incorporated practically all features of EEMS.[1]

A new feature added in LIM EMS 4.0 was that EMS boards can have multiple sets of page-mapping registers (up to 64 sets). This allows a primitive form of DOS multitasking. The caveat is, however, that the standard does not specify how many register sets a board should have, so there is great variability between hardware implementations in this respect.[6]

The Expanded Memory Specification (EMS) is the specification describing the use of expanded memory. EMS functions are accessible through software interrupt 67h. Programs using EMS must first establish the presence of an installed expanded memory manager (EMM) by checking for a device driver with the device name EMMXXXX0.

Expanded Memory Adapter (XMA)

[edit]

IBM remained silent as the industry widely adopted the LIM standard.[5] The company developed its own memory standard called Expanded Memory Adapter (XMA); the IBM DOS driver for it is XMAEM.SYS. Unlike EMS, the IBM expansion boards can be addressed both using an expanded memory model and as extended memory.[7] The expanded memory hardware interface used by XMA boards is, however, incompatible with EMS,[8] but a XMA2EMS.SYS driver provides EMS emulation for XMA boards.[7] XMA boards were first introduced for the 1986 (revamped) models of the 3270 PC.[8]

Implementations

[edit]

Expansion boards

[edit]
Emulex Persyst 4 MiB ISA memory board

This insertion of a memory window into the peripheral address space could originally be accomplished only through specific expansion boards, plugged into the ISA expansion bus of the computer. Famous 1980s expanded memory boards were AST RAMpage, IBM PS/2 80286 Memory Expansion Option, AT&T Expanded Memory Adapter and the Intel Above Board. Given the price of RAM during the period, up to several hundred dollars per MiB, and the quality and reputation of the above brand names, an expanded memory board was very expensive.

Motherboard chipsets

[edit]

Later, some motherboard chipsets of Intel 80286-based computers implemented an expanded memory scheme that did not require add-on boards, notably the NEAT chipset. Typically, software switches determined how much memory should be used as expanded memory and how much should be used as extended memory.

Device drivers

[edit]

An expanded-memory board, being a hardware peripheral, needed a software device driver, which exported its services. Such a device driver was called expanded-memory manager. Its name was variable; the previously mentioned boards used REMM.SYS (AST), PS2EMM.SYS (IBM), AEMM.SYS (AT&T) and EMM.SYS (Intel) respectively. Later, the expression became associated with software-only solutions requiring the Intel 80386 processor, for example Quarterdeck's QEMM, Qualitas' 386MAX or the default EMM386 in MS-DOS, PC DOS and DR-DOS.

Software emulation

[edit]

Beginning in 1986, the built-in memory management features of Intel 80386 processor freely modeled the address space when running legacy real-mode software, making hardware solutions unnecessary. Expanded memory could be simulated in software.

The first software expanded-memory management (emulation) program was CEMM, available in September 1986 as a utility for the Compaq Deskpro 386. A popular and well-featured commercial solution was Quarterdeck's QEMM. A contender was Qualitas' 386MAX. Functionality was later incorporated into MS-DOS 4.01 in 1989 and into DR DOS 5.0 in 1990, as EMM386.

Software expanded-memory managers in general offered additional, but closely related functionality. Notably, they allowed using parts of the upper memory area (UMA) (the upper 384 KiB of real-mode address space) called upper memory blocks (UMBs) and provided tools for loading small programs, typically terminate-and-stay-resident programs inside ("LOADHI" or "LOADHIGH").

Interaction between extended memory, expanded-memory emulation and DOS extenders ended up being regulated by the XMS, Virtual Control Program Interface (VCPI), DOS Protected Mode Interface (DPMI) and DOS Protected Mode Services (DPMS) specifications.

Certain emulation programs, colloquially known as LIMulators, did not rely on motherboard or 80386 features at all. Instead, they reserved 64 KiB of the base RAM for the expanded memory window, where they copied data to and from either extended memory or the hard disk when application programs requested page switches. This was programmatically easy to implement, but performance was low. This technique was offered by AboveDisk from Above Software and by several shareware programs.

It is also possible to emulate EMS by using XMS memory on 286 CPUs using 3rd party utilities like EMM286 (.SYS driver).

Decline

[edit]

Expanded Memory usage declined in the 1990s. New operating systems like Linux, Windows 9x, Windows NT, OS/2, and BSD/OS supported protected mode "out of the box". These and similar developments rendered Expanded Memory an obsolete concept.

Similar concepts

[edit]

Other platforms have implemented the same basic concept – additional memory outside of the main address space – but in technically incompatible ways:

  • Expanded storage was a feature on IBM mainframes providing additional memory outside of the main system memory, first introduced with the IBM 3090 high-end mainframe series in 1985.[9] Expanded storage could not be directly addressed by applications; an MVS feature known as "window services" enabled applications to allocate movable windows to expanded storage within their own address space. There was also a "data mover" feature which could be invoked to move data between main memory (central storage) and expanded storage; later, an "Asynchronous Data Mover Facility" (ADMF) was introduced, which enabled applications to request data to be moved between the two in the background, while they performed other processing. By the mid-1990s, expanded storage had ceased to be a physically separate memory, and had become merely a logical division within the system memory enforced by firmware; but it was not until the November 2016 release of z/VM 6.4 that IBM finally removed all support for expanded storage from its mainframe operating systems.[10]
  • Address Windowing Extensions (AWE) is a conceptually similar feature in Microsoft Windows, used to enable 32-bit applications to access more memory than the 2–4GB that can fit in a 32-bit address space. Although still supported by current versions of Windows, its use has been superseded by 64-bit applications, which can access >4GB of memory directly.
  • Virtual memory creates the illusion of available memory using, for instance, disk storage.

See also

[edit]

References

[edit]

Further reading

[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
Expanded memory, commonly referred to as EMS, is a hardware and software standard that enables applications on early PC-compatible systems to access additional (RAM) beyond the 640 KB conventional memory limit imposed by the operating system, through a bank-switching mechanism that maps blocks of expanded memory into a dedicated 64 KB page frame located in the upper memory area (typically between 640 KB and 1 MB). Developed jointly by Lotus, , and —collectively known as the LIM consortium—the specification originated with version 3.0 announced in 1985 to support memory-intensive applications like spreadsheets, evolving to version 4.0 by 1987, which extended capacity to 32 MB while introducing features for multitasking and more efficient . The core of EMS relies on an Expanded Memory Manager (EMM), a device driver loaded via CONFIG.SYS that interfaces with add-in expansion cards providing the physical expanded memory, using interrupt 67h to handle functions such as allocating memory handles (up to 255 per system), mapping 16 KB logical pages into the page frame's physical pages, and performing data transfers between expanded and conventional memory regions. This page-frame approach, often positioned in unused segments like C800h–EFFFh to avoid conflicts with video RAM or ROM BIOS, allows even 8088-based systems to leverage additional memory without requiring protected mode, distinguishing EMS from extended memory, which provides contiguous blocks above 1 MB but is limited to 80286 and higher processors under the separate XMS standard. Early implementations, such as LIM EMS 3.2, supported up to 8 MB and focused on single-tasking environments, but enhancements like AST Research's EEMS architecture influenced LIM 4.0's addition of multiple mapping registers (up to 64 per set) and support for operating environments like Quarterdeck's DESQview, enabling rudimentary multitasking on limited hardware. By the late 1980s, EMS became integral to running larger programs, with software like explicitly designed to exploit it for data storage, though its nonlinear access—requiring frequent page swaps—introduced overhead compared to later linear memory models. 5.0 (1991) further popularized EMS through the EMM386.EXE driver, which emulated expanded memory using on 286+ systems, bridging the gap until protected-mode interfaces like DPMI rendered bank-switching largely obsolete by the mid-1990s. Despite its historical significance in overcoming the "640 KB barrier," EMS's reliance on specific hardware and configuration made it prone to compatibility issues, such as page frame relocation to evade ROM refresh conflicts during warm boots.

Background

DOS Memory Architecture

The memory architecture was fundamentally shaped by the limitations of the and 8088 processors, which operated in and featured a 20-bit address bus capable of addressing up to 1 MB (1,048,576 bytes) of physical , from 00000h to FFFFFh. In this segmented addressing scheme, was divided into 64 KB segments, with effective addresses calculated as segment × 16 + offset, allowing access to the full 1 MB but constraining individual segments to 64 KB without explicit management. This design, inherited from the original PC in 1981, allocated the lower portion for general use while reserving the upper regions for essential hardware functions, creating inherent constraints for applications. Conventional memory, also known as base memory, comprised the first 640 KB (addresses 00000h to 9FFFFh), which was the primary space available to programs and the operating system itself for loading executables, data, and runtime stacks. This limit arose because the upper 384 KB (A0000h to FFFFFh) was reserved for hardware-specific purposes, preventing contiguous RAM allocation beyond 640 KB without specialized techniques. The PC Technical Reference specified that could be expanded up to 640 KB on the system board and via expansion slots, but practical usability was dictated by these fixed reservations, which could not directly repurpose. The upper memory area (UMA), spanning 640 KB to 1 MB, consisted of non-contiguous blocks dedicated to ROM firmware, adapter cards, and peripheral devices, further fragmenting the address space. Key reservations included 128 KB for video RAM at A0000h–BFFFFh, used by display adapters such as the (CGA) for on-screen buffers in text or graphics modes. Another 128 KB at C0000h–DFFFFh was allocated for adapter ROMs and expansion cards, like those for hard disks or network interfaces, while E0000h–EFFFFh (64 KB) accommodated optional ROM modules. The highest block, F0000h–FFFFFh (64 KB), housed the system ROM containing the routines for I/O operations, , and the , with the final 16 bytes (FFFF0h–FFFFFh) reserved for the .
Address RangeSizeAllocation
00000h–9FFFFh640 KBConventional memory (RAM for programs and OS)
A0000h–BFFFFh128 KBVideo RAM (display adapters)
C0000h–DFFFFh128 KBAdapter ROMs and expansion cards
E0000h–EFFFFh64 KBOptional ROMs
F0000h–FFFFFh64 KBSystem ROM (BIOS and BASIC)
This static partitioning ensured hardware compatibility but imposed severe restrictions on MS-DOS, as the real-mode environment lacked mechanisms for dynamic relocation, compelling developers to optimize within the 640 KB boundary or seek external memory solutions.

Origins of the EMS Standard

In the mid-1980s, the PC and compatible systems running faced severe constraints, with limited to 640 KB, which increasingly hampered the performance of sophisticated applications. To address this growing bottleneck, Lotus Development Corporation, Corporation, and Corporation formed the Lotus-- (LIM) consortium in 1985. This collaboration aimed to establish a standardized method for accessing additional beyond the DOS limit, enabling software vendors to develop programs that could handle larger datasets without crashing or requiring cumbersome workarounds. The catalyst for this initiative was the rapid evolution of productivity software, particularly spreadsheet programs like , whose second release in demanded more than 640 KB to manage expansive worksheets and complex calculations. Early proposals emerged from hardware innovations, such as Intel's Above Board introduced in , which demonstrated the feasibility of bank-switched access but lacked a unified standard, leading to compatibility issues across vendors. The LIM group responded by releasing the initial Expanded Memory Specification (EMS) version 3.0 later that year, announced at the Spring COMDEX trade show by Lotus and , providing a framework for up to 4 MB of expanded through a dedicated page frame in upper . Software vendors played a pivotal role in driving the standard's adoption, particularly for memory-intensive applications. This consortium effort not only resolved immediate shortages for business tools but also laid the groundwork for broader strategies in the PC ecosystem.

Technical Specifications

EMS Page Mapping System

The EMS page mapping system enables access to expanded memory beyond the 1 MB limit of DOS by dynamically swapping 16 KB pages of expanded memory into a fixed 64 KB page frame located in the upper memory area, typically a 64 KB block such as from D0000h to DFFFFh to minimize conflicts with video memory and other hardware mappings. This page frame, often starting at a segment address like D000h, consists of four contiguous 16 KB physical pages, providing a "window" through which applications can read and write data as if it were . The system relies on rather than direct addressing, allowing up to several megabytes of expanded memory to be managed efficiently within the constraints of real-mode addressing. Logical pages from the expanded memory pool are mapped to these physical pages using four mapping registers, one for each 16 KB slot in the page frame. Each register holds a value specifying which logical page (a 16 KB block identified by a zero-based page number) is currently visible in that physical slot, enabling selective swapping without affecting the entire memory space. The expanded memory is organized into a large array of such logical pages, with the total number depending on the hardware capacity, and mappings ensure that only the requested portions are accessible at any time to prevent address space fragmentation. Applications allocate blocks of logical pages via an , a (ranging from 1 to 255) assigned by the EMS manager, which is typically the EMM.SYS loaded under DOS. Handles are numbered from 0 to 255, with 0 reserved for the operating system, leaving 1 to 255 for applications. This handle represents ownership of a contiguous set of logical pages, and the EMS manager oversees the swapping process by updating the mapping registers in response to application requests, ensuring thread-safe access and preventing overlaps between multiple programs. Deallocation occurs by releasing the handle, freeing the pages back to the pool for reuse. DOS applications interact with the EMS page mapping system through software interrupt 67h, where the AH register specifies the function code. Key functions include AH=43h to allocate pages and obtain a handle (with BX specifying the number of 16 KB pages requested), and AH=44h to map a logical page to a specific physical page (AL for physical page 0-3, BX for logical page number). The return value in AH indicates success (00h) or error (e.g., 80h for insufficient memory), allowing programs to manage mappings dynamically during execution. The physical address within the page frame for a mapped logical page is calculated as follows: \text{[Physical address](/page/Physical_address)} = (\text{mapping register value} \ll 14) + \text{offset within 16 KB segment} Here, the mapping register value is the logical page number, the left shift by 14 multiplies by 16 KB (2^{14} = 16384 bytes), and the offset (0 to 16383) provides the byte position within the page; this is added to the base address of the target physical slot in the frame. This mechanism ensures precise, low-overhead access to expanded memory contents.

Version Evolutions and Features

The Expanded Memory Specification (EMS), developed by Lotus, , and (LIM), evolved through several versions to address limitations in capacity, stability, and support for advanced operating environments. The initial EMS 3.0 standard, released in 1985, provided basic bank-switching capabilities for up to 4 MB of expanded using a fixed 64 KB page frame in the upper area. EMS 3.2, introduced in 1986, represented a minor evolution focused on stability improvements and enhanced error handling, while doubling the maximum supported expanded memory to 8 MB. This version refined the page mapping mechanism to reduce conflicts in the 64 KB window, allowing more reliable allocation of up to 128 handles, each representing a variable number of 16 KB pages that could be paged into the frame. These changes addressed early issues with page frame placement and handle management, making the system more robust for DOS applications without altering the core architecture. In 1987, EMS 4.0 marked a significant advancement, expanding support to 32 MB of and introducing features for better multitasking compatibility on 80286 processors. A key addition was the Virtual Control Program Interface (VCPI), which enabled protected-mode operation by allowing DOS extenders to query and allocate memory regions without disrupting real-mode EMS access, facilitating smoother transitions for applications in multitasking environments like DESQview. Additionally, EMS 4.0 added functions for saving and restoring page map states (INT 67h functions 47h and 48h), permitting applications to preserve mapping configurations during context switches, which improved performance in shared-memory scenarios. The specification also supported larger configurable page frames up to 256 KB and mapping into below KB, enhancing flexibility over the single 64 KB frame of prior versions. Parallel to the LIM standard, AST Research developed the Enhanced Expanded Memory Specification (EEMS) in 1986 as a variant, emphasizing faster access through improved . EEMS allowed mapping expanded memory pages directly into the range below 640 KB and supported a larger, configurable page frame up to 256 KB, reducing the overhead of frequent page swaps compared to LIM EMS 3.x. This variant was backward-compatible with LIM software but offered superior performance for EEMS-aware applications, such as Ashton-Tate's , by enabling direct access without exclusive use of the upper memory area. Many EEMS features, including flexible mapping and larger frames, were later integrated into LIM EMS 4.0 to unify the market. Version evolutions introduced compatibility challenges, particularly between EMS 3.0 applications and later hardware or drivers compliant with EMS 4.0. Software written for EMS 3.0 often assumed a fixed 64 KB page frame and lacked support for multiple frames or VCPI, leading to allocation failures or mapping errors on EMS 4.0 systems without emulation modes. For instance, EMS 3.0 programs might not recognize the expanded handle limits or protected-mode interfaces in EMS 4.0, requiring updated drivers or compatibility shims to ensure functionality. These issues were mitigated in later drivers, but they highlighted the need for standardized in evolving memory architectures.

Hardware Implementations

Discrete Expansion Cards

Discrete expansion cards were standalone hardware add-ons designed to provide expanded memory (EMS) compliance on IBM PC-compatible systems, primarily through the (ISA) bus. These cards addressed the 640 KB conventional memory limit of DOS by implementing the Lotus/Intel/Microsoft (LIM) EMS standard, allowing programs to access additional RAM via a page frame in the upper memory area (UMA). Introduced in the mid-1980s, they were essential for memory-intensive applications on 8086, 286, and early 386 systems, where onboard memory expansion was limited or absent. The Above Board, released in 1984, was the first commercially available card to conform to the LIM EMS specification, enabling PC and XT users to break the 1 MB barrier. It supported up to 2 MB of expanded memory using DIP-packaged DRAM chips (such as 64 KB or 256 KB modules), with configurations allowing backfill of up to 640 KB. Later variants, such as the Above Board Plus 8, extended support to up to 8 MB under EMS 3.2, while the Above Board 286 provided up to 2 MB and was compatible with 16-bit 286 systems, though early models were 8-bit only. These cards included diagnostic utilities like CHKMEM for installation verification and featured piggyback daughterboard connectors for additional expansion. Quadram offered multi-function EMS cards that integrated memory expansion with peripheral ports, such as the Quadboard series. Models like the Quadboard-AT supported up to 3.5 MB and the Quadboard PS/Q up to 4 MB of EMS-compliant RAM (in revisions conforming to EMS 4.0), combined with a parallel printer port, serial RS-232C port, and battery-backed . These were popular for business applications requiring both memory and I/O expansion on 286-based PCs. Other notable models included the AST RAMpage series, offering up to 4 MB of EMS in the mid-1980s, with enhancements like multiple page frames that influenced the evolution to LIM EMS 4.0, and the STB Memory Board, which provided EMS functionality with capacities up to 4 MB in the late 1980s, often using bank-switched DRAM for compatibility with LIM 3.2. STB cards gained traction in the market alongside Intel and Quadram offerings, contributing to the widespread adoption of EMS in professional and gaming software during that era. Common across vendors, these cards supported memory ranges of 1-8 MB, tailored to early 286 and 386 systems where total system RAM rarely exceeded 4 MB. Typical installation involved inserting the card into an available 8-bit or 16-bit ISA slot on the , followed by configuration using onboard DIP switches to set the EMS page frame address—commonly at E0000h-EFFFFh to avoid conflicts with video ROM or other UMA residents—and the I/O base (often 0208h). No additional power connectors were required, as these cards drew operating current directly from the ISA bus's +5V rail, typically consuming 5-10 W depending on populated , which was manageable within the standard 200-300 W power supplies of 286/386 PCs. Once installed, a like or vendor-specific software (e.g., Intel's SETBOARD) was loaded in to enable EMS access.

Integrated Motherboard Solutions

Integrated motherboard solutions for Expanded Memory Specification (EMS) emerged in the late 1980s as manufacturers sought to embed memory expansion directly into PC and , eliminating the need for separate expansion cards. One early example was the SCAT (82C235) , released in 1989, which provided onboard support for LIM EMS 4.0, enabling access to up to 16 MB of expanded memory alongside shadow RAM capabilities. This integration allowed 286-based systems to utilize EMS without occupying ISA slots, streamlining hardware configurations for OEMs building compact PCs. BIOS implementations from vendors like American Megatrends Inc. (AMI) and Phoenix/Award further facilitated EMS integration by incorporating configuration options directly into the CMOS setup utility. In AMI BIOS, users could configure the EMS page frame through Advanced Chipset Setup, selecting base address options such as C0000h or D0000h for pages 0-3, along with I/O port addresses for page registers like 208h/209h. Similarly, Award BIOS setups included provisions for EMS memory swapping within the 1 MB address space, defining the 64 KB page frame location above the 640 KB conventional memory limit, often in conjunction with chipset-specific drivers. These features enabled seamless page mapping—typically allocating a 64 KB window in the upper memory area (UMA) from D0000h to EFFFFh—without requiring external hardware adjustments. During the 386 and 486 eras, numerous motherboards incorporated soldered or socketed RAM specifically for EMS, often leveraging chipsets from Acer Labs Inc. (ALi) such as the M1429 for 386SX systems or later 486-compatible variants. These designs allowed up to several megabytes of onboard EMS RAM, populated via DIP sockets or surface-mount chips, providing direct memory expansion tied to the system's Micro Channel Architecture (MCA) or ISA bus. A notable example is the IBM PS/2 Model 50 Z, which offered an optional 386 processor upgrade kit allowing memory expansion to 4 MB or more, compatible with EMS via appropriate drivers and MCA expansion cards supporting LIM standards. Compared to discrete expansion cards, these integrated solutions reduced reliance on precious ISA or MCA slots—freeing them for other peripherals—and improved overall system stability by minimizing potential bus conflicts and signal integrity issues from additional card insertions.

Software Implementations

EMS Device Drivers

EMS device drivers are software components loaded during the DOS boot process to manage access to expanded memory hardware, enabling applications to utilize the Expanded Memory Specification (EMS) through standardized interfaces. These drivers typically reside in the file and handle tasks such as initializing the EMS page frame, allocating handles, and intercepting s for page mapping operations. By providing a consistent via 67h, they allow DOS programs to request and manipulate expanded memory without direct hardware interaction. Microsoft's EMM386.EXE, introduced with 5.0 in 1991, serves as the standard EMS device driver for systems with 80386 or higher processors. Loaded via the directive DEVICE=EMM386.EXE [options], it emulates expanded memory using and supports upper memory block (UMB) allocation for s and TSRs. Common options include RAM to enable UMB usage, NOEMS to disable EMS emulation while retaining UMB support, and FRAME=E000 to specify the 64 KB page frame address in the upper memory area, ensuring compatibility with LIM EMS 4.0 standards. EMM386.EXE manages EMS functionality by allocating logical handles to applications, each representing a set of 16 KB pages that can be mapped to the physical page frame as needed. It intercepts INT 67h calls to perform operations like page allocation (AH=43h), mapping (AH=47h), and deallocation, returning status codes in AH to indicate success (00h) or errors such as insufficient pages (87h) or invalid handles (83h). Troubleshooting common issues involves verifying hardware compatibility and configuration; for instance, failure to detect sufficient extended memory may result in messages like "Unable to set page frame address," often resolved by adjusting the FRAME option or excluding conflicting memory regions with the X= switch. Third-party drivers, such as Quarterdeck's QEMM386 introduced in , offered enhanced EMS management with optimized memory allocation to maximize available conventional RAM. Configured similarly in as DEVICE=QEMM386.SYS [options], QEMM386 provides EMS support alongside advanced features like to relocate ROM shadows into , allowing more efficient use of the upper memory area compared to EMM386. It allocates EMS handles and manages interrupts in alignment with the EMS specification but includes optimization tools like the OPTIMIZE utility to analyze and relocate drivers/TSRs, potentially freeing up to 600 KB of conventional in complex setups.

Software-Based Emulation

Software-based emulation of expanded memory (EMS) enabled compatibility with EMS-dependent applications on systems lacking dedicated EMS hardware, by simulating the page-mapping mechanism using available system resources such as or . This approach was particularly valuable during the late and early 1990s, when many DOS programs required EMS support but hardware upgrades were not always feasible. Emulation relied on device drivers and third-party utilities that intercepted EMS calls and managed memory access through software, often at the cost of performance compared to hardware implementations. The most prominent software emulator was EMM386.EXE, introduced by in 5.0 in 1991, which leveraged the features of the 80386 processor and later CPUs to simulate EMS using extended memory above the 1 MB boundary. EMM386 allocated portions of —specified via the RAM= switch—for EMS page frames, mapping 16 KB pages into a 64 KB window in the upper memory area (between 640 KB and 1 MB) to mimic the LIM EMS 4.0 standard. This emulation required a 64 KB contiguous block in upper memory for the page frame and utilized the 80386's paging unit to handle address translations without hardware assistance. The NOEMS switch disabled EMS simulation, reserving extended memory solely for extended memory specification (XMS) access and upper memory blocks (UMBs), but when enabled, EMM386 provided seamless compatibility for legacy EMS applications. However, this method was incompatible with 80286 systems, which lacked the necessary extensions for efficient page simulation, limiting 286 users to partial without full EMS support. For systems with insufficient RAM, disk-based swapping served as a fallback to emulate EMS functionality, though it introduced significant latency. Utilities like VDISK.SYS, included in PC-DOS since version 3.3, created virtual disks that could utilize extended or for temporary storage, allowing EMS-aware programs to offload to disk or a RAM disk when physical RAM was exhausted. This approach allowed low-memory configurations—such as those under 1 MB total—to run EMS-aware programs by using the virtual disk for swapping, but access times were orders of magnitude slower than RAM-based methods due to I/O bottlenecks. Third-party tools expanded on these capabilities, with Qualitas' BlueMAX (version 6.00, released in 1991) providing advanced EMS support for 386 systems by dynamically remapping into EMS-compatible pages. BlueMAX optimized memory allocation, creating virtual EMS banks from extended memory through compression and upper memory block management, often yielding higher effective memory utilization than stock drivers. Such tools were essential for maximizing DOS performance on upgraded PCs without EMS cards. Despite these innovations, software-based EMS emulation suffered from inherent limitations, including reduced performance due to CPU overhead in handling page mappings and interrupts, which could degrade application speed by 20-50% compared to hardware EMS in memory-intensive tasks. On 286 systems lacking 80386 paging, compatibility was further restricted, often requiring hybrid drivers like EMM286.EXE for basic UMB access but no true EMS simulation, forcing users to rely on disk swaps or forego EMS features entirely. These trade-offs highlighted the emulation's role as a bridge technology rather than a full replacement for dedicated hardware.

Applications and Impact

Adoption in DOS Programs

Expanded memory (EMS) saw widespread adoption in DOS programs during the late and early , particularly as software developers sought to overcome the 640 KB limit imposed by . By enabling access to additional memory through a page-mapping system, EMS allowed applications to handle larger datasets and more complex operations without requiring a full transition to protected-mode architectures. In the gaming sector, EMS was instrumental for creating expansive virtual environments and efficient asset management. For instance, (released in 1990 by ) utilized EMS to load graphical and audio assets dynamically via EMS handles rather than relying solely on . This approach enabled the game to maintain detailed missions and interactive elements that would otherwise exceed DOS memory constraints, making EMS a key requirement for optimal performance. Productivity software also embraced EMS to enhance data handling capabilities. Lotus 1-2-3 version 3.0 (1989) incorporated support for expanded memory, permitting worksheets to exceed the 640 KB limit through dynamic allocation of EMS pages for calculations and storage. This feature was essential for business users managing large spreadsheets, as it allowed seamless expansion of data ranges without frequent disk swapping or memory reconfiguration. Programmers accessed EMS functionality through the LIM API, primarily via software 67h (INT 67h), which provided functions for allocation, mapping, and deallocation of memory pages. The following example in demonstrates querying available EMS and allocating a (adapted for clarity; multiply page counts by 16 KB for total size):

DECLARE SUB GetEMSInfo () DIM SHARED EMSHandle AS INTEGER DIM SHARED TotalPages AS INTEGER, FreePages AS INTEGER SUB GetEMSInfo ' Get total and free pages (INT 67h, AH=42h) AX = &H4200 INT86 &H67, REG, REG TotalPages = BX FreePages = DX ' Allocate 10 pages (160 KB) (INT 67h, AH=43h) AX = &H4300 BX = 10 INT86 &H67, REG, REG IF AX = 0 THEN EMSHandle = DX ' Save handle for mapping PRINT "Allocated 10 EMS pages (160 KB)" ELSE PRINT "Allocation failed" END IF END SUB

DECLARE SUB GetEMSInfo () DIM SHARED EMSHandle AS INTEGER DIM SHARED TotalPages AS INTEGER, FreePages AS INTEGER SUB GetEMSInfo ' Get total and free pages (INT 67h, AH=42h) AX = &H4200 INT86 &H67, REG, REG TotalPages = BX FreePages = DX ' Allocate 10 pages (160 KB) (INT 67h, AH=43h) AX = &H4300 BX = 10 INT86 &H67, REG, REG IF AX = 0 THEN EMSHandle = DX ' Save handle for mapping PRINT "Allocated 10 EMS pages (160 KB)" ELSE PRINT "Allocation failed" END IF END SUB

In C, similar operations use inline assembly for INT 67h calls, such as allocating with the 43h function:

c

#include <dos.h> #include <stdio.h> union REGS regs; void allocateEMS(int pages) { regs.h.ah = 0x43; regs.x.bx = pages; int86(0x67, ®s, ®s); if (regs.x.ax == 0) { printf("Allocated %d EMS pages (handle: %d)\n", pages, regs.x.dx); } else { printf("EMS allocation failed\n"); } } int main() { allocateEMS(10); // Request 10 pages (160 KB) return 0; }

#include <dos.h> #include <stdio.h> union REGS regs; void allocateEMS(int pages) { regs.h.ah = 0x43; regs.x.bx = pages; int86(0x67, ®s, ®s); if (regs.x.ax == 0) { printf("Allocated %d EMS pages (handle: %d)\n", pages, regs.x.dx); } else { printf("EMS allocation failed\n"); } } int main() { allocateEMS(10); // Request 10 pages (160 KB) return 0; }

These calls relied on the underlying EMS page mapping system to swap 16 KB pages into the upper area as needed.

Performance and Limitations

Expanded (EMS) offered significant performance advantages over traditional disk-based overlay methods in DOS applications, primarily due to its hardware-accelerated page mapping mechanism, which allowed rapid access to additional without relying on slower disk I/O operations. In hardware implementations, page swaps—typically involving 16 KB logical pages mapped into a 64 KB page frame—occurred nearly instantaneously via , enabling efficient data access for memory-intensive tasks. However, in software-emulated EMS environments, such as those using on 386 processors, page swaps incurred some overhead from CPU mode transitions, which could impact real-time applications like games requiring frequent . The theoretical maximum capacity of EMS under the LIM 4.0 specification was 32 MB, divided into up to 2048 logical 16 KB pages, allowing substantial expansion beyond the 640 KB limit. In practice, however, hardware implementations were often constrained to 8-16 MB due to address space limitations and the availability of expansion cards, with few DOS programs fully utilizing beyond 4-8 MB for rather than code execution. A key limitation arose from potential conflicts in the upper memory area (UMA), where the 64 KB EMS page frame (typically located between 640 KB and 1 MB) could overlap with address spaces reserved for peripheral devices, such as network interface cards, video ROMs, or other option ROMs, necessitating manual reconfiguration or relocation of the frame to avoid mapping errors and system instability. Benchmark comparisons demonstrated clear performance gains; for instance, memory-intensive DOS applications like spreadsheets or multitasking environments (e.g., DESQview) achieved faster execution times when using EMS for data paging compared to disk overlay files, as RAM-based swaps reduced load times from seconds to milliseconds. EMS accessibility was inherently restricted to real-mode DOS applications, providing no native support in protected-mode environments like Windows 3.x, where only limited emulation for DOS sessions was possible, further confining its utility to legacy DOS computing scenarios.

Decline and Legacy

Factors Leading to Obsolescence

The advent of the 80386 in 1985 introduced 32-bit operation, which supported linear addressing of up to 4 GB of memory and paging, obviating the need for EMS's complex bank-switching to access additional RAM beyond the 1 MB limit. This capability was further enhanced by the 80486 processor in 1989, which integrated faster and caching, enabling DOS applications to utilize more efficiently through standards like XMS without relying on EMS hardware or drivers. Operating systems transitioned toward extended memory support, diminishing EMS's relevance. Windows 3.1, released in 1992, primarily leveraged extended memory via the HIMEM.SYS driver and XMS in its 386 Enhanced mode, allowing up to 256 MB of addressable RAM while providing only limited compatibility for EMS, as the OS directly managed extended memory for better performance in multitasking environments. Similarly, OS/2 2.0 in 1992 emphasized extended memory for its 32-bit architecture, sidelining EMS page-frame requirements that conflicted with protected-mode operations. In protected-mode programming, the Virtual Control Program Interface (VCPI), which supported EMS-style memory allocation, saw limited adoption after 1989, as the (DPMI)—introduced by and standardized in 1991—offered a more versatile framework for 32-bit DOS extenders and applications under Windows, effectively supplanting VCPI for memory services. Economic pressures accelerated EMS's fadeout, as DRAM prices plummeted from around $300 per MB in 1985 to under $25 per MB by 1995, driven by increased manufacturing scale and technological advances, making abundant viable on standard hardware without costly EMS expansion cards. EMS usage peaked in the late 1980s amid high RAM costs but declined sharply by the early 1990s, as affordable larger systems rendered its specialized paging unnecessary. The Extended Memory Specification (XMS), jointly developed by Lotus Development Corporation, Intel Corporation, , and , Inc., and released on July 19, 1988, established a standard for accessing beyond the 1 MB boundary on 80286 and later processors. Implemented via the , XMS enabled applications to allocate and manipulate large, contiguous blocks of extended directly, without the paging overhead inherent in EMS, which targeted the upper area (UMA) between 640 KB and 1 MB for bank-switched access. This approach facilitated more efficient data handling for programs, supporting up to 64 MB initially and later expanding to 4 GB under XMS 3.0 in 1992. Shadow RAM, a performance optimization technique prevalent in 1980s and early 1990s PC implementations, worked by copying the contents of the slower ROM-based into faster system RAM during boot. The address space (typically F0000h–FFFFFh) was then remapped to this RAM shadow, allowing subsequent calls—such as video and disk I/O operations—to execute at RAM speeds rather than ROM speeds, which could be 10–20 times slower. By accelerating routines, shadow RAM reduced contention in the UMA, effectively freeing memory blocks for DOS applications without the need for EMS emulation or additional hardware, though it consumed a small amount of RAM (usually 32–128 KB). Subsequent evolutions in included DOS extenders like DOS/4GW, introduced by Rational Systems in the early , which shifted programs into 32-bit to access up to 4 GB of . These extenders adhered to the (DPMI), a standard that allowed seamless transitions from while leveraging the 80386's paging and segmentation features, thereby circumventing both the 640 KB conventional limit and EMS's bank-switching constraints entirely. DOS/4GW, in particular, became widely adopted for resource-intensive applications like games, enabling direct manipulation of blocks via a client-server model with the host DPMI server. Outside the IBM PC ecosystem, analogous memory management strategies appeared in other platforms. AmigaOS, for example, incorporated memory paging in its Exec kernel to map virtual addresses to physical memory, particularly in versions from AmigaOS 4 onward, where a dedicated swap partition extended available RAM beyond hardware limits through demand-paged allocation. Similarly, classic Macintosh systems under System 7 (introduced in 1991) implemented virtual memory via the Virtual Memory Manager, which used hard disk space as a backing store for paging inactive memory pages out of RAM, transparently expanding the effective address space for applications without hardware-specific banking. Key differences between EMS and XMS are summarized in the following table:
AspectEMS (Expanded Memory Specification)XMS (Extended Memory Specification)
Access MechanismBank-switched 16 KB pages mapped into the UMA (A0000h–FFFFFh)Linear, contiguous blocks accessed above 1 MB
Operating ModeReal mode (8086/8088 compatible)Real mode with preparation for protected mode (80286+)
Memory FocusEmulated expansion within the 1 MB boundaryDirect utilization of extended memory (>1 MB)
Allocation GranularitySmall pages (up to 32 MB total, in 16 KB units)Large handles (up to 64 MB initially, in variable blocks)
These distinctions highlight EMS's role as a compatibility layer for legacy real-mode environments versus XMS's forward-looking design for larger-scale memory operations.

References

  1. https://files.support.[epson](/page/Epson).com/pdf/psb/psb.s-0047c.pdf
Add your contribution
Related Hubs
Contribute something
User Avatar
No comments yet.