ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



КАК ПОЛУЧИТЬ АДРЕС БУФЕРА ДИСКА ( ФУНКЦИЯ 2FH )
     

     Вызов:           АН = 2FH

     Возвращает:      ES:BX - указатель на Буфер обмена
                              с диском

     Комментарий:
     Функция  возвращает сегментный адрес DTA в ES, а смещение
в BX.

     Макроопределение:

     get-dta macro
              mov     ah,2FH
              int      21H
              endm

     Пример:
     Следующая  программа  выводит  на  экран  адрес  текущего
Буфера обмена с диском , по форме - сегмент:смещение.

     message  db      "DTA -                ",0DH,0AH,"$"
     sixteen  db      10H
     temp     db      2 dup (?)
     ;
     begin:   get-dta                  ; Наша функция
              mov     word ptr temp,es ; Для доступа к каждому
                                       ; байту
                                       ; Описание CONVERT
                                       ; дается в конце главы
              convert temp[1],sixteen,message[07H]
              convert temp,sixteen,message[09H]
              convert bh,sixteen,message[0CH]
              convert bl,sixteen,message[0EH]
              display message          ; См. функцию 09Н




     ПОЛУЧИТЬ НОМЕР ВЕРСИИ MS-DOS ( ФУНКЦИЯ 30Н )

     Вызов:           АН = 30Н

     Возвращает:      AL - номер основной версии
                      АН - номер модификации
                      ВН - серийный номер OEM
                      BL:CX - 24-битовый (серийный)
                              номер пользователя

     Комментарий:
     Функция  30Н  возвращает  номер  версии MS-DOS. Например,
MS-DOS 3.0 при вызове этой функции возвращает 3 в AL, и 0 в АН.
     Если AL возвращает ноль, то номер версии MS-DOS меньше 2.0.

                             - 78 -



     Макроопределение:

     get-version macro
              mov     ah,30H
              int     21H
              endm

     Пример:
     Следующая программа выводит на экран номер версии MS-DOS,
если он равен или выше 1.28.

     message  db      "MS-DOS Версия    . ",0DH,0AH,"$"
     ten      db      0AH      ; Для CONVERT
     ;
     begin:   get-version      ; Наша функция
              cmp     al,0     ; 1.28 или выше?
              jng     return   ; Нет, возврат
              convert al,ten,message[0FH] ; Описание CONVERT
              convert ah,ten,message[12H] ; дано в конце главы
              display message  ; См. функцию 09Н



     СОХРАНИТЬ ПРОГРАММУ ( ФУНКЦИЯ 31Н )

     Вызов:           АН = 31Н
                      AL - код выхода
                      DX - размер памяти в параграфах

     Возвращает:      --

     Комментарий:
     Функция  31Н  сохраняет  программу  в  памяти  после   ее
окончания.  Вы можете использовать эту функцию для внедрения в
систему своих программ  обработки  прерываний.  В  отличие  от
Прерывания 27Н ( Закончить, но оставить в памяти), эта функция
позволяет  сохранять программы, размеры которых превышают 64К,
и не требует загрузки в CS сегментного адреса PSP. Пользуйтесь
функцией 31Н, если ваша программа не требует  совместимости  с
версиями системы до 2.0.
     DX   должен   содержать   количество  параграфов  памяти,
требуемое программой ( один параграф = 16 байт).  AL  содержит
код выхода.
     Будте  осторожны  при  пользовании  этой  функцией с .exe
программами. DX должен содержать весь об'ем  памяти программы,
а не только кодового сегмента. Типичная ошибка состоит в том,
что  обычно  забывают  о  100Н-байтовом  префиксе  программы и
загружают в DL значение, не учитывающее этот префикс.
     Используя функцию 4DH  (Получить  код  возврата  дочерней
программы),  вызвавшая  программа может получить код выхода из
AL. ( Вы можете протестировать этот код пользуясь командой  IF
с ERRORLEVEL.)

     Макроопределение:

     keep-process macro return-code,last-byte
              mov     al,return-code
              mov     dx,offset last-byte
              mov     cl,4

                             - 79 -


              shr     dx,cl
              inc     dx
              mov     ah,31H
              int     21H
              endm

     Пример:
     Так как большинство применений этой функции связано  с
введением  в  систему  специфичных для каждой машины процедур,
пример не приводится.





     ПРОВЕРКА ПО CONTROL+C ( ФУНКЦИЯ 33Н )


     Вызов:           АН = 33Н
                      AL - 0 = получить состояние флага
                               проверки на CONTROL+C
                           1 = изменить этот флаг
                           5 = получить дисковод, используемый
                               для загрузки DOS
                      DL (если AL = 1) - 0 = сбросить
                                         1 = установить

     Возвращает:      DL (если AL = 0) - 0 = сброшен
                                         1 = установлен
                      DL (если AL = 5) - номер дисковода
                                         ( 1=А, 2=В и т.д.)
                      AL -  FFH = ошибка (AL не 0, не 1 и не 5)

     Комментарий:
     Функция      33Н      получает      состояние      флага
включения/выключения    проверки    на     CONTROL+C     (или
CONTROL+BREAK)   или   устанавливает  его.  Кроме  того,  она
устанавливает,  какой  дисковод  используется  для   загрузки
операционной системы. AL содержит код выполняемой операции:

     Код      Значение
     __________________________________________________________
     0        Текущее состояние флага  в DL
     1        Изменить состояние флага, как указано в DL
     5        Дисковод, используемый для загрузки системы - в DL
     __________________________________________________________

     Обычно MS-DOS проверяет  на  ввод  CONTROL+C  только  при
выполнении  определенных  функций  (01Н  -  0СН). Если же флаг
установлен, то проверка осуществляется  при  выполнении  любых
функций.
     __________________________________________________________
     Примечание
               Программы,  использующие  функции  06Н  (Прямой
               ввод/вывод с/на консоли) и 07Н (Прямой  ввод  с
               консоли )  для  чтения  CONTROL+C  в  качестве
               данных, должны убедится, что флаг сброшен.
     __________________________________________________________

                             - 80 -



     Макроопределение:

     ctrl-c-ck macro action,state
               mov    al,action
               mov    dl,state
               mov    ah,33H
               int    21h
               endm

     Пример:
     Следующая программа сообщает,  включена  ли  проверка  на
CONTROL+C или нет.

     message  db      "Проверка на CONTROL+C ","$"
     on       db      "включена","$",0DH,0AH,"$"
     off      db      "выключена","$",0DH,0AH,"$"
     ;
     begin:   display message           ; См. функцию 09Н
              ctrl-c-ck 0               ; Наша функция
              cmp     dl,0              ; Выключена?
              jg      ck-on             ; Нет
              display off               ; См. функцию 09Н
              jmp     return            ; Конец
     ck-on:   display on                ; См. функцию 09Н

     Чтобы узнать дисковод, используемый для загрузки DOS,
     можно добавить следующий код:

              mov     ah,33H
              mov     al,05H
              int     21H
              jc      error
          ; в DL возвращен номер дисковода (1=А)



     ПОЛУЧИТЬ ВЕКТОР ПРЕРЫВАНИЯ ( ФУНКЦИЯ 35Н )

     Вызов:           АН = 35Н
                      AL - номер прерывания

     Возвращает:      ES:BX - указатель на процедуру
                              прерывания

     Комментарий:
     Функция получает адрес  указанного  в  AL  прерывания  из
таблицы векторов прерываний.
     BX  возвращает смещение (сегментный адрес в ES) процедуры
обработки прерывания.
     Во  избежание  проблем  совместимости  ваших  программ  с
различными  версиями  системы,  никогда  не  считывайте вектор
прерывания напрямую из памяти  и  никогда  не  вставляйте  его
напрямую  в  таблицу  векторов.  Пользуйтесь  функцией  25Н
(Установить вектор прерывания)  для  установки  вектора,  если
ваша программа не нуждается в совместимости с версиями системы
до 2.0.

                             - 81 -



     Макроопределение:

     get-vector macro interrupt
              mov     al,interrupt
              mov     ah,35H
              int     21H
              endm

     Пример:
     Следующая  программа  выводит на экран сегментный адрес и
смещение (  CS:IP  )  процедуры  обслуживания  прерывания  25Н
(Читать диск абсолютно).

     message  db      "Прерывание 25Н - CS:0000 IP:0000"
              db      0DH,0AH,"$"
     vec-seq  db      2 dup (?)
     vec-off  db      2 dup (?)
     ;
     begin:   push    es       ; Сохранить ES
              get-vector 25H   ; Наша функция
              mov     ax,es    ; Сегментный адрес в АХ
              pop     es       ; Восстановить ES
              convert ax,16,message[20] ; См. конец главы
              convert bx,16,message[28] ; См. конец главы
              display message  ; См. функцию 09Н



     ПОЛУЧИТЬ СВОБОДНОЕ ПРОСТРАНСТВО ДИСКА ( ФУНКЦИЯ 36Н )

     Вызов:           АН = 36Н
                      DL - дисковод (0=текущий, 1=А и т.д.)

     Возвращает:      АХ - 0FFFFH, если несуществующий
                           дисковод, иначе количество
                           секторов в кластере
                      BX - имеющиеся кластеры
                      СХ - количество байт в секторе
                      DX - количество кластеров на диске

     Комментарий:
     Функция 36Н возвращает количество кластеров, имеющихся на
диске  из  указанного  дисковода и информацию, необходимую для
подсчета количества имеющихся байт на диске.
     Если указан несуществующий  дисковод,  то  AX  возвращает
0FFFFH.
     Эта  функция  заменила функции 1ВН и 1СН в ранних версиях
системы.

     Макроопределение:

     get-disk-space macro drive
              mov     dl,drive
              mov     ah,36H
              int     21H
              endm

                             - 82 -



     Пример:
