[an error occurred while processing this directive]
┌─────────────────────────────────────────────────────────┐ | Стандарт драйверов библиотеки BASIC-процедур от 1.08.94.| └─────────────────────────────────────────────────────────┘
Настоящий стандарт был выработан в результате длительного творческого поиска програмистов фирмы "Friends' software" с целью облегчить сборку и привести к единой системе процесс ассемблирования драйверов процедур фирмы. Естественно строение объектного кода собираемых драйверов стало более логичным и соответствует принципам объектного ориентирования.
Драйвера, собираемые (ассемблируемые) по стандарту от 1.08.94 предполагают:
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 имеют общую схему строения объектного кода (приводится ниже):
─────────────────────────────────────────────────────────────
Схема внутренней структуры драйвера процедур для итерпретатора "Бейсик А.9.1"
(для версий, выпущенных после 1.08.94)
─────────────────────────────────────────────────────────────
┌──────────┐ | | 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к !| | └-----------┘
* Объяснения:
Простой драйвер содержит только части 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в.
Фopмaт тaблицы:
Б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узки.
Фopмaт зaгoлoвкa:
─────────────────────────────────────────────────────────────
ОПИСАНИЕ ЗАГОЛОВКА ДРАЙВЕРА ПРОЦЕДУР к ИНТЕРПРЕТАТОРУ
"БЕЙСИК" ПЭВМ "АГАТ-9"
─────────────────────────────────────────────────────────────
Каждый драйвер, содержащий набор операторов, расширяющих возможности интерпретатора "БЕЙСИК" имеет (кроме версии, выпущенных фирмой "Friends' software" до 1.08.94) 11-ти байтный заголовок, байты которого несут определенный смысл и определяют основные действия драйвера во время загрузки в память ПЭВМ.
Формат заголовка драйвера:
────────────┬──────────────────────────────────────────────── ном. байта | значение ────────────┼──────────────────────────────────────────────── 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" не создается.
Простые алгоритмы, полезные пользователю:
1.Нахождение заголовка драйвера в памяти.
Изучение заголовка конкретного драйвера может быть полезно (например для экономии памяти при оверлейной загрузке драйверов). Формат заголовка приведен выше.
Найти заголовок простого драйвера несложно. Он начинается с первого байта его стартового адреса (там лежит первый разделитель, константа @44 или ¤24).
У перемещаемого драйвера заголовок будет лежать внутри его объектного кода (после "настройщика") и чтобы его найти прибавьте к стартовому адресу константу ¤C9 (длину "настройщика") и константу ¤6 (длину таблицы загрузки).
Кроме этого Вы можете воспользоваться утилитой фирмы "Friends' software" SEDRIVER.BAS, которая приводит наиболее полную информацию о драйвере, стартовый адрес которого Вы укажете (подробнее о работе утилиты см. в соответствующем описании).
2.Определение свободных зон.
После загрузки в память ПЭВМ и выполнения подпрограмм установки (выполняются сразу после запуска драйверов) значительная часть объектного кода драйвера (машинного текста) может быть утеряна. То есть зона ее расположения может использоваться.
В драйверах стандарта 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). Эти драйвера не могут быть перемещаемыми.
[an error occurred while processing this directive]