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

LRP2

.pdf
Скачиваний:
18
Добавлен:
02.02.2015
Размер:
520.44 Кб
Скачать

товой плоскости в порт 3C4H используем выражение Port[$3C4]:=2.

5.1.2.При использовании программного прерывания необходимо: - подключить модуль Dos, в котором описаны процедура Intr и

тип переменной Registers;

- объявить переменную этого типа, например, reg:Registers; - к регистрам микропроцессора обращаться, как reg.al;

- процедуру прерывания 10H вызывать следующим образом:

Intr($10,reg).

5.1.3.Описание изображения символа удобно представить с помощью типизированной константы. Например, описание символа, изображенного на рис. 1, имеет следующий вид:

const

ms:array[1..14] of byte=($00,$00,$88,$88,$88,$88,$88,

$88,$98,$AA,$44,$00,$00,$00);

5.1.4. Если слова заданы в виде строки символов s типа string, то для определения ASCII кода k-й буквы строки можно воспользоваться выражением ord(s[k]).

5.1.5.Блок буфера видеоконтроллера можно представить в виде массива:

block:array[0..14*256] of byte absolute $A000:$0000.

5.2. На языке Турбо-Си.

5.2.1. Для обращения к портам ПЭВМ применяются функции чтения и записи порта,которые хранятся в библиотеке < dos.h>. Библиотека подключается директивой

#include < dos.h>

после чего, например, для записи значения 0EH в порт 3D5H используется выражение:

 

outportb(0x3D5,0x0E);

 

5.2.2.При использовании программного прерывания необходимо:

 

- подключить библиотеку Dos, в котором описаны процедура

Int86x и тип смеси REGS директивой:

.

#include <dos.h>

- объявить переменные смеси: union REGS in,out,sr;

- к регистрам микропроцессора обращаться, как in.h.ah, in.x.ax;

31

-к сегментным регистрам обращаться, как sr.es;

-для доступа к регистру BP необходимо объявить структуру

struct REGPACK inb;

-после чего к регистру обращаться, как inb.r_bp;

-процедуру прерывания 10H вызывать следующим образом:

Int86x(0x10,&in,&out,&sr).

5.2.3. Описание изображения символа удобно представить при инициализации массива. Например, описание символа, изображенного на рис. 1,

имеет следующий вид:

char ms[14]={0x00,0x00,0x88,0x88,0x88,0x88,0x88, 0x88,0x98,0xAA,0x44,0x00,0x00,0x00};

5.2.4.Обращение к буферу видеоконтроллера аналогично обращению

кячейкам ОЗУ с помощью дальних указателей, объявленных

char far * uk;

Тогда для занесения начального адреса видеобуфера необходимо записать:

uk=( char far *)0xA0000000;

6. Индивидуальные задания По второй цифре номера студента по журналу выбрать параметры

формируемого изображения.

╔══════════════════╦═══════════════════════════════════════╗

Параметры ║

Номер в журнале

║ 0 1 2 3 4 5 6 7 8 9 ║

║══════════════════╬═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╣

w_str

║ 0 │ 1

2

3

4

5

6

7

8

9

k_str

║ 13│ 12│

11│

10│

8

9

│ 10│ 11│ 12│ 13║

col_fon

30│ 31│

32│

33│

34│

35│ 36│ 37│ 38│ 39║

col_for

A │ 9

8

7

6

5

4

3

2

1

╚══════════════════╩═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╝

где: n_str и k_str-начальная и конечная строка позиции курсора в знакоместе.

col_for-цвет фона (0 регистр палитры) col_for-цвет границы экрана.

32

7.Содержание отчета.

7.1.Тема лабораторной работы. 7.2.Цель работы.

7.3.Порядок выполнения. 7.4.Индивидуальное задание. 7.5.Текст программы. 7.6.Результаты работы программы. 7.7.Выводы.

Лабораторная работа 13

РАБОТА СО СТРАНИЦАМИ

1. Цель работы

Получение практических навыков манипуляции с экраном, используя переключение страниц.

2.Темы для предварительной проработки

2.1.Организация видеопамяти в текстовом режиме.

