Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

sytkova-paano

.pdf
Скачиваний:
23
Добавлен:
14.02.2015
Размер:
1.67 Mб
Скачать

out 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]