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


http://rozaomsk.ru/ красивый недорогой букет.

КАК СОЗДАТЬ ВРЕМЕННЫЙ ФАЙЛ ( ФУНКЦИЯ 5АН )

     Вызов:           АН = 5АН
                      СХ - атрибут
                      DS:DX - указатель на маршрут (см. текст)

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

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

                             - 142 -


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

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


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

     create-temp macro pathname,attrib
              mov     cx,attrib
              mov     dx,offset pathname
              mov     ah,5AH
              int     21H
              endm

     Пример:
     Следующая программа создает  временный  файл  в  каталоге
\wp\docs,  копирует  из текущего каталога файл textfile.asc во
временный файл, после чего закрывает оба файла.

     stdout   equ     1
     ;
     file     db      "TEXTFILE.ASC",0
     path     db      "\WP\DOCS",0
     temp     db      13 dup (0)
     open-msg db      " открыт.",0DH,0AH
     crl-msg  db      "  создан.",0DH,0AH
     rd-msg   db      " прочитан в буфер.",0DH,0AH
     wr-msg   db      "Буфер  записан в  "
     cl-msg   db      "Файлы закрыты.",0DH,0AH
     crlf     db      0DH,0AH
     handle1  dw      ?
     handle2  dw      ?
     buffer   db      512 dup (?)
     ;
     begin:   open-handle file,0             ; См. функцию 3DH
              jc      open-error             ; Метка не показана
              mov     handle1,ax             ; Сохранить хендл
              write-handle stdout,file,12    ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              write-handle stdout,open-msg,10 ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              create-temp path,0             ; Наша функция
              jc      create-error           ; Метка не показана
              mov     handle2,ax             ; Сохранить хендл
              write-handle stdout,path,8     ; См. функцию 40Н
              jc      write-error            ; Метка не показанa
              display-char "
              write-handle stdout,temp,12    ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              write-handle stdout,crl-msg,11 ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              read-handle handle1,buffer,512 ; См. функцию 3FH
              jc      read-error             ; Метка не показана

                             - 143 -


              write-handle stdout,file,12    ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              write-handle stdout,rd-msg,20  ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              write-handle handle2,buffer,512 ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              write-handle stdout,wr-msg,18  ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              write-handle stdout,temp,12    ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              write-handle stdout,crlf,12    ; См. функцию 40Н
              jc      write-error            ; Метка не показана
              close-handle handle1           ; См. функцию 3ЕН
              jc      close-error            ; Метка не показана
              close-handle handle2           ; См. функцию 3ЕН
              jc      close-error            ; Метка не показана
              write-handle stdout,cl-msg,16  ; См. функцию 40Н
              jc      write-error            ; Метка не показана





     СОЗДАТЬ НОВЫЙ ФАЙЛ ( ФУНКЦИЯ 5ВН )

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

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

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

                             - 144 -



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


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

     create-new macro pathname,attrib
              mov     cx,attrib
              mov     dx,offset pathname
              mov     ah,5BH
              int     21H
              endm

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

     err-msg  db      "ФАЙЛ УЖЕ СУЩЕСТВУЕТ",0DH,0AH,"$"
     path     db      "report.asm",0
     handle   dw      ?
     ;
     begin:   create-new path,0         ; Наша функция
              jnc     continue          ; Дальнейшие действия
              cmp     ax,80             ; Файл уже существует?
              jne     error             ; Метка не показана
              display err-msg           ; См. функцию 09Н
              jmp     return            ; Возврат в MS-DOS
     continue: mov    handle,ax         ; Сохранить хендл
     ;
     ;       ( дальнейшие действия )




     БЛОКИРОВАТЬ ( ФУНКЦИЯ 5СН, КОД 00Н )

     Вызов:           АН = 5СН
                      AL = 00H
                      ВХ - хендл
                      CX:DX - смещение блокируемой области
                      SI:DI - длина блокируемой области

                             - 145 -



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

     Комментарий:
     Функция  5СН (код 00Н) запрещает доступ (по чтению или по
записи) любой программе в указанную область файла.  ВХ  должен
содержать  хендл файла, содержащего блокируемую область. CX:DX
(четырех-байтное целое) должны содержать смещение  блокируемой
области  от начала файла. SI:DI (четырех-байтное целое) должны
содержать длину блокируемой области.
     Если другая  программа  попытается  получить  доступ  (по
чтению  или  записи) к блокированной области, то MS-DOS делает
три  попытки,  после  чего  (если  они  не  удались)  вызывает
прерывание  24Н  для  этой  программы.  Количество  попыток вы
можете изменить с помощью функции 44Н (код 0ВН) (УВВ Повторить).
     Блокируемая область  может  быть  в  любом  месте  файла,
например,  в его конце. Блокировку нужно устанавливать лишь на
короткие  промежутки  времени.   Так,   если   область   файла
заблокирована  более  десяти  секунд, то вы можете уже считать
это ошибкой.
     Функции  45Н  (Дубликат  хендла)  и  46Н  (Активизировать
дубликат)  наследуют  и  доступ к любой блокированной области.
Дочерняя программа, загруженная с помощью функции 4ВН(код 00Н)
(Загрузить  и  выполнить  программу) и получившая в наследство
файл, не наследует доступ к блокированным областям.
     __________________________________________________________
     Предостережение
                    Если программа закрывает файл, содержащий
                    блокированную область или прерывается с
                    открытым файлом, содержащим такую область,
                    то результат не определен.
     __________________________________________________________

     Программы, которые могут быть прерваны с помощью прерываний
