Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дискета

628
05 февраля 2002 года
Vadim
7 / / 20.03.2000
Я хочу написать прогу форматирующую дискету,
с помощью 13 прерывания и без него. Как это сделать?
461
07 февраля 2002 года
gerard
102 / / 20.12.1999
Через INT 13h все достаточно просто:

Вход:
AH = 05h (функция форматирования дорожки)
AL - число секторов на дорожке
CH - номер цилиндра (0 - 79)
DH - номер головки (0 или 1)
DL - номер устройства (0 - A, 1 - B и т.д.)
ES:BX - адрес буфера информации для форматирования. Он состоит из 4-байтных элементов, содержащих номер цилиндра, номер головки, номер сектора и код размера сектора (0 - 128 байт, 1 - 256, 2 - 512, 3 - 1024). Каждый из этих элементов записывается в начало очередного форматируемого сектора, поэтому их число должно равнятся числу секторов. При стандартном форматировании номера цилиндра, головки и сектора в элементе должны соответствовать фактическим.
В противном случае дорожку можно будет прочитать только с помощью специальных средств (что, кстати, часто используется при создании ключевых дискет).
Выход:
AH - код завершения
CF = 1, если была ошибка

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

Если без INT 13h, то нужно действовать прямо через регистры контроллера НГМД (i8272):

3F2h - регистр управления (только запись)
биты 0,1 - номер привода
бит 2 - включение контроллера
бит 3 - разрешение DMA и прерываний
биты 4-7 - включить двигатель соответствующего привода

3F4h - регистр состояния (только чтение)
биты 0-3 - соотвтествующий привод занят
бит 4 - контроллер занят
бит 5 - режим DMA (0) или не-DMA (1)
бит 6 - запись данных (0)/чтение данных (1)
бит 7 - готовность к передаче данных

3F5h - основной регистр команд/данных. В него посылается код команды, затем параметры
команды (если нужно), затем данные (если нужно). После посылки каждого байта нужно проверять бит 7 регистра состояния, пока он не станет равным 1, потом посылать следующий байт.

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

Обычно контроллер возвращает содержимое четырех регистров состояния (ST), имеющих следующий формат:

регистр ST0
биты 0,1 - номер привода
бит 2 - номер головки
бит 3 - привод не готов
бит 4 - ошибка поиска 0 дорожки
бит 5 - конец позиционирования
биты 6,7 - код завершения
0 - нормально, 1 -ошибка, 2 - недопустимый код команды, 3 - сброс готовности привода

регистр ST1
бит 0 - ошибка поиска адресного маркера
бит 1 - попытка записи на защищенный диск
бит 2 - сектор не найден
бит 3 - всегда 0
бит 4 - таймаут при передача данных
бит 5 - ошибка контрольной суммы
бит 6 - всегда 0
бит 7 - попытка перехода через границу цилиндра

регистр ST2
бит 0 - ошибка поиска адресного маркера
бит 1 - плохой цилиндр
бит 2 - не найден сектор при операции сравнения
бит 3 - "равно" при операции сравнения
бит 4 - ошибка адреса цилиндра
бит 5 - ошибка контрольной суммы
бит 6 - чтение сектора удаленных данных
бит 7 - всегда 0

регистр ST3
биты 0,1 - номер привода
бит 2 - номер головки
бит 3 - двухсторонний диск
бит 4 - нулевая дорожка
бит 5 - готовность привода
бит 6 - защита записи на диск
бит 7 - ошибка привода

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

1) 0Fh - код команды позиционирования
2) номер привода (биты 0,1) и головки (бит 2)
3) номер цилиндра
Эта команда не возвращает никаких данных

Затем запускается форматирование дорожки с помощью следующей последовательности байт:

1) 0Dh (для одинарной плотности) или 4Dh (для двойной) - код команды форматирования
2) номер привода (биты 0,1) и головки (бит 2)
3) код размера сектора (0 - 128 байт, 1 - 256, 2 - 512, 3 - 1024)
4) число секторов на дорожке
5) длина промежутка GAP между секторами
6) байт данных для заполнения секторов

Затем нужно передать контроллеру информацию для форматирования (в том же виде, как и для функции 05h прерывания INT 13h - по 4 байта на каждый сектор). Это можно делать через регистр данных (побайтно), либо прямо из памяти (с помощью контроллера ПДП).

После завершения операции через регистр данных возвращаются содержимое регистров состояния ST0-ST3, номер цилиндра, номер дорожки, номер сектора и код размера для последнего отформатированного сектора (всего 8 байт). Все они должны быть прочитаны, после чего можно переходить к следующей операции.
628
07 февраля 2002 года
Vadim
7 / / 20.03.2000
Большое спасибо. Такого исчерпывающего ответа я и не расчитывал получить.
555
11 февраля 2002 года
AcidJAM
25 / / 20.05.2000
ПРивет Всем !!!
Если есть исходы по работе с контроллером
напрямую, киньте на мыло пожалуйста.
А то сколько не бьюсь - не могу через порт
не в режиме DMA сектор считать, (не найдена
адресная метка сектора). Стандартные константы по диску 3"5 наверное неправильные,
а какие правильные я не знаю..

Best regardz from JAM
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог