home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 03 / maus.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-12-10  |  11.6 KB  |  280 lines

  1. (* ----------------------------------------------------- *)
  2. (*                      MAUS.PAS                         *)
  3. (*    Maus-Bibliothek fuer Turbo Pascal unter MS-DOS     *)
  4. (* Die Funktionen zur Ermittlung bzw. zum Setzen von Ko- *)
  5. (* ordinaten werden ueber den "text_mode"-Parameter ge-  *)
  6. (* steuert, da der Treiber nur in Grafik-Koordinaten ar- *)
  7. (* beitet. Wird fuer den "text_mode"-Parameter TRUE      *)
  8. (* uebergeben, so transformieren die entsprechenden Funk-*)
  9. (* tionen die Grafik-Koordinaten (0..639,0..199) in die  *)
  10. (* entsprechenden Text-Koordinaten (1..80,1..25) und     *)
  11. (* umgekehrt.                                            *)
  12. CONST
  13.   Mouse_Intr = 51;    (* Interrupt-Nr. des Maus-Treibers *)
  14.   Mouse_LButton = 1;
  15.   Mouse_RButton = 2;
  16.   Mouse_MButton = 4;
  17. TYPE
  18.   Mouse_Type = RECORD
  19.                  screen, mask : ARRAY[0..15] OF INTEGER;
  20.                END;
  21. VAR
  22.   Mouse_Regs : RECORD
  23.                  AX, BX, CX, DX, BP,
  24.                  SI, DI, DS, ES, Flags : INTEGER;
  25.                END;
  26. CONST               (* der Maus-Pfeil fuer Grafik-Modus: *)
  27.   M_Arrow : Mouse_Type =
  28.                (screen : ($ffff, $ffff, $ffff, $ffff,
  29.                           $ffff, $ffff, $ffff, $ffff,
  30.                           $ffff, $ffff, $ffff, $ffff,
  31.                           $ffff, $ffff, $ffff, $ffff);
  32.                 mask   : ($8000, $e000, $f800, $fe00,
  33.                           $d800, $0c00, $0600, $0300,
  34.                           $0000, $0000, $0000, $0000,
  35.                           $0000, $0000, $0000, $0000));
  36. (* ----------------------------------------------------- *)
  37. (* Prueft nach, ob eine Maus vorhanden ist und gibt aus, *)
  38. (* wieviel Tasten diese Maus hat. Null bedeutet "keine   *)
  39. (* Maus vorhanden!". Dabei wird ein ev. sichtbarer Maus- *)
  40. (* Zeiger unsichtbar, die Position in die Mitte des Bild-*)
  41. (* schirmes gesetzt und als Zeiger eine invertierende    *)
  42. (* Box eingestellt:                                      *)
  43. FUNCTION Init_Mouse : INTEGER;
  44. BEGIN
  45.   Init_Mouse := 0;  Mouse_Regs.AX := 0;
  46.   Intr(Mouse_Intr,Mouse_Regs);
  47.   IF Mouse_Regs.AX = -1 THEN Init_Mouse := Mouse_Regs.BX;
  48. END;
  49. (* ----------------------------------------------------- *)
  50. (*         den Maus-Zeiger sichtbar machen:              *)
  51. PROCEDURE Show_Mouse;
  52. BEGIN
  53.   Mouse_Regs.AX := 1;  Intr(Mouse_Intr,Mouse_Regs);
  54. END;
  55. (* ----------------------------------------------------- *)
  56. (*                und wieder unsichtbar:                 *)
  57. PROCEDURE Hide_Mouse;
  58. BEGIN
  59.   Mouse_Regs.AX := 2;  Intr(Mouse_Intr,Mouse_Regs);
  60. END;
  61. (* ----------------------------------------------------- *)
  62. (* Gibt die akt. Position der Maus in Grafik-Koordinaten *)
  63. (* zurueck. Koordinaten f. Text-Modus, wenn "text_mode"  *)
  64. (* TRUE ist. Ebenso wird der Zustand der Maus-Tasten zu- *)
  65. (* rueckgegeben:                                         *)
  66. (*    Bit 0=linke Taste, 1=rechte Taste, 2=mittl.Taste   *)
  67. (* Ist das entsprechende Bit gesetzt, so ist die Taste   *)
  68. (* niedergedrueckt, andernfalls im Ruhezustand.          *)
  69. PROCEDURE Get_Mouse (VAR x,y,buttons : INTEGER;
  70.                            text_mode : BOOLEAN);
  71. BEGIN
  72.   Mouse_Regs.AX := 3;  Intr(Mouse_Intr,Mouse_Regs);
  73.   x := Mouse_Regs.CX;  y := Mouse_Regs.DX;
  74.   buttons := Mouse_Regs.BX;
  75.   IF text_mode THEN BEGIN
  76.     x := Succ(x DIV 8);  y := Succ(y DIV 8);
  77.   END;
  78. END;
  79. (* ----------------------------------------------------- *)
  80. (* Setzt den Maus-Cursor auf Position x,y in Grafik-     *)
  81. (* Koordinaten. Koordinaten f. Text-Modus werden ange-   *)
  82. (* nommen, wenn "text_mode" TRUE ist:                    *)
  83. PROCEDURE Set_Mouse (x, y : INTEGER; text_mode : BOOLEAN);
  84. BEGIN
  85.   IF text_mode THEN BEGIN
  86.     x := Pred(x) * 8;  y := Pred(y) * 8;
  87.   END;
  88.   Mouse_Regs.AX := 4;
  89.   Mouse_Regs.CX := x;  Mouse_Regs.DX := y;
  90.   Intr(Mouse_Intr, Mouse_Regs);
  91. END;
  92. (* ----------------------------------------------------- *)
  93. (* Gibt Position des Cursors beim letzten Druck der in   *)
  94. (* button spez. Maustaste und die Anzahl der Betaeti-    *)
  95. (* gungen dieser Taste seit dem letzten Aufruf dieser    *)
  96. (* Funktion aus:                                         *)
  97. PROCEDURE Where_Button_Pressed (button      : INTEGER;
  98.                                 text_mode   : BOOLEAN;
  99.                                 VAR x, y, n : INTEGER);
  100. BEGIN
  101.   Mouse_Regs.AX := 5;  Mouse_Regs.BX := button;
  102.   Intr(Mouse_Intr, Mouse_Regs);
  103.   x := Mouse_Regs.CX;  y := Mouse_Regs.DX;
  104.   n := Mouse_Regs.BX;
  105.   IF text_mode THEN BEGIN
  106.     x := Succ(x DIV 8);  y := Succ(y DIV 8);
  107.   END;
  108. END;
  109. (* ----------------------------------------------------- *)
  110. (*  Wie letzte Funktion, diesmal aber fuer's loslassen:  *)
  111. PROCEDURE Where_Button_Released (button      : INTEGER;
  112.                                  text_mode   : BOOLEAN;
  113.                                  VAR x, y, n : INTEGER);
  114. BEGIN
  115.   Mouse_Regs.AX := 6;  Mouse_Regs.BX := button;
  116.   Intr(Mouse_Intr, Mouse_Regs);
  117.   x := Mouse_Regs.CX;  y := Mouse_Regs.DX;
  118.   n := Mouse_Regs.BX;
  119.   IF text_mode THEN BEGIN
  120.     x := Succ(x DIV 8);  y := Succ(y DIV 8);
  121.   END;
  122. END;
  123. (* ----------------------------------------------------- *)
  124. (* setzt min. und max. X-Koordinate, zwischen denen sich *)
  125. (* die Maus bewegen kann:                                *)
  126. PROCEDURE Set_Mouse_X (xmin, xmax : INTEGER;
  127.                        text_mode  : BOOLEAN);
  128. BEGIN
  129.   IF text_mode THEN BEGIN
  130.     xmin := Pred(xmin) * 8;  xmax := Pred(xmax) * 8;
  131.   END;
  132.   Mouse_Regs.AX := 7;
  133.   Mouse_Regs.CX := xmin;  Mouse_Regs.DX := xmax;
  134.   Intr(Mouse_Intr, Mouse_Regs);
  135. END;
  136. (* ----------------------------------------------------- *)
  137. (* setzt min. und max. Y-Koordinate, zwischen denen sich *)
  138. (* die Maus bewegen kann:                                *)
  139. PROCEDURE Set_Mouse_Y (ymin, ymax : INTEGER;
  140.                        text_mode  : BOOLEAN);
  141. BEGIN
  142.   IF text_mode THEN BEGIN
  143.     ymin := Pred(ymin) * 8;  ymax := Pred(ymax) * 8;
  144.   END;
  145.   Mouse_Regs.AX := 8;
  146.   Mouse_Regs.CX := ymin;  Mouse_Regs.DX := ymax;
  147.   Intr(Mouse_Intr, Mouse_Regs);
  148. END;
  149. (* ----------------------------------------------------- *)
  150. (* legt max. Bewegungsraum f. die Maus in Grafik-Koordi- *)
  151. (* naten fest. Koordinaten f. Text-Modus wieder wenn     *)
  152. (* "text_mode" TRUE ist. (x1,y1): linke obere Ecke, (x2, *)
  153. (* y2): rechte untere Ecke. Funktion ist nur eine Zusam- *)
  154. (* menfassung der letzten beiden Prozeduren !            *)
  155. PROCEDURE Set_Mouse_XY (x1, y1, x2, y2 : INTEGER;
  156.                         text_mode      : BOOLEAN);
  157. BEGIN
  158.   Set_Mouse_X(x1, x2, text_mode);
  159.   Set_Mouse_Y(y1, y2, text_mode);
  160. END;
  161. (* ----------------------------------------------------- *)
  162. (* definiert die Form, die Farbe und das Zentrum des     *)
  163. (* Maus-Zeigers im Grafikmode. Der Zeiger besteht aus    *)
  164. (* zwei 16x16 Bit-Feldern, die sich aufeinander folgend  *)
  165. (* im Speicher befinden muessen (s. Artikel !). Das Zen- *)
  166. (* trum, der "Hot Spot" ist ein Punkt relativ zur oberen,*)
  167. (* linken Ecke (0,0) des Zeiger-Feldes und dient zur     *)
  168. (* Spezifizierung der Zeiger-Koordinaten. Die Koordina-  *)
  169. (* ten des "Hot Spot", HotX und HotY, muessen im Bereich *)
  170. (* von -16 bis +16 liegen:                               *)
  171. PROCEDURE Graphic_Mouse (HotX, HotY : INTEGER;
  172.                          shape      : Mouse_Type);
  173. BEGIN
  174.   Mouse_Regs.AX := 9;
  175.   Mouse_Regs.BX := HotX;       Mouse_Regs.CX := HotY;
  176.   Mouse_Regs.DX := Ofs(shape); Mouse_Regs.ES := Seg(shape);
  177.   Intr(Mouse_Intr,Mouse_Regs);
  178. END;
  179. (* ----------------------------------------------------- *)
  180. (* Setzt Zeichen und Farbe des Mouse-Zeigers im Textmo-  *)
  181. (* dus:                                                  *)
  182. (* M_Char: ASCII-Zeichen, welches als Cursor verwendet   *)
  183. (*         werden soll                                   *)
  184. (* Color : Vordergrundfarbe des Zeigers (wie bei         *)
  185. (*         "TextColor")                                  *)
  186. (* BckGd : Hintergrundfarbe des Zeigers (wie bei         *)
  187. (*         "TextBackGround")                             *)
  188. PROCEDURE Text_Mouse (M_Char       : CHAR;
  189.                       Color, BckGd : INTEGER);
  190. VAR attr : BYTE;
  191. BEGIN
  192.   Mouse_Regs.AX := 10;  Mouse_Regs.BX := 0;
  193.   attr := Color OR (BckGd SHL 4);
  194.   IF Color > White THEN attr := attr OR 128;
  195.   Mouse_Regs.CX := attr SHL 8;
  196.   Mouse_Regs.DX := Mouse_Regs.CX + Ord(M_Char);
  197.   Intr(Mouse_Intr,Mouse_Regs);
  198. END;
  199. (* ----------------------------------------------------- *)
  200. (* horizontale und vertikale Bewegung der Maus seit dem  *)
  201. (* letzten Aufruf dieser Funktion ermitteln. Die Integer-*)
  202. (* Werte besitzen die Einheit "mickey", was eine Stan-   *)
  203. (* dard-Einheit der Mausbewegung um 1/200 Inch ist.      *)
  204. (* Siehe auch naechste Funktion!                         *)
  205. PROCEDURE Get_Mouse_Motion (VAR DX, dy: INTEGER);
  206. BEGIN
  207.   Mouse_Regs.AX := 11;  Intr(Mouse_Intr, Mouse_Regs);
  208.   DX := Mouse_Regs.CX;  dy := Mouse_Regs.DX;
  209. END;
  210. (* ----------------------------------------------------- *)
  211. (* horizontales und vertikales Verhaeltnis der Mausbewe- *)
  212. (* gung auf dem Schreibtisch zur Bewegung des Maus-Zei-  *)
  213. (* gers auf dem Bildschirm setzen. Z.B. benoetigt man    *)
  214. (* mit 16 "mickeys" pro 8 Bildpunkten ca. 6,4 Inch Maus- *)
  215. (* bewegung, um den Zeiger horizontal ueber den ganzen   *)
  216. (* Bildschirm zu bewegen (640 Bildpunkte), mit den glei- *)
  217. (* chen 16 "mickeys" nur 2 Inch, um den Zeiger vertikal  *)
  218. (* ueber den ganzen Bildschirm zu bewegen (200 Bild-     *)
  219. (* punkte). Die Funktion setzt also das Verhaeltnis von  *)
  220. (* "mickey" zu 8 Bildpunkten. Die Werte von dx und dy    *)
  221. (* muessen zwischen 1 und 32767 liegen.                  *)
  222. PROCEDURE Set_Mouse_Motion (DX, dy: INTEGER);
  223. BEGIN
  224.   Mouse_Regs.AX := 15;
  225.   Mouse_Regs.CX := DX;  Mouse_Regs.DX := dy;
  226.   Intr(Mouse_Intr, Mouse_Regs);
  227. END;
  228. (* ----------------------------------------------------- *)
  229. (* irgendeine Maustaste gedrueckt? Analog zu "KeyPressed"*)
  230. FUNCTION Button_Pressed : BOOLEAN;
  231. BEGIN
  232.   Mouse_Regs.AX := 3;  Intr(Mouse_Intr,Mouse_Regs);
  233.   Button_Pressed := (Mouse_Regs.BX AND 7) <> 0;
  234. END;
  235. (* ----------------------------------------------------- *)
  236. (* Gibt Auskunft,welche Maustaste gerade gedrueckt wird: *)
  237. (* Bit 0=linke Taste, 1=rechte Taste, 2=mittlere Taste   *)
  238. FUNCTION Which_Button : INTEGER;
  239. BEGIN
  240.   Mouse_Regs.AX := 3;  Intr(Mouse_Intr,Mouse_Regs);
  241.   Which_Button := Mouse_Regs.BX;
  242. END;
  243. (* ----------------------------------------------------- *)
  244. (* Wartet bis sich die Maus bewegt oder eine Taste ge-   *)
  245. (* drueckt wird:                                         *)
  246. PROCEDURE Wait_Mouse;
  247. VAR dx, dy: INTEGER;
  248. BEGIN
  249.   REPEAT
  250.     Get_Mouse_Motion(dx, dy);
  251.   UNTIL (dx <> 0) OR (dy <> 0) OR Button_Pressed;
  252. END;
  253. (* ----------------------------------------------------- *)
  254. (*           Setzt "Geschwindigkeit" der Maus:           *)
  255. (*             1 (schnell) bis 9 (langsam)               *)
  256. PROCEDURE Set_Mouse_Speed (s : INTEGER);
  257. BEGIN
  258.   IF s IN [1..9] THEN
  259.     Set_Mouse_Motion(s*6, s*12);
  260. END;
  261. (* ----------------------------------------------------- *)
  262. (* Pruefen, ob sich die Maus in dem mit (x1,y1) (x2,y2)  *)
  263. (* gegebenen Bereich befindet:                           *)
  264. FUNCTION Mouse_in_XY (x1, y1, x2, y2 : INTEGER;
  265.                       text_mode      : BOOLEAN) : BOOLEAN;
  266. VAR temp, x, y : INTEGER;
  267. BEGIN
  268.   IF x1 > x2 THEN BEGIN
  269.     temp := x1;  x1 := x2;  x2 := temp;
  270.   END;
  271.   IF y1 > y2 THEN BEGIN
  272.     temp := y1;  y1 := y2;  y2 := temp;
  273.   END;
  274.   Get_Mouse(x, y, temp, text_mode);
  275.   Mouse_in_XY := (x >= x1) AND (x <= x2) AND
  276.                  (y >= y1) AND (y <= y2);
  277. END;
  278. (* ----------------------------------------------------- *)
  279. (*                      MAUS.PAS                         *)
  280.