Аппаратное обеспечение 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, ®, ®); 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, ®, ®); *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, ®, ®); *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, ®, ®); *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, ®, ®); 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, ®, ®); 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, ®, ®); *ver = reg.h.al; return(reg.h.ah); } |