uses crt;
const seta:array[0..15,0..7] of word=(
( 0,999,999,999,999,999,999,999),
( 0, 0,999,999,999,999,999,999),
( 0, 15, 0,999,999,999,999,999),
( 0, 15, 15, 0,999,999,999,999),
( 0, 15, 15, 15, 0,999,999,999),
( 0, 15, 15, 0, 0,999,999,999),
( 0, 0, 15, 0,999,999,999,999),
( 0,999, 0, 15, 0 ,999,999,999),
(999,999, 0, 15, 0 ,999,999,999),
(999,999,999, 0, 15, 0,999,999),
(999,999,999, 0, 15, 0,999,999),
(999,999,999, 0, 0, 0,999,999),
(999,999,999,999,999,999,999,999),
(999,999,999,999,999,999,999,999),
(999,999,999,999,999,999,999,999),
(999,999,999,999,999,999,999,999)
);
var mode,m,n,xmax,ymax:word;
c:char;
buf:array[0..255] of byte;
sos,ooo:word;
bank:byte;
mx,my,mb:word;
mask:array[0..15,0..7] of byte;
oldseg,oldofs,oldmask:word;
newseg,newofs,newmask:word;
{$F+}
procedure SetPixel(X, Y : Word; C : word);
var z1,z2,q,w:longint;
b:word;
begin
if c<=255 then begin
z1:=y;z2:=xmax;
q:=z1*z2+x;
b:=q div 65536;
b:=b*bank;
asm
mov ax,$4f05
mov bx,0
mov dx,b
int $10
end;
if ((x<xmax) and (y<ymax)) then mem[$a000:q]:=c;end;
end;
function GetPixel(X, Y : Word):byte;
var z1,z2,q,w:longint;
b:word;
begin
z1:=y;z2:=xmax;
q:=z1*z2+x;
b:=q div 65536;
b:=b*bank;
asm
mov ax,$4f05
mov bx,0
mov dx,b
int $10
end;
getpixel:=mem[$a000:q];
end;
procedure newmouse(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP : word);interrupt;
var hx,hy,hb,ev:word;
hn,hm:integer;
begin
ev:=ax;
hx:=cx;
hy:=dx;
hb:=bx;
if ((hx<>mx) or (hy<>my)) then
begin
for hn:=0 to 15 do
for hm:=0 to 7 do
setpixel(mx+hm,my+hn,mask[hn,hm]);
for hn:=0 to 15 do
for hm:=0 to 7 do
mask[hn,hm]:=getpixel(hx+hm,hy+hn);
for hn:=0 to 15 do
for hm:=0 to 7 do
setpixel(hx+hm,hy+hn,seta[hn,hm]);
mx:=hx;
my:=hy;
end;
inline ($8B/ $E5/ $5D/ $07/ $1F/ $5F/ $5E/ $5A/ $59/$5B/ $58/
$CB);
end;
{$F-}
begin
mx:=0;
my:=0;
mode:=$101;
sos:=seg(buf);
ooo:=ofs(buf[0]);
asm
mov ax,$4f02
mov bx,mode
int $10
end;
asm
mov ax,$4f01
mov cx,mode
mov es,sos
mov di,ooo
int $10
end;
if memw[sos:ooo+4]=0 then memw[sos:ooo+4]:=1;
bank:=memw[sos:ooo+6] div memw[sos:ooo+4];
xmax:=memw[sos:ooo+$12];
ymax:=memw[sos:ooo+$14];
if xmax=0 then begin xmax:=320;ymax:=200;bank:=0;end;
for n:=0 to 200 do
for m:=0 to 200 do
setpixel(n,m,(n+m) div 2);
for n:=0 to 15 do
for m:=0 to 7 do
mask[n,m]:=getpixel(n,m);
newseg:=seg(newmouse);
newofs:=ofs(newmouse);
newmask:=1;
asm
mov ax,0
int $33
mov ax,1
int $33
mov ax,2
int $33
mov ax,8
mov cx,0
mov dx,ymax
int $33
mov ax,20
mov cx,newmask
mov es,newseg
mov dx,newofs
int $33
end;
repeat
until ((keypressed));
c:=readkey;
asm
mov ax,2
int $33
mov ax,20
mov cx,oldmask
mov es,oldseg
mov dx,oldofs
int $33
end;
asm
mov ax,3
int $10
end;
end.