#

TR-DOS - Программирование контроллера дисковода.

<b>TR-DOS</b> - Программирование контроллера дисковода.
                 TR-DOS
           Level 2: КР1818ВГ93
      Программирование контроллера.
 AlCo

   Микросхема ВГ93 - контроллер дисковода.
Она является сердцем интерфейса Beta-Disk,
на основе которого работает всеми нами лю-
бимый TR-DOS;)) (Хотя почему ";)"? Если вы
думаете, что это самая глючная и неудобная
система, то вы и представить себе не може-
те,насколько глючны программы Windows'95 и
Microsoft Office! Одно дело - слышать о их
глюках, и совсем другое - ежедневно  стра-
дать от них...)
   Сей  контроллер в сочетании с Beta disk
интерфейсом  поддерживает запись на диск в
двух форматах: FM и MFM (последний исполь-
зуется  шире) на не более чем 4 дисковода,
содержащие  до 256 дорожек и до двух голо-
вок.Для ламеров нелишне добавить,что обыч-
но используются двухсторонние пятидюймовые
дисководы  с числом  дорожек от 83 до 87 и
скоростью передачи  информации около 30k в
секунду (5 оборотов  в секунду  при  длине
дорожки 6300 байт).
   Микросхема  занимается управлением дви-
гателями  и головками  дисководов, снятием
сигналов с датчиков  на дисководах и пере-
дачей данных туда-сюда по последовательно-
му  порту (не более чем на одном дисководе
сразу).
   Для  всего этого контроллер имеет неко-
торое количество  буферных регистров и до-
статочно сложную систему команд.
   Взаимодействие с процессором компьютера
в интерфейсе  Beta Disk осуществляется че-
рез следующие порты,соответственно отожде-
ствляющиеся с регистрами контроллера:
  31=#1F на запись - Регистр команд
  31=#1F на чтение - Регистр состояний
  63=#3F двунаправленный - Регистр дорожки
  95=#5F двунаправленный - Регистр сектора
  127=#7F двунаправленный - Регистр данных

   а также особый порт с адресом #FF, пре-
доставляемый  самим Beta Disk интерфейсом;
Этот  порт называется Системный регистром.
Начнём с него (прямо по книге А.Ларченко и
Н.Родионова "TR-DOS для ..."):

   При чтении из системного регистра имеют 
смысл  только старшие два разряда, которые 
отражайт  состояние сигналов микроконтрол- 
лера  DRQ^ (D6) и INTRQ^ (D7). DRQ^ - сиг- 
нал,отражающий запрос данных микроконтрол- 
лером,INTRQ^ - сигнал окончания выполнения 
команды. 
   Для записи в системный регистр доступны 
пять разрядов. 
D0,D1 выбор дисковода.Установив соответст- 
  вующий код,можно выбрать один из четырёх 
  возможных дисководов:00 для дисковода A, 
  01 для B, 10 для C и 11 для D; 
D2 аппаратный сброс микроконтроллера... 
  (Если  сбросить  этот бит, то выполнение
  текущей команды прекращается, мотор дис-
  ковода глохнет и лампочка гаснет.) 
D3 этот разряд блокирует сигнал HLT микро- 
  контроллера, для нормальной работы в нём 
  должна  быть записана единица; (С другой 
  стороны, если  записать туда единицу, то
  вертушка дисковода,заведённая какой-либо
  командой, через  некоторое  время плавно
  остановится. А это чаще всего приводит к
  зависанию программ чтения с диска в слу-
  чае ошибки чтения.Яркий пример:загрузчик
  Magic-файла в TR-DOS.) 
D4 выбор магнитной головки.Содержимое это- 
  го разряда напрямую транслируется в дис- 
  ковод. 0 соответствует  первой магнитной 
  головке или нижней  стороне дискеты, 1 - 
  второй  магнитной  головке  или  верхней 
  стороне; 
D5 выбор  плотности  записи. Сброс разряда 
  заставляет  микроконтроллер  работать по 
  методу частотной модуляции (FM), устано- 
  вка - по методу модифицированной частот- 
  ной модуляции (MFM). (Есть данные,что FM 
  большинством Beta disk'ов не поддержива-
  ется.)

   Команды  контроллеру  передаются  через
регистр команд (31). Команда (кроме команд
принудительного прерывания) будет выполне-
на, только если контроллер не занят выпол-
нением другой команды.Самый простой способ
записать команду в регистр команд - вызва-
ть процедуру TR-DOS 5.03 с адресом 12227:
       LD A,<команда>
OUT_31 LD IX,12227
DOS    PUSH IX
       JP 15663 ;15664 работает не везде!
   Для  записи  в прочие порты контроллера
