ДРАЙВЕР ДИСКОВЫХ ОПЕРАЦИЙ
Как было показано, средств ОС TR-DOS не совсем достаточно для
полного использования возможностей, предоставляемых микроконтролле-
ром КР1818ВГ93. Даже применяя средства интерпретатора системных фун-
кций, не всегда удается добиться желаемых результатов. Жестко заданный
формат физического дика не дает возможности переносить данные между
ZX Spectum и другими компьютерами, такими как Robotron или IBM.
С целью устранения этих недостатков автором была разработана
программа, выполняющая функции Базовой Системы ввода/вывода (BIOS)
для дисковых накопителей. В дальнейшем будем называть эту программу
драйвером* дисковых операций.
Общие сведения
Драйвер предназначен для автономного использования в программах,
работающих на совместимых с Sinclair ZX Spectrum компьютерах и напи-
санных на ассемблере или языках, трансляторы с которых имеют возмож-
ность стыковки с ассемблером. Компьютеры должны быть оборудованы
интерфейсом Beta Disk.
При первом обращении к драйверу происходит анализ номера версии
ОС, а также устанавливается область системных переменных TR-DOS,
Работа драйвера происходит по возможности автономно. Так он при-
меняет свой собственный стек, не используя из стека вызвавшей программы
ни одной ячейки. В драйвере используются регистры основного набора AF,
HL, DE и ВС. Работа подпрограмм драйвера происходит при выключенных
прерываниях, однако после завершения режим работы прерываний восста-
навливается.
Описание функций
Как и интерпретатор системных функций, драйвер разбит на не-
сколько функционально законченных подпрограмм, доступ к которым осу-
ществляется через единую точку входа. Номер подпрограммы (код функции)
передается в регистре С» параметры передаются через другие регистры, либо
через память.
0 RESEETC
Сброс контроллера (и установка магнитных головок выбранного диско-
вода в начальное положение). Работу с дисководом рекомендуется начи -
нать с этой функции.
1 CHDRV
вх: А [0...3] — номер дисковода.
Выбор текущего дисковода, все последующие операции будут происхо-
дить с выбранным дисководом. Физически дисковод выбирается при
выполнении функций 2, 5,..8, 10...14. Функции 2, 5...8, кроме того, могут
определять спецификацию дисковода при первом к нему обращении.
Скорость перемещения головки дисковода не определяется и устанавли-
вается максимальной (#03).
*) С несущественными изменениями этот драйвер вошел составной частью
в базовое программное обеспечение компьютера Scorpion ZS 256.
2 MPOS8T
вх: D [0...х] — номер логического трека.
Позиционирование на заданный логический трек. При выполнении этой
функции читается и проверяется номер дорожки, на которой находится
магнитная головка.
3 IGNORE
Игнорирование ошибки и продолжение выполнения функции 5 (или 6).
4 RETRY
Повторить в случае ошибки функцию 5 (или 6).
5 READGR
вх: D [0...х] — номер логического трека (первого обрабатываемого секто-
ра);
Е [0...х] — номер первого обрабатываемого сектора;
HL — адрес буфера;
В — количество секторов в операции.
Чтение группы секторов, расположенных подряд, начиная с указанного
регистрами D и Е, в буфер, заданный регистром HL. Количество секторов
задается в регистре В. Эта функция аналогична такой же в интерпрета-
торе системных функций. В случае возникновения ошибки чтения,
можно воспользоваться функциями 3 или 4. Функция 4 повторит считы-
вание сбойного сектора, а выполнение 3 функции игнорирует ошибку,
при этом в буфере будет пропущено столько байтов, сколько занимает
сбойный сектор.
6 WRITGR
вх: как у функции 5.
Запись группы секторов, расположенных подряд, начиная с указанного
регистрами D и Е, из буфера, заданного регистром HL. Количество
секторов задается в регистре В.
7 IDENT
Идентификация диска. По этой команде производится комплексный тест
дискеты, в процессе которого проверяется тип записи (частотная модуля-
ция или модифицированная частотная модуляция), количество исполь-
зуемых сторон дискеты (только при неформатированной верхней стороне
для одностороннего диска), количество рабочих дорожек (40/80) (только,
если нет старой разметки на 80), размер сектора (128/256/512/1024
байтов). Эти параметры используются в дальнейшем всеми функциями,
оперирующими с логическими величинами (2, 3...6). Посмотреть и/или
изменить код спецификации диска можно также с помощью функции 15.
8 TR_DOS
Идентификация диска для TR-DOS, аналогично функции #18 интерпре-
татора системных функций. Перед вызовом необходимо установить ра-
бочий буфер, размером не менее 256 байтов, используя функцию 9.
9 SETWRK
вх: HL — адрес рабочего буфера.
Установка рабочего буфера размером 256 байт для функции 8.
10 SCANSEC
вх: HL — адрес таблицы;
вых: таблица заголовков секторов, находящихся на дорожке.
Сканирование дорожки. Операция выполняется для той дорожки на
которую установлена головка дисковода (либо после функции 2, либо
после функции 14). В результате выполнения в памяти строится таблица
расположения секторов на дорожке начиная от индексного маркера. Эта
таблица (или аналогичная ей) является входной для последующих функ-
ций.
На каждый сектор в таблице отводится 5 байтов (см. табл. 19).
Байта +1...+4 извлекаются непосредственно из адресных маркеров
секторов,
11 FORMAT
вх: HL — адрес таблицы секторов;
DE — адрес рабочего буфера;
В — физический тип записи (FM/MFM).
Форматирование дорожки, на которой находится магнитная головка
дисковода. Форматирование производится согласно таблице секторов.
Непосредственно перед форматированием в рабочем буфере (адрес ко-
торого задается в DE) строится полная копия дорожки и, следовательно,
его размер должен быть не менее 6-7К. Тип физической записи задается
4 битом регистра В, таким образом: #00 соответствует режиму частотной
модуляции (FM), а #20 — модифицированной частотной модуляции
(MFM).
При построении дорожки учитывается идентификационный байт из
таблицы расположения секторов. При значении #FD в заголовок сектора
записывается номер дорожки, на которой находится магнитная головка
дисковода. При остальных значениях идентификационного байта пара-
метры из таблицы непосредственно переносятся в заголовок сектора,
никаких проверок на их корректность не производится (в том числе и на
размер сектора). Размер сектора выбирается согласно байту +4 (элементу
таблицы расположения секторов), заполняется сектор константой #FF.
12 FJtEAD
вх: HL — адрес таблицы секторов;
DE — адрес буфера дорожки.
Чтение дорожки. Порядок считывания определяется содержимым табли-
цы расположения секторов. Считанные сектора помещаются в буфер
дорожки, никаких разделителей между ними не ставится. Сектора со
значением идентификационного байта #FF или #FC не считываются, но
в буфере для них пропускается соответствующее длине (байт +4) место.
Если сектор не может быть считан, то соответствующий идентификатор
в таблице заменяется на #FD. Идентификатор успешно считанного
сектора заменяется на #FC, а по окончании операции все идентифика-
торы #FC автоматически переводятся в #00.
13 F_WRITE
вх: HL — адрес таблицы секторов;
DE — адрес буфера дорожки.
Последовательная запись. Порядок считывания определяется содержи-
мым таблицы расположения секторов. Сектора, для которых значение
идентификационного байта #FF или #FC не записываются, а в буфере
пропускается соответствующее длине такого сектора (байт +4) место.
Если сектор не может быть записан, то соответствующий идентификатор
в таблице заменяется на #FD. По окончании записи все идентификаторы
#FC автоматически переводятся в #00.
14 M_P0SF
вх: D — номер физической дорожки [0...х];
А — номер стороны (0 — нижняя, 1 — верхняя).
Физическое позиционирование на трек, номер которого задан в регистре
D. Не проверяется, на какой дорожке действительно находится магнитная
головка дисковода.
II ERRES
вх: HL — адрес таблицы секторов;
Е — заменяемый идентификатор;
D — устанавливаемый идентификатор.
Замена идентификаторов в таблице расположения секторов. Все иденти-
фикационные байты, совпадающие с заданным в регистре Е, заменяются
на указанный в регистре D.
и D1S1XT
вх: А — спецификация диска (см. табл. 20);
В — режим: #FF — установка, любое другое значение — чтение.
Чтение/установка спецификации дискеты (для каждого дисковода пре-
дусмотрена своя спецификация). Спецификация устанавливается также
функцией 7 (и 8).
17 DRVEXT
вых: А — код спецификации дисковода (см. табл. 21).
Чтение кода спецификации дисковода. Спецификация дисковода опре-
деляется и заносится в специальную ячейку внутри драйвера при выпол-
нении теста, который проводится при первом обращении к дисководу
функциями 2, 5...8. Функции 10.. 14 тест не выполняют.
18 SLTAHL
вых: HL — адрес таблицы конечных секторов.
Выдает адрес внутренней таблицы драйвера, в которой указывается
количество секторов на дорожке. Первые четыре байта для режима
частотной модуляции, последние для модифицированной частотной
модуляции. Первый байт в каждой четверке содержит количество секто-
ров при длине одного сектора равной 128 байтам, второй — при 256,
третий — при 512 и четвертый при 1024-байтовом секторе.
Эта таблица используется при пересчете номера дорожки в функциях 5
и 8.
19 TIMSUB
вх: В — байт установки time-out;
вых: HL — адрес процедуры time-out.
Установка режима time-out (тайм аут) для счетчика включения двигателя
дисковода.
Функции 2...8, 10...14 в начале работы включают двигатель дисково-
да. При этом отрабатывается задержка на время раскрутки двигателя. Если
для какого-либо дисковода включен режим time-out, то драйвер для последу-
ющих операций в состоянии определить время, в течении которого задержку
можно не делать, это существенно сокращает время работы. Для обеспечения
режима time-out необходимо каждые 1/50 сек, то есть раз в прерывание
вызывать специальную подпрограмму, адрес которой выдается в регистро-
вой паре HL. Вместо нее можно вызывать функцию 19 с обнуленным
регистром В. у
Сообщении об ошибках
При вызове любой функции драйвера специальная внутренняя пере-
менная, расположенная в третьем байте от начала драйвера (63003) получает
значение #FF. Если после выполнения функции ее значение не изменяется,
значит операция прошла успешно. В противном случае, в этой ячейке
возвращается код ошибки.
1 нет готовности (диск не крутится или его нет);
2 попытка записи на защищенную дискету (функции 6 и 13);
3 во время выполнения функции была нажата клавиша Break;
4 ошибка при чтении или записи сектора функциями 5 или 6, можно
воспользоваться функциями 3 или 4;
5 ошибка позиционирования (не соответствует номер дорожки);
6 ошибка позиционирования (не считался адресный маркер дорожки);
8 ошибка позиционирования, несоответствие типов (попытка использовать
8 0 -дорожечный диск на 40-дорожечном дисководе или двухсторонний
диск на одностороннем дисководе);
9 неформатированная дискета (функции 7, 8);
16 дискета не соответствует формату TR-DOS по физическим параметрам:
размер сектора, плотность записи, либо нет кода идентификатора — #10
в 9-ом секторе по смещению #Е7 (функция 8);
17 несовпадение кода типа дискеты TR-DOS реальному формату;
18 не открыт рабочий буфер (функция В);
20 были ошибки при чтении/записи дорожки (функции 12, 13).