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