Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
тандартные процедуры и функции модулей 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.