sytkova-paano
.pdfout dx,ax
Для возврата к 1 таблице нужно в третий регистр синхронизатора записать 0h.
Ширина символа в текстовых режимах может быть 8 или 9 пикселов, однако в таблицах знакогенератора ширина символов всегда 8 битов. Поэтому 9 пиксел либо совпадает с цветом фоном, либо копирует 8 пиксел.
Стандартное значение высоты символов в текстовом режиме - 8,14, 16 пикселов. Для изменения высоты символов используется 9 регистр контроллера монитора. В младших 5
битах этого регистра хранится число, на 1 меньшее высоты символа. Высоту таким образом можно установить от 1 до 32. При установке нового значения высоты надо помнить, что старшие биты этого регистра должны остаться без изменения.
5.6 КОНТРОЛЬНЫЕ ВОПРОСЫ
1.Типы дисплеев.
2.Перечислить назначение основных компонент графического адаптера.
3.Формирование цвета в плоской модели видеопамяти.
4.Методы ускорения обработки графических изображений.
5.Назначение порта AGP.
6.Что такое видеопамять?
7.Структура видеопамяти в текстовом режиме.
8.Назначение таблицы знакогенератора.
9.Доступ к регистрам видеоадаптера.
10.Как формируется цвет фона и цвет символа в текстовом режиме?
11.Структура байта атрибутов.
12.Какая информация содержится в регистрах палитры?
5.7 УПРАЖНЕНИЯ
Задание 1. Изменить цвет всех латинских букв, выведенных на экран.
.model small
.code
org 100h begin:
; Настроим сегментный регистр es на начало видеобуфера
mov |
ax,0B800h |
;Загрузка сегментного адреса |
mov |
es,ax |
;видеобуфера в es |
|
|
111 |
|
mov |
cx,80*25 |
|
;в cx - количество символов на экране |
|
mov |
bx,0 |
|
;в bx - начальное смещение |
lodstor: |
|
|
|
|
|
mov |
al,es:[bx] |
|
;cчитываем ASCII-код символа |
|
cmp |
al,'A |
' |
;проверим, латинская ли это буква? |
|
jb |
next |
|
|
|
cmp |
al,'z' |
|
|
|
ja |
next |
|
|
|
cmp |
al,'Z' |
|
|
|
jbe |
ok |
|
|
|
cmp |
al,'a' |
|
|
|
jb |
next |
|
|
ok: |
mov |
ah,es:[bx+1] |
;cчитаем атрибут |
|
|
and |
ah,11110100b |
;изменяем атрибут |
|
|
mov |
es:[bx+1],ah |
;запишем его обратно |
|
next: add |
bx,2 |
|
;переходим на следующий символ |
|
|
loop |
lodstor |
|
|
|
mov |
ax, 4C00h |
|
;Выход |
|
int |
21h |
|
|
end |
begin |
|
|
|
Задание 2. Создать новую таблицу знакогенератора, которая получается сжатием в 2
раза в горизонтальном направлении символов стандартной таблицы. Реализовать переключение между таблицами через 2 секунды.
Для сжатия таблицы будем считывать байт из стандартной таблицы знакогенератора,
выделять старшую часть байта и сдвигать ее вправо, затем выделять младшую часть байта и сдвигать ее влево. Старшую и младшую часть снова будем собирать в байт, который запишем в 1-ую таблицу знакогенератора. Эти действия будем повторять 16 раз т.к.
стандартная высота символа равна 16-ти. Далее пропустим 16 байтов. Организуем цикл по вышеописанному заполнению 32 байтов для всех 256 символов в таблице с номером 5.
Для отслеживания 2 секунд пишем свой обработчик int 1Сh.
l segment |
para public 'code' |
|
||
assume |
cs:l,ds:l,ss:l |
|
||
org |
100h |
|
|
|
Begin: |
jmp Init |
;переход к |
главной программе |
|
pres |
dw |
1234h |
;сигнатура |
|
Int_1c |
proc far |
;обработчик прерывания 1С |
||
|
pusha |
|
;сохраняем |
регистры в стеке |
|
inc |
cs:Tik |
;увеличиваем значение счетчика "тиков" |
|
|
mov |
al,cs:Tik |
;занесем полученное значение в al |
|
|
cmp |
cs:Time,al |
;сравним с нашим промежутком времени |
|
|
jne |
Vce |
; если значения равны, переключаем таблицы |
|
|
mov |
al,03 |
;в al номер регистра синхронизатора |
|
|
mov |
dx,3c4h |
;в dx индексный порт граф. контроллера |
|
|
|
|
112 |
|
|
out |
dx,ax |
|
;выводим в порт |
|
inc |
dx |
|
;получим адрес порта данных |
|
cmp |
cs:Yes,0 |
;если активна стандартная таблица |
|
|
je |
Zer |
|
;то переключаемся на 5-тую таблицу |
|
mov |
al,0110000B |
;в al содержимое битов 5,3,2 и 4,1,0 |
|
|
|
|
|
;для 5-ой таблицы |
|
mov |
cs:Yes,0 |
|
|
|
jmp |
out_port |
;переход на запись в порт |
|
Zer: mov |
al,0 |
|
;в al номер стандартной таблицы |
|
|
mov |
cs:Yes,1 |
|
|
out_port: |
|
|
|
|
|
out |
dx,al |
|
;выводим значение в порт |
|
mov |
cs:Tik,0 |
;обнулим значение счетчика "тиков" |
|
Vce: popa |
|
|
;восстановим регистры из стека |
|
|
iret |
|
|
;выходим из прерывания |
Int_1c |
endp |
|
|
|
int1c |
|
dd |
? |
;адрес оригинального вектора |
Yes |
db |
0 |
|
;флажок вывода |
Tik |
db |
0 |
|
;счетчик "тиков" |
Time |
db |
18*2 |
|
;заданный промежуток времени |
@DS |
dw |
? |
|
;переменная для хранения DS |
Init: |
|
|
|
;главная программа |
|
cli |
|
|
; запретить прерывания |
|
mov |
dx,3c4h |
;в dx адрес порта синхронизатора |
|
|
mov |
si,offset SPar |
;в si смещение параметров |
|
|
mov cx,2 |
|
;выводит 4 параметра |
|
l1: |
lodsw |
|
|
;в ah значение параметра, |
|
|
|
|
;в al номер регистра синхронизатора |
|
out |
dx,ax |
|
;вывести параметр в регистр |
|
loop |
l1 |
|
;повторять 4 раза |
|
sti |
|
|
;разрешить прерывания |
|
mov |
dx,3ceh |
;в dx адрес порта граф. контроллера |
|
|
mov |
si,offset GPar |
;в si смещение параметров |
|
|
mov |
cx,3 |
|
;выводить 3 параметра |
l2: |
lodsw |
|
|
;в ah значение параметра, |
|
|
|
|
;в al номер регистра |
|
out |
dx,ax |
|
;вывести параметр в регистр |
|
loop |
l2 |
|
;повторять 3 раза |
|
mov |
ax,0a000h |
;загрузить в es адрес |
|
|
mov |
es,ax |
|
;видеобуфера |
|
mov |
di,0 |
|
;обнулить смещение |
|
|
|
|
113 |
mov |
cx,256 |
;будем просматривать все 256 символов |
|
ll2: push |
cx |
;сохраним cx в стеке |
|
mov |
cx,16 |
;для высоты символа16 |
|
ll1: mov |
al,es:[di] |
;в al байт |
определения символа |
mov |
bl,al |
;сохранить |
значение в bl |
and |
al,0f0h |
;взять младшую часть байта |
|
shr |
al,1 |
; сдвинуть |
вправо |
mov |
ah,bl |
|
|
and |
ah,0fh |
;взять старшую часть байта |
|
shl |
ah,1 |
;сдвинуть влево |
|
or |
ah,al |
;получим результат в ah |
|
mov |
es:[2000h+di],ah ;занесем |
результат в 5-ую таблицу |
|
inc |
di |
;увеличим смещение |
|
loop |
ll1 |
;повторять |
16 раз |
pop |
cx |
;восстановить cx |
|
add |
di,16 |
;пропустить 16 байтов |
|
loop |
ll2 |
;повторить |
256 раз |
;Восстанавливаем значения регистров синхронизатора
;и графического контроллера
|
mov |
dx,3c4h |
;в dx |
адрес инд. порта синхронизатора |
|
|
mov si,offset SSP |
;в si |
смещение параметров |
||
|
mov cx,2 |
;выводить 2 значения |
|||
E1: |
lodsw |
|
;в ax |
полученный результат |
|
|
out |
dx,ax |
;вывести в порт |
||
|
loop |
E1 |
;повторить 2 раза |
||
|
mov |
dx,3ceh |
;в dx |
адрес инд. порта граф.контроллера |
|
|
mov |
si,offset GGP |
;в si |
смещение параметров |
|
|
mov cx,3 |
;выводить 3 параметра |
|||
E2: |
lodsw |
|
;в ax |
результат |
|
|
out |
dx,ax |
;вывести в порт |
||
|
loop |
E2 |
;повторить 3 раза |
||
|
mov |
cs:@DS,es |
;запомнить значение es в переменной |
||
|
mov |
ax,351ch |
;получить адрес вектора 1С |
||
|
int |
21h |
|
|
|
|
mov |
ax,es:[bx-2] |
;проверяем наличие программы |
||
|
cmp |
ax,cs:pres |
;в памяти |
|
|
|
je |
Exit |
;eсли |
есть, то на выход |
|
|
mov |
word ptr cs:int1c+2,es |
;запомнить оригинальный |
||
|
mov |
word ptr cs:int1c,bx |
|
;адрес |
|
|
mov |
ax,251ch |
;установим вектор 1С |
||
|
lea |
dx,int_1c |
;на свой обработчик |
||
|
|
|
|
114 |
|
|
int |
21h |
|
|
lea |
dx,Init |
;Выходим |
|
int 27h |
;и оставляем резидентом |
|
Exit: |
|
|
|
|
<восстановим старый обработчик int 1Сh, выгрузим окружение |
||
программы и саму программу> |
|||
|
mov |
dx,3c4h |
;установим стандартную таблицу |
|
mov |
ax,03 |
|
|
out |
dx,ax |
;шрифтов |
|
mov |
ax,4c00h |
;завершаем |
|
int |
21h |
;программу |
SPar |
dw |
0402h |
;запись только во 2-ой видеослой |
|
dw |
0704h |
;последовательная адpесация |
GPar |
dw |
0204h |
;выбоp видеослоя для считывания |
|
dw |
0005h |
;запpещение нечетной адpесации |
|
dw |
0006h |
;видеопамять начинается с A000:0000h |
SSP |
dw |
0302h |
|
|
dw |
0304h |
|
GGP |
dw |
0004h |
;доступны 0 и 1 слои для считывания |
|
dw |
1005h |
; Разрешение нечетной адресации |
|
dw |
0e06h |
; Видеопамять начинается с B800:0000h |
ends |
l |
|
|
end |
begin |
|
|
Варианты:
1.Написать программу, которая переворачивает символы "вверх ногами".
2.Предоставить пользователю возможность набора математических знаков.
3.Реализовать возможность набора в текстовом режиме римских цифр.
4.Написать программу, позволяющую каждые 5 секунд переворачивать цифры.
5.Уменьшить высоту заглавных букв латинского алфавита.
6.Заменить в таблице знакогенератора русские буквы на греческие.
7.Реализовать возможность набора иероглифов.
8.Написать программу, заменяющую английские буквы их русскими "эквивалентами", т.е
"i" - "и", "n" - "н", "u" - "ю", "s" - "с" и т.д.
9.Заменить цифры на пробел и инвертировать буквы.
10.Реализовать подчеркивание строчных букв латинского алфавита.
11.Сжать символы в таблице знакогенератора в 2 раза.
12.Обвести латинские буквы в рамочку.
13.Создать ТЗГ с высотой символов в 6 битов и заменить стандартную таблицу на новую.
115
14.Написать программу, обеспечивающую стирание левой половины шрифта при нажатии клавиши F1.
5.8ТЕСТЫ ДЛЯ САМОКОНТРОЛЯ
1.Порт AGP необходим для:
а) увеличения количества битов для хранения цвета пиксела;
б) расширения разрядности шины графического контроллера;
в) ускорения видеопостроений путем использования оперативной памяти графическим процессором.
Ответы : 1 - б, 2 - а, 3 - д, 4 – а, 5 - с.
2.Какой из фрагментов программ выполняет вывод буквы А в правый верхний угол экрана?
а) mov ax,0B800h mov es,ax
mov bx,80*2
mov es:[bx],'A'
б) mov ax,0B800h mov es,ax
mov bx,79*2
mov es:[bx],'A'
в) mov ax,0B800h mov es,ax
mov bx,80*2
mov es:[bx+1],'A'
г) mov ax,0B800h mov es,ax
mov bx,79*2
mov es:[bx+1],'A'
д) mov ax,0А000h mov es,ax
mov bx,80*2
mov es:[bx],'A'
3.Имеется несколько правильных и неправильных утверждений об использовании слоев видеопамяти в текстовом режиме:
1)Стандартно доступен только нулевой слой видеопамяти, в котором хранится ASCII-
код символа.
2)Нулевой и первый слои видеопамяти отображаются на общее адресное пространство,
причем по четным адресам хранятся байты из 0 слоя, по нечетным - байты из 1 слоя.
116
3)Стандартно таблица знакогенератора является недоступной, для получения к ней доступа необходимо изменить содержимое регистров синхронизатора и графического контроллера.
4)Во втором слое видеопамяти хранится таблица знакогенератора, содержащая изображения символов.
5)Байты из 0 и 1 слоев видеопамяти отображаются на общее адресное пространство по принципу: сначала все байты из 0 слоя, потом все байты из 1 слоя.
Из этих утверждений верно: а) 1,4; б) все, кроме 5; в) 1,2,3; г) 2,3,4; д) 3,4.
4.Какой из нижеприведенных фрагментов программы выполняет создание новой таблицы знакогенератора из стандартной путем инверсии битового изображения символа, если в es загружен сегментный адрес 0A000h:
а) mov si,0 mov cx,2000h
c:mov al,es:[si] not al
mov es:[si+4000h],al inc si
loop c
б) mov si,0 mov cx,2000
c:mov al,es:[si] xor al,al
mov es:[si+4000h],al inc si
loop c
в) mov si,0 mov cx,256
c:mov al,es:[si] not al
mov es:[si+4000h],al inc si
loop c
г) mov si,0 mov cx,2000
c:mov al,es:[si] or al,0Fh
mov es:[si+4000h],al inc si
loop c
д) mov si,0 mov cx,2000h
c:mov al,es:[si] and al,0FFh
mov es:[si+4000h],al inc si
117
loop c
5.Высота символов в текстовом режиме может принимать значения:
а) не более 32
б) 8, 14, 16
в) от 1 до 32 г) не более 16 д) от 8 до 16
Ответы: 1 - б; 2 - г; 3 - а; 4 - в.
118
6 УСТРОЙСТВА ХРАНЕНИЯ ДАННЫХ
6.1 УСТРОЙСТВО ЖЕСТКИХ ДИСКОВ НА ФИЗИЧЕСКОМ
УРОВНЕ
Внастоящее время несмотря на все возрастающее значение flash-накопителей лидером при хранении данных остаются магнитные носители. Оптические же устройства часто используются в качестве вспомогательных при хранении данных.
Воснове функционирования дисковых накопителей лежит следующее их устройство.
Слой носителя информации нанесен на рабочие поверхности дисков. Диски вращаются с помощью двигателя шпинделя, обеспечивающего требуемую частоту вращения в рабочем режиме, измеряемой в оборотах в минуту. На диске имеется индексный маркер, который,
проходя мимо специального датчика, отмечает начало каждого оборота диска. Информация на диске располагается на концентрических дорожках (треках, tracks), нумерация которых начинается с внешней дорожки, имеющей номер 0. Каждая дорожка разбита на секторы фиксированного размера. Сектор является минимальным блоком информации, который может быть считан или записан на дорожку. Нумерация секторов на физическом уровне начинается с 1 и привязывается к индексному маркеру. Если накопитель имеет несколько рабочих поверхностей, т.е. на шпинделе размещается пакет дисков, то совокупность всех дорожек с одинаковыми номерами называется цилиндром (cylinder). Для каждой рабочей поверхности в накопителе имеется своя головка (head), обеспечивающая запись (если это позволяет накопитель) и считывание информации. Для записи или чтения сектора необходимо выполнение следующих условий: шпиндель должен вращаться с заданной скоростью и блок головок должен быть подведен с помощью специального двигателя к нужному цилиндру. Когда требуемый сектор подойдет при вращении диска к выбранной головке, начнется физическая операция обмена данными.
Электромеханическая часть накопителя - пакет дисков со шпиндельным двигателем и блок головок с приводом - называется блоком HDA (Head Disk Assembly) и заключается в защитный кожух. Дисковый накопитель имеет также блок электроники, управляющий приводами двигателей, а также обслуживающий сигналы рабочих головок записи-
считывания. Контроллером накопителя называют электронное устройство, которое является посредником между блоком HDA и программами, в т.ч. ОС, и имеет интерфейс,
позволяющий вести обмен байтами команд, состояния и данных, читаемых с диска или записываемыми на него.
119
Жесткие диски отличаются емкостью, быстродействием и интерфейсом.
Быстродействие зависит от скорости доступа к данным и скорости чтения-записи данных.
Под интерфейсом понимается тип подключения дискового контроллера. В современных накопителях на жестких дисках контроллер расположен на плате электроники,
смонтированной вместе с блоком HDA. Контроллер гибких дисков вынесен на специальную плату адаптера или размещается на системной плате. Характерной особенностью современных дисков является поддержка протокола прямого обмена между диском и памятью (DMA, Direct Memory Access).
Внакопителях на гибких дисках в нерабочем состоянии головка поднята над поверхностью диска на несколько миллиметров, а в рабочем прижимается к поверхности диска. Такой непосредственный контакт головки с поверхностью допустим только при малых скоростях движения носителя. В накопителях на жестких дисках головки поддерживаются на микроскопическом расстоянии от рабочей поверхности аэродинамической подъемной силой. Головки как бы плавают над поверхностью жесткого диска на специальной воздушной подушке и могут перемещаться вдоль радиуса диска с помощью двигателя.
Вкачестве привода для позиционирования головок на нужный цилиндр для накопителей на гибких магнитных дисках и жестких дисков устаревшей конструкции применяют шаговые двигатели, которые под действием серии импульсов способны поворачивать свой вал на определенный угол, который кратен минимальному шагу,
определяемому конструкцией двигателя. Поворот вала на 1 шаг приводит к перемещению блока головок на 1 цилиндр. При этом ошибки позиционирования откорректировать нельзя,
можно только вернуться на нулевой цилиндр и снова попробовать переместиться к нужному цилиндру. Операция возврата на нулевой цилиндр называется рекалибровкой диска. В
современных накопителях используется привод головок с подвижной катушкой, где блок головок в зависимости от силы тока и напряжения можно переместить в произвольное положение. При этой системе позиционирования контроллеру постоянно необходима информация о текущем положении головок, чтобы обеспечить точное позиционирование головок по сигналу обратной связи. Для этой цели используется размещение на диске сервометок, которые записываются на диск при сборке. По месту размещения сервометок различают накопители с выделенной сервоповерхностью и со встроенными сервометками. В
первом случае в пакете дисков выделяется одна поверхность, используемая только для хранения сервометок, и соответствующая ей головка является сервоголовкой. Ошибка позиционирования в такой системе может возникать вследствие перекоса головок в блоке. В
120