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