Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)
Demon's Souls |#9| Heart of surprises

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Роберт Журден Весь текст 1069.56 Kb

Справочник программиста на IBM PC

Предыдущая страница Следующая страница
1 ... 57 58 59 60 61 62 63  64 65 66 67 68 69 70 ... 92
ны.
   Данный пример считывает одну запись и помещает ее в DTA:

;---в сегменте данных
FCB         DB    1,'OLDDATA    ', 25 DUP (0)

;---открываем файл и устанавливаем поля FCB
   MOV  AH,0FH           ;номер функции
   LEA  DX,FCB           ;DS:DX указывают на FCB
   MOV  BX,DX            ;копируем смещение FCB
   INT  21H              ;открываем файл
   MOV  AX,55            ;размер записи 55 байтов
   MOV  [BX]+14,AX       ;помещаем в поле размера записи
   MOV  AX,22            ;номер записи для чтения
   MOV  [BX]+33,AX       ;помещаем в поле номера записи
   MOV  AX,0             ;обнуляем старшее слово этого поля
   MOV  [BX]+35,AX       ;
;---перенос данных из файла в DTA
   MOV  AH,21H           ;номер функции чтения с прямым доступом
   LEA  DX,FCB           ;DS:DX указывают на FCB
   INT  21H              ;читаем данные, помещая их в DTA
   CMP  AL,0             ;проверка на ошибку
   JNE  READ_ERROR       ;
;---позднее, закрываем файл
   MOV  AH,10            ;номер функции закрытия файла
   LEA  DX,FCB           ;DS:DX указывают на FCB
   INT  21H              ;закрываем файл

   Для  чтения  блока последовательных записей в память  за  один
прием надо использовать функцию 27H прерывания 21H. Ее выполнение
подготавливается  в точности так же, как и функции 21H, за исклю-
чением того, что вдобавок CX должен содержать число записей кото-
рые надо прочитать за один прием. При возврате CX будет содержать
число реально  прочитанных  записей.  Значения  возвращаемые в AL
совпадают с теми, которые возвращаеются функцией 21H.  В  отличии
от функции 21H поля FCB, в  которых хранится информация о положе-
нии записи (поле записи прямого доступа, текущего блока и текущей
записи) автоматически увеличиваются, с тем чтобы они указывали на
следующую несчитанную запись после выполнения функции.
   Отметим,  что как в случае чтения одной, так и в случае чтения
нескольких записей,  поля  текущего  блока  и  текущей записи FCB
устанавливаются по значению поля записи прямого доступа.  Если Вы
знаете значение текущего блока и  текущей записи, а не соответст-
вующий  номер записи прямого доступа, то используйте функцию  24H
прерывания 21H, чтобы она  проделала  вычисления  за Вас.  У этой
функции нет входных регистров, надо только, чтобы DS:DX указывали
на открытый FCB.  При возврате  поле записи прямого доступа будет
заполнено значением, соответствующим установке двух других полей.

Метод дескриптора файлов:
   В  предыдущем разделе показано, как писать записи прямого дос-
тупа с помощью  метода  дескриптора  файлов.  Процедура чтения из
файла  с прямым доступом подготавливается совершенно  аналогичным
образом, путем  вычисления  смещения  в  файле, на которое должен
указывать файловый указатель.  DS:DX должны указывать на буфер, в
который будет помещена запись,  после чего надо выполнить функцию
3FH прерывания 21H.  При входе CX должен содержать размер записи,
а BX - номер файла.

;---в сегменте данных
HANDLE       DB    ?
FILEPATH     DB    'A:OLDDATA',0
REC_BUFFER   DB    30 DUP(?)

;---открываем файл
   MOV  AH,3DH          ;номер функции
   MOV  AL,0            ;код открытия для чтения
   LEA  DX,FILEPATH     ;DS:DX указывают на путь к файлу
   INT  21H             ;открываем файл
   JC   OPEN_ERROR      ;проверка на ошибку
   MOV  HANDLE,AX       ;запоминаем номер файла
