[an error occurred while processing this directive]

.шп8

I.3 ОПИСАНИЕ МОДУЛЕЙ СИСТЕМЫ

.шп0

(стандарт 1.08.94; обобщенное описание - см. Приложение 1).

Ядро системы составляют пять модулей, написанных для языка Ассемблера ДОК, четыре из которых являются обязательными и непременно должны присутствовать в вашей библиотеке. Модуль RELMODUL.ASM является модулем настройки перемещаемых файлов и необходим только для их создания. Как правило, сам исходный текст RELMODUL.ASM не бывает нужен в повседневной работе, а для сборки перемещаемых драйверов достаточно иметь его объектный код (файл RELOCAT1.BIN).

I.3.1 ХАРАКТЕРИСТИКА И ОПИСАНИЕ МОДУЛЕЙ ЯДРА СИСТЕМЫ:

I.3.1.1. ALLDEFIN.ASM

Модуль определения общих меток. Задает множество полезных и определенное кол-во необходимых меток систем DOS 3.3, BASIC A.9.1 и системы "Монитор" для системных библиотек команд и нормального функционирования модулей ядра системы. В особых комментариях текст этого модуля не нуждается. Значения меток прокомментированы в его исходном тексте (Приложение 5.1). Полезно также иметь ввиду правильное использование в командных модулях памяти нулевой страницы ПЭВМ (Раздел 2.2).

I.3.1.2 SETDRMOD.ASM (версия 15.08.94)

Модуль установки драйвера в память. Располагается в начале драйвера сразу за заголовком драйвера (если только драйвер не перемещаемый; см. Приложение 2). Заголовок драйвера - важнейший 11-байтный фрагмент кода драйвера, определящий стратегию драйвера во время загрузки в оперативную память (далее ОП).

Формат заголовка драйвера:

.гр

.шп0

════════════╦════════════════════════════════════════════════
 ном. байта |               значение
════════════╬════════════════════════════════════════════════
     1      |   первый разделитель (константа ¤24 или @44)
            |
     2      |   главный атрибут драйвера
            |  (эквивалентен главной константе ассемблиро-
            |  вания; помещен в заголовок для пользователя)
-------------------------------------------------------------
 ном. битов !                   значение
------------!                                             
            !     бит установлен            бит сброшен
            !------------------------------------------------
            !                           !
     0      ! резерв                    !
     1      ! резерв                    !
     2      ! резерв                    !
     3      ! есть заставка             ! нет заставки 
     4      ! драйвер перемемещаемый    ! не перемещаемый
     5      ! работает с "Диспетчером"  ! не работает
     6      ! есть прог-ма инициализации! нет 
     7      ! драйвер в банках 8-F      ! драйвер в норм. ОЗУ
            !                           !
-------------------------------------------------------------
            |
     3      |   второй разделитель (константа ¤2C)
            |
     4-5    |   адрес начала интерпретатора драйвера
            |
     6      |   третий разделитель (константа ¤2C)
            |
     7-8    |   адрес программы инициализации драйвера
            |   (если бит 6, 2-го байта сброшен, то игнориру-
            |   ется)
            |
     9      |   четвертый разделитель (константа ¤2C)
            |
     10-11  |   адрес текста заставки драйвера
            |   (если бит 3, 2-го байта сброшен, то игнориру-
            |   ется)
════════════╩════════════════════════════════════════════════

.тт

Согласно данным заголовка драйвера модуль установки выполняет свои функции:

1) Активация (подключение интерпретатора драйвера к вектору ¤3F5)

2) Установка в систему "Диспетчер" (может заменять активацию; только для драйверов, поддерживающих работу с системой "Диспетчер" (см. Описание заголовка драйвера выше).

3) Инициализация драйвера (если процесс предусмотрен для данного драйвера)

4) Вывод заставки драйвера на экран (аналогично условию пункта 4)

Выполнение указанных действий (кроме 1) зависит от состояния главной константы ассемблирования ATRIBDR (см. исходный тест стартового файла драйвера; Раздел 5.1).

Заголовок драйвера как правило и согласно стандарту 1.08.94 не входит в модуль SETDRMOD.ASM (что также удобно для программиста), а хранится в стартовом файле драйвера, вызывающем все остальные модули для ассемблирования (пример стартового файла драйвера и его описание см. в Разделе 5.1).

В модуле установки драйвера в память SETDRMOD.ASM выведен принцип включения кодовых фрагментов через команды условного ассемблирования (DO-ELSE-FIN) ассемблера ДОК. Включение соответствующих фрагментов в объектный код установщика драйвера из исходного текста модуля SETDRMOD.ASM при ассемблировании зависит от того, нужны ли они конкретному драйверу или нет (что определяется по главной константе сборки ATRIBDR). Такой подход позволяет создавать драйвера, не имеющие лишних подпрограмм (что экономит как дисковую, так и оперативную память).

После выполнения своих функций, если процесс установки драйвера завершился успешно, установщик драйвера возвращает управление програмной среде (то есть ПЭВМ возвращается к режиму диалога в интерпретаторе "Бейсик" или "Бейсик" переходит к выполнению следующей команды (если драйвер был вызван с диска из программы на "Бейсике")). При этом драйвер становится активным в среде "Бейсик" (интерпретатор способен выполнять его команды).

При возникновении ошибки в поцессе установки драйвера (такой ошибкой в драйверах стандарта 1.08.94 может явиться только ошибка, возникающая при установке драйвера в систему "Диспетчер" (подробнее см. описание работы системы "Диспетчер")) драйвер сигнализирует о ее появлении. В режиме диалога загружаемый драйвер выдает сообщение "ОШИБКА УСТАНОВКИ", а если он был вызван из Бейсик-программы, обработка ошибок ведется согласно правилам их обработки интерпреатора "Бейсик". Драйвер может диагностиовать ошибку "МАЛО ПАМЯТИ" или "УЖЕ ЕСТЬ", либо обработав ошибку по подпрограмме обработки ошибок оператора ONERR GOTO при ее использовании в программе (причины возникновения ошибок см. в описании работы системы "Диспетчер"). Если установка драйвера прошла с ошибкой, то драйвер не производит действий инициализации и вывода заставки (если эти процессы предусмотрены в нем), а также не становится активным в среде "Бейсик".

Модуль SETDRMOD.ASM состоит из соответствующих подпрограмм проверки условий и выполнения вышеописанных действий и трудности для разбора не представляет. Все необходимые для понимания его исходного текста комментарии имеются в самом модуле SETDRMOD.ASM (Приложение 5.2).

I.3.1.3 INTPRALL.ASM

Модуль интерпретации команд драйвера. Является наиболее важной составляющей частью системы. Во всех драйверах "Системы", написанных до 15.01.95 был использован другой модуль интерпретации команды "INTRPRET.ASM" значительная часть которого была написана еще Волковым И.М. и в последующем переработана и улучшена программистами фирмы "Friends' software". Модуль "INTPRALL.ASM" является новой и гораздо более мощной версией модуля интерпретации команд, так как имеет возможности обрабатывать не только процедуры но и функции (см. далее). Кроме того его логическая структура имеет более совершенное построение и практически неограниченные возможности к расширению языковых конструкций. В нем также исправлены некоторые ошибки имевшиеся в модуле "INTRPRET.ASM". Поэтому построение драйверов с использованием модуля "INTPRALL.ASM" более предпочтительно (в прилагаемой Библиотеке исходных текстов имеется оба описываемых модуля). Далее в тексте подробно описывается модуль "INTPRALL.ASM".

Модуль осуществляет поиск в модуле команд текста имени команды, аналогично введенному пользователем с последующим вызовом подпрограммы отождествленной команды (то есть ее исполнением); при этом обработка команд являющихся функциями во многом отличается от обработки процедур (см. далее). Модуль также осуществляет обработку технических ошибок, возникающих при интерпретации, в формате обработки ошибок языка "Бейсик" (например таких, как "СИНТ. ОШ" или "ОШИБОЧНОЕ ЗНАЧЕНИЕ", "ПЕРЕПОЛНЕНИЕ", "МАЛО ПАМЯТИ" и.т.д... в зависимости от возникающей ошибочной ситуации).

Также одной из основных функций модуля является взятие параметров для интерпретируемой команды с сохранением их значений в специальных буферах так, что подпрограмма команды может ими воспользоваться. В модуле предусмотрена возможность "нестандартной интерпретации" (обсуждается ниже) с помощью которой возможна интерпретация команд в формате отличном от стандартного формата микроинтерпретатора. Например, только с помощью "нестандартной интерпретации" можно считывать строковые параметры.

