Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение IBM PC

© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.

[Назад] [Содеожание] [Дальше]

11.4. Стандартные функции EMM

Стандартные функции - это небольшое подмножество функций EMM, необходимое для работы обычных прикладных программ (не резидентных и не драйверов). Все эти функции поддерживаются EMM версии 3.2.

11.4.1. Получить состояние EMM

На входе:       AX = 4000h.

На выходе:      AH = байт состояния EMM.



Эта функция используется для проверки состояния драйвера EMM. Она должна использоваться только после того, как программа убедилась в наличии драйвера EMM.

Для получения состояния EMM используйте следующую функцию:

/**
*.Name         ems_stat
*.Title        Определение состояния драйвера EMS
*
*.Descr        Эта функция возвращает байт состояния
*              драйвера EMS
*
*.Proto        char ems_stat(void);
*
*.Params       Не используются
*
*.Return       Байт состояния драйвера EMS
*
*.Sample       ems_test.c
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

char ems_stat(void) {

        union REGS reg;
        struct SREGS sreg;

        reg.x.ax = 0x4000;
        int86(0x67, &reg, &reg);
        return(reg.h.ah);
}



11.4.2. Получить сегмент окна

На входе:       AX = 4100h.

На выходе:      AH = байт состояния EMM;

                BX = сегмент окна для доступа к логическим
                страницам дополнительной памяти.



Функция позволяет получить сегмент 64-килобайтного окна, используемого драйвером EMS для доступа к логическим страницам расширенной памяти.

/**
*.Name         ems_fram
*.Title        Определение сегмента окна доступа
*
*.Descr        Эта функция возвращает сегментный адрес
*              окна, которое используется для доступа к
*              дополнительной памяти.
*
*.Proto        char ems_fram(unsigned *frame);
*
*.Params       unsigned *frame - Указатель на переменную,
*                 в которую будет записан сегментный
*                 адрес окна доступа.
*
*.Return       Сосотояние EMM.
*
*.Sample       ems_test.c
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

char ems_fram(unsigned *frame) {

        union REGS reg;
        struct SREGS sreg;

        reg.x.ax = 0x4100;
        int86(0x67, &reg, &reg);
        *frame = reg.x.bx;

        return(reg.h.ah);
}



11.4.3. Получить размер доступной памяти EMS

На входе:       AX = 4200h.

На выходе:      AH = байт состояния EMM;

                DX = общее количество 16-килобайтных
                страниц EMS в системе;

                BX = число доступных в настоящее время
                страниц EMS.



Эта функция позволяет вам получить информацию о наличии и доступности страниц дополнительной памяти.

/**
*.Name         ems_page
*.Title        Определение количества страниц EMS
*
*.Descr        Эта функция предназначена для определения
*              общего количества страниц EMS и количества
*              страниц, доступных в настоящее время.
*
*.Proto        char ems_page(unsigned *total, unsigned *free);
*
*.Params       unsigned *total - указатель на переменную,
*                 в которую будет записано общее количество
*                 страниц памяти EMS;
*              unsigned *free - указатель на переменную,
*                 в которую будет записано количество
*                 доступных страниц памяти EMS;
*
*.Return       Сосотояние EMM.
*
*.Sample       ems_test.c
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

char ems_page(unsigned *total, unsigned *free) {

        union REGS reg;

        reg.x.ax = 0x4200;
        int86(0x67, &reg, &reg);
        *total = reg.x.dx;
        *free  = reg.x.bx;

        return(reg.h.ah);
}



11.4.4. Открыть индекс EMM

На входе:       AX = 4300h;

                BX = требуемое в данном пуле количество
                логических страниц.

На выходе:      AH = байт состояния EMM;

                DX = индекс пула EMS, он будет использоваться
                в операциях с пулом логических страниц.



Эта функция позволяет заказать пул логических страниц (т.е. некоторую совокупность логических страниц дополнительной памяти). Полученному пулу присваивается индекс (handle), который указывает на пул и используется во всех операциях с пулом.

/**
*.Name         ems_open
*.Title        Открытие индекса пула страниц EMS
*
*.Descr        Эта функция открывает индекс пула страниц
*              EMS, делая доступными логические страницы
*              дополнительной памяти.
*
*.Proto        int ems_open(int n_pages, int *handle);
*
*.Params       int n_pages - количество требуемых логических
*                 страниц;
*              int *handle - указатель на слово, в которое
*                 будет записан индекс полученного пула.
*
*.Return       Байт состояния драйвера EMS
*
*.Sample       ems_test.c
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

int ems_open(int n_pages, int *handle) {

        union REGS reg;

        reg.x.ax = 0x4300;
        reg.x.bx = n_pages;
        int86(0x67, &reg, &reg);

        *handle = reg.x.dx;
        return(reg.h.ah);
}



11.4.5. Отобразить память

На входе:       AH = 44h;

                AL = номер физической страницы окна доступа
                (от 0 до 3);

                BX = номер логической страницы из числа
                находящихся в пуле страниц (от 0 до n-1,
                где n - количество логических страниц
                в пуле);
                для версии EMS 4.0 задание значения
                0FFFFh приводит к запрещению отображения
                физических страниц пула, для разрешения
                их отображения необходимо вызвать эту
                функцию еще раз, указав правильный
                номер страницы;

                DX = индекс EMM, полученный от функции 43h.

На выходе:      AH = байт состояния EMM.



Функция выполняет отображение (привязку) одной из логических страниц пула к одному их четырех 16-килобайтных сегментов окна просмотра, т.е. к физическим страницам.

/**
*.Name         ems_map
*.Title        Отобразить память EMS
*
*.Descr        Эта функция отображает логические страницы
*              пула дополнительной памяти на физические.
*
*.Proto        int ems_map(int phys_page, int log_page,
*                          int handle);
*
*.Params       int phys_pages - номер физической страницы
*                 окна доступа (от 0 до 3), на которую необходимо
*                 отобразить логическую страницу пула;
*
*              int_log_page - номер логической страницы пула;
*
*              int *handle - индекс полученного пула;
*
*.Return       Байт состояния драйвера EMS
*
*.Sample       ems_test.c
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

int ems_map(int phys_page, int log_page, int handle) {

        union REGS reg;

        reg.h.ah = 0x44;
        reg.h.al = phys_page;
        reg.x.bx = log_page;
        reg.x.dx = handle;
        int86(0x67, &reg, &reg);

        return(reg.h.ah);
}



11.4.6. Закрыть индекс EMM

На входе:       AX = 4500h;

                DX = индекс EMM.

На выходе:      AH = байт состояния EMM.




Функция освобождает все логические страницы пула. После освобождения эти страницы могут быть повторно распределены.

/**
*.Name         ems_clos
*.Title        Закрытие индекса пула страниц EMS
*
*.Descr        Эта функция закрывает индекс пула страниц,
*              полученный функцией ems_open().
*
*.Proto        int ems_clos(int *handle);
*
*.Params       int *handle - указатель на слово, в которое
*                 будет записан индекс полученного пула.
*
*.Return       Байт состояния драйвера EMS
*
*.Sample       ems_test.c
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

int ems_clos(int *handle) {

        union REGS reg;

        reg.x.ax = 0x4500;
        reg.x.dx = *handle;
        int86(0x67, &reg, &reg);

        return(reg.h.ah);
}



11.4.7. Получить номер версии EMM

На входsе:      AX = 4600h.

На выходе:      AH = байт состояния EMM;

                AL = номер версии в двоично-десятичном (BCD)
                формате, 32h соответствует версии 3.2.



Версия 4.0 EMM поддерживает больше функций по управлению дополнительной памятью, чем версия 3.2. Прежде чем использовать такие функции, следует определить номер используемой версии EMM с помощью функции 46h.

/**
*.Name         ems_ver
*.Title        Определение версии драйвера EMS
*
*.Descr        Эта функция возвращает номер версии
*              драйвера EMS в двоично-десятичном формате.
*
*.Proto        int ems_ver(char *ver);
*
*.Params       char *ver - указатель на байт, в который
*                 будет записан номер версии.
*
*.Return       Номер версии драйвера EMS в формате BCD
*
*.Sample       ems_test.c
**/

#include <stdio.h>
#include <dos.h>
#include "sysp.h"

int ems_ver(char *ver) {

        union REGS reg;

        reg.x.ax = 0x4600;
        int86(0x67, &reg, &reg);

        *ver = reg.h.al;
        return(reg.h.ah);
}



[Назад] [Содеожание] [Дальше]