| Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992.
 
 Приведенная ниже программа демонстрирует
использование основных функций EMM:  
#include <stdio.h>
#include <conio.h>
#include "sysp.h"
void main(void);
void main(void) {
        unsigned frame, err;
        unsigned total, free;
        unsigned handle;
        char ver;
// Это сообщение будет переписано сначала из
// области стандартной памяти в область дополнительной,
// затем обратно в область основной.
        static char test_msg[] = "Тестовое сообщение для "
                                                "записи в область EMS.";
        char buf[80];
        char _far *ptr;
        int i;
// Проверяем, установлен ли драйвер EMS.
        if(ems_init() != 0) {
                printf("\nДрайвер EMS не установлен.");
                exit(-1);
        }
// Если драйвер установлен, определяем его состояние.
        printf("\nДрайвер EMS установлен, состояние: %02.2X.",
                ems_stat());
// Выводим номер версии драйвера
        if((err = ems_ver(&ver)) != 0) {
                printf("\nОшибка: %02.2X", err);
                exit(-1);
        }
        printf("\nВерсия EMM: %02.2X", ver);
// Определяем сегмент окна доступа
        if((err = ems_fram(&frame)) != 0) {
                printf("\nОшибка: %02.2X", err);
                exit(-1);
        }
        printf("\nСегмент окна доступа: %04.4X",
                frame);
// Определяем общее количество страниц и
// количество доступных страниц.
        if((err = ems_page(&total, &free)) != 0) {
                printf("\nОшибка: %02.2X", err);
                exit(-1);
        }
        printf("\nОбщее количество страниц EMS: %d"
                         "\nКоличество доступных страниц: %d",
                         total, free);
// Заказываем пул в дополнительной памяти.
        if((err = ems_open(free, &handle)) != 0) {
                printf("\nОшибка: %02.2X", err);
                exit(-1);
        }
// Отображаем нулевую физическую страницу
// на нулевую логическуб страницу пула.
        if((err = ems_map(0, 0, handle)) != 0) {
                printf("\nОшибка: %02.2X", err);
                exit(-1);
        }
// Конструируем указатель на физическую страницу.
        ptr = FP_MAKE(frame,0);
// Копируем тестовое сообщение в
// дополнительную память.
        printf("\nКопируем в EMS: %s",test_msg);
        for(i=0; test_msg[i] != 0; i++)
                ptr[i] = test_msg[i];
// Теперь копируем это сообщение обратно
// в стандартную память.
        for(i=0; ptr[i] != 0; i++)
                buf[i] = ptr[i];
        buf[i] = 0;
// Выводим сообщение на экран для
// проверки.
        printf("\nСкопировано из EMS: %s",buf);
// Закрываем пул.
        if((err = ems_clos(&handle)) != 0) {
                printf("\nОшибка: %02.2X", err);
                exit(-1);
        }
        exit(0);
}
 |