/****************************************************************************
    SPHINX Programming (C) 2001.
    NAME:  DPMISERV.H--
    DESCRIPTION: Hабор процедур для работы с DPMI сервисом.
    LAST MODIFIED:  04-05-2001 15:26:24
 ----------------------------------------------------------------------------
    PROCEDURES DEFINED IN THIS FILE:
     :void CARRYFLAG fastcall GetVirtualInterruptHandler(BL);
     :void CARRYFLAG fastcall SetVirtualInterruptHandler(BL,CX,EDX);
     :void CARRYFLAG fastcall AllocateDosMemBlock(BX);
     :void CARRYFLAG fastcall FreeDosMemBlock(DX);
     :void CARRYFLAG fastcall ReSizeDosMemBlock(BX,DX);
     :void CARRYFLAG fastcall AllocateMemoryBlock(EAX);
     :word CARRYFLAG fastcall AllocateSelector(CX);
     :void CARRYFLAG fastcall SetSelectorBaseAddress(BX,EAX);
     :void CARRYFLAG fastcall SetSelectorLimit(BX,EAX);
 ----------------------------------------------------------------------------
    Alexey Dryamov (Din)
    E-Mail  : _Din_@Mail.ru
              _Din_@nm.ru
              Din@RbcMail.ru
    FidoNet : 2:5055/141.11

****************************************************************************/

#ifndef _DPMISERV_
 #define _DPMISERV_ TRUE
#endif


// Объявление процедур //////////////////////////////////////////////// 32 //
void CARRYFLAG fastcall GetVirtualInterruptHandler(BL);
void CARRYFLAG fastcall SetVirtualInterruptHandler(BL,CX,EDX);
void CARRYFLAG fastcall AllocateDosMemBlock(BX);
void CARRYFLAG fastcall FreeDosMemBlock(DX);
void CARRYFLAG fastcall ReSizeDosMemBlock(BX,DX);
void CARRYFLAG fastcall AllocateMemoryBlock(EAX);
word CARRYFLAG fastcall AllocateSelector(CX);
void CARRYFLAG fastcall SetSelectorBaseAddress(BX,EAX);
void CARRYFLAG fastcall SetSelectorLimit(BX,EAX);


#ifdef __DOS32__

// Процедуры ////////////////////////////////////////////////////////////////
// Взять адрес обработчика виртуального-прерывания
// BL - номер виртуального-прерывания
// На выходе:
// CX -  селектор обработчика виртуального-прерывания
// EDX - смещение обработчика виртуального-прерывания
:void CARRYFLAG fastcall GetVirtualInterruptHandler(BL)
{
 AX=204h; $int 31h
}



// Установить обработчик виртуального-прерывания ////////////////////// 32 //
// BL - номер виртуального-прерывания
// CX -  селектор обработчика виртуального-прерывания
// EDX - смещение виртуального обработчика прерывания
:void CARRYFLAG fastcall SetVirtualInterruptHandler(BL,CX,EDX)
{
 AX=205h; $int 31h
}



// Выделение блока досовской памяти /////////////////////////////////// 32 //
// BX - количество параграфоф памяти
// На выходе:
// Если все ОК: AX - DosMemBlockSeg
//              DX - DosMemBlockSel
// Иначе: AX - DPMI error code
//        BX - размер доступной досовской памяти в параграфах
:word CARRYFLAG fastcall AllocateDosMemBlock(BX)
{
 AX=100h; $int 31h
}



// Освождение блока досовской памяти ////////////////////////////////// 32 //
// DX - селектор блока досовской памяти
// На выходе:
// Если ошибка: AX - DPMI error code
:void CARRYFLAG fastcall FreeDosMemBlock(DX)
{
 AX=101h; $int 31h
}



// Изменение размера блока досовской памяти /////////////////////////// 32 //
// BX - желаемый размер блока досовской памяти
// DX - селектор блока досовской памяти
// На выходе:
// Если ошибка: AX - DPMI error code
//              BX - размер доступной досовской памяти в параграфах
:void CARRYFLAG fastcall ReSizeDosMemBlock(BX,DX)
{
 AX=101h; $int 31h
}



// Выделение памяти // 501h /////////////////////////////////////////// 32 //
// На входе:
// EAX - желаемый размер памяти
// На выходе:
// Если ошибка: AX - DPMI error code
// Иначе:       EAX,BX:CX - линейный адрес выделенного блока памяти
//              EDX,SI:DI - Allocated Memory Block Handler
:void CARRYFLAG fastcall AllocateMemoryBlock(EAX)
{
 $push EAX $pop CX,BX
 AX=501h;
 $int 31h
 $push SI,DI $pop EDX
 $push BX,CX $pop EAX
}



// Выделение селектора //////////////////////////////////////////////// 32 //
// CX - необходимое количество селекторов
// На выходе: AX - селектор
:word CARRYFLAG fastcall AllocateSelector(CX)
{
 EAX=0; $int 31h
}



// Установка базового адреса селектора //////////////////////////////// 32 //
// BX  - селектор
// EAX - базовый адрес селектора
:void CARRYFLAG fastcall SetSelectorBaseAddress(BX,EAX)
{
 $push EAX $pop DX,CX
 AX=7; $int 31h
}



// Установка границы селектора //////////////////////////////////////// 32 //
// BX  - селектор
// EAX - размер селектора-1 , если размер более 1MB, то размер надо
// устанавливать 4GB (если кто решил эту проблему - подправьте плиз и скажите
// как)
:void CARRYFLAG fastcall SetSelectorLimit(BX,EAX)
{
 $push EAX $pop DX,CX
 AX=8; $int 31h
}

#endif