Полное описание и дизассемблер ПЗУ TR-DOS 5.04T (5.03) 1995 г.

Глава 3 - порты интерфейса BETA DISC. Регистр состояния 1818ВГ-93. Коды ошибок. Формат описателя файла и диска. Ошибки в подпрограммах TR-DOS. Другие ошибки.


                Порты интерфейса BETA DISC.

Для управления интерфейсом BETA DISC используются порты:

 31 - вывод - регистр команд ВГ-93, ввод - регистр состояния
      ВГ-93.
 63 - регистр дорожки ВГ-93.
 95 - регистр сектора ВГ-93.
127 - регистр данных ВГ-93.
255 - вывод - системный регистр, ввод - сигналы DRQ и INTRQ.

Порт 31.

 Регистр команд - самый важный. С помощью его программа отдает
контроллеру команды на проведение операций. Микросхема может вы-
полнять 11 команд:

   BIN      HEX

0000HVRR #00 - #0F Восстановление.
0001HVRR #10 - #1F Поиск.
001THVRR #20 - #3F Шаг в предыдущем направлении.
010THVRR #40 - #5F Шаг вперед.
011THVRR #60 - #7F Шаг назад.
100MSECA #80 - #9F Чтение сектора.
101MSEC0 #A0 - #BF Запись сектора.
11000E00 #C0,  #C4 Чтение адреса.
11100E00 #E0,  #E4 Чтение дорожки.
11110E00 #F0,  #F4 Запись дорожки.
1101IIII #D0 - #DF Принудительное прерывание.

Флаговые биты:

RR - скорость позиционирования головки:
     ╔══╤══╤═════╗
     ║R1│R0│T шаг║
     ╟──┼──┼─────╢
     ║ 0│ 0│ 6 мс║
     ║ 0│ 1│12 мс║
     ║ 1│ 0│20 мс║
     ║ 1│ 1│30 мс║
     ╚══╧══╧═════╝
Эта таблица справедлива при тактовой частоте 1 мГц. При сигнале
TEST=0 период равен около 400 мс и не меняется.

V - проверка номера дорожки после позиционирования.
H - загрузка головки.
T - изменение номера дорожки в регистре дорожки после каждого
    шага.
