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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.