# Контроллер НГМД i8272.

## Описание работы контроллера и системы команд. i8272

Батырев Александр
Лазарев Евгений
гр 454
Для доступа со стороны процессора контроллер 8272 имеет 2 регистра:

регистр состояния и регистр данных. Регистр состояния (Main Status Register) содержит информацию о состоянии контроллера и может быть считан процессором в любое время. Через регистр данных контроллера осуществляется доступ ко всем внутренним регистрам 8272, в него записываются команды и осуществляется обмен данными с диском. Регистр состояния можно только считывать. Для выбора одного из двух регистров используется вывод А0 8272 (выв.5). При А0=0 адресуется регистр состояния, при А0=1 адресуется регистр данных.

Формат регистра состояния:

RQM | DIO | NDM | CB | D3B | D2B | D1B | D0B
DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0

Описание разрядов регистра состояния:

RQM - Request For Master

информирует процессор о готовности к обмену данными по шине данных.

RQM = 1 - контроллер к обмену готов.

DIO - Data Input/Output

информирует процессор об ожидаемом направлении пересылки данных:

DIO = 1 - направление пересылки - в процессор (Read), DIO = 0 - направление пересылки - из процессора (Write).

NDM - Non DMA Mode

В режиме НЕ-ПДП бит NDM = 0 показывает, что закончена фаза исполнения команды.

CB - FDC Busy

Если бит CB = 1, это означает, что контроллер в данный момент занят - выполняется операция чтения/записи.

DB3..DB0 - Drive n Busy

Эти биты показывают состояние каждого из 4-х накопителей. Если содержимое бита = 1, значит для соответствующего накопителя в настоящее время выполняется команда Seek.

Общее описание контроллера.

В систему команд контроллера 8272 входит 15 команд. Каждая команда идентифицируется многобайтной пересылкой по шине данных в регистр данных контроллера. Результат выполнения команды также может быть многобайтным.

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

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

На фазах приказа и результата перед передачей каждого байта из/в регистр данных контроллера, процессор должен считывать содержимое регистра состояния контроллера. Биты RQM и DIO регистра состояния должны быть установлены в 1 и 0 соответственно перед тем, как очередной байт будет передан в контроллер. Многие команды являются много байтовыми, поэтому для них необходимо считывать и проверять регистр состояния перед пересылкой каждого байта в контроллер. На фазе результата биты RQM и DIO должны быть установлены в 1 перед чтением каждого байта из контроллера. Отметим, что чтение регистра состояния перед пересылкой каждого байта необходимо только на фазах приказа и результата.

На фазе исполнения регистр состояния считывать не нужно. Если контроллер находится в режиме NON DMA (НЕ-ПДП), появление очередного байта данных при чтении с диска сопровождается появлением сигнала прерывания INT=1. При появлении сигнала чтения (RD=0), сигнал прерывания сбрасывается и данные выдаются на шину данных. Например, если процессор не может обслуживать прерывания достаточно быстро (каждые 13 мксек. при двойной плотности), он может опрашивать регистр состояния и бит D7 (RQM) соответствует сигналу прерывания. При выполнении команды записи аналогично сигнал записи WR=0 сбрасывает прерывание.

Если контроллер находится в режиме DMA (ПДП), то прерывание на фазе исполнения не генерируется. Контроллер в этом случае выдает сигнал DRQ (запрос ПДП) когда появляется очередной байт данных. Контроллер ПДП отвечает на этот запрос сигналом подтверждения ПДП DACK=0 и RD=0. При появлении сигнала DACK сбрасывается сигнал DRQ. При выполнении операции записи вместо сигнала RD генерируется сигнал WR=0.

По окончании фазы исполнения (при появлении сигнала ТС - конец счета) генерируется прерывание, означающее начало фазы результата. При чтении первого байта результата сигнал прерывания сбрасывается.

Необходимо подчеркнуть, что на фазе результата все байты, указанные в таблице команд, должны быть считаны процессором. Например, команда чтения данных имеет 7 байт результата и все 7 байт должны быть считаны в порядке, указанном в таблице команд, для успешного завершения операции. Контроллер не воспримет следующую команду до тех пор, пока не будут считаны все 7 байт результата после выполнения команды чтения.