A - тип адресной метки (0 - #FB, 1 - #F8).
C - проверка номера стороны диска при идентификации индексной
    области.
E - задержка после загрузки головки на 30 мс.
S - сторона диска.
M - мультисекторная операция.
I - условие прерывания:
    I0 - по переходу привода в состояние "готов".
    I1 - по переходу привода в состояние "не готов".
    I2 - по индексному импульсу.
    I3 - немедленно.

 Команда "восстановление" осуществляет позиционирование на до-
pожку 0. Если через 256 шагов сигнал TR00 не появится, то коман-
да прекращает работу. Всегда выполняется при сбросе контроллера
независимо от готовности дисковода.
 Команда "поиск" - в регистре дорожки должен находиться текущий
номер дорожки, а в регистре данных - требуемый. Перемещение го-
ловки происходит до их совпадения.
 Команда "шаг" продвигает головку на 1 шаг. Направление устанав-
ливается командами "вперед" и "назад".
 Команда "чтение сектора" читает с текущей дорожки сектор, номер
которого задан в регистре сектора. Сторона диска задается флагом
S (0, 1). При установленном флаге M читаются все сектора до кон-
ца дорожки. Флаг A - тип адресной метки: при A=1 - #F8, стирание
сектора разрешено; при A=0 - #FB, стирание запрещено. Вначале
читается идентификатор сектора; если таковой не найден, то в ре-
гистре состояния устанавливается флаг "массив не найден". Иначе
если совпали номера дорожки, стороны, сектора и контрольная сум-
ма, то то происходит чтение данных: очередной байт выдается в
регистр данных и сопровождается сигналом DRQ. Байт должен быть
считан из регистра данных до появление следующего, иначе в ре-
гистре состояния устанавливается флаг "потеря данных". В конце
чтения проверяется контрольная сумма и если она не совпадает, то
в регистре состояния устанавливается флаг "ошибка в контрольной
сумме". При этом мультисекторная операция прекращается.
 Команда "запись сектора" в части идентификации сектора выполня-
ется подобно предыдущей. Сигнал DRQ появляется при запросе пер-
вого байта данных. Затем вычисляются 22 байта для двойной плот-
ности (для одинарной 11) - пробел между индексной областью и
данными. После этого, если регистр данных получил байт, выдается
строб записи и записываются данные, начиная с нулевых байтов и
адресной метки. Регистр данных должен получать очередной байт в
ответ на каждый сигнал DRQ со скоростью записи. Если байт не по-
лучен, то в регистре состояния устанавливается бит "потеря дан-
ных", а на диск записывается байт 0. После данных записывается
контрольная сумма и байт - пробел. Сигнал WSTB устанавливается в
0.
 Команда "чтение адреса" считывает 6 байтов первого попавшегося
идентификатора сектора, включая контрольную сумму. Если кон-
трольная сумма не совпадает, то устанавливается флаг "ошибка в
контрольной сумме" и чтение продолжается. При выполнении этой
команды байт из регистра дорожки помещается в регистр сектора.
По окончании как обычно вырабатывается сигнал INTRQ и в регистре
состояния сбрасывается бит "занято".
 Команда "чтение дорожки" читает всю информацию с дорожки, вклю-
чая служебную.  При этом не выдается строб чтения и не проверя-
ются контрольные суммы.
 Команда "запись дорожки" предназначена для форматирования дис-
ков. Вся информация, включая пробелы и поля индексов и данных со
всеми метками. Записываются все байты кроме #F5 - #FE, которые
интерпретируются как управляющие адресные метки. Таким образом
при форматировании эти байты не могут быть записаны. Список этих
байтов вы видите в таблице:
╔═════════╤════════════════════════════════════════════════════╗
║         │                     Hазначение.                    ║
║   Байт  ├──────────────────────────┬─────────────────────────╢
║         │       В режиме FM.       │     В режиме MFM.       ║
╟─────────┼──────────────────────────┼─────────────────────────╢
║      #F5│Не допускается.           │Запись метки #A1 в MFM.  ║
║         │                          │Вычис-                   ║
║         │                          │ляется контрольная сумма.║
║      #F6│Не допускается.           │Запись метки #C2 в MFM.  ║
║      #F7│Записывается вычисленная контрольная сумма.         ║
║#F8 - #FB│Запись #F8 - #FB с CLK=#C7│Запись #F8 - #FB в MFM.  ║
║      #FC│Запись #FC с CLK=#D7      │Запись #FC в MFM.        ║
║         │(индексная метка перед первым индексным массивом).  ║
║      #FD│Запись #FD с CLK=#FF.     │Запись #FD в MFM.        ║
║      #FE│Запись #FE с CLK=#C7. Вы- │Запись #FE в MFM.        ║
║         │числяется контрольная сум-│                         ║
║         │ма (индексная метка в начале индексного массива).   ║
║      #FF│Запись #FF с CLK=#FF.     │Запись #FF в MFM.        ║
╚═════════╧══════════════════════════╧═════════════════════════╝
 Команда "принудительное прерывание" задается для завершения лю-
бой выполняемой команды. В отличие от других команд она может
выдаваться в любой момент времени. Условие прерывания зависит от
младших битов команды. Если они равны 0, то команда прерывается
и INTRQ не вырабатывается. При I0=1 прерывание выполняется пос-
ле перехода сигнала CPRDY из 0 в 1; при I1=1 - из 1 в 0. При I2=
=1 - по поступлению индексного импульса. При I3=1 происходит не-
медленное прерывание команды. После выполнения этих условий вы-
дается сигнал INTRQ.

                Регистр состояния 1818ВГ-93.

 После выполнения в регистре состояния будут находится флаги,
показывающие результат выполнения команды:
╔═══════════════╤═══════════════╗
║               │Разряд регистра║
║    Команда    ├─┬─┬─┬─┬─┬─┬─┬─╢
║               │7│6│5│4│3│2│1│0║
╟───────────────┼─┼─┼─┼─┼─┼─┼─┼─╢
║Вспомогательная│R│P│H│F│C│T│I│Q║
║Чтение адреса  │R│0│0│N│C│W│D│Q║
║Чтение сектора │R│0│A│N│C│W│D│Q║
║Чтение дорожки │R│0│0│0│0│W│D│Q║
║Запись сектора │R│P│E│N│C│W│D│Q║
║Запись дорожки │R│P│E│0│0│W│D│Q║
╚═══════════════╧═╧═╧═╧═╧═╧═╧═╧═╝
Значения флагов:
R - готовность дисковода (1 - не готов).
P - защита от записи.
H - загрузка головки.
E - ошибка записи.
A - тип адресной метки.
F - ошибка поиска.
N - массив не найден.
C - ошибка в контрольной сумме.
T - головка на дорожке 0 (сигнал TR00 от дисковода).
W - потеря данных.
I - индексный импульс.
D - запрос данных.
Q - занято (идет выполнение команды).

Порт 255.

 Системный регистр служит для выбора дисководов и выполнения дру-
гих вспомогательных действий. Его структура:

7 6 5 4 3 2 1 0
  │   │ │ │ └─┴─Номер дисковода (0 - 3).
  │   │ │ └─────Сброс ВГ-93, если 0.
  │   │ └───────Загрузка головки.
  │   └─────────Сторона диска (0 - нижняя).
  └─────────────Метод записи (0 - FM, 1 - MFM).

 При вводе из этого порта читаются сигналы:

бит 7 - INTRQ;
бит 6 - DRQ.

 К сожалению, порты TR-DOS доступны только тогда, когда включено
ПЗУ TR-DOS, что очень затрудняет доступ к ним. Но для записи в
порты можно использовать следующие подпрограммы:

12227 OUT (31),A
      RET
7738  OUT (63),A
      RET
8179  OUT (255),A
      RET
12044 OUT (255),A
      RET
10835 OUT (C),A
      RET

 Для чтения из портов подобных подпрограмм, увы, нет.

                         Коды ошибок:

 В TR-DOS обработка ошибок реализована весьма некорректно, но
все же можно различить ошибки, если воспользоваться двумя пере-
менными: 23610 и 23823.
╔════════════════════╤═════════════════════════════╤═════╤═════╗
║Сообщение об ошибке.│Значение.                    │23610│23823║
╟────────────────────┼─────────────────────────────┼─────┼─────╢
║O.K.                │Нормальное завершение.       │ 255 │  0  ║
║No file(s)          │Требуемый файл не найден.    │ 255 │  1  ║
║File exists         │Файл уже существует.         │ 255 │  2  ║
║No space            │Нет места на диске.          │ 255 │  3  ║
║Directory full      │Нет места в каталоге диска.  │ 255 │  4  ║
║Rec O|F             │Обращение к несуществующему  │ 255 │  5  ║
║                    │сектору файла.               │     │     ║
║No disc             │Нет диска в дисководе.       │  26 │  6  ║
║Disc error          │Дисковая ошибка. Есть 3 вари-│  26 │  7  ║
║Trk XX sec XX       │анта: R - еще раз попробо-   │     │     ║
║Retry,Abort,Ignore? │вать, I - продолжить со сле- │     │     ║
║                    │дующего сектора, A - отка-   │     │     ║
║                    │заться от операции.          │     │     ║
║Read only           │Диск защищен от записи. Есть │  26 │  7  ║
║Trk XX sec XX       │3 варианта ( смотрите выше). │     │     ║
║Retry,Abort,Ignore? │                             │     │     ║
║Stream opened       │Открываемый поток уже занят. │  25 │ 10  ║
║Not disk file       │Закрываемый канал не принад- │ 255 │ 11  ║
║                    │лежит TR-DOS.                │     │     ║
║Array not found     │Требуемая переменная не най- │ 255 │ 14  ║
║                    │дена.                        │   1 │  1  ║
║*BREAK*             │Нажата клавиша BREAK.        │  20 │ 20  ║
║                    │                             │  12 │ 12  ║
║Out of RAM          │Не хватает оперативной памяти│   3 │  3  ║
║Disc error          │Диск не принадлежит TR-DOS.  │ 255 │  0  ║
║Read only           │Попытка записи на 40-дорожеч-│ 255 │  *  ║
║                    │ный диск на 80-дорожечном    │     │     ║
║                    │дисководе.                   │     │     ║
║*ERROR*             │Прочие ошибки, в основном    │  11 │ 12  ║
║                    │синтаксические.              │   X │X+1  ║
╚════════════════════╧═════════════════════════════╧═════╧═════╝
* - копия переменной с типом дисковода,
X - любое число.
В случае вывода сообщения Retry,Abort,Ignore? коды ошибки уста-
навливаются при ответе A.

                   Формат описателя файла.

байты 0 - 7 -   имя файла.
байт  8 -       расширение файла.
байты 9 - 10 -  для кодов и массивов - адрес загрузки, для прог-
                рамм на бейсике - длина файла, для файлов дан-
                ных:
                байт 9 -  номер блока в файле,
                байт 10 - любой, TR-DOS всегда устанавливает 32.
байты 11 - 12 - для массивов и кодов - длина файла, для программ
                на бейсике - длина программы, для файлов данных
                - длина записанной части блока.
байт  13 -      Длина файла в секторах.
байт  14 -      Номер первого сектора файла.
байт  15 -      номер первой дорожки файла.

          Формат описателя диска (сектор 8 дорожки 0).

байты   0 - 224 - не используются.
байт  225 -       номер первого свободного сектора.
байт  226 -       номер первой свободной дорожки.
байт  227 -       тип диска:
                   22 - 80-дорожечный двухсторонний,
                   23 - 40-дорожечный двухсторонний,
                   24 - 80-дорожечный односторонний,
                   25 - 40-дорожечный односторонний.
байт  228 -       количество файлов на диске вместе со стертыми.
байты 229 - 230 - количество свободных секторов.
байт  231 -       всегда 16 - признак принадлежности диска к
                  TR-DOS.
байты 232 - 243 - не используются. Байты 234 - 242 TR-DOS запол-
                  няет байтом 32.
байт  244 -       количество стертых файлов.
байты 245 - 252 - имя диска.
байты 253 - 255 - не используются.

               Ошибки в подпрограммах TR-DOS.

 Фатальные ошибки:

Ошибки PEEK  POKE - невозможно работать с файлами с расширением
                     B и D. Также нельзя работать с последним
                     сектором любого файла.
Ошибка PEEK -        после сектора дочитывается столько байтов
                     из следующего, сколько указано в младшем
                     байте длины файла. Эта ошибка обходится при
                     использовании подпрограммы 15635.
Ошибки MAGIC -       портит адреса 23552 и 23553. Если по адре-
                     су 23304 будет 238, то в порт 32765 загру-
                     зится число из 23388. Делает 20 попыток за-
                     писи на диск с заклеенной прорезью.
Ошибка RUN -         некорректно запускает кодовые файлы.
Ошибка PRINT# -      При создании нового блока файла портит бу-
                     фер, из-за чего может не сработать CAT# или
                     LIST#.
Ошибка RESET -       помещает по адресу 23746 команду RET без
                     наличия системных переменных TR-DOS.
Ошибка CAT -         Если номера дисководов в 23801 и 23798 раз-
                     ные, то произойдет что угодно.
Ошибка позиционирования -
                     не учитывается скорость перемещения головки
                     дисковода.

 Другие ошибки:

Ошибка выбора дисковода -
                   не проверяется тип дисковода, если в перемен-
                   ной 255, а если ее изменить, то тип дисковода
                   будет все время переопределяться.
Ошибка чтения адресного маркера -
                   флаг игнорирования ошибки берется из 23761,
                   а не из 23831.
Ошибка всех COPY - портится переменная 23840, а при COPY S - еще
                   и 23839.
Ошибки GO TO -     цвет бордюра берется из 23624. Для сохранения
                   длины имени файла используется экран, хотя в
                   этом нет необходимости. При загрузке файлов
                   страниц нажатие BREAK или ответ A на вопрос
                   Retry,Abort,Ignore? Приведет к чему угодно.
Ошибки PRINT# и INPUT# -
                   после вопроса Retry,Abort,Ignore? или нажатия
                   BREAK будет что угодно.
Ошибка настройки на диск -
                   не проверяется возможность использования дис-
                   ковода в требуемом режиме. Совершенно непра-
                   вильно обрабатывается DISC ERROR.
Ошибка READ ONLY - при попытке записи на 40-дорожечный диск на
                   80-дорожечном дисководе сообщение выдается
                   правильно, но в переменной 23823 вместо кода
                   ошибки будет копия переменной с типом диско-
                   вода.
Ошибка BREAK -     при нажатии BREAK выдается сообщение BREAK
                   INTO PROGRAM вместо BREAK-CONT REPEATS.



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Музыка - Однобитная музыка: почему бипер ZX Spectrum продолжает вызывать восхищение?
Новости - видeорeжимы AТM Тurbо 2, 2D-анимация, Лингвофорум, Oрфовики.
Прогаммистам - Интеллект.
Почтовый ящик - GENERAL SOUND - готов.
Сплошные приколы - 5 приколов. Сборник высказываний советских офицеров (продолжение).

В этот день...   23 ноября