23Н (Прерывание по CONTROL+C) и 24Н (Прерывание по критической
ошибке) должны  поймать  этот  момент  и  разблокировать  перед
выходом все блокированные области.
     Программа  может  определить статус области (блокирована -
разблокирована)  попыткой   блокировать   ее   и   последующей
обработкой возвращаемого кода.
     В  случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:

     Код      Значение
     __________________________________________________________
     1        Должна быть загружена система разделения файлов
     6        Содержимое ВХ не является разрешенным, открытым
              хендлом
     33       Вся или часть указанная(ой) область(и) уже блоки-
              рована
     36       Нет больше места для данных в буфере. См. команду
              SHARE в СПРАВОЧНИКЕ ПОЛЬЗОВАТЕЛЯ MS-DOS, где
              дается описание порядка выделения мест в буфере.
     __________________________________________________________

                             - 146 -



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

     lock macro handle,start,bytes
              mov     bx,handle
              mov     cx,word ptr start
              mov     dx,word ptr start+2
              mov     si,word ptr bytes
              mov     di,word ptr bytes+2
              mov     al,0
              mov     ah,5CH
              int     21H
              endm

     Пример:
     Следующая программа  открывает  файл  finalrpt  в  режиме
доступа   "Разрешение   чтения/записи"  и  блокирует  две  его
области: первые 128 байт  и  байты  от  1024  до  5119.  После
некоторой  (не  уточняется)  обработки, программа разблокирует
те-же области и закрывает файл.

     stdout   equ     1
     ;
     start1   dd      0
     lgth1    dd      128
     start2   dd      1023
     lgth2    dd      4096
     file     db      "FINALRPT",0
     op-msg   db      " открыт.",0DH,0AH
     l1-msg   db      "Блокированы первые 128 байт.",0DH,0AH
     l2-msg   db      "Блокированы байты 1024-5119.",0DH,0AH
     u1-msg   db      "Разблокированы первые 128 байт.",0DH,0AH
     u2-msg   db      "Разблокированы байты 1024-5119.",0DH,0AH
     cl-msg   db      " закрыт.",0DH,0AH
     handle   dw      ?
     ;
     begin:   open-handle file,01000010b    ; См. функцию 3DH
              jc      open-error            ; Метка не показана
              write-handle stdout, file,8   ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              write-handle stdout,op-msg,10 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              mov     handle,ax             ; Сохранить хендл
              lock    handle,start1,lgth1   ; Наша функция
              jc      lock-error            ; Метка не показана
              write-handle stdout,l1-msg,30 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              lock    handle,start2,lgth2   ; Наша функция
              jc      lock-error            ; Метка не показана
              write-handle stdout,l2-msg,30 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              ;
              ; ( дальнейшая обработка )
              ;
              unlock  handle,start1,lgth1   ; См. функцию 5С01Н
              jc      unlock-error          ; Метка не показана
              write-handle stdout,u1-msg,33 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              unlock  handle,start2,lgth2   ; См. функцию 5С01Н
              jc      unlock-error          ; Метка не показана

                             - 147 -


              write-handle stdout,u2-msg,33 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              close-handle handle           ; См. функцию 3ЕН
              jc      close-error           ; Метка не показана
              write-handle stdout,file,8    ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              write-handle stdout,cl-msg,10 ; См. функцию 40Н
              jc      write-error           ; Метка не показана





     РАЗБЛОКИРОВАТЬ ( ФУНКЦИЯ 5СН, КОД 01Н )

     Вызов:           АН = 5СН
                      AL = 01H
                      ВХ - хендл
                      CX:DX - смещение разблокируемой области
                      SI:DI - длина разблокируемой области

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

     Комментарий:
     Функция   5СН    (код    01Н)    разблокирует    область,
заблокированную   до   этого  той  же  программой.  В ВХ необ-
ходимо  загрузить  хендл  файла,  содержащего   эту   область.
Регистры CX:DX и SI:DI загружаются так же, как и в функции 5СН
(код  00Н). То есть, размер и смещение разблокируемой области
должны в точности совпадать  с  соответствующими  величинами,
указанными при вызове функции 5СН с кодом 00Н (Блокировать).
     Техника работы с этими функциями дана в описании  функции
5СН (код 00Н).
     В  случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:

     Код      Значение
     __________________________________________________________
     1        Должна быть загружена система разделения файлов
     6        Содержимое ВХ не является разрешенным, открытым
              хендлом
     33       Указанная область не идентична  области,
              заблокированной ранее той же программой
     36       Нет больше места для данных в буфере. См. команду
              SHARE в СПРАВОЧНИКЕ ПОЛЬЗОВАТЕЛЯ MS-DOS, где
              дается описание порядка выделения мест в буфере.
     __________________________________________________________

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

                             - 148 -



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

     unlock macro handle,start,bytes
              mov     bx,handle
              mov     cx,word ptr start
              mov     dx,word ptr start+2
              mov     si,word ptr bytes
              mov     di,word ptr bytes+2
              mov     al,1
              mov     ah,5CH
              int     21H
              endm

     Пример:
     Следующая программа  открывает  файл  finalrpt  в  режиме