Основные моменты работы модуля INTPRALL.ASM поясняются в комментариях в тексте самого модуля, однако для более полного понимания его работы требуется дать дополнительные разъяснения.

Работа объектного кода модуля INTPRALL.ASM начинается сразу после того, как интерпретатор "Бейсик" обнаружил в анализируемой строке ключевое слово "&" и обратился к подпрограмме по адресу ¤3F5 (то есть к микроинтерпретатору драйвера).

Объектный эквивалент модуля INTPRALL.ASM начинает свою работу с обнуления рабочих флагов поля команды (установленных предыдущим обращением к драйверу). Далее (см. Исходный текст модуля в разделе 3) микроинтерпретатор анализирует символ записи следующий после знака "&". Если этот символ кавычки (в обратном коде ¤22) считается, что далее должно следовать имя команды (помните, что имя команды должно быть заключено в кавычки!).

Иначе, считается, что перед именем команды стоит имя переменной (что может иметь место только для команд-функции) и интерпретатор драйвера переходит к подпрограмме обработки функций FUNCTION. Подпрограмма обработки функций в свою очередь сразу же обращается к подпрограмме по адресу ¤E007 интерпретатора "Бейсик". Эта подпрограмма оценивает имя переменной до первого, не относящегося к ней, знака в строке, учитывая его синтаксическую правильность и отыскивает в ОП указатель этой переменной (либо создает его, если переменная с таким именем до этого еще не употреблялась в программе). После этого адрес указателя переменной сохраняется в ячейках ¤85-¤86.

Внимание!

Указанные ячейки не должны использоваться Вашими функциями модулей команд. В случае обратного будет нарушена нормальная работа микроинтерпретатора драйвера.

Указанная подпрограмма (¤E007) возвращает также установленные флаги типа обнаруженной переменной.

Вы знаете, что интерпретатор "Бейсик" разрешает использование переменных трех типов:

целые (со знаком % в конце имени)

действительные (без специальных знаков)

строковые (со знаком ¤ в конце имени)

Подпрограмма ¤E007 возвращает флаги ¤11 (флаг типа переменной; число/строка) и ¤12 (флаг подтипа числовой переменной; целая/действительная), которые микроинтерпретатор драйвера временно сохраняет в стеке. Далее после имени переменной должен идти знак "=" и следующий знак кавычки. После проверки правильности записи этих знаков обработчик функций обращается к подпрограмме обычной интерпретации команд драйвера. (Процедуры интерпретируются сразу с этой подпрограммы (если после & сразу идут кавычки, см. выше)).

Подпрограмма INTOPER (общая интерпретация имени команды и параметров) начинает свою работу с того, что считывает имя команды в буфер для имени (подпрограмма RDOPER). При этом имя команды должно быть записано заглавными буквами и его длина не должна превышать 15 символов. Иначе интерпретатор диагностирует синтаксическую ошибку ("СИНТ. ОШ"). Если считывание прошло успешно, подпрограмма SEARCH осуществляет поиск поля команды с введенным именем в теле модуля команд по особым ссылкам и руководствуясь форматом поля команды (см. Раздел 4.1). При этом диагностируется синтаксическая ошибка, если команда с таким именем не найдена. При успешно завершенном поиске команды, следующая подпрограмма SETFLAG устанавливает рабочие флаги команды, превращая битовую карту 1-го байта поля команды в байтовую. При этом установленный флаг имеет значение ¤80, сброшенный - ¤00.

