Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 11.7. Программа, использующая EMSПриведенная ниже программа демонстрирует использование основных функций 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); } |