Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

01] Цветной режим [3

Работа добавлена на сайт samzan.net:


тандартные процедуры и функции модулей CTR, SYSTEM, DOS        Страница  8 из 8

Оглавление

[1] Оглавление

[2] Обеспечение интерфейса с командами операционной системы

[2.1] Типы прерываний и их обслуживание

[2.2] Организация работы с каталогами и файлами

[2.3] Установка даты и времени

[2.4] Управление вычислительным процессом с помощью вызова внешних программ

[3] Организация работы в текстовом режиме

[3.1] Установка текстового режима

[3.1.0.1] Цветной режим

[3.2] Организация окон и вывод на экран

[3.3] Управление клавиатурой и звуком

[3.4] Форматы меню. Алгоритм  построения вертикального меню

[4] Контрольные вопросы

Комбинированный урок №16

Тема: Стандартные процедуры и функции модулей CRT, System и DOS. Обработка прерываний.

Цель: изучить приемы составления программ с использованием процедур и функций модулей на примерах.

Обеспечение интерфейса с командами операционной системы

Основная часть средств Pascal размещена в стандартных модулях. Модуль – это библиотека, которая содержит константы, описания типов данных, переменные и функции. Наиболее часто используются модули System, Dos, Graph, Crt и др. Процедуры и функции модуля System подключаются автоматически и обеспечивают управление выполнением программ, обработку строк, файлов, управление  динамической памятью, производят математические расчеты и другие действия.

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

Обработку прерываний, проверку статуса дисков, управление программной средой, организацию работы с каталогами и их элементами реализуют процедуры и функции стандартного модуля DOS. Чтобы их использовать, необходимо подключить этот модуль в начале программы с помощью Uses DOS.

Типы прерываний и их обслуживание

Иногда возникает необходимость прямого обращения к функциям базовой системы ввода-вывода (BIOS) и операционной системы MSDOS. Для этого можно создать в программе прерывание или выполнить вызов функции MSDOS.

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

Каждому прерыванию соответствует число от 0 до 255. Прерывания могут вызывать:

– устройства компьютера, отличные от процессора;

– команды программных прерываний (например, ниже будет рассмотрена процедура Intr);

– сам процессор при появлении сбоев, особенных ситуаций (например, деление на 0). Например, 9(9) – обработка сигнала нажатия на клавишу; 5(5) – прерывание от принтера при печати  копии экрана.

Реагируя на прерывание, процессор должен запомнить адрес возвращения в прерванную программу.

Процессор ПЭВМ имеет четыре шестнадцатиразрядных регистра общего назначения: АХ, ВХ, СХ и DX.

Для обращения к процедурам, реализующим программные прерывания, в модуле DOS описан тип Registers:

Type Registers=Record

  Case integer of

  0:(AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: word);

  1:(AL,AH,BL,BH,CL,CH,DL,DH:byte)

 End;

Запись Registers представляет собой набор регистров процессора (поля записи).

Процедура Intr (IntNo: byte; Var Regs: Registers); выполняет заданное программное прерывание. Параметр IntNo – это номер программного прерывания (0…255). Когда выполняется процедура Intr, значения полей AX, BX, CX, DX, BP, SI, DI, DS и ES загружаются в соответствующие регистры процессора. После этого вызывается прерывание с номером IntNo. После того, как прерывание обработано, содержимое регистров процессора загружается в поле Regs, а содержимое регистра флагов копируется в поле Flags. Таким образом, можно получить доступ к результатам работы процедуры прерывания.

Процедура MsDos (Var Regs: Registers); выполняет вызов функции MSDOS, номер которой содержится в регистре AH. Результат вызова MsDos будет тот же самый, что и результат вызова Intr с номером прерывания IntNo=#21. Вообще, прерывание номер $21 называют прерыванием DOS, объединяющим в себе большое количество различных функций.

Пример 1. Перевод курсора в невидимое состояние, установка стандартного размера курсора.

Uses Dos;

Var i:byte;

Procedure SetCursorSize(Size:word);

 Var Regs:Registers;

 Begin

   With Regs do

       begin

        AH:=$01;

        CH:=Hi(Size);

        CL:=Lo(Size);

        Intr($10,Regs) {прерывание $10, где на входе в регистр CH посылается номер}

{ начальной строки, а в регистре CL – номер последней строки курсора.}

       end

 End;

Begin {основная программа}

 Writeln('Перевод курсора в невидимое состояние - ...');   SetCursorSize($2000);

 For i:=1 to 10 do  writeln(i);

 Readln;

 Writeln('Установка стандартного размера курсора  - ...');    SetCursorSize($0607);

 writeln;

 For i:=1 to 10 do  writeln(i);

 Readln

End.

Организация работы с каталогами и файлами

Процедуры модуля System, которые используются при работе с каталогами.

ChDir(S:String); – выполняет смену текущего каталога на каталог, который задается с помощью маршрута, указанного в параметре S.

GetDir(D:byte; var S:string); – определяет значение текущего каталога на диске, заданное параметром D (D=0 – текущий диск, D=1 – диск А:, D=2 – диск В: и т.д.), возвращается в переменную S.

MkDir(S:string); – создает подкаталог с маршрутом доступа, заданным строкой S.

RmDir(S:string); – удаляет пустой подкаталог (не текущий).

Ниже описанные процедуры и функции работы с файлами содержатся в модуле DOS.

 Процедура GetFAttr(F; var Attr:word); возвращает атрибуты файла, связанного с файловой переменной F, в переменную Attr.

Процедура SetFAttr(var F; Attr:word); устанавливает атрибуты файла в соответствии со значением переменной Attr (ReadOnly, Hidden, SysFile, VolumeID, Directory, Archive, AnyFile).

Установка даты и времени

Модуль Dos предоставляет возможность доступа к системным часам и календарю, а также позволяет изменить дату и время создания файла.

Процедура GetDate (Var Year, M, Day, D: word); возвращает текущую дату, установленную в ОС.  

Процедура SetDate (Var Year, M, Day, D: word); устанавливает текущую дату в ОС.

Параметры принимают следующие значения: Year (год) - от 1980 до 2099, M (месяц) –  от 1 до 12, Day (число) -  от 1 до 31, D (день недели) – от 0 до 6, где 0 означает воскресенье.

Процедура GetTime (Var Hour, Min, Sec, Ssec: word); возвращает установленное в ОС текущее время.

Процедура SetTime (Var Hour, Min, Sec, Ssec: word); устанавливает в ОС текущее время.

Параметры принимают следующие значения: Hour (час) - от 0 до 23, Min (минута) – от 0 до 59, Sec (секунда) – от 0 до 59, Ssec (сотая доля секунды) –  от 0 до 99.

Процедура GetFTime (Var F; Var Time: LongInt); возвращает время и дату создания файла, связанного с файловой переменной F. Время и дата возвращаются в переменную Time в упакованном формате.

Для их распаковки используется процедура UnpackTime (Time: LongInt, Var DT: DateTime).

Параметр DateTime имеет тип «запись», описанный в модуле Dos:

Type DateTime = Record

Year, Month, Day, Hour, Min, Sec : word

end;

Чтобы изменить дату и время создания файла, используются процедуры PackTime и SetTime.

Процедура PackTime (Var T: DateTime; Var Time: LongInt); преобразует значение параметра T в упакованный формат, который затем используется процедурой SetFTime.

Процедура SetFTime (Var F; Time: LongInt); устанавливает дату создания файла. Файл, для которого необходимо изменить дату создания, должен быть открыт для чтения.

Управление вычислительным процессом с помощью вызова внешних программ

В Pascal можно организовать вызов из программы любой другой программы, которую назовем программой–потомком. Но, чтобы программа–потомок успешно загружалась в память и начала выполняться, требуется выделить ей необходимый объем памяти. Так как программа, которая выполняется в данный момент, по умолчанию захватывает всю свободную динамическую память (кучу) системы, то для загрузки программы–потомка просто нет места. Минимальный размер выделяемой программе памяти указывается в директиве компилятора $M.

Например, директива {$M 16384, 0, 655360} устанавливается для программ по умолчанию. Здесь максимальный размер кучи равен всей доступной памяти и вызов программы–потомка невозможен. Но, с помощью директивы {$M 1024, 0, 0} динамическая память совсем не выделена. Теперь можно вызывать программу–потомок.

Вызов внешней программы производится с помощью процедуры Exec (Path, CmdLine: String).

Здесь Path – это путь к исполняемому файлу и его имя, а CmdLine – командная строка,  которая передается  вызываемой программе.

При запуске программа, написанная на Pascal, переопределяет некоторые прерывания MS-DOS для собственных целей. Поэтому перед вызовом программы–потомка нужно восстановить исходные адреса обработчиков прерываний (MS-DOS обработчиков), а после завершения работы вызываемой программы установить адреса обработчиков  Pascal. Эти действия выполняет процедура без параметров SwapVectors.

Пример 2. Описание вызова  внешней программы.

{$M 1024,0,0}

Uses Dos;

Var PrName,CmdLine:string;

Begin

Write('Введите путь и имя исполняемого файла:  ');        Readln(PrName);

Write('Введите командную строку:  ');        Readln(CmdLine);

SwapVectors;    {переустановим вектора прерываний}

Exec(PrName,CmdLine);

SwapVectors;    {восстановим вектора}

IF DosError<>0 THEN writeln('Ошибка DOS! Ее код - ',DosError)

ELSE writeln('Выполнение прошло успешно!');     Readln

End.

Отметим, что при вызове с помощью Exec внутренней функции MS-DOS следует вызвать Command.com. 

Используя механизм вывода внешних программ, можно создавать сложные программные комплексы, в которых программа–диспетчер, занимая небольшой объем памяти, производит вызов необходимых (в том числе и системных) программ.

Организация работы в текстовом режиме

Установка текстового режима

Работу в текстовом режиме, управление клавиатурой, курсором и звуком выполняет в языке Pascal стандартный модуль CRT. Подключение модуля CRT к программе пользователя осуществляется с помощью  USES CRT;.

Текстовый режим используется для вывода символов и характеризуется количеством. Количество символов на экране компьютера по горизонтали и вертикали зависит от типа видеоадаптера и параметров текстового режима и варьируется по горизонтали от 40 до 80. Для установки различных текстовых режимов вывода информации используется процедура TextMode(mode:word);, которая задает текстовый режим модуля mode, который может быть указан в виде именной константы или с помощью числового значения. Некоторые значения именных констант режимов представлены в таблице 1.

Таблица 1.

Имя константы

Значение

Разрешение экрана

Цветной режим

BW40

0

40x25

Черно-белый для цветного адаптера

Co40,C40

1

40x25

Цветной

BW80

2

80x25

Черно-белый для цветного адаптера

Co80,C80

3

80x25

Цветной

Font8x8

256

80/40x50

Цветной для адаптера VGA

После установки текстового режима началом отсчета координат является верхний угол экрана с координатами (1,1). Координата Х изменяется по горизонтали слева направо, а Y по вертикали сверху вниз.

Организация окон и вывод на экран

Модуль CRT обеспечивает работу с окнами разного размера. Величина окна и ее расположение на экране определяется с помощью процедуры Window.

Процедура Window(x1,y1,x2,y2:byte); определяет на экране текстовое окно. Координаты x1, y1 соответствуют верхнему левому углу создаваемого окна, а x2, y2 – правому нижнему углу.  После определения окна крайней верхней левой позиции в новом окне соответствует координата (1,1). На экране одновременно может присутствовать сразу несколько окон, но в каждый конкретный момент времени активным является только одно окно.  

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

Процедура TextBackGround(colоr:byte); устанавливает цвет фона, который может принимать значения от 0 - Black (черный) до 7 - LightGray (светло-серый).   

Процедура TextColor(colоr:byte); устанавливает цвет выводимого в окне текста. Значение цвета обычно изменяется в диапазоне от 0 - Black (черный) до 15 – White (белый). Для вывода мерцающего текста заданного цвета, необходимо в процедуре к значению цвета прибавить константу Blink или значение 128, например, TextColor(Red+Blink) или TextColor(Magenta+128).

Процедура ClrScr; очищает активное окно текущим цветом фона и устанавливает курсор в правый верхний угол этого  окна.

Процедура ClrEol; очищает строку текущим цветом фона от текущей позиции курсора до конца строки.

Процедура GotoXY(x,y:byte); переводит курсор в позицию с координатами x, y.

Процедура DelLine; удаляет строку из активного окна, на которой располагается курсор, и смещает все нижние  строки на одну позицию  вверх.

Процедура InsLine; вставляет дополнительную строку от места расположения курсора в активном окне.

Функция WhereX:integer; возвращает значение х текущей позиции  курсора.

Функция WhereY:intteger; возвращает значение у текущей позиции курсора.

Процедура LowVideo;  устанавливает режим минимальной яркости свечения символов на экране.

Процедура NormVideo; устанавливает режим нормальной яркости свечения символов на экране.

Процедура HighVideo; устанавливает режим максимальной яркости свечения символов на экране.

Ввод информации в текстовом режиме выполняется с помощью процедур Read, Readln, а вывод - Write и  Writeln.  Если при выводе текста в активном окне достигается его нижняя граница, то информация в окне сдвигается на одну строку вверх. Такой процесс часто называют «прокруткой».

Процедура CrtExit; восстанавливает режим, который был установлен стандартно после загрузки операционной системы.  Данную процедуру целесообразно выдавать при завершении работы программы, использующей текстовый режим работы.

Пример 3. Сгенерировать случайным образом и вывести на экран 255 окон разного цвета.

Uses CRT;

Var      X,Y,k,j:byte;

BEGIN

    Randomize; {Инициализация генератора случайных чисел}

    j:=0;

    For k:=1 to 255 do

       begin

           TextBackGround(j);{установка цвета фона}

           ClrScr;           {очистка окна}

           if LightGray=j then j:=0

           else inc(j); {изменениe цвета фона от 0 - Black  - до 7 - LightGray }

           X:=Random(80)+1;

           Y:=Random(25)+1;

           Window(X,Y,X+random(5),Y+random(5))   {определение окна}

        end;

    Readln

END.

Управление клавиатурой и звуком

Клавиатура компьютера состоит из клавиш алфавитно-цифровых, функциональных и специальных. При нажатии клавиши или комбинации клавиш генерируется их код. Коды алфавитно-цифровых клавиш и ряда специальных клавиш  обычно состоят из одного байта, а функциональных клавиш, их комбинаций с клавишами Ctrl, Shift, Alt, а также алфавитно-цифровые клавиши в комбинации с клавишей Alt – из двух байт. Код из двух байт называют расширенным, первый символ в нем нуль (#0), а второй ASCII-код.

Некоторые коды клавиш или коды комбинаций клавиш представлены в таблице 2.

 Таблица 2.

Код клавиши или комбинации клавиш

Клавиши

Код клавиши или комбинации клавиш

Клавиши

#0#119

Ctrl+Home

#0#71

Home

#0#133

F11

#0#134

F12

#0#80

#0#59

F1

#0#72

#0#68

F10

#0#75

#27

Esc

#0#77

#13

Enter

#0#83

Del

#0#82

Insert

При нажатии большинства клавиш их коды размещаются в  буфере клавиатуры, содержание буфера  может быть проанализировано. Для управления клавиатурой в модуле CRT представлены функции KeyPressed и ReadKey.

Функция KeyPressed:boolean; - принимает значение True (истина), если на клавиатуре была нажата какая-нибудь клавиша, в противном случае -  False (ложь). Коды клавиш клавиатуры при этом сохраняются в ее специальном буфере и могут использоваться для анализа и обработки.   

Функция ReadKey:Char; - читает код клавиши (один байт)  из буфера клавиатуры. Этот код на экран компьютера не выводится. Если перед этой функцией выполнялась функция KeyPressed, и она приняла значение True (истина), то код клавиши читается сразу. В противном случае функция ReadKey ожидает нажатия клавиши. Для расширенных кодов клавиш данную функцию требуется выполнять дважды.

Для проверки нажатия клавиши в период выполнения цикла часто применяется функция KeyPressed в сочетании с оператором цикла с последующим условием Repeat …until.

Пример 4.

Repeat

until Keypressed;

Для работы со звуком в модуле CRT используются две процедуры Sound и  NoSound. 

Процедура Sound(Sig:word); - обеспечивает доступ к встроенному динамику компьютера и генерирует звуковой сигнал определенного частотного тона в герцах.

Таблица 3. Значения частот музыкальных звуков

Первая октава

Вторая октава

До

Ре

Ми

Фа

Соль

Ля

Си

До

Ре

Ми

Фа

Соль

Ля

Си

523

587

659

698

783

880

998

1046

1175

1319

1397

1568

1760

1976

Большая октава

Малая октава

До

Ре

Ми

Фа

Соль

Ля

Си

До

Ре

Ми

Фа

Соль

Ля

Си

130

147

165

175

196

220

246

262

294

330

349

392

440

494

Для завершения выдачи динамиком звукового сигнала  используется процедура NoSound.

При работе со звуком часто используется процедура задержки выполнения программы на определенное число миллисекунд Delay(Msek:word);. 

Пример 5. Сгенерируем последовательность звуков, представляющих гамму.

Uses CRT;

Const GAMMA : array[1..8] of integer=(262,294,330,349,392,440,494,524);

Var  j:byte;

BEGIN{Проигрываем гамму}

j:=1;

Repeat

Sound(GAMMA[j]);   {запускаем звук}

Delay(400);         {задержка}

Nosound;              {выключаем звук}

if j=8 then begin  j:=1; delay(1000); end;

Inc(j)

Until KeyPressed       {завершаем цикл при нажатии клавиши }

END.

Форматы меню. Алгоритм  построения вертикального меню

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

Основные форматы меню следующие:

  •   список объектов, выбираемых указанием числовых кодов, например,

1.

Открыть базу данных

2.

Отредактировать

3.

Поиск в базе данных

4.

Отсортировать

5.

Выход

  •   список объектов, выбираемых указанием мнемонических кодов:

Соб

Собственность

Трн

Транспорт

Меб

Мебель

Рзн

Разное

Кон

Конец

  •   меню в виде блока данных в столбик - вертикальное меню или в строчку - горизонтальное меню или комбинации этих двух видов меню, например,

вертикальное меню:                                  горизонтальное меню:

Треугольник

Круг

Сохранение

Редактирование

Выполнение

Квадрат

Выход

           

  комбинированное меню:

Файл

Правка

Формат

Справка

Открыть

Вырезать

Шрифт

Закрыть

Копировать

Абзац

Сохранить

Вставить

Выход

  •   меню в виде пиктограмм, иконок или значков.

Задача. В дальнейшем представим простейший алгоритм построения вертикального меню. Данный алгоритм строит меню из трех пунктов:

Данные

Справка

Выход

Движение по этому меню выполняется с помощью стрелок вверх ↑ или вниз ↓. Выполнение каждого пункта меню осуществляется при нажатии клавиши Ввод  на выбранном пункте меню.

Uses CRT,DOS;

Var    SPISOK:array[1..3] of string[7];

kod,kod1  :  char;

n,i,p   :   byte;

{процедура регулирования размера курсора}

Procedure CURS(size:word);

Var   Regs : Registers;

begin

  With Regs do

      begin

   AH:=$01;

   CH:=Hi(size);

   CL:=Lo(size);

   Intr($10,Regs)

      end

end;

{процедура вывода информации по выбранному пункту меню}

Procedure findd(n:byte);

begin

Textmode(3);

Window(1,1,80,25);

TextBackGround(Black);

ClrScr;

case n of    {анализ номера выбранного пункта меню}

1: begin {вывод информации для пункта 1} end;

2: begin {вывод информации для пункта 2} end;

3: exit

end;

readln;

Curs($0607)   {восстановить стандартный размер курсора}

end;

{процедура оформления меню и обработки нажатой клавиши}

Procedure oformenu;

begin

p:=1; i:=1;

Repeat {построение пунктов меню}

if i=n then

begin TextBackGround(Blue); Textcolor(LightGray);  end

else

begin  TextBackGround(Lightgray); Textcolor(Blue); end;

gotoxy(1,i);

writeln(SPISOK[i]); {вывод текста пунктов меню}

inc(i);  inc(p)

until p>3;

kod:=ReadKey;

CASE kod of

#13: begin          { обработка клавиши Ввод}

findd(n);

exit

end;

#0: begin

kod1:=ReadKey; {обработка нажатия клавиш ↑, ↓}

Case kod1 of

#72:    if n>1  then dec(n)

else n:=3;

#80:    if n<3   then inc(n)

else n:=1;

end;

oformenu;   {рекурсивный вызов процедуры}

end

else oformenu

end;

end;

BEGIN   {основная программа}

SPISOK[1]:='Данные ';

SPISOK[2]:='Справка';

SPISOK[3]:=' Выход ';

TextBackGround(Black); {установка  цвета фона}

Textcolor(Lightgray);  {установка цвета шрифта}

ClrScr;                    {очистка окна}

Window(35,10,43,13);       {задание окна для меню}

n:=1; {указатель номера выбранного пункта меню}

Curs($2000);  {удаление изображения курсора}

oformenu; {вызов процедуры оформления меню}

END.

Контрольные вопросы

  1.  Дайте определение прерыванию.
  2.  Характеристика регистров общего назначения (РОН).
  3.  Назначение модулей CRT, DOS, SYSTEM.
  4.  Какие процедуры и функции необходимы для работы с каталогами и файлами?
  5.  Как установить текущую дату и время?
  6.  Как осуществляется вызов внешних программ?
  7.  Необходимость текстового режима.
  8.  Основные процедуры и функции для работы с окнами и экраном, звуком.
  9.  Опишите форматы горизонтального и вертикального меню




1. О техническом регулировании а правила разработки сводов правил постановлением Правительства Российской
2. а полупроводниковая структура диода; б условное графическое обозначение; в вольтамперная характеристика
3. Спортивный арбитраж как способ рассмотрения споров в области спорта (сравнительно-правовой аспект)
4. Об общих принципах организации законодательных представительных органов государственной власти субъекто
5. октября 2009 г 373; на основе учебнометодического комплекса Перспектива Научный руководитель д
6. Учет деятельности малых производственных цехов
7. Лабораторна робота 2
8. Аневризма бомба замедленного действия
9.  операции Содержание операций Кор
10. Местные финансы. Специальные и внебюджетные фонды
11. Вариант 4 Вопрос 1- Философские концепции утверждающие существование множества субстанций
12. Виды гипоксических состояний
13. Природа и мы
14. В настоящее время установлено что человек появился приблизительно два миллиона лет назад
15. .jpg ivnov2.jpg или ivnovperemen
16. кредитных отношений
17. Под игом ПВежинов
18. Какой из приведённых ниже методов определения влаги и летучих веществ в лекарственных веществах относитс
19. Нижний Тагил 5~ 10 февраля 2014 г
20. БЕЛОРУССКАЯ ГОСУДАРСТВЕННАЯ СЕЛЬСКОХОЗЯЙСТВЕННАЯ АКАДЕМИЯ М