доступа   "Разрешение   чтения/записи"  и  блокирует  две  его
области: первые 128 байт  и  байты  от  1024  до  5119.  После
некоторой  (не  уточняется)  обработки, программа разблокирует
те же области и закрывает файл.

     stdout   equ     1
     ;
     start1   dd      0
     lgth1    dd      128
     start2   dd      1023
     lgth2    dd      4096
     file     db      "FINALRPT",0
     op-msg   db      " открыт.",0DH,0AH
     l1-msg   db      "Блокированы первые 128 байт.",0DH,0AH
     l2-msg   db      "Блокированы байты 1024-5119.",0DH,0AH
     u1-msg   db      "Разблокированы первые 128 байт.",0DH,0AH
     u2-msg   db      "Разблокированы байты 1024-5119.",0DH,0AH
     cl-msg   db      " закрыт.",0DH,0AH
     handle   dw      ?
     ;
     begin:   open-handle file,01000010b    ; См. функцию 3DH
              jc      open-error            ; Метка не показана
              write-handle stdout, file,8   ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              write-handle stdout,op-msg,10 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              mov     handle,ax             ; Сохранить хендл
              lock    handle,start1,lgth1   ; См. функцию 5С00Н
              jc      lock-error            ; Метка не показана
              write-handle stdout,l1-msg,30 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              lock    handle,start2,lgth2   ; См. функцию 5С00Н
              jc      lock-error            ; Метка не показана
              write-handle stdout,l2-msg,30 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              ;
              ; ( дальнейшая обработка )
              ;
              unlock  handle,start1,lgth1   ; Наша функция
              jc      unlock-error          ; Метка не показана
              write-handle stdout,u1-msg,33 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              unlock  handle,start2,lgth2   ; Наша функция
              jc      unlock-error          ; Метка не показана

                             - 149 -


              write-handle stdout,u2-msg,33 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              close-handle handle           ; См. функцию 3ЕН
              jc      close-error           ; Метка не показана
              write-handle stdout,file,8    ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              write-handle stdout,cl-msg,10 ; См. функцию 40Н
              jc      write-error           ; Метка не показана





     ПОЛУЧИТЬ ИМЯ СТАНЦИИ ( ФУНКЦИЯ 5ЕН, КОД 00Н )

     Вызов:           АН = 5ЕН
                      AL = 0
                      DS:DX - указатель на 16-байтный буфер

     Возвращает:      CF установлен:
                         АХ = 1 - несуществующий код
                                  функции
                      CF сброшен:
                         СХ - идентификационный номер
                              локального компьютера
                               СН - законность имени станции:
                                        00Н = не разрешено
                                        Не ноль = разрешено
                               СL - номер, назначаемый машине
                                    Сетевой БСВВ (Базовая
                                    система ввода/вывода)
                         DS:DX - сегмент:смещение строки
                                 ASCIZ с именем станции

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

     Код      Значение
     __________________________________________________________
     1        Для вызова этой функции должна быть запущена
              сеть Microsoft Networks (MN)
     __________________________________________________________

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

     get-machine-name macro buffer
              mov     dx,offset buffer
              mov     al,0
              mov     ah,5EH
              int     21H
              endm


                             - 150 -


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

     stdout   equ     1
     ;
     msg      db      "Сетевое имя: "
     mac-name db      16 dup (?),0DH,0AH
     ;
     begin:   get-machine-name mac-name  ; Наша функция
              jc      name-error         ; Метка не показана
              write-handle stdout,msg,31 ; См. функцию 40Н
              jc      write-error        ; Метка не показана




     УСТАНОВКА ПРИНТЕРА  ( ФУНКЦИЯ 5ЕН, КОДЫ 02Н и 03Н )

     Вызов:           АН = 5ЕН
                      AL - 02H = установить управляющую
                                 строку для принтера
                           03Н = получить управляющую
                                 строку принтера
                      ВХ - индекс с листа назначения
                      СХ (если AL=02H) - длина управляющей
                                         строки
                      DS:SI - указатель на управляющую строку
                      ES:DI (если AL=03H) - сегмент:смещение
                                            64-байтного буфера
                                            для получения управ-
                                            ляющей строки.

     Возвращает:      CF установлен:
                         АХ = 1 - несуществующий код
                                  функции
                      CF сброшен:
                         СХ (если AL=03H) - длина управляющей
                                            строки принтера в
                                            байтах
                         ES:DI (если AL=03H) - сегмент:смещение
                                               управляющей стро-
                                               ки (ASCII) прин-
                                               тера.

     Комментарий:
     Функция  5ЕН  (код  02Н)  определяет  строку  управляющих
символов, которую MS-DOS добавляет  в  начало  каждого  файла,
посылаемого  на сетевой принтер. ВХ должен  содержать  индекс
листа назначения, указывающий  принтер  (  первый  вход  имеет
индекс 0). СХ должен содержать длину строки, а DS:SI - сегмент
и  смещение  самой строки. Должна быть запущена сеть Microsoft
Networks (MN).
     Эта  функция  позволяет  каждой  программе,   разделяющей
принтер,  иметь  свою  собственную  конфигурацию  принтера. Вы
можете использовать  функцию  5F02H  (Получить  вход  с  листа
назначения)  для  определения,  какой вход из листа назначения
относится к принтеру.
     Следующая   программа   определяет   управляющую   строку
принтера,  состоящую из одного символа, для печати расширенным
типом на Epson-совместимых принтерах.  Принтер  отменяет  этот

                             - 151 -


режим  после  первого символа ВК. Таким образом, первая строка
каждого посылаемого на сетевой принтер файла будет распечатана
как заголовок. В примере индекс принтера принимается равным  3
(четвертый  вход  в  листе  назначения).  Для определения этой
величины можно воспользоваться функцией 5F02H (Получить вход с
листа назначения).
     В  случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:

     Код      Значение
     __________________________________________________________
     1        Для вызова этой функции должна быть запущена
              сеть Microsoft Networks (MN)
     __________________________________________________________

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

     printer-setup macro index,lgth,string
              mov     bx,index
              mov     cx,lgth
              mov     dx,offset string
              mov     al,2
              mov     ah,5EH
              int     21H
              endm

     Пример:

     setup    db      0EH
     ;
     begin:   printer-setup 3,1,setup   ; Наша функция
              jc      error             ; Метка не показана




     ПОЛУЧИТЬ ВХОД С ЛИСТА НАЗНАЧЕНИЯ ( ФУНКЦИЯ 5FH, КОД 02Н )

     Вызов:           АН = 5FH
                      AL = 02H
                      ВХ - индекс листа назначения
                      DS:SI - указатель на буфер для
                              локального имени
                      ES:DI - указатель на буфер для
                              удаленного имени

     Возвращает:      CF установлен:
                              АХ - 1 = несуществующий код
                                       функции
                                  18 = превышен индекс
                      CF сброшен:
                              BL - 3 = принтер
                                   4 = дисковод
                              СХ - хранимое значение,
                                   устанавливаемое пользова-
                                   телем

                             - 152 -



     Комментарий:
     Функция 5FH (код 02Н) возвращает указанный вход  с  листа
назначений.   ВХ  должен  содержать  индекс  листа  назначений
(индекс 0  это  первый  вход),  а  DS:SI  сегмент  и  смещение
16-байтного   буфера   для   локального  имени.  ES:DI  должны
содержать  сегмент  и   смещение   128-байтного   буфера   для
удаленного имени. Должна быть запущена сеть Microsoft Networks.
     MS-DOS  помещает локальное имя в буфер, адресуемый DS:SI,