Контроллер 8272 содержит 5 регистров состояния: главный регистр состояния (Main Status Register) и регистры ST0-ST3. Главный регистр состояния (или просто регистр состояния) может быть считан процессором в любое время. Регистры ST0-ST3 доступны процессору только на фазе результата и могут быть считаны им после завершения некоторой команды. Конкретная команда определяет, сколько и какие регистры могут и должны быть считаны.

Байты данных, записываемые в контроллер на фазе приказа и считываемые из него на фазе результата, должны следовать в порядке, указанном в таблице команд. Изменение этих последовательностей не допускается. После получения последнего байта команды контроллер автоматически начинает выполнять команду, переходя к фазе исполнения. После того, как на фазе результата считывается последний байт, контроллер считает эту команду завершенной и готов к обработке следующей команды. Команда может быть прекращена только подачей сигнала конца счета ТС=1. Это удобное средство для "привлечения внимания" контроллера в критических ситуациях.

После передачи в контроллер команды Specify, шины выбора накопителя начинают автоматически сканироваться в промежутках между командами (а также между импульсами шага в команде Seek). Контроллер опрашивает состояние сигнала готовности Ready всех 4-х накопителей. Если сигнал Ready изменяет свое состояние (обычно из-за открытия дверки накопителя), контроллер генерирует прерывание. Процессор передачей команды Sense Interrupt Status считывает содержимое регистра ST0 и по биту NR (Not Ready) регистра ST0 определяет состояние накопителя.

Описание команд 8272.

На фазе приказа перед вводом каждого байта должен опрашиваться регистр состояния 8272. При этом биты DIO (D6) и RQM (D7) должны иметь значения 0 и 1 соответственно перед записью каждого байта команды в контроллер. Начало фазы выполнения вызывает установку этих битов в 1 и 0 соответственно.

Read Data - Чтение данных

Для задания этой команды в контроллер передается последовательность из 9 байт (см. таблицу команд). После получения этой последовательности контроллер выдает сигнал подвода головки к поверхности диска (если она отведена), отрабатывает паузу для подвода головки (заданную в команде Specify) и начинает поиск адресной метки сектора, после чего считывает поле идентификатора сектора. Когда текущий номер сектора ("R"), хранящийся в регистре IDR совпадает с номером сектора, считанного с диска, контроллер начинает вводить данные из поля данных сектора и последовательно, байт за байтом, выдавать их на шину данных.

После окончания чтения сектора контроллер инкрементирует на 1 номер сектора и начинает считывать данные из следующего сектора. Такой обмен носит название мультисекторного. Выполнение команды может быть прекращено подачей сигнала TC (Terminal Count - конец счета). После принятия сигнала ТС контроллер прекращает передачи по шине данных, однако продолжает читать данные текущего сектора вплоть до байтов CRC-контроля, после чего операция прекращается.

Количество байт, подлежащих считыванию, зависит от значений битов MT, MFM и N, заданных в команде.

Бит МТ задает многодорожечный (multitrack) режим контроллера, позволяющий ему считывать данные с обеих сторон (дорожек) диска. В этом случае для указанного цилиндра будут переданы все сектора, начиная с сектора 1 стороны 0 и заканчивая последним сектором стороны 1. Заметим, что этот режим относится только к одному цилиндру.

В случае N=0 значение DTL определяет количество данных, которые контроллер должен трактовать как один сектор. Если DTL меньше истинного размера сектора, то данные из сектора после передачи DTL байт не передаются на шину данных. Контроллер же считывает сектор полностью, вплоть до байтов CRC контроля и, если это задано в команде, может продолжить мультисекторное чтение. Если N > 0, то значение DTL игнорируется и устанавливается в 0FFH.

После завершения чтения контроллер не отводит головку накопителя от поверхности диска до истечения интервала времени, указанного в команде Specify. Поэтому между двумя последовательными частыми обращениями головка остается прижатой к поверхности диска.

Если контроллер второй раз обнаруживает индексный импульс, не обнаружив правильного номера сектора (заданного R), он устанавливает флаг ND (No Data) в регистре ST1 и заканчивает выполнение команды (в регистре ST0 также устанавливаются биты D7 и D6 в 0 и 1 соответственно).

После чтения поля идентификатора и поля данных каждого сектора, контроллер производит CRC-контроль считанных байтов. Если обнаружена ошибка CRC в поле идентификатора сектора, контроллер устанавливает флаг DE (Data Error) в регистре ST1, если же ошибка обнаружена в поле данных сектора, контроллер устанавливает флаг DD (Data error in Data field) в регистре ST1. В обоих случаях устанавливаются биты D7 и D6 в регистре ST0 в 0 и 1 соответственно, и выполнение команды завершается.

Если контроллер встречает адресный маркер удаленных данных и если бит SK (Skip - бит D5 в команде) не установлен, то контроллер устанавливает флаг CM (Control Mark) в регистре ST2 и заканчивает операцию после чтения всех данных сектора. Если же бит SK=1, контроллер пропускает этот сектор и начинает считывать следующий.

Во время передачи данных процессор должен обслуживать контроллер не реже 1 раза в 27 мксек. при одинарной плотности и 13 мксек. - при двойной. В противном случае контроллер устанавливает флаг OR (Over Run) в регистре ST1 и заканчивает операцию.

После завершения операции чтения (это также относится и к команде записи данных) информация, считываемая из контроллера на фазе результата (байты C-H-R-H) зависит от значения битов МТ и байта ЕОТ команды.

Write Data - Запись данных

Для задания этой команды в контроллер передается последовательность из 9 байт (см. таблицу команд). После получения последнего байта команды контроллер выдает сигнал подвода головки к поверхности диска (если она была отведена) и отрабатывает задержку для подвода головки, заданную в команде Specify и начинает поиск поля идентификатора сектора. Если текущий номер сектора ("R") хранящийся в регистре IDR, совпадает с номером сектора, считанным с диска из поля идентификатора сектора, контроллер последовательно, байт за байтом, запрашивает данные у процессора по шине данных и записывает их в поле данных сектора на диск. После окончания записи данных текущий номер сектора увеличивается на 1 и производится запись следующего поля данных. Такую мультисекторную операцию записи контроллер продолжает до тех пор, пока не получит сигнал ТС (конец счета). При поступлении сигнала ТС контроллер продолжает запись данных в текущий сектор до его заполнения. Если контроллер принимает сигнал ТС в процессе записи данных, то оставшееся поле данных заполняется нулями.

Контроллер считывает идентификатор каждого сектора и производит CRC-контроль считанных байт. Если он обнаруживает ошибку CRC в одном из секторов, он устанавливает флаг DE (Data Error) в регистре ST1 и заканчивает операцию (в регистре ST0 биты D7 и D6 устанавливаются в 0 и 1 соответственно).

Команда записи во многом аналогична команде чтения данных. Ниже перечислены все характеристики, аналогичные команде чтения данных:

- Количество передаваемых данных.
- Флаг EN (ENd of cylinder).
- Флаг ND (No Data).
- Пауза до отвода головки HUT.
- Информация, считываемая на фазе результата, если процессор прерывает выполнение команды.
- Определение DTL, когда N=0 или N>0.

В режиме записи данные от процессора или контроллера ПДП должны приходить не реже 1 раза в 31 мксек. при одинарной плотности и 15 мксек. - при двойной. В противном случае контроллер устанавливает флаг OR (Over Run) в регистре ST1 и заканчивает операцию.

Write Deleted Data - Запись удаленных данных

Команда аналогична команде Write Data за исключением того, что вместо адресного маркера данных записывает адресный маркер удаленных данных.

Read Deleted Data - Чтение удаленных данных

Команда аналогична команде Read Data за исключением случая, когда контроллер обнаруживает адресный маркер данных в начале поля данных сектора. Если бит SK=0, контроллер считывает все данные сектора, устанавливает флаг CM в регистре ST2 и заканчивает операцию. Если бит SK=1, контроллер пропускает этот сектор и переходит к чтению следующего.

Read a Track - Чтение дорожки

Команда подобна команде Read Data за исключением того, что данные будут считываться непрерывно из каждого сектора дорожки. Сразу же после обнаружения индексного импульса контроллер начинает считывать все поля данных на дорожке как непрерывный блок данных. Если контроллер обнаруживает ошибку CRC в поле идентификатора или данных, он продолжает считывать данные с дорожки. Контроллер сравнивает информацию из поля идентификатора, считанную из каждого сектора, со значением в IDR и устанавливает флаг ND в регистре ST1, если они не совпадают. Биты МТ и SK не оказывают влияния на контроллер.

Выполнение команды заканчивается, когда контроллер считает ЕОТ секторов.

Если контроллер не нашел адресного маркера поля идентификатора до того, как второй раз принял индексный импульс, он устанавливает флаг МА (Missing Address Mark) в регистре ST1 и заканчивает операцию (в регистре ST0 устанавливаются биты D7 и D6 в 0 и 1 соответственно).

Read ID - Чтение идентификатора

Эта команда используется для определения текущего положения головки записи/чтения накопителя. Контроллер запоминает информацию, считанную из первого встреченного поля идентификатора сектора. Если до прихода второго индексного импульса контроллер не встретил адресного маркера поля идентификатора, он устанавливает флаг МА в регистре ST1. Если же контроллер не нашел данных, то он устанавливает флаг ND в регистре ST1 и операция заканчивается.

Format a Track - Форматирование дорожки

Команда форматирует всю дорожку. После обнаружения индексного импульса на диск записываются следующие данные: GAPS, адресный маркер, поле идентификатора и поле данных, соответствующие стандарту IBM System 34 (одинарная плотность) и IBM System 3740 (двойная плотность).

Формат задается в команде следующими программируемыми значениями:

- N - число байт в секторе.
- SC - число секторов на цилиндре.
- GPL - длина межсекторного промежутка.
- D - байт для заполнения области данных.

Эти параметры передаются в контроллер процессором на фазе приказа. Поле данных каждого сектора будет заполнено байтами D. Поле идентификатора для каждого сектора задается процессором на фазе исполнения. Необходимы по 4 значения для каждого сектора:

- C - номер цилиндра
- H - номер головки (поверхности)
- R - номер сектора
- N - код длины сектора

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

После форматирования каждого сектора процессор должен передать новые значения C,H,R,N для каждого сектора на дорожке. Содержимое регистра R увеличивается на 1 после форматирования каждого сектора, и, следовательно, этот регистр будет содержать значение R+1 при считывании на фазе результата. Этот процесс будет продолжаться для всей дорожки, пока второй раз не будет обнаружен индексный импульс. После этого выполнение команды завершается. Если при записи от накопителя принимается сигнал Fault, контроллер устанавливает флаг ЕС в регистре ST0 и заканчивает операцию (биты D7 и D6 в регистре ST0 устанавливаются в 0 и 1 соответственно). Отсутствие сигнала Ready с накопителя в начале фазы исполнения также прекращает выполнение команды.

В таблице приведены соотношения между N, SC, GPL для различных размеров секторов.

| SD - (MFM = 0) | DD - (MFM = 1)
Сектор | N | SC | GPL1 | GPL2 | SC | GPL1 | GPL2
128 | 0 | 1A | 07 | 1B | ---- | ---- | ----
256 | 1 | 0F | 0E | 2A | 1A | 0E | 36
512 | 2 | 08 | 1B | 3A | 0F | 1B | 54
1024 | 3 | 04 | 47 | 8A | 08 | 3F | 74
2048 | 4 | 02 | C8 | FF | 04 | 99 | FF
4096 | 5 | 01 | C8 | FF | 02 | C8 | FF
8192 | 6 | ---- | ---- | ---- | 01 | C8 | FF

Scan Commands - Команды сканирования

