Создание TSR программ в операционной системе MS DOS, страница 4

mov                               ah,03h                                ;команда SPECIFY

mov                               FDCOpCode,03h               ;запомним код команды SPECIFY

call                                OutFDC                             ;передадим в контроллер

jc                                   FatalErr                             ;неуспешно

mov                               ah,00Fh                              ;SRT + HUT для 360 в 1.2

call                                OutFDC                             ;передадим в контроллер

jc                                   FatalErr                             ;неуспешно

mov                               ah,02h                                ;HLT + ND

call                                OutFDC                             ;передадим в контроллер

jc                                   FatalErr                             ;неуспешно

 


Выполним команду Recalibrate (обязательно после сброса )

 


mov                               FDCOpCode,07h     ;запомним код команды Recalibrate

mov                               cx,2   ;количество повторов

;Примачание:

;!! для дисководов с 80

;!! цилиндрами за одну

;!! операцию головки могут

;!! не встать на цилиндр 0

RecalRestart:

cli                                  ;закроем маски

mov                               ah,07h          ;команда Recalibrate

call                                OutFDC        ;передадим в контроллер

jc                                   FatalErr        ;неуспешно

sub                                ah,ah ;устройство 0

call                                OutFDC        ;передадим в контроллер номерустройства

FatalErr                        ;неуспешно

and                                IntFlags,255-IntPres-IntMCA         ;сбросим состояние прерывания

sti                                  ;откроем маски

WaitInt                         ;ждем прерывание

FatalErr                        ;не дождались

;  снимем состояние прерываний

call                                Sensl ;опросим прерывание

jc                                   FatalErr        ;неуспешно

; проверим результат

mov                               ah,ST0                          ;регистр состояния 0

test                                ah,00100000b               ;операция завершена?

jz                                   RecalTry                       ;нет, повторим операцию

and                                ah,11000000b               ;выделим 6иты типа завершения

test                                ah,11000000b               ;успешно?

jz                                   RecalCompl                  ;да, на выход

RecalTry:

loop                               RecalRestart                 ;повторим

jmp                               FatalErr                        ;все же неуспешно

; успешно сделали: подождем успокоения головок (для привода 1.2 время

; успокоения состовляет 15 мс)

RecalCompl:

mov                               bx,18750      ; время успокоения в циклах таймера

; 15000 мкс/0.8 мкс

call                                WaitTimer2 ; подождем

 


; подготовим таблицу формата :

; 9 секторов  длиной 2, цилиндр 1, поверхность 0

 


mov                               si,WorkOff   ;адрес рабочей области

mov                               cx,9   ;количество секторов

; подготовим заголовок

mov                               byte ptr ds:[si],2                    ; размер сектора 2

mov                               byte ptr ds:[si+1],9                ; количество секторов 9

mov                               byte ptr ds:[si+2],80              ; размер GAP 3

mov                               byte ptr ds:[si+3],0F6h          ;символ-заполнитель

sub                                al,al                                       ;для номеров секторов

PrepForFormat:

inc                                 al      ;увеличим номер сектора

add                                si,4    ; увеличим адрес в таблица

;формата

mov                               byte ptr ds:[si],1                    ;цилиндр 1