TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

3.2.1. Прерывание BIOS $13

В состав BIOS входит программа работы с диском, доступ к которой открывает программное прерывание $13. Подобно большинству других прерываний BIOS в прерывании $13 предусмотрено несколько функций, связанных с тем или иным конкретным действием. Эти функции определяются содержимым регистра АН и имеют смысл, указанный в табл.3.4.

Таблица 3.4 функции прерывания $13______________

 

Функция

Действие

Класс ПК

$00

Сбросить контроллер диска

PC,XT,AT,PS/2

$01

Получить статус диска

11

$02

Читать сектор

ii

$03

Записать сектор

"


Работа с диском на физическом уровне 67

 

$04

Проверить сектор

о

$05

Форматировать дорожку

"

$С6

форматировать дорожку ЖД

PC. XT

$07

форматировать ЖД

"

$08

Получить параметры диска

PC,XT,AT,PS/2

$09

Инициировать контроллер диска на основе дисковых таблиц

«

$ОА

Читать сектор с кодом коррекции

"

$ОВ

Записать сектор с кодом коррекции

"

$ОС

Позиционировать головки на нужный цилиндр

n

$OD

Сбросить контроллер диска

11

$ОЕ

Читать буфер сектора

PC, XT

$OF

Записать буфер сектора

"

$10

Получить состояние дисковода ЖД

PC,XT,AT,PS/2

$11

Осуществить рекалибровку дисковода ЖД

"

$12

Проверить память контроллера ЖД

PC, XT

$13

Проверить дисковод ЖД

11

$14

Проверить контроллер ЖД

PC,XT,AT,PS/2

$15

Получить тип и размер диска

AT,PS/2

$16

Проверить флаг дискеты

"

$17

Установить тип дискеты

и

$18

Установить среду для форматирования дискеты

"

$19

Парковать головки ЖД

"

$1А

форматировать ЖД с контроллером типа ESDI

"


Номер диска при обращении к прерыванию $13'указывается как целое число: если это число меньше $80, номер относится к приводу гибкого диска (0 означает первый привод ГД), если $80 или больше, к жесткому диску ($80 означает первый ЖД). Минимальный номер цилиндра и головки равен 0, а минимальный номер сектора равен 1.

Старший байт Пладший байт

h00671.jpg

Рис. 3.4. Структура номеров цилиндра и сектора для прерывания $13

Номер цилиндра/сектора передается через регистр СХ в упакованном виде (см. рис.3.4): номер сектора занимает младшие 6 бит регистра CL, в то время как биты 6 и 7 этого регистра рассматриваются как старшие биты номера цилиндра; младшие биты номера цилиндра задаются значением регистра СН.

Большинство функций прерывания $13 возвращает в флаге переноса CF признак обнаруженной ошибки (0 — нет ошибки, 1 — обнаружена ошиб — ка), а в регистре АН — код ошибки. Если это не оговаривается особо, код ошибки трактуется следующим образом (табл. 3.5):

Т а б л.и п. а 3.5 Значения кода ошибки для прерывания $13

 

Код

Значение


 

00

Нет ошибки

$01

Неправильная команда

$02

Не найдена адресная метка

$03

Попытка записи на диск, защищенный от записи

$'04

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

$05

Ошибка при сбросе ЖД

$06

Произошла замена дискеты (изменялось положение запора дискового привода)

$0-7

Неправильные параметры дисковода ЖД

$08

Переполнение канала прямого доступа к памяти (КПДП)

$09

Выход за границу 64 Кбайт при работе КПДП

$ОА

Обнаружен плохой сектор

$ОВ

Обнаружена плохая дорожка

$ОС

Неправильный номер дорожки

$OD

Неправильный номер сектора при форматировании

$OE

Обнаружена адресная метка управляющих данных

$OF

Ошибка КПДП

$10

Обнаружена ошибка в данных

$11

Данные скорректированы схемами контроля

$20

Сбой контроллера

$40

Сбой при поиске дорожки

$8t)