Команды сканирования позволяют считанные с диска данные сравнить с данными, выдаваемые процессором (контроллером ПДП). Контроллер сравнивает данные последовательно, байт за байтом и проверяет условия:

DD = DP DD <= DP DD >= DP где DD - данные с диска; DP - данные от процессора.

После проверки всего сектора, если условие не выполняется, производится инкремент номера сектора (R + STR -> R) и операция сканирования продолжается. Операция будет продолжаться до тех пор, пока не произойдет одно из следующих условий:

- выполнится условие сканирования (равно, больше или меньше)
- достигнут последний сектор (ЕОТ)
- принят сигнал ТС

Если условие сканирования удовлетворено, контроллер устанавливает флаг SH (Scan Hit) в регистре ST2 и завершает команду. Если условие не удовлетворено в промежутке между начальным сектором (заданным R) и последним сектором цилиндра (ЕОТ), контроллер устанавливает флаг SN (Scan Not Satisfied) в регистре ST2 и завершает команду.

Если во время операции поступил сигнал ТС от процессора или контроллера ПДП, контроллер прекращает сравнение на текущем байте и завершает команду.

Ниже в таблице приведены состояния битов SH и SN после различных условий сканирования:

Сканирование до ... | Рег. ST2 | Примечание
| SN | SH |
Равно | 0 1 | 1 0 | DD=DP DD<>DP
Меньше или равно | 0 0 1 | 1 0 0 | DD=DP DD<DP DD>DP
Больше или равно | 0 0 1 | 1 0 0 | DD=DP DD>DP DD<DP

Если контроллер обнаруживает адресный маркер удаленных данных в одном из секторов и бит SK=0, он считает этот сектор последним сектором цилиндра, устанавливает флаг CM (Control Mark) в регистре ST2 и завершает команду. Если же бит SK=1, контроллер пропускает этот сектор и считывает следующий. В этом случае контроллер устанавливает флаг CM в регистре ST2, сигнализирующий о том, что был встречен удаленный сектор.

Когда вы программируете значения STP (STP=01 для обработки последовательных секторов, STP=02 для чтения через один сектор) или МТ (Multitrack), необходимо помнить, что последний сектор на дорожке должен быть считан. Например, если STP = 02, МТ = 0, сектора пронумерованы последовательно от 1 до 26, команду Scan начинаем с сектора 21, то успешно будут обработаны сектора 21, 23 и 25. Далее сектор 26 будет пропущен, а затем придет индексный импульс. Это вызовет ненормальное завершение операции. Если бы ЕОТ равнялось 25, а сканирование бы начиналось с сектора 20, то операция Scan завершилась бы успешно.

Аналогично командам чтения/записи, процессор или контроллер ПДП должен обслуживать контроллер каждые 27 мксек. при одинарной плотности и 13 мксек. при двойной. В противном случае контроллер выставит флаг OR (Over Run) в регистре ST1 и прекратит выполнение команды.

Seek - Команда позиционирования

Головка записи/чтения накопителя перемещается с цилиндра на цилиндр по команде Seek. Контроллер сравнивает содержимое регистра PCN (Present Cylinder Number), который хранит текущее положение головки и содержимое NCN (New Cylinder Number) - новое положение головки, заданное в команде и в зависимости от результата сравнения выполняет следующие действия:

- PCN < NCN - сигнал направления для накопителя устанавливается в "1" и выдается импульс шага.
- PCN > NCN - сигнал направления для накопителя устанавливается в "0" и выдается импульс шага.

Скорость выдачи импульсов шага задается в команде Specify значением SRT (Stepping Rate Time). После каждого импульса шага вновь сравниваются значения PCN и NCN и когда PCN = NCN, контроллер устанавливает флаг SE (Seek End) в регистре ST0 и завершает выполнение команды.

На фазе приказа контроллер находится в состоянии FDC Busy (занят), однако на фазе исполнения контроллер переходит в состояние NON Busy (не занят). Когда контроллер находится в состоянии NON Busy, ему можно задать другие операции Seek и в этом случае команда позиционирования будет выполняться одновременно для нескольких (до 4-х) накопителей.

Если перед началом фазы исполнения или во время исполнения команды Seek накопитель находится в состоянии Not Ready (не готов), контроллер устанавливает флаг NR (Not Ready) в регистре ST0 и команда завершается.

Recalibrate - Рекалибровка (откат)

Команда переустанавливает головку чтения/записи накопителя на дорожку 0. Накопитель в этом случае должен выдать сигнал TR00. Контроллер сбрасывает содержимое регистра PCN и проверяет сигнал TR00 с накопителя. Пока этот сигнал имеет низкий уровень, контроллер устанавливает в "1" сигнал направления Dir и выдает импульсы шага на накопитель. Когда сигнал TR00 становится высоким, контроллер устанавливает флаг SE (Seek End) в регистре ST0 и завершает команду. Если после выдачи 77 импульсов шага состояние сигнала не изменилось, контроллер устанавливает флаги SE (Seek End) и EC (Equipment Check) в регистр ST0 и команда завершается. Команда может производить рекалибровку одновременно всех 4-х накопителей. Реакция на исчезновение сигнала Ready с накопителя аналогична реакции в команде Seek.

Sense Interrupt Status - Считать состояние прерывания

Сигнал прерывания INT генерируется контроллером в следующих случаях:

- 1. На фазе результата следующих команд:

- Read Data
- Read a Track
- Read ID
- Read Deleted Data
- Write Data
- Write Deleted Data
- Format a Track
- Scan Sommand

- 2. Изменение сигнала Ready с накопителя
- 3. В конце команд Seek или Recalibrate
- 4. На фазе выполнения в режиме NON DMA
Прерывания в случаях (1) и (4) легко распознаются процессором, т.к. производятся во время нормального исполнения команд. Однако прерывания в случаях (2) и (3) могут быть идентифицированы процессором только путем выполнения команды чтения состояния прерывания. Эта команда сбрасывает сигнал прерывания и посредством битов 5-7 регистра ST0 процессор может определить причину прерывания.

SE | INT Code | Причина прерывания
бит 5 | бит 6 | бит 7 |
0 | 1 | 1 | Изменение сигнала Readu с накопителя
1 | 0 | 0 | Нормальное завершение команд Seek и Recalibrate
1 | 1 | 0 | Ошибочное завершение команд Seek и Recalibrate

Команды Seek и Recalibrate не имеют фазы результата, поэтому требуется использование команды Sense Interrupt Status для их успешного завершения и проверки положения головки накопителя (PCN).

Specify - Установить параметры накопителя

Команда задает значения 3 временных интервалов - параметров накопителей:

- HUT - пауза до отвода головки. Задает время от окончания операции чтения/записи до момента отвода головки от поверхности диска. Время задается в единицах по 16 мсек. и лежит в пределах 16..240 мсек.
- SRT - время шага головки. Задает время задержки между двумя последовательными импульсами шага. Время задается в единицах по 1 мсек. и лежит в пределах 1..16 мсек.

- Внимание! Большие числа задают меньшее время шага:
- 0FH - 1 мсек., 0EH - 2 мсек. и т.д.

- HLT - время подвода головки. Задает время между выдачей сигнала подвода головки к диску и началом операции чтения/записи. Задается в единицах по 2 мсек. и лежит в пределах 2..254 мсек.

Все временные интервалы, указанные выше, связаны с тактовой частотой контроллера (CLK, выв.19) и приведены для случая, когда CLK = 8 МГц (203 мм. диск). Если же CLK = 4 МГц (133 мм. диск), то все значения уменьшатся в 2 раза.

Бит ND в команде осуществляет выбор режима ПДП для контроллера: если бит ND=1, выбирается режим NON DMA (не-ПДП), если же ND=0, то выбирается режим DMA (ПДП).

Sense Drive Status - Чтение состояния накопителя

Команда может быть использована процессором, когда ему необходимо узнать состояние накопителя. Регистр ST3 содержит информацию о состоянии накопителя.

Invalid - Недопустимая команда

Если в контроллер передается команда, не опознанная как одна из вышеперечисленных, контроллер завершает команду. В этом случае прерывание не генерируется. Биты 6 и 7 в регистре состояния (DIO и RQM) устанавливаются в 1, указывая процессору на необходимость выполнения фазы результата - чтения регистра ST0. В регистре ST0 находится байт 80Н, показывающий недопустимую команду.

Необходимо отметить, что после операций Seek и Recalibrate (возникновения прерывания после окончания команды), контроллер должен получить команду Sense Interrupt Status, иначе он воспримет следующую команду как недопустимую. Пользователь при необходимости может использовать эту команду, как команду NOP (нет операции) для приведения контроллера в известное состояние или в состояние без операции.

Система команд контроллера НГМД i8272

Фаза | R/W | Шина данных | Примечание
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Read ID | 4AH/0AH
Приказ | W | 0 | mfm | 0 | 0 | 1 | 0 | 1 | 0 | Командное слово
| 0 | 0 | 0 | 0 | 0 | HDS | DS0 | DS1 |
Исполнение |  | Выполнение операций |

Результат

R

ST0
ST1
ST2
C
H
R
N

Командные слова

Команда | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Прим.
Read Data Read Del. Data Write Data Write Del. Data Read a Track | MT MT MT MT MT | MFM MFM MFM MFM MFM | SK SK SK SK SK | 0 0 0 0 0 | 0 1 0 1 0 | 1 1 1 0 0 | 1 0 0 0 1 | 0 0 1 1 0 |
Scan Equal Scan Low or Eq. Scan High or Eq. | MT MT MT | MFM MFM MFM | SC SC SC | 1 1 1 | 0 1 1 | 0 0 1 | 0 0 0 | 1 1 1 | * * *

* В командах сканирования последний байт приказа DTL заменяется на STD.

Фаза | R/W | Шина данных | Примечание
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Read ID | 4AH/0AH
Приказ | W | 0 | mfm | 0 | 0 | 1 | 0 | 1 | 0 | Командное слово
| 0 | 0 | 0 | 0 | 0 | HDS | DS0 | DS1 |
Исполнение |  | Выполнение операций |

Результат

R

ST0
ST1
ST2
C
H
R
N

Format a Track | 4DH/0DH
Приказ | W | 0 | mfm | 0 | 0 | 1 | 1 | 0 | 1 |
| 0 | 0 | 0 | 0 | 0 | HDS | DS0 | DS1 |
| N SC GPL D | Размер сектора кол-во секторов Межсекторный GAP Заполнитель
Исполнение |  | Выполнение операции |

Результат

R

ST0
ST1
ST2
C
H
R
N

Recalibrate | 07H
Приказ | W | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | Командное слово
| 0 | 0 | 0 | 0 | 0 | HDS | DS1 | DS1 |
Исполнение |  | Выполнение операции | Фазы рез-та нет
Sense Interrupt Status | 08H
Приказ | W | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | Командное слово
Результат | R | ST0 PCN | Фазы исполнения нет
Specify | 03H
Приказ | W | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | Командное слово
| SRT | HUT |
| HLT | ND | Нет фаз рез-та и исполнения

Sense Drive Status | 04H
Приказ | W | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | Командное слово
| 0 | 0 | 0 | 0 | 0 | HDS | DS0 | DS1 |
Результат | R | ST3 | Фазы исп-ния нет
Seek | 0FH
Приказ | W | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | Командное слово
| 0 | 0 | 0 | 0 | 0 | HDS | DS0 | DS1 |
| NCN |
Исполнение |  | Выполнение операций | Фазы рез-та нет Генерирует прерывание
Invalid | XXH
Приказ | W | Недопустимый код операции |
Результат | R | ST0 | ST0=80H - признак ошибки

Регистры состояния ST0 - ST3
Бит | Название | Об. | Описание
Регистр состояния ST0

D7
D6

Interrupt
Code

1C

Биты D7,D6 совместно показывают исход команды, вызвавшей прерывание :

