[an error occurred while processing this directive]
.гр
.ао0
.ми0
.шп8
╔═════════════════════════════════════════════════════════╗ | Стандарт драйверов библиотеки BASIC-процедур от 1.08.94.| ╚═════════════════════════════════════════════════════════╝
.шп0
Настоящий стандарт был выработан в результате длительного творческого поиска програмистов фирмы "Friends' software" с целью облегчить сборку и привести к единой системе процесс ассемблирования драйверов процедур фирмы. Естественно строение объектного кода собираемых драйверов стало более логичным и соответствует принципам объектного ориентирования.
.шп72
Драйвера, собираемые (ассемблируемые) по стандарту от 1.08.94 предполагают:
.шп0
1. Общую схему ассемблирования определяемую главной константой ассемблирования ATRIBDR (см. исходные тексты) и спланированную в стартовых файлах сборки.
2. Наличие обязательных общих исходных модулей ассемблирования (существенно их взаиморасположение при ассемблировании):
А] ALLDEFIN.ASM (содержит определения общих меток)
Б] SETDRMOD.ASM (версия 5.08.94; обеспечивает установку драйвера в оперативную память, систему "Диспетчер", инициализацию, вывод заставки итд... если это предусмотрено)
В] INTRPRET.ASM (версия 5.08.94; интерпретатор команд драйвера, обеспечивающий связь драйвера со средой BASIC)
Г] ALLSUBRS.ASM (общие подпрограммы драйвера)
3. Наличие необязательных модулей (непосредственно составляющих исходный текст драйвера).
4. Наличие необязательного модуля универсальной обработки ошибок ERRORMOD.ASM.
5. Возможность поддержки формата перемещаемых файлов ассемблера ДОК (для их функционирования в среде BASIC необходимо связать их с объектным кодом настройщика псевдоперемещаемых файлов модуля RELMODUL.ASM (версия 15.08.94).
6. Возможность поддержки системы взаимодействия драйверов "Диспетчер" (версия 1.00).
7. Полную корректность взаимодействия со всеми структурами рабочей среды (DOS 3.3 и интерпретатор BASIC A.9.1).
8. Поддержку обработки ошибок среды BASIC в стандартном варианте и при использовании оператора "ONERR GOTO" (при этом передаваемые коды ошибок соответствуют таковым у интерпретатора и DOS)
9. После ассемблирования и сборки, драйвера стандарта 1.08.94 имеют общую схему строения объектного кода (приводится ниже):
.сс
.шп72
═════════════════════════════════════════════════════════════ Схема внутренней структуры драйвера процедур для итерпретатора "Бейсик А.9.1" (для версий, выпущенных после 1.08.94) ═════════════════════════════════════════════════════════════ .шп0 ┓ ┓ ╔══════════╗ | | 1) |HACTPOЙЩИK| ╠ I-й блoк | ╚══════════╝ | | ┛ | ╔═══════════╗┓ | |Cпeциaльнaя|| | 2) | тaблицa || | | зaгpузки || | ╚═══════════╝| | | | ╔═══════════╗| ┓ | 3) |Зaгoлoвoк || | | пepeмeщaeмый | драйвера || | ╠ ╚═══════════╝| | простой | драйвер | ╠ | ╔═══════════╗| | драйвер | 4) | Кодовая |╠ II-й блoк | | | часть || | | ╚═══════════╝| ┛ | | | ╔═══════════╗| | 5) |Taблицa || | |пepeмeщeния|| | ╚═══════════╝| | | | ╔-----------╗| | ! Taблицa !| | 6) !глoбaльныx !| | ! мeтoк !| | ╚-----------╝┛ ┛
.шп1
* Объяснения:
.шп0
Простой драйвер содержит только части 3 и 4, перемещаемый - все (обычно кроме 6-й).
Блоки I и II ассемблируются отдельно и собираются в один файл, который и является программой, готовой к запуску.
1) Hacтpoйщик (длинa ¤C9 бaйт) - cпeциaльный, oтдeльнo acceмблиpуeмый мoдуль. Cлужит для нacтpoйки пepeмeщaeмыx дpaйвepoв в пpoизвoльную зoну пaмяти.
2) Cпeциaльнaя тaблицa зaгpузки (длинa ¤6 бaйт). Пopoждaeтcя тoлькo для пepeмeщaeмыx дpaйвepoв.
.шп1
Фopмaт тaблицы:
.шп0
Бaйты Знaчeниe 0-1 Aдpec,зaдaнный в ORG (A) 2-3 Oбщaя длинa блoкa II (L) 4-5 длинa кoдoвoй чacти блoкa II-3 (K-3)
3) Зaгoлoвoк дpaйвepa (длинa ¤B бaйт). Heoбxoдим для дaльнeйшиx дeйcтвий дpaйвepa пocлe зaгpузки.
.шп1
Фopмaт зaгoлoвкa:
.гр
.ао0
.во0
.но3
.шп72
.ми0
═════════════════════════════════════════════════════════════ ОПИСАНИЕ ЗАГОЛОВКА ДРАЙВЕРА ПРОЦЕДУР к ИНТЕРПРЕТАТОРУ "БЕЙСИК" ПЭВМ "АГАТ-9" ═════════════════════════════════════════════════════════════
.шп0
Каждый драйвер, содержащий набор операторов, расширяющих возможности интерпретатора "БЕЙСИК" имеет (кроме версии, выпущенных фирмой "Friends' software" до 1.08.94) 11-ти байтный заголовок, байты которого несут определенный смысл и определяют основные действия драйвера во время загрузки в память ПЭВМ.
.шп1
Формат заголовка драйвера:
.шп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-го байта сброшен, то игнориру- | ется) ════════════╩════════════════════════════════════════════════
4) Koдoвaя чacть дpaйвepa - нeпocpeдcтвeннo тeлo дpaйвepa, включaющee микpoинтepпpeтaтop кoмaнд, cпeциaльныe пoдпpoгpaммы и кoд мoдульныx тeкcтoв пpoцeдуp дpaйвepa.
5) Taблицa пepeмeщeния - cпeциaльнaя тaблицa дaнныx o мeткax в ocoбoм фopмaтe. Пopoждaeтcя acceмблepoм пpи укaзaнии пceвдoкoмaнды REL (тoлькo для пepeмeщaeмыx фaйлoв).
6) Taблицa глoбaльныx мeтoк - coздaeтcя acceмблepoм пpи укaзaнии пceвдoкoмaнды REL и нaличии в иcxoднoм тeкcтe пpoгpaммы пceвдoкoмaнд EXTRN/ENTRY. Служит для связывания перемещаемых объектных программ. В драйверах фирмы "Friends' Software" не создается.
.шп72
Простые алгоритмы, полезные пользователю:
.шп1
1.Нахождение заголовка драйвера в памяти.
.шп0
Изучение заголовка конкретного драйвера может быть полезно (например для экономии памяти при оверлейной загрузке драйверов). Формат заголовка приведен выше.
Найти заголовок простого драйвера несложно. Он начинается с первого байта его стартового адреса (там лежит первый разделитель, константа @44 или ¤24).
У перемещаемого драйвера заголовок будет лежать внутри его объектного кода (после "настройщика") и чтобы его найти прибавьте к стартовому адресу константу ¤C9 (длину "настройщика") и константу ¤6 (длину таблицы загрузки).
Кроме этого Вы можете воспользоваться утилитой фирмы "Friends' software" SEDRIVER.BAS, которая приводит наиболее полную информацию о драйвере, стартовый адрес которого Вы укажете (подробнее о работе утилиты см. в соответствующем описании).
.шп1
2.Определение свободных зон.
.шп0
После загрузки в память ПЭВМ и выполнения подпрограмм установки (выполняются сразу после запуска драйверов) значительная часть объектного кода драйвера (машинного текста) может быть утеряна. То есть зона ее расположения может использоваться.
В драйверах стандарта 1.08.94 могут быть использованы две зоны:
1 - код, расположенный до интерпретатора команд драйвера
2 - код, расположенный после последнего оператора драйвера
Определить размеры этих зон можно следующим образом:
1 зона:
-------
У простого драйвера - ¤XX байт от стартового адреса A.
У перемещаемого драйвера - ¤C8+¤6+¤XX байт от A.
XX зона не менее ¤26 байт, но может быть и гораздо больше при размещении программ инициализации и (или) текста заставки в этой зоне. Она также зависит от состояния битов главной константы ассемблирования ATRIBDR.
.сс
2 зона:
-------
У простого драйвера определить сложно (требуются знания исходного текста и структуры модуля). Она может отсутствовать вообще (при максимальной задействованности памяти зоны 1).
У сложного перемещаемого драйвера можно отсечь таблицу меток настройки, длина которой рассчитывается так:
а) Знать стартовый адрес (A).
б) Определить адрес таблицы загрузки ZAGR=A+¤C9+¤6
в) Прибавить к ZAGR константу ¤4 (получить адрес хранения длины кодовой части драйвера-3, HADR)
г) Взять из адреса HADR и HADR+1 соответственно младший и старший байты длины кодовой части драйвера-3, DLIN-3)
д) Вычислить адрес начала зоны 2 (BEGZ2=ZAGR+DLIN+3+1)
Как правило в описании конкретного драйвера указываются точные размеры 1-ой и 2-ой его зон.
* Примечание:
Драйвера, работающие в банках ОЗУ переносят свой код в эти области и после загрузки их объектный код в стандартной ОП может быть утерян полностью (например драйвер DIR 4.06.EXE). Эти драйвера не могут быть перемещаемыми.
К сожалению из-за ошибки авторов-разработчиков у драйверов,поддерживающих работу с системой "Диспетчер" и имеющих команду &"EXIT" для окончания работы (созданных до 28.02.95) нельзя использовать зону 1. Либо при ее использовании у этих драйверов не следует применять команду &"EXIT". (Ошибка исправлена в исходном тексте команды &"EXIT" 28.02.95.)
.ст Раздел I:7
[an error occurred while processing this directive]