Следующая програма выводит на экран информацию о диске В.

     message  db "      кластеров на диске В.",0DH,0AH
              db "      имеющихся кластеров.",0DH,0AH
              db "      секторов в кластере.",0DH,0AH
              db "      байт в секторе.",0DH,0AH,"$"
     ;
     begin:   get-disk-space 2          ; Наша функция
              convert ax,10,message[55] ; См. конец главы
              convert bx,10,message[28]
              convert cx,10,message[83]
              convert dx,10,message
              display message           ; См. функцию 09Н



     ПОЛУЧИТЬ ИНФОРМАЦИЮ ПО СТРАНЕ ( ФУНКЦИЯ 38 )

     Вызов:           АН = 38Н
                      AL - 00H = текущая страна
                           1-0FEH = код страны
                           0FFH - BX содержит код страны
                      ВХ (если AL = 0FFH) - код страны
                                            от 255 и выше
                      DS:DX - указатель на 32-байтовый
                              участок памяти

     Возвращает:      Флаг переноса установлен:
                               АХ - 2 = несуществующий
                                        код страны
                               DS:DX - указатель на
                                       32-байтовый участок
                                       памяти
                      Флаг переноса сброшен:
                               ВХ - код страны

     Комментарий:
     Функция  возвращает информацию по стране, которую система
использует для контроля клавиатуры и  дисплея.  Для  получения
информации,  в DX нужно загрузить смещение (сегментный адрес в
DS) 32-байтового участка памяти, куда возвращается информация.
     ( Для установки данных по стране, см. следующую функцию с
тем же номером - 38Н ).
     AL содержит код страны:

     AL       Значение
     __________________________________________________________
     00Н      Возвращает данные по стране, установленной в
              качестве текущей
     1-0FEH   Возвращает данные по стране, идентифицированной
              этим кодом
     0FFH     Возвращает данные по стране, код которой в ВХ
     __________________________________________________________
     Код страны должен быть загружен в ВХ, если он  равен или
     больше 255. Код страны обычно совпадает с международным
     телефонным кодом.

     Информация по стране возвращается в следующем формате:

                             - 83 -



     Смещение
     16   10  Название поля             Длина в байтах
     __________________________________________________________
     00Н   0  Формат даты               2 (слово)
     02Н   2  Символ валюты             5 (строка ASCIZ)
     07Н   7  Разделитель тысяч         2 (строка ASCIZ)
     09H   9  Десятичный разделитель    2 (строка ASCIZ)
     0ВН  11  Разделитель даты          2 (строка ASCIZ)
     0DH  13  Разделитель времени       2 (строка ASCIZ)
     0FH  15  Поле битов                1
     10Н  16  Денежные позиции          1
     11Н  17  Формат времени            1
     12Н  18  Адрес процедуры регист-   4 (двойное слово)
              рового преобразования
     16Н  22  Разделитель данных        2 (строка ASCIZ)
     18Н  24  Зарезервировано           10
     __________________________________________________________

     Формат даты:

     0 = США     (месяц/день/год)
     1 = Европа  (день/месяц/год)
     2 = Япония  (год/месяц/день)

     Поле битов:

     Бит      Значение
     __________________________________________________________
     0    0   Денежный символ предшествует числовому значению
          1   Символ следует за числом
     1    0   Нет пробелов между символом и числом
          1   Один пробел между символом и числом
     __________________________________________________________
     Все остальные биты не определены.

     Формат времени:

     0 = 12-часовой
     1 = 24-часовой

     Денежные позиции:

     Определяет  количество  позиций  после десятичной точки в
обозначениях денежных сумм.

     Адрес процедуры регистрового преобразования:

     Указывает  сегментный  адрес  и  смещение  FAR  (дальней)
процедуры,  которая  преобразует символы из диапазона 80Н-0FFH
из нижнего регистра в  верхний.  Преобразуемый  символ  должен
быть  в  AL.  Если  есть  такой  код  для этого символа, то он
возвращается в AL. Если кода по  верхнему  регистру  нет,  или
значение  AL  меньше  80Н, то значение AL остается неизменным.
Процедура изменяет только регистр флагов и AL.
     В случае ошибки, устанавливается флаг  переноса  (CF),  а
код ошибки возвращается в АХ:

                             - 84 -



     Код  Значение
     __________________________________________________________

     2    Несуществующий код страны (не предусмотрен в таблице).

     Макроопределение:

     get-macro macro country,buffer
              local   gc-01
              mov     dx,offset buffer
              mov     ax,country
              cmp     ax,0FFH
              jl      gc-01
              mov     al,0FFH
              mov     bx,country
     gc-01:   mov     ah,38H
              int     21h
              endm

     Пример:
     Следующая  программа  выводит  на  экран  время  и дату в
соответствующем формате указанной страны  ,  число  999.999  и
99/100 в качестве денежной суммы с правильными разделителями и
символом.

     time     db      "  :  :  ",5 dup (20),"$"
     date     db      "  /  /  ",5 dup (20),"$"
     number   db      "999?999?99",0DH,0AH,"$"
     data-area db     32 dup (?)
     ;
     begin:   get-country 0,data-area   ; Наша функция
              get-time                  ; См. функцию 2СН
              byte-to-dec ch,time       ; См. конец главы
              byte-to-dec cl,time[03H]  ;
              byte-to-dec dh,time[06H]  ;
              get-date                  ; См. функцию 2АН
              sub     cx,1900           ; Нужны 2 последние
                                        ; цифры
              byte-to-dec cl,date[06H]  ; См. конец главы
              cmp     word ptr data-area,0 ; Проверить код
                                        ; страны
              jne     not-usa           ; Это не США
              byte-to-dec dh,date       ; См. конец главы
              byte-to-dec dl,date[03H]  ; См. конец главы
              jmp     all-done          ; Отобразить данные
     not-usa: byte-to-dec dl,date       ; См. конец главы
              byte-to-dec dh,date[03H]  ; См. конец главы
     all-done: mov    al,data-area[07H] ; Разделитель тысяч
              mov     number[03H],al    ; поместить в NUMBER
              mov     al,data-area[09H] ; Десятичный разделитель
              mov     number[07H],al
              display time              ; См. функцию 09Н
              display date              ; См. функцию 09Н
              display-char date-area[02H] ; См. функцию 02Н
              display number            ; См. функцию 09Н



                             - 85 -



     УСТАНОВИТЬ ДАННЫЕ  ПО СТРАНЕ ( ФУНКЦИЯ 38Н )

     Вызов:           АН = 38Н
                      DX = -1 (0FFFFH)
                      AL - код страны (меньше 255) или
                           0FFH, если код находится в ВХ
                      ВХ - (если AL = -1)
                           код страны ( 255 и выше )

     Возвращает:      Флаг переноса установлен:
                               АХ - 2 = несуществующий код
                      Флаг переноса сброшен:
                               нет ошибок

     Комментарий:
     Функция  38Н  устанавливает  код  страны,  который MS-DOS
использует для контроля клавиатуры и дисплея,  или  возвращает
данные по стране (см. предыдущую функцию с тем же номером). DX
должен содержать 0FFFFH. В AL должен быть загружен код страны,
меньший  255  или число 255 для индикации того, что код страны
загружен в ВХ.
     Код страны обычно совпадает  с  международным  телефооным
кодом.  Описание  данных  по  стране  дается  в  комментарии к
предыдущей функции.
     В случае ошибки,  устанавливается  флаг  переноса,  а  AX
возвращает код ошибки:

     Код  Значение
     __________________________________________________________
     2    Несуществующий код страны (не предусмотрен в таблице)

     Макроопределение:

     set-country macro country
              local   sc-01
              mov     dx,0FFFFH
              mov     ax,country
              cmp     ax,0FFH
              jl      sc-01
              mov     bx,country
              mov     al,0FFH
     sc-01:   mov     ah,38H
              int     21H
              endm

     Пример:
     Следующая программа устанавливает код Великобритании (44).

     uk       equ     44
     ;
     begin:   set-country uk  ; Наша функция
              jc      error   ; Метка не показана



                             - 86 -



     СОЗДАТЬ КАТАЛОГ ( ФУНКЦИЯ 39Н )

     Вызов:           АН = 39Н
                      DS:DX - указатель на маршрут

     Возвращает:      Флаг переноса установлен:
                               АХ - 2 = файл не найден
                                    3 = маршрут не найден
                                    5 = нет доступа
                      Флаг переноса сброшен:
                               нет ошибок

     Комментарий:
     Функция 39Н создает новый подкаталог. DX должен содержать
смещение  (сегментный  адрес  в  DS) строки ASCIZ, указывающей
маршрут нового подкаталога.
     В случае  ошибки  устанавливается  флаг  переноса,  а  АХ
возвращает код ошибки:

     Код      Значение
     __________________________________________________________
     2        Файл не найден
     3        Маршрут не найден
     5        Нет места в родительском каталоге, файл с
              таким же  именем  уже  существует в текущем
              каталоге или маршрут указывает на устойство
     __________________________________________________________

     Макроопределение:

     make-dir macro path
              mov     dx,offset path
              mov     ah,39H
              int     21H
              endm

     Пример:
     Следующая программа добавляет подкаталог с именем new-dir
в корневой каталог на диске В  и  делает  его  текущим.  После
этого  она  опять  делает текущим предыдущий каталог и удаляет
new-dir. На каждом этапе программы на экран выводится  текущий
каталог для подтверждения изменений.

     old-path db      "b:
     new-path db      "b:\new-dir",0
     buffer   db      "b:
     ;
     begin:   get-dir 2,old-path[03H]   ; См. функцию 47Н
              jc      error-get         ; Метка не показана
              display-asciz old-path    ; См. конец главы
              make-dir new-path         ; Наша функция
              jc      error-make        ; Метка не показана
              change-dir new-path       ; См. функцию 3ВН
              jc      error-change      ; Метка не показана
              get-dir 2,buffer[03H]     ; См. функцию 47Н
              jc      error-get         ; Метка не показана
              display-asciz buffer      ; См. конец главы
              change-dir old-path       ; См. функцию 3ВН
              jc      error-change      ; Метка не показана

                             - 87 -


              rem-dir new-path          ; См. функцию 3АН
              jc      error-rem         ; Метка не показана
              get-dir 2,buffer[03H]     ; См. функцию 47Н
              jc      error-get         ; Метка не показана
              display-asciz buffer      ; См. конец главы



     УДАЛИТЬ КАТАЛОГ ( ФУНКЦИЯ 3АН )

     Вызов:           АН = 3АН
                      DS:DX - указатель на маршрут

     Возвращает:      Флаг переноса установлен:
                               АХ - 2 = файл не найден
                                    3 = маршрут не найден
                                    5 = нет доступа
                                   16 = текущий каталог
                      Флаг переноса сброшен:
                               нет ошибок

     Комментарий:
     Функция  3АН  удаляет  подкаталог.  DX  должен  содержать
