Резидентная программа - 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.
Объяснение кода листинга программы
- {$M $2000, 0, 0} - объявляется резидентная программа, которая будет работать при запуске программы-host.
- Uses Crt, Dos; - подключаются необходимые библиотеки для работы с памятью и прерываниями.
- Var 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 - проверяется условие для начала игры.
- 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 - проверяется условие для продолжения игры.
- key:=0; - устанавливается флаг продолжения игры.
- end;
- If ((Port[$60] = $10) and (mem[$40:$17] and 1 = 1)) then - проверяется условие для выхода из игры.
- SetIntVec($9, @IntSave); - сохраняется текущий вектор прерываний.
- InLine($C9); - выполняется встроенная команда для перехода в режим прерываний.
- IntSave; - вызывается старый вектор прерываний.
- Halt; - останавливается выполнение программы.
- end;
- Randomize; - вызывается функция для генерации случайных чисел.
- GetIntVec($9, @IntSave); - загружается текущий вектор прерываний.
- SetIntVec($9, addr(KeyClick)); - устанавливается новый вектор прерываний.
- Keep(0); - остается программа в памяти.
- end.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д