Кафедра МОП ЭВМ Драйвер управления расширенной памятью HIMEM,SYS, страница 18

if (!ret)  ErrMsg("Ошибка при включении линии A20: ");

}

}

byte GetDriveType(int drive)

{

_AH = 0x08;  _DL = drive;

geninterrupt(0x13);

return _BL;

}

void GetHelp()

{

puts("Формат:  dcopy имя_диска");

}

Файл Xms.asm (Процедуры для работы с расширенной памятью):

.MODEL SMALL, C

.386

PUBLIC XMM_InitDriver, XMM_GetMaxFree, XMM_GetTotalFree, \

XMM_AllocMem, XMM_FreeMem, XMM_MoveToXMA, XMM_MoveToCMA, \

XMM_EnableA20, XMM_DisableA20

PUBLIC err_code

.DATA

ver             dw      0       ; Версия драйвера himem.sys

XMS             dd      ?       ; Адрес функции управления драйвером

err_code        db      ?       ; Код последней ошибки

MemMoveStruct   struc

Length         dd     ?       ; 32-битовое число пересылаемых байтов

SourceHandle   dw     ?       ; дескриптор блока источника

SourceOffset   dd     ?       ; 32-битовое смещение в источнике

DestHandle     dw     ?       ; дескриптор блока назначения

DestOffset     dd     ?       ; 32-битовое смещение в блоке назначения

MemMoveStruct   ends

mem_str         MemMoveStruct   ?

.CODE

; Инициализация himem.sys. Возвращает версию драйвера.

XMM_InitDriver  proc C

; Проверка наличия драйвера himem.sys

mov     ax, 4300h

int     2Fh

cmp     al, 80h

jne     not_avail

; Получение адреса функции управления драйвером

mov     ax, 4310h

int     2Fh

mov     word ptr [XMS], bx

mov     word ptr [XMS+2], es

; Получение версии драйвера

mov     ah, 00h

call    [XMS]

mov     ver, ax

ret

not_avail:

mov   ver, 0

ret

XMM_InitDriver  endp

; Выделить блок расширенной памяти размером size

; Передается размер блока в Кб и указатель на word (для дескриптора)

XMM_AllocMem    proc C size: word, handle: near ptr word

mov     ah, 09h

mov     dx, size

call    XMM_Functions

mov     bx, handle

mov     [bx], dx

ret

XMM_AllocMem    endp

; Освободить блок расширеннной памяти

XMM_FreeMem     proc C handle: word

mov     ah, 0ah

mov     dx, handle

call    XMM_Functions

ret

XMM_FreeMem     endp

; Получить размер наибольшего свободного блока XMA

XMM_GetMaxFree  proc C

mov     ah, 08h

call    XMM_Functions

ret

XMM_GetMaxFree  endp

; Включить линию A20 локально

XMM_EnableA20   proc C

mov     ah, 05h

call    XMM_Functions

ret

XMM_EnableA20   endp

; Выключить линию A20 локально

XMM_DisableA20  proc C

mov     ah, 06h

call    XMM_Functions

ret

XMM_DisableA20  endp

; Переместить блок из стандартной памяти в расширенную

XMM_MoveToXMA   proc C uses si, \

addr: near ptr, handle: word, offs: dword, len: dword

mov     [mem_str.SourceHandle], 0

mov     ax, addr

mov     word ptr [mem_str.SourceOffset], ax

mov     ax, ds

mov     word ptr [mem_str.SourceOffset+2], ax

mov     ax, handle

mov     [mem_str.DestHandle], ax

mov     eax, offs

mov     [mem_str.DestOffset], eax

mov     eax, len

mov     [mem_str.Length], eax

mov     si, offset mem_str

mov     ah, 0bh

call    XMM_Functions

ret

XMM_MoveToXMA   endp

; Переместить блок из расширенной памяти в стандартную

XMM_MoveToCMA   proc C uses si, \

addr: near ptr, handle: word, offs: dword, len: dword

mov     [mem_str.DestHandle], 0

mov     ax, addr

mov     word ptr [mem_str.DestOffset], ax

mov     ax, ds

mov     word ptr [mem_str.DestOffset+2], ax

mov     ax, handle

mov     [mem_str.SourceHandle], ax

mov     eax, offs

mov     [mem_str.SourceOffset], eax

mov     eax, len

mov     [mem_str.Length], eax

mov     si, offset mem_str

mov     ah, 0bh

call    XMM_Functions

ret

XMM_MoveToCMA   endp

; Получить общее количество свободной памяти XMA

XMM_GetTotalFree proc C

mov    ah, 08h

call   XMM_Functions

mov    ax, dx

ret

XMM_GetTotalFree endp

; Вызов функций драйвера

XMM_Functions   proc

cmp     ver, 0                  ; Драйвер не инициализирован

je      err1

call    [XMS]

cmp     ax, 0                   ; Проверка на ошибку

jne     q1

test    bl, 10000000b

jne     q1

err1:

mov     ax, 0

q1:

mov     err_code, bl

ret

XMM_Functions   endp

end