Исследование возможностей управления формата кадра контроллера видеотерминала - Pascal

Узнай цену своей работы

Формулировка задачи:

Для управления работой контроллера видеотерминала имеется набор управляющих программно адресуемых регистров. Обращение к этим регистрам организовано по принципу индексной адресации к портам ввода-вывода. Для этой цели используется два порта(регистра): -индексный регистр(регистр адреса) в него заносится номер регистра с которого мы хотим считать или в который хотим записать данные.Его адрес3D4(16c/c) . -регистр данных в него заносятся данные для записи в выбранный регистр или считываются данные из выбранного регистра. Его адрес 3D5(16c/c). Для доступа к портам используются команды Паскале - для записи в порт port[$3d4] :=a; -для чтения порта a:=port[$3d5; Для записи в регистры 0-7 необходимо снять защиту записи для этого в 11h регистре восьмой бит надо сбросить в нуль(т.е. записать в него 0). Исследуемые регистры позволяют изменять положение информации отображаемого кадра в видеопамяти, менять расстояние между знаковыми строками, менять положение курсора в кадре, выполнять построчную прокрутку изображение кадра, формировать независимые окна на экране и т.п. Написать программу для изменения содержимого заданной группы регистров и оценит их влияние на формирование изображения на экране монитора. Программу следует выполнять в среде виртуальной DOS BOX на соответствующем языке программирования.

Решение задачи: «Исследование возможностей управления формата кадра контроллера видеотерминала»

textual
Листинг программы
  1. Program REGS;
  2.  
  3. Uses CRT;
  4.  
  5. var
  6.   menyu, registr_e, registr_f, registr_5, zn: integer;
  7.  
  8. procedure PRegE;
  9. var
  10.  key: char;
  11. begin
  12.  clrscr;
  13.  port[$3d4]:=$e;
  14.  registr_e:=port[$3d5];
  15.  zn:=registr_e;
  16.  writeln;
  17.  writeln('  REGISTR Eh ');
  18.  writeln;
  19.  writeln('  Tekuschee znachenie registra Eh: ',registr_e);
  20.  writeln;
  21.  writeln(' Dlya izmeneniya znacheniya registra ispolzujte klavishi "vverh" i "vniz" ');
  22.  writeln('  Dlya vyhoda nazhmite "Enter".');
  23.  GotoXY(31,17);
  24.  write('Znachenie: ',zn,'   ');
  25.  repeat
  26.   key:=readkey;
  27.   case key of
  28.    #0:
  29.     begin
  30.      key:=ReadKey;
  31.      case key of
  32.       #72: zn:=zn+1;
  33.       #80: zn:=zn-1;
  34.      end;
  35.     end;
  36.   end;
  37.   GotoXY(31,17);
  38.   write(' Znachenie: ',zn,'   ');
  39.   port[$3d4]:=$e;
  40.   port[$3d5]:=zn;
  41.  until key=#13;
  42.  port[$3d4]:=$e;
  43.  port[$3d5]:=registr_e;
  44.  clrscr;
  45. end;
  46.  
  47. procedure PRegF;
  48. var
  49.  key: char;
  50. begin
  51.  clrscr;
  52.  port[$3d4]:=$f;
  53.  registr_f:=port[$3d5];
  54.  zn:=registr_f;
  55.  writeln;
  56.  writeln('  REGISTR Fh ');
  57.  writeln;
  58.  writeln('  Tekuschee znachenie registra Fh: ',registr_f);
  59.  writeln;
  60.  writeln(' Dlya izmeneniya znacheniya registra ispolzujte klavishi "vverh" i "vniz" ');
  61.  writeln('  Dlya vyhoda nazhmite "Enter".');
  62.  GotoXY(31,17);
  63.  write('  Znachenie registra: ',zn,'   ');
  64.  repeat
  65.   key:=readkey;
  66.   case key of
  67.    #0:
  68.     begin
  69.      key:=ReadKey;
  70.      case key of
  71.       #72: zn:=zn+1;
  72.       #80: zn:=zn-1;
  73.      end;
  74.     end;
  75.   end;
  76.   GotoXY(31,17);
  77.   write(' Znachenie registra: ',zn,'   ');
  78.   port[$3d4]:=$f;
  79.   port[$3d5]:=zn;
  80.  until key=#13;
  81.  port[$3d4]:=$f;
  82.  port[$3d5]:=registr_f;
  83.  clrscr;
  84. end;
  85.  
  86. procedure PReg5;
  87. var
  88.  key: char;
  89.  a,b : integer;
  90. begin
  91.  clrscr;
  92.  port[$3d4]:=$11;
  93.  b:=port[$3d5];
  94.  a:= b div 128;
  95.   b:=b-128;
  96.   port[$3d4]:=$11;
  97.   port[$3d5]:=b;
  98.  
  99.  port[$3d4]:=$5;
  100.  registr_5:=port[$3d5];
  101.  zn:=registr_5;
  102.  writeln;
  103.  writeln('  REGISTR 5h ');
  104.  writeln;
  105.  writeln('  Tekuschee znachenie registra 5h: ',registr_5);
  106.  writeln;
  107.  writeln(' Dlya izmeneniya znacheniya registra ispolzujte klavishi "vverh" i "vniz" ');
  108.  writeln('  Dlya vyhoda nazhmite "Enter".');
  109.  GotoXY(31,17);
  110.  write('  Znachenie registra: ',zn,'   ');
  111.  repeat
  112.   key:=readkey;
  113.   case key of
  114.    #0:
  115.     begin
  116.      key:=ReadKey;
  117.      case key of
  118.       #72: zn:=zn+1;
  119.       #80: zn:=zn-1;
  120.      end;
  121.     end;
  122.   end;
  123.   GotoXY(31,17);
  124.   write(' Znachenie registra: ',zn,'   ');
  125.   port[$3d4]:=$5;
  126.   port[$3d5]:=zn;
  127.  until key=#13;
  128.  port[$3d4]:=$5;
  129.  port[$3d5]:=registr_5;
  130.  clrscr;
  131. end;
  132.  
  133.  
  134. BEGIN
  135.  clrscr;
  136.  repeat
  137.   writeln('  Vvedite nomer registra i nazhmite Enter');
  138.   writeln('  1 - Registr Eh.');
  139.   writeln('  2 - Registr Dh.');
  140.   writeln('  3 - Registr 5h.');
  141.   writeln('  Dlya vyhoda nazhmite 0' );
  142.   readln(menyu);
  143.   case menyu of
  144.    1 : PRegE;
  145.    2 : PRegF;
  146.    3 : PReg5;
  147.    else writeln('Nevernyj vvod')
  148.   end
  149.  until menyu = 0;
  150.  
  151. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы