Контроллер НГМД (ЯБ3.089.023-01) предназначен для обмена данными между центральным процессором и НГМД. Ячейка контроллера НГМД обеспечивает сопряжение ПЭВМ с двумя любыми накопителями на гибких магнитных дисках емкостью 1000, 500 или 250 Кбайт с управлением головкой чтения/записи сигналами "НАПРАВЛЕНИЕ", "ШАГ" и обеспечивающими работу с МЧМ - кодированными данными (скорость передачи данных - 250 Кбит/сек). В таблице 60, приведенной ниже, перечислены адреса регистров контроллера НГМД. Под X здесь понимается шестнадцатеричная цифра, которая вычисляется по формуле: X = N + 8 где N - номер разъема, к которому подключен контроллер. Д14 - обозначение микросхемы кр580вв55а (параллельного интерфейса), входящей в узел управления контроллера, Д15 - обозначение микросхемы кр580вв55а, входящей в последовательно-параллельный приемо-передатчик. Таблица 60 Адресация регистров ячейки контроллера НГМД Адрес Назначение Чтение Запись -------------------------------------------------------------------- CN00-CNFF Считывание программы начальной загрузки COX1 Считывание статусных сигналов НГМД (Д14, порт B) C0X2 Считывание сигналов Запись сигналов управления управления НГМД и контроллером НГМД и контроллером (Д14, порт C) (Д14, порт C) C0X3 Запись режима работы Д14, "включение/выключение" битов (Д14, порт C) C0X4 Считывание данных с ГМД (Д15, порт A) C0X5 Запись данных на ГМД (Д15, порт B) C0X6 Считывание готовности буферов чтения/записи и состояния синхротриггера C0X7 Запись режима работы Д15, программирование источника сигнала готовности, подаваемого на старший бит порта C Д15 C0X8 Запись синхропоследовательности (данные игнорируются) C0X9 Шаг головки НГМД (данные игнорируются) C0XA Сброс синхрогенератора (данные игнорируются) Для нормальной работы контроллера параллельный интерфейс Д14 программируется на работу в режиме "O/O" командой записи байта $92 по адресу C0X3, а Д15 - на работу в режиме "I/I" командой записи байта $BD по адресу C0X7. Указанные операции необходимо выполнить до начала любой другой операции с контроллером НГМД. Ниже приведено описание сигналов отдельных разрядов порта B и C параллельного интерфейса Д14 (в скобках указано значение бита, при котором сигнал активен). Порт B - статусные сигналы НГМД (чтение по адресу C0X1): B0, B1 - перемычки "Тип НГМД2" 0 0 - ЕС 5323.01 (1000 Кб) 0 1 - 500 Кбайт 1 0 - 250 Кбайт 1 1 - НГМД не подключен B2, B3 - перемычки "Тип НГМД1" 0 0 - ЕС 5323.01 (1000 Кб) 0 1 - 500 Кбайт 1 0 - 250 Кбайт 1 1 - НГМД не подключен B4 - сигнал "INDEX/SECTOR" (0) (сигнал датчика индексного отверстия ГМД); B5 - сигнал "WRITE PROTECT" (0) (защита от записи); B6 - сигнал "TRACK 0" (0) (дорожка 0); B7 - сигнал "READY" (0) (готовность НГМД) Порт C - управление НГМД и контроллером (запись по адресу C0X2 или поразрядное управление путем записи по адресу C0X3 - метод описан далее): C0 - сильная предкомпенсация записи (1); C1 - не используется; C2 - направление движения головки НГМД (0 - наружу, к дорожке 0; 1 - внутрь); C3 - переключение НГМД1/НГМД2 (0 - НГМД1, 1 - НГМД2); C4 - переключение головки НГМД (0 - нижняя, 1 - верхняя); C5 - выключение предкомпенсации записи (1); C6 - включение режима "Запись" (1); C7 - включение двигателя вращения (1). (шпиндельного двигателя НГМД). Если ПЭВМ имеет только один НГМД, это всегда НГМД1. Отдельные разряды порта C параллельного интерфейса Д15 имеют следующее назначение (в скобках указано значение бита, при котором данный сигнал активен): C2 (запись по адресу C0X7) - разрешение выдачи сигнала готовности к приему данных записи в разряд C7 (1); C4 (запись по адресу C0X7) - разрешение выдачи сигнала готовности данных чтения в разряд C7 (1); C6 (чтение по адресу C0X6) - состояние триггера, регистрирующего сбой синхронизации данных чтения (0 - зарегистрирован сбой); C7 (чтение по адресу C0X6) - готовность тракта записи/чтения (1). Как упоминалось ранее, допустимо побитное управление портами C параллельных интерфейсов Д14, Д15: для очистки бита (записи 0) нужно записать байт, равный номеру бита (0-7), умноженному на 2, по адрсу C0X3 (Д14) или C0X7 (Д15); для установки бита (записи 1) нужно записать по этим адресам байт, равный номеру бита, умноженному на 2, плюс единица. Далее приведены примеры программирования контроллера НГМД, в которых используется описанная процедура. В этих примерах предполагается, что регистр X центрального процессора содержит байт ($10, $20, ... , $60), равный номеру разъема с контроллером НГМД (1, 2, ... , 6), умноженному на $10. 1) Установка режима работы параллельных интерфейсов: lda #$92 sta $c083,x lda #$bd sta $c087,x 2) выбор НГМД (1, 2), включение накопителя. В этой программе предполагается, что перед ее использованием флажок переноса центрального процессора (ЦП) равен 0 для НГМД1 и 1 для НГМД2: lda #3 rol sta $c083,x - выбор НГМД lda #$0f sta $c083,x - включение выбранного НГМД 3) ожидание готовности НГМД l1:ldy $c081,x bmi l1 4) выбор направления движения головки НГМД Предполагается, что перед исполнением программы флажок переноса ЦП равен 0 для движения наружу (к дорожке 0) и равен 1 в противном случае: lda #2 rol sta $c083,x 5) один шаг головки НГМД (в направлении, предварительно выбранном предыдущей программой): sta $c089,x При движении головки между последовательными шагами необходимо делать программную задержку на время, указанное в техническом описании НГМД. Кроме того, необходима задержка между последним шагом и началом чтения/записи. Для НГМД ЕС 5323.01 задержка между шагами головки должна быть не менее 6 мс (миллисекунд), задержка для успокоения головки - не менее 15 мс. 6) Начальная установка головки НГМД с проверкой нахождения на дорожке 0: l2:lda $c081,x asl bpl l3 jsr delay jmp l2 l3:.... - продолжение программы 7) Выбор номера головки (стороны ГМД) Для двухголовочных накопителей (в т.ч. ЕС 5323.01) (c=0 (c-флажок переноса ЦП) - головка 0, нижняя поверхность ГМД, с=1 - головка 1, верхняя поверхность ГМД): lda #4 rol sta $c083,x 8) Подготовка к режиму "Чтение" Подключение сигнала готовности данных чтения к старшему биту порта C Д15: lda #9 sta $c087,x 9) Подготовка к регистрации сбоя синхронизации - очистка триггера: sta $c08a,x 10) Ожидание сбоя синхронизации: l4:lda $c086,x asl bmi l4 По сбою синхронизации чтения на дорожке ГМД определяется начало сектора. Сбой синхронизации, который искусственно организуется при записи данных (см. п. 16), позволяет при чтении выделить сектор среди сплошного потока байтов, записанных на дорожке. 11) Ожидание готовности данных чтения: l5:lda $c086,x bpl l5 12) Чтение данных с очисткой бита готовности: lda $c084,x Для проверки корректности данных чтения рекомендуется очищать синхротриггер в начале считывания блока данных и проверять его состояние в конце. Эпилог ($5A), записанный в конце блока данных, вызовет сбой синхронизации чтения, если внутри блока был пропущен (или прочитан лишний) бит данных/синхронизации. 13) Включение/выключение предкомпенсации записи (C=1 - включить, C=0 - выключить): lda #5 rol sta $c083,x Переключение "слабая/сильная" предкомпенсация (C=0 - слабая, C=1 - сильная): lda #0 rol sta $c083,x 14) Включение режима "Запись" и подключение сигнала готовности буфера данных записи к старшему биту порта C (C7) Д15. lda #$0d sta $c083,x - включение режима "Запись" lda #5 sta $c087,x - подключение сигнала готовности Перед подключением сигнала готовности данных записи необходимо отключить сигнал готовности данных чтения и наоборот. 15) Запись байта данных (записываемый байт находится в регистре АЦП): l6:ldy $c086,x bpl l6 - переход, если буфер занят sta $c085,x - буфер освободился, запись 16) Запись синхропоследовательности. Синхропоследовательность (2 байта - $A4 и $FF) записывается перед началом каждого сектора дорожки (точнее, перед началом адресного поля сектора, и его поля данных) для того, чтобы при чтении можно было выделить сектор среди других данных на дорожке. В отличие от обычных байтов данных, второй байт синхропоследовательности ($FF) записывается с дополнительной задержкой 2 мкс после записи байта $A4. При последующем чтении такой комбинации байтов установится синхротриггер. l6:ldy $c086,x bpl l6 lda #$A4 sta $c085,x l7:ldy $c086,x bpl l7 lda #$ff sta $c085,x sta $c088,x 17) Проверка сигнала "ЗАЩИТА ОТ ЗАПИСИ" lda $c081,x and #$20 beq l7 ... - запись на ГМД разрешена l7:... - запись на ГМД запрещена. 18) Отключение НГМД: lda #$0e sta $c083,x 19) Депрограммирование параллельного интерфейса Д14. Эта программа используется в ДОС "АГАТ" при обнаружении ошибок чтения/записи: lda #$98 sta $c083,x Дисковая операционная система "Агат" для НГМД ЕС 5323.01 позволяет на каждой дорожке записать 21 сектор. Каждый сектор содержит адресное поле и поле данных. Адресное поле состоит из расположенных друг за другом синхропоследовательности, пролога (2 байт - $95 и $6a), байта номера тома (VOLUME), байта номера дорожки (TRACK), байта номера сектора и эпилога (1 байта - $5a). За эпилогом следует несколько буферных байтов, которые не анализируются при чтении и записываются для того, чтобы ЦП успел проанализировать адресную информацию перед чтением поля данных. Поле данных состоит из расположенных друг за другом синхропоследовательности, пролога (2 байтов - $6a и $95), 256 байтов данных пользователя, байта контрольной суммы и эпилога (1 байта - $5a). Контрольная сумма представляет собой арифметическую сумму всех 256 байтов данных. После записи поля данных также записываются буферные байты. Применяемая в ДОС "АГАТ" разметка обеспечивает информационную емкость размеченного на накопителе ЕС 5323.01 ГМД, равную 840 Кбайт.