a удаленное имя в буфер, адресуемый ES:DI. Локальное имя может
быть нулевой ASCIZ строкой. BL возвращает  3,  если  локальное
устройство   принтер  и  4,  если  им  является  дисковод.  СХ
возвращает хранимое  значение,  устанавливаемое  пользователем
при  вызове функции 5F03H (Соединить в сети). Содержимое листа
назначения может менятся между вызовами.
     С помощью этой функции вы можете получить любой вход  или
сделать   полную   копию   листа  назначения,  последовательно
увеличивая индекс. Для определения конца листа нужно проверять
наличие кода ошибки 18 (превышен индекс), как это  вы  делаете
при  просмотре  каталога  с  помощью функций 4ЕН (Найти первый
файл) и 4FH (Найти следующий файл),  проверяя   код   18  (Нет
больше файлов).
     В  случае ошибки, устанавливается CF, а АХ возвращает код
ошибки:

     Код      Значение
     __________________________________________________________
     1        Для вызова этой функции должна быть запущена
              сеть Microsoft Networks (MN)
     18       Индекс, загруженный в ВХ, превышает количество
              входов в листе назначения
     __________________________________________________________


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

     get-list macro index,local,remote
              mov     bx,index
              mov     si,offset local
              mov     di,offset remote
              mov     al,2
              mov     ah,5FH
              int     21H
              endm

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

     stdout   equ     1
     printer  equ     3
     ;
     local-nm db      16 dup (?),2 dup (20H)
     remote-nm db     128 dup (?),2 dup (20H)
     header   db      "Local name",8 dup (20H)  ; Локальное имя
              db      "Remote name",7 dup (20H) ; Удаленное имя
              db      "Device type"             ; Тип устройства
     crlf     db      0dh,0ah,0dh,0ah
     drive-msg db     "drive"                   ; Дисковод

                             - 153 -


     print-msg db     "printer"                 ; Принтер
     index     dw     ?
     ;
     begin:   write-handle stdout,header,51 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              mov     index,0               ; Сброс индекса
     ck-list: get-list index,local-nm,remote-nm ; Наша функция
              jnc     got-one               ; Получен вход
     error:   cmp     ax,18                 ; Конец ?
              je      last-one              ; Да
              jmp     error                 ; Метка не показана
     got-one: push    bx                    ; Сохранить тип
                                            ; устройства
              write-handle stdout,local-nm,148 ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              pop     bx                    ; Получить тип
                                            ; устройства
              cmp     bl,printer            ; Это принтер?
              je      prntr                 ; Да
              write-handle stdout,drive-msg,5  ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              jmp     get-next              ; Дать сообщение
     prntr:   write-handle stdout,print-msg,7  ; См. функцию 40Н
              jc      write-error           ; Метка не показана
     get-next: write-handle stdout,crlf,2   ; См. функцию 40Н
              jc      write-error           ; Метка не показана
              inc     index                 ; Инкремент индекса
              jmp     ck-list               ; Получить следующий
                                            ; вход
     last-one: write-handle stdout,crlf,4   ; См. функцию 40Н
              jc      write-error           ; Метка не показана




     СОЕДИНИТЬ В СЕТИ ( ФУНКЦИЯ 5FH, КОД 03Н )

     Вызов:           АН = 5FH
                      AL = 03H
                      BL - 3 = принтер
                           4 = дисковод
                      СХ - величина пользователя
                      DS:SI - указатель на имя устройства-
                              источника
                      ES:DI - указатель на имя устройства-
                              адресата

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

                             - 154 -



     Комментарий:
     Функция  5FH  (код  03Н)  адресует  принтер  или дисковод
(устройство источник) сетевому каталогу (устройство  адресат).
BL  должен  содержать 3, если  источник - принтер и 4, если им
является дисковод. DS:SI должны содержать сегмент  и  смещение
строки   ASCIZ,  указывающей  имя  принтера  или  дисковода  с
последующим двоеточием, или нулевой строки  (один  байт  00Н).
ES:DI  должны  содержать  сегмент  и  смещение  строки  ASCIZ,
указывающей  имя  сетевого  каталога.  СХ  содержит  16-битную
величину,    устанавливаемую   пользователем   и   сохраняемую
системой. Должна быть запущена сеть Microsoft Networks (MN).

     Формат строки адресата (строка ASCIZ):

     имя-машины маршрут 00Н пароль 00Н    ,   где:

     Имя-машины - имя сервера, содержащего сетевой каталог.

     Маршрут - имя сетевого каталога (не каталоговый маршрут),
               которому адресуется устройство-источник.

     00Н - нулевой байт

     Пароль - пароль для доступа  к  сетевому  каталогу.  Если
              пароль   не   указан,   то   оба  нулевых  байта
              непосредственно следуют за маршрутом.

     Если BL = 3, то строка источника должна быть  PRN,  LPT1,
                  LPT2  или  LPT3.  Эта  функция  буферирует и
                  отсылает весь вывод для  этого  принтера  на
                  удаленный   принтер,   указанный   в  строке
                  адресата.
     Если BL = 4, то строка источника может  быть  как  именем
                  дисковода  с  последующим  двоеточием, так и
                  нулевой  строкой.  Если   строка   источника
                  содержит   разрешенное   имя   дисковода   с
                  двоеточием, то все последующие  обращения  к
                  этому    имени    переадресуются    сетевому
                  каталогу, указанному в строке адресата. Если
                  строка источника является  нулевой  строкой,
                  то   MS-DOS   пытается  разрешить  доступ  к
                  сетевому каталогу по паролю.

     Максимальная длина строки адресата - 128 байт.  Значение,
которое  вы  загрузили  в  СХ,  можно  потом вернуть с помощью
функции 5F02H (Получить вход с листа назначения).
     В случае ошибки, устанавливается CF, а АХ возвращает  код