следует  использовать подпрограмму с адре-
сом 10835, содержащую OUT (C),A : RET.

       1. Команда восстановления.

   Магнитная  головка  текущего  дисковода
отъезжает на нулевую дорожку. Код команды:
%0000hvxx, где h=положение головки (0=под-
нять, 1=опустить, причём при h=0 двигатель
дисковода  не заводится), v=режим проверки
номера дорожки (если v=1,то с диска считы-
вается  номер дорожки и сравнивается с со-
держимым регистра дорожки),xx=скорость пе-
ремещения головки (x=00 - максимальная).
   Рекомендуемый код команды: 8.
   Адрес подпрограммы TR-DOS 5.03: 15768
(выход после успешного окончания операции,
либо по BREAK).

      2. Принудительное прерывание.

   Прерывает  выполнение  текущей операции
при достижении  одного из заданных условий
(условия задаются установкой соответствую-
щих битов в коде команды: %1101jjjj): D0 -
после  перехода  сигнала  CPRDY из низкого
уровня в высокий; D1 - наоборот; D2 - пос-
ле прихода индексного импульса (т.е. обна-
ружено начало дорожки либо просто диск от-
сутствует); D3 - немедленно. Остановка та-
кже произойдёт  немедленно, если  сбросить
все перечисленные биты.
   Рекомендуемый код команды: #D0.
   Адрес подпрограммы TR-DOS 5.03: 12225.

       3. Команды позиционирования.

   Перемещают головку дисковода. Важной их
чертой является то, что они при этом раск-
ручивают вертушку дисковода (что, впрочем,
делает и команда восстановления).

  Шаг к центру: %010ihvxx,где h-положение
головки, xx-скорость,v-проверка,i-будет ли
изменяться  регистр дорожки. Рекомендуемый
код команды: #58.

  Шаг от центра: %011ihvxx. Рекомендуемый
код команды: #68.

  Шаг в текущем направлении %001ihvxx.Ре-
комендуемый код команды: #38.

  Поиск дорожки: %0001hvxx.Переход на за-
данную дорожку.Номер требуемой дорожки ну-
жно поместить в регистр данных(перед запи-
сью команды,иначе не сработает на турбиро-
ванных ВГ).Рекомендуемый код команды: #18.

        4. Команды чтения.

  Чтение сектора(-ов): %100msec0, где m=0
(иначе будут обрабатываться все сектора до
конца дорожки. При этом номер каждого сле-
дующего  сектора  нужно заносить в регистр
сектора. Соответствующего участка подпрог-
рамм TR-DOS найти не удалось),s=номер сто-
роны (0-нижняя,1-верхняя. Принципиально не
важно,используется для проверки),e=задерж-
ка 15 мс между  установкой головки в рабо-
чее положение и началом операции, c=прове-
рка  указанного  номера стороны с номером,
считанным из заголовка сектора(лучше сбро-
сить, поскольку  как  правило  в заголовке
указана  неверная  сторона). Рекомендуемый
код команды:#80. Адрес подпрограммы TR-DOS
5.03, передающей данные из регистра данных
в память: 16341 (HL=addr,C=#7F,предварите-
льно  нужно записать команду в регистр ко-
манд. Если по выходе из программы B=0, это
указывает на ошибку чтения).

  Чтение заголовка сектора: %11000e00,где
e=задержка. Считывается 6 байт  из первого
попавшегося заголовка сектора:
      номер дорожки (0Ў86)
      номер стороны (0)
      номер сектора (1Ў16)
      длина сектора (0,1,2,3 соответствен-
но означает 128,256,512 или 1024 байта)
      2 байта Контрольного Кода.
При выполнении этой команды содержимое ре-
гистра дорожки пересылается в регистр сек-
тора.Рекомендуемый код команды: #C0.

  Чтение дорожки: %11100e00,где e=задерж-
ка. С дорожки  считывается вся информация,
включая пробелы, служебные байты и контро-
льные коды. Таким образом,считанная инфор-
мация не годится для команды "запись доро-
жки" (см.ниже).Ещё один маленький трабл: в
процессе выполнения команды происходит по-
теря синхронизации данных,поэтому несколь-
ко  сот байт в конце дорожки остаются неп-
рочитанными(каждый раз разное количество).
Рекомендуемый код операции: #E0.

         5. Команды записи.

  Запись сектора(-ов): %100mseca,где m=0,