Программа не успевает обрабатывать данные (ошибка таймаута)

SAA

Не готов дисковод

$ВВ

Неизвестная ошибка

$СС

Сбой при записи

$ЕО

Ошибка регистра состояния

$FF

Ошибка операции чтения


Сбросить контроллер диска

Вход: АН = 0;

DL — номер диска.

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

Получить статус диска

Вход: АН = 1;

DL — номер диска. Выход: AL — признак ошиЬки предыдущего обращения к диску

(совпадает со значением АН в остальных функциях)

Функция $ 01 используется для анализа предыдущей дисковой операции. Передаваемый в регистре AL код завершения операции берется из области данных BIOS — из байта по адресу $0000 : $0441.

Читать/записать сектор

Вход: АН = 2 — читать сектор;

-= 3 — записать сектор, AL — количество секторов, которые нужно прочитать (записать);

СХ — цилиндр/сектор;

DH — номер головки;

DL — номер диска;

ES'.BX — адрес буфера.

Функции $02 и $03 используются соответственно для чтения и записи данных. Обмен данными с диском осуществляется порциями, кратными размеру сектора диска (для ДОС этот размер составляет 512 байт). При осуществлении операции используется контроллер прямого доступа к памяти (КПДП), схемы управления которым позволяют за одно обращение передать до 64 Кбайт данных, причем передача идет под управлением схем КПДП (без участия микропроцессора). КПДП не может проверить действительный размер буфера, выделенного для обмена данными с диском;

ответственность за неправильную длину буфера возлагается на программиста.

Функции $02 и $03 позволяют обратиться к любому физическому сектору (или группе смежных секторов). В частности, только с их помощью возможен доступ к сектору главного загрузчика. Если данные читаются (записываются) из нескольких секторов, т.е. если регистр AL > 1, обмен данными идет начиная с цилиндра и сектора, заданных в регистре СХ, по секторам до конца дорожки, далее по головкам до конца цилиндра, затем по цилиндрам.

Проверить сектор

Вход: АН" = 4;

AL — количество проверяемых секторов;

СХ — цилиндр/сектор;

DH — номер головки;

DL — номер диска.

С помощью функции $04 программа может убедиться в доступности указанных секторов. Данные проверяются по методу циклического контроля (CRC), однако обмен данными не осуществляется, поэтому при обращении к функции ей не нужен адрес буфера*. Перед обращением программа должна убедиться в готовности дисковода (мотор привода диска должен вращаться с рабочей скоростью), в противном случае будет установлен признак ошибки.

Форматировать дорожку

Вход: АН = 5;

AL — для ГД — количество секторов на дорожке, для ЖД — фактор чередования секторов;

СХ — цилиндр/сектор;

DH — номер головки;

DL — номер диска;

ES:BX — адрес данных для форматирования.

' На ПК, выпущенных до 15.11.85, буфер в ES:BX должен содержать эталон тестируемого сектора.

Функция форматирования дорожки $05 предназначена для начальной записи служебных данных на поверхность диска. При выполнении операции уничтожаются все ранее записанные на дорожке данные. За одно обращение к функции можно отформатировать только одну дорожку (или ее часть) — от указанного сектора и до конца дорожки. Для этой функции необходимо задать фактор чередования секторов и определенным образом подготовить буфер данных.

фактор чередования секторов определяет последовательность расположения секторов в пределах одной дорожки, фактор 1 означает последовательное расположение секторов в порядке их номеров — сначала сектор 1, за ним сектор 2 и т.д., т.е. в этом случае чередование отсутствует. Фактор 2 задает расположение секторов через один. Например, при 9 секторах на дорожке секторы будут следовать в порядке 1—6—2—7—3— 8—4—9—5. При последовательном расположении секторов может оказаться так, что процессор не будет успевать обрабатывать данные в смежных секторах за один оборот диска. В этом случае чередование секторов позволяет согласовать производительность процессора со скоростью обмена данными и за счет этого повысить общую скорость работы с диском.