ошибки:

     Код      Значение
     __________________________________________________________
     1        Для вызова этой функции должна быть запущена сеть
              MN;  значение  ВХ  не  1-4;  неправильный формат
              строки  источника;  неправильный  формат  строки
              адресата; устройство-источник уже переадресовано.
     3        Указанное имя сетевого каталога  неправильно или
              не существует.
     5        Сочетание сетевой_каталог/пароль недействительно.
              Это не значит, что недействителен сам пароль;

                             - 155 -


              возможно каталог не существует на сервере.
     8        Недостаточно памяти для строковых замен.
     __________________________________________________________

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

     redir macro device,value,source,destination
              mov     bl,device
              mov     cx,value
              mov     si,offset source
              mov     es,seg destination
              mov     di,offset destination
              mov     al,03H
              mov     ah,5FH
              int     21H
              endm

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

     Локальный дисковод   Сетевое имя   Пароль
     или принтер          на сервере
     E:                   WORD          нет
     F:                   COMM          FRED
     PRN:                 PRINTER       QUICK

     printer  equ     3
     drive    equ     4
     ;
     local-1  db      "e:",0
     local-2  db      "f:",0
     local-3  db      "prn",0
     remote-1 db      "\harold\word",0,0
     remote-2 db      "\harold\comm",0,"fred",0
     remote-3 db      "\harold\printer",0,"quick",0
     ;
     begin:   redir local-1,remote-1,drive,0    ; Наша функция
              jc    error                  ; Метка не показана
              redir local-2,remote-2,drive,0    ; Наша функция
              jc    error                  ; Метка не показана
              redir local-3,remote-3,printer,0  ; Наша функция
              jc    error                  ; Метка не показана




     ОТМЕНИТЬ СОЕДИНЕНИЕ В СЕТИ  ( ФУНКЦИЯ 5FH, КОД 04Н )

     Вызов:           АН = 5FH
                      AL = 04H
                      DS:SI - указатель на имя устройства-
                              источника

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

                             - 156 -



     Комментарий:
     Функция 5FH (код 04Н) отменяет переадресовку принтера или
дисковода  (источник) сетевому каталогу (адресат), выполненную
с помощью функции  5F03H  (Соеденить  в  сети).  DS:SI  должны
содержать  сегмент  и  смещение  строки ASCIZ, указывающей имя
принтера или дисковода, чья переадресация отменяется.
     Должна быть запущена сеть Microsoft Networks (MN).

     Строка ASCIZ, адресуемая DS:SI, должна содержать одно  из
трех значений:

     -   Имя  дисковода  с  последующим  двоеточием.  Отменяет
         переадресовку и восстанавливает физическое назначение
         дисковода.
     -   Имя принтера (PRN, LPT1, LPT2, LPT3 или их эквивален-
         ты).   Отменяет   переадресовку   и   восстанавливает
         физическое назначение принтера.
     -   Строка,  начинающаяся  с  \\  (  2  обратных  слэша).
         Отменяет соединение между локальной машиной и сетевым
         каталогом.

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

     Код      Значение
     __________________________________________________________
     1        Для вызова этой функции должна быть запущена
              сеть MN; или строка ASCIZ содержит несуществующий
              источник.
     15       Переадресация дисковода или принтера приостанов-
              лена на сервере.
     __________________________________________________________

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

     cancel-redir macro local
              mov     si,offset local
              mov     al,4
              mov     ah,5FH
              int     21H
              endm

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

     local-1  db      "e:",0
     local-2  db      "f:",0
     local-3  db      "prn",0
     ;
     begin:   cancel-redir local-1    ; Наша функция
              jc    error                  ; Метка не показана
              cancel-redir local-2    ; Наша функция
              jc    error                  ; Метка не показана
              cancel-redir local-3    ; Наша функция
              jc    error                  ; Метка не показана




                             - 157 -



     ПОЛУЧИТЬ ПРЕФИКС СЕГМЕНТА КОДОВ (PSP) ( ФУНКЦИЯ 62Н )

     Вызов:           АН = 62Н

     Возвращает:      ВХ - сегментный адрес PSP
                           текущей программы

     Комментарий:
     Функция  возвращает  сегментный  адрес  (в  ВХ)  Префикса
сегмента кодов текущей программы.

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

     get-psp macro
              mov     ah,62H
              int     21H
              endm

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

     msg      db      "Сегментный адрес PSP:  H",0DH,0AH,"$"
     ;
     begin:   get-psp                   ; Наша функция
              convert bx,16,msg[22]     ; См. конец главы
              dispaly msg               ; См. функцию 09Н




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

     Вызов:           АН = 65Н
                      AL - код операции (см. текст)
                      ВХ - кодовая страница
                           (-1 = консоль)
                      СХ - количество возвращаемых данных
                      DX - код страны (международный телефонный
                           код - ID), по которой возвращается
                           информация (-1 = текущая страна)
                      ES:DI - адрес буфера для возвращаемой
                              информации

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

     Комментарий:
     Функция  65Н возвращает стандартную информацию по стране.
Эта информация включает код ID страны, кодовую страницу, формат
даты   и  времени,  символ  валюты,  разделитель  (для  тысяч,
десятичный, для даты и времени), формат обозначения денежных
сумм  и таблицы регистрового преобразования.

                             - 158 -



     Код операции в AL может быть следующим:

     Код      Описание
     __________________________________________________________
     1        Вернуть стандартную информацию
     2        Вернуть указатель на таблицу верхнего регистра
     4        Вернуть указатель на таблицу верхнего регистра
              для имен файлов
     6        Вернуть указатель на сравнительную таблицу
     7        Выбрать двубайтовый набор символов (DBCS)
     __________________________________________________________

     Резидентной является информация только  по  одной  стране