Таблицу флагов команды см. в исходном тексте модуля в разделе 3 (в настоящей версии модуля "INTPRALL.ASM" используется только 4 флага команды (FUNFLAG, WORKSIM, COMFLAG, FUNTYPE). Рабочие флаги команды используются в дальнейшем. Подпрограмма COMDIR проверяет разрешена ли данная команда как директива (по состоянию интерпретирующей среды и флагу COMFLAG). Если команда запрещена в качестве директивы и интерпретатор "Бейсик" находится во время ее анализа в режиме диалога, то диагностируется ошибка "НЕ В ДИАЛОГЕ".

Далее интерпретатор анализирует символ, стоящий после закрывающей кавычки. Если этот символ нуль или двоеточие, это означает, что команда не имеет параметров (т.к. после нее идет конец строки или разделитель команд) и микроинтерпретатор переходит к проверке кол-ва параметров (см. далее). Иначе даже для функций должна быть открывающая скобка (т.к. аргументы функции записываются по общеизвестным правилам в скобках). Параметры для прцедур следуют сразу за закрывающей кавычкой без каких-либо предшествующих знаков. Однако перед тем как приступить к считыванию параметров для команды анализируется флаг WORKSIM (флаг нестандартной интерпретации параметров). Если упомянутый флаг установлен, то микроинтерпретатор сразу переходит к выполнению команды (адрес ее исполняемой части установила в ячейки OPER и OPER+1 подпрограмма SEARCH).

Эта возможность предусмотрена специально для того, чтобы в качестве параметров команды можно было использовать строковые параметры или строки и числа в любых сочетаниях, а также любые произвольные записи и конструкции. В этом случае исполняемая часть команды должна сама позаботиться о дальнейшей интерпретации. Стандартная подпрограмма микроинтерпретатора GETPARAM может интерпретировать только числовые параметры и исполняется, если флаг WORKSIM оказывается сброшенным.

Подпрограмма GETPARAM в свою очередь обращается к подпрограммам интерпретатора "Бейсик" ¤DD4E и ¤E712, что позволяет использовать в качестве числовых параметров не только непосредственные числа, но также числовые переменные и логические выражения в формате языка "Бейсик". Подпрограмма ¤DD4E анализирует всю запись соответствующего параметра и вычисляет его окончательное значение, приводя его к одному числу в формате с плавающей запятой. Подпрограмма ¤E712 отбрасывает дробную часть числа, приводя его к двубайтовому формату. При этом если значение параметра не укладывается в двубайтовый формат (то есть превышает 65536), то выдается ошибка с диагностикой "ОШИБОЧНОЕ ЗНАЧЕНИЕ". Подпрограмма GETPARAM повторяет в цикле указанные действия, складывая параметры в специальные буферы BUF1 (значения младших байт параметров) и BUF11 (для старших) до тех пор, пока парамеры, разделяемые запятой, не закончатся. (То есть, пока не встретится признак кода строки (0) или двоеточие; обязательно наличие закрывающей скобки, предшествующей этим знакам).

Если команде сообщается более 20 параметров, микроинтерпретатор выдаст ошибку "ПЕРЕПОЛНЕНИЕ".

После успешного завершения считывания параметров, следующая подпрограмма CHECKPAR производит проверку их количества (данная подпрограмма выполняется и в том случае, если команде не было вообще сообщено параметров).

Подпрограмма CHECKPAR сверяет количество считанных параметров (хранится в XBUF1) со значениями количеств параметров, разрешенных для данной команды (хранятся в поле команды). Если значение XBUF1 (истинное количество считанных параметров) меньше минимального кол-ва параметров, разрешенных для команды, диагностируется ошибка "МАЛО ДАННЫХ". При аналогичной ошибке, если кол-во считанных параметров превышает разрешенное их максимальное количество, то диагностируется ошибка "ПЕРЕПОЛНЕНИЕ".

Иначе, считается, что общая интерпретация команды закончена и интерпретатор передает управление на кодовую часть (подпрограмму) самой команды, обращаясь к ней командой JSR. Таким образом, после ее выполнения управление снова вернется на микроинтерпретатор (в самой команде следует строго следить за сохранностью стека и его укзателя S).

Возвращаясь в микроинтерпретатор, команда-функция должна вернуть в регистрах данные своей работы (значение числа, либо указатель строки; подробно см. комментарии к исходному тексту модуля "INTPRALL.ASM"). При этом исполнение команды-процедуры прекращается и микроинтерпретатор драйвера возвращает управление интерпретатору "Бейсик". Для команд-функций если было употреблено имя переменной, то возвратясь на точку FUNRET, микроинтерпретатор производит присваивание возвращенных функцией данных данной переменной. Для этого используется обращение к специальным подпрограммам "Бейсика" (¤D9D7 для числовых результатов и ¤DA15 для строковых). Для функции, употребленной без имени переменной, возвращенное значение результата сохраняется в буфере результата (см. исходный текст "INTPRALL.ASM") и может быть использовано потом каскадной функцией. Подпрограмма присваивания результата сверяет тип результата функции (по флагу FUNTYPE) с типом переменной, употребленной с функцией. При несовпадении типов (например, числовой переменной присваивается строковое значение) выдается ошибка "ОШ. ТИП". (Проверка производится подпрограммой ¤DD54 путем сопоставления переменной (¤11) с типом результата функции FUNTYPE).

Примечание:

1. Точкой входа в интерпретатор драйвера является метка DRIVE (см. исходный текст "INTPRALL.ASM" в разделе 3). Однако вектор ¤3F5 может указывать не прямо на него, что имеет место для драйверов, располагающихся в банках ОЗУ. В этом случае он указывает на специальную подпрограмму, включающую банк с драйвером, который отключается после окончания работы интерпретатора.

2. Все ошибочные ситуации, обрабатываемые интерпретатором, реализуются через подпрограмму обработки ошибок интерпретатора "Бейсик" SYSERR (¤1844) входом в нее из точки BASERR. При этом учитывается состояние обработки ошибок по оператору ONERR GOTO (в этом случае сообщение об ошибке на экран не выдается, а ее код (при входе в подпрограмму в регистре X) записывается в ERRCOD (¤DE). Для драйверов, работающих в дополнительных банках основного ОЗУ, предусмотрена другая точка входа в подпрограмму обработки ошибок DRBASEXIT (см. исходный текст "INTPRALL.ASM"). В этом случае Ваша подпрограмма обработки ошибок должна отключить банк с драйвером, а затем перейти к подпрограмме SYSERR.

3. Обязательно изучите раздел 4 для освоения создания собственных команд в "Системе", а также исходный текст модуля "INTPRALL.ASM".

I.3.1.4 ALLSUBRS.ASM

Модуль общих подпрограмм системы. Содержит подпрограммы необходимые для работы модулей ядра системы, а также используемые практически во всех командных модулях. Версия модуля не указывается, т.к. набор подпрограмм модуля может неограниченно расширяться, в зависимости от дальнейшего прогресса в развитии ситемы. В настоящее время (стандарт 1.08.94) модуль находится в зачаточном состоянии и содержит всего три подпрограммы.

1) Подпрограмма DIALOG.

Предназначена для определения режима работы системы. Выясняет, находится ли система "Бейсик" в режиме диалога с пользователем, или происходит выполнение Бейсик-программы. Это бывает необходимо во многих случаях. Например, существуют операторы командного модуля, которые для своей работы используют буфер ¤200-¤2FF, что естественно нельзя делать в режиме диалога, т.к. программа ввода строки системы "Бейсик" пользуется тем же буфером.Логично, в подпрограммах обслуживания таких операторов проверять состояние диалога системы, и если включен режим диалога, прекращать работу, диагностируя ошибку интерпретатора "Бейсик"-"НЕ В ДИАЛОГЕ". (При использовании интерпретатора "INTPRALL.ASM" описываемые действия производятся автоматически в процессе интерпретации каждой команды.)

Подпрограмма DIALOG на выходе возвращает сброшенный флаг переноса (C=0), если система находится в режиме диалога и установленный (C=1), если выполняется программа пользователя.

2) Подпрограмма CH.PARH.

