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 (либо части этого массива, которую нужно потом восстановить), и потом из копии восстанавливать.


 

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

42052. Изучение принципа измерения температуры при помощи термометра сопротивления 128.5 KB
  Изучение принципа действия и конструкции термопреобразователей сопротивления и вторичных приборов работающих в комплекте с термопреобразователями сопротивления. Закрепление знаний по разделу Измерение температуры при помощи термометров сопротивления теоретического курса Технические измерения и приборы.1 Термопреобразователи сопротивления Измерение температуры термопреобразователями сопротивления основано на свойстве металлов и полупроводников изменять свое электрическое сопротивление с изменением температуры.
42053. Математические модели исследования операций. Задача линейного программирования 422.5 KB
  Цель работы изучить возможности табличного процессора MS Excel для решения задач линейного программирования ЛП. Технология компьютерной реализации прямой задачи ЛП Основным методом решения ЗЛП является симплексметод. Этот метод реализуется с помощью утилиты Поиск решения и решающего блока Solver в табличном процессоре MS Excel. Вызывается командой меню СервисПоиск решения при отсутствии утилиты необходимо вызвать пункт меню Надстройки и в предложенном списке дополнительных модулей выбрать Поиск решения.
42054. Информационные технологии при решении целочисленной задачи линейного программирования 231.5 KB
  Информационные технологии при решении целочисленной задачи линейного программирования Цель работы изучить возможности табличного процессора MS Excel для решения задач целочисленного линейного программирования ЦЛП. Задача целочисленного линейного программирования Задачи оптимизации в результате решения которых искомые значения переменных должны быть целыми числами называются задачами моделями целочисленного дискретного программирования: Если то задачу называют полностью целочисленной; если же то имеем частично целочисленную...
42055. Технологии заправки воздушного судна специальными газами 2.68 MB
  Для этих целей предусмотрены как прицепные так и самоходные газозарядные станции для пополнения запасов специальных газов в бортовых система ВС. Пример простейшей прицепной газозарядной станции содержащей на тележке два баллона и компрессорную станцию показан на рис. Заправка бортовых систем ВС медицинским кислородом является самым сложной и опасной технологической операцией поэтому рассмотрим наиболее общий случай и конструкцию самоходной автомобильной кислородозарядной станции. Назначение конструкция и работа станции Автомобильная...
42056. Технологии заправки воздушного судна специальными жидкостями. Технические характеристики ЗСЖ-66 4.26 MB
  Технологии заправки воздушного судна специальными жидкостями Цель работы: изучить технологическое оборудование и особенности технологии его применения для заправки бортовых систем ВС специальными жидкостями Краткие теоретические сведения 1. Назначение конструкция и работа ЗСЖ66 Заправщик специальными жидкостями ЗСЖ66 предназначенный для заправки ВС синтетическими и минеральными маслами маслосмесями пусковым топливом бензином гидросмесями. В отсеках левого борта размещено оборудование систем заправки жидкостью для гидросистем и пусковым...
42057. Воздушный запуск авиационных двигателей 492 KB
  Воздушный запуск авиационных двигателей Цель работы ознакомление с оборудованием предназначенным для воздушного запуска авиационных двигателей. Короткие теоретические сведения Для воздушного запуска газотурбинного двигателя без работы вспомогательной силовой установки ВСУ применяются специальные самоходные или прицепные Установки Воздушного Запуска УВЗ. Они доставляют сжатый непрерывный поток воздуха к штуцеру воздушного запуска для привода колеса турбины воздушного стартера размещенного на каждом реактивном двигателе который...
42058. Электро-стартерный запуск авиационных двигателей 710 KB
  Это экономит топливо потребляемое маршевыми реактивными двигателями и вспомогательной силовой установкой и заряд бортовых аккумуляторов ВС. Когда агрегат используется для запуска двигателя напряжение в разъеме не должно быть меньше чем 20 V. Аэродромный подвижной агрегат смонтированный на автоприцепе Специальное оборудование Аэродромного Подвижного Агрегата состоит из генератора приводимого дизельным двигателем который размещен в кожухе системы обеспечения двигателя панель управления панель реле бункер для складывания кабелей....