4054

Написание программы для работы с видеопамятью

Лабораторная работа

Информатика, кибернетика и программирование

Постановка задачи Написать программу, которая будет работать с видеопамятью. Можно выполнить любое из приведенных ниже заданий. Независимо от конкретного задания программа должна работать резидентно. Текст, присутствовавший на экране до запуска п...

Русский

2012-11-12

73.5 KB

22 чел.

1. Постановка задачи

Написать программу, которая будет работать с видеопамятью. Можно выполнить любое из приведенных ниже заданий. Независимо от конкретного задания программа должна работать резидентно. Текст, присутствовавший на экране до запуска программы, не должен портиться никаким образом.

В программе следует использовать два обработчика прерываний – прерываний таймера и прерываний клавиатуры. Прерывания таймера регламентируют скорость перемещения объекта, причем параметр, характеризующий величину скорости, необходимо задавать с клавиатуры при запуске программы. Информация о параметре, задающем скорость движения, должна выводиться на экран при запуске программы без параметров.

В случае смещения строк на экране (нажатие клавиши ENTER) не должно происходить никаких нежелательных эффектов – раздвоения картинки, дублирования строк или их частей…

Вариант 5(1) «Свободное движение»:

Черный (или цветной) квадратик (или иной объект) «летает» по экрану, содержащему некоторый текст, и отражается от границ экрана. Движение продолжается до нажатия клавиши <Esc> или некоторой нестандартной комбинации клавиш.

 

2. Входные данные программы.

В качестве параметра командной строки в программу передаётся скорость движения объекта. Если программа запущена без параметров, то используется стандартное значение, установленное в программе.

3. Описание основных переменных и подпрограмм.

Константы.

Symbol – вид символов (Char), из которых состоит движущийся объект;

Color – цвет этих символов.

Переменные

Scr – массив для доступа к видеопамяти;

OldHandler, OldHandler2 – старые обработчики прерываний таймера и клавиатуры;

Speed – скорость движения объекта;

t – счётчик времени таймера;

X, Y – текущее положение объекта (координаты левого символа);

dx, dy – приращение значений для координат X, Y при движении объекта;

t1, t2 – символы экрана, закрытые движущимся объектом.

Процедуры.

Handler – обработчик прерываний таймера;

Handler2 – обработчик прерываний клавиатуры.

4. Алгоритм решения задачи

  1.  Проверка параметра командной строки и установка скорости движения объекта в соответствии с параметром (или его отсутствием).
  2.  Инициализация переменных начальными значениями.
  3.  Установка своих обработчиков прерываний таймера и клавиатуры.
  4.  Движение объекта с помощью обработчика прерываний таймера по истечении времени, зависящего от установленной скорости движения. При смещении объекта проверяется возможность сдвинуть объект при текущих значениях приращений dx, dy. Если это невозможно, то вычисляются новые значения приращений. После этого из t1 и t2 восстанавливаются символы, закрытые объектом, потом в t1 и t2 делаются копии символов с новыми координатами, и отображается сам объект на новом месте.
  5.  Обработчик прерываний клавиатуры проверяет, нажата ли клавиша «Ввод» в 25-й строке, и если нажата, то корректирует текущие координаты объекта и косвенно вызывает его смещение.

Движущийся объект представляет собой две жёлтые рядом расположенные звезды.

5. Исходный код программы.

program lab5;

{$M $1000, 0, 0}

{$R+ $S+}

uses

 Crt, Dos;

const

 Color = Yellow;

 Symbol = '*';

var

 Scr: Array[1..25, 1..80] of Record

   Symbol: Char;

   Attr: Byte

 end Absolute $B800:$0000;

 OldHandler, OldHandler2: Procedure;

 Speed, t: Word;

 dx, dy: Shortint;

 X, Y: Integer;

 t1, t2: Record

   Symbol: Char;

   Attr: Byte;

 end;

{$F+}

procedure Handler; Interrupt;

begin

 Inc(t);

 if t > 20 div Speed then begin

   t := 0;

   Scr[Y, X].Symbol := t1.Symbol;

   Scr[Y, X].Attr := t1.Attr;

   Scr[Y, X + 1].Symbol := t2.Symbol;

   Scr[Y, X + 1].Attr := t2.Attr;

   while (X + dx > 79) or (X + dx < 1) or (Y + dy > 25) or (Y + dy < 1) do begin

     case Random(4) of

       0: dx := -1;

       1: dx := 1;

       2: dx := 2;

       3: dx := -2;

     end;

     case Random(4) of

       0: dy := -1;

       1: dy := 1;

       2: dy := 2;

       3: dy := -2;

     end;

   end;

   X := X + dx;

   Y := Y + dy;

   t1.Symbol := Scr[Y, X].Symbol;

   t1.Attr := Scr[Y, X].Attr;

   t2.Symbol := Scr[Y, X + 1].Symbol;

   t2.Attr := Scr[Y, X + 1].Attr;

   Scr[Y, X].Symbol := Symbol;

   Scr[Y, X].Attr := Color;

   Scr[Y, X + 1].Symbol := Symbol;

   Scr[Y, X + 1].Attr := Color;

 end;

 Inline($9C);

 OldHandler;

end;

{$F-}

{$F+}

procedure Handler2; Interrupt;

begin

 if (Port[$60] = $1C) and (WhereY = 25) then begin

   Dec(Y);

   t := High(t);

 end;

 Inline($9C);

 OldHandler2;

end;

{$F-}

var

 i, C1, C2: Integer;

begin

 Val(ParamStr(1), Speed, C1);

 if ParamCount = 0 then

   Speed := 7

 else if (C1 <> 0) or (Speed < 1) or (Speed > 20) then begin

   WriteLn('Неправильно заданы параметры.');

   WriteLn('Должен быть один параметр - скорость движения объекта (1..20)');

   ReadKey;

   Halt;

 end;

 t := 0;

 dx := 0;

 dy := 1;

 X := 30;

 Y := 15;

 t1.Symbol := Scr[Y, X].Symbol;

 t1.Attr := Scr[Y, X].Attr;

 t2.Symbol := Scr[Y, X + 1].Symbol;

 t2.Attr := Scr[Y, X + 1].Attr;

 if WhereY = 25 then Dec(Y);

 Randomize;

 GetIntVec($9, @OldHandler2);

 SetIntVec($9, Addr(Handler2));

 GetIntVec($8, @OldHandler);

 SetIntVec($8, Addr(Handler));

 Keep(0);

end.

6. Результаты работы программы

м

7. Ответы на контрольные вопросы

  1.  Вопрос: Какова структура видеопамяти в текстовом режиме?

Ответ: Для представления одного знакоместа отводится два байта: первый байт хранит отображаемый символ, второй – его цветовые атрибуты. В итоге в текстовом режиме для хранения образа всего экрана используется 80252 = 4000 байт. Адрес начала видеопамяти в общем пространстве оперативной памяти компьютера равен $B800:$0000 для всех текстовых режимов (кроме режима Mono).

  1.  Вопрос: Как удобно организовать обращение к любой точке экрана?

Ответ: Описать как массив и использовать прямую адресацию:

var Scr: Array[1..25, 1..80] of Record

     Symbol: Char;

     Attr: Byte;

   end Absolute $B800:$0000;

Тогда к любой точке экрана можно обращаться как к элементу массива.

  1.  Вопрос: Каким образом можно изменить цвет выводимого символа? Цвет фона?

Ответ: Менять атрибуты. Цвет выводимого символа меняется через поле Attr, описанного выше массива, а для изменения цвета фона в массив нужно добавить ещё одно измерение.

  1.  Вопрос: Какие действия необходимо предпринять для восстановления прежнего состояния экрана после каких-то его изменений?

Ответ: Нужно заранее делать копию массива Scr (либо части этого массива, которую нужно потом восстановить), и потом из копии восстанавливать.


 

А также другие работы, которые могут Вас заинтересовать

81502. Алкаптонурия и альбинизм: биохимические дефекты, при которых они развиваются. Нарушение синтеза дофамина, паркинсонизм 403.53 KB
  Нарушение синтеза дофамина паркинсонизм. Заболевание развивается при недостаточности дофамина в чёрной субстанции мозга. Для лечения паркинсонизма предлагаются следующие принципы: заместительная терапия препаратамипредшественниками дофамина производными ДОФА леводопа мадопар наком и др. подавление инактивации дофамина ингибиторами МАО депренил ниаламид пиразидол и др.
81503. Декарбоксилирование аминокислот. Структура биогенных аминов (гистамин, серотонин, γ-аминомасляная кислота, катехоламины). Функции биогенных аминов 239.46 KB
  Процесс отщепления карбоксильной группы аминокислот в виде СО2 получил название декарбоксилирования. В живых организмах открыты 4 типа декарбоксилирования аминокислот. αДекарбоксилирование характерное для тканей животных при котором от аминокислот отщепляется карбоксильная группа стоящая по соседству с αуглеродным атомом.
81504. Дезаминирование и гидроксилирование биогеных аминов (как реакции обезвреживания этих соединений) 168.64 KB
  Инактивация биогенных аминов происходит двумя путями: 1 метилированием с участием SM под действием метилтрансфераз. Таким образом могут инактивироваться различные биогенные амины но чаще всего происходит инактивация гастамина и адреналина. Так инактивация адреналина происходит путём метилирования гидроксильной группы в ортоположении . Реакция инактивации гистамина также преимущественно происходит путём метилирования 2 окислением ферментами моноаминооксидазами МАО с коферментом FD таким путем.
81505. Нуклеиновые кислоты, химический состав, строение. Первичная структура ДНК и РНК, связи, формирующие первичную структуру 107.11 KB
  Первичная структура ДНК и РНК связи формирующие первичную структуру Нуклеи́новые кисло́ты высокомолекулярные органические соединения биополимеры полинуклеотиды образованные остатками нуклеотидов. Нуклеиновые кислоты ДНК и РНК присутствуют в клетках всех живых организмов и выполняют важнейшие функции по хранению передаче и реализации наследственной информации. Поскольку в нуклеотидах существует только два типа гетероциклических молекул рибоза и дезоксирибоза то и имеется лишь два вида нуклеиновых кислот дезоксирибонуклеиновая ДНК...
81506. Вторичная и третичная структура ДНК. Денатурация, ренативация ДНК. Гибридизация, видовые различия первичной структуры ДНК 108.02 KB
  Вторичная структура ДНК. В 1953 г. Дж. Уотсоном и Ф. Криком была предложена модель пространственной структуры ДНК. Согласно этой модели, молекула ДНК имеет форму спирали, образованную двумя полинуклеотидными цепями, закрученными относительно друг друга и вокруг общей оси. Двойная спираль правозакрученная, полинуклеотидньхе цепи в ней антипараллельны
81507. РНК, химический состав, уровни структурной организации. Типы РНК, функции. Строение рибосомы 124.71 KB
  Первичная структура РНК - порядок чередования рибонуклеозидмонофосфатов (НМФ) в полинуклеотидной цепи. В РНК, как и в ДНК, нук-леотиды связаны между собой 3,5-фосфодиэфирными связями. Концы полинуклеотидных цепей РНК неодинаковы. На одном конце находится фосфорилированная ОН-группа
81508. Строение хроматина и хромосомы 106.36 KB
  Основу хромосомы составляет линейная не замкнутая в кольцо макромолекула дезоксирибонуклеиновой кислоты ДНК значительной длины например в молекулах ДНК хромосом человека насчитывается от 50 до 245 миллионов пар азотистых оснований. В интерфазе хроматин не конденсирован но и в это время его нити представляют собой комплекс из ДНК и белков. Макромолекула ДНК обвивает октомеры структуры состоящую из восьми белковых глобул гистоновых белков H2 H2B H3 и H4 образуя структуры названные нуклеосомами. В ранней интерфазе фаза G1 основу...
81509. Распад нуклеиновых кислот. Нуклеазы пищеварительного тракта и тканей. Распад пуриновых нуклеотидов 207.42 KB
  Распад пуриновых нуклеотидов. Далее полинуклеотидная часть этих молекул гидролизуется в кишечнике до мононуклеотидов. В расщеплении нуклеиновых кислот принимают участие ДНКазы и РНКазы панкреатического сока которые будучи эндонуклеазами гидролизуют макромолекулы до олигонуклеотидов. Последние под действием фосфодиэстераз панкреатической железы расщепляются до смеси 3\' и 5\'мононуклеотидов.
81510. Представление о биосинтезе пуриновых нуклеотидов; начальные стадии биосинтеза (от рибозо-5-фосфата до 5-фосфорибозиламина) 183.42 KB
  Сборка пуринового гетероцикла осуществляется на остатке рибозо5фосфата при участии различных доноров углерода и азота: Фосфорибозилдифосфат ФРДФ или фосфорибозилпирофосфат ФРПФ занимает центральное место в синтезе как пуриновых так и пиримидиновых нуклеотидов Он образуется за счёт переноса βγпирофосфатного остатка АТФ на рибозо5фосфат в реакции катализируемой ФРДФсинтетазой. Источниками рибозо5фосфата могут быть: пентозофосфатный путь превращения глюкозы или катаболизм нуклеозидов в ходе которого под действием...