Резидентная программа - Turbo Pascal

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

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

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

Решение задачи: «Резидентная программа»

textual
Листинг программы
{$M $2000, 0, 0 }   { 8 кб стек, без кучи }
Uses Crt, Dos;
Var  IntSave : procedure;
     x, y, AtrSim, sAtrSim: longint;
     key: byte;
 
{$F+}
{$R-}
Procedure KeyClick; Interrupt;
begin
     If ((Port[$60] = $22) and (mem[$40:$17] and 1 = 1)) or (key=1) then
     begin             { G + Shift }
          x:=Random(80);            { столбец* }
          y:=Random(25);                                   { строка* }
          AtrSim:=MemW[$B800:(y-1)*160+(x-1)*2];
          sAtrSim:=AtrSim;
          AtrSim:=(AtrSim and $FF00) or $20;       { заменим на пробел}
          MemW[$B800:(y-1)*160+(x-1)*2]:=AtrSim;   { и сотрем }
          inc(y);   { на сроку вниз }
          MemW[$B800:(y-1)*160+(x-1)*2]:=sAtrSim;
          key:=1;
     end;
 
     If ((Port[$60] = $21) and (mem[$40:$17] and 1 = 1)) or (key=0) then
     begin          { F + Shift }        { оставляем в памяти дальше }
          key:=0;
     end;
 
     If ((Port[$60] = $10) and (mem[$40:$17] and 1 = 1)) then
     begin         { Q + Shift }
          SetIntVec($9, @IntSave);
          InLine($C9);
          IntSave;   { старый вектор }
          Halt;      { снимаем резидент }
     end;
 
     InLine($9C); { запоминаем флаги в стеке }
 
     { Вызываем старый вектор }
     IntSave;
end;
{$R+}
{$F-}
 
begin
     Randomize;
     
     { сохраняем старый вектор }
     GetIntVec($9, @IntSave);
 
     { устанавливаем новый }
     SetIntVec($9, addr(KeyClick));
 
     { оставляем программу в памяти }
     Keep(0);
end.

Объяснение кода листинга программы

  1. {$M $2000, 0, 0} - объявляется резидентная программа, которая будет работать при запуске программы-host.
  2. Uses Crt, Dos; - подключаются необходимые библиотеки для работы с памятью и прерываниями.
  3. Var x, y, AtrSim, sAtrSim: longint; key: byte; - объявляются переменные для работы с игрой.
  4. {$F+} - включается режим отладки.
  5. {$R-} - выключается режим отладки.
  6. Procedure KeyClick; Interrupt; - объявляется процедура, которая будет вызываться при нажатии клавиши.
  7. begin - начинается выполнение программы.
  8. If ((Port[$60] = $22) and (mem[$40:$17] and 1 = 1)) or (key=1) then - проверяется условие для начала игры.
  9. x:=Random(80); - генерируется случайное число для определения столбца.
  10. y:=Random(25); - генерируется случайное число для определения строки.
  11. AtrSim:=MemW[$B800:(y-1)160+(x-1)2]; - загружается значение атрибута из памяти.
  12. sAtrSim:=AtrSim; - сохраняется копия значения атрибута.
  13. AtrSim:=(AtrSim and $FF00) or $20; - изменяется значение атрибута.
  14. MemW[$B800:(y-1)160+(x-1)2]:=AtrSim; - обновляется значение атрибута в памяти.
  15. inc(y); - увеличивается значение счетчика строки.
  16. MemW[$B800:(y-1)160+(x-1)2]:=sAtrSim; - обновляется значение атрибута в памяти.
  17. key:=1; - устанавливается флаг начала игры.
  18. end;
  19. If ((Port[$60] = $21) and (mem[$40:$17] and 1 = 1)) or (key=0) then - проверяется условие для продолжения игры.
  20. key:=0; - устанавливается флаг продолжения игры.
  21. end;
  22. If ((Port[$60] = $10) and (mem[$40:$17] and 1 = 1)) then - проверяется условие для выхода из игры.
  23. SetIntVec($9, @IntSave); - сохраняется текущий вектор прерываний.
  24. InLine($C9); - выполняется встроенная команда для перехода в режим прерываний.
  25. IntSave; - вызывается старый вектор прерываний.
  26. Halt; - останавливается выполнение программы.
  27. end;
  28. Randomize; - вызывается функция для генерации случайных чисел.
  29. GetIntVec($9, @IntSave); - загружается текущий вектор прерываний.
  30. SetIntVec($9, addr(KeyClick)); - устанавливается новый вектор прерываний.
  31. Keep(0); - остается программа в памяти.
  32. end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.625 из 5
Похожие ответы