Программирование и кодирование
размещения*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
if (!result) /*функция завершилась успешно*/
*handle = outregs.x.dx; /*обработчик менеджера
расширенной памяти для работы с
этими страницами*/
return(result);
}
EMSMapHandlePage(handle, page, frame) /*отображает логическую
страницу в 'кадр'*/
unsigned int handle, page, frame;
{
inregs.h.ah = 0x44; /*функция "Отобразить/перестать отоб-
ражать страницы спецификации расширенной памяти*/
inregs.h.al = frame & 0x00ff; /*кадр целевой страницы*/
inregs.x.bx = page; /*номер логической страницы, в которую
отображать*/
inregs.x.dx = handle; /*обработчик, которому принадлежит
логическая страница*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
return(result);
}
EMSDeallocatePages(handle) /*освобождает обработчик и все его
страницы*/
unsigned int handle;
{
inregs.h.ah = 0x45; /*функция "Освободить страницы"
спецификации расширенной памяти*/
inregs.x.dx = handle; /*обработчик, назначенный для осво-
бождения менеджеру расширенной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
- 7-60 -
return(result);
}
EMSGetVersion(emsver) /*возвращает номер версии программного
обеспечения менеджера расширенной памяти*/
char *emsver;
{
inregs.h.ah = 0x46; /*функция "Получить версию"
спецификации расширенной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs);
if (!(result & 0xFF00)) { /*функция завершилась успешно*/
emsver[0] = ((result & 0x00F0) >> 4) + '0';
emsver[1] = '.';
emsver[2] = (result & 0x000F) + '0';
emsver[3] = '\0';
}
return(result >> 8);
}
EMSSavePageMap(handle) /*сохраняет контекст менеджера расширенной
памяти в области сохранения контекста
менеджера расширенной памяти*/
unsigned int handle;
{
inregs.h.ah = 0x47; /*функция "Сохранить отображение страниц"
спецификации расширенной памяти*/
inregs.x.dx = handle; /*обработчик, для которого выполняет-
ся сохранение*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
return(result);
}
EMSRestorePageMap(handle) /*восстанавливает контекст менеджера
расширенной памяти из области сохране-
ния контекста менеджера расширенной памяти*/
unsigned int handle;
{
inregs.h.ah = 0x48; /*функция "Восстановить отображение стра-
ниц" спецификации расширенной памяти*/
inregs.x.dx = handle; /*область контекста, откуда выполня-
ется восстановление*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
return(result);
}
EMSGetHandleCnt(hcnt) /*возвращает кол-во открытых обработчиков
(1 - 255*/
unsigned int *hсnt;
{
inregs.h.ah = 0x4B; /*функция "Получить кол-во обработ-
чиков спецификации расширенной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
if (!result) { /*функция завершилась успешно*/
*hcnt = outregs.x.bx;
}
return(result);
}
- 7-61 -
EMSGetHandlePages(handle, pages) /*возвращает кол-во страниц,
размещенных для обработчика*/
unsigned int handle, *pages;
{
inregs.h.ah = 0x4С; /*функция "Получить страницы обработ-
чика" спецификации расширенной памяти*/
inregs.x.dx = handle; /*обработчик, которому, полагается,
принадлежат страницы*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs)>>8;
if (!result) /*функция завершилась успешно*/
*pages = outregs.x.bx;
return(result);
}
EMSGetAllHandlePages(hp, hpcnt) /*возвращает кол-во страниц,
размещенных всем обработчикам*/
HANDLE_PAGE *hp;
unsigned int *hpcnt;
{
segread(&segregs); /*заполнить регистры сегментов*/
inregs.h.ah = 0x4D; /*функция "Получить страницы всех
обработчиков" спецификации расширенной памяти*/
segregs.es = segregs.ds; /*сегмент массива HANDLE_PAGE*/
inregs.x.di = (unsigned int) hp; /*смещение массива HANDLE_
PAGE*/
result = (unsigned int) int86x(EMM_INT, &inregs, &outregs,
&segregs) >> 8;
if (!result) /*функция завершилась успешно*/
*hpcnt = outregs.x.bx;
return(result);
}
EMSGetPageMap(map) /*получает контекст менеджера расширенной па-
мяти в область сохранения контекста пользователя*/
PMAP *map;
{
segread(&segregs); /*заполнить регистры сегментов*/
segregs.es = segregs.ds; /*использовать es = ds*/
inregs.x.ax = 0x4E00; /*функция "Получить отображение стра-
ниц" спецификации расширенной памяти*/
inregs.x.di = (unsigned int) map; /*указатель на массив отоб-
ражения*/
result = (unsigned int) int86x(EMM_INT, &inregs, &outregs,
&segregs) >> 8;
return(result);
}
EMSSetPageMap(map) /*устанавливает контекст менеджера расширенной
памяти из области сохранения контекста пользователя*/
PMAP *map;
{
segread(&segregs); /*заполнить регистры сегментов*/
inregs.x.ax = 0x4E01; /*функция "Установить отображение стра-
ниц" спецификации расширенной памяти*/
inregs.x.si = (unsigned int) map; /*указатель на массив отоб-
ражения*/
- 7-62 -
result = (unsigned int) int86x(EMM_INT, &inregs, &outregs,
&segregs) >> 8;
return(result);
}
EMSGetSetPageMap(srcmap, destmap) /*сохраняет контекст менеджера
сширенной памяти в destmap и затем устанавливает
контекст менеджера расширенной памяти из srcmap*/
PMAP *srcmap, *destmap;
{
segread(&segregs); /*заполнить регистры сегментов*/
segregs.es = segregs.ds; /*оба отображения в ds*/
inregs.x.ax = 0x4E02; /*функция "Получить и установить отоб-
ражение страниц" спецификации расширенной памяти*/
inregs.x.si = (unsigned int) srcmap; /*указатель на массив
отображения-источника*/
inregs.x.di = (unsigned int) destmap; /*указатель на массив
отображения-приемника*/
result = (unsigned int) int86x(EMM_INT, &inregs, &outregs,
&segregs) >> 8;
return(result);
}
EMSGetPageMapeSize(size) /*получает размер области сохранения
контекста пользователя*/
unsigned int *size;
{
inregs.x.ax = 0x4E03; /*функция "Получить размер отображе-
ния страниц" спецификации расширенной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs);
if (!(result) & 0xFF00)) /*функция завершилась успешно*/
*size = outregs.h.al;
return(result >> 8);
}
EMSGetPPageMap(pmap, savearea) /*получает частичный контекст ме-
неджера расширенной памяти в область со-
хранения пользователя*/
PPMAP *pmap;
PCONTEXT *savearea;
{
segread(&segregs); /*заполнить регистры сегментов*/
segregs.es = segregs.ds; /*использует es = ds*/
inregs.x.ax = 0x4F00; /*функция "Получить частичное отобра-
жение страниц" спецификации расширенной памяти*/
inregs.x.si = (unsigned int) pmap; /*какие кадры мы хотим*/
inregs.x.di = (unsigned int) savearea; /*указатель на массив
отображения*/
result = (unsigned int) int86x(EMM_INT, &inregs, &outregs,
&segregs) >> 8;
return(result);
}
EMSSetPPageMap(savearea) /*устанавливает частичный контекст ме-
неджера расширенной памяти из области
сохранения пользователя*/
PCONTEXT *savearea;
- 7-63 -
{
segread(&segregs); /*заполнить регистры сегментов*/
inregs.x.ax = 0x4F01; /*функция "Установить частичное отобра-
жение страниц" спецификации расширенной памяти*/
inregs.x.si = (unsigned int) savearea; /*кадры, которые мы хо-
тим восстановить*/
result = (unsigned int) int86x(EMM_INT, &inregs, &outregs,
&segregs) >> 8;
return(result);
}
EMSGetPPageMapeSize(count,size) /*получает размер области, необ-
ходимой для сохранения*/
unsigned int count,*size;
{
inregs.x.ax =0x4F02; /*функция "Получить размер частично-
го отображения страниц" специфи-
кации расширенной памяти*/
inregs.x.bx = count; /*кол-во кадров для сохранения*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs);
if (!(result) & 0xFF00)) /*функция завершилась успешно*/
*size = outregs.h.al;
return(result >> 8);