Команда форматирования инициализирует новую дискету. Когда вы
инициализируете дискету, происходит запись на нее маркеров
идентификации секторов. Эти поля контроллер использует при
операциях чтения и записи для опознавания секторов. Например, во
время операции чтения BIOS посылает четыре байта идентификации
сектора в контроллер дисковода. Эти четыре байта обычно
соответствуют номеру дорожки, номеру головки, номеру сектора и
размеру сектора, и называются номером цилиндра-головки-записи CHRN.
Контроллер использует значение номера CHRN сравнивая его со
значениями, записанными в поля идентификации секторов во время
форматирования.
Это означает, что контроллер не обращает внимания на то, что
записано в поле номера CHRN на дискете, т.е. сектора могут
пронумерованы в произвольном порядке, не от первого до восьмого на
каждой дорожке. Как только контроллер находит сектор, у которого
поле номера CHRN совпадает с заданным, он читает сектор. Значения
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:06:20
Фиг. 9.5 Форматирование дискеты Page 1-1
PAGE ,132
TITLE Фиг. 9.5 Форматирование дискеты
0000 STACK SEGMENT STACK
0000 0040[ DW 64 DUP (?)
????
]
0080 STACK ENDS
0000 CODE SEGMENT
ASSUME CS:CODE,ES:CODE
0000 00 00 01 02 00 00 02 ID_BUFFER DB 0, 0, 1, 2, 0, 0, 2, 2
02
0008 00 00 03 02 00 00 04 DB 0, 0, 3, 2, 0, 0, 4, 2
02
0010 00 00 05 02 00 00 06 DB 0, 0, 5, 2, 0, 0, 6, 2
02
0018 00 00 07 02 00 00 08 DB 0, 0, 7, 2, 0, 0, 8, 2
02
0020 FORMAT PROC FAR
0020 1E PUSH DS ; Адрес возврата в ДОС
0021 2B C0 SUB AX, AX
0023 50 PUSH AX
0024 8D 1E 0000 R LEA BX, ID_BUFFER ; Занесение адреса буфера в ES:BX
0028 0E PUSH CS
0029 07 POP ES
002A B9 0001 MOV CX, 1 ; Трек 0, сектор 1
002D BA 0000 MOV DX, 0 ; Дисковод 0, сторона 0
0030 TRACK_LOOP:
0030 8D 3E 0000 R LEA DI, ID_BUFFER ; Необходимо для занесения номера
0034 B0 08 MOV AL, 8 ; трека в буфер форматирования
0036 ID_SETUP:
0036 26: 88 2D MOV ES:[DI], CH ; Занесение номера трека (цилиндра)
0039 83 C7 04 ADD DI, 4 ; Переход на следующее поле
003C FE C8 DEC AL
003E 75 F6 JNZ ID_SETUP ; Цикл по полям в буфере
0040 B8 0501 MOV AX, 501H ; Форматирование
0043 CD 13 INT 13H
0045 FE C5 INC CH ; Переход на следующий трек
0047 80 FD 40 CMP CH, 40H ; Все сформатировано?
004A 75 E4 JNE TRACK_LOOP ; Цикл по трекам
004C CB RET ; Возврат в ДОС
004D FORMAT ENDP
004D CODE ENDS
END FORMAT
Фиг. 9.5 Форматирование дискеты
номера CHRN контроллер помещает на дискету во время операции
форматирования. Вы имеете возможность записать в качестве значений
номера CHRN любые значения, которые выберете. Буфер данных для
команды форматирования содержит байты номера CHRN для каждого
сектора дискеты. Это означает, что буфер данных может содержать
например такие значения:
DB 10,0,1,2,10,0,2,2
DB 10,0,3,2,10,0,4,2
для дорожки 10 стороны 0 дискеты. Это пример поля данных,
которое использует команда FORMAT операционной системы PC DOS или
MS DOS. На Фиг. 9.5 показана программа, которая форматирует
одностороннюю дискету с обычными значениями номера CHRN. Заменять
этой программой команду FORMAT операционной системы PC DOS нельзя,
так как система PC DOS также проверяет дискету и записывает на
дискету справочник и таблицу расположения файлов. Еще вы можете
заметить, что эта программа сразу же после запуска начинает
форматировать дискету в дисководе A:. Вы должны быть готовы к
этому, если собираетесь выполнить эту программу.
Вы можете использовать команду форматирования в том случае,
если хотите защитить дискету от копирования. Защита от копирования
означает, что дискета шифруется таким образом, что ее становится
трудно скопировать. Так как утилита DISKCOPY предполагает, что
идентификаторы секторов записаны обычным образом, она не может
копировать дискету с не стандартными номерами секторов. Записав на
дискету идентификатор сектора, отличный от нормального, вы защитите
ее от копирования.
В качестве примера давайте защитим дискету от копирования,
записав не стандартный номер сектора на дорожку 10. Пример,
приведенный выше, показывает обычные номера секторов. Если вместо
них буфер данных будет содержать значения DB 10, 0, 10, 2, 10, 0,
2, 2 DB 10, 0, 3, 2, 10, 0, 4, 2
дорожка 10 не будет иметь сектора 1. Вместо него на ней
появится сектор 10, которого не бывает на нормальной дискете
системы PC DOS. Программа DISKCOPY не может скопировать дорожку 10
правильно. Если теперь данная программа проверит (с помощью команды
проверки) наличие сектора 10 на дорожке 10 дискеты, отсутствие
ошибки будет означать, что дискета оригинальная, а не копия.
Этот способ защиты от копирования не совсем надежен. Каждый
опытный пользователь (и даже некоторые программы копирования) могут
обнаружить защиту такого типа и обойти ее. Но модификация
идентификаторов секторов не может производиться произвольно. Для
определения адреса установки головок BIOS использует номер дорожки
из поле CHRN, так что номер цилиндра должен соответствовать номеру
цилиндра, на котором находится сектор. Код в байте номера головки
определяет установку электронного переключателя, выбирающего
головку, поэтому это значение должно быть задано корректно. Длина
поля берется из таблицы параметров, а не из регистров при вызове,
так что ее изменить трудно. К тому же, это число использует и BIOS,
и контроллер, определяя длину сектора, так что изменить его вы
сможете только после тщательной подготовки. Свободно изменяемым
остается только номер сектора. Перед тем, как вы начнете изменять
номера секторов, запомните, что если при этом вы собираетесь еще
использовать эту дискету в рамках DOS, система будет пытаться
использовать сектор, который вы заменили сектором со своим
нестандартным номером, если вы не модифицируете таблицу
расположения файлов дискеты так, чтобы зарезервировать этот сектор.
Если вам нужно считывать по нескольку секторов (что позволяет
драйвер дисковода BIOS), номера у секторов должны быть
последовательными, но не обязательно начинаться с первого.
В общем, команда форматирования дает некоторое средство защиты
от копирования. Однако абсолютно надежный метод защиты еще не
найден. Только хороший выбор техники шифрования поможет оставить
честных людей честными.