Используется во многих командах модулей команд, написанных фирмой "Friends' software". Предназначена для проверки величины значений параметров выполняемой команды. Как изветстно, микроинтерпретатор драйвера считывает параметры команды в специальные буферы, содержимое которых и проверяет подпрограмма CH.PARH. Подпрограмма передает управление вызвавшей ее команде, если проверка прошла успешно и диагностирует ошибку интерпретатора "ОШИБОЧНОЕ ЗНАЧЕНИЕ" (код 46) в случае, если хотя бы один из параметров больше 256. Подпрограмму следует использовать во всех командах, параметры которых являются однобайтовыми числами. Более детальные проверки на конкретные меньшие значения должны осуществляться уже самими командами.

3) Подпрограмма DECOZ (десятичное преобразование байта).

Бывает очень полезна, особенно когда требуется вывод информации для пользователя. (Помните, что параметры команд в буферах хранятся в шестнадцатеричной форме).

На входе в подпрограмму в аккумуляторе (регистр A) должен содержаться преобразуемый байт. После преобразования результат хранится в ячейках с меткой DNUMBER.

В DNUMBER хранятся единицы, в DNUMBER+1 - десятки, ячейка DNUMBER+2 хранит соответственно сотни. Результат сохраняется до следующего обращения к подпрограмме.

.ст Раздел I:3.2

[an error occurred while processing this directive]