регистр состояния и регистр данных. Регистр состояния (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-х фаз:
На фазе исполнения регистр состояния считывать не нужно. Если контроллер находится в режиме 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 соответственно).
Команда записи во многом аналогична команде чтения данных. Ниже перечислены все характеристики, аналогичные команде чтения данных:
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 (двойная плотность).
Формат задается в команде следующими программируемыми значениями:
После форматирования каждого сектора процессор должен передать новые значения C,H,R,N для каждого сектора на дорожке. Содержимое регистра R увеличивается на 1 после форматирования каждого сектора, и, следовательно, этот регистр будет содержать значение R+1 при считывании на фазе результата. Этот процесс будет продолжаться для всей дорожки, пока второй раз не будет обнаружен индексный импульс. После этого выполнение команды завершается. Если при записи от накопителя принимается сигнал Fault, контроллер устанавливает флаг ЕС в регистре ST0 и заканчивает операцию (биты D7 и D6 в регистре ST0 устанавливаются в 0 и 1 соответственно). Отсутствие сигнала Ready с накопителя в начале фазы исполнения также прекращает выполнение команды.
В таблице приведены соотношения между N, SC, GPL для различных размеров секторов.
|
|
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Команды сканирования позволяют считанные с диска данные сравнить с данными, выдаваемые процессором (контроллером ПДП). Контроллер сравнивает данные последовательно, байт за байтом и проверяет условия:
DD = DP DD <= DP DD >= DP где DD - данные с диска; DP - данные от процессора.
После проверки всего сектора, если условие не выполняется, производится инкремент номера сектора (R + STR -> R) и операция сканирования продолжается. Операция будет продолжаться до тех пор, пока не произойдет одно из следующих условий:
Если во время операции поступил сигнал ТС от процессора или контроллера ПДП, контроллер прекращает сравнение на текущем байте и завершает команду.
Ниже в таблице приведены состояния битов SH и SN после различных условий сканирования:
Сканирование до ... |
|
|
|
|
|
||
Равно |
|
|
|
Меньше или равно |
|
|
|
Больше или равно |
|
|
|
Когда вы программируете значения 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) - новое положение головки, заданное в команде и в зависимости от результата сравнения выполняет следующие действия:
На фазе приказа контроллер находится в состоянии 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 генерируется контроллером в следующих случаях:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Specify - Установить параметры накопителя
Команда задает значения 3 временных интервалов - параметров накопителей:
Бит 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
|
|
|
|
|||||||
|
|
|
|
|
|
|
|
|||
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Read Data
Read Del. Data Write Data Write Del. Data Read a Track |
|
|
|
|
|
|
|
|
|
Scan Equal
Scan Low or Eq. Scan High or Eq. |
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
||||
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
||||||||||
|
|
|
|||||||||
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
||||
|
|
||||||||||
|
|
||||||||||
|
|
|
|||||||||
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|||||||||
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
HLT |
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|||||||
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
||||||||||
|
|
|
||||||||
|
|
|||||||||
|
|
|
||||||||
|
|
|
|
|
|||
|
|
|
|
|
|||
|
|
|
Биты D7,D6 совместно показывают исход команды,
вызвавшей прерывание :
00 - нормальное завершение команды (NT- Normal Termination ). 01 - ошибочное завершение команды (AT- Abnormal Terminated ) команда была начата, но не выполнена успешно. 10 - недопустимая команда ( IC- Invalid Command ). 11 - ненормальное завершение команды из-за изменения сигнала Ready с накопителя. |
|
|
|
Когда контроллер выполнил команду Seek, этот бит установлен в "1". |
|
|
|
Если с накопителя пришел сигнал Fault или после 77 шагов не получен сигнал TR00, этот бит устанавливается в "1". |
|
|
|
Если накопитель в состоянии Not Ready и задается команда чтения или записи, этот бит устанавливается в "1". |
|
|
|
Флаг используется для указания состояния головки при прерывании. |
|
|
|
Два бита указывают номер накопителя при прерывании. |
|
|||
|
|
|
Когда контроллер пытается получить доступ к сектору с номером, превышающим номер последнего сектора цилиндра, флаг устанавливается. |
|
|
Не используется, всегда = 0. | |
|
|
|
Флаг устанавливается при выявлении ошибки CRC в полях данных или идентификатора сектора. |
|
|
|
Флаг устанавливается, если контроллер не обслужен системой во время передачи данных ( потеря данных ). |
|
|
Не используется, всегда = 0. | |
|
|
|
В командах Read Data, Write Delete Data или
Scan если контроллер не может найти сектор, указанный рег. IDR, флаг устанавливается
в "1".
В командах Read ID, если контроллер не может считать поле идентификатора сектора без ошибки, флаг устанавливается в "1". В командах Read a Cylinder, если начальный сектор не найден, флаг устанавливается в "1". |
|
|
|
В командах записи и форматирования, если контроллер обнаруживает сигнал защиты от записи с накопителя, флаг устанавливается. |
|
|
|
Если не найден адресный маркер идентификатора
сектора до прихода второго индексного импульса, флаг устанавливается в
"1".
Если не обнаружен адресный маркер данных или удаленных данных, флаг устанавливается . При этом устанавливается флаг MD в регистре ST2. |
|
|||
|
|
Не используется, всегда = 0. | |
|
|
|
В командах Read Data и Scan при обнаружении сектора с адресным маркером удаленных данных флаг устанавливается в "1". |
|
|
|
флаг устанавливается в "1" при обнаружении ошибки CRC в поле данных сектора. |
|
|
|
Устанавливается совместно с битом ND, если содержимое регистра С отличается от содержимого регистра IDR. |
|
|
|
В командах Scan, при удовлетворении условия "равно" этот бит устанавливается в "1". |
|
|
|
В командах Scan, если не найден сектор, отвечающий заданному условию, флаг устанавливается в "1". |
|
|
|
Устанавливается совместно с битом ND, если содержимое регистра С отличается от содержимого IDR и С=0FFH. |
|
|
|
Если при чтении не встречен адресный маркер данных или адресный маркер удаленных данных, флаг устанавливается в "1". |
|
|||
|
|
|
Отражает состояние сигнала Fault с накопителя. |
|
|
|
Отражает состояние сигнала Write Protect ( защита от записи )с накопителя. |
|
|
|
Отражает состояние сигнала Ready с накопителя. |
|
|
|
Отражает состояние сигнала Track 00 с накопителя. |
|
|
|
Отражает состояние сигнала Two Side с накопителя. |
|
|
|
Указывает на выбранную поверхность диска. |
|
|
|
Два бита показывают выбранный накопитель. |