2.2.Назначение регистров видеоадаптера.

3. Описание работы

Сдвиг экрана и разбиение на страницы - это два способа переноса блока информации из памяти на экран. При сдвиге одна из границ экрана сдвигается внутрь, стирая информацию на противоположной стороне. Затем освободившаяся область заполняется из памяти. Повторение этого действия строка за строкой создает иллюзию сдвига экрана.

С другой стороны, разбиение на страницы основано на одновременном хранении нескольких экранов информации в видеобуфере и переключении вывода с одной страницы на другую. Использование дисплейных страниц невозможно на монохромном адаптере, поскольку его памяти хватает только для одного символьного экрана. Другие видеосистемы в большинстве экранных режимов могут работать с несколькими страницами. Использование страниц дисплея особенно полезно при построении сложных картин "за кулисами", после того как эта работа завершена, новый экран выводится моментально.

33

3.1.Сдвиги экрана путем изменения данных в видеобуфере. 3.1.1.Вертикальный сдвиг всего экрана - тривиальная задача,

поскольку правая граница одной строки в памяти продолжается левой границей следующей строки. Сдвиг всего содержимого видеобуфера на 160 байт вверх по памяти (80 символов в строке х 2 байта на символ) приводит к сдвигу экрана вниз на одну строку. Если вы пишете свою собственную процедуру сдвига экрана, использующую прямое отображе-

ние в память, то не

забывайте об интерференции, которая возникает

на цветном дисплее и

PCjr. Решение этой проблемы - проверять ста-

тусный байт, ожидая, пока он разрешит запись в видеобуфер. Вам придется поэкспериментировать, чтобы определить, сколько данных вы можете записать за один цикл.

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

Для выключения экрана у цветного графического дисплея надо сбросить бит 3 порта с адресом 3D8H. Изменение бита назад на 1 моментально вновь включает экран. Адрес порта соответствует регистру выбора режима цветного графического адаптера. Этот однобайтовый регистр только для записи, поэтому программа не может просто прочитать его, изменить значение бита 3 и вернуть прочитанный байт. Вместо этого необходимо определить также правильную установку всех остальных битов.

3.1.2.Горизонтальный сдвиг экрана.

Видеобуфер представляет собой одну длинную строку. Поэтому если каждый символ буфера сдвинуть на 10 байт вниз, то суммарный эффект будет состоять в том, что самые левые 5 символов каждой строки будут передвинуты в последние 5 позиций предыдущей строки. Таким образом, весь экран будет сдвинут влево на 5 позиций, передвигая 5 ненужных столбцов в правую часть экрана. Все, что после этого остается, - это очистить правые 5 столбцов или запомнить их "невидимыми" за пределами экрана символами,которые хранятся в ОЗУ или вводятся пользователем.

3.2.Страничная организация видеопамяти.

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

34

мяти. Число доступных страниц может меняться в зависимости от видеосистемы и режима дисплея.

В режимах 0-3 и 7 имеется 8 страниц. BIOS хранит в своей области данных однобайтовую переменную, указывающую, какая из страниц выводится в данный момент. Диапазон значений этой переменной от 0 до 7. Она расположена по адресу 0040:0062H.