s=0,e=задержка,c=0, a=указывает на один из
двух возможных форматов сектора.В дальней-
шем при считывании этот формат будет инди-
цироваться  в 5 бите  регистра  состояний.
Обычно  этот бит обнуляют, при этом в поле
заголовка  сектора формируется специальный
байт #FB,в противном случае - байт #F8.Ад-
рес  подпрограммы  TR-DOS 5.03, передающей
данные  из  памяти в регистр данных: 16314
(HL=addr, C=#7F,предварительно нужно запи-
сать команду в регистр команд).

  Запись(форматирование)дорожки %11110e00
(где e=задержка, которая  здесь совершенно
ни  к чему). Записывает на текущую дорожку
около 6k разнообразной информации, которая
последовательно  передаётся  через регистр
данных. Для  успешного  использования этой
команды  нужно  знать  формат дорожки. Для
примера можно посмотреть подпрограмму фор-
матирования  TR-DOS  по адресу 8189. А для
начала цитата из книжки:

   Эта команда предназначена  для разметки 
дискеты,то есть для её форматирования. Ин- 
формация,посылаемая в микроконтроллер,дол- 
жна  полностью  соответствовать выбранному 
формату.Запись автоматически начинается по 
приходу индексного импульса, то есть с на- 
чала дорожки. В отличие от записи сектора, 
количество записываемых байтов не фиксиро- 
вано, оно определяется конкретным форматом 
дискеты. Часть байтов будет просто записы- 
ваться,однако несколько из них интерпрети- 
руются в этой команде специальным образом. 
Они предназначены для формирования служеб- 
ных отметок,таких как адресные маркеры или 
контрольные коды (КК). 

байт        FM                 MFM 
#F5   Не допускается   Поле A1 (иниц-я КК) 
#F6   Не допускается     Синхроимпульс C2 
#F7   Зап.двух байт КК  
#F8ЎFB Инициализация КК   ├обычные байты 
#FC   Зап.индексной метки 
#FE   Иниц-я КК        Адр.метка заголовка 

   Формат дорожки включает в себя несколь- 
ко полей, для правильного формирования ко- 
торых необходимо придерживаться определён- 
ных стандартов... 
   Рассмотрим формат дорожки более подроб- 
но. Между информационными полями находятся 
области пробелов, служащие для синхрониза- 
ции  внитренних схем микроконтроллера. Чем 
больше поля пробелов,тем лучше синхронизи- 
руется контроллер, тем меньше сбоев проис- 
ходит  при  передаче информации. В таблице 
приведены рекомендуемые значения длин про- 
белов, а также значения байта, которым они 
заполняются. Уменьшив длину пробелов,можно 
получить  некоторый  выигрыш  в  объёме за 
счёт потери надёжности.(Величина последне- 
го пробела (последнего потому,что он пред- 
шествует формированию дорожки)особенно ва- 
жна.Небольшая длина,установленная авторами 
TR-DOS, не позволяет, кроме всего прочего, 
считывать первый сектор дискеты на больши- 
нстве IBM-совместимых компьютеров.) (Не на 
большинстве,а на всех - это ограничение пц
'шного контроллера;причём это никак не за-
висит от копировщика (AMD, Hobeta и т.п.),
который  вы  используете! Порядочную длину
последнего  пробела проставляют программы:
FUT,ADS,DCU 2.21 и некоторые другие.) 
   Каждый сектор логически состоит из двух 
информационных полей: поля заголовка и не- 
посредственно  следующего за ним поля дан- 
ных. В заголовке записана служебная инфор- 
мация о секторе,для этого использованы че- 
тыре  байта. Номер дорожки и номер сектора 
идентифицируют конкретный сектор. Принято, 
что  дорожки считаются с нуля, а сектора с 
единицы.. (Логический № сектора получается 
вычитанием единицы.) 
   Каждое информационное поле заканчивает- 
ся двумя байтами контрольного кода. 
   В качестве  данных  при  форматировании 
дорожки можно использовать любой не служе- 
бный байт, но обычно  применяют коды 0 или 
#FF. 
   Порядок  следования секторов на дорожке 
