Исследование возможностей управления формата кадра контроллера видеотерминала - 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
для выхода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д