Персональная электронная
        вычислительная машина

               "АГАТ"
             исполнение 9 Д

         Техническое описание
Часть 7.  Программное обеспечение
         ПЭВМ "АГАТ"  исполнение 9
           Фг3.032.002 ТО6
Книга 3
Всего книг 10              1990 г

        Комментарии сделаны О.Вороновым.




        3.3.3.4. Обращение за информацией по физическим адресам

        Дисковод ЕС 5088.02, описываемый здесь, - это так называемый "килобайтник", обеспечивающий формат 5-дюймовых дискет: 1 сторона, 35 дорожек (ровно 140 К). Дисковод FD55 распространения совершенно не получил, но зато вместо него в моем регионе стояли везде так называемые "мегабайтники" (ЕС 5323) - примерно вдвое большей, чем у FD55, емкости (> 800 К). У них было 2 стороны и ровно 160 дорожек (по 80 на каждой), по 21 сектору на дорожке.

        Размер сектора на "Агате" у стандартной ДОС равен 256 байтам, хотя на физическом уровне, программируя дисковод через порты, можно сделать какой угодно размер (от 1 байта в секторе до единственного сектора аж на всю дорожку!) Подсчет контрольной суммы тоже можно вести каким угодно образом или не вести вовсе. Размер сектора может быть равен абсолютно любому числу - как поставишь счетчик в программе, хоть 73, хоть 158, хоть 993 байта! Не то, что на IBM.

        Так как на "Агате", в отличие от IBM, BIOS-а нет, нет и BIOS-стандарта нумерации поверхностей, дорожек, секторов; размер сектора у ДОС равен 256 байт просто потому, что так захотелось авторам самой ДОС (правда, начальный загрузчик из ПЗУ все же требует, чтобы сектор 0 дорожки 0 был размером 256 байт). Нумерация тоже выбрана авторами ДОС произвольно, а именно: номер поверхности не задается (как при обращении через BIOS на IBM), а есть единый номер дорожки, который включает в себя и номер поверхности. На 2-сторонней дискете дорожки нумеруются так:

