Жанр: Учеба

Программно-аппаратная организация компьютера IBM PC

сторінка №19

раммирующим на Паскале, эффективно управлять любым пикселем. Эти
программы осуществляют необходимые арифметические преобразования,
связанные с пересчетом позиции пикселя на экране дисплея в адрес памяти,
хранящей кодированный образ экрана, избавляя пользователя от рутинной
работы по вычислению смещений битов и байтов.
Эффективность этих процедур становится особенно очевидной, когда
требуется создавать быстродействующие программы генерации изображений.
Любая программа, относящаяся к указанному классу, должна тем или иным
способом переводить пиксели из активного состояния (состояние светимости)
в пассивное и наоборот. Сделать это можно либо используя функции
обслуживания BIOS-ПЗУ, описанные в предыдущей и в последней главах, либо
упомянутые Паскаль-процедуры (листинг 9.1). Высокое быстродействие
программ генерации изображений предполагает, что тот или иной фрагмент
будет загружен в память графического адаптера сразу целиком, а не будет
формироваться побитно. А для этого необходимо произвести декомпозицию
изображения на четные и нечетные строки, после чего обеспечить их
размещение в соответствующих блоках памяти. Указанное обстоятельство
сильно усложняет процесс быстрой генерации изображений.
Решение задачи быстрой генерации изображений зависит от потребностей
и от принятых компромиссов. Один из возможных подходов состоит в разбиении
изображения на участки, помещаемые в один байт (четыре пикселя для режима
среднего разрешения и восемь пикселей для режима высокого разрешения).
Приняв такую схему, можно осуществлять загрузку фрагментов в память
графического адаптера побайтно. Такой метод позволяет резко снизить
вычислительные затраты, в противном случае, программы должны выполнять
массу операций манипулирования битами, таких, например, как сдвиги,
логические "И", логические "ИЛИ" и т.п. Работа с байтами повышает скорость
генерации образа приблизительно в три раза, при условии, что собственно
образ уже построен.
Существует и другой, более грубый способ повышения скорости генерации
изображения. Его суть состоит в использовании текстовой графики
(псевдографики), описываемой в следующем параграфе.

9.4. Представление текста (символов) в графическом режиме.

Отображение символов на экране дисплея не представляет особого труда,
даже если компьютер работает в графическом режиме. Символы в этом случае
представляются в виде совокупности пикселей, как если бы это были
графические объекты, подлежащие рисованию (вычерчиванию).
Для фиксации схемы вычерчивания символов в графическом режиме приняты
специальные соглашения. Площадь, занимаемая символом, представляется в
виде матрицы размером 8Х8 пикселей. Принятый принцип кодирования в
принципе очевиден. Для воспроизведения очертания (рисунка) символа
отводится восемь байтов. Восемь битов каждого байта управляют состоянием
восьми пикселей одной строки рисунка символа (нумерация пикселей ведется
слева направо). Очередной байт описывает очередную строку (нумерация строк
осуществляется сверху вниз).
На рис.9.2 представлена диаграмма отображения символов (букв),
содержащая сведения об особенностях взаимодействия с таблицей рисования
символов. В качестве примера выбрана буква "А".
Даже при беглом знакомстве с этой диаграммой возникает ряд интересных
вопросов. Нижняя строка диаграммы отведена под нижний выносной элемент
символа (литеры), такой, например, как "хвост" прописной буквы "у". Две
верхние строки отведены под заголовок литеры. В качестве литер, имеющих
заголовок, можно привести строчную букву "ь" (имеется в виду ее
вертикальный отрезок, используюший область заголовка), а также все
прописные буквы алфавита (буквы верхнего регистра). Вопреки "здравому
смыслу" буквы размещаются не по центру матрицы, а смещаются (выравниваются
) по ее левой границе, так что два столбца справа служат для отделения
символов друг от друга.
При формировании символов в графическом режиме BIOS-ПЗУ осуществляет
поиск рисунка (образа) символа во внутренней таблице отображения, а затем
найденное табличное описание использует для команд активизации пикселей.
На заключительной стадии устанавливаются соответствующие биты в памяти
дисплея путем пересылки четных и нечетных строк в соответствующие блоки
памяти.
Поскольку в графическом режиме высокого разрешения цвет не
воспроизводится (воспроизводятся только черный и белый цвета), то рисунок
(образ) символа непосредственно управляет активизацией пикселя. В цветном
режиме среднего разрешения воспроизводятся цвет очертания (рисунок) и
фоновый цвет. Фоновый цвет - это цвет, обозначенный кодом 0; этим кодом
может быть обозначен любой из 16-ти имеющихся цветов. Цвет очертания
устанавливается с помощью кода 3 текущей цветовой палитры; для палитры 1
это белый цвет, а для палитры 0 - коричневый/желтый.
Процедуры манипулирования символами BIOS-ПЗУ могут осуществлять как
считывание, так и запись символов. Функция обслуживания с кодом 8 является
именно такой процедурой. В текстовом режиме никаких проблем при чтении не
возникает, поскольку в памяти дисплея хранится байт с кодом ASCII
требуемого символа. В графическом режиме все обстоит не так просто,
поскольку байт с кодом ASCII в памяти отсутствует. Вместо этого память
содержит группу байтов, представляющих точечный (пиксельный) рисунок
символа. Поэтому процедура BIOS-ПЗУ чтения символа осуществляет
нетривиальные операции. Она читает пиксели и сопоставляет их с содержимым
таблицы рисунков (образов) символов, выполняя своего рода распознавание
образа.

