Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+Лабораторная№13 .doc
Скачиваний:
31
Добавлен:
27.10.2018
Размер:
138.24 Кб
Скачать

Закрити індекс 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);

}

Отримати номер версії 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);

}

Програма, використовуюча 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);

}