может  быть произвольным. Обычно он кратен 
некоторому целому числу,называемому inter- 
leaving - чередование.Если это число равно 
единице, то сектора расположены последова- 
тельно: 0,1,2... Для двух сектора распола- 
гаются  через  1, для трёх - через 2 и так 
далее. Чередование секторов влияет на ско- 
рость  обращения  к диску. После окончания 
записи  или  считывания очередного сектора 
программа  обычно  должна выполнить какие- 
либо действия, а на это затрачивается вре- 
мя,за которов дискета успевает повернуться 
на определённый угол.И к моменту очередно- 
го  обращения к диску под магнитной голов- 
кой может оказаться сектор, далеко отстоя- 
щий от предыдущего.Если секторы расположе- 
ны последовательно,то при обращении к сле- 
дующему  сектору программе придётся ждать, 
пока дискета сделает целый оборот. При со- 
ответствующем  чередовании  секторов время 
ожидания очередного сектора можно свести к 
минимуму. (Оптимальный интерлив, обеспечи- 
вающий  наибольшую скорость через операции
TR-DOS - это  единица (сектора расположены
последовательно). Но  не стоит думать, что
это  единственно  возможный  или наилучший
вариант. Например, загрузчики с музыкой во
многих демонстрациях рассчитаны под интер-
лив, равный 2 (как раз так форматирует TR-
DOS),а на видеодиске LOCOMOTION (Speed Co)
сектора  расположены вообще в обратном по-
рядке ("пессимальный" интерлив).Существует
также константа межтрекового интерлива: на
сколько секторов сдвигается последователь-
ность  секторов от дорожки к дорожке (речь
идёт о физических  дорожках, которых є87).
Обычно трековый интерлив равен нулю, но на
дисководах Teac, благодаря  встроенному  в
них искусственному интеллекту, для быстрой
работы  турбо-лоадеров  необходим трековый
интерлив  не меньше двойки. А для подпрог-
рамм TR-DOS (15635=#3D13) оптимальное зна-
чение - около 5 (так форматирует CONSUL).)

        Формат дорожки для MFM.

Последний пробел:   80x#4E
                   ў12x0
Поле C2:            3x#F6 ┐
Индексная метка:    1x#FC ├ необязательно
Первый пробел:     ў50x#4E│
                   ў12x0  ┘
 Поле A1:            3x#F5
 Адр.метка заголовка:1x#FE
 Номер дорожки
 Номер стороны
 Номер сектора
 Длина сектора
 Формирование КК:    1x#F7
 Второй пробел:     ў22x#4E (не меньше 12)
                    ў12x0 (не меньше 6)
 Поле A1:            3x#F5
 Адр.метка данных:   1x#FB
 Данные              NNxNN
 Формирование КК:    1x#F7
 Третий пробел:     ў54x#4E (не меньше 12)
Четвёртый пробел:   NNx#4E

        Регистр состояний #1F.

D7 - готовность дисковода
D6 - защита  записи (устанавливается всеми
   командами, кроме команд чтения)
D5 - в командах записи - индицирует ошибку
   записи (честно скажу, штука крайне ред-
   кая); в команде чтения сектора - повто-
   ряет значение бита a (см. запись секто-
  ров)
D4 - ошибка позиционирования (если исполь-
   зовалась проверка) или сектор не найден
D3 - ошибка в контрольном коде (либо  диск
   защищён, либо 1-2 бита прочитались неу-
   дачно)
D2 - потеря данных
D1 - в командах позиционирования - индекс-
   ный импульс. В других командах - сигнал
   на запрос данных  либо указание принять
   байт из регистра данных
D0 - занято, идёт выполнение команды.
   Считать его состояние можно несколькими
обходными  способами (специальной подпрог-
раммы  чтения  портов в TR-DOS 5.03 нет, и
если вы нашли её у себя, значит, у вас не-
стандартная версия ПЗУ).
   Способ Н.Родионова:
- Записать 0 в регистр дорожки;
- Записать #0A в регистр сектора;
- Записать 1 в регистр D;
- Вызвать подпрограмму по адресу 16179;
- Взять из рег. B значение рег. состояний;
- Восстановить в регистрах дорожки  и сек-
тора исходные значения.
   Способ М.Петрова:
- Записать в D номер дорожки;
- Записать в (#5CD8) число, отличное от 0;
- Вызвать подпрограмму #2740;
- Прочитать из (#5CCD) регистр состояний.

   В общем, данные  сугубо энциклопедичес-
кие. Но продвинутый читатель поймёт. Неко-
торые  детали  иллюстрирует исходник прог-
раммы MonoLoad.H, помещённый в Барахло.
   Подпрограммы TR-DOS проще всего  иссле-
довать в STS 5.1 (только не 6.2), выбрав в
Setup:ROM=DOS. Только учтите глюк в STS: в
DOS неверно трассируются команды LD r,(HL)
и им подобные.

             Литература.

1. А.Ларченко,Н.Родионов. TR-DOS для поль-
зователей и программистов(Питер)
2. Макс Петров о TR-DOS'е(ZX-Format#5)
3. PAUL ATRIDES."doc_help"(Spectrophoby#6)


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Вступление - Возможно скоро в продаже появится мышь для Спектрума. Мы с Никодимом над этим проектом ведем работу.
Editorial - riskej: пятый номер журнала genz перед вами!
Быть или не быть - О дигитайзере.
Поиск игр - Разыскиваются PC игры.
Groups - анкеты действующих групп: Fatality.

В этот день...   8 февраля