Программирование и кодирование
{
inregs.x.ax =0x5901; /*функция "Получить кол-во исходных
страниц спецификации расширенной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
if (!result) { /*функция завершилась успешно*/
*rpg_cnt = outregs.x.dx; /*общее кол-во исходных страниц*/
*urpg_cnt = outregs.x.bx; /*кол-во неразмещенных исходных
страниц*/
}
return(result);
}
EMSAllocateStdPages(handle, pages) /*размещает обработчик с 'pag-
es' стандартных страниц*/
unsigned int handle, *pages;
{
inregs.x.ax =0x5A00; /*функция "Разместить стандартные
страницы" спецификации расширенной памяти*/
inregs.x.bx = pages; /*кол-во логических страниц для раз-
мещения*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >> 8;
if (!result) /*функция завершилась успешно*/
*handle = outregs.x.dx; /*обработчик менеджера расширенной
памяти для применения с этими страницами*/
return(result);
}
EMSAllocateRawPages(handle, pages) /*размещает обработчик с 'pag-
es' исходных страниц*/
unsigned int handle, *pages;
{
inregs.x.ax =0x5A01; /*функция "Разместить исходные стра-
ницы" спецификации расширенной памяти*/
inregs.x.bx = pages; /*кол-во логических страниц для раз-
мещения*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >> 8;
if (!result) /*функция завершилась успешно*/
*handle = outregs.x.dx; /*обработчик менеджера расширенной
- 7-68 -
памяти для применения с этими страницами*/
return(result);
}
EMSGetAltMapRegSet(set,pmap) /*получает альтернативный набор ре-
гистров отображения спецификации расширенной памяти*/
unsigned int *set; /*текущий альтернативный набор ре-
гистров отображения*/
PMAP far **pmap; /*указатель на указатель области со-
хранения контекста*/
{
inregs.x.ax =0x5B00; /*функция "Получить альтернативный на-
бор регистров отображения"*/
segread(&segregs);
result = (unsigned int) int86x(EMM_INT, &inregs, &outregs,
&segregs) >> 8;
if (!result) {
*set = outregs.h.bi; /*текущий активный набор*/
if (*set == 0) { /*фальшивый альтернативный набор ре-
гистров*/
FP_OFF(*pmap) = outregs.x.di; /*смещение области кон-
текста операционной среды (OS)*/
FP_SEG(*pmap) = segregs.es; /*сегмент области кон-
текста операционной среды (OS)*/
}
}
return(result);
}
EMSSetAltMapRegSet(set,pmap) /*устанавливает альтернативный набор
регистров отображения спецификации расширенной памяти*/
unsigned int set; /*новый альтернативный набор ре-
гистров отображения*/
PMAP *pmap; /*указатель области сохранения контекста*/
{
segread(&segregs); /*заполнить регистры сегментов*/
inregs.x.ax =0x5B01; /*функция "Установить альтернативный на-
бор регистров отображения"*/
inregs.h.bl = set & 0x00FF;
if (set == 0) { /*фальшивый альтернативный набор ре-
гистров*/
inregs.x.di = (unsigned int) pmap;
segregs.es = segregs.ds;
}
result = (unsigned int) int86x(EMM_INT, &inregs, &outregs,
&segregs) >> 8;
if (!result)
}
EMSGetAltMapArraySize(size) /*получает размер массива сохранения
альтернативного отображения*/
unsigned int size; /*кол-во отображаемых физических
страниц*/
{
inregs.x.ax =0x5B02; /*функция "Получить размер массива со-
хранения альтернативного отображения"*/
- 7-69 -
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
if (!result) /*успех*/
*size = outregs.x.dx; /*размер массива*/
return(result);
}
EMSAllocAltMapRegSet(set) /*размещает альтернативный набор регис-
тров отображения*/
unsigned int *set; /*номер, размещенного набора*/
{
inregs.x.ax =0x5B03; /*функция "Разместить альтернативный
набор регистров отображения"*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
if (!result) /*успех*/
*set = outregs.h.bl; /*номер размещенного набора*/
return(result);
}
EMSDeallocAltMapRegSet(set) /*освобождает альтернативный набор ре-
гистров отображения*/
unsigned int set; /*номер, освобождаемого набора*/
{
inregs.x.ax =0x5B04; /*функция "Освободить альтернативный
набор регистров отображения"*/
inregs.h.bl = set & 0x00FF;
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
return(result);
}
EMSAllocDMARegSet(set) /*размещает набор регистров ПДП*/
unsigned int *set; /*номер, размещаемого набора*/
{
inregs.x.ax =0x5B05; /*функция "Разместить набор регистров
ПДП" спецификации расширенной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
if (!result) /*успех*/
*set = outregs.h.bl; /*номер размещенного набора*/
return(result);
}
EMSEnableDMARegSet(set, channel) /*разрешает набор регистров ПДП*/
unsigned int set; /*номер, разрешаемого набора*/
unsigned int channel; /*номер канала ПДП для связыва-*/
ния с регистром отображения*/
{
inregs.x.ax =0x5B06; /*функция "Разрешить набор регис-
тров ПДП" спецификации расширенной памяти*/
inregs.h.bl = set & 0x00FF;
inregs.h.dl = channel & 0x00FF;
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
return(result);
}
EMSDisableDMARegSet(set) /*запрещает набор регистров ПДП*/
unsigned int set; /*номер запрещаемого набора*/
{
inregs.x.ax =0x5B07; /*функция "Запретить набор регистров
ПДП" спецификации расширенной памяти*/
- 7-70 -
inregs.h.bl = set & 0x00FF;
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
return(result);
}
EMSDDeallocDMARegSet(set) /*освобождает набор регистров ПДП*/
unsigned int set; /*номер освобождаемого набора*/
{
inregs.x.ax =0x5B08; /*функция "Освободить набор регистров
ПДП" спецификации расширенной памяти*/
inregs.h.bl = set & 0x00FF;
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
return(result);
}
EMSPrepareForWarmboot() /*подготавливает оборудование специфи-
кации расширенной памяти к программному перезапуску*/
{
inregs.h.ah =0x5C; /*функция "Подготовиться к программному
перезапуску" спецификации расширенной памяти*/
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
return(result);
}
EMSEnableOSFunc(key) /*разрешить набор функций операционной
среды*/
long *key; /*ключ доступа к операционной среде - должен быть
равен 0, когда применяется первый раз*/
{
inregs.x.ax =0x5D00; /*функция "Разрешить набор функций опе-
рационной среды" спецификации расширенной памяти*/
if (*key !=0) {
inregs.x.bx = FP_OFF(*key);
inregs.x.cx = FP_SEG(*key);
}
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
if (!result) {
FP_OFF(*key) = outregs.x.bx;
FP_SEG(*key) = outregs.x.cx;
}
}
return(result);
}
EMSDisableOSFunc(key) /*запретить набор функций операционной
среды*/
long *key; /*ключ доступа к операционной среде - должен быть
равен 0, когда применяется первый раз*/
{
inregs.x.ax =0x5D01; /*функция "Запретить набор функций опе-
рационной среды" спецификации расширенной памяти*/
if (*key !=0) {
inregs.x.bx = FP_OFF(*key);
inregs.x.cx = FP_SEG(*key);
}
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
- 7-71 -
if (!result) {
FP_OFF(*key) = outregs.x.bx;
FP_SEG(*key) = outregs.x.cx;
}
}
return(result);
}
EMSReturnAccessKey(key) /*возвращает ключ доступа к операционной
среде менеджеру расширенной памяти*/
long *key; /*ключ доступа к операционной среде*/
{
inregs.x.ax =0x5D02; /*функция "Возвратить ключ доступа к
операционной среде" спецификации расширенной памяти*/
inregs.x.bx = FP_OFF(key);
inregs.x.cx = FP_SEG(key);
result = (unsigned int) int86(EMM_INT, &inregs, &outregs) >>8;
return(result);
}
------------------------------------------------------------------
Листинг 7-6. EMMFUNC.H