Таблица рисунков (образов) символов состоит из двух частей и
представляет для пользователя значительный интерес. Первая часть этой
таблицы хранится в ПЗУ и содержит первые 128 символов кода ASCII, то есть
все стандартные символы алфавита. Вторая часть таблицы содержит рисунки
остальных 128 символов (т.е. символов CHR$(120)-CHR$(255)). Поскольку
первая часть находится в ПЗУ (указатель на нее строго фиксирован), то она
не может быть ни модифицирована, ни заменена на другую таблицу. Вторая
часть таблицы, в отличие от первой, ориентирована на пользователя; она
создается пользователем под его потребность.
Один из векторов прерывания (прерывание с кодом 31 (1F(16)),
размещенный в таблице векторов по адресу 124(7С(16)) используется для
указания на эту таблицу. В исходном состоянии таблица отсутствует и вектор
равен нулю. После создания нужной таблицы и загрузки ее адреса в вектор
прерывания любое обращение к BIOS-ПЗУ для записи символа с кодом
CHR$(128)-CHR$(255) приведет к воспроизведению на экране этого символа.
Такой подход, основанный на свободном определении таблицы рисунков
128 символов является важной предпосылкой для быстрого построения наиболее
типичных графических образов (несложные графики, схемы, рисунки, таблицы,
чертежи, диаграммы и др.). Если требования к изображаемым объектам не
слишком высоки, то всегда можно определить ансамбль, состоящий из 128
шаблонов (каждый шаблон имеет размер 8Х8 пикселей) и генерировать на их
основе эти объекты. Очевидно, что наиболее сложные и детальные образы не
могут быть построены таким способом. И все-таки ансамбль, состоящий из 128
предварительно определенных шаблонов, достаточно велик, чтобы
пользовательские программы обладали высоким быстродействием, были просты и
компактны. В сущности, процедуры обслуживания рисунков символов BIOS-ПЗУ
(используя таблицу, созданную пользователем) берут на себя основную работу
по генерации образов; пользовательские программы лишь помещают нужные
символы в нужные позиции экрана.
Описанные возможности генерации графических символов отнюдь не
исключают возможность непосредственного доступа к памяти дисплея и
управления отдельным пикселем. В графическом режиме пользователь может
сочетать обе возможности. Когда это удобно - использовать таблицу
графических символов, при необходимости - манипулировать пикселями. Вполне
допустимо, например, изменять любой пиксель внутри любого образа символа,
уже выведенного на экран.
Таблица рисунков символов требует для своего размещения 1024 байтов
памяти: 128 символов Х 8 байтов (требуемых для каждого символа). В
графическом режиме со средним разрешением один байт программы пользователя
может использоваться для управления образом, состоящим из 64 пикселей, что
эквивалентно восьми байтам отображаемой информации. При соблюдении
определенных требований такой подход позволяет в восемь раз сжать
графический образ по отношению к исходному.
Прежде чем использовать эти возможности, следует оценить последствия
ограничений, распространяемых не только на число возможных шаблонов, но и
на число воспроизводимых цветов в режиме среднего разрешения. Число таких
цветов не может превышать двух. Обычный режим цветной графики позволяет
использовать полную 4-х цветную палитру, в то время как при использовании
возможностей построения изображений на основе синтеза символов количество
цветов в палитре уменьшается до двух.
В тех случаях, когда таблица рисунков символов, формируемая
пользователем, не применяется для построения изображений в графическом
режиме, можно использовать специальные символы из расширенного набора. Это
может найти применение при имитации символов текстового режима, при
построении специальных шаблонов или алфавитов. Так, это наиболее простой и
эффективный способ генерации других национальных алфавитов - греческого,
славянского (кириллица), японского (кана). Символика арабского языка и
иврита также вполне представима, однако, здесь возникают другие сложности
- сложности, связанные с особенностями письма (справа-налево).

Приложение 9.1. Текст программы генерации изображений (Паскаль).

module listing_9_1;
type

word_bits_type = set of 0..15;
high_res_pixel_type = (off,on);
medium_res_pixel_type =(color_0,color_1,color_2,color_3;
graphics_screen_type=
record
even_pixel : array [0..99,0..39] of word_bits_type;
filler : array [1..192] of byte;
odd_pixel : array [0..99,0..39] of word_bits_type;
end;
var [static]
graphics_screen_pointer : ads of graphics_screen_type;
general_screen_pointer : adsmem;
row,column : integer;
value
graphics_screen_pointer.s := #B800;
graphics_screen_pointer.r := 0;
general_screen_pointer.s :=#B800;
general_screen_pointer.r :=0;
{===================================================================}

ТЕКСТ РАЗОБРАТЬ НЕЛЬЗЯ

graphics_screen_pointer ^ .odd_pixel [(row-1) div 2,column div 16]
else
work_byte :=
graphics_screen_pointer ^ .even_pixel [row div 2, column div 16];
work_value := column mod 16;

if color = on then
work_byte := work_byte + [work_value]
else
work_byte := work_byte - [work_value];

if odd (row) then
graphics_screen_pointer ^ .odd_pixel [(row-1) div 2, column div 16]
:= work_byte
else
graphics_screen_pointer ^ .even_pixel[row div 2, column div 16]
:= work_byte;
end;

{===========================================================}

procedure set_medium_res_pixel (color : medium_res_pixel_type);

var [static]
work_byte : word_bits_type;
work_set0 : set of 0..15;
work_set1 : set of 0..15;

begin

if odd (row) then
work_byte :=
graphics_screen_pointer ^ .odd_pixel [(row-1) div 2, column div 8];
else
work_byte :=

graphics_screen_pointer ^ .even_pixel [row div 2, column div 8];

work_set0 := [(column mod 8) * 2];
work_set1 := [(column mod 8) * 2 + 1];

if color in [color_2,color_3] then
work_byte := work_byte + work_set0
else
work_byte := work_byte - work_set0;

if color in [color_1,color_3] then
work_byte := work_byte + work_set1
else
work_byte := work_byte - work_set1;

if odd (row) then
graphics_screen_pointer ^ .odd_pixel [(row-1) div 2, column div 8]
:=work_byte
else
graphics_screen_pointer ^ .even_pixel [row div 2, column div 8]
:= work_byte;
end;

{===========================================================}

procedure clear_screen_graphics;
var [static]
i : word;
begin
for i := 0 to 16383 do
general_screen_pointer ^ [i] := 0;
end;

{===========================================================}

end.

ГЛАВА 10. КЛАВИАТУРА


____________________

Клавиатура - это одно из основных звеньев взаимодействия человека и
компьютера. В этой главе мы подробно рассмотрим работу клавиатуры
Персонального компьютера фирмы "ИБМ" и методы управления этой работой.
Клавиатура IBM/PC имеет ряд интересных особенностей, которые мы сейчас
изучим.

10.1. Основные принципы функционирования клавиатуры

На мой взгляд, один из наиболее впечатляющих моментов конструкции
IBM/PC - это способ работы с клавиатурой. Выбранный подход в равной мере
прост и элегантен и программистам необходимо знать две вещи, связанные с
вводом информации от клавиатуры, следующие из этого конструктивного
подхода.
На электронном уровне клавиатура IBM/PC представляет собой небольшой
самостоятельный компьютер. Внутри блока клавиатуры размещается
микропроцессор 8048 фирмы "Интел", который выполняет задачу слежения за
нажатиями клавиш и передачи их состояния. Микропроцессор 8048 выполняет
различные функции, включая самодиагностику (после включения питания
компьютера), проверку нажатия клавиш и противодребезговую защиту (что не
позволяет воспринимать одну нажатую клавишу как две).
Микропроцессор 8048 позволяет также буферизовать до 20 нажатий
клавиш, если центральный процессор не может их принять сразу. Обычно этот
буфер совершенно пуст, поскольку ситуации, когда центральный процессор не
успевает отреагировать на запрос клавиатуры.
Вы, вероятно, слышали предупреждающий звуковой сигнал, когда нажатие
Вами клавиш опережало возможности программы по их вводу. Это не связано с
заполнением буфера клавиатуры. Процедура ввода с клавиатуры системы BIOS в
ПЗУ имеет собственный буфер и звуковой сигнал раздается в случае
заполнения этого буфера. Буфер клавиатуры может содержать 20 символов, а
буфер системы BIOS - только 15. По мере изучения клавиатуры мы рассмотрим
как код нажатой клавиши попадает сначала в буфер клавиатуры, затем в буфер
BIOS и, наконец, в программу.
Блок клавиатуры не связывает с клавишами никаких конкретных значений.
Вместо этого, блок клавиатуры идентифицирует по ее номеру или коду
сканирования. Все клавиши имеют коды сканирования от 1 до 83. На рис.
10.1. показаны коды, соответствующие всем клавишам.
При нажатии клавиши блок клавиатуры передает ее код сканирования
центральному процессору. Когда клавиша отпускается, клавиатура снова
передает ее код, но увеличенный на 128 (или шестнадцатиричное значение
80). Таким образом, имеются различные коды для нажатия и освобождения
клавиш.
Для работы с клавиатурой используются порты и прерывания. Когда
выполняется какое-либо действие с клавишей (нажатие или освобождение),
процессор клавиатуры обнаруживает его и запоминает в своем буфере. Затем,
процессор клавиатуры формирует прерывание с номером 9. В ответ на
прерывание служебная процедура системы BIOS в ПЗУ считывает код
сканирования клавиши из порта клавиатуры (порт номер 96) и затем
пересылает в порт клавиатуры команду очистить буфер процессора клавиатуры.
Если системный блок не реагирует на прерывания клавиатуры, то коды
сканирования накапливаются в буфере процессора клавиатуры, хотя при
нормальной работе этого не должно происходить. Специальный код
сканирования 255, шестнадцатиричное значение FF, используется блоком
клавиатуры, для сообщения, что его буфер заполнен.
Поскольку информация о нажатии клавиши поступает в системный блок от
клавиатуры через порт, любая программа, имеющая доступ к порту, может
непосредственно общаться с клавиатурой. На практике, однако, это
неприменимо, так как блок клавиатуры вырабатывает еще и прерывания,
которые обрабатываются системой BIOS в ПЗУ. Однако, просто из любопытства,
можно написать небольшую программу на Бейсике, читающую порт клавиатуры и
сообщающую, что она там находит. Ниже приведен фрагмент этой программы.
Поскольку эта программа состязается с системой BIOS за получение
информации от клавиатуры, ее работа несколько хаотична. Но если запустить
эту программу и нажимать на клавиши, она все же зарегистрирует несколько
кодов сканирования.

100 REM Программа на Бейсике, пытающаяся считывать коды сканирования
клавиатуры
110 X=INP(96) 'чтение порта клавиатуры
120 THROW.AWA4$ = INKEY$ 'отбросить любые коды,считан системой BIOS
130 IF X=0 THEN GOTO110 'если данных нет - продолжать ожидание
140 PRINT
150 PRINT "Код сканирования клавиатуры"; XMOD128;'сообщить код
160 IF X > 128 THEN PRINT "клавиша освобождена";
170 IF X > 129 THEN PRINT "клавиша нажата";
180 GO TO 110

Клавиатура IBM/PC выполняет еще и функцию повторения клавиши. Блок
клавиатуры следит за тем, сколько времени клавиша остается нажатой и
формирует сигнал повторения. Функция повторения распространяется на все
клавиши блока клавиатуры.
Процедуры системы BIOS в ПЗУ могут распознавать отличие повторных
нажатий клавиши от повторения сигнала удерживаемой в нажатом состоянии
клавиши, путем анализа кодов сканирования освобожденной клавиши. Если для
одной и той же клавиши получены два кода нажатой клавиши и между ними не
было кода освобожденной клавиши, значит клавиша удерживается процедурами
системы BIOS для подавления функции повторения тех клавиш, которым она не
нужна, таких как, например, клавиша смещения (shift).
Теперь Вам должны быть понятны основы того, как IBM/PC работает с
клавиатурой. Блок клавиатуры сообщает, что происходит с клавиатурой: какие
клавиши нажимаются, какие освобождаются и, через определенный промежуток
времени, какие удерживаются в нажатом состоянии. Система BIOS в ПЗУ
интерпретирует получаемую от блока клавиатуры информацию, придавая ей
определенный смысл. Таким образом, имеет место очень ясное и четкое
разделение труда. Блок клавиатуры занимается физической стороной,
механизмом функционирования клавиатуры, а программы системы BIOS в
системном блоке выполняют все логические операции по интерпретации
действий клавиатуры.
Большинство пользователей даже не знает, что клавиатура IBM/PC
передает сигналы не только о нажатии, но и об освобождении клавиши,
поскольку такая информация обычно скрыта от пользователя. Ее можно
увидеть, запустив тест клавиатуры из набора диагностических программ
IBM/PC. Если присмотреться, можно заметить, что изображение на экране
меняется при каждом нажатии, освобождении клавиши или когда клавиша
удерживается в нажатом состоянии достаточно долго для того, чтобы начала
действовать функция повторения.

10.2. Определение смысла нажатых клавиш

Служебная процедура системы BIOS для прерывания 9 или прерывания
клавиатуры определяет смысл каждого действия с клавиатурой. Это включает
слежение за состоянием смещения кодов и преобразование нажатий клавиши в
их значения, будь то буквы алфавита или сигналы функциональных клавиш.
Ниже мы будем рассматривать эту функцию подробнее.
Часть задачи обслуживания клавиатуры со стороны системы BIOS
заключается в слежении за всеми возможными состояниями смещений. Состояния
смещений довольно часто вызывают путаницу, поскольку клавиатура обычной
пишущей машинки, с которой большинство из нас начинало свое знакомство с
клавишами, имеет всего одну клавишу смещения, Клавиатуры многих
компьютеров, в том числе и IBM/PC, имеют три типа смещений.
Во-первых, имеются обычные функции клавиш, без всякого смещения
(например, для получения букв в нижнем регистре). Затем имеется обычное
смещение, такое же как у пишущих машинок, которое служит для получения
букв верхнего регистра и, как правило, всех знаков, нанесенных на верхнюю
часть клавиши. Кроме того, имеются еще два вида смещения, изменяющее
смещение ("ALT") и управляющее смещение ("CTRL"). Эти два специальных вида
смещения используются аналогично обычному смещению в том смысле, что
просто "а" не совсем то же самое, что "А" в верхнем регистре, и Ctrl-A и
Alt-A также имеют собственные значения. (Некоторые читатели могут считать
клавишу "ESC" еще одной клавишей смещения. Это связано с тем, что в
некоторых старых терминалах компьютеров, особенно таких, которые
использовались подобно клавишам смещения. Однако, при использовании
клавиши "ESC" она не удерживалась в нажатом состоянии, подобно клавишам
смещения, - сначала нажималась клавиша "ESC", а после нее какая-либо
другая клавиша. Оба этих нажатия рассматривались как специальная
последовательность. Такое действие нельзя рассматривать как операцию
смещения. Обычно, клавиша "ESC" подобным образом в IBM/PC не
используется.)
Допустимыми считаются не все сочетания обычных клавиш и клавиш
смещения. Если ввести одну из недопустимых комбинаций, то система BIOS ее
просто проигнорирует, как будто ничего не произошло. Несколько позже мы
перечислим все допустимые комбинации смещений клавиш, чтобы Вы могли
воспользоваться ими в своих программах.
На клавиатуре IBM/PC имеется четыре специальных "переключательных"
клавиши, которые действуют в качестве тумблера "включения-отключения" для
определенных функций. Эти клавиши Insert (вставка), Caps-Lock (закрепление
заглавных букв), Num-Lock (закрепление цифровой клавиатуры) и клавиша,
которой практически не пользуются, Scroll-Lock (закрепление "скроллинга").
Две из этих клавиш, Caps-Lock и Num-Lock, являются частью механизма
смещения, а оставшиеся две управляют определенными специальными режимами
работы.
Информация о состоянии этих четырех переключательных клавиш и том,
удерживается ли в данный момент в нажатом состоянии одна из клавиш
смещения, хранится в специально выделенной для этих целей области в нижних
адресах оперативной памяти. Вся эта информация хранится в двух байтах с
адресами 1047 и 1048 (или 417 и 418 шестнадцатиричных). Во время работы
IBM/PC, в этих двух байтах сохраняются все состояния смещения и состояния
переключателей. Естественно, что после выключения компьютера эти байты
сбрасываются в нормальное состояние.

Программа на Бейсике, листинг которой 10.1 приведен в конце этой
главы, отображает эти два байта и демонстрирует воздействие на них нажатий
клавиш смещения и переключателей. Описание смысла отдельных битов
приведено ниже.
Поскольку клавиши смещения действуют только в нажатом состоянии,
система BIOS следит за их нажатиями и освобождениями и вносит необходимые
изменения в интерпретацию обычных клавиш. Система BIOS следит за кодами
сканирования при освобождении только для клавиши смещения, так как для
всех остальных клавиш эта функция не имеет смысла.
Когда система BIOS получает код сканирования обычной клавиши, она
проверяет все варианты смещения и преобразует этот код в соответствующее
значение, которое может быть как символьным кодом ASCII, так и кодом
специального назначения.
Процедура обслуживания клавиатуры системы BIOS следит не только за
состояниями смещения. Состояние клавиатуры хранится в первых тринадцати
битах указанных выше двух байт по адресу 1047. Ниже приведена таблица
значений этих битов, изменения которых можно проследить с помощью
программы 10.1:

_____________________________________________________________

Байт Бит Смысл Значение, когда бит равен 1
_____________________________________________________________

1 1 Insert состояние активное
1 2 Caps-Lock состояние активное
1 3 Num-Lock состояние активное
1 4 Scroll-Lock состояние активное
1 5 Alt клавиша нажата
1 6 Ctrl клавиша нажата
1 7 смещение слева клавиша нажата
1 8 смещение справа клавиша нажата
2 1 Insert клавиша нажата
2 2 Caps-Lock клавиша нажата
2 3 Num-Lock клавиша нажата
2 4 Scroll-Lock клавиша нажата
2 5 Состояние захвата активное состояние
2 6 (не используется) (после Ctrl-Num-Lock)
2 7 (не используется)
2 8 (не используется)
____________________________________________________________

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

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.