1 3 5 7 9 11 13 15 17
---------------------- ...
0 2 4 6 8 10 12 14 16

        Тут надо сказать, что логических секторов, как на IBM (нумерующихся одним числом), в стандартной агатовской ДОС нет, везде идет нумерация двумя числами - номер дорожки и сектора.

        Далее авторы рассказали нам былину насчет того, что треки 0,1,2 якобы заняты программами ДОС, а остальные (кроме 17-го) целиком предоставлены пользователю. К ПО, которое поставлялось с этой документацией, это не относится. Записать ДОС на дискету без Бейсика невозможно, а при этом они занимают 5-6 младших дорожек, а не 3. На таких же дискетах, как ИКП-1, КПОН-1 система вообще занимает пару десятков дорожек вплоть до 17-й и за ней. На несистемных дискетах из младших дорожек пользователю недоступна лишь дорожка 0, но не потому, что там что-то есть, а просто из-за не совсем хорошего принципа: номер дорожки 00 служит признаком конца в ДОС, так что файлы ДОС на 0-й дорожке находиться не могут. Правда, некоторые форматировщики (не входящие в комплект ДОС) помещают туда программку, выдающую сообщение, как на IBM, что диск не загрузочный. Я разработал программу, помещающую бинарные файлы (например, игрушки) на эту же дорожку, тогда они грузятся мгновенно, без предварительной загрузки ДОС!

        На 17-й дорожке (это десятичное значение, шестнадцатеричное будет $11) и вправду располагается каталог ДОС (при любом формате дискеты), хотя каталог может быть расширен на несколько дорожек и даже пересен в другое место дискеты, ДОС будет это понимать и корректно работать с ним (правда, при слишком большом количестве файлов откажет копировщик из ИКП-1, а это нехорошо). Обязательно на 17-й дорожке служебную информацию несет лишь сектор $00, там ДОС-овский аналог IBM-овской FAT (без цепочек - chains, только информация о свободных секторах, 1 бит на сектор) и ссылка собственно на первый сектор каталога. Кроме того, в руководстве не обмолвились ни словом о продолжении этой самой FAT (даже при одном бите на сектор на дискете ЕС 5323 сектора $00 не хватает), находящемся в секторах $32, $00 (дорожка с шестнадцатеричным номером $32, сектор 00) и $72, $00.

        Про подпрограмму чтения/записи трека и сектора (ЧЗТС) все рассказано правильно. Она точно так и вызывается, в ДОС расположена по этому же адресу.



        3.3.4. Входные и выходные данные

        Здесь приведена таблица, используемая для вызова подпрограммы ЧЗТС. Правда, жаль, нет графы, какие данные входные, а какие - выходные, но это становится понятным из графы "Содержимое". Кроме того, не сказано, что выходным значением ЧЗТС является флаг C, как на IBM, сигнализирующий об ошибке, ну да одной недомолвкой больше...

        Для корректного вызова этой подпрограммы (пусть нам нужен трек номер TT, сектор SS) надо сделать следующее:

        1) Лучше всего место под таблицу не выделять, а использовать область памяти ДОС (с адреса $557). Чтобы найти адрес памяти по номеру байта в таблице (левая графа), надо, естественно, прибавить к $557 этот номер и вычесть 1 (т.к. нумерация в таблице идет от 1).

        2) Помещаем число 1 в байт 1 (тип таблицы).

        3) Помещаем номер разъема НГМД, умноженный на $10 (т.е. на десятичное 16) в байт 2, это тот самый номер, который выдает программа-копировщик из ИКП-1 в графе "Разъем". Обычно изменяется от 2 до 6. Например, для 5-го разъема надо записать в байт 2 число $50.

        4) Помещаем номер привода НГМД (обычно 1, реже - 2) в байт 3, это тот номер, который выдает копировщик из ИКП-1 в графе "Привод".

        5) Мудро пишем 0 в байт 4 (игнорировать номер тома).

        6) Пишем TT (требуемый номер трека) в байт 5, SS (номер сектора) - в байт 6. В таблице не даны их диапазоны изменения для дисковода ЕС 5323, так что вот они: трек - от $00 до $9F (включительно), сектор - $00..$14.

        7) Пишем 0 в байт 7 (так всегда делают).

        8) Пишем младший байт адреса буфера (куда будет идти чтение или откуда будет производиться запись) в байт 9, старший - в байт 10 (как обычно, младший в первом байте). Частенько буфер для чтения располагают так, чтобы младший байт был равен 0 (так иногда легче программировать).

        9) Пишем код работы в байт 13. Значение 0 можно никогда не использовать - даже если НГМД выключен, при чтении/записи подпрограмма ЧЗТС сама включит мотор и подведет головку, поэтому поместите туда 1 при чтении и 2 при записи. Еще есть код 4 - разметка. Разметка имеется в виду не одного сектора и даже не всей дорожки, а целого НГМД! Правда, в отличие от команды ДОС INIT, при этом не создается каталог и тем более на диск не пишется система - просто во всех секторах оказываются нули.

        10) Наконец, вызываем подпрограмму ЧЗТС (JSR $3D9 в Ассемблере). Предварительно надо не забыть поместить в регистр A старший, а в регистр Y - младший байты адреса таблицы (в нашем случае ДОС-овской, по адресу $3D9). Так что A должен быть равен $03, а Y - $D9.

        11) И в конце концов анализируем код возврата (была ошибка или нет). Казалось бы, как это сделать? Берем значение из байта 14 и проверяем? Э, нет! Оказывается, здесь, как на IBM, задействован флаг C, но в документации об этом нет ни слова!.. Если возникла ошибка (C=1), надо сбросить младшие 4 бита ячейки 14 командой AND #$F0 и проверить полученное значение - все коды ошибок имеют единицы в старших 4 битах, а младшие у них равны 0. При ошибке можно, например, повторить вызов ЧЗТС (для этого лучше проинициализировать все ячейки таблицы заново).

        Потребность анализировать данные, возвращаемые в ячейках 15, 16 и 17, при практической работе не возникает.

        Вот пример подпрограммы, вызывающей ЧЗТС. Ее имя - RWTS. Перед вызовом надо поместить в ячейки TR0 и SC0 номера трека и сектора, а в ячейку CD0 - код работы. Для этого определены две константы: READ (чтение) и WRITE (запись). Младший и старший байты адреса буфера записываются в ячейки BUFLOW и BUFHIGH. Потом вызывается RWTS. В случае ошибки она обращается к диску еще раз, пока все не будет нормально, и может при неисправимой ошибке зациклиться. Главная программа (с адреса $3000) читает в буфер BUF, расположенный по адресу $3100, содержимое сектора каталога (дорожка $11, сектор $00).

    DOS_TAB: EQU $557
    DOS_START: EQU $3D9
    READ: EQU 1; КОД ЧТЕНИЯ
    WRITE: EQU 2; КОД ЗАПИСИ
    TR0: EQU $300
    SC0: EQU $301
    CD0: EQU $302
    BUFLOW: EQU $303
    BUFHIGH: EQU $304
    
    BUF: EQU $3100
    
     ORG $3000
     LDA #>BUF
     STA BUFLOW
     LDA #<BUF
     STA BUFHIGH
     LDA #$11
     STA TR0
     LDA #0
     STA SC0
     LDA #READ
     STA CD0
     JSR RWTS
     RTS
    
    RWTS: LDA #0
     STA DOS_TAB+3
     STA DOS_TAB+6
     LDA TR0
     STA DOS_TAB+4
     LDA SC0
     STA DOS_TAB+5
     LDA BUFLOW
     STA DOS_TAB+8
     LDA BUFHIGH
     STA DOS_TAB+9
     LDA CD0
     STA DOS_TAB+12
     LDA #<DOS_TAB
     LDY #>DOS_TAB
     JSR DOS_START
     BCS RWTS
     RTS