смещение (сегментный адрес в  DS)  строки  ASCIZ,  указывающей
маршрут подкаталога, который вы хотите удалить.
     Подкаталог  не  должен  содержать  файлов.  Вы  не можете
уничтожить текущий каталог. В случае  ошибки,  устанавливается
флаг переноса, а АХ возвращает код ошибки:

     Код      Значение
     __________________________________________________________
     2        Файл не найден
     3        Маршрут не найден
     5        Каталог не пустой, маршрут не указывает на
              каталог, маршрут указывает на корневой каталог
              или он не разрешен
     16       Маршрут указывает на текущий каталог
     __________________________________________________________

     Макроопределение:

     rem-dir macro path
              mov     dx,offset path
              mov     ah,3AH
              int     21H
              endm

     Пример:
     Следующая программа добавляет подкаталог с именем new-dir
в корневой каталог на диске В  и  делает  его  текущим.  После
этого  она  опять  делает текущим предыдущий каталог и удаляет
new-dir. На каждом этапе программы на экран выводится  текущий
каталог для подтверждения изменений.

     old-path db      "b:
     new-path db      "b:\new-dir",0
     buffer   db      "b:
     ;
     begin:   get-dir 2,old-path[03H]   ; См. функцию 47Н
              jc      error-get         ; Метка не показана

                             - 88 -


              display-asciz old-path    ; См. конец главы
              make-dir new-path         ; См. функцию 39Н
              jc      error-make        ; Метка не показана
              change-dir new-path       ; См. функцию 3ВН
              jc      error-change      ; Метка не показана
              get-dir 2,buffer[03H]     ; См. функцию 47Н
              jc      error-get         ; Метка не показана
              display-asciz buffer      ; См. конец главы
              change-dir old-path       ; См. функцию 3ВН
              jc      error-change      ; Метка не показана
              rem-dir new-path          ; Наша функция
              jc      error-rem         ; Метка не показана
              get-dir 2,buffer[03H]     ; См. функцию 47Н
              jc      error-get         ; Метка не показана
              display-asciz buffer      ; См. конец главы



     СМЕНИТЬ ТЕКУЩИЙ КАТАЛОГ ( ФУНКЦИЯ 3ВН )

     Вызов:           АН = 3ВН
                      DS:DX - указатель на маршрут

     Возвращает:      Флаг переноса установлен:
                               АХ - 2 = файл не найден
                                    3 = маршрут не найден
                      Флаг переноса сброшен:
                               нет ошибок

     Комментарий:
     Функция  3ВН  меняет текущий каталог. DX должен содержать
смещение (сегментный адрес в  DS)  строки  ASCIZ,  указывающей
маршрут нового текущуго каталога.
     Длина строки ограничена 64 символами.
     Если  любой  компонент  маршрута  отсутствует, маршрут не
меняется. В случае ошибки, устанавливается флаг переноса, а АХ
возвращает код ошибки:

     Код      Значение
     __________________________________________________________
     2        Файл не найден
     3        Маршрут либо не существует, либо указывает на
              файл, а не на каталог
     __________________________________________________________

     Макроопределение:

     change-dir macro path
              mov     dx,offset path
              mov     ah,3BH
              int     21H
              endm

     Пример:
     Следующая программа добавляет подкаталог с именем new-dir
в корневой каталог на диске В  и  делает  его  текущим.  После
этого  она  опять  делает текущим предыдущий каталог и удаляет
new-dir. На каждом этапе программы на экран выводится  текущий
каталог для подтверждения изменений.


                             - 89 -


     old-path db      "b:
     new-path db      "b:\new-dir",0
     buffer   db      "b:
     ;
     begin:   get-dir 2,old-path[03H]   ; См. функцию 47Н
              jc      error-get         ; Метка не показана
              display-asciz old-path    ; См. конец главы
              make-dir new-path         ; См. функцию 39Н
              jc      error-make        ; Метка не показана
              change-dir new-path       ; Наша функция
              jc      error-change      ; Метка не показана
              get-dir 2,buffer[03H]     ; См. функцию 47Н
              jc      error-get         ; Метка не показана
              display-asciz buffer      ; См. конец главы
              change-dir old-path       ; См. функцию 3ВН
              jc      error-change      ; Метка не показана
              rem-dir new-path          ; См. функцию 3АН
              jc      error-rem         ; Метка не показана
              get-dir 2,buffer[03H]     ; См. функцию 47Н
              jc      error-get         ; Метка не показана
              display-asciz buffer      ; См. конец главы



     СОЗДАТЬ ХЕНДЛ ( ФУНКЦИЯ 3СН )

     Вызов:           АН = 3СН
                      DS:DX - указатель на маршрут
                      СХ - атрибут файла

     Возвращает:      Флаг переноса установлен:
                               АХ - 2 = файл не найден
                                    3 = маршрут не найден
                                    4 = слишком много
                                        открытых файлов
                                    5 = нет доступа
                      Флаг переноса сброшен:
                               АХ - хендл

     Комментарий:
     Функция  3СН  создает  файл  и  назначает   его   первому
доступному  хендлу.  DX  должен содержать смещение (сегментный
адрес в DS) строки ASCIZ ,  указывающей  маршрут  создаваемого
файла.  СХ  должен  содержать  атрибут,  присваиваемый файлу
(подробнее, см. начало этой главы " Атрибуты файла ").
     Если указанный файл не  существует,  то  функция  создает
его. Если такой файл уже существует, то его длина сбрасывается
в  ноль.  После этого файлу присваивается атрибут, указанный в
СХ, и он открывается для чтения/записи.  АХ  возвращает  хендл
файла.
     В случае ошибки, устанавливается флаг переноса (CF), а АХ
возвращает код ошибки:

     Код  Значение
     __________________________________________________________
     2    Файл не найден
     3    Несуществующий маршрут
     4    Слишком много открытых файлов (нет больше хендлов)
     5    Каталог заполнен, каталог с таким же именем уже
          существует или уже существует файл с таким же именем,
          имеющий более ограничивающие атрибуты

                             - 90 -



     Макроопределение:

     create-handle macro path,attrib
              mov     dx,offset path
              mov     cx,attrib
              mov     ah,3CH
              int     21H
              endm

     Пример:
     Следующая  программа  создает  файл  dir.tmp,  содержащий
имена и расширения всех файлов из текущего каталога диска В.

     srch-file        db       "b:*.*",0
     tmp-file         db       "b:dir.tmp",0
     buffer           db       43 dup (?)
     handle           dw       ?
     ;
     begin:   set-dta buffer            ; См. функцию 1АН
              find-first-file srch-file,16H ; См. функцию 4ЕН
              cmp     ax,12H            ; Каталог пуст?
              je      all-done          ; Да, возврат
              create-handle tmp-file,0  ; Наша функция
              jc      error             ; Метка не показана
              mov     handle,ax         ; Сохранить хендл
     write-it: write-handle handle,buffer[1EH],12 ;Функция 40Н
              find-next-file            ; См. функцию 4FH
              cmp     ax,12H            ; Другой вход?
              je      all-done          ; Нет, возврат
              jmp     write-it          ; Да, сделать запись
     all-done: close-handle handle      ; См. функцию 3ЕН


     ОТКРЫТЬ ХЕНДЛ ( ФУНКЦИЯ 3DH )

     Вызов:           АН = 3DH
                      AL - код доступа (см. текст)
                      DS:DX - указатель на маршрут

     Возвращает:      Флаг переноса установлен:
                               АХ - 2 = файл не найден
                                    3 = маршрут не найден
                                    4 = слишком много
                                        открытых файлов
                                    5 = нет доступа
                                   12 = не разрешенный доступ
                      Флаг переноса сброшен:
                               нет ошибок

     Комментарий:
     Функция 3DH открывает  любые  файлы,  включая  скрытые  и
истемные,   для  ввда/вывода.  DX  должен  содержать  смещение
(сегментный адрес в  DS)  строки  ASCIZ,  указывающей  маршрут
открываемого файла. В AL загружается код доступа (см. ниже).
     В  случае  успешного  завершения  операции, АХ возвращает
хендл файла. MS-DOS устанавливает указатель  чтение/запись  на
первый байт файла.

                             - 91 -



     Управление доступом к файлу:

     Значение регистра AL состоит из трех полей, определяющих,
открывается  ли  файл для чтения, записи или для чтение/запись
(код  доступа);  какой  доступ  к  этому  файлу  имеют  другие
программы  (режим  разделения); и унаследован ли файл дочерней
программой (бит наследования).

     Биты     Название поля
     _________________________
     0-3      Код доступа
     4-6      Режим разделения
     7        Бит наследования
     _________________________

     Бит наследования:
     Если этот бит сброшен, то  файл  унаследован  программой,
созданной   с  помощью  функции  4ВН  (Загрузить  и  выполнить
программу или наложить).

     Режим разделения:
     Биты этого поля могут иметь следующие значения:

     Таблица 1.21
     Значения битов поля Режим разделения
     __________________________________________________________
     Биты  Режим               Описание
     __________________________________________________________
     000   Совместимость       На данной машине, с этим режимом
                               любая программа МОЖЕТ открыть
                               файл, любое количество раз.
                               Не может, если файл был открыт с
                               любым другим режимом разделения.

      001  Запрещение          Не может, если файл был открыт в
           чтения/записи       режиме совместимости или с дос-
                               тупом по чтению или записи.
                               ( Даже  если   файл  был  открыт
                               текущей программой).

     010   Запрещение          Не может, если файл был открыт в
           записи              режиме совместимости или с дос-
                               тупом по записи любой другой
                               программой.

     011   Запрещение          Не может, если файл был открыт в
           чтения              режиме совместимости или с дос-
                               тупом по  чтению  любой  другой
                               программой.

     100   Разрешение          Не может, если файл был открыт в
           чтения/записи       режиме   совместимости   любой
                               другой программой.
     __________________________________________________________


     Код доступа:
     Биты  этого  поля  определяют  использование открываемого
