Assembler для начинающих






    Программы входящие в BIOS обслуживающие печатающее устройство и
    последовательный канал очень похожи.  Основная разница -
    возможность чтения символов из асинхронного адаптера.  Обе
    программы имеют функции инициализации адаптера, вывода символа, и
    чтения состояния адаптера.      На Фиг.9.2 приведен список функций,
    реализуемых этими программами BIOS.
 
      Как видно из рисунка, эти две программы BIOS не совпадают.
    Значение регистра AH, необходимое для задания конкретного действия,
    разное для обеих программ и нам приходится с этим мириться.
 
      Эти программы BIOS могут обслуживать более одного адаптера. В
    поле данных BIOS по адресу 40:0H имеется областть из восьми слов.
    BIOS использует эту область для хранения адресов адаптеров
    печатающих устройств и последовательных каналов. Четыре слова со
    смещением 0, которые помечены RS_232_BASE, являются местом для
    хранения адресов портов четырех адаптеров последовательных каналов.
    По смещению 8, помеченного PRINT_BASE, находится соответствующая
    область для адаптеров печатающих устройств. Процедура POST
    инициализирует эту область данных в зависимости от того, какие
    устройства она обнаружит в системе. При поиске печатающих устройств
    процедура POST сначала ищет черно-белую плату, затем адаптер
    печатающего устройства по адресу ввода-вывода 378H и, наконец
    адаптер печатающего устройства по адресу 278H. Если процедура POST
    находит адаптер печатающего устройства по любому из этих адресов,
    она помещает значение его базового адреса в область данных.
    Аналогичную работу процедура POST делает с адаптерами
    последовательного канала, сначала она ищет плату по адресу
    ввода-вывода 3F8H, а затем по адресу 2F8H.
 
      Программы BIOS написаны независимо от адресов ввода-вывода
    конкретных плат адаптеров. В регистр DX помещается входной
    параметр, указывающий, какую из имеющихся плат должна использовать
    программа входящая в BIOS. Например, если у вас есть монохромная
    плата, имеющая порт печатающего устройства по адресу ввода-вывода
    3BCH, то этот адрес появится первым в таблице PRINT_BASE. Если вы
    вызовете программу печати BIOS и загрузите в регистр DX 0,
    программа BIOS направит ввод-вывод в этот адаптер. Если вы также
    имеете отдельный адаптер печатающего устройства, расположенный по
    адресу ввода-вывода 378H, установка регистра DX в 1 позволит
    программисту работать с этим адаптером. Посмотрев в текст программы
    обслуживания печатающего устройства и последовательного канала,
    можно увидеть, что она использует регистр DX для выбора
    соответствующего значения из таблицы базовых адресов в сегменте
    DATA используемого BIOS. После того, как BIOS определит это
    значение, весь ввод-вывод она будет делать, используя модификации
    этого базового адреса. В программах есть некоторое количество
    команд увеличения или уменьшения, работающих с регистром DX. Это
    позволяет BIOS работать с разными регистрами адаптера ввода-вывода
 
      Иден.(Значение AH)  Функция печати   Функция коммуникаций
      -------------------------------------------------------------
         0          Печать символа    Инициализация адаптера
         1          Инициализация     Посылка символа
         2          Чтение состояния  Получение символа
         3            -           Чтение состояния
      -------------------------------------------------------------
 
            Фиг. 9.2 Печать и асинхронные коммуникации
   без использования абсолютных значений. Все ссылки ввода-вывода
    делаются относительно первоначального адреса, взятого из таблицы
    базовых адресов.
      Функции инициализации печати не требуется от пользователя
    никаких входных параметров. Программа инициализации сбрасывает
    печатающее устройство и подготавливает порт управления адаптера
    печатающего устройства для дальнейшей работы. Но с другой стороны,
    инициализация интерфейса RS232 требует от пользователя информации о
    параметрах линии связи. Детали кода инициализации, передаваемого
    программе с помощью регистра AL, показаны в прологе к программе
    обслуживания последовательного канала.
 
      Другие функции BIOS поддержки печати и последовательного канала
    дают возможность записывать (для последовательной связи также
    читать) данные в устройство. Особенно важно то, что ввод-вывод
    делается синхронно. Это означает, что когда программа передает
    управление BIOS, чтобы она выполнила нужную функцию, управление не
    возвращается до тех пор, пока работа не будет завершена. Когда
    символ печатается, управление остается в программе печати до тех
    пор, пока она не передаст символ в устройство печати. Если
    печатающее устройство занято, BIOS образует цикл, ожидая конца
    работы печатающего устройства. Когда символ передается по каналу
    асинхронной связи, программа BIOS ждет, пока аппаратура разрешит
    передачу следующего символа. Аналогично программа приема
    последовательного канала ждет до тех пор, пока адаптер не принял
    символ. Если внешнее устройство никогда не пришлет символ,
    программа, вызвавшая функцию BIOS, никогда не получит управление
    назад.
 
      По этой причине обе программы содержат функцию состояния. Она
    позволяет программе решить, может ли BIOS выполнить операцию в
    текущий момент времени. Функция состояния печати сообщает, занято
    ли печатающее устройство в данный момент. Программа состояния
    последовательного канала показывает, может ли символ быть передан
    или принят в данный момент. Программа может использовать эти
    программы состояния, чтобы определить, можно ли непосредственно
    выполнить операцию. Вы можете решить сделать в вашей программе
    что-либо еще в то время, пока операция ввода-вывода не может
    выполняться. Если вы проверяете появление некоторого внешнего
    события, например приема символа адаптером, программа состояния
    позволит не останавливать программу до тех пор, пока символ не
    принят. Проверка появления символа позволит вам продолжить работу с
    ним при условии, что до этого программа выполняла другие действия.
 
      Важно отметить также способ обработки ошибок программ BIOS.
    Используя программы BIOS, очень трудно "подвесить" систему. За
    исключеннием того случая, когда вы ожидаете символ из
    последовательного канала, BIOS всегда возвращают управление
    вызвавшей программе, даже если возникла ошибка внешнего устройства.
    В каждом цикле, который ожидает выполнения некоторого действия
    внешним устройством, BIOS использует счетчик. Например, когда
    программа печати ожидает завершения работы печатающего устройства,
    в регистрах BL и CX находится счетчик. Если значение счетчика в
    этих регистрах становится нулевым до того, как печатающее
    устройство освободится, BIOS возвращает управление с ошибкой
    исчерпания времени. Это означает, что выключение печатающего
    устройства до того, как оно закончило печать, не вызовет
    "зависания" системы. BIOS в конце концов вернет управление
    программе, указывая, что произошла ошибка устройства печати.
 
      В BIOS возникают небольшие трудности в связи с исчерпанием
    времени. Когда в печатающее устройство попадает символ перевода
    страницы 0CH, бумага пропускается до начала очередной страницы.
    Если на текущей странице более 51 строки, печатающее устройство
    будет двигать бумагу долго, и возникнет ошибка по исчерпанию
    времени. То есть можно получить индикацию ошибки даже тогда, когда
    печать работает правильно. Величина, задающая интервал времени, в
    течение которого контролируется печатающее устройство,
    скорректировано во второй версии программы BIOS и устраняет эту
    проблему. Если вы имеете первую версию, вы можете заново повторить
    операцию печати, вызвавшую ошибку исчерпания времени. Получение
    ошибки вновь гарантирует, что это не ошибка программы BIOS.