;---вычисляем позицию записи и устанавливаем файловый указатель
   MOV  AX,30           ;размер записи
   MOV  CX,54           ;читаем запись #54 (55-ю запись)
   MUL  CX              ;смещение записи в DX:AX
   MOV  CX,DX           ;помещаем старшее слово смещения в DX
   MOV  DX,AX           ;помещаем младшее слово смещения в CX
   MOV  AL,0            ;устанавливаем указатель на начало файла
   MOV  AH,42H          ;функция установки указателя
   MOV  BX,HANDLE       ;номер файла
   INT  21H             ;устанавливаем указатель
   JC   POINTER_ERROR   ;обработка ошибки
;---читаем запись с прямым доступом
   MOV  AH,3FH          ;номер функции
   MOV  BX,HANDLE       ;номер файла
   MOV  CX,30           ;размер записи
   LEA  DX,REC_BUFFER   ;DS:DX указывают на буфер для записи
   INT  21H             ;читаем запись
   JC   READ_ERROR      ;обработка ошибки

;---позднее, закрываем файл
   MOV  BX,HANDLE       ;номер файла
   MOV  AH,3EH          ;функция закрытия файла
   INT  21H             ;закрываем файл
   JC   CLOSE_ERROR     ;проверка на ошибку
   5.4.7 Проверка данных после операций чтения/записи.

   MS DOS может  проверять  правильность  производимого  обмена с
диском прямо во время обмена.  Ошибки происходят настолько редко,
что средства проверки обычно не используются,  чтобы не замедлять
обмен с диском.  Однако, если это необходимо, то имеется два спо-
соба проверки. Один состоит  во  включении  команды VERIFY = ON в
файл  CONFIG.SYS,  который  автоматически читается  при  загрузке
операционной системы.   Впоследствии, все дисковые операции будут
проверяться.  Это единственный способ проверки доступный в Бейси-
ке.  Второй метод состоит  использовании  специальной функции DOS
для верификации только критических дисковых операций. Если проце-
дура верификации обнаруживает ошибку,  то она сообщает об условии
критической ошибки, как описано в [7.2.5].

   Средний уровень.

   Функция  2EH  прерывания 21H  включает и  выключает  проверку.
Поместите в AL 1 - для  включения  верификации и 0 - для выключе-
ния. DL также должно быть равно 0.  Затем надо выполнить прерыва-
ние. У этой функции нет выходных регистров.

;---включение верификации
   MOV  AL,1     ;номер кода
   MOV  DL,0     ;необходимый входной регистр
   MOV  AH,2EH   ;номер функции
   INT  21H      ;включаем проверку

   Для определения текущего режима верификации надо вызвать функ-
цию 54H прерывания 21H. У нее нет входных регистров. При возврате
AL = 1, если проверка включена и AL = 0, если выключена.
   5.4.8 Определение дисковых ошибок и восстановление после них.

   Дисковые операции настолько  сложны, что имеется большое коли-
чество возможных ошибок.  Большинство дисковых ошибок обсуждаются
вместе с операциями, при которых они  могут происходить. В данном
разделе они собраны вместе, чтобы помочь Вам при разработке  про-
цедуры общего назначения для  восстановления  после дисковых оши-
бок.
   Дисковые  ошибки бывают двух типов, которые мы будем  называть
мягкими (soft) и жесткими  (hard).  Мягкие ошибки возникают из-за
неправильного  запроса на доступ к файлу: запрошенный файл  может
отсутствовать или дисковое  пространство  может кончиться прежде,
чем  будет  записан весь файл.  С другой стороны, жесткие  ошибки
возникают при неверных последовательностях  или временных несоот-
ветствий  при дисковых операциях, которые могут  быть  следствием
неверного выравнивания или проблем с накопителем.  В этом случае,
лучше всего произвести сброс диска перед обработкой.

   Высокий уровень.

   В  [7.2.5] объяснено как подготовить процедуру обработки  оши-