Буфер данных для форматирования дискеты должен содержать NSec 4 — байтных элементов, где N5ec — количество форматируемых секторов. Иными словами, для каждого сектора необходимо подготовить 4 информационных байта, в которых указываются номера дорожки, головки, сектора и код длины сектора. Последний определяет размер сектора и может иметь следующие значения:

О - 128 байт 1-256 байт

2 - 512 байт

3 - 1024 байт

Порядок следования в этом буфере секторных номеров определяет фактор чередования. Например, если форматируются девять 512—байтных секторов на дорожке с номером $10, головка 1, фактор чередования 2, то буфер должен содержать следующие данные:

$10, $01, $01, $02, $10, $01, $06, $02, $10, $01, $02, $02, $10, $01, $07, $02, $10, $01, $03, $02, $10, $01, $08, $02, $10, $01, $04, $02, $10, $01, $09, $02, $10, $01, $05, $02

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

Таблица параметров дискеты (ТПД) — это 11—байтный информационный блок, начало которого указывает вектор прерывания $1Е. Этот блок содержит некоторые константы, которые используются драйвером диска для управления дисководом. Структура ТПД:

type

DPT = record

StepRTm: Byte; {Задержка переключения головок} DMA : Byte; {Признак использования КПДП} DrvOff : Byte; {Задержка выключения двигателя} SectSiz: Byte; {Код размера сектора} SectCnt: Byte; {Количество секторов на дорожке} GapSize: Byte; {Длина межсекторного промежутка} DataSiz: Byte; {Максимальная длина передаваемых данных} GapFSiz: Byte; {Межсекторный интервал для форматирования} FillChr: Byte; {Символ-заполнитель для форматирования} HeadTm : Byte; {Время установки головок} StartTm: Byte; {Время запуска двигателя} end;

Большинство полей ТПД содержит оптимальные технические параметры ГД, которые не следует изменять. Исключение составляют поля SectSiz, SectCnt и FillChr. Поле SectSiz содержит код длины сектора. Поскольку MS-DOS работает только с 512—байтными секторами, это поле имеет значение 2 во всех случаях, кроме специальных средств защиты программ (подробнее см. гл.7). Поле SectCnt должно содержать количество секторов на дорожке. Это поле может изменяться, если привод ГД позволяет работать с дискетами разного формата. Например, контроллеры ГД для дискет диаметром 5'/4 дюйма могут работать в режиме DSHD (емкость дискеты 1.2 Мбайт) и DSDD (360 Кбайт). В первом случае на дорожке размещается 15, а во втором — 9 секторов, поэтому при переходе с одного формата дискет на другой необходимо нужным образом скорректировать поле SectCnt. Наконец, символ—заполнитель FillChr может быть любым символом в диапазоне ASCII— кодов О...255. Этот символ записывается в область данных при форматировании. Изменение полей ТПД обычно требуется лишь в особых режимах форматирования, используемых для защиты программ от нелегального копирования. Если Вы захотите по— экспериментировать с нестандартными значениями ТПД, учтите, что в некоторых случаях вектор $1Е содержит адрес таблицы, размещенной в ПЗУ. Изменить такую таблицу, разумеется, невозможно, поэтому следует скопировать ТПД в оперативную память, изменить в этой копии нужные параметры и установить в векторе $1Е адрес новой таблицы.

Скорость передачи данных изменяется для контроллеров, рассчитанных на разные форматы дискет, и устанавливается функцией $18 (см. ниже).

Для жесткого диска буфер форматирования всегда имеет длину 256 2— байтных слов. Младший байт каждого слова содержит признак хорошего сектора (0, если сектор хороший, и $80, если плохой), а старший — номер сектора. Как и в случае дискет, порядок следования секторных номеров определяет фактор чередования.

•Замечу, что буфер формата задается только для ПК класса IBM AT. На машинах IBM XT при форматировании жесткого диска фактор чередования указывается в регистре AL.

Форматировать одну или несколько дорожек жесткого диска

Вход: АН = 6 — форматировать одну дорожку;

