а) Спецификация есть, но не полная.
Хотя в техническом описании Агата есть много информации по шине, я не видел документов, которые бы описывали, как правильно писать код загрузочных ПЗУ и как пользоваться идентификаторами плат. Также неизвестно, что делает Монитор с платами расширения.
б) Способа однозначно опознать платы расширения нет.
Это можно было бы делать с помощью ПЗУ, но тут у Агата разброд и шатания. ПЗУ может быть, может не быть, и вообще, вместо него могут быть какие-то регистры. И чтобы понять, что это за плата, каждая Агатовская операционка обязательно содержит код для определения устройств.
Этот код пытается выяснять, есть ПЗУ или нет, и когда ему кажется, что ПЗУ нет, он что-то вслепую записывает в регистры платы и смотрит, как она на это реагирует. Это плохо, потому что когда мы что-то пишем в регистры платы, мы меняем ее состояние. Хорошо, если плата - это просто модуль ОЗУ. А если там станок с ЧПУ подключен и он неожиданно включится во время определения устройств?
Кроме того, такой код обязан знать про все возможные платы расширения. Иначе он какие-то платы не найдет, а какие-то неправильно настроит.
Кстати, такие же проблемы были у компьютеров с шиной ISA. Для Windows была создана целая система Legacy Plug and Play, которая так же тыкалась по регистрам. Всё это глючило и все ругали криворуких программистов Microsoft. Хотя надо было ругать инженеров IBM, которые не придумали способ опознавать платы :)
Но даже если ПЗУ на Агатовской плате расширения есть, то из него мало что можно узнать об устройстве. Например, ПЗУ контроллера 140К на семерке вообще никакой информации о самом контроллере не содержит. На девятке появилась система идентификаторов, по которой кое что можно понять. Но она используется своеобразно. Например, сетевая плата прикидывается контроллером НГМД.
Ну и никакой информации о нужных плате ресурсах из идентификатора получить нельзя.
в) Специальных регистров, позволяющих настраивать плату на определенные диапазоны адресов ввода-вывода у Агата нет
Мне сейчас возразят, что у каждого устройства в Агате диапазоны адресов жестко заданы, конфликтов между устройствами быть не может, поэтому и настраивать ничего не нужно.
Это не совсем так. Во-первых, не все слоты у Агата равноценны. Платы ДопОЗУ просто могут конфликтовать с основным ОЗУ при установке в неправильный слот.
Во-вторых, кроме адресов ввода-вывода есть адреса памяти, которые жестко заданы в платах расширения и изменить их нельзя. Например, к ПсевдоПЗУ можно обращаться только по адресам $D000-$FFFF. Перетащить его в какую-то другую область нельзя.
Во-третьих, устройств, которые могут вызвать конфликт, немного и эти устройства чаще всего в одном экземпляре.
Ну, например, представим Агат-7 с двумя модулями ПсевдоПЗУ. Оба используют диапазон адресов $D000-$FFFF. Теперь включим оба модуля. Из какого модуля будут читаться данные?
Либо возьмем плату принтера и плату цветовых палитр и загружаемого знакогенератора. Обе используют диапазон $C800-$CFFF, но по разному. Поэтому возможна ситуация, когда эта область будет выбрана у обеих плат. Точно не знаю, что получится, но вроде бы должны быть какие-то глюки на экране во время печати.
Наконец, предположим, что кто-то сделал для девятки графический адаптер, который использует адреса $8000-$BFFF и блокирует основное ОЗУ. Что будет с софтом, который работает со встроенным диспетчером памяти? Софт будет переключать страницы, думая, что там разные области ОЗУ, а адаптер будет подсовывать свое ОЗУ. Все сломается.
Кстати, если бы регистры для настройки в Агате были, то, например, в семерочном ПсевдоПЗУ не было бы никаких перемычек. Можно было бы все настроить программно.
Ну и отдельная проблема у Агата - прерывания. Линия запроса маскируемого прерывания одна. А теперь предположим, что у нас есть ЯЗС, плата Communication Extension for AGAT 7/9 и сетевая плата. Включаем прерывания на всех картах, а также штатные прерывания. Вызывается обработчик прерывания. Как определить, кто сгенерировал прерывание?
Контроллера прерываний нет. Никакого штатного механизма нет. Остается только дергать подряд все устройства и проверять, стоит там запрос прерывания или нет. Если, конечно, у платы есть порт, за который можно подергать.
г) Поддержки в BIOS, а точнее в ПЗУ Монитора почти никакой.
Как уже написал выше, любая Агатовская операционка обязана знать всё про все устройства. Монитор почти ничего не настраивает в платах расширения и ничем операционке не помогает.
Семерка вообще стартует с выключенными модулями ДопОЗУ и ПсевдоПЗУ. Монитор девятки вроде бы умеет настраивать модули ДопОЗУ при включении.
Если какой-то плате нужна настройка каких-то регистров при включении, то извините. Монитор просто передает управление первому загрузочному устройству и все. До платы он может и не дойти. Дальше операционка должна разбираться, в каком состоянии устройства и нужно ли что-то в них настраивать.