BIOS. Форматирование жёсткого диска\заполнить нулями весь жёсткий диск. Прерывание 0x13

Всем привет
Нужна помощь по прерыванию 0x13 - BIOS
Не получается отформатировать жёсткий диск\заполнить нулями.
Вот код, но он не очищает весь диск, если у него большой размер (пробовал через директиву times добавлять размер, и на размере 5100000 байтов он не зачищает до конца (заполнял диск единицами, и смотрел, сколько он зачищает нулями)
Желательно, конечно, помочь с уже существующим кодом по прерыванию 0x13 / 0x3. Я знаю, что существует подфункция, специально предназначенная для форматирования диска, но я считаю её неудобной, поэтому до сих пор не разобрался с ней, и предпочитаю подфункцию для записи в диск буффера нулей
Собственно, главный код:

mov     ah, 0x08
mov     dx, 0x0080 ; Получаем информацию о диске (максимальный номер головки, сектора и т.д)
int     0x13
    
mov     dl, 0x80 ; Восстанавливаем номер жёсткого диска
dec     dh ; Корректируем номер головки
@@: 
call    .format_drive ; Начиная с конца головки, заполняем все секторы нулями
dec     dh
cmp     dh, 0xFF
jne     @b ; Заполняем секторы в головках с конца, пока она не будет равна 0 (загрузочный сектор тоже сотрётся, я знаю, мне это нужно)

Дополнительная функция format_drive. Функция заполняет все секторы в головке нулями:

.format_drive:
    pusha
    xor     cx, cx
@@: mov     ax, 0x0301
    inc     cx
    xor     bx, bx
    mov     es, bx
    mov     bx, buffer ; buffer db 512 dup(0)
    int     0x13
    jnc     @b ; Пишем нули, пока разрешают!
    popa
    ret

Заранее благодарен, кто подскажет более выгодный алгоритм по затиранию диска, потому что в Google я роюсь второй день, и ничего дельного не нашёл - хотя, попадалась программка на TASM с форума, которая форматирует диск на DOS, переписал её на BIOS и FASM, но всё равно ничего хорошего она сделать не смогла...


Ответы (1 шт):

Автор решения: x0r

Ответ на вопрос придёт в голову сам, если посмотреть на структуру жёсткого диска (пялился на него около 30 минут)

Нужно сделать 3 вложенных цикла, где делать инкремент:

  1. Сектора
  2. Головки \ Проверка на то, равна ли данная головка - максимальному номеру головок жёсткого диска - если да, тогда инкремент цилиндра, установить номер головки в 0, возврат к зачистке секторов \ возврат к зачистке секторов
  3. Цилиндра \ проверка на максимальный номер цилиндра - если да, закончить циклы, нет - зачистка секторов \ возврат к зачистке секторов

Так же установить начальные значения.
Тем самым, сначала зачистится максимальное кол-во секторов, 0-й цилиндр, 0-я головка
Потом делается инкремент головки, очистка кол-ва секторов, и возврат к секторам: максимальное кол-во секторов, 0, 1
Так до максимального кол-ва головок на жёстком диске, потом инкремент цилиндра, обнуление головок, и по-новой: максимальное кол-во секторов, 1, 0 | максимальное кол-во секторов, 1, 1 ... Так мы мы добьёмся того, что все секторы на каждой головке, и на каждом цилиндре будут зачищены. Объяснить это сложно, а код скинуть не могу. В общем: Смотрите сюда, и думайте, с чего нужно начать (с зачисткой секторов на каждой головке), и чем закончить (инкрементом цилиндра, проверкой на максимальное кол-во цилиндров, и по-новой зачистка секторов)

→ Ссылка