Исследование возможностей управления формата кадра контроллера видеотерминала - 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.

Объяснение кода листинга программы

  1. Объявление переменных:
    • menyu, registr_e, registr_f, registr_5, zn - целочисленные переменные
  2. Процедура PRegE:
    • Установка значения регистра Eh
    • Вывод текущего значения регистра Eh
    • Возможность изменить значение регистра с помощью клавиш вверх и вниз
    • Ожидание ввода Enter для выхода
  3. Процедура PRegF:
    • Установка значения регистра Fh
    • Вывод текущего значения регистра Fh
    • Возможность изменить значение регистра с помощью клавиш вверх и вниз
    • Ожидание ввода Enter для выхода
  4. Процедура PReg5:
    • Установка значения регистра 5h
    • Вывод текущего значения регистра 5h
    • Возможность изменить значение регистра с помощью клавиш вверх и вниз
    • Ожидание ввода Enter для выхода
  5. Главное тело программы:
    • Вывод меню с выбором регистра
    • Выполнение соответствующей процедуры в зависимости от выбора
    • В случае неправильного ввода вывод сообщения Nevernyj vvod
    • Программа продолжает выполняться до тех пор, пока не будет введен 0 для выхода.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы