Posted By: Jovo (Jovo) on 'CZprogram'
Title: Mys
Date: Fri May 30 10:04:39 1997
Hmmm,
mouska se neda v SVGA jen tak jednoduse pripojit. Tohle jsem nasel v PCGPE a
vyzkousel. Jako kurzor to ma jen jeden bod. Reseni : udelej si malinkou
bitmapku do ni si nakresli sipecku a pri pohybu mousky vem oblast pod ni,
schovej ji, XORni (nebo co budes chtit) to bitmapou mousky a pri dalsim
pohybu tam vrat puvodni - pekne, ze :) ?
Optimalizace necham na tobe. So here it goes :
program PC_GPE_MOUSE;
Uses Crt, Dos,graph;
{$F+}
const COM1INTR = $0C;
COM1PORT = $3F8;
var bytenum : word;
combytes : array[0..2] of byte;
x, y : longint;
button1, button2 : boolean;
MouseHandler : procedure;
var
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
mx,my:integer;
procedure MyMouseHandler; Interrupt;
var dx, dy : integer;
var inbyte : byte;
begin
{ Get the port byte }
inbyte := Port[COM1PORT];
{ Make sure we are properly "synched" }
if (inbyte and 64) = 64 then bytenum := 0;
{ Store the byte and adjust bytenum }
combytes[bytenum] := inbyte;
inc(bytenum);
{ Have we received all 3 bytes? }
if bytenum = 3 then
begin
{ Yes, so process them }
dx := (combytes[0] and 3) shl 6 + combytes[1];
dy := (combytes[0] and 12) shl 4 + combytes[2];
if dx >= 128 then dx := dx - 256;
if dy >= 128 then dy := dy - 256;
x := x + dx;
y := y + dy;
button1 := (combytes[0] And 32) <> 0;
button2 := (combytes[0] And 16) <> 0;
{ And start on first byte again }
bytenum := 0;
end;
if x>mx then x:=mx;
if y>my then y:=my;
if x<00 then x:=00;
if y<00 then y:=00;
{ Acknowledge the interrupt }
Port[$20] := $20;
end;
procedure InitMyDriver;
begin
{ Initialize the normal mouse handler }
asm
mov ax, 0
int $33
end;
{ Initialize some of the variables we'll be using }
bytenum := 0;
x := 0;
y := 0;
button1 := false;
button2 := false;
{ Save the current mouse handler and set up our own }
GetIntVec(COM1INTR, @MouseHandler);
SetIntVec(COM1INTR, Addr(MyMouseHandler));
end;
procedure CleanUpMyDriver;
begin
SetIntVec(COM1INTR, @MouseHandler);
end;
procedure mouse;
var ox,oy:integer;
begin
InitMyDriver;
while not keypressed do
begin;
putpixel(ox,oy,black);
ox:=x;oy:=y;
putpixel(x,y,yellow);
end;
CleanUpMyDriver;
end;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'c:bpbgi');
ErrCode := GraphResult;
if ErrCode = grOk then
begin { Ulat jakou grafiku }
mx:=getmaxx;
my:=getmaxy;
mouse;
end
else
Writeln('Chyba grafiky: ', GraphErrorMsg(ErrCode));
end.
---------------------------------------------------------------------------
Tak si to uzij ve zdravi.
Jovo.