(по  умолчанию  всегда  текущая). Информация по всем остальным
странам хранится в файле country.sys. Команда  MS-DOS  NLSFUNC
использует  эту функцию для доступа к информации, хранящейся в
файле country.sys. Если код страны и номер кодовой страницы не
соответствуют друг другу, или оба они недействительны,  то АХ
возвращает код ошибки (2). Если СХ меньше 5,  то  возвращается
код   ошибки   (1).  Если  количество  запрошенной  информации
превышает  значение  СХ,  то  возвращается столько информации,
сколько указано в СХ, и CF не устанавливается (нет ошибок).

     Если AL=1, то буфер будет заполнен следующей информацией:

     db       1       ; Идентификатор информации
     dw       ?       ; Размер (<=38)
     dw       ?       ; Код страны
     dw       ?       ; Кодовая страница

     Если AL=2, то буфер будет заполнен следующей информацией:

     db       2       ; Идентификатор иформации
     dd       ?       ; Указатель на таблицу верхнего регистра

     Если AL=4, то буфер будет заполнен следующей информацией:

     db       4       ; Идентификатор информации
     dd       ?       ; Указатель на таблицу верхнего регистра
                      ; для имен файлов

     Обе  эти  таблицы  состоят  из  поля  длины (два байта) и
     последующих   128   в/р эквивалентов   для   128   ASCII
     символов верхнего регистра.   Используется   следующая
     формула   для   вычисления   адреса   верхне-регистрового
     эквивалента в таблице:

     Адрес вых_симв = вх_симв - (256 - дл_табл) = нач_табл ,

     где :

     Параметр   Значение
     __________________________________________________________
     вх_симв    Преобразуемый символ
     дл_табл    Длина списка в/р эквивалентов
     нач_табл   Начальный адрес таблицы
     вых_симв   В/Р эквивалент для вх_симв

                             - 159 -



     Если  вх_симв  больше  или  равен  (256  -  дл_табл),  то
существует его в/р эквивалент в таблице; в противном случае  -
нет.

     Если AL=6, то буфер заполняется следующей информацией:

     db       6       ; Идентификатор информации
     dd       ?       ; Указатель на сравнительную таблицу

     Длина этой таблицы 258 байт. Первое слово - длина таблицы.
     Остальное - 256 ASCII символов в соответствующем порядке.



     ПОЛУЧИТЬ/УСТАНОВИТЬ ГЛОБАЛЬНУЮ КОДОВУЮ СТРАНИЦУ
                     ( ФУНКЦИЯ 66Н )

     Вызов:           АН = 66Н
                      AL -  1 = получить кодовую страницу
                            2 = установить кодовую страницу
                      ВХ (если AL = 2) - устанавливаемая
                                         кодовая страница

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


     Комментарий:
     Функция 66Н устанавливает или получает кодовую страницу,
используемую  как  внутри  самой   машиной,   так   и   всеми
устройствами.  Если  не  было установлено другой страницы, то
функция  получает  текущую  кодовую  страницу  из  DX.   Если
установлена  другая  кодовая  страница,  то  функция получает
текущую кодовую страницу из ВХ.
     MS-DOS  получает  новую   кодовую   страницу   из   файла
country.sys.   Перед   выбором   новой   страницы   необходимо
подготовить устройства к переключению на нее.  Для  подготовки
устройства  необходимо  с  помощью  команды  DEVICE  ( в файле
config.sys) загрузить    драйвер   устройства,  поддерживающий
переключение кодовой страницы. Кроме того, пользователь должен
использовать ключевое слово PREPARE в команде MS-DOS MODE  для
подготовки устройства к переключению.
      Выбранная  кодовая  страница  должна  быть  совместима с
кодом страны, указанным в файле  config.sys.  Если  MS-DOS  не
может   прочитать  country.sys  или  другой  файл,  содержащий
информацию по указанной стране, то код ошибки (2) возвращается
в АХ.



     УСТАНОВИТЬ СЧЕТ ХЕНДЛОВ  ( ФУНКЦИЯ 67Н )

     Вызов:           АН = 67Н
                      ВХ - количество разрешенных хендлов

     Возвращает:      CF установлен:

                             - 160 -


                               АХ - код ошибки
                      CF сброшен:
                               нет ошибок

     Комментарий:
     Функция 67Н увеличивает или уменьшает количество  файлов,
которое  программа  может  открыть  одновременно. Максимальное
количество  равно 64К. Если указано меньше 20, то устанавлива-
ется  минимальное  количество   -   20. При уменьшении  коли-
чества разрешенных хендлов  новая  граница  вступает  в  силу,
только если  закрыты  все хендлы выше этой границы.
     Пользователь  должен использовать функцию 4АН (Установить
участок) для выделения  памяти  расширенной  таблице  хендлов,
если  значение  ВХ  больше  255. Максимальный параметр команды
FILES (config.sys) равен 255.




     СНЕСТИ В ФАЙЛ  ( ФУНКЦИЯ 68Н )

     Вызов:           АН = 68Н
                      ВХ - хендл файла

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

     Комментарий:
     Функция 68Н  сносит  все  данные  с  буферов в  файл,  не
