Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как устранить "порчу" экрана? работа с видеопамятью 
:(
    Опции темы
DoctorChe
Дата 30.1.2012, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 15.11.2011

Репутация: нет
Всего: нет



Есть задание:
 Написать программу, которая будет работать с видеопамятью. Программа должна работать резидентно. Текст, присутствовавший на экране до запуска программы, не должен портиться никаким образом.
 В программе следует использовать два обработчика прерываний – прерываний таймера и прерываний клавиатуры. Прерывания таймера регламентируют скорость перемещения объекта.
В случае смещения строк на экране (нажатие клавиши 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.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0374 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.