graphic mouse
Having a mouse in the graphic mode under DOS was quite an achievement then.
Using the mouse
PROGRAM Graftest;
USES Graph,OPCrt,OPString,GInit,..,LMouse;
VAR tw:WORD;
ok:BOOLEAN;
MStat :WORD;
BStat :INTEGER;
NrOfButtons :WORD;
xm,ym :INTEGER;
BEGIN
Switchtograf;
InitMouse(MStat,NrOfButtons);
SetCursorPos(320,240);
DefineGraphicCursor(CrossCursor);
SetGraphicCursor(GCursor);
SetMickeysPerPixel(7,7);
MouseLow.ShowCursor;
...
REPEAT
GetPosBut(BStat,xm,ym);
IF (BStat<>0) THEN
BEGIN
M.LeftClick(xm,ym,ok,tw);
...
END;
UNTIL (BStat=4)or keypressed;
Switchtotext;
END.
intializing the graphic
{
GInit - initializes the graphic
Created : ..
Last Update : ..
Is updated version of : ..
}
{.$D-,L-}
UNIT GInit;
INTERFACE
TYPE BGIInitAs=(bgiDrv,bgiFnt,bgiDrvFnt);
PROCEDURE Error(s:STRING);
PROCEDURE Frame(x1,y1,x2,y2:INTEGER;Color:BYTE);
PROCEDURE SwitchToGraf(B:BGIInitAs);
PROCEDURE SwitchToText;
VAR
ScrMaxX,ScrMaxY:INTEGER; { resolution in graphic - set here at init }
IMPLEMENTATION
USES Graph,BGIDriv,BGIFont,BGIFont2,opcrt;
{----------------------------------------------------------------}
PROCEDURE Frame(x1,y1,x2,y2:INTEGER;Color:BYTE);
BEGIN
SetColor(color);
Line(x1,y1,x2,y1);
Line(x2,y1,x2,y2);
Line(x2,y2,x1,y2);
Line(x1,y2,x1,y1);
END;
{----------------------------------------------------------------}
PROCEDURE Error(s:STRING);
BEGIN
SetColor(15);
OutTextXY(0,470,s);
REPEAT UNTIL KeyPressed;
Halt;
END;
{----------------------------------------------------------------}
PROCEDURE SwitchToGraf(B:BGIInitAs);
VAR GraphDriver,GraphMode,ge:INTEGER;
VESA16 : Integer; { Driver number of 16 color driver }
type
VgaInfoBlock = record
VESASignature: array[0..3] of Byte;
VESAVersion: Word;
OEMStringPtr: Pointer;
Capabilities: array[0..3] of Byte;
VideoModePtr: Pointer;
end;
const { $0102 = 800*600, $0104 = 1024*768, $0106 = 1280*1024 }
VESA16Modes: array[0..2{2}] of Word =($0102, $0104, $0106);
{ Scan the supported mode table for the highest mode this card
will provide
}
function GetHighestCap(Table: Pointer; Modes: Word; Size: Integer): Integer;
near; assembler;
asm
XOR AX,AX
LES DI, Table { ES.DI:=Table }
@@1:
MOV SI, Modes { SI:=Modes }
ADD SI, Size
ADD SI, Size { SI:=Modes+2*Size }
MOV BX, ES:[DI] { BX:= [Table]+2*n }
CMP BX, 0FFFFH
JE @@4 { goto end if (BX=(-1) }
INC DI
INC DI { DI:=DI+2 }
MOV CX,Size { CX:=Size }
@@2:
CMP BX,[SI]
JZ @@3
DEC SI { BX<>SI : }
DEC SI { SI:=SI-2 }
LOOP @@2
@@3: { ! BX=SI }
CMP AX,CX
JA @@1
MOV AX,CX
JMP @@1
@@4:
end;
{$IFDEF DPMI}
type
TRealRegs = record
RealEDI: Longint;
RealESI: Longint;
RealEBP: Longint;
Reserved: Longint;
RealEBX: Longint;
RealEDX: Longint;
RealECX: Longint;
RealEAX: Longint;
RealFlags: Word;
RealES: Word;
RealDS: Word;
RealFS: Word;
RealGS: Word;
RealIP: Word;
RealCS: Word;
RealSP: Word;
RealSS: Word;
end;
function DetectVesa16: Integer; far; assembler;
var
Segment, Selector, VesaCap: Word;
asm
{$IFOPT G+}
PUSH 0000H
PUSH 0100H
{$ELSE}
XOR AX,AX
PUSH AX
INC AH
PUSH AX
{$ENDIF}
CALL GlobalDosAlloc
MOV Segment,DX
MOV Selector,AX
MOV DI,OFFSET RealModeRegs
MOV WORD PTR [DI].TRealRegs.RealSP, 0
MOV WORD PTR [DI].TRealRegs.RealSS, 0
MOV WORD PTR [DI].TRealRegs.RealEAX, 4F00H
MOV WORD PTR [DI].TRealRegs.RealES, DX
MOV WORD PTR [DI].TRealRegs.RealEDI, 0
MOV AX,DS
MOV ES,AX
MOV AX,0300H
MOV BX,0010H
XOR CX,CX
INT 31H
MOV DI,OFFSET RealModeRegs
MOV AX,grError
PUSH AX
CMP WORD PTR [DI].TRealRegs.RealEAX,004FH
JNZ @@Exit
POP AX
MOV ES,Selector
XOR DI,DI
CMP ES:[DI].VgaInfoBlock.VESASignature.Word[0], 'EV'
JNZ @@Exit
CMP ES:[DI].VgaInfoBlock.VESASignature.Word[2], 'AS'
JNZ @@Exit
MOV AX,0000
MOV CX,1
INT 31H
MOV VesaCap,AX
MOV DX,ES:[DI].VgaInfoBlock.VideoModePtr.Word[2]
MOV CX,4
XOR AX,AX
@@Convert:
SHL DX,1
RCL AX,1
LOOP @@Convert
ADD DX,ES:[DI].VgaInfoBlock.VideoModePtr.Word[0]
ADC AX,0
MOV CX,AX
MOV BX,VesaCap
MOV AX,0007H
INT 31H
INC AX
XOR CX,CX
MOV DX,0FFFFH
INT 31H
MOV ES,BX
PUSH ES
PUSH DI
{$IFOPT G+}
PUSH OFFSET Vesa16Modes
PUSH 0003H
{$ELSE}
MOV SI, OFFSET Vesa16Modes
PUSH SI
MOV AX, 5
PUSH AX
{$ENDIF}
CALL GetHighestCap
PUSH AX
MOV BX,VesaCap
MOV AX,0001H
INT 31H
@@Exit:
PUSH Selector
CALL GlobalDosFree
POP AX
end;
{$ELSE}
function DetectVesa16: Integer; far; assembler;
var
VesaInfo: array[0..255] of Byte;
asm
MOV AX,SS
MOV ES,AX { ES:=SS }
LEA DI,VesaInfo { ES.DI :=@VESAINFO }
MOV AX,4F00H
INT 10H { Get SuperVESA Info }
CMP AX,004FH
MOV AX,grError
JNZ @@Exit
CMP ES:[DI].VgaInfoBlock.VESASignature.Word[0], 'EV'
JNZ @@Exit
CMP ES:[DI].VgaInfoBlock.VESASignature.Word[2], 'AS'
JNZ @@Exit
LES DI,ES:[DI].VgaInfoBlock.VideoModePtr
PUSH ES { Push VideoModePtr }
PUSH DI
MOV AX, OFFSET Vesa16Modes { push vesa16 modes }
PUSH AX
MOV AX,3 { push 3 }
PUSH AX
CALL GetHighestCap { param : videoptr,modes,3 }
@@Exit:
end;
{$ENDIF}
procedure Abort(Msg : string);
begin
Writeln(Msg, ': ', GraphErrorMsg(GraphResult));
Halt(1);
end;
BEGIN { main }
DirectVideo := False;
IF (B=bgiDrv)OR(B=bgiDrvFnt) THEN
BEGIN
if RegisterBGIdriver(@EGAVGADriverProc) < 0 then
Abort('EGA/VGA');
if RegisterBGIdriver(@HercDriverProc) < 0 then
Abort('Herc');
if RegisterBGIdriver(@ATTDriverProc) < 0 then
Abort('AT&T');
{ VESA16 := InstallUserDriver('VESA16',@DetectVESA16);
if RegisterBGIdriver(@VESA16DriverProc) < 0 then Abort('VESA16'); }
END;
IF (B=bgiFnt)OR(B=bgiDrvFnt) THEN
BEGIN
{ Register all the fonts }
if RegisterBGIfont(@GothicFontProc) < 0 then Abort('Gothic');
if RegisterBGIfont(@SansSerifFontProc) < 0 then Abort('SansSerif');
if RegisterBGIfont(@SmallFontProc) < 0 then Abort('Small');
if RegisterBGIfont(@TriplexFontProc) < 0 then Abort('Triplex');
if RegisterBGIfont(@ScriptFontProc) < 0 then Abort('Script');
if RegisterBGIfont(@SimplexFontProc) < 0 then Abort('Simplex');
if RegisterBGIfont(@TriplexScriptFontProc) < 0 then Abort('TriplexScript');
if RegisterBGIfont(@ComplexFontProc) < 0 then Abort('Complex');
if RegisterBGIfont(@EuropeanFontProc) < 0 then Abort('European');
if RegisterBGIfont(@BoldFontProc) < 0 then Abort('Bold');
END;
GraphDriver:=Detect;
GraphMode:=2;
InitGraph(GraphDriver,GraphMode,'');
ge:=GraphResult;
IF (ge<>grOk) THEN ;
ScrMaxX:=GetMaxX;
ScrMaxY:=GetMaxY;
END;
{----------------------------------------------------------------}
PROCEDURE SwitchToText;
BEGIN
CloseGraph;
END;
{----------------------------------------------------------------}
{BEGIN} { autoinit of this unit}
END. { unit }
The mousedriver interface
it uses the standard interrupts to communicate with the installed driver
{ LMouse - Logimouse Interface
---------------------------------------------------
This Interface adapts to the logimouse,
it's from the Mouse Programmers ToolKit V1.0 Aug.89
---------------------------------------------------
TestProg is LMOUSETS
---------------------------------------------------
Created :Sept/93
Last Update :
Is updated version of :GMOUSE
---------------------------------------------------
}
{$D-,L-}
UNIT LMouse;
INTERFACE
CONST
MouseMove =$0001;
MouseLeftPress =$0002;
MouseLeftReleas =$0004;
TYPE
MouseCursor = (arrowcursor,crosscursor,clockcursor,handcursor);
GraphicCursor = record
screenMask,cursorMask: ARRAY [0..15] OF Word;
hotX, hotY: Integer;
END;
PROCEDURE DefineGraphicCursor(mode :Mousecursor);
FUNCTION InitMouse:BOOLEAN; { call 0 }
PROCEDURE ShowCursor; { call 1 }
PROCEDURE HideCursor; { call 2 }
PROCEDURE GetPosBut(VAR buttons,x,y:WORD); { call 3 }
PROCEDURE SetCursorPos(mx, my:WORD); { call 4 }
PROCEDURE GetButPres(button: WORD; { call 5 }
VAR buttonStatus, buttonPressCount,
mx, my: WORD);
PROCEDURE GetButRel(button: Integer; { call 6 }
VAR buttonStatus: Integer;
VAR buttonReleaseCount: Integer;
VAR mx ,my: Integer);
PROCEDURE SetHorizontalLimits(minPos, maxPos: WORD); { call 7 }
PROCEDURE SetVerticalLimits(minPos, maxPos: WORD); { call 8 }
PROCEDURE SetGraphicCursor(VAR cursor: GraphicCursor); { call 9 }
PROCEDURE SetTextCursor(selectedCursor, { call 10 }
screenMaskORscanStart,
cursorMaskORscanStop: Integer);
PROCEDURE ReadMotionCounters(VAR mx, { call 11 }
my:Integer);
PROCEDURE SetEventHandler(p:POINTER;M:WORD); { call 12 }
PROCEDURE LightPenOn; { call 13 }
PROCEDURE LightPenOff; { call 14 }
PROCEDURE SetMickeysPerPixel(horPix,verPix: WORD); { call 15 }
PROCEDURE ConditionalOff(left,top,right,bottom: WORD); { call 16 }
PROCEDURE SetSpeedThreshold(threshold: Integer); { call 19 }
PROCEDURE ExchangeEventHandlers(VAR P:POINTER;VAR M:WORD); { call 20 }
PROCEDURE GetDriverStateStorageSize(VAR Z:WORD); { call 21 }
PROCEDURE SaveDriverState(p:POINTER); { call 22 }
PROCEDURE RestoreDriverState(VAR p:POINTER); { call 23 }
FUNCTION SetAlternateHandler(p:POINTER;M:WORD):BOOLEAN; { call 24 }
FUNCTION GetAlternateHandler(VAR p:POINTER;VAR M:WORD):BOOLEAN; { call 25 }
PROCEDURE SetCRTPage(n:WORD); { call 29 }
PROCEDURE GetCRTPage(VAR n:WORD); { call 30 }
VAR
MouseStatus :WORD;
ButtonStatus:WORD;
NrOfButtons :WORD;
gcursor :graphiccursor;
IMPLEMENTATION
USES DOS;
FUNCTION initmouse:BOOLEAN; { call 0 }
Var regSet : registers;
BEGIN
regSet.AX := 0; intr (51,regSet); mouseStatus := regSet.AX;
nrOfButtons := regSet.BX;
IF (regSet.AX=$FFFF) THEN initmouse:=TRUE ELSE initmouse:=FALSE;
END;
PROCEDURE ShowCursor; { call 1 }
BEGIN
ASM
mov ax,1
int 51
END;
END;
PROCEDURE HideCursor; { call 2 }
BEGIN
ASM
mov ax,2
int 51
END;
END;
PROCEDURE GetPosBut(VAR buttons,x,y:WORD); { call 3 }
Var regSet : registers; { call 3 }
BEGIN
regSet.AX := 3; intr (51,regSet); x := regSet.CX; y := regSet.DX;
buttons := regSet.BX
END;
PROCEDURE SetCursorPos(mx,my:WORD); { call 4 }
Var regSet : registers;
BEGIN
regSet.AX := 4; regSet.CX := mx; regSet.DX := my; intr (51, regSet);
END;
PROCEDURE GetButPres(button: WORD;VAR buttonStatus, buttonPressCount,
mx, my: WORD); { call 5 }
VAR regSet : registers;
BEGIN
regSet.AX := 5; regSet.BX := button; intr (51, regSet);
buttonStatus := regSet.AX; buttonPressCount := regSet.BX;
mx:=regSet.CX; my:= regSet.DX;
END;
PROCEDURE GetButRel(button: Integer;
VAR buttonStatus: Integer;
VAR buttonReleaseCount: Integer;
VAR mx ,my: Integer); { call 6 }
Var regSet : registers;
BEGIN
regSet.AX := 6; regSet.BX := button; intr (51, regSet);
buttonStatus := regSet.AX; buttonReleaseCount := regSet.BX;
mx := regSet.CX; my:= regSet.DX;
END;
PROCEDURE SetHorizontalLimits(minPos, maxPos: WORD); { call 7 }
Var regSet : registers;
BEGIN
regSet.AX:=7; regSet.CX:=minPos; regSet.DX:=maxPos; intr(51,regSet);
END;
PROCEDURE SetVerticalLimits(minPos, maxPos: WORD); { call 8 }
Var regSet : registers;
BEGIN
regSet.AX:=8; regSet.CX:=minPos; regSet.DX:=maxPos; intr(51,regSet);
END;
PROCEDURE SetGraphicCursor(VAR cursor: GraphicCursor); { call 9 }
Var regSet : registers;
BEGIN
regSet.AX := 9; regSet.DX := Ofs (cursor.screenMask);
regSet.ES := Dseg; regSet.BX := cursor.hotX; regSet.CX := cursor.hotY;
intr (51, regSet);
END;
PROCEDURE SetTextCursor(selectedCursor,
screenMaskORscanStart,
cursorMaskORscanStop: Integer); { call 10 }
Var regSet : registers;
BEGIN
regSet.AX := 10; regSet.BX := selectedCursor;
regSet.CX := screenMaskORscanStart; regSet.DX := cursorMaskORscanStop;
intr (51, regSet);
END;
PROCEDURE ReadMotionCounters(VAR mx,my:Integer); { call 11 }
Var regSet : registers;
BEGIN
regSet.AX := 11; intr (51, regSet); mx:=regSet.CX; my:=regSet.DX;
END;
PROCEDURE SetEventHandler(P:POINTER;M:WORD); { call 12 }
Var regSet : registers;
K:ARRAY[1..2]OF WORD ABSOLUTE P;
BEGIN
regSet.AX := 12; regSet.CX :=M; regSet.ES := K[2];
regSet.DX := k[1]; intr (51, regSet);
END;
PROCEDURE LightPenOn; { call 13 }
Var regSet : registers;
BEGIN
regSet.AX := 13; intr (51, regSet);
END;
PROCEDURE LightPenOff; { call 14 }
Var regSet : registers;
BEGIN
regSet.AX := 14; intr (51, regSet);
END;
PROCEDURE SetMickeysPerPixel(horPix, verPix: WORD); { cll 15 }
Var regSet : registers;
BEGIN
regSet.AX:=15; regSet.CX:=horPix; regSet.DX:=verPix; intr(51,regSet);
END;
PROCEDURE ConditionalOff(left, top, right, bottom: WORD); { call 16 }
Var regSet : registers;
BEGIN
regSet.AX := 16; regSet.CX := left; regSet.DX := top;
regSet.SI := right; regSet.DI := bottom; intr (51, regSet);
END;
PROCEDURE SetSpeedThreshold(threshold: Integer); { call 19 }
Var regSet : registers;
BEGIN
regSet.AX := 19; regSet.DX := threshold; intr (51, regSet);
END;
PROCEDURE ExchangeEventHandlers(VAR P:POINTER;VAR M:WORD); { call 20 }
Var regSet : registers;
K:ARRAY[1..2]OF WORD ABSOLUTE P;
BEGIN
regset.ax:=20; regset.cx:=m; regset.es:=k[2]; regset.dx:=k[1];
intr(51,regset); m:=regset.cx; k[2]:=regset.es; k[1]:=regset.dx;
END;
PROCEDURE GetDriverStateStorageSize(VAR Z:WORD); { call 21 }
Var regSet : registers;
BEGIN
regset.ax:=21; intr(51,regset); z:=regset.bx;
END;
PROCEDURE SaveDriverState(p:POINTER); { call 22 }
Var regSet : registers;
K:ARRAY[1..2]OF WORD ABSOLUTE P;
BEGIN
regset.ax:=22; regset.es:=k[2]; regset.dx:=k[1]; intr(51,regset);
END;
PROCEDURE RestoreDriverState(VAR p:POINTER); { call 23 }
Var regSet : registers;
K:ARRAY[1..2]OF WORD ABSOLUTE P;
BEGIN
regset.ax:=23; regset.es:=k[2]; regset.dx:=k[1]; intr(51,regset);
END;
FUNCTION SetAlternateHandler(p:POINTER;M:WORD):BOOLEAN; { call 24 }
Var regSet : registers;
K:ARRAY[1..2]OF WORD ABSOLUTE P;
BEGIN
regset.ax:=24; regset.cx:=M; regset.es:=k[2]; regset.dx:=k[1];
intr(51,regset); m:=regset.cx;
IF (regset.ax=24) THEN SetAlternateHandler:=TRUE
ELSE SetAlternateHandler:=FALSE;
END;
FUNCTION GetAlternateHandler(VAR p:POINTER;VAR M:WORD):BOOLEAN; { call 25 }
Var regSet : registers;
K:ARRAY[1..2]OF WORD ABSOLUTE P;
BEGIN
regset.ax:=25; regset.cx:=M; intr(51,regset); m:=regset.cx;
k[2]:=regset.es; k[1]:=regset.dx;
IF (regset.cx=0) THEN GetAlternateHandler:=FALSE
ELSE GetAlternateHandler:=TRUE;
END;
PROCEDURE SetCRTPage(n:WORD); { call 29 }
Var regSet : registers;
BEGIN
regset.ax:=29; regset.bx:=n; intr(51,regset);
END;
PROCEDURE GetCRTPage(VAR n:WORD); { call 30 }
Var regSet : registers;
BEGIN
regset.ax:=30; intr(51,regset); n:=regset.bx;
END;
PROCEDURE definegraphiccursor(mode :MouseCursor);
var i:integer;
begin
case mode of
ArrowCursor: begin { pfeil }
gcursor.screenmask[0] :=$1FFF; gcursor.screenmask[1] :=$07FF;
gcursor.screenmask[2] :=$01FF; gcursor.screenmask[3] :=$807F;
gcursor.screenmask[4] :=$800F; gcursor.screenmask[5] :=$C00F;
gcursor.screenmask[6] :=$C00F; gcursor.screenmask[7] :=$E03F;
gcursor.screenmask[8] :=$E01F; gcursor.screenmask[9] :=$F007;
gcursor.screenmask[10]:=$F103; gcursor.screenmask[11]:=$F181;
gcursor.screenmask[12]:=$FF80; gcursor.screenmask[13]:=$FFC0;
gcursor.screenmask[14]:=$FFE0; gcursor.screenmask[15]:=$FFF1;
gcursor.cursormask[0] :=$8000; gcursor.cursormask[1] :=$6000;
gcursor.cursormask[2] :=$7800; gcursor.cursormask[3] :=$3E00;
gcursor.cursormask[4] :=$3F80; gcursor.cursormask[5] :=$1FE0;
gcursor.cursormask[6] :=$1F80; gcursor.cursormask[7] :=$0F80;
gcursor.cursormask[8] :=$0FC0; gcursor.cursormask[9] :=$04E0;
gcursor.cursormask[10]:=$0478; gcursor.cursormask[11]:=$003C;
gcursor.cursormask[12]:=$003E; gcursor.cursormask[13]:=$001F;
gcursor.cursormask[14]:=$000E; gcursor.cursormask[15]:=$0004;
gcursor.hotx:=0;gcursor.hoty:=0;
end;
CrossCursor: begin { kreuz }
for i:=0 to 5 do gcursor.screenmask[i]:=$FC7F;
for i:=6 to 8 do gcursor.screenmask[i]:=$0001;
for i:=9 to 14 do gcursor.screenmask[i]:=$FC7F;
gcursor.screenmask[15]:=$FFFF;
for i:=0 to 6 do gcursor.cursormask[i] :=$0100;
gcursor.cursormask[7] :=$FFFE;
for i:=8 to 14 do gcursor.cursormask[i] :=$0100;
gcursor.cursormask[15] :=0;
gcursor.hotx:=7;gcursor.hoty:=7;
end;
ClockCursor: begin { uhr }
for i:= 0 to 1 do gcursor.screenmask[i] :=$8001;
for i:= 2 to 13 do gcursor.screenmask[i] :=$8001;
for i:=14 to 15 do gcursor.screenmask[i] :=$8001;
gcursor.cursormask[0] :=$3FFC; gcursor.cursormask[1] :=$0420;
gcursor.cursormask[2] :=$0810; gcursor.cursormask[3] :=$1108;
gcursor.cursormask[4] :=$1288; gcursor.cursormask[5] :=$0D50;
gcursor.cursormask[6] :=$06A0; gcursor.cursormask[7] :=$0340;
gcursor.cursormask[8] :=$02C0; gcursor.cursormask[9] :=$0420;
gcursor.cursormask[10]:=$0810; gcursor.cursormask[11]:=$1088;
gcursor.cursormask[12]:=$1148; gcursor.cursormask[13]:=$0A90;
gcursor.cursormask[14]:=$0560; gcursor.cursormask[15]:=$3FFC;
gcursor.hotx:=7;gcursor.hoty:=7;
end;
HandCursor: begin { hand }
gcursor.screenmask[0] :=$FC3F; gcursor.screenmask[1] :=$FC3F;
gcursor.screenmask[2] :=$FC07; gcursor.screenmask[3] :=$0C07;
gcursor.screenmask[4] :=$0C00; gcursor.screenmask[5] :=$0C00;
gcursor.screenmask[6] :=$8400; gcursor.screenmask[7] :=$C000;
gcursor.screenmask[8] :=$C000; gcursor.screenmask[9] :=$0000;
gcursor.screenmask[10]:=$0000; gcursor.screenmask[11]:=$8000;
gcursor.screenmask[12]:=$C000; gcursor.screenmask[13]:=$E001;
gcursor.screenmask[14]:=$FC03; gcursor.screenmask[15]:=$FC03;
gcursor.cursormask[0] :=$0180; gcursor.cursormask[1] :=$0240;
gcursor.cursormask[2] :=$0270; gcursor.cursormask[3] :=$6248;
gcursor.cursormask[4] :=$924E; gcursor.cursormask[5] :=$9249;
gcursor.cursormask[6] :=$4A49; gcursor.cursormask[7] :=$2649;
gcursor.cursormask[8] :=$2249; gcursor.cursormask[9] :=$7001;
gcursor.cursormask[10]:=$8801; gcursor.cursormask[11]:=$4001;
gcursor.cursormask[12]:=$2001; gcursor.cursormask[13]:=$1C02;
gcursor.cursormask[14]:=$0204; gcursor.cursormask[15]:=$03FC;
gcursor.hotx:=7;gcursor.hoty:=7;
end;
end; { case mode }
end; { end proc definegraphiccursor }
END. { implementation unit mouse }
home
last updated: 19.may.99
Copyright (99,2000) Ing.Büro R.Tschaggelar