закрывая его. Использование этой функции более эффективно, чем
традиционное закрытие-открытие. Наиболее удачно она применяется
в сетевой  среде.  Функция  дает  уверенность  в  адекватности
дискового "образа" содержимому файла.



     ________________
     МАКРООПРЕДЕЛЕНИЯ
     ________________

     terminate      macro
                    int 20H
                    endm


     abs-disk-read macro disk,buffer,num-sectors,ferst-sector
                   mov   al,disk
                   mov   bx,offset buffer
                   mov   cx,num-sectors
                   mov   dx,first-sector
                   int   25H
                   popf
                   endm


                             - 161 -



     abs-disk-write macro disk,buffer,num-sectors,first-sector
                    mov   al,disk
                    mov   bx,offset buffer
                    mov   cx, num-sectors
                    mov   dx,first-sector
                    int   26H
                    popf
                    endm


     stay-resident  macro last-instruc
                    mov   dx,offset last-instruc
                    inc   dx
                    int   27H
                    endm


     terminate-program macro
                       xor    ah,ah
                       int    21H
                       endm

     read-kbd-and-echo macro
                       mov   ah,01H
                       int   21H
                       endm

     display-char macro character
                  mov   dl,character
                  mov   ah,02H
                  int   21H
                  endm


     aux-input macro
               mov   ah,03H
               int   21H
               endm

     aux-output macro character
                mov   dl,character
                mov   ah,04H
                int   21H
                endm


     print-char macro character
                mov   dl,character
                mov   al,05H
                int   21H
                endm


     dir-console-io macro switch
                    mov   dl,switch
                    mov   ah,06H
                    int   21H
                    endm


                             - 162 -



     dir-console-input macro
                       mov   ah,07H
                       int   21H
                       endm


     dir-console-input macro
                       mov   ah,07H
                       int   21H
                       endm


     read-kbd macro
              mov  ah,08H
              int  21H
              endm


     display macro string
             mov   dx,offset string
             mov   ah,09H
             int   21H
             endm


     display macro string
             mov   dx,offset string
             mov   ah,09H
             int   21H
             endm


     get-string macro limit,string
                mov   dx,offset string
                mov   string,limit
                mov   ah,0AH
                int   21H
                endm


     check-kbd-status macro
                      mov  ah,0BH
                      int  21H
                      endm


     flush-and-read-kbd macro switch
                        mov   al,switch
                        mov   al,0CH
                        int   21H
                        endm


     reset-disk macro
                mov   ah,0DH
                int   21H
                endm



                             - 163 -


     select-disk macro disk
                 mov   dl,disk[-64]
                 mov   ah,0EH
                 int   21H
                 endm


     open macro fcb
          mov   dx,offset fcb
          mov   ah,0FH
          int   21H
          endm



     close macro fcb
           mov   dx,offset fcb
           mov   ah,10H
           int   21H
           endm


     search-first macro fcb
                  mov   dx,offset fcb
                  mov   ah,11H
                  int   21H
                  endm



     search-next macro fcb
                 mov   dx,offset fcb
                 mov   ah,12H
                 int   21H
                 endm


     delete macro fcb
            mov   dx,offset fcb
            mov   ah,13H
            int   21H
            endm


     read-seq macro fcb
              mov   dx,offset fcb
              mov   ah,14H
              int   21H
              endm


     write-seq macro fcb
              mov     dx,offset fcb
              mov     ah,15H
              int     21H
              endm


                             - 164 -



     create macro fcb
              mov     dx,offset fcb
              mov     ah,16H
              int     21H
              endm


     rename macro fcb,newname
              mov     dx,offset fcb
              mov     ah,17H
              int     21H
              endm


     current-disk macro
                  mov ah,19H
                  int 21H
                  endm


     set-dta macro buffer
             mov      dx,offset buffer
             mov      ah,1AH
             int      21H
             endm


     def-drive-data macro
              push    ds
              mov     ah,1BH
              int     21H
              mov     al,byte ptr[bx]
              pop     ds
              endm


    drive-data macro drive
              push    ds
              mov     dl,drive
              mov     ah,1CH
              int     21H
              mov     al,byte ptr[bx]
              pop     ds
              endm

     read-ran macro fcb
              mov   dx,offset fcb
              mov   ah,21H
              int   21h
              endm


     write-ran macro fcb
              mov     dx,offset fcb
              mov     ah,22H
              int     21H
              endm



                             - 165 -


     file-size macro fcb
              mov     dx,offset fcb
              mov     ah,23H
              int     21H
              endm


     set-relative-record macro fcb
              mov     dx,offset fcb
              mov     ah,24H
              int     21H
              endm


     set-vector macro interrupt,handler-start
              mov     al,interrupt
              mov     dx,offset handler-start
              mov     ah,25H
              int     21H
              endm


     create-psp macro seg-addr
              mov     dx,seg-addr
              mov     ah,26H
              int     21H
              endm


     ran-block-read macro fcb,count,rec-size
              mov     dx,offset fcb
              mov     cx,count
              mov     word ptr fcb[14],rec-size
              mov     ah,27H
              int     21H
              endm


     ran-block-write macro fcb,count,rec-size
              mov     dx,offset fcb
              mov     cx,count
              mov     word ptr fcb[14],rec-size
              mov     ah,28H
              int     21H
              endm


     parse macro string,fcb
              mov     si,offset string
              mov     di,offset fcb
              push    es
              push    ds
              pop     es
              mov     al,0FH ; Биты 0-3 в 1
              mov     ah,29H
              int     21H
              pop     es
              endm



                             - 166 -


     get-date macro
              mov     ah,2AH
              int     21H
              endm


     set-date macro year,month,day
              mov     cx,year
              mov     dh,month
              mov     dl,day
              mov     ah,2BH
              int     21H
              endm


     get-time macro
              mov     ah,2ch
              int     21h
              endm


     set-time macro hour,minutes,seconds,hundredths
              mov     ch,hour
              mov     cl,minutes
              mov     dh,seconds
              mov     dl,hundredths
              mov     ah,2DH
              int     21H
              endm


     verify macro switch
              mov     al,switch
              mov     ah,2EH
              int     21H
              endm


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

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


     keep-process macro return-code,last-byte
              mov     al,return-code
              mov     dx,offset last-byte
              mov     cl,4
              shr     dx,cl
              inc     dx
              mov     ah,31H
              int     21H
              endm



                             - 167 -


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


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


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


     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


     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


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


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

                             - 168 -




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


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


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


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


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


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


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


                             - 169 -



     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


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


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


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

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


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


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


                             - 170 -



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


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


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


     xdup macro handle
              mov     bx,handle
              mov     ah,45H
              int     21H
              endm


     xdup2 macro handle1,handle2
              mov     bx,handle1
              mov     cx,handle2
              mov     ah,46H
              int     21H
              endm


     get-dir macro drive,buffer
              mov     dl,drive
              mov     si,offset buffer
              mov     ah,47H
              int     21H
              endm

     allocate-memory macro bytes
              mov     bx,bytes
              mov     cl,4
              shr     bx,cl
              inc     bx
              mov     ah,48H
              int     21H
              endm


                             - 171 -



     free-memory macro seg-addr
              mov     ax,seg-addr
              mov     es,ax
              mov     ah,49H
              int     21H
              endm


     set-block macro last-byte
              mov     bx,offset last-byte
              mov     cl,4
              shr     bx,cl
              add     bx,17
              mov     ah,4FH
              int     21H
              mov     ax,bx
              shl     ax,cl
              dec     ax
              mov     sp,ax
              mov     bp,sp
              endm


     exec macro path,command,parms
              mov     dx,offset path
              mov     bx,offset parms
              mov     word ptr parms[02H],offset command
              mov     word ptr parms[04H],cs
              mov     word ptr parms[06H],5CH
              mov     word ptr parms[08H],es
              mov     word ptr parms[0AH],6CH
              mov     word ptr parms[0CH],es
              mov     al,0
              mov     ah,4BH
              int     21H
              endm


     exec-ovl macro path,parms,seg-addr
              mov     dx,offset path
              mov     bx,offset parms
              mov     parms,seg-addr
              mov     parms[02H],seg-addr
              mov     al,3
              mov     ah,4BH
              int     21H
              endm


     end-process macro return-code
              mov     al,return-code
              mov     ah,4CH
              int     21H
              endm


     ret-code macro
              mov     ah,4DH
              int     21H
              endm

                             - 172 -




     end-process macro return-code
              mov     al,return-code
              mov     ah,4CH
              int     21H
              endm


     find-next-file macro
              mov     ah,4FH
              int     21H
              endm


     get-verify macro
              mov     ah,54H
              int     21H
              endm


     rename-file macro old-path,new-path
              mov     dx,offset old-path
              push    ds
              pop     es
              mov     di,offset new-path
              mov     ah,56H
              int     21H
              endm

     get-set-date-time macro handle,action,time,date
              mov     bx,handle
              mov     al,action
              mov     cx,word ptr time
              mov     dx,word ptr date
              mov     ah,57H
              int     21H
              endm


     alloc-strat macro code,strategy
              mov     bx,strategy
              mov     al,code
              mov     ah,58H
              int     21H
              endm


     get-error macro
               mov    ah,59H
               int    21H
               endm


     create-temp macro pathname,attrib
              mov     cx,attrib
              mov     dx,offset pathname
              mov     ah,5AH
              int     21H
              endm

                             - 173 -




     create-new macro pathname,attrib
              mov     cx,attrib
              mov     dx,offset pathname
              mov     ah,5BH
              int     21H
              endm


     lock macro handle,start,bytes
              mov     bx,handle
              mov     cx,word ptr start
              mov     dx,word ptr start+2
              mov     si,word ptr bytes
              mov     di,word ptr bytes+2
              mov     al,0
              mov     ah,5CH
              int     21H
              endm


     unlock macro handle,start,bytes
              mov     bx,handle
              mov     cx,word ptr start
              mov     dx,word ptr start+2
              mov     si,word ptr bytes
              mov     di,word ptr bytes+2
              mov     al,1
              mov     ah,5CH
              int     21H
              endm


     get-machine-name macro buffer
              mov     dx,offset buffer
              mov     al,0
              mov     ah,5EH
              int     21H
              endm


     printer-setup macro index,lgth,string
              mov     bx,index
              mov     cx,lgth
              mov     dx,offset string
              mov     al,2
              mov     ah,5EH
              int     21H
              endm


     get-list macro index,local,remote
              mov     bx,index
              mov     si,offset local
              mov     di,offset remote
              mov     al,2
              mov     ah,5FH
              int     21H
              endm

                             - 174 -




     redir macro device,value,source,destination
              mov     bl,device
              mov     cx,value
              mov     si,offset source
              mov     es,seg destination
              mov     di,offset destination
              mov     al,03H
              mov     ah,5FH
              int     21H
              endm


     cancel-redir macro local
              mov     si,offset local
              mov     al,4
              mov     ah,5FH
              int     21H
              endm


     get-psp macro
              mov     ah,62H
              int     21H
              endm



     ______________________
     ОБЩИЕ МАКРООПРЕДЕЛЕНИЯ
     ______________________


     DISPLAY-ASCIZ macro asciz-string
              local   search,found-it
              mov     bx,offset asciz-string
     search:  cmp     byte ptr [bx],0
              je      found-it
              inc     bx
              jmp short search
     found-it: mov    byte ptr[bx],"$"
              display asciz-string
              mov     byte ptr[bx],
              display-char 0DH
              display-char 0AH
              endm


     MOV-STRING macro source,destination,count
              push    es
              push    ds
              pop     es
              assume  es:code
              mov     si,offset source
              mov     di,offset destination
              mov     cx,count
          rep movs    es:destination,source
              assume  es:nothing
              pop     es
              endm

                             - 175 -




     CONVERT  macro value,base,destination
              local   table,start
              jmp     start
              table   db       "0123456789ABCDEF"
     start:   push    ax
              push    bx
              push    dx
              mov     al,value
              xor     ah,ah
              xor     bx,bx
              div     base
              mov     bl,al
              mov     al,cs:table[bx]
              mov     destination,al
              mov     bl,ah
              mov     al,cs:table[bx]
              mov     destination[1],al
              pop     dx
              pop     bx
              pop     ax
              endm


     CONVERT-TO-BINARY macro string,number,value
              local   ten,start,calc,mult,no-mult
              jmp     start
              ten     db       10
     start:   mov     value,0
              xor     cx,cx
              mov     cl,number
              xor     si,si
     calc:    xor     ax,ax
              mov     al,string[si]
              sub     al,48
              cmp     cx,2
              jl      no-mult
              push    cx
              dec     cx
     mult:    mul     cs:ten
              loop    mult
              pop     cx
     no-mult: add     value,ax
              inc     si
              loop    calc
              endm


     CONVERT-DATE macro dir-entry
              mov     dx,word ptr dir-entry[24]
              mov     cl,5
              shr     dl,cl
              mov     dh,dir-entry[24]
              and     dh,1FH
              xor     cx,cx
              mov     cl,dir-entry[25]
              shr     cl,1
              add     cx,1980
              endm

                             - 176 -




     PACK-DATE macro date
              local   set-bit
     ;
     ; На входе: DH=день, DL=месяц, СХ=(год-1980)
     ;
              sub     cx,1980
              push    cx
              mov     date,dh
              mov     cl,5
              shl     dl,cl
              pop     cx
              jnc     set-bit
              or      cl,80H
     set-bit: or      date,dl
              rol     cl,1
              mov     date[1],cl
              endm


© KOAP Open Portal 2000



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