int 13h
- это подходящий способ сделать это, но вместо вызова службы DOS вы фактически используете его для вызова службы ROM BIOS. Я не думаю, что DOS предоставляет любую услугу для форматирования диска. Прикладная программа обычно оставляет такую низкоуровневую манипуляцию FAT с операционной системой, используя только предоставляемые ОС службы для выполнения операций чтения/записи высокого уровня.
В частности, int 13h
, сервис 05h
форматирует дисковый трек. (Сервисный номер отправляется в регистр AH
при вызове прерывания.) Обратите внимание, что эта служба форматирует одиночный трек, а не весь диск одновременно. Вы должны вызвать эту службу несколько раз, чтобы отформатировать весь диск. Самое приятное в этом - это то, что он позволяет вам указывать разные характеристики для каждого трека и даже каждого сектора на треке (некоторые схемы защиты от копирования в старой школе использовали это, создавая треки с форматированием oddball).
Параметры для службы 05h
в основном такие же, как и для любой другой службы чтения/записи на диске, за исключением того, что вам не нужно указывать номер сектора (обычно передается в CL
), поскольку вы не можете отформатировать отдельные сектора. Вот список необходимых параметров для флоппи-дисков, услуг: номер
- диска: номер
DL
- головки:
DH
- номер цилиндра:
CH
- сектора номер:
CL
(не используются для формата!)
- количество секторов:
AL
- адрес буфера:
ES:BX
Если прерывание возвращается с флагом переноса (CF
) Ясно, то ошибки не произошло, и AH
регистр будет содержать 0. Если CF
установлен, то произошла ошибка, и AH
регистр содержит код ошибки.
По словам Питера Нортона, из Руководство Нового программиста к ПК IBM и PS/2:
Каждый сектор на дискете дорожки имеет 4 описательные байты, связанные с ним. Вы определяете эти 4 байта для каждого сектора, которые должны быть отформатированы путем создания таблицы из 4-байтовых групп и передачи адреса таблицы в паре регистров ES:BX
. Когда вы форматируете дорожку диска, 4-байтовые группы записываются на дискету непосредственно перед отдельными секторами на дорожке.4 байта данных, связанных с сектором на диске, известны как адресные знаки и используются контроллером диска для идентификации отдельных секторов во время операций чтения, записи и проверки. 4 байта называются C для цилиндра, H для головы, R для записи (или номер сектора) и N для количества байтов на сектор (также называемый кодом ).
Когда сектор читается или записывается, контроллер дискеты ищет дорожку дискеты для идентификатора сектора, основной частью которого является R, номер записи или сектора. Параметры цилиндра и головки на самом деле не нужны в этом знаке адреса, потому что головка чтения/записи позиционируется механически на соответствующей дорожке, а сторона выбирается в электронном виде, но они записываются и проверяются как проверка безопасности.
код размера (N), может принимать любые одно из четырех стандартных значений, показанных ниже:
N | Sector Size (bytes) | Sector Size (KB)
–––––|–––––––––––––––––––––|–––––––––––––––––
0 | 128 | 1/8
1 | 256 | 1/4
2 | 512 | 1/2
3 | 1024 | 1
Нормальная настройка код 2 (512 байт).
Весь процесс форматирования дорожки дискеты довольно сложный и включает в себя чуть больше, чем просто вызов службы 05h
. Вам нужно сделать следующее:
Позвони 17h
установить тип дискеты для форматирования. (Это нужно сделать только один раз, перед началом операции.)
Служба звонков 18h
для установки типа носителя для формата.
Создайте таблицу меток адреса для отформатированной дорожки способом, описанным в приведенной выше цитате. В таблице для каждого сектора должна быть запись в 4 байта.
Наконец, позвоните в службу поддержки 05h
, чтобы отформатировать трек.
Дополнительно, позвоните по телефону 04h
, чтобы проверить процесс форматирования. Это проверяет, что сектор можно найти и прочитать, и что циклическая проверка избыточности (CRC) верна. DOS format.com
делает это для проверки каждого трека после его форматирования, но дисковые накопители обычно достаточно надежны, что проверка действительно не требуется.
Все эти дисковые операции ввода/вывода услуг используют одни и те же параметры, что были перечислены выше, хотя, как с обслуживанием 05h
, некоторые из них могут быть проигнорированы. Поиск в Интернете для руководства по прерыванию для получения более подробной информации. Например, here is a complete list of ROM BIOS disk I/O services. И here is another. Вышеупомянутый руководитель Peter Norton также превосходный, если вы можете найти старую копию, лежащую где-то, например maybe Amazon?
(Обратите внимание, что все немного отличается для форматирования жестких дисков, а также для ESDI дисков в PS/2s, вы должны использовать совершенно иную услугу formatting- 1Ah
.)
Update: Оказалось, что для этого может быть DOS API. К сожалению, я не знаю, что это действительно делает вещи намного проще. Ключ должен использовать IOCTL.
API IOCTL определяется DOS, но на самом деле он реализуется/обрабатывается драйверами устройств, что означает, что поддержка определяется поставщиком и версией драйвера, а не версией DOS. Если вы используете среду VM, она должна поддерживать это, но я ее не протестировал.
функция DOS 44h
это устройство ввода/вывода управления (IOCTL), так что вы установите AH
в 44h
перед вызовом INT 21h
(прерывание DOS).
Для форматирования вы хотите IOCTL для блочных устройств. Для функций блока IOCTL требуется, по крайней мере, DOS 3.2 или более поздняя версия (для некоторых требуются еще более высокие версии). Они позволяют одновременно получать доступ к целым трекам, но также поддерживают функцию форматирования. Доступ к ним осуществляется с использованием подфункции 0Dh
, поэтому вы должны установить AL
в 0Dh
.
Сложив это вместе, вы просто установите AX
на номер 440Dh
и позвоните по телефону INT 21h
. младший код для функции формата 42h
, который находится в CL
.
Таким образом, функция DOS, блок IOCTL для форматирования дорожки на логическом диске будет называться следующим образом:
AX
== 440Dh
CL
== 42h
CH
== 08h
(категория блочного устройства)
BX
== номер привода (0 = по умолчанию, 1 = A :, 2 = B :, и т. д.)
DS:DX
== адрес в IoctlFmtVrfyTrackRec
структуры, которая указывает номер головки и блока цилиндров, чтобы быть отформатирован
Если флаг переноса устанавливается, когда функция возвращает, то AX
содержит код ошибки.
К сожалению, я не могу найти документацию для IoctlFmtVrfyTrackRec
в Интернете, кроме this page. Этот материал предшествовал сети, и очень мало было загружено там. :-(Вы действительно нуждаетесь в книге, как Advanced MS-DOS Programming, что у меня нет копии, либо.
Я сделал удалось повернуть вверх this document on Scribd, который утверждает, что реализация формата с использованием IOCTL, написанный Пьер Desloover. Я не проверял.
Чтобы предотвратить вопрос от закрытия, пожалуйста, изменить в коде, который вы написали и пытался, но не работает. –
Fixed, спасибо. @Joshua я хочу учиться сбору, я люблю программировать. – MendaxRox
@MendaxRox: Начните с более простой проблемы. Форматирование дискет затруднено на любом языке. – Joshua