00 - нормальное завершение команды (NT- Normal Termination ).

01 - ошибочное завершение команды (AT- Abnormal Terminated )

команда была начата, но не выполнена успешно.

10 - недопустимая команда ( IC- Invalid Command ).

11 - ненормальное завершение команды из-за изменения сигнала Ready с

накопителя.

D5 | Seek End | SE | Когда контроллер выполнил команду Seek, этот бит установлен в "1".
D4 | Equipment Check | EC | Если с накопителя пришел сигнал Fault или после 77 шагов не получен сигнал TR00, этот бит устанавливается в "1".
D3 | Not Ready | NR | Если накопитель в состоянии Not Ready и задается команда чтения или записи, этот бит устанавливается в "1".
D2 | Head Address | HD | Флаг используется для указания состояния головки при прерывании.
D1 D0 | Unit Select | US1 US2 | Два бита указывают номер накопителя при прерывании.
Регистр состояния ST1
D7 | End of Cylinder | EN | Когда контроллер пытается получить доступ к сектору с номером, превышающим номер последнего сектора цилиндра, флаг устанавливается.
D6 | ------- |  | Не используется, всегда = 0.
D5 | Data Error | DE | Флаг устанавливается при выявлении ошибки CRC в полях данных или идентификатора сектора.
D4 | Over Run | OR | Флаг устанавливается, если контроллер не обслужен системой во время передачи данных ( потеря данных ).
D3 | ------- |  | Не используется, всегда = 0.

D2

No Data

ND

В командах Read Data, Write Delete Data или Scan если контроллер не может найти сектор, указанный рег. IDR, флаг устанавливается в "1".

В командах Read ID, если контроллер не может считать поле идентификатора сектора без ошибки, флаг устанавливается в "1".

В командах Read a Cylinder, если начальный сектор не найден, флаг устанавливается в "1".

D1 | Not Writable | NW | В командах записи и форматирования, если контроллер обнаруживает сигнал защиты от записи с накопителя, флаг устанавливается.
D0 | Missing Address Mark | MA | Если не найден адресный маркер идентификатора сектора до прихода второго индексного импульса, флаг устанавливается в "1". Если не обнаружен адресный маркер данных или удаленных данных, флаг устанавливается . При этом устанавливается флаг MD в регистре ST2.
Регистр состояния ST2
D7 | ------- |  | Не используется, всегда = 0.
D6 | Control Mark | CM | В командах Read Data и Scan при обнаружении сектора с адресным маркером удаленных данных флаг устанавливается в "1".
D5 | Data Error in Data Field | DD | флаг устанавливается в "1" при обнаружении ошибки CRC в поле данных сектора.
D4 | Wrong Cilinder | WC | Устанавливается совместно с битом ND, если содержимое регистра С отличается от содержимого регистра IDR.
D3 | Scan Equal Hit | SH | В командах Scan, при удовлетворении условия "равно" этот бит устанавливается в "1".
D2 | Scan not Satisfied | SN | В командах Scan, если не найден сектор, отвечающий заданному условию, флаг устанавливается в "1".
D1 | Bad Cilinder | BC | Устанавливается совместно с битом ND, если содержимое регистра С отличается от содержимого IDR и С=0FFH.
D0 | Missing Address Mark in Data Field | MD | Если при чтении не встречен адресный маркер данных или адресный маркер удаленных данных, флаг устанавливается в "1".
Регистр состояния ST3
D7 | Fault | FT | Отражает состояние сигнала Fault с накопителя.
D6 | Write Protect | WP | Отражает состояние сигнала Write Protect ( защита от записи )с накопителя.
D5 | Ready | rdy | Отражает состояние сигнала Ready с накопителя.
D4 | Track 00 | T0 | Отражает состояние сигнала Track 00 с накопителя.
D3 | Two Side | TS | Отражает состояние сигнала Two Side с накопителя.
D2 | Head Address | HD | Указывает на выбранную поверхность диска.
D1 D0 | Unit Select | US1 US0 | Два бита показывают выбранный накопитель.