бок.  Оператор ON ERROR  GOSUB  заставляет  программу  перейти на
процедуру обработки ошибки при возникновении критической  ошибки.
Процедура прежде всего определяет кодовый номер ошибки в Бейсике,
который для дисковых ошибок может быть одним из следующих:

   52      Bad file number.  (Hеверный номер файла.) Файл не отк-
           рыт под тем номером, к  которому  идет  обращение (#1,
           #2 и т.д.)
   53      File  not  found.  (Файл не найден.) Используется  при
           выполнении операторов LOAD, KILL, NAME, FILES и OPEN.
   54      Bad file mode.  (Hеверный режим доступа.) Попытка дос-
           тупа  к файлу другим образом, по сравнению с тем,  для
           чего он был открыт,  например, попытка записи в после-
           довательный файл, открытый для чтения.
   55      File already open.  (Файл уже открыт.) Попытка открыть
           файл, который уже открыт, или  уничтожить (KILL) файл,
           который еще не закрыт.
   58      File  already exists.  (Файл уже существует.)  Попытка
           переименовать файл  (с  помощью  NAME) на имя, которое
           уже есть в каталоге.
   61      Disk full.  (Диск полон.) См. специальное обсуждение в
           [5.1.4], относящееся к этой ошибке.
   62      Input past end.   (Чтение  за  концом  файла.) Попытка
           прочитать  из последовательного файла больше  перемен-
           ных, чем он содержит.   Чтобы избежать этой ошибки ис-
           пользуйте функцию EOF, как объяснено в [5.4.4].
   63      Bad  record number.  (Hеверный номер записи.)  Попытка
           прочитать или записать  запись  с номером большим, чем
           число записей в файле.
   64      Bad  file  name.  (Hеверное имя  файла.)  Используется
           операторами KILL, NAME и FILES.
   67      Too many files.   (Слишком  много  файлов.) В каталоге
           больше нет места для записи информации о файлах.  Дру-
           гой возможный вариант состоит  в том, что открытие еще
           одного  файла  приведет к тому,  что  будет  превышено
           максимально  допустимое  число  одновременно  открытых
           файлов.
   70      Disk is write-protected. (Диск защищен от записи.)
   71      Disk is not ready. (Диск не готов.) Hаиболее вероятно,
           не закрыт дисковод с дискетой.
   72      Disk media error. (Диск  поврежден.)  Kак правило, это
           сообщение  выдается  при повреждении  дискеты,  однако
           иногда оно появляется при сбоях оборудования.
   74      Specified wrong disk  in   RENAME  operation.  (Указан
           неверный диск в операции RENAME.)
   75      Path/file  access  error.  (Ошибка  доступа к  файлу.)
           Попытка открыть подкаталог  или  метку тома, как файл.
           Или  попытка писать в файл, который защищен от записи.
           Эта ошибка чаще  всего  выдается  при  попытке удалить
           текущий каталог.  Появляется при операциях OPEN, NAME,
           MKDIR, CHDIR и RMDIR.
   76      Path not found.  (Путь не найден.) Hеправильно  указан
           путь или его не существует.   Появляется при операциях
           OPEN, MKDIR, CHDIR и RMDIR.

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

100 ON ERROR GOSUB 5000         '
 .
 .
600 '''
 .
 .
5000 '''
5010 IF ERR = 61 PRINT "Disk full": GOTO 5100
5020 IF ERR = 70 PRINT "Disk is write protected": GOTO 5100
 .
 .
5100 PRINT "Correct the problem, then strike any key"
5110 C$ = INKEY$: IF C$ = "" THEN 5110
5120 RESUME 600

   Средний уровень.

   Функция 1 прерывания 13H  возвращает  в AL байт, дающий статус
дискового накопителя. Значение его битов следующее:
   биты 0-1   01 = неверная команда, или, если бит 3 = 1, то
                   попытка обмена данными за границей 64K
              10 = адресная метка не найдена
              11 = попытка записи на защищенный от записи диск
          2   1  = указанный сектор не найден
          3   1  = переполнение DMA (потеря данных при обмене),
                   или, если бит 0 = 1, то попытка обмена дан-
                   ными за границей 64K
          4   1  = данные прочитаны неверно, надо повторить
          5   1  = ошибка контроллера
          6   1  = ошибка операции поиска
          7   1  = нет ответа от накопителя (тайм-аут)
Предыдущая страница Следующая страница
1 ... 57 58 59 60 61 62 63  64 65 66 67 68 69 70 ... 92
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (1)

Реклама