home *** CD-ROM | disk | FTP | other *** search
- (* ----------------------------------------------------- *)
- (* MAUS.PAS *)
- (* Maus-Bibliothek fuer Turbo Pascal unter MS-DOS *)
- (* Die Funktionen zur Ermittlung bzw. zum Setzen von Ko- *)
- (* ordinaten werden ueber den "text_mode"-Parameter ge- *)
- (* steuert, da der Treiber nur in Grafik-Koordinaten ar- *)
- (* beitet. Wird fuer den "text_mode"-Parameter TRUE *)
- (* uebergeben, so transformieren die entsprechenden Funk-*)
- (* tionen die Grafik-Koordinaten (0..639,0..199) in die *)
- (* entsprechenden Text-Koordinaten (1..80,1..25) und *)
- (* umgekehrt. *)
- CONST
- Mouse_Intr = 51; (* Interrupt-Nr. des Maus-Treibers *)
- Mouse_LButton = 1;
- Mouse_RButton = 2;
- Mouse_MButton = 4;
- TYPE
- Mouse_Type = RECORD
- screen, mask : ARRAY[0..15] OF INTEGER;
- END;
- VAR
- Mouse_Regs : RECORD
- AX, BX, CX, DX, BP,
- SI, DI, DS, ES, Flags : INTEGER;
- END;
- CONST (* der Maus-Pfeil fuer Grafik-Modus: *)
- M_Arrow : Mouse_Type =
- (screen : ($ffff, $ffff, $ffff, $ffff,
- $ffff, $ffff, $ffff, $ffff,
- $ffff, $ffff, $ffff, $ffff,
- $ffff, $ffff, $ffff, $ffff);
- mask : ($8000, $e000, $f800, $fe00,
- $d800, $0c00, $0600, $0300,
- $0000, $0000, $0000, $0000,
- $0000, $0000, $0000, $0000));
- (* ----------------------------------------------------- *)
- (* Prueft nach, ob eine Maus vorhanden ist und gibt aus, *)
- (* wieviel Tasten diese Maus hat. Null bedeutet "keine *)
- (* Maus vorhanden!". Dabei wird ein ev. sichtbarer Maus- *)
- (* Zeiger unsichtbar, die Position in die Mitte des Bild-*)
- (* schirmes gesetzt und als Zeiger eine invertierende *)
- (* Box eingestellt: *)
- FUNCTION Init_Mouse : INTEGER;
- BEGIN
- Init_Mouse := 0; Mouse_Regs.AX := 0;
- Intr(Mouse_Intr,Mouse_Regs);
- IF Mouse_Regs.AX = -1 THEN Init_Mouse := Mouse_Regs.BX;
- END;
- (* ----------------------------------------------------- *)
- (* den Maus-Zeiger sichtbar machen: *)
- PROCEDURE Show_Mouse;
- BEGIN
- Mouse_Regs.AX := 1; Intr(Mouse_Intr,Mouse_Regs);
- END;
- (* ----------------------------------------------------- *)
- (* und wieder unsichtbar: *)
- PROCEDURE Hide_Mouse;
- BEGIN
- Mouse_Regs.AX := 2; Intr(Mouse_Intr,Mouse_Regs);
- END;
- (* ----------------------------------------------------- *)
- (* Gibt die akt. Position der Maus in Grafik-Koordinaten *)
- (* zurueck. Koordinaten f. Text-Modus, wenn "text_mode" *)
- (* TRUE ist. Ebenso wird der Zustand der Maus-Tasten zu- *)
- (* rueckgegeben: *)
- (* Bit 0=linke Taste, 1=rechte Taste, 2=mittl.Taste *)
- (* Ist das entsprechende Bit gesetzt, so ist die Taste *)
- (* niedergedrueckt, andernfalls im Ruhezustand. *)
- PROCEDURE Get_Mouse (VAR x,y,buttons : INTEGER;
- text_mode : BOOLEAN);
- BEGIN
- Mouse_Regs.AX := 3; Intr(Mouse_Intr,Mouse_Regs);
- x := Mouse_Regs.CX; y := Mouse_Regs.DX;
- buttons := Mouse_Regs.BX;
- IF text_mode THEN BEGIN
- x := Succ(x DIV 8); y := Succ(y DIV 8);
- END;
- END;
- (* ----------------------------------------------------- *)
- (* Setzt den Maus-Cursor auf Position x,y in Grafik- *)
- (* Koordinaten. Koordinaten f. Text-Modus werden ange- *)
- (* nommen, wenn "text_mode" TRUE ist: *)
- PROCEDURE Set_Mouse (x, y : INTEGER; text_mode : BOOLEAN);
- BEGIN
- IF text_mode THEN BEGIN
- x := Pred(x) * 8; y := Pred(y) * 8;
- END;
- Mouse_Regs.AX := 4;
- Mouse_Regs.CX := x; Mouse_Regs.DX := y;
- Intr(Mouse_Intr, Mouse_Regs);
- END;
- (* ----------------------------------------------------- *)
- (* Gibt Position des Cursors beim letzten Druck der in *)
- (* button spez. Maustaste und die Anzahl der Betaeti- *)
- (* gungen dieser Taste seit dem letzten Aufruf dieser *)
- (* Funktion aus: *)
- PROCEDURE Where_Button_Pressed (button : INTEGER;
- text_mode : BOOLEAN;
- VAR x, y, n : INTEGER);
- BEGIN
- Mouse_Regs.AX := 5; Mouse_Regs.BX := button;
- Intr(Mouse_Intr, Mouse_Regs);
- x := Mouse_Regs.CX; y := Mouse_Regs.DX;
- n := Mouse_Regs.BX;
- IF text_mode THEN BEGIN
- x := Succ(x DIV 8); y := Succ(y DIV 8);
- END;
- END;
- (* ----------------------------------------------------- *)
- (* Wie letzte Funktion, diesmal aber fuer's loslassen: *)
- PROCEDURE Where_Button_Released (button : INTEGER;
- text_mode : BOOLEAN;
- VAR x, y, n : INTEGER);
- BEGIN
- Mouse_Regs.AX := 6; Mouse_Regs.BX := button;
- Intr(Mouse_Intr, Mouse_Regs);
- x := Mouse_Regs.CX; y := Mouse_Regs.DX;
- n := Mouse_Regs.BX;
- IF text_mode THEN BEGIN
- x := Succ(x DIV 8); y := Succ(y DIV 8);
- END;
- END;
- (* ----------------------------------------------------- *)
- (* setzt min. und max. X-Koordinate, zwischen denen sich *)
- (* die Maus bewegen kann: *)
- PROCEDURE Set_Mouse_X (xmin, xmax : INTEGER;
- text_mode : BOOLEAN);
- BEGIN
- IF text_mode THEN BEGIN
- xmin := Pred(xmin) * 8; xmax := Pred(xmax) * 8;
- END;
- Mouse_Regs.AX := 7;
- Mouse_Regs.CX := xmin; Mouse_Regs.DX := xmax;
- Intr(Mouse_Intr, Mouse_Regs);
- END;
- (* ----------------------------------------------------- *)
- (* setzt min. und max. Y-Koordinate, zwischen denen sich *)
- (* die Maus bewegen kann: *)
- PROCEDURE Set_Mouse_Y (ymin, ymax : INTEGER;
- text_mode : BOOLEAN);
- BEGIN
- IF text_mode THEN BEGIN
- ymin := Pred(ymin) * 8; ymax := Pred(ymax) * 8;
- END;
- Mouse_Regs.AX := 8;
- Mouse_Regs.CX := ymin; Mouse_Regs.DX := ymax;
- Intr(Mouse_Intr, Mouse_Regs);
- END;
- (* ----------------------------------------------------- *)
- (* legt max. Bewegungsraum f. die Maus in Grafik-Koordi- *)
- (* naten fest. Koordinaten f. Text-Modus wieder wenn *)
- (* "text_mode" TRUE ist. (x1,y1): linke obere Ecke, (x2, *)
- (* y2): rechte untere Ecke. Funktion ist nur eine Zusam- *)
- (* menfassung der letzten beiden Prozeduren ! *)
- PROCEDURE Set_Mouse_XY (x1, y1, x2, y2 : INTEGER;
- text_mode : BOOLEAN);
- BEGIN
- Set_Mouse_X(x1, x2, text_mode);
- Set_Mouse_Y(y1, y2, text_mode);
- END;
- (* ----------------------------------------------------- *)
- (* definiert die Form, die Farbe und das Zentrum des *)
- (* Maus-Zeigers im Grafikmode. Der Zeiger besteht aus *)
- (* zwei 16x16 Bit-Feldern, die sich aufeinander folgend *)
- (* im Speicher befinden muessen (s. Artikel !). Das Zen- *)
- (* trum, der "Hot Spot" ist ein Punkt relativ zur oberen,*)
- (* linken Ecke (0,0) des Zeiger-Feldes und dient zur *)
- (* Spezifizierung der Zeiger-Koordinaten. Die Koordina- *)
- (* ten des "Hot Spot", HotX und HotY, muessen im Bereich *)
- (* von -16 bis +16 liegen: *)
- PROCEDURE Graphic_Mouse (HotX, HotY : INTEGER;
- shape : Mouse_Type);
- BEGIN
- Mouse_Regs.AX := 9;
- Mouse_Regs.BX := HotX; Mouse_Regs.CX := HotY;
- Mouse_Regs.DX := Ofs(shape); Mouse_Regs.ES := Seg(shape);
- Intr(Mouse_Intr,Mouse_Regs);
- END;
- (* ----------------------------------------------------- *)
- (* Setzt Zeichen und Farbe des Mouse-Zeigers im Textmo- *)
- (* dus: *)
- (* M_Char: ASCII-Zeichen, welches als Cursor verwendet *)
- (* werden soll *)
- (* Color : Vordergrundfarbe des Zeigers (wie bei *)
- (* "TextColor") *)
- (* BckGd : Hintergrundfarbe des Zeigers (wie bei *)
- (* "TextBackGround") *)
- PROCEDURE Text_Mouse (M_Char : CHAR;
- Color, BckGd : INTEGER);
- VAR attr : BYTE;
- BEGIN
- Mouse_Regs.AX := 10; Mouse_Regs.BX := 0;
- attr := Color OR (BckGd SHL 4);
- IF Color > White THEN attr := attr OR 128;
- Mouse_Regs.CX := attr SHL 8;
- Mouse_Regs.DX := Mouse_Regs.CX + Ord(M_Char);
- Intr(Mouse_Intr,Mouse_Regs);
- END;
- (* ----------------------------------------------------- *)
- (* horizontale und vertikale Bewegung der Maus seit dem *)
- (* letzten Aufruf dieser Funktion ermitteln. Die Integer-*)
- (* Werte besitzen die Einheit "mickey", was eine Stan- *)
- (* dard-Einheit der Mausbewegung um 1/200 Inch ist. *)
- (* Siehe auch naechste Funktion! *)
- PROCEDURE Get_Mouse_Motion (VAR DX, dy: INTEGER);
- BEGIN
- Mouse_Regs.AX := 11; Intr(Mouse_Intr, Mouse_Regs);
- DX := Mouse_Regs.CX; dy := Mouse_Regs.DX;
- END;
- (* ----------------------------------------------------- *)
- (* horizontales und vertikales Verhaeltnis der Mausbewe- *)
- (* gung auf dem Schreibtisch zur Bewegung des Maus-Zei- *)
- (* gers auf dem Bildschirm setzen. Z.B. benoetigt man *)
- (* mit 16 "mickeys" pro 8 Bildpunkten ca. 6,4 Inch Maus- *)
- (* bewegung, um den Zeiger horizontal ueber den ganzen *)
- (* Bildschirm zu bewegen (640 Bildpunkte), mit den glei- *)
- (* chen 16 "mickeys" nur 2 Inch, um den Zeiger vertikal *)
- (* ueber den ganzen Bildschirm zu bewegen (200 Bild- *)
- (* punkte). Die Funktion setzt also das Verhaeltnis von *)
- (* "mickey" zu 8 Bildpunkten. Die Werte von dx und dy *)
- (* muessen zwischen 1 und 32767 liegen. *)
- PROCEDURE Set_Mouse_Motion (DX, dy: INTEGER);
- BEGIN
- Mouse_Regs.AX := 15;
- Mouse_Regs.CX := DX; Mouse_Regs.DX := dy;
- Intr(Mouse_Intr, Mouse_Regs);
- END;
- (* ----------------------------------------------------- *)
- (* irgendeine Maustaste gedrueckt? Analog zu "KeyPressed"*)
- FUNCTION Button_Pressed : BOOLEAN;
- BEGIN
- Mouse_Regs.AX := 3; Intr(Mouse_Intr,Mouse_Regs);
- Button_Pressed := (Mouse_Regs.BX AND 7) <> 0;
- END;
- (* ----------------------------------------------------- *)
- (* Gibt Auskunft,welche Maustaste gerade gedrueckt wird: *)
- (* Bit 0=linke Taste, 1=rechte Taste, 2=mittlere Taste *)
- FUNCTION Which_Button : INTEGER;
- BEGIN
- Mouse_Regs.AX := 3; Intr(Mouse_Intr,Mouse_Regs);
- Which_Button := Mouse_Regs.BX;
- END;
- (* ----------------------------------------------------- *)
- (* Wartet bis sich die Maus bewegt oder eine Taste ge- *)
- (* drueckt wird: *)
- PROCEDURE Wait_Mouse;
- VAR dx, dy: INTEGER;
- BEGIN
- REPEAT
- Get_Mouse_Motion(dx, dy);
- UNTIL (dx <> 0) OR (dy <> 0) OR Button_Pressed;
- END;
- (* ----------------------------------------------------- *)
- (* Setzt "Geschwindigkeit" der Maus: *)
- (* 1 (schnell) bis 9 (langsam) *)
- PROCEDURE Set_Mouse_Speed (s : INTEGER);
- BEGIN
- IF s IN [1..9] THEN
- Set_Mouse_Motion(s*6, s*12);
- END;
- (* ----------------------------------------------------- *)
- (* Pruefen, ob sich die Maus in dem mit (x1,y1) (x2,y2) *)
- (* gegebenen Bereich befindet: *)
- FUNCTION Mouse_in_XY (x1, y1, x2, y2 : INTEGER;
- text_mode : BOOLEAN) : BOOLEAN;
- VAR temp, x, y : INTEGER;
- BEGIN
- IF x1 > x2 THEN BEGIN
- temp := x1; x1 := x2; x2 := temp;
- END;
- IF y1 > y2 THEN BEGIN
- temp := y1; y1 := y2; y2 := temp;
- END;
- Get_Mouse(x, y, temp, text_mode);
- Mouse_in_XY := (x >= x1) AND (x <= x2) AND
- (y >= y1) AND (y <= y2);
- END;
- (* ----------------------------------------------------- *)
- (* MAUS.PAS *)