Из журнала ZX-Guide#2, Рязань, Ноябрь 1999 (в текст внесены исправления из Errata IG#8) 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 - второй магнитной головке или верхней стороне; D6 выбор плотности записи. Сброс разряда заставляет микроконтроллер работать по методу модифицированной частотной моду- ляции (MFM), установка - по методу ча- стотной модуляции (FM). (Есть данные,что 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)