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

• Драйверы и резидентные программы, использующие область НМА, не должны держать линию А20 постоянно включенной, т. к. это может привести к неправильной работе программ, не рассчитанных на наличие и доступностьэтой области.

• Векторы прерываний не должны указывать в область НМА. Эторезультат предыдущего ограничения.

4. Примеры использования драйвера HIMEM.SYS.

Данная программа копирует флоппи диск через расширенную память. Эта программа написана на Ассемблере:

.286

.MODEL TINY

JUMPS

S SEGMENT STACK

db 128 dup(?)

S ENDS

DATA SEGMENT

buffer db 32770 dup(0)

number_drive db 1

sectors dw 0

numb_s dw 0           ; номер копируемого сектора

handle dw 0

LengthBlock dd 32768

SourceHandle dw 0

SourceOffset dd 0

DestHandle dw 0

DestOffset dd 0

HMMEntryPt dd 0

all db "Всего : 0000 секторов",13,'$'

mess db 10,13,"Вставте следующий диск и нажмите любую клавишу",10,13,'$'

mess1 db "Ошибка при работе с линией A20 (82h) !",10,13,'$'

mess2 db "Вся расширенная память уже распределена!!!",10,13,'$'

mess3 db "Больше нет свободных блоков EMB.",10,13,'$'

mess4 db "Ошибка : Нет диска в дисководе.",10,13,'$'

mess5 db "Ошибка : Диск защищен от записи или нет диска в дисководе.",10,13,'$'

mess6 db "Копирование c дискеты",10,13,'$'

mess6_1 db "Запись на дискету",10,13,'$'

mess8 db "Драйвер himem.sys отсутствует",10,13,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:S

start:

mov bx,DATA

mov ds,bx

mov ah,09h

mov dx,offset mess7

int 21h

; считывание корневого сектора дискеты

mov al,number_drive

mov cx,1

mov dx,0

mov bx,offset buffer

int 25h

pop ax

jnb ok1

mov bl,01h

jmp Error

ok1: mov ax,word ptr [bx][13h]

mov sectors,ax

; проверка наличия himem.sys

mov ax,4300h

int 2fh

mov bl,0eeh

cmp al,80h

jne Error

mov ax,4310h

int 2Fh

mov word ptr [HMMEntryPt][0],bx ; получение адреса программы управления XMS

mov word ptr [HMMEntryPt][2],es

mov ah,05h                      ; локальное открывание линии A20

call HMMEntryPt

or ax,ax

jz Error

mov ah,09h                      ; запрос блока памяти

mov dx,1500d

call HMMEntryPt

or ax,ax

jz Error

mov handle,dx

; первоначальное заполнение таблицы для копирования

mov bx,offset buffer

mov word ptr SourceOffset[0],bx

mov word ptr SourceOffset[2],ds

mov bx,handle

mov DestHandle,bx

mov word ptr DestOffset[0],0

mov word ptr DestOffset[2],0

mov ah,09h

mov dx,offset mess6

int 21h

mov cx,45          ; кол-во секторов на диске

mov si,offset LengthBlock

next_sector:

; считывание группы секторов

mov al,number_drive

mov dx,numb_s

push cx

mov cx,64d

mov bx,offset buffer

int 25h

pop cx

pop cx

add numb_s,64d

; копирование блока памяти в EMB

mov ah,0Bh                         ;ф-ия 0B - копирование блока

call HMMEntryPt                ;вызов драйвера

or ax,ax                       ;проверка на ошибку

jz Error                       ;если ошибка то переход на метку Error

call OutDec              ;вызов процедуры OutDec

add word ptr DestOffset[0],32768d    ;увеличение текущего смещения в EMB

adc word ptr Destoffset[2],0   ;прибавляем 32кб в первое слово

;и 0 - во второе

loop next_sector               ;продолжение цикла

mov ah,09h                     ;вывод на экран сообщения

mov dx,offset mess             ;"Вставьте следующий диск ..."

int 21h                       

mov ah,08h                       ; ожидание нажатия клавиши

int 21h

; первоначальное заполнение таблицы для копирования

mov numb_s,0

mov DestHandle,0

mov bx,offset buffer

mov word ptr DestOffset[0],bx

mov word ptr DestOffset[2],ds

mov bx,handle

mov SourceHandle,bx

mov word ptr SourceOffset[0],0

mov word ptr SourceOffset[2],0

mov cx,45                            ; кол-во секторов на диске

mov ah,09h

mov dx,offset mess6_1

int 21h

mov si,offset LengthBlock

next_copy:

; копирование блока из EMB в память

mov ah,0Bh

call HMMEntryPt

or ax,ax

jz Error