Исследование возможностей управления формата кадра контроллера видеотерминала - Pascal
Формулировка задачи:
Для управления работой контроллера видеотерминала имеется набор управляющих программно адресуемых регистров. Обращение к этим регистрам организовано по принципу индексной адресации к портам ввода-вывода. Для этой цели используется два порта(регистра):
-индексный регистр(регистр адреса) в него заносится номер регистра
с которого мы хотим считать или в который хотим записать данные.Его адрес3D4(16c/c) .
-регистр данных в него заносятся данные для записи в выбранный регистр или считываются данные из выбранного регистра. Его адрес 3D5(16c/c). Для доступа к портам используются команды Паскале
- для записи в порт port[$3d4] :=a;
-для чтения порта a:=port[$3d5;
Для записи в регистры 0-7 необходимо снять защиту записи для этого в 11h регистре восьмой бит надо сбросить в нуль(т.е. записать в него 0).
Исследуемые регистры позволяют изменять положение информации отображаемого кадра в видеопамяти, менять расстояние между знаковыми строками, менять положение курсора в кадре, выполнять построчную прокрутку изображение кадра, формировать независимые окна на экране и т.п.
Написать программу для изменения содержимого заданной группы регистров и оценит их влияние на формирование изображения на экране монитора. Программу следует выполнять в среде виртуальной DOS BOX на соответствующем языке программирования.
Решение задачи: «Исследование возможностей управления формата кадра контроллера видеотерминала»
textual
Листинг программы
Program REGS;
Uses CRT;
var
menyu, registr_e, registr_f, registr_5, zn: integer;
procedure PRegE;
var
key: char;
begin
clrscr;
port[$3d4]:=$e;
registr_e:=port[$3d5];
zn:=registr_e;
writeln;
writeln(' REGISTR Eh ');
writeln;
writeln(' Tekuschee znachenie registra Eh: ',registr_e);
writeln;
writeln(' Dlya izmeneniya znacheniya registra ispolzujte klavishi "vverh" i "vniz" ');
writeln(' Dlya vyhoda nazhmite "Enter".');
GotoXY(31,17);
write('Znachenie: ',zn,' ');
repeat
key:=readkey;
case key of
#0:
begin
key:=ReadKey;
case key of
#72: zn:=zn+1;
#80: zn:=zn-1;
end;
end;
end;
GotoXY(31,17);
write(' Znachenie: ',zn,' ');
port[$3d4]:=$e;
port[$3d5]:=zn;
until key=#13;
port[$3d4]:=$e;
port[$3d5]:=registr_e;
clrscr;
end;
procedure PRegF;
var
key: char;
begin
clrscr;
port[$3d4]:=$f;
registr_f:=port[$3d5];
zn:=registr_f;
writeln;
writeln(' REGISTR Fh ');
writeln;
writeln(' Tekuschee znachenie registra Fh: ',registr_f);
writeln;
writeln(' Dlya izmeneniya znacheniya registra ispolzujte klavishi "vverh" i "vniz" ');
writeln(' Dlya vyhoda nazhmite "Enter".');
GotoXY(31,17);
write(' Znachenie registra: ',zn,' ');
repeat
key:=readkey;
case key of
#0:
begin
key:=ReadKey;
case key of
#72: zn:=zn+1;
#80: zn:=zn-1;
end;
end;
end;
GotoXY(31,17);
write(' Znachenie registra: ',zn,' ');
port[$3d4]:=$f;
port[$3d5]:=zn;
until key=#13;
port[$3d4]:=$f;
port[$3d5]:=registr_f;
clrscr;
end;
procedure PReg5;
var
key: char;
a,b : integer;
begin
clrscr;
port[$3d4]:=$11;
b:=port[$3d5];
a:= b div 128;
b:=b-128;
port[$3d4]:=$11;
port[$3d5]:=b;
port[$3d4]:=$5;
registr_5:=port[$3d5];
zn:=registr_5;
writeln;
writeln(' REGISTR 5h ');
writeln;
writeln(' Tekuschee znachenie registra 5h: ',registr_5);
writeln;
writeln(' Dlya izmeneniya znacheniya registra ispolzujte klavishi "vverh" i "vniz" ');
writeln(' Dlya vyhoda nazhmite "Enter".');
GotoXY(31,17);
write(' Znachenie registra: ',zn,' ');
repeat
key:=readkey;
case key of
#0:
begin
key:=ReadKey;
case key of
#72: zn:=zn+1;
#80: zn:=zn-1;
end;
end;
end;
GotoXY(31,17);
write(' Znachenie registra: ',zn,' ');
port[$3d4]:=$5;
port[$3d5]:=zn;
until key=#13;
port[$3d4]:=$5;
port[$3d5]:=registr_5;
clrscr;
end;
BEGIN
clrscr;
repeat
writeln(' Vvedite nomer registra i nazhmite Enter');
writeln(' 1 - Registr Eh.');
writeln(' 2 - Registr Dh.');
writeln(' 3 - Registr 5h.');
writeln(' Dlya vyhoda nazhmite 0' );
readln(menyu);
case menyu of
1 : PRegE;
2 : PRegF;
3 : PReg5;
else writeln('Nevernyj vvod')
end
until menyu = 0;
END.
Объяснение кода листинга программы
- Объявление переменных:
menyu,registr_e,registr_f,registr_5,zn- целочисленные переменные
- Процедура PRegE:
- Установка значения регистра
Eh - Вывод текущего значения регистра
Eh - Возможность изменить значение регистра с помощью клавиш
вверхивниз - Ожидание ввода
Enterдля выхода
- Установка значения регистра
- Процедура PRegF:
- Установка значения регистра
Fh - Вывод текущего значения регистра
Fh - Возможность изменить значение регистра с помощью клавиш
вверхивниз - Ожидание ввода
Enterдля выхода
- Установка значения регистра
- Процедура PReg5:
- Установка значения регистра
5h - Вывод текущего значения регистра
5h - Возможность изменить значение регистра с помощью клавиш
вверхивниз - Ожидание ввода
Enterдля выхода
- Установка значения регистра
- Главное тело программы:
- Вывод меню с выбором регистра
- Выполнение соответствующей процедуры в зависимости от выбора
- В случае неправильного ввода вывод сообщения
Nevernyj vvod - Программа продолжает выполняться до тех пор, пока не будет введен
0для выхода.