Дисплейные страницы выбираются за счет изменения точки видеопамяти, начиная с которой монитор принимает данные. Эта точка памяти устанавливается регистрами 0CH (старший байт) и 0DH (младший байт) микросхемы 6845, которые называются регистрами стартового адреса.Для программирования регистров стартового адреса необходимо записать номер регистра в адресный регистр блока ( послать номер в порт 3D4,после чего записать данные в порт 3D5. Значения адресов раздела страниц для буфера, начинающегося с В800, такие:

Страница

40 символов

80 символов

0

0000H

0000H

1

0200H

0400H

2

0400H

0800H

3

0600H

0C00H

4

0800H

1000H

5

1000H

1400H

6

1200H

1800H

7

1400H

1C00H

3.3.Аппаратный сдвиг.

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

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

35

Отметим, что регистр стартового адреса не считает байты атрибутов, поэтому вы должны вычислять адреса памяти по-другому, а не так, как при прямом отображении в память. Имейте также в виду, что, несмотря на наличие разрывов памяти между границами страниц (96 байт между 80-символьными страницами и 48 байт между 40-символьными страницами), микросхема 6845 пропускает эти области и сдвиг непрерывно происходит с одной страницы на следующую. Аппаратный сдвиг происходит настолько быстро, что может оказаться необходимым вставить процедуру задержки, чтобы пользователь имел возможность увидеть, насколько сдвинулся экран.

BIOS хранит текущее значение регистра стартового адреса в переменной в своей области данных. Эта двухбайтовая переменная расположена по адресу 0040:0004H.

3.4.Создание разделенного экрана

Адаптер EGA позволяет на аппаратном уровне создавать так называемый разделенный экран в алфавитно-цифровом режиме. Верхнюю часть экрана будем называть экраном A, а нижнюю - экраном B, как это показано на рисунке (рис.1).

┌───────────────────────────┐

 

Экран A

 

├───────────────────────────┤

 

Экран B

 

└───────────────────────────┘

Рис. 1

На нижеследующем рис. 2 показано отображение экраном на видеопамять размером в 32 Кб. Заметьте, что в алфавитно-цифровом режиме адаптер имеет видеобуфер размером в 32 Кб. Информация в экране A находится по адресу определенному значениями регистров старшей и младшей составляющих начального адреса (0CH и 0DH) блока управления ЭЛТ. Данные экрана B всегда расположены в видеобуфере по адресу

0000H.

36

0000H

┌───────────────────────────┐

 

Область данных

 

 

0FFFH │

экрана B

 

├───────────────────────────┤

1000H

Область данных

 

 

 

экрана A

7FFFH └───────────────────────────┘

Рис. 2 Для организации работы с разделенным экраном используется ре-

гистр сравнения строк (18h) блока управления ЭЛТ.Необходимо сначала послать в порт 3D4-18H ( адрес регистра ),а затем в порт 3 D5-номер строки,которая является границей двух экранов.В этом блоке содержится внутренний счетчик выведенных в текущем кадре строк растра, значение которого постоянно сравнивается со значением регистра сравнения строк. Как только их значения становятся равными, генератор адреса памяти сбрасывается в 0. После этого генератором адреса формируются последовательные адреса, начиная с нулевого адреса до завершения вывода кадра.

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

4.Порядок выполнения работы.

4.1.Написать программу,выполняющую следующие действия: 4.1.1.Ожидает в цикле нажатие алфавитно-цифровой клавиши, и

при нажатии клавиши выводит набранный пользователем текст путем прямого отображения в видеобуфер в виде "бегущей строки".При этом символы вначале заполняют строку слева направо до 80 позиций, а при дальнейшем наборе текста вся строка сдвигается влево на 1 символ, последний введенный символ записывается в 80 позицию,первый символ строки исчезает.Для организации "бегущей строки" использовать аппаратный сдвиг экрана.Номер строки выбирается из индивидуального задания.

4.1.2.Загружает текстовый файл объемом 32 Кбайта в видеобуфер, начиная с адреса B800:0000H и при нажатии клавиш 0-7 выводит на экран текущую видеостраницу.

37

4.1.3.При нажатии клавиши СТРЕЛКА ВВЕРХ и СТРЕЛКА ВНИЗ выполняет скроллинг экрана на одну строку вверх или вниз соответственно.

4.1.4.Создает разделенный экран путем программирования регистра сравнения строк,и по клавишам СТРЕЛКА ВВЕРХ и СТРЕЛКА ВНИЗ выполняет скроллинг экрана А.

5.Особенности программирования.

5.1.На языке Турбо-Паскаль.

5.1.1.Буфер видеоконтроллера в текстовом режиме можно представить в виде массива:

buff:array[0..3999] of byte absolute $B800:$0000.

Тогда для вывода на экран символа в i-ю строку и в j-й столбец необходимо по адресу buff[i*160+j*2] записать ASCII код символа, а по следующему - байт видеоатрибута.

5.1.2. Для чтения текстового файла с перезаписью в видеобуфер необходимо:

-объявить файловую переменную, например,

var

f:text;

-связать файловую переменную с именем текстового файла на диске (внешним именем) с помощью процедуры Assign, например, для файла на диске D в каталоге CAT c именем FIL.PAS надо указать:

Assign(f, 'D:CAT\FIL.PAS');

-открыть файл для чтения процедурой Reset: Reset(f);

-читать посимвольно в цикле из текстового файла в переменную например, ch (ch:char) c помощью процедуры Read и с переписыванием кода прочитанного символа и его атрибута в видеобуфер Buff (см. п.

5.1.1):

Read(f,ch);

buff[2*i]:=ord(ch); buff[2*i+1]:=$07; {белый на черном}

i - номер прочитанного символа (начиная с 0); -читать из текстового файла до тех пор, пока не встретится сим-

вол "конец файла" (функция Eof(f) при этом примет значение true); -после обнаружения конца файла закрыть файл с помощью процедуры

Close: Close(f).

38

5.2. На языке Турбо-Си.

5.2.1. Обращение к буферу видеоконтроллера в текстовом режиме осуществляется аналогично обращению к ячейкам ОЗУ с помощью дальних указателей, обЪявленных

char far * uk;

Тогда для занесения начального адреса видеобуфера необходимо за писать: uk=( char far *)0xB8000000;

а для вывода на экран символа в i-й строке и в j-м столбце за-

писать: * (uk + i*160+j*2)=kod; * (uk + i*160+j*2+1)=attr;

где:kod и attr -переменные типа char,описывающие ASCII код и атрибут символа соответственно.

5.2.2.Загрузка файла в видеобуфер выполняется следующим обра-

зом:

-открытие файла и установка указателя на начало файла по выражению

fp=fopen(fname, "rb" );

где:fpуказатель,который должен быть описан как FILE *fp; fname-имя загружаемого файла,

"rb"-режим чтения байтового файла. -чтение в цикле байт из файла по выражению

*uk=getc(fp);

где *ukуказатель на видеобуфер,который должен быть описан

как

char far *uk

-закрытие файла функцией

fclose(fp);

Для работы с указанными функциями необходимо подключить библиотеку stdio.h директивой

#include <stdio.h>.

6.Индивидуальные задания

Втаблице 1 по второй цифре номера студента по журналу выбрать параметры "бегущей строки" и разделенного экрана.

39

Таблица 1 ╔══════════════════╦═══════════════════════════════════════╗

Параметры ║

Номер в журнале

║ 0 1 2 3 4 5 6 7 8 9 ║

║══════════════════╬═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╣ ║ N_s ║ 5 │ 6 │ 7 │ 8 │ 9 │10 │11 │ 12│ 13│ 14║

BEG_S ║ 0 │ 1 │ 2 │ 3 │ 4 │ 10│ 9 │ 8 │ 7 │ 6 ║

END_S ║ 60│ 65│ 70│ 75│ 80│ 75│ 70│ 65│ 60│ 50║

║ N_CR ║ 7 │ 8 │ 9 │ 10│ 11│ 12│ 13│ 14│ 15│ 16║ ╚══════════════════╩═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╧═══╝

где: N_S -номер строки дисплея, где организуется "бегущая строка";

BEG_S,END_Sначальная и конечная позиция "бегущей строки". N_CR-Номер строки дисплея,которое является границей разделен-

ного экрана.

7. Содержание отчета

7.1.Тема лабораторной работы. 7.2.Цель работы.

7.3.Порядок выполнения. 7.4.Индивидуальное задание. 7.5.Текст программы. 7.6.Результаты работы программы. 7.7.Выводы.

Лабораторная работа 14

ВСПЛЫВАЮЩИЕ ОКНА И МЕНЮ.СОХРАНЕНИЕ ЧАСТИ ЭКРАНА. ВОССТАНОВЛЕНИЕ ЭКРАНА.

1. Цель работы

Приобретение практических навыков создания всплывающих окон и исчезающих меню.

2.Темы для предварительной проработки

2.1.Структура видеопамяти.

3. Описание работы При разработке прикладных программ,часто возникает необходи-

40

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