Часть 3. Расширение ОС Бейсик
Расположенная в ПЗУ
программа сервис-монитора
позволяет не только
отлаживать свои собствен-
ные программы, но и предо-
ставляет программисту це-
лый ряд функционально за-
конченных подпрограмм.
Вызов подпрограмм из
монитора осуществляется
через команду RST 8, за ко-
торой должно следовать
число (байт), указывающее
код подпрограммы (см.
табл.8).
ЗЛ. Вывод на принтер
Код символа, выводимого на принтер, помещается в регистор аккумуля-
тора. Если в процессе выполнения операции произошла ошибка (нажата
клавиша BREAK), то при возврате управления вызывающей программе будет
установлен флаг CY, в противном случае флаг сбрасывается.
LD а, 13
RST 8
DEFB #80
JR С, ERROR
_3.2. Вызов дисковой BIOS (81h)
Применяя средства интерпритатора системных функций операционной
системы TR-DOS, не всегда удается добиться желаемых результатов. Жестко
заданный формат физического диска не дает возможности переносить дан-
ные между ZX Spectrum и другими компьютерами, такими как Robotron или
IBM.
Встроенный в компьютер Scorpion ZS 256 драйвер дисковых операций
(дисковый BIOS) позволяет в какой-то мере преодолеть недостатки ОС TR-
DOS. Пользуясь драйвером, необходимо отдавать себе отчет в том, что прог-
раммы не будут работать на других компьютерах.
Драйвер не использует системные переменные TR-DOS. Работа драйвера
происходит автономно, он применяет свой собственный стек. В драйвере
используются или применяются значения всех регистров, поэтому их зна-
чения необходимо предварительно сохранить. Режим прерываний не влияет
на работу драйвера.
Неприятной особенностью является го обстоятельство, что все пересылки
между диском и памятью ограничены 2 и 3 банками памяти процессора (ад-
реса 16384...49151 включительно). Несоблюдение этого условия приведет к
разрушению информации в памяти сервис-монитора.
Как и интерпритатор системных функций, драйвер разбит на несколько
функционально законченных подпрограмм, доступ к которым осуществлчет-
ся через единую точку входа. Номер подпрограммы (код функции) переда-
ется в регистре С, параметры передаются через другие регистры, либо чере?
память. Подпрограмма 0...6 написаны Н. Ю. Родионовым. Ниже приведено
полное описание функций драйвера дисковых операций. В заголовке каждой
подпрограммы указаны входные и выходные параметры.
О(RESETC)
Сброс контроллера (и установка магнитных головок выбранного диско-
вода в начальное положение). Работу с дисководом рекомендуется начинать
с этой функции.
1 (CHDRV)
вх: А[0...3] - номер дисковода.
Выбор текущего дисковода, все последующие операции иудут
происходить с выбранным дисководом. Физически дисковод выбирается при
выполнении функций 2, 5...8, 10..Л 4. При первом включении компьютера
оба дисковода получают фиксированную спецификацию (которую можно
посмотреть/изменить в меню сервис-монитора SetUp/Disk utility, см.
стр.13). Если коду спецификации диска присвоить значение Offh (см. раздел
3.3.1. «.Системные переменные монитора», стр.33), то функции 2, 5...8, кро-
ме того, могут определять спецификацию дисковода при первом к нему обра-
щении. Скорость перемещения головки дисковода не определяется и уста-
навливается максимальной (03h).
2 (MPOSIT)
вх: D[0...x] - номер логического трека.
Позиционирование на заданный логический трек. При выполнении этой
функции читается и проверяется номер дорожки, на которой находится
матитная головка.
3 (IGNORE)
Игнорирование ошибки и продолжение выполнения функции 5 (или 6).
4(RETRY)
Повторить в случае ошибки функцию 5 (или 6).
5 (READGR)
вх: D [О-.-х] - номер логического трека (первого обрабатываемого
сектора);
Е[0...х] - номер первого обрабатыьаемого сектора;
HL-адрес буфера;
В - количество секторов в операции.
Чтение группы секторов, расположенных подряд, начиная с указанного
регистрами D и Е, в буфер, заданный регистром HL. Количество секторов
задается в регистре В. Эта функция аналогична такой же в интерпритаторе
системных функций. В случае возникновения ошибки чтения, можно вос-
пользоваться функциями 3 или 4. Функция 4 повторит считывание сбойного
сектора, а выполнение jj функции игнорирует ошибку, при этом в буфере
будет пропущено столько байт, сколько занимает сбойный сектор.
6 (WRITGR)
вх: как у функции 5.
Запись группы секторов, расположенных подряд, начиная с указанного
регистрами D и Е, из буфера, заданного регистром HL. Количество секторов
задается в регистре В.
7 (IDENT)
Идентификация диска. По этой команде производится комплексный тест
дискеты, в процессе которого проверяется тип записи (частотная моду-
ляция/модифицированная частотная модуляция), количество используемых
сторон дискеты (только при неформатированной верхней стороне односто-
роннего диска), количество рабочих дорожек (40/80) (только, если нет ста-
рой разметки на 80), размер сектора (128/256/512/1024 байт). Эти пара-
метры используются в дальнейшем всеми функциями, оперирующими с
логическими величинами (2,3...6). Посмотреть и/или изменить код
спецификации диска можно также с помощью функции 15.
8 (TR_DOS)
Идентификация диска для ОС TR-DOS, аналогична функции 18h
интерпритатора системных функций. Перед вызовом необходимо установить
рабочий буфер, размером не менее 256 байт, используя функцию 9.
9 (SETWRK)
вх: HL-адрес рабочего буфера.
Установка рабочего буфера для функции 8.
10. (SCANSEC)
вх: HL-адрес таблицы;
______ . _ вых: таблица заголовков секторов, находящихся на дорожке
Форматирование дорежкн. Операция выполняется для той дорожки, на
которую установлена головка дисковода (либо после функции 2, либо после
функции 14). В результате выполнения в памяти строится таблица располо-
жения секторов на дорожке, начиная от индексного маркера. Эта таблица
(или аналогичная ей) является входной для последующих функций.
На каждый сектор в таблице отводится 5 байт (см. табл.9).
Байты +1.. .+4 извлекаются непосредственно из адресных маркеров секторов.
и (FORMAT)
вх: HL-адрес таблицы секторов;
DE- адрес указателя;
В-должен содержать 20h.
Форматирование дорожки, на которой находится магнитная головка
дисковода. Форматирование производится согласно таблице секторов (см.
табл.9). Данные из таблицы напрямую переносятся на дискету, никаких про-
верок на их корректность не производится, заканчивает таблицу иденти-
фикационный байт, больший 128. Размер сектора выбирается согласно байту
+ 4, заполняется сектор константой 0.
После записи очередного сектора и бай] по адресу, содержащемуся и ре-
гистре DE, записывается число 2ch, а значение DE увеличивается па единицу.
12 (F_READ)
вх: HL-адрес таблицы секюров;
DE-адрес буфера дорожки.
Чтение дорожки. Порядок
считывания определяется со-
держимым таблицы располо-
жения секторов' (см. табл.9).
Считанные сектора помеща-
ются в буфер дорожки,
никаких разделителей между
ними не ставится. Сектора со
значением
идентификационного байга
OFFh или OFCh не счигьша-
ются, но в буфере для них про-
пускается соот нет с гву ющее
длине (байт + 4) место. Если
сектор не может быть считан,
то соответствующий
идентификатор в таблице за-
меняется на FDh.
Идентификатор успешно
считанного сектора заменяется
на FCh, а по окончании опе-
рации все идентификаторы
FCh автоматически переводят-
ся в 00h.
13 (F WRITE)
вх: HL-адрес таблицы секторов;
DE- адрес буфера дорожки.
Последовательная запись. Порядок считывания определяется содержимым
таблицы расположения секторов (см. табл.9). Сектора, для которьк значение иденти-
фикационного байта OFFh или OFCh не записываются, а в буфере пропускается
соответствующее длине такого сектора (байт + 4) место. Если сектор не может
быть записан, то соответствующий идентификатор в таблице заменяется на OFDh.
По окончании записи все идентификаторы OFCh автоматически переводятся в 00h.
14 (M_POSF)
вх: D-номер физической дорожки [0...х]
А-номер стороны: [0-нижняя, 1-верхняя].
Физическое позиционирование на трек, номер которого задан в регистре
D. Не проверяется, на какой дорожке действительно находится магнитная
головка дисковода.
15 (ERRES)
вх: HL-адрес таблицы секторов;
Е - заменяемый идентификатор;
D - устанавливаемый идентификатор.
Замена идентификатора в таблице расположения секторов (см. табл.9).
Все идентификационные байты, совпадающие с заданным в регистре Е за-
меняются на указанный в регистре D.
16 (DISEXT)
вх: А - спецификация диска (см. табл.10);
В - режим: OFFh - установка, другое - чтение.
Чтение/установка спецификации дискеты (для каждого дисковода пре-
дусмотрена своя спецификация). Спецификация устанавливается также
функцией 7 (и 8).
17 (DRVEXT)
вых: А-код спецификации дисковода (см. табл.11).
Чтение кода спецификации дисковода. Спецификация дисковода опре-
деляется и заносится в специальную ячейку внутри драйвера при выпол-
нении теста, который проводится при первом обращении к дисководу
функциями 2, 5...8 (либо при первом включении компьютера). Функции
10... 14 тест не выполняют.
19 (TIMSUB)
вх: В-байт установки time-out;
вых: HL-адрес процедуры time-out.
Установка режима time-out (тайм аут) для счетчика включения двигате-
ля дисковода.
Формат байта time-out представлен в табл. 12.
Функции 2...8, 10... 14 в начале работы включают двигатель дисковода,
при этом отрабатывается задержка на время раскрутки двигателя. Если для
какого-либо дисковода включен режим time-out, то драйвер для последу-
ющих операций в состоянии определить время, в течение которого задержку
можно не делать, это существенно сокращает время работы. Для обеспечения
режима time-out необходимо каждые 1/50 сек, то есть раз в прерывание вы-
зывать функцию 19 с обнуленным регистром В,
При работе драйвера могут возникать ошибки, связанные с нечитаемостью
дискет, несоответствием типов, а также некоторые другие. В этом случае после
возврата в программу пользователя будет установлен флаг переноса CY. Иден-
тифицировать ошибку можно, получив ее код из специальной переменной
сервис-монитора (см. раздел 3.3.1. «Системные переменные монитора» на стр.33).
Ниже даны коды ошибок драйвера дисковых операций, для специфических
ошибок в скобках приведены номера функций, в которых они могут случиться.
1 нет готовности (диск не крутится или его нет);
2 попытка записи на защищенную дискету (функции 6, 11 и 13);
3 во время выполнения функции была нажата клавиша BREAK;
4 ошибка при чтении или записи сектора функциями 5 или 6, можно
воспользоваться функциями 3 или 4;
5 ошибка позиционирования (не соответствует номер дорожки);
6 ошибка позиционирования (не считался адресный маркер дорожки);
8 ошибка позиционирования, несоответствие типов (попытка использо-
вать 80 дорожечный диск на 40 дорожечном дисководе);
9 неформатированная дискета (функции 7, 8);
16 дискета не соответствует формату TR-DOS по физическим параметрам:
размер сектора, плотность записи, либо нет кода идентификатора - 10h
(функция 8);
17 несовпадение кода типа дискеты TR-DOS реальному формату;
18 не открыт рабочий буфер (функция 8);
20 были ошибки при чтении/записи дорожки (функции 12,13).