Порты интерфейса 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.