FDC 1793
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0. |
FDC 179X — серия однокристальных контроллеров флоппи-дисков. Наиболее известный представитель — FDC 1793 и ее советский аналог КР1818ВГ93.
Спецификации
- Поддерживаемые диски: 8″, 5¼″;
- Режимы записи: FM (одинарная плотность), MFM (двойная плотность);
- Размер сектора: 128, 256, 512, 1024 байт;
- Тактовая частота: 2 МГц для 8″, 1 МГц для 5¼″;
Регистры
1793 содержит пять доступных регистров, обращение к которым происходит по четырем адресам:
A1 | A0 | Чтение | Запись |
---|---|---|---|
0 | 0 | Регистр статуса | Регистр команды |
0 | 1 | Регистр дорожки | |
1 | 0 | Регистр сектора | |
1 | 1 | Регистр данных |
Важно обратить внимание, что на настоящем контроллере запись в регистр происходит с некоторой задержкой. Если попытаться прочитать значение регистра сразу после записи, будет получено старое значение. В большинстве случаев это не важно, так как программы вводят специальные задержки после каждой записи в регистр, однако некоторые тесты (в частности, тест Чистякова для Z80 Card II на Орионе-128) строят на этом проверку работы контроллера, и эмулятор, записывающий значение в регистр без задержки, тест не пройдет.
Регистр данных
8-ми разрядный регистр, в котором хранится значение, которое считано с диска или должно быть на него записано. Во время выполнения команды Seek в регистр данных загружается номер нужной дорожки.
Регистр команды
8-ми разрядный регистр, в который загружается текущая выполняемая команда. В регистр нельзя загружать новое значение в режиме Busy («Занят», см. описание регистра статуса), кроме команды Force Interrupt. Регистр доступен только для записи.
После аппаратного сброса в регистр записывается значение 03.
Регистр статуса
В 8ми-разрядном регистре статуса хранится информация о текущем состоянии устройства. Регистр доступен только для чтения.
Регистр сектора
8-ми разрядный регистр, в котором хранится номер нужного сектора. Во время чтения или записи содержимое этого регистра сравнивается с номером текущего сектора на диске до их совпадения. Регистр не должен загружаться, пока контроллер находится в режиме Busy.
Регистр дорожки
8-ми разрядный регистр, в котором хранится номер нужной дорожки. Содержимое регистра автоматически увеличивается либо уменьшается при выполнении команд Step-In (+1) и Step-Out (-1) — «Шаг к центру», «Шаг от центра». Значения регистра находятся в диапазоне от 0 до 76.
Во время чтения, записи и верификации содержимое этого регистра сравнивается с номером текущей дорожки до их совпадения. Регистр не должен загружаться, когда контроллер находится в режиме Busy.
Команды контроллера
Тип | Команда | Описание | Код в регистре команд | |||||||
---|---|---|---|---|---|---|---|---|---|---|
b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | |||
I | Restore | Возврат | 0 | 0 | 0 | 0 | h | V | r1 | r0 |
Seek | Поиск дорожки | 0 | 0 | 0 | 1 | h | V | r1 | r0 | |
Step | Шаг | 0 | 0 | 1 | T | h | V | r1 | r0 | |
Step-In | Шаг в центр | 0 | 1 | 0 | T | h | V | r1 | r0 | |
Step-Out | Шаг от центра | 0 | 1 | 1 | T | h | V | r1 | r0 | |
II | Read Sector | Чтение сектора | 1 | 0 | 0 | m | S | E | C | 0 |
Write Sector | Запись сектора | 1 | 0 | 1 | m | S | E | C | a0 | |
III | Read Address | Чтение заголовка | 1 | 1 | 0 | 0 | 0 | E | 0 | 0 |
Read Track | Чтение дорожки | 1 | 1 | 1 | 0 | 0 | E | 0 | 0 | |
Write Track | Запись дорожки | 1 | 1 | 1 | 1 | 0 | E | 0 | 0 | |
IV | Force Interrupt | Отмена команды | 1 | 1 | 0 | 1 | i3 | i2 | i1 | i0 |
Расшифровка флагов:
r1 r0 | Задержка шагового электродвигателя
|
V | Проверка номера дорожки
|
h | Готовность головки
|
T | Обновление регистра дорожки
|
a0 | Пометка адреса данных
|
C | Проверка номера стороны
|
E | Задержка 15 мс
|
S | Номер стороны для проверки
|
m | Запись нескольких секторов
|
i3 i2 i1 i0 | Параметры прерывания (возможна комбинация значений):
|
Команды I типа
В эти команды входят: Restore, Seek, Step, Step-In и Step-Out. В параметры команд входит время переключения шагового двигателя (r1 r0), а также режим проверки номера трека (V). В этом режиме, если номер текущей дорожки совпадет с содержимым соответствующего регистра (а также будет правильной CRC), генерируется аппаратное прерывание INTRQ.
Restore (Возврат к дорожке 0)
В этом режиме контроллер выдает дисководы импульсы перемещения головки до тех пор, пока не станет активной линия TR00, означающая, что головка пришла в исходное положение. После этого регистр дорожки обнуляется, и генерируется прерывание INTRQ.
Seek (Поиск дорожки)
При выполнении этой команды подразумевается, что регистр дорожки содержит номер дорожки, над которой находится головка, а регистр данных — номер требуемой дорожки. Контроллер посылает нужные импульсы шаговому двигателю до тех пор, пока эти значения не совпадут. После этого вызывается прерывание. Если используется несколько дисководов, перед выполнением команды Seek необходимо правильно восстановить содержимое регистра дорожки.
Step (Один шаг)
При выполнении этой команды контроллер выдает приводу головки дисковода один импульс в направлении, совпадающем с направлением предыдущей выполненной команды. После исполнения вызывается прерывание.
Step-In и Step-Out (Шаг внутрь, Шаг наружу)
При выполнении этих команд контроллер выдает один импульс на передвижение головки. Step-In соответствует движению от дорожки 0 к дорожке 76, а Step-Out — в обратном направлении. Выполнение команды заканчивается прерыванием INTRQ.
Команды II типа
В эту категорию попадают команды чтения и записи сектора. Перед подачей одной из этих команд необходимо загрузить регистр сектора необходимым значением. После получения команды устанавливается бит Busy («Занят») регистра статуса. Далее контроллер последовательно считывает сектора до совпадения полученного номера со значением в регистрах дорожки и сектора. Если сектор найти не удается, устанавливается бит Record not found («Запись не найдена»), и команда завершается прерыванием. Каждая команда II типа содержит флаг m, показывающий количество секторов, которые читаются или записываются. Если m=0, то считывается или записывается только один сектор, а в конце вызывается прерывание, в противном случае происходит автоматическое обновление регистра сектора до достижения последнего сектора на дорожке, либо получения команды Force Interrupt.
Команды II типа также содержат флаг поверки номера стороны. Если C=1, то номер стороны считывается из служебного поля сектора и сравнивается с содержимым флага S.
При работе с данными командами используется механизм DRQ — специальный флаг в регистре статуса, устанавливаемый в 1 при готовности данных в контроллере (или необходимости получения следующего байта при записи) и сбрасываемый в 0 после обращения к регистру данных. Бит DRQ также дублируется внешней линией DRQ, которая может использоваться для генерации аппаратных прерываний вместе с INTRQ.
Read (Чтение)
После получения этой команды устанавливается бит Busy («Занят») регистра статуса. Далее контроллер производит поиск сектора до совпадения его номера, а также номера дорожки и стороны (если C=1) с содержимым соответствующих регистров. После считывания каждого байта в регистр данных устанавливается DRQ. После завершения всей операции на основе полученной с диска информации устанавливается поле Data Address Mark (бит 5) регистра статуса.
Если в момент записи в регистр данных очередного байта предыдущий байт не был прочитан, устанавливается флаг Lost Data («Потеря данных») регистра статуса.
Если в конце чтения сектора вычисленная CRC не совпадет с прочитанной, устанавливается флаг CRC error.
Write (Запись)
После получения этой команды устанавливается бит Busy («Занят») регистра статуса. Далее контроллер производит поиск сектора до совпадения его номера, а также номера дорожки и стороны (если C=1) с содержимым соответствующих регистров. Далее контроллер пропускает 22 байта CRC и затем устанавливает DRQ. Если вызов оказывается необработанным к нужному моменту (регистр данных не загружен), выполнение команды прерывается и устанавливается бит Lost Data («Потеря данных») регистра статуса. Далее на диск записывается 12 нулевых байт, а также байт Data Address Mark в соответствии со значением поля a0 команды. После этого начинается запись первого байта и вызывается следующее DRQ. Если за время записи DRQ не обработан, то на диск записывается нулевой байт и устанавливается флаг Lost Data. После записи последнего байта на диск записывается два байта CRC и один байт, состоящий из единиц.
Команды III типа
Read Address (Чтение адреса)
Команда считывает 6 байт заголовка следующего найденного сектора. После загрузки каждого байта в регистр данных вызывается DRQ. В момент исполнения команды устанавливается флаг Busy. 6 считанных байт состоят из следующих значений: Номер дорожки, Номер стороны, Номер сектора, Размер сектора, CRC1, CRC2. В момент передачи CRC заголовка она проверяется на правильность, и в случае несовпадения устанавливается флаг CRC error. Номер дорожки также записывается в регистр сектора и может быть прочитан оттуда пользователем. После выполнения команды сбрасывается бит Busy и вызывается прерывание.
Read Track (Чтение дорожки)
Дорожка читается целиком, начиная с переднего фронта импульса «начало дорожки», полученного от привода. Все байты, включая синхробайты, заголовки секторов, CRC заголовков, CRC данных и т. д. помещаются последовательно в регистр данных, и для каждого байта вызывается DRQ. В конце команды вызывается прерывание. Все считанные данные корректны, за исключением синхробайтов, которые могут быть считаны неправильно при синхронизации момента запуска чтения. На время выполнения команды устанавливается бит Busy.
Write Track (Форматирование дорожки)
Запись начинается с переднего фронта импульса «начало дорожки» и завершается прерыванием при появлении фронта следующего импульса. DRQ активизируется сразу после получения команды, но собственно запись не начинается до момента загрузки значения в регистр данных. Если регистр не загружается до получения следующего импульса начала дорожки, команда прерывается с очисткой флага Busy, установкой Lost Data и вызовом прерывания. Если при последующей записи не будет получен очередной байт, на его месту будут записаны нули.
Обычно, как только данные загружаются в регистр, они записываются на диск стандартным образом. Но если контроллер получает байты от F5 до FE, он считает их управляющими и обрабатывает особым образом, формируя служебные поля. По этой причине байты с этими значениями не могут присутствовать ни в служебных полях, ни в поле данных.
Команда IV типа
Команда Force Interrupt обычно используется для прерывания чтения или записи нескольких секторов, а также гарантированной фиксации значения флагов регистра статуса. Данная команда может быть загружена в любой момент времени. Если при этом контроллер занят исполнением другой команды, ее работа прекращается, а флаг Busy очищается.
Значения регистра статуса
При получении новой команды, за исключением Force Interrupt, значение флага Busy устанавливается в 1, а другие биты устанавливаются в соответствии с выполняемой командой. При этом, при выполнении команды Force Interrupt происходит только сброс флага Busy, а другие биты не затрагиваются. С другой стороны, если в этот момент никакая команда не исполняется, все биты кроме Busy устанавливаются в значения, соответствующие командам I типа.
Для получения статуса контроллера у пользователя есть два пути — проверка значения флагов Busy и DRQ регистра статуса, либо использование механизма прерываний. Работа всего механизма основана на том, что при готовности байта после чтения, либо необходимости его получения для записи, устанавливаются в 1 флаг DRQ регистра статуса, а также внешняя линия DRQ контроллера. После этого обращение к регистру данных (чтение или запись) сбрасывают в 0 как флаг DRQ, так и внешнюю линию DRQ. В момент завершения всей команды сбрасывается флаг Busy и активизируется линия INTRQ. При этом совмещение программного опроса и аппаратных прерываний не рекомендуется, так как опрос статусного регистра автоматически сбрасывает линию INTRQ.
Сводка значений регистра статуса:
Команды I типа | Read Address | Read Sector | Read Track | Write Sector | Write Track | |
---|---|---|---|---|---|---|
b7 | Не готов | Не готов | Не готов | Не готов | Не готов | Не готов |
b6 | Защита от записи | 0 | 0 | 0 | Защита от записи | Защита от записи |
b5 | Готовность головки | 0 | Тип данных | 0 | Ошибка записи | Ошибка записи |
b4 | Ошибка поиска дорожки | RNF | RNF | 0 | RNF | 0 |
b3 | Ошибка CRC | Ошибка CRC | Ошибка CRC | 0 | Ошибка CRC | 0 |
b2 | Дорожка 0 | Потеря данных | Потеря данных | Потеря данных | Потеря данных | Потеря данных |
b1 | Начало дорожки | DRQ | DRQ | DRQ | DRQ | DRQ |
b0 | Занят | Занят | Занят | Занят | Занят | Занят |
Расшифровка для команд I типа:
- b7 «Не готов»: 1 в этом бите обозначает, что устройство не готово. Физически этот бит является инверсией входной линии Ready, логически сложенной (OR) с линией MR;
- b6 «Защита от записи»: 1 означает, что диск защищен от записи;
- b5 «Готовность головки»: 1 означает, что головка готова к работе;
- b4 «Ошибка поиска дорожки»: 1 означает, что значение в регистре не проверено на соответствие реальному положению головки. Бит сбрасывается после правильной установки регистра;
- b3 «Ошибка CRC»: 1 означает, что CRC заголовка сектора не совпала с вычисленным значением;
- b2 «Дорожка 0»: 1 означает, что головка находится на нулевой дорожке;
- b1 «Начало дорожки»: равен 1 в момент прохода метки начала сектора;
- b0 «Занят»: Устанавливается в момент начала выполнения команды, сбрасывается по завершении.
Расшифровка для команд II и III типа:
- b7 «Не готов»: Аналогично I типу.
- b6 «Защита от записи»: При чтении не используется, при записи означает защиту диска от записи.
- b5 «Тип данных»/«Ошибка записи»: При чтении — тип данных из поля адреса сектора (1: удаленная метка данных, 0: метка данных). При записи — индикатор ошибки;
- b4 «Запись не найдена»: 1 означает, что нужная дорожка, сектор или сторона не найдены;
- b3 «Ошибка CRC»: Если также установлен b4, означает что получена ошибка в заголовке одного или больше секторов, иначе означает ошибку в считанных данных.
- b2 «Потеря данных»: 1 означает, что к моменту записи байта он не был загружен в регистр данных.
- b1 «Запрос данных» (DRQ): Копия значения внешней линии DRQ. 1 означает, что в регистр данных загружено очередное значение при чтении, либо он ожидает байт данных для записи. При обращении к регистру данных DRQ автоматически сбрасывается.
- b0 «Занят»: Равен 1 в момент исполнения команды. Сбрасывается по ее завершении.