5939 lines
164 KiB
Plaintext
5939 lines
164 KiB
Plaintext
|
|
|
|
READ THIS FIRST
|
|
|
|
The Lotus/Intel/Microsoft Expanded Memory Specification changes
|
|
from time to time, so you should contact Intel occasionally to
|
|
ensure that you are using the most recent version.
|
|
|
|
You can reach us at one of our Customer Support numbers.
|
|
|
|
o If you live in the continental United States but outside
|
|
Oregon, call (800) 538-3373.
|
|
|
|
o If you live in Oregon, Hawaii, Alaska, or outside the
|
|
continental United States, call (503) 629-7354.
|
|
|
|
o If you live in Canada, call (800) 234-0444.
|
|
|
|
Customer Support representatives are ready to answer your call
|
|
Monday through Friday, from 7 a.m. to 5 p.m. Pacific time.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
THE LOTUS(R)/INTEL(R)/MICROSOFT(R)
|
|
|
|
EXPANDED MEMORY SPECIFICATION
|
|
|
|
Version 3.20
|
|
Part number: 300275-003
|
|
September, 1985
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Copyright (c) 1985
|
|
Lotus Development Corporation, 55 Cambridge Ave., Cambridge, MA
|
|
02142
|
|
Intel Corporation, 3065 Bowers Ave., Santa Clara, CA 95051
|
|
Microsoft Corporation, 10700 Northup Way, Bellevue, WA 98009
|
|
|
|
|
|
|
|
ii 300275-003
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note: This specification was jointly developed by Lotus
|
|
Development Corporation, Intel Corporation, and Microsoft
|
|
Corporation. Although it has been released into the public
|
|
domain and is not confidential or proprietary, the specification
|
|
is still the copyright and property of Lotus Development
|
|
Corporation, Intel Corporation, and Microsoft Corporation.
|
|
|
|
|
|
DISCLAIMER OF WARRANTY
|
|
|
|
LOTUS DEVELOPMENT CORPORATION, INTEL CORPORATION, AND MICROSOFT
|
|
CORPORATION EXCLUDE ANY AND ALL IMPLIED WARRANTIES, INCLUDING
|
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
PURPOSE. NEITHER LOTUS NOR INTEL NOR MICROSOFT MAKE ANY WARRANTY
|
|
OF REPRESENTATION, EITHER EXPRESS OR IMPLIED, WITH RESPECT TO
|
|
THIS SPECIFICATION, ITS QUALITY, PERFORMANCE, MERCHANTABILITY, OR
|
|
FITNESS FOR A PARTICULAR PURPOSE. NEITHER LOTUS NOR INTEL NOR
|
|
MICROSOFT SHALL HAVE ANY LIABILITY FOR SPECIAL, INCIDENTAL, OR
|
|
CONSEQUENTIAL DAMAGES ARISING OUT OF OR RESULTING FROM THE USE OR
|
|
MODIFICATION OF THIS SPECIFICATION.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
300275-003 iii
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
How to use this specification
|
|
|
|
If you're already familiar with the concept of expanded memory or
|
|
if you're interested in only parts of the spec reading this
|
|
preface can save you time. It gives a brief summary of each
|
|
chapter so you can decide what you need to read.
|
|
|
|
|
|
Chapter 1 -- Introduction to expanded memory
|
|
|
|
This chapter introduces the concept of expanded memory and
|
|
discusses the following topics:
|
|
|
|
o Memory addressing capabilities of the Intel 8086, 8088, and
|
|
80286 microprocessors
|
|
|
|
o Accessing expanded memory
|
|
|
|
o Frequently used terminology
|
|
|
|
You can skip this chapter if you're already familiar with the
|
|
Intel 8086, 8088, and 80286 microprocessors and you understand
|
|
expanded memory.
|
|
|
|
|
|
Chapter 2 -- Writing programs that use expanded memory
|
|
|
|
This chapter provides guidelines to help you create programs that
|
|
use expanded memory. It also describes the individual Expanded
|
|
Memory Manager (EMM) functions in detail, with assembly language
|
|
examples, parameter passing conventions, and an explanation of
|
|
the status and results returned by the function.
|
|
|
|
You should read this chapter if you want to write programs that
|
|
use expanded memory.
|
|
|
|
|
|
Chapter 3 -- Testing for the presence of the Expanded Memory
|
|
Manager
|
|
|
|
This chapter describes two methods your program can use to test
|
|
for the presence of the EMM. You should read this chapter if you
|
|
want to write programs that use expanded memory.
|
|
|
|
|
|
Chapter 4 -- Example expanded memory programs
|
|
|
|
This chapter presents examples of expanded memory programs.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
iv 300275-003
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Glossary
|
|
|
|
The Glossary defines some of the terms that are used frequently
|
|
in this specification. Most of the terms are defined for readers
|
|
who understand technical terminology and are familiar with IBM
|
|
PCs, XTs, and ATs, or compatibles.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
300275-003 v
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Contents
|
|
|
|
|
|
|
|
How to use this specification
|
|
|
|
Chapter 1 -- Introduction
|
|
|
|
The Intel 8086 and 8088 microprocessors......................1-1
|
|
|
|
The Intel 80286 microprocessor...............................1-1
|
|
|
|
How expanded memory is accessed..............................1-1
|
|
|
|
Limitations of the 8086, 8088, and 80286 microprocessors.....1-2
|
|
|
|
Terminology..................................................1-2
|
|
|
|
|
|
Chapter 2 -- Writing programs that use expanded memory
|
|
|
|
Designing your program.......................................2-1
|
|
The operating environment..................................2-1
|
|
Mechanics of the EMM.......................................2-1
|
|
Programming guidelines.....................................2-2
|
|
|
|
The EMM functions............................................2-3
|
|
Overview of the EMM functions..............................2-3
|
|
FUNCTION 1 -- Get status...................................2-5
|
|
FUNCTION 2 -- Get page frame address.......................2-6
|
|
FUNCTION 3 -- Get unallocated page count...................2-7
|
|
FUNCTION 4 -- Allocate pages...............................2-9
|
|
FUNCTION 5 -- Map handle pages.............................2-11
|
|
FUNCTION 6 -- Deallocate pages.............................2-13
|
|
FUNCTION 7 -- Get EMM version..............................2-15
|
|
FUNCTION 8 -- Save page map................................2-16
|
|
FUNCTION 9 -- Restore page map.............................2-18
|
|
FUNCTION 10 -- Reserved....................................2-20
|
|
FUNCTION 11 -- Reserved....................................2-21
|
|
FUNCTION 12 -- Get EMM handle count........................2-22
|
|
FUNCTION 13 -- Get EMM handle pages........................2-23
|
|
FUNCTION 14 -- Get all EMM handle pages....................2-25
|
|
FUNCTION 15 -- Get/set page map............................2-27
|
|
|
|
Summary of status codes......................................2-33
|
|
|
|
|
|
Chapter 3 -- Testing for presence of the manager
|
|
|
|
Which method should my program use?..........................3-1
|
|
|
|
The "open handle" technique..................................3-1
|
|
Using the "open handle" technique..........................3-1
|
|
An example of the "open handle" technique..................3-4
|
|
|
|
|
|
|
|
vi 300275-003
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The "get interrupt vector" technique.........................3-6
|
|
Using the "get interrupt vector" technique.................3-6
|
|
An example of the "get interrupt vector" technique.........3-7
|
|
|
|
|
|
Chapter 4 -- Example expanded memory programs
|
|
|
|
Characteristics of the example procedures....................4-1
|
|
|
|
Transient application program................................4-1
|
|
Flow chart of a transient application program..............4-1
|
|
Explanation of the transient application program
|
|
flow chart.................................................4-2
|
|
Initialization procedures................................4-2
|
|
Processing procedures....................................4-3
|
|
Terminating procedures...................................4-3
|
|
|
|
Resident application program.................................4-3
|
|
Flow chart of a resident application program...............4-4
|
|
Explanation of the resident application program
|
|
flow chart.................................................4-5
|
|
Initializing the resident program and the EMM............4-5
|
|
Saving the current state of the CPU......................4-6
|
|
Resident processing performed before accessing
|
|
expanded memory..........................................4-6
|
|
Saving the state of the expanded memory hardware.........4-6
|
|
Accessing expanded memory................................4-6
|
|
Restoring the state of the expanded memory hardware......4-7
|
|
Terminating the resident program.........................4-7
|
|
Restoring the CPU state..................................4-7
|
|
|
|
Example EMM procedures.......................................4-8
|
|
|
|
|
|
Glossary
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
300275-003 vii
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CHAPTER 1. INTRODUCTION TO EXPANDED MEMORY
|
|
|
|
This specification describes a way to expand the memory
|
|
addressing capabilities of the Intel 8086, 8088, and 80286
|
|
microprocessors. It introduces a "paging" mechanism to access
|
|
very large amounts of memory. This memory paging (also known as
|
|
bank switching or bank swapping) uses a type of memory called
|
|
"expanded memory."
|
|
|
|
The rest of this chapter describes the memory addressing
|
|
capabilities of the Intel 8086, 8088, and 80286 microprocessors
|
|
and how the interface described in this specification overcomes
|
|
their limitations.
|
|
|
|
|
|
The Intel 8086 and 8088 microprocessors
|
|
|
|
The Intel 8086 and 8088 microprocessors let programs or operating
|
|
systems directly access up to 1M byte of address space. DOS, the
|
|
most frequently used operating system for 8086 and 8088-based IBM
|
|
personal computers and compatibles, allows application programs
|
|
to use only up to 640K bytes of memory.
|
|
|
|
This memory space often is not enough for application programs
|
|
which require large amounts of memory to implement spreadsheets,
|
|
databases, and other memory-intensive functions.
|
|
|
|
|
|
The Intel 80286 microprocessor
|
|
|
|
Although the Intel 80286 microprocessor can address more memory
|
|
space (up to 16M bytes) than the 8086 and 8088 microprocessors,
|
|
the amount of memory DOS can access directly is still limited to
|
|
640K bytes. This limitation is imposed because the 80286
|
|
microprocessor operates under one of two modes: Real Mode or
|
|
Protected Virtual Addressing Mode (PVAM).
|
|
|
|
When operating in Real Mode, the 80286 microprocessor lets
|
|
programs or operating systems directly access only up to 1M byte
|
|
of address space. This is the mode that DOS uses, so application
|
|
programs which run on IBM's AT or AT-compatible machines are
|
|
still limited to 640K bytes of usable memory space.
|
|
|
|
When operating in PVAM, the 80286 microprocessor lets programs
|
|
that run under the XENIX operating system address up to 16M bytes
|
|
of memory. However, since most IBM AT or AT-compatible machines
|
|
operate under DOS, application programs can rarely take advantage
|
|
of this extra memory.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Introduction 300275-003 1-1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
How expanded memory is accessed
|
|
|
|
Much as your computer screen acts as a small "window" into a much
|
|
larger spreadsheet, memory paging provides one or more small
|
|
"windows" of memory through which a much larger memory space can
|
|
be accessed. These windows are called physical pages.
|
|
|
|
This specification describes a method where four contiguous
|
|
physical pages of 16K bytes each (forming a block of 64K bytes)
|
|
can access up to 8M bytes of expanded memory space via the
|
|
Expanded Memory Manager (EMM).
|
|
|
|
|
|
Limitations of the 8086, 8088, and 80286 microprocessors
|
|
|
|
You can use the Expanded Memory Manager (EMM) to overcome the
|
|
memory limitations of the Intel 8086, 8088, and 80286
|
|
microprocessors. The EMM is a set of standard interface routines
|
|
which allow programs, running on IBM PCs, XTs, ATs, or
|
|
compatibles, to use up to 8M bytes of expanded memory.
|
|
|
|
Because the EMM is a standard, programs that adhere to the
|
|
Lotus/Intel/Microsoft Expanded Memory Specification can avoid
|
|
potential compatibility problems. Expanded memory application
|
|
programs that deal directly with the hardware or that don't
|
|
strictly adhere to the specification run this risk.
|
|
|
|
Chapter 3 of this specification describes the EMM in detail.
|
|
|
|
|
|
Terminology
|
|
|
|
The following terms are used frequently in this specification:
|
|
|
|
o Conventional memory
|
|
|
|
Conventional memory refers to the memory DOS recognizes. In
|
|
PCs, XTs, and ATs, this is memory between 0 and 640K bytes.
|
|
Because application programs let DOS manage their memory, they
|
|
can use only conventional memory.
|
|
|
|
o Expanded memory
|
|
|
|
Expanded memory is a special kind of memory that goes beyond
|
|
DOS's 640K-byte limit. Application programs that adhere to
|
|
the Lotus/Intel Expanded Memory Specification can use the
|
|
Expanded Memory Manager (EMM) to manage expanded memory just
|
|
as other programs use DOS to manage conventional memory.
|
|
|
|
o Extended memory
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1-2 300275-003 Introduction
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Extended memory is the 15M-byte address space on an IBM AT or
|
|
compatible computer outside the memory DOS can access. This
|
|
address space is of little use to those application programs
|
|
that use DOS. DOS does not recognized memory above 640K
|
|
bytes; the XENIX operating system manages extended memory.
|
|
|
|
Other terms are defined in the Glossary near the end of this
|
|
specification.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Introduction 300275-003 1-3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CHAPTER 2. WRITING PROGRAMS THAT USE
|
|
EXPANDED MEMORY
|
|
|
|
This chapter is divided into two major sections. The first
|
|
section provides guidelines to help you create programs that use
|
|
expanded memory. The second section describes the individual EMM
|
|
functions in detail, with assembly language examples, parameter
|
|
passing conventions, and an explanation of the status and results
|
|
returned by the function.
|
|
|
|
|
|
Designing your program
|
|
|
|
While designing or planning a program that uses expanded memory,
|
|
consider the following topics:
|
|
|
|
o The operating environment
|
|
|
|
o The mechanics of the Expanded Memory Manager (EMM)
|
|
|
|
o The programming guidelines presented here
|
|
|
|
This section discusses these topics and lists some guidelines to
|
|
help you to create programs that use expanded memory.
|
|
|
|
|
|
The operating environment
|
|
|
|
The guidelines in this section help ensure that your program
|
|
works in systems that use expanded memory. To be "safe," your
|
|
program should assume the system for which you're writing the
|
|
program contains:
|
|
|
|
o Multiple expanded memory boards.
|
|
|
|
o Other resident programs which also use expanded memory. An
|
|
example of a resident program is an interrupt service routine
|
|
or a device driver. It can also be a program invoked by an
|
|
interrupt service routine or just a program that preempts the
|
|
active program.
|
|
|
|
o Registers whose contents are modified by function invocations.
|
|
This means your program can't rely on the contents of certain
|
|
registers after a function invocation. (The registers that a
|
|
particular function modifies are listed in the description of
|
|
the function; all others are unchanged)
|
|
|
|
|
|
Mechanics of the EMM
|
|
|
|
Version 3.20 of the EMM is re-entrant and its critical regions
|
|
are protected from interrupts. This means you'll never encounter
|
|
a "busy" condition.
|
|
|
|
However, the EMM requires programs to follow these rules:
|
|
|
|
|
|
2-4 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
o The physical size of each page is fixed at 16K bytes.
|
|
|
|
o Four 16K-byte pages can be mapped into the system memory
|
|
address space simultaneously and contiguously. The 64K-byte
|
|
region which results from this mapping must begin at the
|
|
address returned by EMM FUNCTION 2 (Get page frame).
|
|
|
|
Note: Throughout the remainder of this document, the 64k-byte
|
|
region returned by FUNCTION 2 is called the "page frame."
|
|
|
|
|
|
Programming guidelines
|
|
|
|
To ensure that your program runs correctly with the EMM, it
|
|
should:
|
|
|
|
o Not locate its stack within expanded memory.
|
|
|
|
o Test for the presence of the EMM device by using one of two
|
|
methods. The first method is to use the DOS "open handle"
|
|
technique. The second method is to use the DOS "get interrupt
|
|
vector" function to obtain the contents of interrupt vector
|
|
67h. Once you get the contents of interrupt vector 67h, you
|
|
can inspect the device driver header. (Both methods are
|
|
described Chapter 3 of this specification.)
|
|
|
|
o Not use interrupt 67h. DOS normally sets aside interrupt
|
|
vector table entries 60h through 67h for non-system software
|
|
that uses software interrupts. However, the EMM uses
|
|
interrupt vector 67h. It sets the contents of interrupt
|
|
vector table entry 67h to the address of the EMM service
|
|
procedure using the DOS "Set Interrupt Vector" function.
|
|
|
|
Other software that uses this vector won't work once the EMM
|
|
installs itself because the EMM does not chain to any software
|
|
previously serviced by this interrupt vector.
|
|
|
|
Note: Resident software that uses INT 67h and installs itself
|
|
after the EMM, will disable the EMM.
|
|
|
|
o Request the page frame base address after determining that the
|
|
EMM is installed. This page frame base address is the
|
|
starting address of the 64K-byte memory segment that contains
|
|
the four 16K-byte pages. The first 16K-byte physical page
|
|
address begins at this base address. The second 16K-byte
|
|
physical page address starts at the base address offset by
|
|
4000h. The third 16K-byte physical page address starts at the
|
|
base address offset by 8000h. The fourth 16K-byte physical
|
|
page starts at the base address offset by C000h.
|
|
|
|
o Request the number of unallocated 16K-byte pages within the
|
|
expanded memory system. This determines the maximum number of
|
|
pages the program can allocate.
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
o "Open" the EMM and allocate the number of 16K-byte pages that
|
|
it intends to use. The EMM returns a unique "EMM handle" that
|
|
the program uses to identify itself in all future transactions
|
|
with the EMM. The EMM uses this handle to identify the memory
|
|
it allocates to each program. (Your program should obtain EMM
|
|
handle(s) and allocate pages only once, at the beginning of
|
|
the program.)
|
|
|
|
The EMM attempts to assign the pages the program requests. If
|
|
the number of pages it requests is greater than the number of
|
|
free pages, the EMM returns an "error" status. The status
|
|
codes the EMM returns are listed in this chapter.
|
|
|
|
Note: A single application program can request multiple EMM
|
|
handles and as many pages per EMM handle as it desires. The
|
|
nature of the application determines the number of EMM handles
|
|
and pages required.
|
|
|
|
o Issue a map request to the EMM. (At this point the program
|
|
can map any allocated logical page into any one of the four
|
|
physical pages within the page frame.) The map operation must
|
|
be performed before any data within the physical page can be
|
|
accessed.
|
|
|
|
If the logical page has not been assigned to this particular
|
|
EMM handle, the EMM returns an error and doesn't carry out the
|
|
mapping procedure. If the physical page (at which the logical
|
|
page is mapped) isn't in the range 0 thru 3, the EMM returns
|
|
an error.
|
|
|
|
o Keep track of the contents of each page of expanded memory.
|
|
The EMM doesn't provide a facility for associating data with a
|
|
particular logical page. If a page contains data that will be
|
|
accessed within the program, the program must remember which
|
|
page contains the data.
|
|
|
|
o "Close" the Expanded Memory Manager prior to terminating.
|
|
This deallocates all pages previously allocated to the EMM
|
|
handle. The deallocated pages become available to all other
|
|
programs using expanded memory. The "close" request has no
|
|
effect on these other programs.
|
|
|
|
If the program does not perform a "close" before it exits to
|
|
DOS, the pages allocated to the EMM handle will remain
|
|
assigned. The only way to deallocate pages left in this
|
|
condition is to power off the system.
|
|
|
|
|
|
The EMM functions
|
|
|
|
This section presents a general overview of the EMM functions,
|
|
detailed descriptions of the individual functions, and a list
|
|
that summarizes the status codes the EMM functions return.
|
|
|
|
|
|
|
|
|
|
2-6 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Overview of the EMM functions
|
|
|
|
The EMM functions provide you with a set of standard expanded
|
|
memory functions. Because the EMM functions are standard, you
|
|
avoid potential compatibility problems with other expanded memory
|
|
programs that also adhere to the EMM specification. Programs
|
|
that deal directly with the hardware or that don't adhere to the
|
|
specification run this risk.
|
|
|
|
|
|
Functions 1 through 7 -- for general-purpose programming
|
|
|
|
Functions 1 through 7 provide the memory operators that typical
|
|
application programs require. Of these seven functions, FUNCTION
|
|
5 (Map) is the only one that a program may use a great deal while
|
|
running.
|
|
|
|
|
|
Functions 8 and 9 -- for interrupt service routines, device
|
|
drivers, and other resident software
|
|
|
|
Functions 8 and 9 aren't necessary for most application programs.
|
|
They are provided only for software that must save the current
|
|
state of the mapping hardware, switch mapping contexts,
|
|
manipulate the sections of expanded memory that they "own," and
|
|
restore the original context of the memory mapping hardware.
|
|
Examples of this type of software are interrupt service routines,
|
|
device drivers, and resident software such as print spoolers that
|
|
use expanded memory.
|
|
|
|
|
|
Functions 10 and 11 -- reserved
|
|
|
|
In previous versions of the Lotus/Intel/Microsoft Expanded Memory
|
|
Specification, Function 10 retrieved the page mapping register
|
|
I/O array and Function 11 retrieved the logical-to-physical page
|
|
translation array.
|
|
|
|
These functions are now reserved and new programs should not use
|
|
them. However, existing programs that use these functions will
|
|
still work correctly.
|
|
|
|
|
|
Functions 12, 13, and 14 -- for utility programs
|
|
|
|
Functions 12, 13, and 14 are also not necessary for most
|
|
application programs. They are provided for utility programs
|
|
that need to keep track of how expanded memory is being used.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Function 15 -- for multitasking operating systems
|
|
|
|
Function 15 is for multitasking operating systems that must save
|
|
the current state of the mapping hardware within each expanded
|
|
memory board before modifying the state of the mapping hardware
|
|
on any of the boards.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-8 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 1
|
|
Get Status
|
|
|
|
|
|
The Get Status function returns a status code that tells you
|
|
whether the EMM is present and if the hardware is working
|
|
correctly. This function doesn't require an EMM handle.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number (40h).
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Get Status function in
|
|
assembly language.
|
|
|
|
MOV AH, 40h
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get Status function modifies the contents of the AX register.
|
|
|
|
|
|
Status returned
|
|
|
|
The Get Status function returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager is present in the system and the hardware
|
|
is working correctly.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-5
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 2
|
|
Get Page Frame Address
|
|
|
|
|
|
The Get Page Frame Address function tells your program where the
|
|
page frame is located. It returns the segment portion of the
|
|
page frame address in the BX register. This function doesn't
|
|
require an EMM handle.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get Page Frame function (41h).
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Get Page Frame Address
|
|
function in assembly language.
|
|
|
|
MOV AH, 41h
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
MOV page_segment, BX
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get Page Frame Address function modifies the contents of the
|
|
AX and BX registers.
|
|
|
|
|
|
Status returned
|
|
|
|
The Get Page Frame Address function returns one of the following
|
|
status codes.
|
|
|
|
AH = 0 The manager has returned the page frame address.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
|
|
Results returned
|
|
|
|
The Get Page Frame Address function returns these results.
|
|
|
|
BX = segment The BX register contains the segment address of the
|
|
page frame. The value in BX has no meaning if AH <> 0.
|
|
|
|
|
|
|
|
|
|
|
|
2-6 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 3
|
|
Get Unallocated Page Count
|
|
|
|
|
|
The Get Unallocated Page Count function tells your program the
|
|
number of unallocated pages as well as the total number of pages
|
|
in expanded memory. This function doesn't require an EMM handle.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get Unallocated Page Count function (42h).
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Get Unallocated Pages Count
|
|
function in assembly language.
|
|
|
|
MOV AH, 42h
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
MOV un_alloc_pages, BX
|
|
MOV total_pages, DX
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get Unallocated Pages Count function modifies the contents of
|
|
the AX, BX, and DX registers.
|
|
|
|
|
|
Status returned
|
|
|
|
The Get Unallocated Pages Count function returns one of the
|
|
following status codes.
|
|
|
|
AH = 0 The manager has returned the number unallocated pages
|
|
and the number of total pages in expanded memory.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-7
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 3
|
|
Get Unallocated Page Count
|
|
(continued)
|
|
Results returned
|
|
|
|
The Get Unallocated Page Count function returns these results.
|
|
|
|
BX = 0 All pages in expanded memory have already been
|
|
allocated. None are currently available for expanded
|
|
memory.
|
|
|
|
BX <> 0 The number of pages that are currently available.
|
|
|
|
DX <> 0 The total number of pages in expanded memory
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-8 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 4
|
|
Allocate Pages
|
|
|
|
|
|
The Allocate Pages function allocates the number of pages your
|
|
program requests and assigns a unique EMM handle to these pages.
|
|
The EMM handle "owns" these pages until your program deallocates
|
|
them.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Allocate Pages function (43h).
|
|
|
|
BX The BX register contains the number of pages your
|
|
program wishes to allocate.
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Allocate Pages function in
|
|
assembly language.
|
|
|
|
MOV AH, 43h
|
|
MOV BX, num_of_pages_to_alloc
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
MOV emm_handle, DX
|
|
|
|
|
|
Registers modified
|
|
|
|
The Allocate Pages function modifies the contents of the AX and
|
|
DX registers.
|
|
|
|
|
|
Status returned
|
|
|
|
The Allocate Pages function returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager has allocated the pages to an assigned EMM
|
|
handle.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
AH = 85h All EMM handles are being used.
|
|
|
|
AH = 87h There aren't enough expanded memory pages to supply
|
|
your program's request.
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-9
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 4
|
|
Allocate Pages
|
|
(continued)
|
|
AH = 88h There aren't enough unallocated pages to supply your
|
|
program's request.
|
|
|
|
AH = 89h Can't allocate zero pages.
|
|
|
|
|
|
Results returned
|
|
|
|
The Allocate Pages function returns these results.
|
|
|
|
DX = handle The DX register contains a unique EMM handle. Your
|
|
program must use this EMM handle (as a parameter) in
|
|
any function invocations that map or deallocate
|
|
expanded memory.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-10 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 5
|
|
Map Handle Page
|
|
|
|
The Map Handle Page function lets your program access the
|
|
information stored in logical page (i) at physical page (j)
|
|
within the page frame.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Map Handle Page function (44h).
|
|
|
|
BX The BX register contains the logical page (i) that is
|
|
mapped into the physical page within the page frame.
|
|
The logical page must be in the range 0 through (number
|
|
of pages allocated to an
|
|
EMM handle - 1).
|
|
|
|
AL The AL register contains the physical page (j) into
|
|
which the logical page (i) is mapped. This physical
|
|
page must be in the range 0 thru 3.
|
|
|
|
DX The DX register contains the EMM handle your program
|
|
received from FUNCTION 4 (Allocate Pages).
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Map Handle Page function in
|
|
assembly language.
|
|
|
|
MOV DX, emm_handle
|
|
MOV BX, i
|
|
MOV AL, j
|
|
MOV AH, 44h
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Map Handle Page function modifies the contents of the AX
|
|
register.
|
|
|
|
|
|
Status returned
|
|
|
|
The Map Handle Page function returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager has mapped the page. The page is now ready
|
|
to be accessed.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-11
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 5
|
|
Map Handle Page
|
|
(continued)
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 83h The EMM couldn't find the EMM handle your program
|
|
specified.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
AH = 8Ah The logical page is out of the range of logical pages
|
|
which are allocated to the EMM handle.
|
|
|
|
AH = 8Bh The physical page at which the logical page was
|
|
supposed to be mapped is out of the range of physical
|
|
pages.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-12 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 6
|
|
Deallocate Pages
|
|
|
|
|
|
The Deallocate Pages function deallocates the pages currently
|
|
allocated to an EMM handle. After your program invokes this
|
|
function, other application programs can use these pages.
|
|
|
|
Caution: Your program must perform this function before it exits
|
|
to DOS. If it doesn't, no other programs can use these pages or
|
|
their handle.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Deallocate Pages function (45h).
|
|
|
|
DX The DX register contains the EMM handle returned by
|
|
FUNCTION 4 (Allocate Pages).
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Deallocate Pages function in
|
|
assembly language.
|
|
|
|
MOV DX, emm_handle
|
|
MOV AH, 45h
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Deallocate Pages function modifies the contents of the AX
|
|
register.
|
|
|
|
|
|
Status returned
|
|
|
|
The Deallocate Pages function returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager has deallocated the pages previously
|
|
allocated to the EMM handle.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 83h The EMM couldn't find the EMM handle your program
|
|
specified.
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-13
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 6
|
|
Deallocate Pages
|
|
(continued)
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
AH = 86h The EMM detected a "save" or "restore" page mapping
|
|
context error (FUNCTION 8 or 9). There is a page
|
|
mapping register state in the "save area" for the EMM
|
|
handle specified. Save Page Map (FUNCTION 8) placed it
|
|
there and it has not been removed by a subsequent
|
|
Restore Page Map (FUNCTION 9).
|
|
|
|
You need to restore the contents of the page mapping
|
|
register before you deallocate the EMM handle's
|
|
page(s).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-14 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 7
|
|
Get EMM Version
|
|
|
|
|
|
The Get EMM Version function returns the version number of the
|
|
Expanded Memory Manager software.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get EMM Version function (46h).
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Get EMM Version function in
|
|
assembly language.
|
|
|
|
MOV AH, 46h
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get EMM Version function modifies the contents of the AX
|
|
register.
|
|
|
|
|
|
Status returned
|
|
|
|
The Get EMM Version function returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager is present in the system and the hardware
|
|
is working correctly.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
|
|
Results returned
|
|
|
|
The Get EMM Version function returns these results.
|
|
|
|
AL = version The AL register contains the Expanded Memory
|
|
Manager's version number in BCD. The upper four bits
|
|
in the AL register contain the integer digit (3.x) of
|
|
the version number. The lower four bits in the AL
|
|
register contain the fractional digit of (x.2) version
|
|
number.
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-15
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 7
|
|
Get EMM Version
|
|
|
|
The value contained in AL has no meaning if AH <> 0.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-16 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 8
|
|
Save Page Map
|
|
(continued)
|
|
|
|
The Save Page Map function saves the contents of the page mapping
|
|
registers from all expanded memory boards. These registers
|
|
contain the memory mapping context of the EMM handle that was
|
|
active when a software or hardware interrupt occurred. (See
|
|
FUNCTION 9 -- Restore Page Map for the "restore" operation.)
|
|
|
|
If you're writing a resident program, an interrupt service
|
|
routine, or a device driver that uses expanded memory, you must
|
|
save the state of the mapping hardware. You must save this
|
|
state, because application software (using expanded memory) may
|
|
be running when your program is invoked by a hardware interrupt,
|
|
a software interrupt, or DOS. The Save Page Map function
|
|
facilitates saving the state of the mapping hardware.
|
|
|
|
The Save Page Map function requires the EMM handle that was
|
|
assigned to your resident program, interrupt service routine, or
|
|
device driver at the time it was initialized. (This is NOT the
|
|
EMM handle that the application software was using when your
|
|
software interrupted it.)
|
|
|
|
Chapter 4 of this specification discusses resident software in
|
|
general. It explains the assignment of an EMM handle and the
|
|
allocation of pages to resident programs.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Save Page Map function (47h).
|
|
|
|
DX The DX register contains the EMM handle assigned to the
|
|
interrupt service routine that's servicing the software
|
|
or hardware interrupt. The interrupt service routine
|
|
needs to save the state of the page mapping hardware
|
|
before mapping any pages (FUNCTION 5).
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Save Page Map function in
|
|
assembly language.
|
|
|
|
MOV DX, emm_handle
|
|
MOV AH, 47h
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Save Page Map function modifies the contents of the AX
|
|
register.
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-17
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 8
|
|
Save Page Map
|
|
|
|
Status returned
|
|
|
|
The Save Page Map function returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager has saved the state of the page mapping
|
|
hardware.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 83h The EMM couldn't find the EMM handle your program
|
|
specified.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
AH = 8Ch There is no room in the "save" area to store the state
|
|
of the page mapping registers.
|
|
|
|
AH = 8Dh The "save area" already contains the page mapping
|
|
register state for the EMM handle your program
|
|
specified..
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-18 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 9
|
|
Restore Page Map
|
|
(continued)
|
|
|
|
The Restore Page Map function restores the contents of the page
|
|
mapping registers on the expanded memory boards for a particular
|
|
EMM handle. This function lets your program restore the contents
|
|
of the mapping registers which its EMM handle saved. (See
|
|
FUNCTION 8 -- Save Page Map for the "save" operation.)
|
|
|
|
If you're writing a resident program, an interrupt service
|
|
routine, or a device driver that uses expanded memory, you must
|
|
restore the mapping hardware to the state it was in before your
|
|
program took over. You must restore this state, because
|
|
application software (using expanded memory) may be running when
|
|
your program is invoked by a hardware interrupt, a software
|
|
interrupt, or DOS. The Restore Page Map function facilitates
|
|
restoring the state of the mapping hardware.
|
|
|
|
The Restore Page Map function requires the EMM handle that was
|
|
assigned to your resident program, interrupt service routine, or
|
|
device driver at the time it was initialized. (This is NOT the
|
|
EMM handle that the application software was using when your
|
|
software interrupted it.)
|
|
|
|
Chapter 4 of this specification discusses resident software in
|
|
general. It explains the assignment of an EMM handle and the
|
|
allocation of pages to resident programs.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Restore Page Map function (48h).
|
|
|
|
DX The DX register contains the EMM handle assigned to the
|
|
interrupt service routine that's servicing the software
|
|
or hardware interrupt. The interrupt service routine
|
|
needs to restore the state of the page mapping
|
|
hardware.
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Restore Page Map function in
|
|
assembly language.
|
|
|
|
MOV DX, emm_handle
|
|
MOV AH, 48h
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Restore Page Map function modifies the contents of the AX
|
|
register.
|
|
|
|
|
|
Writing programs 300275-003 2-19
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 9
|
|
Restore Page Map
|
|
|
|
Status returned
|
|
|
|
The Restore Page Map function returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager has restored the state of the page mapping
|
|
registers.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 83h The EMM couldn't find the EMM handle your program
|
|
specified.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
AH = 8Eh There is no page mapping register state in the save
|
|
area for the EMM handle your program specified. Your
|
|
program didn't save the contents of the page mapping
|
|
hardware, so Restore Page Map can't restore it.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-20 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 10
|
|
Reserved
|
|
|
|
|
|
In previous versions of the Lotus/Intel/Microsoft Expanded Memory
|
|
Specification, Function 10 retrieved the page mapping register
|
|
I/O array. This function is now reserved and new programs should
|
|
not use it.
|
|
|
|
Note: Existing programs that use this function will still work
|
|
correctly.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-21
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 11
|
|
Reserved
|
|
|
|
|
|
In previous versions of the Lotus/Intel/Microsoft Expanded Memory
|
|
Specification, Function 10 retrieved the logical-to-physical page
|
|
translation array. This function is now reserved and new
|
|
programs should not use it.
|
|
|
|
Note: Existing programs that use this function will still work
|
|
correctly.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-22 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 12
|
|
Get EMM Handle Count
|
|
|
|
|
|
The Get EMM Handle Count function return the number of active EMM
|
|
handles.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get EMM Handle Count function (4Bh).
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Get EMM Handle Count
|
|
function in assembly language.
|
|
|
|
MOV AH, 4Bh
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
MOV total_active_emm_handles, BX
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get EMM Handle Count function modifies the contents of the AX
|
|
and BX registers.
|
|
|
|
|
|
Status returned
|
|
|
|
The Get EMM Handle Count function returns one of the following
|
|
status codes.
|
|
|
|
AH = 0 The manager has returned the number of active EMM
|
|
handles.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 83h The EMM couldn't find the EMM handle your program
|
|
specified.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
|
|
Results returned
|
|
|
|
The Get EMM Handle Count function returns these results.
|
|
|
|
BX = x The BX register contains the number of active EMM
|
|
handles. This number never exceeds 255.
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-23
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 13
|
|
Get EMM Handle Pages
|
|
(continued)
|
|
|
|
The Get EMM Handle Pages function returns the number of pages
|
|
allocated to a specific EMM handle.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get EMM Handle Pages function (4Ch).
|
|
|
|
DX The DX register contains the EMM handle.
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Get EMM Handle Pages
|
|
function in assembly language.
|
|
|
|
MOV DX, emm_handle
|
|
MOV AH, 4Ch
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
MOV num_pages_alloc_to_emm_handle, BX
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get EMM Handle Pages function modifies the contents of the AX
|
|
and BX registers.
|
|
|
|
|
|
Status returned
|
|
|
|
The Get EMM Handle Pages function returns one of the following
|
|
status codes.
|
|
|
|
AH = 0 The manager has returned the number of pages allocated
|
|
to the EMM handle.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 83h THe EMM couldn't find the EMM handle your program
|
|
specified.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-24 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 13
|
|
Get EMM Handle Pages
|
|
|
|
Results returned
|
|
|
|
The Get EMM Handle Pages function returns these results.
|
|
|
|
BX <> 0 The BX register contains the number of pages allocated
|
|
to the EMM handle. The number returned is never zero
|
|
because you can't allocate zero pages to an EMM handle.
|
|
This number never exceeds 512 because the EMM allows,
|
|
at most, 512 pages of expanded memory.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-25
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 14
|
|
Get All EMM Handle Pages
|
|
(continued)
|
|
|
|
The Get All EMM Handle Pages function returns an array of the
|
|
active EMM handles and the number of pages allocated to each one.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get All EMM Handle Pages function (4Dh).
|
|
|
|
ES:DI The ES:DI address points to an array where a copy of
|
|
all active EMM handles and the number of pages
|
|
allocated to each is stored. Each entry in the array
|
|
is composed of two words. The first word contains the
|
|
active EMM handle. The second word contains the number
|
|
of pages allocated to the EMM handle.
|
|
|
|
To ensure that the array space your program must supply
|
|
is large enough, use this formula to calculate the
|
|
amount of memory required:
|
|
|
|
number of bytes = 2 * 2 * number of EMM
|
|
required in array handles returned
|
|
|
|
(Each EMM handle requires 2 bytes as does each page
|
|
number.) The array can never contain more than 1 K
|
|
bytes.
|
|
|
|
Caution: Be careful when you specify the array address in ES:DI
|
|
so as not to cause "segment wrap" when the array is transferred.
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Return Open EMM Handle Pages
|
|
function in assembly language.
|
|
|
|
MOV AX, dseg
|
|
MOV ES, AX
|
|
MOV DI, OFFSET handle_pages_array
|
|
MOV AH, 4Dh
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
MOV total_active_emm_handles, BX
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get All EMM Handle Pages function modifies the contents of
|
|
the AX and BX registers.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-26 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 14
|
|
Get All EMM Handle Pages
|
|
|
|
Status returned
|
|
|
|
The Get All EMM Handle Pages function returns one of the
|
|
following status codes.
|
|
|
|
AH = 0 The manager has returned the array.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
|
|
Results returned
|
|
|
|
The Return Open EMM Handle Pages function returns these results.
|
|
|
|
BX = x The BX register contains the number of active EMM
|
|
handles. If the number is 0 this indicates that the
|
|
manager is "idle." This number never exceeds 255.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-27
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
(continued)
|
|
|
|
When a task switch occurs, a multitasking operating system must
|
|
save (and later restore) the mapping context of the active EMM
|
|
handle. The set of subfunctions that make up the Get/Set Page
|
|
Map function let your operating system perform these operations.
|
|
|
|
The Get/Set Page Map function is really a set of subfunctions.
|
|
These subfunctions allow a multitasking operating system to:
|
|
|
|
o "Get" the contents of the page mapping registers from the
|
|
expanded memory boards.
|
|
|
|
o "Set" the contents of the page mapping registers on the
|
|
expanded memory boards.
|
|
|
|
o "Get and Set" the contents of the page mapping registers on
|
|
the expanded memory boards. This subfunction allows the
|
|
operating system to perform both "get" and "set" in only one
|
|
EMM invocation.
|
|
|
|
o "Return Size" of the page mapping hardware state array for the
|
|
operating system.
|
|
|
|
This function is described a bit differently than the rest of the
|
|
functions in this chapter. Since it is made up of four
|
|
subfunctions, there are four subsections which contain the
|
|
parameter passing convention, example invocation, status codes,
|
|
and results returned for each service within the Get/Set Page Map
|
|
function.
|
|
|
|
|
|
Get the contents of the page mapping registers
|
|
|
|
The Get subfunction copies the contents of the mapping registers
|
|
from each expanded memory board to a destination array. The
|
|
operating system must point to the destination array.
|
|
|
|
This subfunction doesn't require an EMM handle.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get/Set Page Map function (4Eh).
|
|
|
|
AL = 0 When the AL register equals 0, the invocation requests
|
|
the Get subfunction. It copies the map registers to an
|
|
array pointed to by the ES:DI address.
|
|
|
|
ES:DI The ES:DI address points to the destination array
|
|
address in SEGMENT:OFFSET format. This address is
|
|
required only for the Get or Get and Set services.
|
|
|
|
Caution: Be careful when you specify the array address in ES:DI
|
|
so as not to cause "segment wrap" when the array is transferred.
|
|
|
|
|
|
2-28 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Get subfunction in assembly
|
|
language.
|
|
|
|
MOV AX, dseg
|
|
MOV ES, AX
|
|
MOV DI, OFFSET destination_page_map_array
|
|
MOV AH, 4Eh
|
|
MOV AL, 0
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get subfunction modifies the contents of the AX register.
|
|
|
|
|
|
Status returned
|
|
|
|
The Get subfunction returns one of the following status codes.
|
|
|
|
AH = 0 The manager has returned the array.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
AH = 8Fh The subfunction parameter isn't equal to a Get request.
|
|
|
|
|
|
Results returned
|
|
|
|
The Get subfunction returns these results.
|
|
|
|
ES:DI = addr The ES:DI address points to the memory area where
|
|
the operating system has stored the state of all the
|
|
mapping registers on all boards in the system. This
|
|
memory area also contains any additional information
|
|
necessary to restore the boards to their original state
|
|
when the program invokes a Set subfunction.
|
|
|
|
|
|
Set the contents of the page mapping registers
|
|
|
|
The Set subfunction copies the contents of a source array into
|
|
the mapping registers on each expanded memory board in the
|
|
system. The operating system must point to the source array.
|
|
|
|
This subfunction doesn't require an EMM handle.
|
|
|
|
|
|
Writing programs 300275-003 2-29
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
(continued)
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get/Set Page Map function (4Eh).
|
|
|
|
AL = 1 When the AL register equals 1, the invocation requests
|
|
the Set subfunction. It copies the contents of the
|
|
array pointed to by the DS:SI address to the map
|
|
registers.
|
|
|
|
DS:SI The DS:SI address points to the source array address in
|
|
SEGMENT:OFFSET format. The operating system must point
|
|
to an array which contains the mapping register state.
|
|
This address is required only for the Set or Get and
|
|
Set services.
|
|
|
|
Caution: Be careful when you specify the array address in DS:SI
|
|
so as not to cause "segment wrap" when the array is transferred.
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Set subfunction in assembly
|
|
language.
|
|
|
|
MOV AX, dseg
|
|
MOV DS, AX
|
|
MOV SI, OFFSET source_page_map_array
|
|
MOV AH, 4Eh
|
|
MOV AL, 1
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Set subfunction modifies the contents of the AX register.
|
|
|
|
|
|
Status returned
|
|
|
|
The Set subfunction returns one of the following status codes.
|
|
|
|
AH = 0 The manager has passed the array.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
|
|
|
|
2-30 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
(continued)
|
|
AH = 8Fh The subfunction parameter isn't equal to a Set request
|
|
or the length of the array passed during the Set
|
|
request doesn't match the number of mapping registers
|
|
in the system.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-31
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
(continued)
|
|
Results returned
|
|
|
|
The Set subfunction doesn't return any results. If the operating
|
|
system used the Get subfunction correctly, the Set service should
|
|
restore the expanded memory boards to their original state. (The
|
|
Get subfunction, described previously in this chapter, saves the
|
|
contents of the mapping register from each expanded memory
|
|
board.)
|
|
|
|
|
|
Get and set the contents of the page mapping registers
|
|
|
|
The Get and Set subfunction first copies the contents of the
|
|
mapping registers from each expanded memory board in the system
|
|
into a destination array. (The operating system must point to
|
|
the destination array.) Then, the subfunction copies the
|
|
contents of a source array into the mapping registers on each of
|
|
the expanded memory boards. (The operating system must point to
|
|
the source array.)
|
|
|
|
This subfunction doesn't require an EMM handle.
|
|
|
|
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get/Set Page Map function (4Eh).
|
|
|
|
AL = 2 When the AL register equals 2, the invocation requests
|
|
the Get and Set subfunction. This subfunction first
|
|
copies the map registers to an array pointed to by the
|
|
ES:DI address. And then, it copies the contents of the
|
|
array pointed to by the DS:SI address to the map
|
|
registers.
|
|
|
|
ES:DI The ES:DI address points to the destination array
|
|
address in SEGMENT:OFFSET format. This address is
|
|
required only for the Get or Get and Set services.
|
|
|
|
DS:SI The DS:SI address points to the source array address in
|
|
SEGMENT:OFFSET format. The operating system must point
|
|
to an array which contains the mapping register state.
|
|
This address is required only for the Set or Get and
|
|
Set services.
|
|
|
|
Caution: Be careful when you specify the array address in ES:DI
|
|
and DS:SI so as not to cause "segment wrap" when the array is
|
|
transferred.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-32 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
(continued)
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Get and Set subfunction in
|
|
assembly language.
|
|
|
|
MOV AX, dseg
|
|
MOV ES, AX
|
|
MOV DI, OFFSET destination_page_map_array
|
|
MOV DS, AX
|
|
MOV SI, OFFSET source_page_map_array
|
|
MOV AH, 4Eh
|
|
MOV AL, 2
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
|
|
|
|
Registers modified
|
|
|
|
The Get and Set subfunction modifies the contents of the AX
|
|
register.
|
|
|
|
|
|
Status returned
|
|
|
|
The Get and Set subfunction returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager has returned and passed both arrays
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
AH = 8Fh The subfunction parameter isn't equal to a Get and Set
|
|
request.
|
|
|
|
|
|
Results returned
|
|
|
|
The Get and Set subfunction returns these results.
|
|
|
|
ES:DI = addr The ES:DI address points to the memory area where
|
|
the operating system stores the state of all the
|
|
mapping registers on all boards in the system. (This
|
|
happens during a Get subfunction.) This memory area
|
|
also contains any additional information necessary to
|
|
restore the boards to their original state when the
|
|
program invokes a Set subfunction.
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-33
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
(continued)
|
|
Return the size of the mapping context array for the
|
|
operating system
|
|
|
|
The Return Size subfunction determines the storage requirements
|
|
for the array passed by the other three functions prior to
|
|
invoking them.
|
|
|
|
This subfunction doesn't require an EMM handle.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-34 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
(continued)
|
|
Parameter passing convention
|
|
|
|
AH The AH register contains the function number for the
|
|
Get/Set Page Map function (4Eh).
|
|
|
|
AL = 3 When the AL register equals 3, the invocation requests
|
|
the Return Size subfunction. This subfunction returns
|
|
the size (in bytes) of the array that the Get, Set, or
|
|
Get and Set subfunctions transfer to or from the
|
|
operating system.
|
|
|
|
|
|
Example invocation in assembly language
|
|
|
|
This example shows how to invoke the Return Size subfunction in
|
|
assembly language.
|
|
|
|
MOV AH, 4Eh
|
|
MOV AL, 3
|
|
INT 67h
|
|
OR AH, AH
|
|
JNZ error_handler
|
|
MOV size_of_array, AL
|
|
|
|
|
|
Registers modified
|
|
|
|
The Return Size subfunction modifies the contents of the AX
|
|
register.
|
|
|
|
|
|
Status returned
|
|
|
|
The Return Size subfunction returns one of the following status
|
|
codes.
|
|
|
|
AH = 0 The manager has returned the array size.
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM software.
|
|
|
|
AH = 81h The manager detected a malfunction in the expanded
|
|
memory hardware.
|
|
|
|
AH = 84h The function code passed to the EMM is not defined.
|
|
|
|
AH = 8Fh The subfunction parameter isn't equal to a Return Size
|
|
request.
|
|
|
|
|
|
Results returned
|
|
|
|
The Return Size subfunction returns these results.
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-35
|
|
|
|
|
|
|
|
|
|
|
|
FUNCTION 15
|
|
Get/Set Page Map
|
|
(continued)
|
|
AL = n The contents of the AL register equals the number of
|
|
bytes transferred to the memory area supplied by an
|
|
operating system whenever a program requests the Get,
|
|
Set, or Get and Set subfunction.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-36 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SUMMARY OF STATUS CODES -- ALL EMM FUNCTIONS
|
|
|
|
Table 2-1 lists the possible status codes that the EMM functions
|
|
can return. This table is for quick reference; the individual
|
|
EMM functions list the status codes they return.
|
|
|
|
Table 2-1. Summary of status codes
|
|
|
|
|
|
Code Definition
|
|
|
|
|
|
|
|
|
|
AH = 0 The manager is present in the system and the
|
|
hardware is working correctly.
|
|
|
|
|
|
|
|
AH = 80h The manager detected a malfunction in the EMM
|
|
software.
|
|
|
|
|
|
|
|
AH = 81h The manager detected a malfunction in the
|
|
expanded
|
|
memory hardware.
|
|
|
|
|
|
|
|
AH = 83h The EMM couldn't find the EMM handle your
|
|
program
|
|
specified.
|
|
|
|
|
|
|
|
AH = 84h The function code passed to the EMM is not
|
|
defined.
|
|
|
|
|
|
|
|
AH = 85h All EMM handles are being used.
|
|
|
|
|
|
|
|
AH = 86h The EMM detected a "save" or "restore" page
|
|
mapping context error.
|
|
|
|
|
|
|
|
AH = 87h There aren't enough expanded memory pages to
|
|
satisfy your program's request.
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-37
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AH = 88h There aren't enough unallocated pages to
|
|
satisfy
|
|
your program's request.
|
|
|
|
|
|
|
|
AH = 89h Can't allocate zero (0) pages.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2-38 300275-003 Writing programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Table 2-1. Summary of status codes (continued)
|
|
|
|
|
|
Code Definition
|
|
|
|
|
|
|
|
AH = 8Ah The logical page is out of the range of
|
|
logical
|
|
pages which are allocated to the EMM handle.
|
|
|
|
|
|
|
|
AH = 8Bh The physical page to which the logical page
|
|
is
|
|
mapped is out of the range of physical pages.
|
|
|
|
|
|
|
|
AH = 8Ch The page mapping hardware state save area is
|
|
full.
|
|
|
|
|
|
|
|
AH = 8Dh The page mapping hardware state save area
|
|
already has
|
|
a state associated with the EMM handle.
|
|
|
|
|
|
|
|
AH = 8Eh The page mapping hardware state save area
|
|
doesn't have a state associated with the EMM
|
|
handle.
|
|
|
|
|
|
|
|
AH = 8Fh The subfunction parameter passed to the
|
|
function
|
|
isn't defined.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Writing programs 300275-003 2-39
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CHAPTER 3. TESTING FOR THE PRESENCE OF THE EXPANDED
|
|
MEMORY MANAGER
|
|
|
|
Before an application program can take advantage of the Expanded
|
|
Memory Manager (EMM), it must determine whether the manager has
|
|
been loaded by DOS. This chapter describes two methods your
|
|
program can use to test for the presence of the EMM and how to
|
|
choose the correct one for your situation.
|
|
|
|
The first method uses the DOS "open handle" technique; the second
|
|
method uses the DOS "get interrupt vector" technique.
|
|
|
|
|
|
Which method should my program use?
|
|
|
|
The majority of application programs can use either the "open
|
|
file" or the "get interrupt vector" method. However, if your
|
|
program is a device driver or if it interrupts DOS during file
|
|
system operations, you must use only the "get interrupt vector"
|
|
method.
|
|
|
|
Device drivers execute from within DOS and can't access the DOS
|
|
file system; programs that interrupt DOS during file system
|
|
operations have a similar restriction. During their interrupt
|
|
processing procedures, they can't access the DOS file system
|
|
because another program may be using the system. Since the "get
|
|
interrupt vector" method doesn't require the DOS file system, you
|
|
must use it for these types of programs.
|
|
|
|
|
|
The "open handle" technique
|
|
|
|
Most application programs can use the DOS "open handle" technique
|
|
to test for the presence of the EMM. This section describes how
|
|
to use the technique and gives an example.
|
|
|
|
Caution: Don't use this technique if your program is a device
|
|
driver or if it interrupts DOS during file system operations.
|
|
Use the "get interrupt vector" technique described later in this
|
|
chapter.
|
|
|
|
|
|
Using the "open handle" technique
|
|
|
|
This section describes how to use the DOS "open handle" technique
|
|
to test for the presence of the EMM. Follow these steps in
|
|
order:
|
|
|
|
1. Issue an "open handle" command (DOS function 3Dh) in "read
|
|
only" access mode (register AL = 0). This function requires
|
|
your program to point to an ASCII string which contains the
|
|
path name of the file or device in which you're interested
|
|
(register set DS:DX contains the pointer). In this case the
|
|
file is actually the name of the EMM.
|
|
|
|
|
|
|
|
3-2 3000275-003Testing for the presence of the EMM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
You should format the ASCII string as follows:
|
|
|
|
ASCII_device_name DB "EMMXXXX0", 0
|
|
|
|
where the ASCII codes for the capital letters EMMXXXX0 are
|
|
terminated by a byte containing a value of zero.
|
|
|
|
2. If DOS returns no error status code, skip Steps 3 and 4 and
|
|
go to Step 5. If DOS returns a "Too many open files" error
|
|
status code, go to Step 3. If DOS returns a "File/Path not
|
|
found" error status code, skip Step 3 and go to Step 4.
|
|
|
|
3. If DOS returns a "Too many open files" (not enough handles),
|
|
status code, your program should invoke the "open file"
|
|
command before it opens any other files. This will
|
|
guarantee that at least one file handle will be available to
|
|
perform the function without causing this error.
|
|
|
|
After the program performs the "open file" command, it
|
|
should perform the test described in Step 6 and close the
|
|
"file handle" (DOS function 3Eh). Don't keep the manager
|
|
"open" after this status test is performed since "manager"
|
|
functions are not available thru DOS. Go to Step 6.
|
|
|
|
4. If DOS returns a "File/Path not found" the EMM is not
|
|
installed. If your application requires its presence the
|
|
user will have to reboot the system with a disk containing
|
|
the EMM and the appropriate CONFIG.SYS file before
|
|
proceeding.
|
|
|
|
5. If DOS doesn't return an error status code you can assume
|
|
that either a device with the name EMMXXXX0 is resident in
|
|
the system, or a file with this name is on disk in the
|
|
current disk drive. Go to Step 6.
|
|
|
|
6. Issue an "I/O Control for Devices" command (DOS function
|
|
44h) with a "get device information" command (register AL =
|
|
0h). DOS function 44h determines whether EMMXXXX0 is a
|
|
device or a file. It also requires a pointer to a buffer
|
|
(register set DS:DX). The EMM does not use the buffer for
|
|
anything and will not pass information in it.
|
|
|
|
You can set the number of bytes this function requires to
|
|
perform read/write operations to zero (register CX) since no
|
|
data is passed back in the buffer. You must use the file
|
|
handle (register BX) which you obtained in Step 1 to access
|
|
the "EMM" device.
|
|
|
|
This function returns the "device information" in a word
|
|
(register DX). Go to step 7.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Testing for the presence of the EMM300275-003 3-3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7. If DOS returns any error status code, you should assume that
|
|
the EMM device driver is not installed. If your application
|
|
requires its presence the user will have to reboot the
|
|
system with a disk containing the EMM and the appropriate
|
|
CONFIG.SYS file before proceeding.
|
|
|
|
8. If DOS didn't return an error status, test the contents of
|
|
bit 7 (counting from 0) of the "device information" word
|
|
(register DX) the function returned. Go to Step 9.
|
|
|
|
9. If bit 7 of the "device information" word contains a zero,
|
|
then EMMXXXX0 is a file and the EMM device driver is not
|
|
present. If your application requires its presence, the
|
|
user will have to reboot the system with a disk containing
|
|
the EMM and the appropriate CONFIG.SYS file before
|
|
proceeding.
|
|
|
|
If bit 7 contains a one, then EMMXXXX0 is a device. Go to
|
|
Step 10.
|
|
|
|
10. Issue an "I/O Control for Devices" command (DOS function
|
|
44h) with a "get output status" command (register AL = 7h).
|
|
This function requires a pointer to a buffer (register set
|
|
DS:DX). The EMM does not use the buffer for anything and
|
|
will not pass information in it.
|
|
|
|
You can set the number of bytes (register CX) this function
|
|
requires to perform read/write operations to zero since no
|
|
data is passed back in the buffer. You must use the file
|
|
handle you obtained in Step 1 to access the "EMM" device
|
|
(register BX). Go to Step 11.
|
|
|
|
11. If the expanded memory device driver is "ready," the EMM
|
|
passes a status value of "0FFh" in register AL. The status
|
|
value is "00h" if the device driver is "not ready."
|
|
|
|
If the the EMM device driver is "not ready" and your
|
|
application requires its presence, the user will have to
|
|
reboot the system with a disk containing the EMM and the
|
|
appropriate CONFIG.SYS file before proceeding.
|
|
|
|
If the EMM device driver is "ready", go to Step 12.
|
|
|
|
12. Issue a "Close File Handle" command (DOS function 3Eh) to
|
|
close the expanded memory device driver. You must use the
|
|
file handle you obtained in Step 1 to close the "EMM" device
|
|
(register BX).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3-4 3000275-003Testing for the presence of the EMM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
An example of the "open handle" technique
|
|
|
|
The following procedure is an example of the "open handle"
|
|
technique outlined in the previous section.
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_____The following procedure tests for the presence of the EMM
|
|
______________________________________________________________;
|
|
;___in the system. It returns the CARRY FLAG SET if the EMM is
|
|
______________________________________________________________;
|
|
;___present. If the EMM is not present, this procedure returns
|
|
______________________________________________________________;
|
|
;_________________________________________the CARRY FLAG CLEAR.
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
first_test_for_EMM PROC NEAR
|
|
|
|
___________________________________________________________PUSH D
|
|
S______________________________________________________________
|
|
___________________________________________________________PUSH C
|
|
S
|
|
____________________________________________________________POP D
|
|
S
|
|
____________________________________________________________MOV A
|
|
H, 3Dh__________________________________________; issue "device
|
|
____________________________________________________________LEA D
|
|
X, ASCII_device_name___________________________; open" in "read
|
|
____________________________________________________________MOV A
|
|
L, 0_______________________________________________; only" mode
|
|
____________________________________________________________INT 2
|
|
1h
|
|
_____________________________________________________________JC f
|
|
irst_test_for_EMM_error_exit___________________; test for error
|
|
_______________________________________________________________
|
|
; during "device
|
|
_______________________________________________________________
|
|
; open"
|
|
|
|
____________________________________________________________MOV B
|
|
X, AX___________________________________________; get the "file
|
|
_______________________________________________________________
|
|
; handle" returned
|
|
_______________________________________________________________
|
|
; by DOS
|
|
|
|
____________________________________________________________MOV A
|
|
X, 44h__________________________________________; issue "IOCTL"
|
|
____________________________________________________________MOV A
|
|
L, 00h______________________________________; "get device info"
|
|
____________________________________________________________INT 2
|
|
1h
|
|
|
|
|
|
Testing for the presence of the EMM300275-003 3-5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_____________________________________________________________JC f
|
|
irst_test_for_EMM_err_exit_____________________; test for error
|
|
_______________________________________________________________
|
|
; during "get device
|
|
_______________________________________________________________
|
|
; info"
|
|
|
|
___________________________________________________________TEST D
|
|
X, 0080h_________________________________; test to determine if
|
|
_____________________________________________________________JZ f
|
|
irst_test_for_EMM_err_exit__________________; ASCII_device_name
|
|
_______________________________________________________________
|
|
; is a device or a
|
|
_______________________________________________________________
|
|
; file
|
|
|
|
____________________________________________________________MOV A
|
|
H, 44h__________________________________________; issue "IOCTL"
|
|
____________________________________________________________LEA D
|
|
X, dummy_buffer___________________________________; "get output
|
|
____________________________________________________________MOV C
|
|
X, 0__________________________________________________; status"
|
|
____________________________________________________________MOV A
|
|
L, 07h
|
|
____________________________________________________________INT 2
|
|
1h
|
|
_____________________________________________________________JC f
|
|
irst_test_for_EMM_error_exit___________________; test for error
|
|
_______________________________________________________________
|
|
; during "IOCTL"
|
|
|
|
___________________________________________________________PUSH A
|
|
X________________________________________________; save "IOCTL"
|
|
_______________________________________________________________
|
|
; status
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3-6 3000275-003Testing for the presence of the EMM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, 3Eh___________________________________________; issue "close
|
|
____________________________________________________________INT 2
|
|
1h_______________________________________________; file handle"
|
|
______________________________________________________________
|
|
____________________________________________________________POP A
|
|
X_____________________________________________; restore "IOCTL"
|
|
_______________________________________________________________
|
|
; status
|
|
|
|
____________________________________________________________CMP A
|
|
L, 0FFh______________________________________; test for "device
|
|
____________________________________________________________JNE f
|
|
irst_test_for_EMM_error_exit____________________; ready" status
|
|
_______________________________________________________________
|
|
; returned by the
|
|
_______________________________________________________________
|
|
; driver
|
|
first_test_for_EMM_exit:
|
|
|
|
____________________________________________________________POP D
|
|
S______________________________________________; EMM is present
|
|
____________________________________________________________STC
|
|
; in the system
|
|
____________________________________________________________RET
|
|
|
|
first_test_for_EMM_error_exit:
|
|
|
|
____________________________________________________________POP D
|
|
S__________________________________________; EMM is NOT present
|
|
____________________________________________________________CLC
|
|
; in the system
|
|
____________________________________________________________RET
|
|
|
|
ASCII_device_name: DB "EMMXXXX0", 0
|
|
|
|
dummy_buffer DB 0
|
|
|
|
first_test_for_EMM ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Testing for the presence of the EMM300275-003 3-7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The "get interrupt vector" technique
|
|
|
|
Any type of program can use the DOS "get interrupt vector"
|
|
technique to test for the presence of the EMM. This section
|
|
describes how to use the technique and gives an example.
|
|
|
|
Caution: Be sure to use this technique (and not the "open handle
|
|
technique) if your program is a device driver or if it interrupts
|
|
DOS during file system operations.
|
|
|
|
|
|
Using the "get interrupt vector" technique
|
|
|
|
This section describes how to use the DOS "get interrupt vector"
|
|
technique to test for the presence of the EMM. Follow these
|
|
steps in order:
|
|
|
|
1. Issue a "get vector" command (DOS function 35h) to obtain
|
|
the contents of interrupt vector array entry number 67h
|
|
(addresses 0000:019C thru 0000:019F).
|
|
|
|
The EMM uses this interrupt vector to perform all manager
|
|
functions. The OFFSET portion of this interrupt service
|
|
routine address is stored in the word located at address
|
|
0000:019Ch; the SEGMENT portion is stored in the word
|
|
located at address 0000:019Eh.
|
|
|
|
2. Compare the "device name field" with the contents of the
|
|
ASCII string which starts at the address specified by the
|
|
segment portion of the contents of interrupt vector address
|
|
67h and a fixed offset of 000Ah. If DOS loaded the Expanded
|
|
Memory Manager at boot time this name field will have the
|
|
name of the device in it.
|
|
|
|
Since the Expanded Memory Manager is implemented as a
|
|
character device driver, its program origin is 0000h.
|
|
Device drivers are required to have a "device header"
|
|
located at the program origin. Within the "device header"
|
|
is an 8 byte "device name field." For a character mode
|
|
device driver this name field is always located at offset
|
|
000Ah within the device header. The device name field
|
|
contains the name of the device which DOS uses when the
|
|
device is referenced by DOS.
|
|
|
|
If the result of the "string compare" in this technique is
|
|
positive you can be certain that the EMM driver is present.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3-8 3000275-003Testing for the presence of the EMM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
An example of the "get interrupt vector" technique
|
|
|
|
The following procedure is an example of the "get interrupt
|
|
vector" technique outlined in the previous section.
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_________The following procedure tests for the presence of the E
|
|
MM_____________________________________________________________ ;
|
|
;___in the system. It returns the CARRY FLAG SET if the EMM is
|
|
______________________________________________________________;
|
|
;___present. It returns the CARRY FLAG CLEAR if the EMM is not
|
|
______________________________________________________________;
|
|
;______________________________________________________present.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
second_test_for_EMM PROC NEAR
|
|
|
|
___________________________________________________________PUSH D
|
|
S
|
|
___________________________________________________________PUSH C
|
|
S
|
|
____________________________________________________________POP D
|
|
S
|
|
|
|
____________________________________________________________MOV A
|
|
H, 35h___________________________________; issue "get interrupt
|
|
____________________________________________________________MOV A
|
|
L, 67h________________________________________________; vector"
|
|
____________________________________________________________INT 2
|
|
1h
|
|
|
|
____________________________________________________________MOV D
|
|
I, 000Ah___________________________________; use the SEGMENT in
|
|
_______________________________________________________________
|
|
; ES returned by DOS,
|
|
_______________________________________________________________
|
|
; place the "device
|
|
_______________________________________________________________
|
|
; name field"OFFSET in DI
|
|
|
|
____________________________________________________________LEA S
|
|
I, ASCII_device_name______________________; place the OFFSET of
|
|
_______________________________________________________________
|
|
; the EMMXXXX0 name
|
|
_______________________________________________________________
|
|
; string in SI, the
|
|
_______________________________________________________________
|
|
; SEGMENT is already in DS
|
|
|
|
|
|
|
|
|
|
Testing for the presence of the EMM300275-003 3-9
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
____________________________________________________________MOV C
|
|
X, 8_________________________________; compare the name strings
|
|
____________________________________________________________CLD
|
|
__________________________________________________________REPE C
|
|
MPSB
|
|
___________________________________________________________JNE s
|
|
econd_test_for_EMM_error_exit
|
|
|
|
second_test_for_EMM_exit:
|
|
|
|
____________________________________________________________POP D
|
|
S___________________________________________; EMM is present in
|
|
____________________________________________________________STC
|
|
; the system
|
|
____________________________________________________________RET
|
|
|
|
second_test_for_EMM_error_exit:
|
|
|
|
____________________________________________________________POP D
|
|
S__________________________________________; EMM is NOT present
|
|
____________________________________________________________CLC
|
|
; in the system
|
|
____________________________________________________________RET
|
|
|
|
ASCII_device_name: DB "EMMXXXX0"
|
|
|
|
second_test_for_EMM ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3-10 3000275-003Testing for the presence of the EMM
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CHAPTER 4. EXAMPLE EXPANDED MEMORY PROGRAMS
|
|
|
|
This chapter presents example procedures that use expanded
|
|
memory. The first part of this chapter lists the basic
|
|
characteristics of the example procedures. Later sections
|
|
present annotated outlines (or flow charts) for writing transient
|
|
and resident application programs that use expanded memory.
|
|
|
|
The actual example code (with comments) is listed at the end of
|
|
the chapter.
|
|
|
|
|
|
Characteristics of the example procedures
|
|
|
|
The example procedures in this chapter illustrate the EMM
|
|
operations that a typical transient or resident program carries
|
|
out when using expanded memory. When reading the examples, keep
|
|
in mind that they:
|
|
|
|
1. Are implemented in assembly language.
|
|
|
|
2. Assume that all variables reside in the same segment and
|
|
that DS is already set up for access to all the variables.
|
|
|
|
3. Assume that the application program will determine what to
|
|
do with EMM error conditions when they are returned from the
|
|
example procedures. The example procedures do not provide
|
|
any error processing when an EMM error is detected. You
|
|
could include a simple EMM error handling procedure that
|
|
displays the function which was invoked and the status which
|
|
was returned.
|
|
|
|
|
|
Transient application program
|
|
|
|
A transient program is loaded by DOS, executes, and doesn't
|
|
remain resident in the system after it returns control to DOS.
|
|
After a transient program returns control to DOS, the memory it
|
|
used is available for other programs.
|
|
|
|
This section presents an outline (or flow chart) which
|
|
illustrates the structure of an example transient application
|
|
program. It also includes a detailed explanation of the outline.
|
|
|
|
|
|
Flow chart of a transient application program
|
|
|
|
The following flow chart shows the structure of an example
|
|
transient application program that uses expanded memory. The
|
|
next section contains detailed explanations of the individual
|
|
processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-11
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Explanation of the transient application program flow chart
|
|
|
|
This example transient application program is invoked from the
|
|
DOS command line and loaded by DOS. It first executes some
|
|
initialization procedures, then some processing procedures that
|
|
use expanded memory, and finally, some terminating procedures.
|
|
After the program terminates, it returns control to DOS.
|
|
|
|
The following subsections describe the individual procedures
|
|
within the flow chart. These subsections refer you to the actual
|
|
code for each procedure.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4-12 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Initialization procedures
|
|
|
|
The block labeled "transient application initialization"
|
|
represents any preliminary processing and interaction with the
|
|
user that the program may need to perform. After the transient
|
|
program performs these operations, it should initialize the EMM.
|
|
|
|
The block labeled "EMM transient initialization" represents code
|
|
that prepares the EMM so it can run with the application program.
|
|
An example of this type of procedure (called EMM_transient_init)
|
|
is shown on page 4-10.
|
|
|
|
This procedure uses the "open handle" technique to determine
|
|
whether the EMM is present in the system. (The "open handle"
|
|
technique is described in Chapter 3 of this specification.) The
|
|
procedure also ensures that the version of the EMM loaded in the
|
|
system is compatible with the version required by the application
|
|
program, and it obtains the number of expanded memory pages your
|
|
application code requests.
|
|
|
|
|
|
Processing procedures
|
|
|
|
The block labeled "transient application processing (not
|
|
requiring expanded memory)" represents processing the program
|
|
performs which does not require access to expanded memory.
|
|
|
|
The block labeled "EMM access" represents the code that the
|
|
application must execute before it can access expanded memory.
|
|
(The expanded memory was allocated to it by the "EMM transient
|
|
initialization" procedure.) An example of this type of procedure
|
|
(called EMM_access) is shown on page 4-16. The example procedure
|
|
maps the logical page allocated to the EMM handle into the
|
|
physical page the application program specified. (The
|
|
"EMM_transient_init" procedure assigned the EMM handle.)
|
|
|
|
The block labeled "transient application processing (requiring
|
|
expanded memory)" represents the processing within the program
|
|
that uses the expanded memory area. The application can use the
|
|
expanded memory area for data or code. An application program
|
|
can locate code in the page frame and execute it, or it can just
|
|
store data and access it. Your program can use the page frame to
|
|
store anything except its stack; there is no code restriction.
|
|
|
|
The loop to the block labeled "EMM access" represents a possible
|
|
iterative process. The application may have a requirement to
|
|
access many pages within expanded memory. The process of calling
|
|
the "EMM_access" procedure and accessing the data in the mapped
|
|
page is iterative.
|
|
|
|
|
|
Terminating procedure
|
|
|
|
Once the application completes its task, it must return the
|
|
expanded memory that the EMM allocated to it.
|
|
|
|
|
|
Example expanded memory programs300275-003 4-13
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The block labeled "EMM termination" represents this phase of the
|
|
application program's execution. An example of this type of
|
|
procedure (called EMM_termination) is shown on page 4-17. This
|
|
example procedure returns both the EMM handle and the logical
|
|
pages to the EMM. (The EMM handle was issued and the logical
|
|
pages were allocated by "EMM_transient_init" procedure.)
|
|
|
|
The block labeled "transient application termination" represents
|
|
the code the application needs to execute by before it terminates
|
|
and returns control to DOS.
|
|
|
|
|
|
Resident application program
|
|
|
|
A resident application program is loaded by DOS, executes, and
|
|
remains resident in the system after it returns control to DOS.
|
|
This type of program is usually invoked by the operating system,
|
|
a hardware interrupt, or a software interrupt.
|
|
|
|
This section presents an outline (or flow chart) which
|
|
illustrates the structure of an example resident application
|
|
program. It also includes a detailed explanation of the flow
|
|
chart.
|
|
|
|
|
|
Flow Chart of a resident application program
|
|
|
|
The following flow chart shows the structure of an example
|
|
resident application program that uses expanded memory. The next
|
|
section contains detailed explanations of the individual
|
|
processes.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4-14 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Explanation of the resident application program flow chart
|
|
|
|
Resident application programs are loaded from the CONFIG.SYS file
|
|
as drivers or they are loaded by DOS and use the DOS "terminate
|
|
and stay resident" function.
|
|
|
|
Resident programs have special characteristics which must be
|
|
taken into consideration when using expanded memory. They must
|
|
initialize their own data structures as well as initializing the
|
|
EMM (getting the page frame address, getting a handle assigned
|
|
and allocating pages). Resident programs also consume a portion
|
|
of conventional memory, making it unavailable for use by
|
|
transient programs.
|
|
|
|
Since they may interrupt transient programs which use expanded
|
|
memory, resident programs must save and restore the state of the
|
|
page mapping registers when using expanded memory. Functions 8
|
|
and 9 (described in Chapter 2) are provided for just this
|
|
purpose.
|
|
|
|
This example resident application program illustrated by the
|
|
previous flow chart performs the following operations:
|
|
|
|
o initializes its internal data structures as well as
|
|
initializing the EMM
|
|
|
|
o saves the CPU state
|
|
|
|
o performs any processing it requires before accessing expanded
|
|
memory
|
|
|
|
o saves the state of the expanded memory hardware
|
|
|
|
o accesses expanded memory
|
|
|
|
o restores the state of the expanded memory hardware
|
|
|
|
o terminates
|
|
|
|
o restores the CPU state
|
|
|
|
The remainder of this section describes these operations in
|
|
detail.
|
|
|
|
|
|
Initializing the resident program and the EMM
|
|
|
|
The block labeled "resident application initialization "
|
|
represents any preliminary processing the resident program may
|
|
need to perform.
|
|
|
|
The block labeled "EMM resident initialization" represents the
|
|
code that prepares the EMM so it can run with the resident
|
|
application program. A example of this type of procedure (called
|
|
EMM_resident_init) is shown on page 4-13.
|
|
|
|
|
|
Example expanded memory programs300275-003 4-15
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This procedure uses the "get interrupt vector" test described in
|
|
Chapter 3 to determine whether the EMM is present in the system.
|
|
The procedure also ensures that the version of the EMM loaded in
|
|
the system is compatible with the version required by the
|
|
application program. In addition this procedure obtains an EMM
|
|
handle and allocates the required number of pages for the
|
|
resident program. Typically, the resident program will keep the
|
|
handle assigned to it as well as the pages allocated to it until
|
|
the system is rebooted.
|
|
|
|
The first two blocks in the flow chart aren't directly connected
|
|
to the blocks that follow. This flow chart depicts a common
|
|
situation encountered in resident programs. Resident programs
|
|
can be divided into a section of code which executes and then
|
|
isn't needed afterwards. The programs usually return the memory
|
|
consumed by the initialization section of the resident program to
|
|
DOS for re-use by other programs.
|
|
|
|
The "resident" section of the resident program remains in the
|
|
memory until the system is rebooted. Typically, this code is
|
|
executed whenever a particular hardware or software interrupt
|
|
occurs, or when it is "called" by DOS.
|
|
|
|
The first two blocks represent initialization code, which after
|
|
it executes, never needed again. So, the code returns the memory
|
|
which it used to DOS. The succeeding blocks in the flow chart
|
|
represent the resident section of the code which is executed only
|
|
when some event, such as a hardware or software interrupt,
|
|
occurs. For this reason, the first two blocks in the flow chart
|
|
are not connected to the succeeding blocks.
|
|
|
|
|
|
Saving the current state of the CPU
|
|
|
|
The block labeled "suspend transient program's execution"
|
|
represents the code responsible for saving the current state of
|
|
the CPU when the resident code begins executing. A hardware or
|
|
software interrupt usually causes the resident code to begin
|
|
executing.
|
|
|
|
Saving the CPU's state is essential. At some point, the resident
|
|
program must return control to the previously-executing program.
|
|
Before the original program can continue to function correctly,
|
|
the CPU must be returned to the exact state it was in before the
|
|
resident program began executing.
|
|
|
|
|
|
Resident processing performed before accessing expanded memory
|
|
|
|
The block labeled "resident processing (not requiring expanded
|
|
memory)" represents processing which must be performed by the
|
|
resident application before it needs to access expanded memory.
|
|
|
|
|
|
|
|
|
|
|
|
4-16 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Saving the state of the expanded memory hardware
|
|
|
|
The block labeled "save EMM map state" represents the code that
|
|
must be executed before the resident program attempts to access
|
|
expanded memory. This code must save the state of the expanded
|
|
memory hardware before the resident program can map any of its
|
|
pages into the page frame.
|
|
|
|
Saving the state of the expanded memory hardware is essential,
|
|
because another program may have been using it when the resident
|
|
program took over. Saving the mapping state of the expanded
|
|
memory hardware ensures that both the resident program and any
|
|
transient program that may have been executing when the resident
|
|
program started are not corrupted. An example of such a
|
|
procedure (called EMM_save_map_state) is shown on page 4-18.
|
|
|
|
|
|
Accessing expanded memory
|
|
|
|
The block labeled "EMM access" represents the code that the
|
|
resident program must execute before it can access expanded
|
|
memory. (The expanded memory was allocated to it by "EMM
|
|
resident initialization" procedure described earlier.) An
|
|
example of this type of procedure (called EMM_access) is shown on
|
|
page 4-16.
|
|
|
|
The example procedure simply maps one of the logical pages
|
|
allocated to the EMM handle assigned by the "EMM_resident_init"
|
|
procedure into the physical page the resident program specified.
|
|
|
|
The block labeled "resident application processing (requiring
|
|
expanded memory)" represents the processing within the resident
|
|
program which uses expanded memory. The resident program can use
|
|
expanded memory for data or code. A resident program can locate
|
|
code in the page frame and execute it or it can just store data
|
|
and access it. Your program can use the page frame to store
|
|
anything except its stack; there is no code restriction.
|
|
|
|
The loop to the block labeled "EMM access" represents a possible
|
|
iterative process. The resident program may have a requirement
|
|
to access many pages within expanded memory. The process of
|
|
calling the "EMM_access" procedure and accessing the data in the
|
|
mapped page is iterative.
|
|
|
|
|
|
Restoring the state of the expanded memory hardware
|
|
|
|
The block labeled "restore EMM map state" represents the code in
|
|
a resident program that restores the state of the expanded memory
|
|
hardware. This code restores the expanded memory hardware to the
|
|
state it was in before the resident program mapped its pages into
|
|
the page frame. An example procedure (called
|
|
EMM_restore_map_state) is shown on page 4-19.
|
|
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-17
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Terminating the resident program
|
|
|
|
The block labeled "resident processing termination" represents
|
|
any processing that the resident program must do before it
|
|
terminates. After the resident program terminates, it returns
|
|
control to the transient program that was executing before it
|
|
took control.
|
|
|
|
|
|
Restoring the CPU state
|
|
|
|
The block labeled "restore CPU state" represents the code
|
|
responsible for restoring the CPU to the state it was before the
|
|
resident program took control.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4-18 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example EMM procedures
|
|
|
|
This section lists the code for all the EMM procedures referenced
|
|
in the previous examples.
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;___________FUNCTIONAL "EQUATES" USED THROUGHOUT THESE EXAMPLES
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
EMM_interrupt EQU 67h
|
|
get_page_frame_address EQU 41h
|
|
get_unalloc_page_count EQU 42h
|
|
allocate_pages EQU 43h
|
|
map_handle_page EQU 44h
|
|
deallocate_pages EQU 45h
|
|
get_emm_version EQU 46h
|
|
save_page_map EQU 47h
|
|
restore_page_map EQU 48h
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_______________STATUS "EQUATES" USED THROUGHOUT THESE EXAMPLES
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
function_passed EQU 00h ; status which
|
|
indicates
|
|
; that the function
|
|
; invocation
|
|
completed
|
|
; successfully
|
|
|
|
EMM_not_resident EQU 01h ; status which
|
|
indicates
|
|
; the the EMM is not
|
|
; loaded in the
|
|
system
|
|
|
|
EMM_version_mismatch EQU 02h ; status which
|
|
indicates
|
|
; that the version
|
|
of EMM
|
|
; is not compatible
|
|
with
|
|
; the version
|
|
required by
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-19
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; the application
|
|
program
|
|
|
|
insuff_total_pages EQU 87h ; status which EMM
|
|
; returns if an
|
|
attempt
|
|
; was made to
|
|
allocate
|
|
; more pages than
|
|
exist
|
|
; in expanded memory
|
|
|
|
insuff_unalloc_pages EQU 88h ; status which EMM
|
|
; returns if an
|
|
attempt
|
|
; was made to
|
|
allocate
|
|
; more pages than
|
|
are
|
|
; currently un-
|
|
allocated
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4-20 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;______________________VARIABLES USED THROUGHOUT THESE EXAMPLES
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
application_EMM_version DB 30h ; the lowest version
|
|
; number of the EMM
|
|
which
|
|
; the application is
|
|
; compatible with
|
|
|
|
application_pages_req DW 0 ; number of pages
|
|
the
|
|
; application
|
|
requires
|
|
|
|
EMM_handle DW 0 ; storage for the
|
|
handle
|
|
; which the EMM
|
|
assigns
|
|
; to the application
|
|
|
|
EMM_status DB 0 ; storage for the
|
|
status
|
|
; which the EMM
|
|
returns
|
|
; to the application
|
|
|
|
logical_page DW 0 ; specifies the
|
|
logical
|
|
; page which the
|
|
; application needs
|
|
to
|
|
; access
|
|
|
|
physical_page DB 0 ; specifies where
|
|
within
|
|
; the page frame the
|
|
; application needs
|
|
to
|
|
; access the logical
|
|
page
|
|
|
|
page_frame_segment DW 0 ; specifies the page
|
|
; frame base segment
|
|
; address at which
|
|
the
|
|
; EMM has located
|
|
the
|
|
; physical pages
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-21
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;___________EXAMPLE PROCEDURE #1 EMM TRANSIENT INITIALIZATION
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_______This example PROCEDURE determines whether or not EMM is
|
|
______________________________________________________________;
|
|
;_present in your your system. Next, it determines whether the
|
|
______________________________________________________________;
|
|
;____application can run with the version of EMM present in the
|
|
______________________________________________________________;
|
|
;___system and whether the application will "fit" in the number
|
|
______________________________________________________________;
|
|
;_____of unallocated pages the EMM has available for use. The,
|
|
______________________________________________________________;
|
|
;__procedure then locates the page frame segment, and allocates
|
|
______________________________________________________________;
|
|
;__________________________________________the pages requested.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;___If the application does not "fit" in the available expanded
|
|
______________________________________________________________;
|
|
;__memory, or if some other EMM error is encountered, then this
|
|
______________________________________________________________;
|
|
;____________________________________________________procedure:
|
|
______________________________________________________________;
|
|
;__________________1. Returns the status returned by the EMM in E
|
|
MM_status._____________________________________________________ ;
|
|
;________________________________2. Returns to the application.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;____If the application "fits" in the available expanded memory
|
|
______________________________________________________________;
|
|
;_______________________________________________then it should:
|
|
______________________________________________________________;
|
|
;__________1. Get the version number and determines whether the
|
|
______________________________________________________________;
|
|
;________ application is compatible with this version of EMM.
|
|
______________________________________________________________;
|
|
;________2. Get the page frame segment address from the EMM and
|
|
______________________________________________________________;
|
|
;_____________________________ save it in page_frame_segment.
|
|
______________________________________________________________;
|
|
;___________________3. Get a handle from the EMM and save it in
|
|
______________________________________________________________;
|
|
;________________________________________________ EMM_handle.
|
|
______________________________________________________________;
|
|
;____________________________4. Allocate the pages specified in
|
|
______________________________________________________________;
|
|
;_____________________________________ application_pages_req.
|
|
______________________________________________________________;
|
|
|
|
|
|
4-22 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;_________________5. Return an EMM passed status in emm_status.
|
|
______________________________________________________________;
|
|
;_________________________________6. Return to the application.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
EMM_transient_init PROC NEAR
|
|
|
|
;;
|
|
; DETERMINE WHETHER OR NOT EMM IS RESIDENT IN THE SYSTEM ___
|
|
_______________________________________________________________ ;
|
|
;;
|
|
_______________________________________________________________
|
|
____________________________________________________________MOV B
|
|
YTE PTR EMM_status, EMM_not_resident___________________________
|
|
_______________________________________________________________
|
|
; assume that the test
|
|
___________________________________________________________CALL f
|
|
irst_test_for_EMM_________________________; for the presence of
|
|
____________________________________________________________JNC E
|
|
MM_transient_init_exit__________________________; EMM will fail
|
|
|
|
;;
|
|
; DETERMINE WHETHER RESIDENT VERSION OF EMM IS_______________
|
|
______________________________________________________________;
|
|
; COMPATIBLE WITH APPLICATION________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
____________________________________________________________MOV A
|
|
H, get_emm_version________________________; get the EMM version
|
|
____________________________________________________________INT 6
|
|
7h
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-23
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
____________________________________________________________ORA A
|
|
H, AH_________________________________________; if the function
|
|
____________________________________________________________JNZ E
|
|
MM_transient_init_exit___________________; failed return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
____________________________________________________________MOV B
|
|
YTE PTR emm_status,emm_version mismatch
|
|
____________________________________________________________CMP A
|
|
L, application_emm_version__; assume that the installed version
|
|
_____________________________________________________________JB e
|
|
mm_transient_init_exit_______________; is incompatible with the
|
|
_______________________________________________________________
|
|
; application version
|
|
|
|
;;
|
|
; GET THE PAGE FRAME SEGMENT ADDRESS_________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, get_page_frame_address__________________; get the page frame
|
|
____________________________________________________________INT E
|
|
MM_interrupt__________________________________; segment address
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
____________________________________________________________ORA A
|
|
H, AH_________________________________________; if the function
|
|
____________________________________________________________JNZ E
|
|
MM_transient_init_exit___________________; failed return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
____________________________________________________________MOV p
|
|
age_frame_segment, BX_____________________; save the page frame
|
|
_______________________________________________________________
|
|
; segment address
|
|
|
|
;;
|
|
; GET THE NUMBER OF TOTAL AND UNALLOCATED PAGES PRESENT______
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, get_unalloc_page_count___________________; get the total and
|
|
____________________________________________________________INT E
|
|
MM_interrupt_______________________________; un-allocated pages
|
|
_______________________________________________________________
|
|
; in the system
|
|
|
|
|
|
|
|
4-24 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
____________________________________________________________ORA A
|
|
H, AH_________________________________________; if the function
|
|
____________________________________________________________JNZ E
|
|
MM_transient_init_exit___________________; failed return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
;;
|
|
; DETERMINE WHETHER APPLICATION CAN RUN WITH THIS NUMBER_____
|
|
______________________________________________________________;
|
|
; OF TOTAL AND UNALLOCATED______________________________PAGES
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV B
|
|
YTE PTR EMM_status, insuff_total_pages_________________________
|
|
_______________________________________________________________
|
|
; check total pages
|
|
____________________________________________________________CMP a
|
|
pplication_pages_req, DX_________________________; not required
|
|
_____________________________________________________________JA E
|
|
MM_transient_init_exit
|
|
|
|
____________________________________________________________MOV B
|
|
YTE PTR EMM_status, insuff_unalloc_pages
|
|
____________________________________________________________CMP a
|
|
pplication_pages_req, BX______________; check unallocated pages
|
|
_____________________________________________________________JA E
|
|
MM_transient_init_exit
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-25
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
; GET AN EMM HANDLE AND SAVE IT______________________________
|
|
______________________________________________________________;
|
|
; ALLOCATE THE NUMBER OF PAGES THE APPLICATION REQUIRES______
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, allocate_pages____________________________; get a handle and
|
|
____________________________________________________________MOV B
|
|
X, application_pages_req_______________________; allocate pages
|
|
____________________________________________________________INT E
|
|
MM_interrupt___________________________________; to that handle
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
EMM_transient_init_exit:
|
|
|
|
;;
|
|
; RETURN TO THE APPLICATION__________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________RET
|
|
; return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
EMM_transient_init ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4-26 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;____________EXAMPLE PROCEDURE #2 EMM RESIDENT INITIALIZATION
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_______This example PROCEDURE determines whether or not EMM is
|
|
______________________________________________________________;
|
|
;_present in your your system. Next, it determines whether the
|
|
______________________________________________________________;
|
|
;____application can run with the version of EMM present in the
|
|
______________________________________________________________;
|
|
;___system and whether the application will "fit" in the number
|
|
______________________________________________________________;
|
|
;_____of unallocated pages the EMM has available for use. The,
|
|
______________________________________________________________;
|
|
;__procedure then locates the page frame segment, and allocates
|
|
______________________________________________________________;
|
|
;__________________________________________the pages requested.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;___If the application does not "fit" in the available expanded
|
|
______________________________________________________________;
|
|
;__memory, or if some other EMM error is encountered, then this
|
|
______________________________________________________________;
|
|
;____________________________________________________procedure:
|
|
______________________________________________________________;
|
|
;__________________1. Returns the status returned by the EMM in E
|
|
MM_status._____________________________________________________ ;
|
|
;________________________________2. Returns to the application.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;____If the application "fits" in the available expanded memory
|
|
______________________________________________________________;
|
|
;_______________________________________________then it should:
|
|
______________________________________________________________;
|
|
;__________1. Get the version number and determines whether the
|
|
______________________________________________________________;
|
|
;________ application is compatible with this version of EMM.
|
|
______________________________________________________________;
|
|
;________2. Get the page frame segment address from the EMM and
|
|
______________________________________________________________;
|
|
;_____________________________ save it in page_frame_segment.
|
|
______________________________________________________________;
|
|
;___________________3. Get a handle from the EMM and save it in
|
|
______________________________________________________________;
|
|
;________________________________________________ EMM_handle.
|
|
______________________________________________________________;
|
|
;____________________________4. Allocate the pages specified in
|
|
______________________________________________________________;
|
|
;_____________________________________ application_pages_req.
|
|
______________________________________________________________;
|
|
|
|
|
|
Example expanded memory programs300275-003 4-27
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;______________________5. Return a passed status in EMM_status.
|
|
______________________________________________________________;
|
|
;_________________________________6. Return to the application.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
EMM_resident_init PROC NEAR
|
|
|
|
;;
|
|
; DETERMINE WHETHER EMM IS RESIDENT IN THE SYSTEM ___________
|
|
_______________________________________________________________ ;
|
|
;;
|
|
_______________________________________________________________
|
|
____________________________________________________________MOV B
|
|
YTE PTR EMM_status, EMM_not_resident___________________________
|
|
_______________________________________________________________
|
|
; assume that the test
|
|
___________________________________________________________CALL s
|
|
econd_first_test_for_EMM__________________; for the presence of
|
|
____________________________________________________________JNC E
|
|
MM_resident_init_exit___________________________; EMM will fail
|
|
|
|
;;
|
|
; DETERMINE WHETHER RESIDENT VERSION OF EMM IS_______________
|
|
______________________________________________________________;
|
|
; COMPATIBLE WITH APPLICATION________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
____________________________________________________________MOV A
|
|
H, get_EMM_version________________________; get the EMM version
|
|
____________________________________________________________INT 6
|
|
7h
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4-28 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
____________________________________________________________ORA A
|
|
H, AH_________________________________________; if the function
|
|
____________________________________________________________JNZ E
|
|
MM_resident_init_exit____________________; failed return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
____________________________________________________________MOV B
|
|
YTE PTR EMM_status, EMM_version_mismatch_______________________
|
|
_______________________________________________________________
|
|
;assume that the installed
|
|
____________________________________________________________CMP A
|
|
L, application_EMM_version______;version of EMM is incompatible
|
|
_____________________________________________________________JB E
|
|
MM_resident_init_exit_______; incompatible with the application
|
|
_______________________________________________________________
|
|
; version
|
|
;;
|
|
; GET THE PAGE FRAME SEGMENT ADDRESS_________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, get_page_frame_address__________________; get the page frame
|
|
____________________________________________________________INT E
|
|
MM_interrupt__________________________________; segment address
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
____________________________________________________________ORA A
|
|
H, AH_________________________________________; if the function
|
|
____________________________________________________________JNZ E
|
|
MM_resident_init_exit____________________; failed return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
____________________________________________________________MOV p
|
|
age_frame_segment, BX_____________________; save the page frame
|
|
_______________________________________________________________
|
|
; segment address
|
|
|
|
;;
|
|
; GET THE NUMBER OF TOTAL AND UNALLOCATED PAGES PRESENT______
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, get_unalloc_page_count___________________; get the total and
|
|
____________________________________________________________INT E
|
|
MM_interrupt________________________________; un-allocated page
|
|
_______________________________________________________________
|
|
; in the system
|
|
|
|
|
|
Example expanded memory programs300275-003 4-29
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
____________________________________________________________ORA A
|
|
H, AH_________________________________________; if the function
|
|
____________________________________________________________JNZ E
|
|
MM_resident_init_exit____________________; failed return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
;;
|
|
; DETERMINE WHETHER APPLICATION CAN RUN WITH THIS NUMBER_____
|
|
______________________________________________________________;
|
|
; OF TOTAL AND UNALLOCATED______________________________PAGES
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV B
|
|
YTE PTR EMM_status, insuff_total_pages_________________________
|
|
_______________________________________________________________
|
|
;check total pages
|
|
____________________________________________________________CMP a
|
|
pplication_pages_req, DX
|
|
_____________________________________________________________JA E
|
|
MM_resident_init_exit
|
|
|
|
____________________________________________________________MOV B
|
|
YTE PTR EMM_status, insuff_unalloc_pages
|
|
____________________________________________________________CMP a
|
|
pplication_pages_req, BX_______________;check unallocated pages
|
|
_____________________________________________________________JA E
|
|
MM_resident_init_exit
|
|
|
|
;;
|
|
; GET AN EMM HANDLE AND SAVE IT______________________________
|
|
______________________________________________________________;
|
|
; ALLOCATE THE NUMBER OF PAGES THE APPLICATION REQUIRES______
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, allocate_pages____________________________; get a handle and
|
|
____________________________________________________________MOV B
|
|
X, application_pages_req_______________________; allocate pages
|
|
____________________________________________________________INT E
|
|
MM_interrupt___________________________________; to that handle
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
EMM_resident_init_exit:
|
|
|
|
|
|
|
|
4-30 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
; RETURN TO THE APPLICATION__________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________RET
|
|
; return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
EMM_resident_init ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-31
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_____________________________EXAMPLE PROCEDURE #3 EMM ACCESS
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_____This example PROCEDURE performs the following processing:
|
|
______________________________________________________________;
|
|
;_________1. Maps the logical page specified by logical_page at
|
|
______________________________________________________________;
|
|
;___________ the physical page specified by physical_page. It
|
|
______________________________________________________________;
|
|
;_______________________ uses the handle saved in EMM_handle.
|
|
______________________________________________________________;
|
|
;_________2. Save the status returned by the EMM in EMM_status.
|
|
______________________________________________________________;
|
|
;_________________________________3. Return to the application.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
EMM_access PROC NEAR
|
|
_______________________________________________________________
|
|
;;
|
|
; MAP THE LOGICAL PAGE SPECIFIED BY logical_page AT THE______
|
|
______________________________________________________________;
|
|
; PHYSICAL PAGE SPECIFIED BY physical_page___________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, map_handle_page_______________________________; map the page
|
|
____________________________________________________________MOV D
|
|
X, EMM_handle
|
|
____________________________________________________________MOV B
|
|
X, logical_page
|
|
____________________________________________________________MOV A
|
|
L, physical_page
|
|
____________________________________________________________INT E
|
|
MM_interrupt
|
|
|
|
;;
|
|
; RETURN THE STATUS_______________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
;;
|
|
|
|
|
|
4-32 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; RETURN TO THE APPLICATION_______________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________RET
|
|
; return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
EMM_access ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-33
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;________________________EXAMPLE PROCEDURE #4 EMM TERMINATION
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_____This example PROCEDURE performs the following processing:
|
|
______________________________________________________________;
|
|
;____________1. "Close" the EMM handle assigned to your program
|
|
______________________________________________________________;
|
|
;____________ and deallocates the pages EMM allocated to your
|
|
______________________________________________________________;
|
|
;___________ program. It uses the handle saved in EMM_handle.
|
|
______________________________________________________________;
|
|
;_________2. Save the status returned by the EMM in EMM_status.
|
|
______________________________________________________________;
|
|
;_________________________________3. Return to the application.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
EMM_terminate PROC NEAR
|
|
|
|
;;
|
|
; CLOSE THE EMM HANDLE_______________________________________
|
|
______________________________________________________________;
|
|
; DEALLOCATE ALL PAGES ALLOCATED TO IT_______________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV A
|
|
H, deallocate_pages______________________; close the handle and
|
|
____________________________________________________________MOV D
|
|
X, EMM_handle____________________________; deallocate all pages
|
|
____________________________________________________________INT E
|
|
MM_interrupt__________________________________; allocated to it
|
|
|
|
;;
|
|
; RETURN THE STATUS__________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
;;
|
|
; RETURN TO THE APPLICATION__________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
|
|
|
|
|
|
4-34 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
____________________________________________________________RET
|
|
; return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
EMM_terminate ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-35
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_____________________EXAMPLE PROCEDURE #5 EMM SAVE MAP STATE
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_____This example PROCEDURE performs the following processing:
|
|
______________________________________________________________;
|
|
;_____________________1. Saves the page mapping register state.
|
|
______________________________________________________________;
|
|
;_________________________2. Save the EMM status in EMM_status.
|
|
______________________________________________________________;
|
|
;________________________3. Return to the resident application.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
EMM_save_map_state PROC NEAR
|
|
|
|
____________________________________________________________MOV A
|
|
H, save_page_map_________________________; save the contents of
|
|
____________________________________________________________MOV D
|
|
X, EMM_handle________________________________; the page mapping
|
|
____________________________________________________________INT E
|
|
MM_interrupt________________________________________; registers
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
____________________________________________________________RET
|
|
; return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
EMM_save_map_state ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4-36 300275-003Example expanded memory programs
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;__________________EXAMPLE PROCEDURE #6 EMM RESTORE MAP STATE
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;_____This example PROCEDURE performs the following processing:
|
|
______________________________________________________________;
|
|
;________________1. Restore the page mapping register state, if p
|
|
ossible._______________________________________________________ ;
|
|
;_________________________2. Save the EMM status in EMM_status.
|
|
______________________________________________________________;
|
|
;________________________3. Return to the resident application.
|
|
______________________________________________________________;
|
|
;______________________________________________________________
|
|
______________________________________________________________;
|
|
;;
|
|
|
|
EMM_restore_map_state PROC NEAR
|
|
|
|
____________________________________________________________MOV A
|
|
H, restore_page_map______________________; restore the contents
|
|
____________________________________________________________MOV D
|
|
X, EMM_handle_____________________________; of the page mapping
|
|
____________________________________________________________INT E
|
|
MM_interrupt________________________________________; registers
|
|
|
|
____________________________________________________________MOV E
|
|
MM_status, AH_________________________________; save the status
|
|
|
|
____________________________________________________________RET
|
|
; return to the
|
|
_______________________________________________________________
|
|
; application
|
|
|
|
EMM_restore_map_state ENDP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Example expanded memory programs300275-003 4-37
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GLOSSARY
|
|
|
|
This glossary defines some of the terms that are used frequently
|
|
in this specification. The terms are listed in alphabetical
|
|
order.
|
|
|
|
Most of these terms are defined for readers who understand
|
|
technical terminology and are familiar with IBM PCs, XTs, and ATs
|
|
or compatibles.
|
|
|
|
|
|
Application program
|
|
|
|
An application program is the program you write and your customer
|
|
uses. Some categories of application software are word
|
|
processors, database managers, spreadsheet managers, and project
|
|
managers.
|
|
|
|
|
|
Conventional memory
|
|
|
|
Conventional memory refers to the memory DOS recognizes. In PCs,
|
|
XTs, and ATs, this is memory between 0 and 640K bytes. Because
|
|
application programs let DOS manage their memory, they can use
|
|
only conventional memory.
|
|
|
|
|
|
EMM
|
|
|
|
See Expanded Memory Manager.
|
|
|
|
|
|
EMM functions
|
|
|
|
The EMM functions are a set of standard interfaces to expanded
|
|
memory. They provide application programs with the operators
|
|
required to use expanded memory.
|
|
|
|
|
|
EMM handle
|
|
|
|
An EMM handle is a value that the EMM assigns to a file or a
|
|
device. Previous versions of this specification referred to an
|
|
EMM handle as a Process ID.
|
|
|
|
|
|
EMM Status code
|
|
|
|
A code that an EMM function returns which indicates something
|
|
about the result of running the function. Some status codes may
|
|
indicate whether the function worked correctly and others may
|
|
tell you something about the expanded memory hardware or
|
|
software.
|
|
|
|
|
|
|
|
|
|
Glossary-38 300275-003
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Expanded memory
|
|
|
|
Expanded memory is a special kind of memory that goes beyond
|
|
DOS's 640K-byte limit. Application programs that adhere to the
|
|
Lotus/Intel Expanded Memory Specification can use the Expanded
|
|
Memory Manager (EMM) to manage expanded memory just as other
|
|
programs use DOS to manage conventional memory.
|
|
|
|
|
|
Expanded Memory Manager
|
|
|
|
The Expanded Memory Manager (EMM) is a standard device driver
|
|
that manages expanded memory in much the same way DOS manages
|
|
conventional memory.
|
|
|
|
|
|
Extended memory
|
|
|
|
Extended memory is the 15M-byte address space outside the memory
|
|
DOS can access. This address space is of little use to those
|
|
application programs that use DOS. DOS does not recognized
|
|
memory above 640K bytes; the XENIX operating system uses extended
|
|
memory.
|
|
|
|
|
|
Logical page
|
|
|
|
The EMM allocates expanded memory in 16K-byte units called
|
|
logical pages.
|
|
|
|
|
|
Mapping
|
|
|
|
Mapping is the process of making a logical page of memory
|
|
available for the processor to use. Mapping is done within one
|
|
of the four physical pages defined by this specification.
|
|
|
|
|
|
Page frame
|
|
|
|
A page frame is the collection of four 16k-byte contiguous,
|
|
physical pages from which an application program accesses
|
|
expanded memory.
|
|
|
|
|
|
Page frame base address
|
|
|
|
A page frame base address is the location (in segment format) of
|
|
the first byte of the page frame.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
300275-003 Glossary-39
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Physical page
|
|
|
|
A physical page is the range of memory addresses occupied by a
|
|
single 16k-byte page. The 16k-byte page is one of the four pages
|
|
defined as a page frame.
|
|
|
|
|
|
Process ID
|
|
|
|
See EMM handle.
|
|
|
|
|
|
Resident application program
|
|
|
|
A resident application program is loaded by DOS, executes, and
|
|
remains resident in the system after it returns control to DOS.
|
|
This type of program occupies memory and is usually invoked by
|
|
the operating system, an application program, or the hardware.
|
|
Some examples of resident application programs are RAM disk
|
|
drivers, print spoolers, and "pop-up" desktop programs.
|
|
|
|
|
|
Transient application program
|
|
|
|
A transient application program is loaded by DOS, executes, and
|
|
doesn't remain in the system after it returns control to DOS.
|
|
After a transient application program returns control to DOS, the
|
|
memory it used is available for other programs.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Glossary-40 300275-003
|
|
|
|
|
|
|
|
|
|
|