= 7 — форматировать до конца диска;

AL — фактор чередования секторов;

СХ цилиндр/сектор;

DH — номер головки;

DL — номер диска;

ES:BX — адрес буфера.

Для форматирования жесткого диска могут использоваться специальные функции $06 и $07, параметры обращения к которым совпадают с параметрами функции $05. Функция $06 форматирует одну дорожку, а функция $07 — все дорожки, начиная с указанной в регистре СХ.

Получить параметры диска

Вход: АН = 8;

DL — номер диска.

Выход: BL — тип дисковода (только для AT и PS/2};

DL — количество обслуживаемых контроллером ЖД;

DH — максимальный номер головки;

СХ — максимальный номер цилиндра/сектора;

ES-.DI — адрес таблицы параметров дисковода. С помощью функции $08 программа может определить тип дисковода и

другие его параметры. Тип дисковода возвращается в регистре BL и может

иметь одно из следующих значений:

1 - 360 Кбайт, 40 дорожек, 51/^ дюйма 2-1.2 Мбайт, 80 дорожек, 51/^ дюйма 3 - 720 Кбайт, 80 дорожек, З1/^ дюйма 4-1.4 Мбайт, 80 дорожек, З1/; дюйма

Инициировать контроллер диска на основе дисковых таблиц

Вход: АН = 9;

DL — номер диска.

Функцию инициации контроллера $09 применяют после модификации таблиц параметров жесткого диска. BIOS читает таблицу параметров и нужным образом настраивает контроллер. Таблица параметров первого жесткого диска указывается вектором прерывания $41, а второго (если он есть в ПК) — вектором $46.

Читать/записать сектор с кодом коррекци и

Вход: АН = $ОА — читать сектор;

= SOB — записать сектор;

AL — количество читаемых/ записываемых секторов, СХ цилиндр/сектор;

DH — номер головки;

DL — номер диска;

ES'.BX — адрес буфера.

Функции $ОА и $ОВ отличаются от функций $02 и $03 только тем, что дополнительно считывается (записывается) 4—байтный код циклического контроля (CRC), используемый для контроля и коррекции данных.

Позиционировать головки на нужный цилиндр

Вход: АН = $ОС;

СХ — цилиндр/сектор;

DH — номер головки;

DL — номер диска.

С помощью функции $ОС программа может установить головки диска на нужную дорожку. Замечу, что функции чтения и записи данных не требуют предварительного позиционирования головок — они делают это самостоятельно.

Сбросить контроллер диска

Вход: АН = $OD

DL — номер диска

Если программе необходимо сбросить только контроллер ЖД, она может вызвать функцию $OD прерывания $13. В отличие от этого описанная ранее функция 0 сбрасывает все контроллеры, в том числе и контроллер ГД.

Читать/записать буфер сектора

Вход: АН = $ОЕ — читать буфер;

= $OF — записать буфер;

AL — количество читаемых/записываемых секторов;

СХ — цилиндр/сектор;

DH — номер головки;

DL — номер диска;

ES'.BX - адрес буфера.

Контроллеры ЖД в компьютерах PC и XT содержат внутренний буфер данных. Функция $ОЕ читает данные из этого буфера, а функция $ОР записывает данные в буфер контроллера, физического обращения к диску ни в том, ни в другом случае не происходит.

Получить состояние дисковода жесткого диска

Вход: АН = $10;

DL — номер диска.

О готовности диска можно судить по значению байта состояния, возвращаемого в регистре АН. Это значение совпадает с байтом состояния функции $01.

Рекалибровка дисковода жесткого диска

Вход: АН = $11;

DL — номер диска.

Рекалибровка дисковода, осуществляемая функцией $11, заключается в позиционировании головок диска на нулевую дорожку. Дополнительно в регистре АН возвращается байт состояния дисковода.

Проверка памяти контроллера жесткого диска

Вход: АН = $12;

DL — номер диска.

