program AsmAndPas;
uses
crt;
var
ScanCode : byte;
shoot,left,right:boolean;
begin
clrscr;
repeat
asm
int 9h {???}
in al,60h
mov ScanCode,al
end;
case ScanCode of
28 : shoot:=true;
156 : shoot:=false;
30 : left:=true;
158 : left:=false;
32 : right:=true;
160 : right:=false;
end;
writeln(left);
writeln(shoot);
writeln(right);
until ScanCode=1;
writeln('End');
readln;
end.
program q105873;
{&A-}
Var
b,c:word;
d:char;
e,f:^word;{указатели на переменную WORD}
{перевод числа в 16-ю систему}
function g(a:word):string;
var
b,c:integer;
d:string;
begin
d:='';
for b:=0 to 3 do
begin
c:=a mod 16;
if c>9 then c:=c+39;
d:=chr(c+48)+d;
a:=a div 16;
end;
g:=d;
end;
{наш обработчик}
procedure myInterrupt;
interrupt;
var
h:^byte;
d:byte;
begin
{прерывание INT3- один байт и без параметров, запускаем старый обработчик}
InLine($cc);
{получаем адрес начала и конца буфура клавиатуры}
e:=ptr($40,$1a);
f:=ptr($40,$1c);
if e^<>f^ then
begin
{получаем состояние клавиатуры}
h:=ptr($40,$17);
d:=h^;
{отделяем нажатие клавиши CTRL}
d:=d mod 16;
d:=d div 4;
if d >0 then
begin
{получаем нажатую клавишу}
c:=e^;
h:=ptr($40,c);
d:=h^;
{нажата клавиша "А"}
if d=1 then
begin
writeln;
{перебираем все прерывания}
for b:=0 to 255 do
begin
e:=ptr(0,4*b);
f:=ptr(0,4*b+2);
if(e^<>0)and(f^<>0)then
write(' ',g(b),':=',g(f^),':',g(e^));
end;
{записываем перевод строки}
h^:=3;{команда перевода строки: ^C будет всегда в конце вывода}
end;
end;
end;
end;
Begin
{для процедуры Keep(), запоминаем сегмент стека и сегмент PSP}
inline($1e/$16);
{перебираем все прерывания}
for b:=0 to 255 do
begin
{получаем смещение}
f:=ptr(0,(b*4));
{получаем сегмент}
e:=ptr(0,(b*4+2));
if (e^<>0)and(f^<>0)then
write(' ',g(b),':=',g(e^),':',g(f^));
end;
{GetIntVec(09)}
{получаем обработчик клавиатуры}
f:=ptr(0,36);
b:=f^;
{segment}
f:=ptr(0,38);
c:=f^;
{SetIntVec(03)}
{записываем старый обработчик на место прерывания INT3}
f:=ptr(0,12);
f^:=b;
{segment}
f:=ptr(0,14);
f^:=c;
{SetIntVec(09)}
{записываем смещение нашего обработчика}
c:=ofs(myInterrupt);
f:=ptr(0,36);
f^:=c;
{и сегмент}
c:=CSeg;
f:=ptr(0,38);
f^:=c;
{аналог процедуры Keep(),
но сделанный с помощью прерывания int 27
команды:
5A pop dx
58 pop ax
2B D0 sub dx,ax
C1 E2 04 shl dx,4
81 C2 4000 add dx,4000h
CD 27 int 27h
и места меньше занимает}
inline($5a/$58/$2b/$d0/$c1/$e2/$04/$81/$c2/0/$40/$cd/$27);
end.
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.