файла и могут иметь следующие значения:

                             - 92 -



     Таблица 1.22
     Значения битов поля Код доступа
     __________________________________________________________
     Биты  Доступ     Описание
     __________________________________________________________
     0000  Чтение     Невозможен, если файл был открыт в режиме
                      запрещения   чтения  или   запрещения
                      чтения/записи.
     0001  Запись     Невозможен, если файл был открыт в режиме
                      запрещения   записи  или   запрещения
                      чтения/записи.
     0010  Чтение/    Невозможен, если файл был открыт в режи-
           Запись     мах запрещения чтения, запрещения записи
                      или запрещения чтения/записи.
     __________________________________________________________

     В случае ошибки,  устанавливается  флаг  переноса,  а  АХ
возвращает код ошибки:

     Код      Значение
     __________________________________________________________
     2        Указанный файл не разрешен или не существует
     3        Указанный маршрут не разрешен или не существует
     4        Нет больше свободных хендлов в текущей программе
              или заполнены внутренние системные таблицы.
     5        Программа пыталась открыть каталог или метку
              тома или была попытка открыть для записи файл,
              который создан только для чтения.
     12       Код доступа (биты 0-3 в AL) не равен 0,1 или 2.
     __________________________________________________________

     В  случае  возникновения  ошибки  в режиме разделения при
вызове этой функции, MS-DOS вызывает прерывание  24Н  с  кодом
ошибки   2   (Дисковод  не  готов).  Последующая  функция  59Н
(Получить расширенный  код   ошибки)  возвращает  расширенный
код   ошибки,  уточняющий  вид  нарушения  соглашений  системы
разделения файлов.
     При  открытии  файла,  важно  сообщать  системе  о   всех
операциях,  проводимых  другими  программами над  этим  файлом
(режим разделения). Режим по умолчанию  (режим  совместимости)
запрещает  доступ  к  файлу другим программам до тех пор, пока
они не откроют этот файл в режиме совместимости.

     Макроопределение:

     open-handle macro path,access
              mov     dx,offset path
              mov     al,access
              mov     ah,3DH
              int     21h
              endm

     Пример:
     Следующая программа выводит файл textfile.asc с диска В.

     file     db      "b:textfile.asc",0
     buffer   db      ?
     handle   dw      ?
     ;

                             - 93 -


     begin:   open-handle file,0        ; Наша функция
              mov     handle,ax         ; Сохранить хендл
     read-char: read-handle handle,buffer,1 ; Читать 1 символ
              jc      error-read        ; Метка не показана
              cmp     ax,0              ; Конец файла?
              je      return            ; Да, возврат
              print-char buffer         ; См. функцию 05Н
              jmp     read-char         ; Читать следующий



     ЗАКРЫТЬ ХЕНДЛ ( ФУНКЦИЯ 3ЕН )

     Вызов:           АН = 3ЕН
                      ВХ - хендл

     Возвращае:       CF установлен:
                               АХ = 6 - несуществующий
                                        хендл
                      CF сброшен:
                               нет ошибок

     Комментарий:
     Функция 3ЕН закрывает файл, открытый  с  помощью  функции
3DH  (Открыть  хендл)  или  3СН  (Создать  хендл).  ВХ  должен
содержать хендл открытого файла, который вы хотите закрыть.
     Если нет ошибок, то MS-DOS закрывает файл  и  сносит  все
внутренние  буферы.  В  случае  ошибки,  устанавливается  флаг
переноса, а АХ возвращает код ошибки:

     Код      Значение
     __________________________________________________________
     6        Хендл не открыт или не существует

     Макроопределение:

     close-handle macro handle
              mov     bx,handle
              mov     ah,3EH
              int     21H
              endm

     Пример:
     Следующая  программа  создает  файл  dir.tmp,  содержащий
имена и расширения всех файлов из текущего каталога диска В.

     srch-file        db       "b:*.*",0
     tmp-file         db       "b:dir.tmp",0
     buffer           db       43 dup (?)
     handle           dw       ?
     ;
     begin:   set-dta buffer            ; См. функцию 1АН
              find-first-file srch-file,16H ; См. функцию 4ЕН
              cmp     ax,12H            ; Каталог пуст?
              je      all-done          ; Да, возврат
              create-handle tmp-file,0  ; См. функцию 3СН
              jc      error             ; Метка не показана
              mov     handle,ax         ; Сохранить хендл
     write-it: write-handle handle,buffer[1EH],12 ;Функция 40Н
              find-next-file            ; См. функцию 4FH

                             - 94 -


              cmp     ax,12H            ; Другой вход?
              je      all-done          ; Нет, возврат
              jmp     write-it          ; Да, сделать запись
     all-done: close-handle handle      ; Наша функция
              jc      error-close       ; Метка не показана



     ЧИТАТЬ ХЕНДЛ ( ФУНКЦИЯ 3FH )

     Вызов:           AH = 3FH
                      BX - хендл
                      СХ - количество байт для чтения
                      DS:DX - указатель на буфер

     Возвращает:      CF установлен:
                               АХ - 5 = нет доступа
                                    6 = несуществующий хендл
                      CF сброшен:
                               АХ - прочитано байт

     Комментарий:
     Функция   3FH   читает   из   файла    или    устройства,
ассоциированного  с  указанным  хендлом.  ВХ  должен содержать
хендл. СХ -  количество  байт,  которое  нужно  прочитать.  DX
содержит смещение (сегментный адрес в DS) буфера.
     Количество    байт,   указанное   в   СХ,   необязательно
переносится в буфер.  Если  вы  используете  эту  функцию  для
чтения  с  клавиатуры,  например, то данные читаются только до
первого ВК.
     Если вы используете функцию для  чтения  со  стандартного
ввода, то вы можете переадресовать его.
     В  случае  ошибки устанавливается CF, а АХ возвращает код
ошибки:
     Код      Значение
     __________________________________________________________
     5        Хендл не открыт для чтения
     6        Хендл не открыт или хендл не существует

     Макроопределение:

     read-handle macro handle,buffer,bytes
              mov     bx,handle
              mov     dx,offset buffer
              mov     cx,bytes
              mov     ah,3FH
              int     21H
              endm

     Пример:
     Следующая программа выводит на экран файл textfile.asc  с
диска В.

     filename db      "B:\textfile.asc",0
     buffer   db      129 dup (?)
     handle   db      ?
     ;
     begin:   open-handle filename,0    ; См. функцию 3DH
              jc      error-open        ; Метка не показана
              mov     handle,ax         ; Сохранить хендл

                             - 95 -


     read-file: read-handle buffer,file-handle,128 ;
              jc      error-open        ; Метка не показана
              cmp     ax,0              ; Конец файла?
              je      return            ; Да, возврат
              mov     bx,ax             ; Кол-во прочитанных
                                        ; байт
              mov     buffer[bx],"$"    ; Закончить строку
              display buffer            ; См. функцию 09Н
              jmp     read-file         ; Читать дальше



     ЗАПИСАТЬ В ХЕНДЛ ( ФУНКЦИЯ 40Н )

     Вызов:           АН = 40Н
                      ВХ - хендл
                      СХ - количество байт для записи
                      DS:DX - указатель на буфер

     Возвращает:      CF установлен:
                               АХ - 5 = нет доступа
                                    6 = несуществующий
                                        хендл
                      CF сброшен:
                               АХ - количество записанных
                                    байт

     Комментарий:
     Функция   40Н   записывает   в   файл   или   устройство,
ассоциированное  с  указанным  хендлом.  ВХ  должен  содержать
хендл.  В  СХ нужно загрузить количество записываемых байт. DX
содержит смещение (сегментный адрес в DS) этих данных.
     Если сбросить СХ в ноль, то файл будет сужен  до  текущей
позиции  указателя  файла. MS-DOS не выполнит операцию записи,
если хендл открыт только для чтения.
     Если  нет ошибки, то АХ возвращает количество записанных
байт. Не забывайте проверять  содержимое  АХ  после  операции
записи.  Если  оно  меньше  величины,  загруженной  в  СХ, то
произошла ошибка, даже если сброшен флаг  переноса.  Если  АХ
содержит  0,  а  адресатом  был файл на диске, то это признак
переполнения  диска.  Если  с   помощью   этой   функции   вы
записываете на стандартный вывод, то вы можете переадресовать
его.
     В случае ошибки , устанавливается CF, а АХ возвращает код
ошибки:

     Код Значение
     _____________________________________
     5   Хендл не открыт для записи
     6   хендл не открыт или не существует

     Макроопределение:

     write-handle macro handle,buffer,bytes
              mov     bx,handle
              mov     dx,offset buffer
              mov     cx,bytes
              mov     ah,40H
              int     21H
              endm

                             - 96 -



     Пример:
     Следующая  программа  создает  файл  dir.tmp,  содержащий
имена и расширения всех файлов из текущего каталога диска В.

     srch-file        db       "b:*.*",0
     tmp-file         db       "b:dir.tmp",0
     buffer           db       43 dup (?)
     handle           dw       ?
     ;
     begin:   set-dta buffer            ; См. функцию 1АН
              find-first-file srch-file,16H ; См. функцию 4ЕН
              cmp     ax,12H            ; Каталог пуст?
              je      all-done          ; Да, возврат
              create-handle tmp-file,0  ; См. функцию 3СН
              jc      error             ; Метка не показана
              mov     handle,ax         ; Сохранить хендл
     write-it: write-handle handle,buffer[1EH],12 ;Наша функция
              find-next-file            ; См. функцию 4FH
              cmp     ax,12H            ; Другой вход?
              je      all-done          ; Нет, возврат
              jmp     write-it          ; Да, сделать запись
     all-done: close-handle handle      ; См. функцию 3ЕН
              jc      error-close       ; Метка не показана




     УДАЛИТЬ КАТАЛОГОВЫЙ ВХОД [РАЗЪЕДЕНИТЬ] ( ФУНКЦИЯ 41Н )

     Вызов:           АН = 41Н
                      DS:DX - указатель на маршрут

     Возвращает:      CF установлен:
                               АХ - 2 = файл не найден
                                    3 = маршрут не найден
                                    5 = нет доступа
                      CF сброшен:
                               нет ошибок

     Комментарий:
     Функция 41Н стирает файл путем удаления его  каталогового
входа.  DX  должен  содержать смещение (сегментный адрес в DS)
строки ASCIZ, указывающей  маршрут  удаляемого  файла.  Нельзя
использовать символы заполнители.
     Если  файл  существует  и  не  только для чтения, функция