Функция $12 предназначена для запуска встроенной диагностики дискового контроллера. Она проверяет внутренний буфер сектора и возвращает байт состояния диска. Аналогичные действия осуществляют также функции $13 и $14.

Проверка дисковода жесткого диска

Вход: АН == $13;

DL — номер диска. См. функцию $12.

/ Проверка контроллера жесткого диска

Вход: АН = $14. См. функцию $12.

Получить тип и размер диска

Вход: АН = $15;

DL — номер диска. Выход: АН — тип дисковода;

CX:DX — количество секторов размером 512 байт. Тип дисковода, возвращаемый в регистре АН функцией $15, соответствует следующим значениям:

О - диск отсутствует

1 - ГД без аппаратных средств обнаружения замены дискеты

2 - ГД с контролем замены дискеты

3 - ЖД

Проверить флаг дискеты

Вход: АН = $16;

DL — номер диска. Выход: АН — признак замены дискеты:

О — дискета не менялась;

6 — дискета была заменена.

Контроль замены дискеты осуществляется схемами контроллера ГД по состоянию запора дискеты. Функция $16 возвращает в регистре АН при

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

Установить тип дискеты

Вход: АН = $17;

AL — устанавливаемый тип дискеты;

DL — номер диска.

При обращении к функции $17 в регистре AL необходимо установить одно из следующих значений:

О - не используется

1 - дискета 360 Кбайт в дисководе 360 Кбайт

2 - дискета 360 Кбайт в дисководе 1.2 Мбайт

3 - дискета 1.2 Мбайт в дисководе 1.2 Мбайт

4 - дискета 720 Кбайт в дисководе 720 Кбайт

Функция сбрасывает флаг замены дискеты и настраивает контроллер ГД на нужную скорость передачи данных.

Установить среду для форматирования дискеты

Вход: АН = $18;

DL — номер диска;

СХ — количество цилиндров/секторов. Выход: CF — признак ошибки:

О — нет ошибки;

I — есть ошибка;

АН = код ошибки:

О — требуемое количество цилиндров/секторов допустимо;

$01 — функция недоступна;

$ОС — функция не поддерживается или неизвестен

тип дисковода;

$80 — не установлена дискета. Перед форматированием дорожки ГД контроллер диска должен быть настроен на нужную скорость передачи данных. Это достигается обращением к функции $18, которая дополнительно сбрасывает флаг замены дискеты.

Парковка головок жесткого диска

Вход: АН = $19;

DL — номер диска.

Парковка диска заключается в выводе головок за рабочую зону с тем, чтобы предотвратить возможную порчу поверхности дисков при транспортировке компьютера. Эту операцию реализует функция $19.

Форматирование жесткого диска с контроллером типа ESDI

Вход: АН = $1А;

AL — количество элементов в таблице дефектов;

DL — номер диска;

CL — режим форматирования;

ES:BX — адрес таблицы дефектов. Выход: CF, АН — признак и код ошибки

Если диск работает под управлением контроллера с интерфейсом ESDI, для его форматирования используется функция $1А. Эта функция поддерживает таблицу дефектных дорожек и имеет несколько режимов форматирования в зависимости от содержимого регистра CL при обращении к функции:

бит 0=1— игнорировать первичную таблицу дефектов;

бит 1=1— игнорировать вторичную таблицу дефектов;

бит 2=1— обновить вторичную таблицу дефектов;

бит 3=1— выполнить анализ поверхности;

бит 4=1— периодически генерировать прерывание $15;

биты 5...7 — должны быть равны 0.

При установке бита 2 регистра CL содержимое вторичной таблицы дефектов обновляется — в нее заносятся результаты тестирования диска. Для углубленного анализа поверхности диска вначале выполняется форматирование с битом 3=0, а затем анализ поверхности с битом 3=1.

Если при форматировании бит 4=1, то после форматирования очередной дорожки BIOS генерирует прерывание $15 с регистром АН=$ОР. Это прерывание можно использовать для индикации процесса форматирования или для прекращения операции по требованию пользователя.

 

Глава 3

Оглавление

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz