Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2012, 22:16   #1
Doctor_Che
Новичок
Джуниор
 
Регистрация: 30.01.2012
Сообщений: 1
По умолчанию Как устранить "порчу" экрана

Есть задание:
Написать программу, которая будет работать с видеопамятью. Программа должна работать резидентно. Текст, присутствовавший на экране до запуска программы, не должен портиться никаким образом.
В программе следует использовать два обработчика прерываний – прерываний таймера и прерываний клавиатуры. Прерывания таймера регламентируют скорость перемещения объекта.
В случае смещения строк на экране (нажатие клавиши ENTER) не должно происходить никаких нежелательных эффектов – раздвоения картинки, дублирования строк или их частей…
Вариант 5(1) «Свободное движение»:
Черный (или цветной) квадратик (или иной объект) «летает» по экрану, содержащему некоторый текст, и отражается от границ экрана. Движение продолжается до нажатия клавиши <Esc> или некоторой нестандартной комбинации клавиш.

Мой вариант в принципе работает, но при вводе какой-либо команды и нажатии ENTER появляются артифакты, происходит порча экрана.
Подскажите как избавиться от этой проказы.

Код:
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.
Doctor_Che вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Как устранить ошибку "socket error #10060" Evgen1976 Работа с сетью в Delphi 11 20.03.2009 15:21