удаляет его. В противном  случае,  устанавливается  CF,  а  АХ
возвращает код ошибки:

     Код      Значение
     ______________________________________________
     2        Файл не существует или указан каталог
     3        Несуществующий маршрут
     5        файл только для чтения

     Для  удаления  файла  с атрибутом Только для чтения, надо
сбросить  его  атрибут  в   ноль   с   помощью   функции   43Н
(Установить/получить атрибуты файла).

                             - 97 -



     Макроопределение:

     delete-entry macro path
              mov     dx,offset path
              mov     ah,41H
              int     21H
              endm

     Пример:
     Следующая   программа   удаляет  все  файлы  с  диска  В,
последняя запись в которые делалась до 31 Декабря 1982 года.

     year     dw      1982
     month    db      12
     day      db      31
     files    db      0
     message  db      "Удаленных файлов нет.".0DH,0AH,"$"

     path     db      "b;*.*",0
     buffer   db      43 dup (?)
     ;
     begin:   set-dta buffer       ; См. функцию 1АН
              select-disk "B"      ; См. функцию 0ЕН
              find-first-file path,0 ; См. функцию 11Н
              jnc     compare      ; Получили один
              jmp     all-done     ; Нет, нет файлов на диске
     compare: convert-date buffer[-1] ; См. конец главы
              cmp     cx,year      ; Следующие строки сравни-
              jg      next         ; вают дату в каталоговом
              cmp     dl,month     ; входе с указанной датой
              jg      next
              cmp     dh,day
              jge     next
              delete-entry buffer[1EH] ; Наша функция
              jc      error-delete ; Метка не показана
              inc     files        ; Увеличить счетчик
                                   ; файлов
     next:    find-next-file       ; См. функцию 12Н
              jnc     compare      ; Да, проверить дату
              cmp     files,0      ; Есть удаленные файлы?
              je      all-done     ; Нет, сообщить об этом
              convert files,10,message ; См. конец главы
     all-done: display message     ; См. функцию 09Н
              select-disk "A"      ; См. функцию 0ЕН


     СДВИНУТЬ УКАЗАТЕЛЬ ФАЙЛА ( ФУНКЦИЯ 42Н )

     Вызов:           АН = 42Н
                      AL - метод сдвига
                      ВХ - хендл
                      СХ:DX - расстояние в байтах (смещение)

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующий
                                        код сдвига
                                    6 = несуществующий
                                        хендл
                      CF сброшен:
                               DX:AX - новое положение
                                       указателя

                             - 98 -



     Комментарий:
     Функция  42Н  перемещает  указатель  чтения/записи файла,
ассоциированного с указанным в ВХ хендлом. В СХ:DX находится
( в СХ старшее слово) 32-битовое смещение. AL содержит
код сдвига указателя:

     Код   Указатель перемещается на
     ___________________________________
     0     начало файла плюс смещение
     1     текущую позицию плюс смещение
     2     конец файла плюс смещение

     DX:AX возвращают новое положение указателя ( в DX старшее
слово).  Определить  длину  файла можно путем загрузки в CX:DX
нуля, а в AL - 2. В этом случае DX:AX вернет  смещение  байта,
следующего за последним байтом файла (размер файла в байтах).
     В  случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:

     Код      Значение
     ________________________
     1        AL не 0,1 или2
     6        хендл не открыт

     Макроопределение:

     move-ptr macro handle,high,low,method
              mov     bx,handle
              mov     cx,high
              mov     dx,low
              mov     al,method
              mov     ah,42H
              int     21h
              endm

      Пример:
     Следующая   программа   запрашивает   букву,  преобразует
введенную букву в ее порядковый номер в алфавите, затем читает
и выводит на экран соответствующую запись из  файла  с  именем
alphabet.dat,  находящегося  на  диске  В.  Файл  содержит  26
записей, каждая длиной 28 байт.

     file     db  "b:alphabet.dat",0
     buffer   db  28 dup (?),"$"
     prompt   db  "Введите букву: $"
     crlf     db  0DH,0AH,"$"
     handle   db  ?
     record-length db ?
     ;
     begin:   open-handle file,0 ; См. функцию 3DH
              jc      error-open ; Метка не показана
              mov     handle,ax  ; Сохранить хендл
     get-char: display prompt    ; См. функцию 09Н
              read-kbd-and-echo  ; См. функцию 01Н
              sub     al,41H     ; Преобразовать код ASCII
                                 ; в номер записи
              mul     byte ptr record-length ; Получить
                                             ; смещение
              move-ptr handle,0,ax,0 ; Наша функция

                             - 99 -


              jc      error-move ; Метка не показана
              read-handle handle,buffer,record-length
              jc      error-read ; Метка не показана
              cmp     ax,0       ; Конец файла?
              je      return     ; Да, возврат
              display crlf       ; См. функцию 09Н
              display buffer     ; См. функцию 09Н
              display crlf       ; См. функцию 09Н
              jmp     get-char   ; Получить следующий символ



     ПОЛУЧИТЬ/УСТАНОВИТЬ АТРИБУТЫ ФАЙЛА ( ФУНКЦИЯ 43Н )

     Вызов:           АН = 43Н
                      AL - 0 = получить атрибуты
                           1 = установить атрибуты
                      СХ (если AL = 1) - атрибуты
                      DS:DX - указатель на маршрут

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующая
                                        функция
                                    2 = файл не найден
                                    3 = маршрут не найден
                                    5 = нет доступа
                      CF (флаг переноса) сброшен:
                               СХ - байт атрибута (если AL=0)

     Комментарий:
     Функция  43Н возвращает или устанавливает атрибуты файла.
DX должен содержать смещение (сегментный адрес  в  DS)  строки
ASCIZ, указывающей маршрут файла. Содержимое AL определяет вид
операции (0=получить, 1=установить).
     Если AL равно 0, то байт атрибута возвращается в СХ. Если
AL равно 1, то  байт  атрибута   устанавливается  из  СХ
(см. Раздел 1.5.5 "Атрибуты файла").
     Вы   не   можете  изменить  бит метка тома (08Н) или  бит
Подкаталога (10Н) в байте атрибута спомощью этой функции.
     В случае ошибки, устанавливается CF, а АХ возвращает  код
ошибки:

     Код      Значение
     __________________________________________________________
     1        AL не 0 и не 1
     2        Нет такого файла
     3        Несуществующий маршрут
     5        Неизменяемый атрибут (Подкаталог или метка тома)

     Макроопределение:

     change-attr macro path,action,attrib
              mov     dx,offset path
              mov     al,action
              mov     cx,attrib
              mov     ah,43H
              int     21H
              endm

                             - 100 -



     Пример:
     Следующая    програама   выводит   на   экран   атрибуты,
присвоенные файлу report.asm , находящемся в текущем  каталоге
на диске В.

     header   db      15 dup (20H),"Читать",0DH,0AH
              db      "Имя файла    только     Скрытый      "
              db      "Системный   Том      Подкаталог  Архив"
              db      0DH,0AH,0DH,0AH,"$"
     path     db      "b:report.asm",3 dup (0),"$"
     attribute dw     ?
     blanks   db      9 dup (20H),"$"
     ;
     begin:   change-attr path,0,0      ; Наша функция
              jc      error-mode        ; Метка не показана
              mov     attribute,cx      ; Сохранить байт
                                        ; атрибута
              display header            ; См. функцию 09Н
              display path              ; См. функцию 09Н
              mov     cx,6              ; Проверить 6 бит
              mov     bx,1              ; Начать с бита 0
     chk-bit: test    attribute,bx      ; Бит установлен?
              jz      no-attr           ; Нет
              display-char "X"          ; См. функцию 02Н
              jmp short next-bit        ; С этим битом все
     no-attr: display-char 20H          ; См. функцию 02Н
     next-bit: display blanks           ; См. функцию 09Н
              shl     bx,1              ; Сместить к следую-
                                        ; щему биту
              loop    chk-bit           ; Проверить его



     УВВ ДАННЫЕ ( ФУНКЦИЯ 44Н, КОДЫ 0 и 1 )

     Вызов:           АН = 44Н
                      AL - 0 = получить данные устройства
                           1 = установить данные устройства
                      ВХ - хендл
                      DX - данные устройства (см. текст)

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующая
                                        функция
                                    6 = несуществующий
                                        хендл
                      CF сброшен:
                               DX - данные устройства

     Комментарий:
     Функция   44Н  (коды  0  и  1)  либо  устанавливает, либо
возвращает данные, которые MS-DOS  использует  для  управления
устройством. Если  AL  равно  1  (установить),  то  DH  должен
содержать 0.
     Данные устройства загружаются или возвращаются в DX. Если
бит  7  данных  равен  1,  то  хендл относится к устройству, а
остальные биты имеют следующие значения:

                             - 101 -



     Таблица 1.23
     Значения битов данных
     __________________________________________________________
     Бит   Значение
     __________________________________________________________
     0     1          Консоль ввода
     1     1          Консоль вывода
     2     1          Нулевое устройство
     3     1          Синхронное устройство
     4     1          Зарезервировано
     5     1          Нет проверки на управляющие символы
           0          Есть проверка на управляющие символы
     6     0          Конец файла на вводе
     8-10             Зарезервировано
     11    1          Устройство различает открыть/закрыть
     12               Зарезервировано
     13    1          Устройство поддерживает вывод, если
                      оно не занято
     14    1          Устройство может обрабатывать управляющие
                      последовательности, посылаемые функцией
                      44Н (коды 2 и 3). Этот бит может быть
                      только прочитан, но не установлен
     15    1          Зарезервировано
     __________________________________________________________
     Вы должны сбросить зарезервированные биты в ноль.

     Управляющие символы, подразумеваемые в описании бита 5  -
CONTROL+C,  CONTROL+P,  CONTROL+S и CONTROL+Z. Для чтения этих
символов, не в качестве управляющих, вам нужно установить  бит
5  и  использовать  либо  функцию 33Н (Проверка по CONTROL+C),
либо команду MS-DOS BREAK для отмены проверки.
     Если бит 7 в DX равен 0, то хендл относится  к  файлу,  а
остальные биты имеют следующие значения:

     Бит    Значение
     __________________________________________________________
     0-5              Номер дисковода (0=А, 1=В и т.д.)
     6      0         Файл был записан
     8-15             Зарезервировано
     __________________________________________________________

     В  случае ошибки, CF устанавливается, а АХ возвращает код
ошибки:

     Код     Значение
     __________________________________________________________
     1       AL не 0 и не 1 или AL = 1, a DH не 0
     6       Хендл, указанный в ВХ, не открыт или не существует
     __________________________________________________________

     Макроопределение:

     ioctl-data macro code,handle
              mov     bx,handle
              mov     al,code
              mov     ah,44H
              int     21H
              endm


                             - 102 -


     Пример:
     Следующая   программа    получает    данные    устройства
стандартного вывода, устанавливает бит проверки на управляющие
символы (бит 5), а затем опять его сбрасывает.

     get      equ     0
     set      equ     1
     stdout   equ     1
     ;
     begin:   ioctl-data get,stdout     ; Наша функция
              jc      error             ; Метка не показана
              mov     dh,0              ; Сброс DH
              or      dh,20H            ; Установить бит 5
              ioctl-data set,stdout     ; Наша функция
              jc      error             ; Метка не показана
     ; Теперь управляющие символы рассматриваются как обычные
     ; данные  ( " Сырой режим " )
              ioctl-data get,stdout     ; Наша функция
              jc      error             ; Метка не показана
              mov     dh,0              ; Сброс DH
              and     dl,0DFH           ; Сброс бита 5
              ioctl-data set,stdout     ; Наша функция
     ; Теперь эти символы интерпретируются как управляющие
     ; ( " Приготовленный режим" )


     УВВ  СИМВОЛ  ( ФУНКЦИЯ 44Н, КОДЫ 2 и 3 )

     Вызов:           АН = 44Н
                      AL - 2 = передать управляющие данные
                           3 = получить управляющие данные
                      ВХ - хендл
                      СХ - количество байт для чтения/записи
                      DS:DX - указатель на буфер

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующая функция
                                    6 = несуществующий хендл
                      CF сброшен:
                               АХ - количество переданных
                                    байт

     Комментарий:
     Функция   44Н   (коды   2  и  3)  передает  или  получает
управляющие данные в/из устройство(а) символьной обработки. AL
должен содержать 2 для передачи и 3 для получения данных. В ВХ
должен быть загружен хендл  символьного  устройства,  например
принтера  или  последовательного порта. СХ содержит количество
байт для чтения или записи, а DS:DX адрес буфера данных.
     АХ  возвращает  количество   переданных   байт.   Драйвер
устройства должен поддерживать интерфейс IOCtl (УВВ).
     В  случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:

     Код      Значение
     __________________________________________________________
     1        AL не 2 и не 3 или устройство не может выполнить
              указанную функцию
     6        Указанный в ВХ хендл не открыт или не существует
     __________________________________________________________

                             - 103 -



     Макроопределение:

     ioctl-char macro code,handle,buffer
              mov     bx,handle
              mov     dx,offset buffer
              mov     al,code
              mov     ah,44H
              int     21H
              endm

     Пример:
     Типичного примера нет,  так  как  обработка  управляющих
данных   зависит   от  используемого  устройства  и,  конечно,
драйвера устройства.



     УВВ  БЛОК  ( ФУНКЦИЯ 44Н, КОДЫ 4 и 5 )

     Вызов:           АН = 44Н
                      AL - 4 = передать управляющие данные
                           5 = получить управляющие данные
                      BL - номер дисковода
                           ( 0=текущий, 1=А и т.д.)
                      СХ - количество байт для чтения/записи
                      DS:DX - указатель на буфер

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующая функция
                                    5 = несуществующий
                                        дисковод
                      CF сброшен:
                               АХ - количество переданных
                                    байт

     Комментарий:
     Функция  44Н  (коды  4  и  5)   передает   или   получает
управляющие  данные  с/на  устройства  блоковой  обработки. AL
должен содержать 4 для передачи данных и 5 для получения. В ВХ
необходимо загрузить номер дисковода (0=текущий, 1=А и  т.д.),
а  в  СХ количество байт для чтения или записи. DS:DX содержат
сегментный адрес и смещение буфера данных.
     АХ  возвращает  количество   переданных   байт.   Драйвер
устройства  должен  поддерживать  интерфейс IOCtl (УВВ). Чтобы
определить, так ли это, используйте функцию 44Н с кодом 0  для
получения данных устройства, а затем проверьте бит 14. Если он
установлен, то драйвер поддерживает УВВ.
     В случае ошибки, устанавливается CF (флаг переноса), а АХ
возвращает код ошибки:

     Код      Значение
     __________________________________________________________
     1        AL не 4 и не 5, или устройство не может выполнить
              указанную функцию
     5        Указанный в BL номер дисковода не существует
     __________________________________________________________

                             - 104 -



     Макроопределение:

     io-status macro code,drive,buffer
              mov     bl,drive
              mov     dx,offset buffer
              mov     al,code
              mov     ah,44H
              int     21H
              endm

     Пример:
     Типичного  примера  нет,  так  как  обработка управляющих
данных  зависит  от  используемого  устройства   и,   конечно,
драйвера устройства.



     УВВ  СТАТУС  ( ФУНКЦИЯ 44Н, КОДЫ 6 и 7 )

     Вызов:           АН = 44Н
                      AL - 6 = готовность на ввод
                           7 = готовность на вывод
                      ВХ - хендл

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующая функция
                                    5 = нет доступа
                                    6 = несуществующий хендл
                                   13 = неразрешенные данные
                      CF сброшен:
                               AL - 00H = не готов
                                   0FFH = готов

     Комментарий:
     Функция  44Н  (коды 6 и 7) проверяет готовность файла или
устройства, ассоциированного с указанным  хендлом.  AL  должен
содержать 6, если проверяется готовность для ввода или 7, если
проверяется готовность для вывода. ВХ указывает хендл.
     AL возвращает состояние :

     Значение  Для устройства            Для  файла
                               вводимого            выводимого
     __________________________________________________________
     00Н       Не готово       Указатель  в         Готов
                               конце  файла

     0FFH      Готово          Готов                Готов
     __________________________________________________________
     Выводимый файл всегда готов, даже если диск переполнен.

     В  случае ошибки, CF устанавливается, а АХ возвращает код
ошибки:

                             - 105 -



     Код      Значение
     __________________________________________________________
     1        AL не 6 и не 7
     5        Нет доступа
     6        Содержащийся в ВХ номер не является разрешенным,
              открытым хендлом
     13       Неразрешенные данные
     __________________________________________________________

     Макроопределение:

     ioctl-status macro code,handle
              mov     bx,handle
              mov     al,code
              mov     ah,44H
              int     21H
              endm

     Пример:
     Следующая программа выводит на экран  результат  проверки
файла, ассоциированного с хендлом 6, на готовность к вводу.

     stdout   equ     1
     ;
     message  db      "Файл "
     ready    db      "готов."
     at-eof   db      "не готов."
     crlf     db      0DH,0AH
     ;
     begin:   write-handle stdout,message,5 ; На экран message
              jc      write-error           ; Метка не показана
              ioctl-status 6                ; Наша функция
              jc      ioctl-error           ; Метка не показана
              cmp     al,0                  ; Проверить статус
              jne     not-eof               ; Файл готов?
              write-handle stdout,at-eof,9  ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              jmp     all-done              ; Конец
     not-eof: write-handle stdout,ready,6   ; См. функцию 40Н
     all-done: write-handle stdout,crlf,2   ; См. функцию 40Н
              jc      write-error           ; Метка не показана



     УВВ  СМЕННЫЙ  ( ФУНКЦИЯ 44Н, КОД 08Н )

     Вызов:           АН = 44Н
                      AL = 08H
                      BL - номер дисковода
                           ( 0=текущий, 1=А и т.д.)

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующая функция
                                   15 = несуществующий
                                        дисковод
                      CF сброшен:
                               АХ - 0 = сменный
                                    1 = не сменяемый

                             - 106 -


     Комментарий:

     Функция  44Н  (код  08Н)  проверяет, содержит ли дисковод
сменяемый диск  или  же  это  фиксированный  диск.  ВХ  должен
содержать   номер   дисковода.  АХ  возвращает  0,  если  диск
сменяемый, в противном случае единицу.
     Эта функция позволяет  программам  определить,  нужно  ли
выдавать на экран сообщение о смене диска.
     В  случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:

     Код      Значение
     __________________________________________________________
     1        Устройство не поддерживает эту функцию
     15       Содержимое BL не является разрешенным номером
              дисковода
     __________________________________________________________

     Макроопределение:

     ioctl-change macro drive
              mov     bl,drive
              mov     al,08H
              mov     ah,44H
              int     21H
              endm

     Пример:
     Следующая  программа  проверяет,  содержит   ли   текущий
дисковод  сменный  диск.  Если нет, то программа продолжается;
если да, то программа запрашивает пользователя сменить диск  в
текущем дисководе.

     stdout   equ     1
     ;
     message  db      "Смените пожалуйста диск"
     drives   db      "ABCD"
     crlf     db      0DH,0AH
     ;
     begin:   ioctl-change 0            ; Наша функция
              jc      ioctl-error       ; Метка не показана
              cmp     ax,0              ; Текущий диск
                                        ; сменяемый?
              jne     continue          ; Нет, продолжить
              write-handle stdout,message,23 ; См. функцию 40Н
              jc      write-error       ; Метка не показана
              current-disk              ; См. функцию 19Н
              xor     bx,bx             ; Сброс индекса
              mov     bl,al             ; Получить текущий
                                        ; дисковод
              display-char drives[bx]   ; См. функцию 02Н
              write-handle stdout,crlf,2 ; См. функцию 40Н
              jc      write-error       ; Метка не показана
     continue:
     ;        Продолжение программы



                             - 107 -



     УВВ.  ОПРЕДЕЛИТЬ НАЗНАЧЕНИЕ ИМЕНИ ( ФУНКЦИЯ 44Н, КОД 09Н )


     Вызов:           АН = 44Н
                      AL = 09H
                      BL - номер дисковода
                           ( 0=текущий, 1=А и т.д.)

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующий код
                                        функции
                                   15 = несуществующий номер
                                        дисковода
                      CF сброшен:
                               DX - биты атрибута устройства

     Комментарий:
     Функция   44Н  (код  09Н)  проверяет,  относится  ли  имя
дисковода  к  дисководу  на  рабочей  станции  сети  Microsoft
Networks  (  локальный  ),  или  оно  относится  к  дисководу,
переназначеному серверу ( удаленный  ).  BL  должен  содержать
номер дисковода.
     Если   блоковое   устройство  -  локальный  дисковод,  DX
возвращает слово атрибута из  заголовка  устройства.  Если  им
является  удаленный дисковод, то устанавливается только бит 12
(1000Н), а остальные - нули (зарезервированы).
     Прикладным программам не следует тестировать бит 12, т.к.
им  не  надо  различать  локальные  и  удаленные   устройства.
Программы  должны  быть  написаны  так,  чтобы  обеспечивалась
независимость от положения устройств.
     В случае ошибки, устанавливается CF (флаг переноса), а АХ
возвращает код ошибки:

     Код      Значение
     __________________________________________________________
     1        Для этого системного вызова должна быть загружена
              процедура разделения файла
     15       Содержимое BL не является разрешенным номером
              дисковода
     __________________________________________________________


     Макроопределение:

     ioctl-rblock macro drive
              mov     bl,drive
              mov     al,09H
              mov     ah,44H
              int     21H
              endm

     Пример:
     Следующая программа проверяет,  является  ли  дисковод  В
локальным или удаленным, и выводит соответствующее сообщение.


     stdout   equ     1
     ;
     message  db      "Дисковод В: - "

                             - 108 -


     loc      db      "локальный."
     rem      db      "удаленный."
     crlf     db      0DH,0AH
     ;
     begin:   write-handle stdout,message,14 ; На экран message
              jc      write-error       ; Метка не показана
              ioctl-rblock 2            ; Наша функция
              jc      ioctl-error       ; Бит 12 установлен?
              test    dx,1000H          ; Да, это удаленный
              jnz     not-loc           ; Метка не показана
                                        ; См. функцию 40Н
              write-handle stdout,loc,10 ;
              jc      write-error       ; Метка не показана
              jmp     done              ; Конец
     not-loc: write-handle stdout,rem,10 ; См. функцию 40Н
              jc      write-error       ; Метка не показана
     done:    write-handle stdout,crlf,2 ; См. функцию 40Н
              jc      write-error       ; Метка не показана




     УВВ.  ОПРЕДЕЛИТЬ НАЗНАЧЕНИЕ ХЕНДЛА ( ФУНКЦИЯ 44Н, КОД 0АН )

     Вызов:           АН = 44Н
                      AL = 0AH
                      BX - хендл

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующий код
                                        функции
                                    6 = несуществующий хендл
                      CF сброшен:
                               DX - поле битов УВВ

     Комментарий:
     Функция  44Н  (код  0АН)  проверяет, относится ли хендл к
файлу или к  устройству  на  рабочей  станции  сети  Microsoft
Network   (локальный),   или   же   он   переназначен  серверу
(удаленный). ВХ должен содержать  хендл.  DX  возвращает  поле
битов  УВВ  -  если  бит  15  установлен, то хендл относится к
удаленному файлу или устройству.
     Прикладным программам не следует тестировать бит 15, т.к.
им  не  надо  различать  локальные  и  удаленные   устройства.
Программы  должны  быть  написаны  так,  чтобы  обеспечивалась
независимость от положения устройств.
     В случае ошибки, устанавливается CF (флаг переноса), а АХ
возвращает код ошибки:

     Код      Значение
     __________________________________________________________
     1        Для этого системного вызова должна быть загружена
              сеть MN
     6        Хендл в ВХ не является разрешенным, открытым
              хендлом
     __________________________________________________________

                             - 109 -



     Макроопределение:

     ioctl-rhandle macro handle
              mov     bl,handle
              mov     al,0AH
              mov     ah,44H
              int     21H
              endm

     Пример:
     Следующая программа проверяет,  является  ли  хендл   5
локальным или удаленным, и выводит соответствующее сообщение.


     stdout   equ     1
     ;
     message  db      "Хендл  5  -  "
     loc      db      "локальный."
     rem      db      "удаленный."
     crlf     db      0DH,0AH
     ;
     begin:   write-handle stdout,message,12 ; На экран message
              jc      write-error       ; Метка не показана
              ioctl-rhandle 5           ; Наша функция
              jc      ioctl-error       ; Метка не показана
              test    dx,8000H          ; Бит 15 установлен?
              jnz     not-loc           ; Да, это удаленный
              write-handle stdout,loc,10 ; См. функцию 40Н
              jc      write-error       ; Метка не показана
              jmp     done              ;  Конец
     not-loc: write-handle stdout,rem,10 ; См. функцию 40Н
              jc      write-error       ; Метка не показана
     done:    write-handle stdout,crlf,2 ; См. функцию 40Н
              jc      write-error       ; Метка не показана




     УВВ  ПОВТОРЕНИЕ  ( ФУНКЦИЯ  44Н, КОД 0ВН )

     Вызов:           АН = 44Н
                      AL = 0BH
                      DX - количество повторов
                      СХ - время ожидания

     Возвращает:      CF установлен:
                               АХ = 1 - несуществующий код
                                        функции
                      CF сброшен:
                               нет ошибок

     Комментарий:
     Функция 44Н (код 0ВН) определяет количество раз,  которое
система  повторяет операцию с диском при сбое, из-за нарушения
соглашений  системы  разделения  файлов.   DX   содержит   это
количество. СХ определяет длину пауз между попытками.
     MS-DOS   повторяет  дисковую  операцию  три  раза,  если,
конечно, вы не укажите с помощью этой функции другое число. По
завершении попыток система вызывает прерывание 24Н (Прерывание

                             - 110 -


по  критической  ошибке)  программы,  запрашивающей   дисковую
операцию.
     Длина  пауз, загружаемая в СХ, зависит от конкретной ЭВМ,
так как это число определяет, какое число  раз  MS-DOS  должна
выполнить  пустой  цикл.  Время  выполнения  цикла  зависит от
процессора  и  его  тактовой  частоты.  Вы  можете  определить
зависимость  пауз  от  СХ  на  своей  машине  с помощью DEBUG.
Установите   количество   попыток  равное  1 , а   затем  про-
хронометрируйте различные значения СХ.
     В  случае ошибки, CF устанавливается, а АХ возвращает код
ошибки:

     Код      Значение
     __________________________________________________________
     1        Для этого системного вызова должна быть загружена
              процедура разделения  файла

     Макроопределение:

     ioctl-retry macro retries,wait
              mov     dx,retries
              mov     cx,wait
              mov     al,0BH
              mov     ah,44H
              int     21H
              endm

     Пример:
     Следующая  программа  устанавливает  количество   попыток
разделения равное 10, а время пауз - 1000.

     begin:   ioctl-retry 10,1000 ; Наша функция
              jc      error       ; Метка не показана




     ОБЩЕЕ  УВВ  (ДЛЯ ХЕНДЛОВ)  ( ФУНКЦИЯ 44Н, КОД 0СН )

     Вызов:           АН = 44Н
                      AL = 0CH
                      BX - хендл
                      СН - код категории устройства
                      CL - код подфункции
                      DS:DX - указатель на буфер данных

     Возвращает:      CF установлен:
                               АХ - 1 = неправильный код функции
                                    - = любая ошибка устройства
                      CF сброшен:
                               Нет ошибок

     Комментарий:
     Эта  функция  выбирает  и  загружает кодовую страницу для
устройства.  Кроме  того,  она  устанавливает  или  возвращает
счетчик  повторений вывода для принтеров, поддерживающих режим
"ВЫВОД ПОКА НЕ ЗАНЯТО".
     Видеофункции (type=display) поддерживаются,  только  если
был  загружен  ansy.sys.  Если  этот  файл не был загружен, то
команда MODE устанавливает режим видео напрямую.

                             - 111 -


     Функция  использует  базовую  систему  ввода/вывода   для
установки и возвращения состояния об'екта.
     Команда MODE устанавливает значения через этот интерфейс,
а утилиты DOS имеют доступ к информации через этот интерфейс.
     Код категории может иметь следующие значения:

     Код      Значение
     __________________________________________________________
     00       Неизвестное устройство
     01       Последовательный принтер
     03       Консоль (дисплей)
     05       Параллельный принтер
     __________________________________________________________

     Код подфункции может иметь следующие значения:

     Код      Значение
     __________________________________________________________
     45Н      Устанавливает число повторений для принтера
     4АН      Выбирает кодовую страницу
     4СН
     4DH
     5FH      Устанавливает устройство дисплей
     65Н      Возвращает число повторения для принтера
     6АН      Возвращает выбранную кодовую страницу
     6ВН
     7АН      Возвращает символ дисплея (длина, ширина и цвет
              экрана)
     __________________________________________________________
     Примечание
               DS:DX адресуют слово, содержащее новую величину
               для  общего количества  повторений  вывода перед
               продолжением работы, то  есть  количество  раз,
               которое драйвер будет ждать от устройства сигнал
               "готов"    перед   подтверждением   "устройство
               занято".
     __________________________________________________________

     Макроопределение:

     ioctl-handles macro handle,function,category,buffer
              mov     ch,05H
              mov     cl,function
              mov     dx,offset buffer
              mov     bx,handle
              mov     ah,44H
              mov     al,0CH
              int     21H
              endm

     Пример:
     Следующая программа возвращает характеристики устройства.

              mov     ax,440CH      ; Код функции
              mov     bx,handle     ; Хендл открытого устройства
              mov     ch,03H        ; Дисплей
              mov     cl,7FH        ; Получить
              lds     dx,buffer     ; Адрес буфера
              int     21H
              jc      error

                             - 112 -


              buffer  label byte    ; Буфер для возврата
              db      0             ; Перед вызовом устанав-
                                    ; ливается в ноль
              db      0             ; Зарезервирован для
                                    ; типа дисплей
              dw      7*2           ; Длина данных
              dw      flags         ; Управляющие флаги
                                    ; 0001Н=яркий
                                    ; Режим дисплея
                                    ; 1=текстовый
                                    ; 2=АРА
              db      0             ; Зарезервирован
              dw      colors        ; Количество цветов
                                    ; (монохромный=0)
              dw      width         ; Ширина в пикселях
              dw      length        ; Длина в пикселях
              dw      cols          ; Количество колонок
              dw      rows          ; Количество строк

     Для возврата информации по  кодовой  странице  и  вектора
DBCS (Набор двубайтных символов) добавьте следующее:

              mov     ax,440CH      ; Код функции
              mov     cx,036AH      ; Дисплей
              mov     bx,handle
              lds     dx,buffer     ; Сменить содержимое буфера
              int     21H
              jc      error
       buffer label   word
              dw      end-start     ; Длина
       start:
              dw      codepage      ; Кодовая страница
              db      s1,e1         ; Вектор DBCS
              db      0,0           ; Конец списка
     __________________________________________________________
     Примечание
               Некоторые драйверы возвращают только кодовую
               страницу,   поэтому  пользователь  этой  функции
               должен проверить поле длины, для уверенности, что
               информация по DBCS присутствует.   Драйверам
               display.sys  и  printer.sys  нет  необходимости
               поддерживать DBCS-информацию. Такая поддержка
               включена только азиатский вариант MS-DOS 4.0.
     __________________________________________________________





                             - 113 -



     ОБЩЕЕ  УВВ  (ДЛЯ УСТРОЙСТВ)  ( ФУНКЦИЯ 44Н, КОД 0DH )

     Вызов:           АН = 44Н
                      AL = 0DH
                      BL - номер дисковода (0=текущий, 1=А)
                      СН - код категории
                      CL - код подфункции
                      DS:DX - Указатель на блок параметров

     Возвращает:      CF установлен:
                               АХ - 1 = неправильный код функции
                                    2 = несуществующий дисковод
                                    - = любая ошибка устройства
                      CF сброшен:
                               Нет ошибок

     Комментарий:
     Код подфункции может принимать следующие значения:

     Код      Значение
     __________________________________________________________
     40       Установить параметры устройства
     41       Записать дорожку на логическое устройство
     42       Форматировать дорожку на логическом устройстве
     60       Получить параметры устройства
     61       Читать дорожку с логического устройства
     62       Проверить дорожку на логическом устройстве
     __________________________________________________________
     Примечание
               Перед  вызовом  всех  этих  функций  вы  должны
               установить параметры функцией CL=40.
     __________________________________________________________

     Вы должны придерживаться следующей процедуры при  чтении,
записи, форматировании или проверке:

     1.  Сохранить  параметры  используя  "Получить  параметры
         устройства".
     2.  Установить нужные параметры соответствующей функцией.
     3.  Выполнить операцию ввода/вывода.
     4.  Восстановить предыдущие параметры.

     Установить параметры устройства (CL=40H)
     ----------------------------------------
     При этой подфункции блок параметров имеет следующий формат:
    ________________________________
    і BYTE - специальные функции    і
    і BYTE - тип устройства         і
    і WORD - атрибуты устройства    і
    і WORD - количество цилиндров   і
    і BYTE - байт описатель диска   і
    і_______________________________і
    і БПБ устройства                і
    і_______________________________і
    і Разметка дорожек              і
    і_______________________________і

                             - 114 -



     Эти поля имеют следующие значения:

     а) специальные функции

     Бит  =   Значение
     __________________________________________________________
     0    0   Поле  БПБ содержит  новый  БПБ (по ум.) для этого
              устройства. Если предыдущая подфункция 40Н уста-
              новила этот бит в 1, то операция  Построить  БПБ
              возвращает действительный БПБ диска. В противном
              случае возвращается БПБ по умолчанию.
          1   Все последующие запросы на операцию Построить БПБ
              возвращают БПБ устройства.
     1    0   Читать все поля в блоке параметров.
          1   Игнорировать все поля блока параметров, за исклю-
              чением поля Разметка дорожки.
     2    0   Сектора на дорожке возможно неодинакового размера
              ( Вы не должны использовать это значение)
          1   Все  сектора  на  дорожке одинакового размера, с
              номерами от 1 до общего кол-ва секоров на дорож-
              ке. ( Вы всегда должны устанавливать этот бит ).
     3-7  0   Эти биты должны быть нулями.
     __________________________________________________________

     б) тип устройства

     Этот   байт    описывает    физическое    устройство    и
устанавливается  устройством. При установке он имеет следующее
значение:

     0 - 320/360 килобайт
     1 - 1,2 мегабайт
     2 - 720 килобайт
     3 - 8-дюймовый нормальной плотности
     4 - 8-дюймовый двойной плотности
     5 - Жесткий диск
     6 - Кассетный накопитель
     7 - 1.44 мегабайта

     в) атрибуты устройства

     Бит  =   Значение
     __________________________________________________________
     0    0   Диск сменяемый
          1   Диск несменяемый
     1    0   Состояние замка не анализируется
          1   Состояние замка анализируется
     2-7  0   Эти биты должны быть нулями
     __________________________________________________________

     г) количество цилиндров

     Это поле указывает максимальное количество  цилиндров  на
физическом устройстве. Это поле устанавливается устройством.

     д) описатель диска

     Этот байт указывает тип диска для данного дисковода.
     По умолчанию тип диска - диск высокой плотости, 1,2МГб.

                             - 115 -


     Для этого типа бит 0 имеет следующие значения:

     Бит  =   Значение
     __________________________________________________________
     0    0   Диск высокой плотности, 1,2 МГб.
          1   Диск двойной плотности, 320/360Кб.
     __________________________________________________________

     е) БПБ устройства (Блок параметров БСВВ)

     Если бит 0 поля "Спец. функции " сброшен, то в поле "БПБ
устройства" находится новый текущий БПБ для устройства.
     Если  этот  бит   установлен,   то   драйвер   устройства
возвращает БПБ для всех последующих запросов Построить БПБ.

     ж) разметка дорожки

     Это  поле  содержит  таблицу переменной длины для каждого
логического устройства и указывает разметку дорожки по секторам:

     WORD - Число секторов
     WORD - Номер сектора  (сектор номер 1)
     WORD - Размер сектора (сектор номер 1)
     WORD - Номер сектора  (сектор номер 2)
     WORD - Размер сектора (сектор номер 2)
                     .
                     .
                     .
     WORD - Номер сектора  (сектор номер n)
     WORD - Размер сектора (сектор номер n)

     Первое слово содержит общее количество  секторов.  Каждый
номер  должен  быть уникальным и варьироваться в пределах от 1
до значения поля 'Число секторов'.
     Если бит 2 в поле 'Специальные функции' установлен, то
размеры  всех секторов должны быть одинаковы.

     Получить параметры устройства (CL=60H)
     --------------------------------------

     Если  CL=60H, то блок параметров имеет тот же формат, что
и при CL=40H. Однако значения некоторых полей различаются:

     а) операция

     Бит  =   Значение
     __________________________________________________________
     0    0   Возвращает текущий БПБ для устройства.
          1   Возвращает БПБ, который бы вернула операция
              Построить БПБ.
     1-7  0   Эти биты должны быть нулями.
     __________________________________________________________

     ж) разметка дорожки

     При получении параметров устройства функция не использует
это поле.


                             - 116 -



     Читать/записать дорожку на логическом  устройстве

                        (CL=61H/41H)
     -------------------------------------------------

     Если  CL  равен  41Н  или  61Н,  то блок параметров имеет
следующий формат:

     BYTE  - Специальные функции
     WORD  - Головка
     WORD  - Цилиндр
     WORD  - Первый сектор
     WORD  - Количество секторов
     DWORD - Указатель на буфер обмена с диском

     Перечисленные поля имеют следующие значения:

     а) специальные функции

     Этот байт должен быть нулем

     б)  поле  содержит  количество  головок,  на  которых  вы
выполняете запись или чтение.

     в) цилиндр

     это поле  содержит  количество  цилиндров, на  которых  вы
выполняете запись или чтение.

     г) первый сектор

     это поле  содержит  номер первого сектора, на  котором  вы
выполняете запись или чтение. Сектора пронумерованы, начиная с
0, поэтому четвертый сектор, например, будет иметь третий номер.

     д) количество секторов

     это поле  содержит общее  количество секторов.

     е) адрес буфера обмена с диском

     это поле содержит адрес  буфера  обмена  с  диском,  куда
помещается записываемая и считываемая информация.


     Форматировать/проверить дорожки на логическом дисководе
     (CL=42H/62H)
     -------------------------------------------------------

     Для  форматирования  и  проверки  дорожки  на  логическом
дисководе CL должен быть равен 42Н, а для проверки  дорожки  -
62Н.
     В  этих  случаях  блок  параметров  будет иметь следующий
формат:

     BYTE  -  специальные функции
     WORD  -  головка
     WORD  -  цилиндр


                             - 117 -


     Перечисленные поля имеют следующие значения:

     а) специальные функции

     Этот байт должен быть 0

     б) головка

     Это поле  содержит  количество  головок,  на  которых  вы
выполняете форматирование и проверку.

     в) цилиндр

     Это поле  содержит  количество  цилиндров, на которых  вы
выполняете форматирование и проверку.






     ПОЛУЧИТЬ/УСТАНОВИТЬ КАРТУ ЛОГИЧЕСКОГО ДИСКОВОДА
     ( ФУНКЦИЯ 44Н, КОДЫ 0EH и 0FH )

     Вызов:           АН = 44Н
                      AL - 0EH = получть карту логического
                                 дисковода
                           0FH = установить карту логического
                                 дисковода
                      BX - номер дисковода
                           ( 0=текущий, 1=А и т.д.)

     Возвращает:      CF установлен:
                               АХ - 1 = несуществующий код
                                        функции
                                    5 = несуществующий дисковод
                      CF сброшен:
                               AL - логический дисковод,
                                    назначенный физическому
                                  - 0 = только один логический
                                        дисковод назначен физи-
                                        ческому.

     Комментарий:
     MS-DOS   обеспечивает   назначение  множества  логических
дисководов  одному  физическому. Подфункция  Получить   карту
логического   дисковода  позволяет  узнать,  какой  логический
дисковод в данный   момент  назначен  указанному  физическому.
Подфункция  Установить  карту  логического дисковода позволяет
сменить  логический  дисковод,  назначаемый  в  данный  момент
указанному  физическому.  Эти  функции  полезны,  если  больше
одного логического  устройства  назначено  одному  физическому
устройству.
     Результат операции можно получить, проверив содержимое AL.
     Возможное применение этих функций - прикладные программы,
которым необходимо отменить запрос DOS, чтобы обеспечить смену
соответствующих флоппи-дисков в дисководе при доступе к другим
логическим дисководам.



© KOAP Open Portal 2000


?????? ???????????