home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / dos / joystick.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-29  |  6.6 KB  |  232 lines

  1. {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-,Y-}
  2. (*===================================================================*)
  3. (*                            JOYSTICK.PAS                           *)
  4. (*            Copyright (C) 1993 te-wi Verlag, München               *)
  5. (*-------------------------------------------------------------------*)
  6. (*      Unit mit den wichtigsten Interface-Routinen zum Joystick     *)
  7. (*    Diese Version arbeitet mit dem Interrupt 15h bei ATs und der   *)
  8. (*     direkten Portabfrage bei XTs und somit hardware-unabhängig    *)
  9. (*   Falls bei einem AT Timerprobleme auftreten, sollten auch hier   *)
  10. (*        die direkten Abfragen (XT-Routinen) verwendet werden.      *)
  11. (*   Hierzu muß nur die Routine FUNCTION ATFunktions durch eine      *)
  12. (*        Routine ersetzt werden, die immer FALSE zurückgibt.        *)
  13. (*  Wegen der Hardware-Abhängigkeit der direkten Hardwareabfrage     *)
  14. (*           sollte dies aber nur im Notfall gemacht werden.         *)
  15. (*===================================================================*)
  16.  
  17. UNIT Joystick;
  18.  
  19. INTERFACE
  20.  
  21. (*-------------------------------------------------------------------*)
  22. (* Installationstest auf Joystick. Bei AT wird hierzu das Carry-Flag *)
  23. (* verwendet, bei XT der Int 11h und dann die Prüfung auf X und Y    *)
  24. FUNCTION  IsInstalled: BOOLEAN;
  25.  
  26. (*-------------------------------------------------------------------*)
  27. (* Überprüfung und Meldung, ob die AT- oder die XT-Funktionen        *)
  28. (* verwendet werden sollen. Bei ATs können beide Routinen verwendet  *)
  29. (* werden, die Funktionen den Int 15h stehen bei XTs aber nicht zur  *)
  30. (* Verfügung. Die XT-Funktionen sind allerdings komplizierter und    *)
  31. (* störungsanfälliger weshalb bei ATs immer auf die Interrupt-Auf-   *)
  32. (* rufe zurückgegriffen werden sollte. Falls die Routinen auf einem  *)
  33. (* PC-XT nicht arbeiten, Taktfrequenz erniedrigen (falls möglich)    *)
  34. (* und außerdem überprüfen, ob die Portadresse stimmt.               *)
  35. FUNCTION ATFunctions: BOOLEAN;
  36.  
  37. (*-------------------------------------------------------------------*)
  38. (* Ermittlung,ob ein Feuerknopf gedrückt ist: f1: Knopf 1 an Stick 1 *)
  39. (*                                            f2: Knopf 2 an Stick 1 *)
  40. (*                                            f3: Knopf 1 an Stick 2 *)
  41. (*                                            f2: Knopf 2 an Stick 2 *)
  42. PROCEDURE FireButton(VAR f1, f2, f3, f4: BOOLEAN);
  43.  
  44. (*-------------------------------------------------------------------*)
  45. (* liefert den relativen X- und Y-Wert von Joystick 1 zurück:        *)
  46. PROCEDURE WhereXY1(VAR x, y: INTEGER);
  47.  
  48. (*-------------------------------------------------------------------*)
  49. (* liefert den relativen X- und Y-Wert von Joystick 2 zurück:        *)
  50. PROCEDURE WhereXY2(VAR x, y: INTEGER);
  51.  
  52. IMPLEMENTATION
  53.  
  54. USES
  55.   Dos;
  56.  
  57. CONST
  58.   GamePort = $201; (* Dieser Wert kann bei XTs unter Umständen auch  *)
  59.                  (* im Bereich $200 bis $20F abweichen. Im Zweifels- *)
  60.                  (* fall testen. Bei ATs gibt es keine Probleme, da  *)
  61.                  (* der Int 15h den Port im Griff hat.               *)
  62.  
  63. FUNCTION ATFunctions: BOOLEAN;
  64. {$IFDEF DPMI}
  65. BEGIN
  66.   ATFunctions := TRUE;
  67.                   (* wie soll ein XT in den Protected Mode schalten? *)
  68. END;
  69. {$ELSE}
  70. ASSEMBLER;
  71. ASM
  72.   PUSHF
  73.   XOR   AX, AX
  74.   POPF
  75.   PUSHF
  76.   POP   AX
  77.   AND   AX, 0F000H     (* Flag-Check *)
  78.   JZ    @xt
  79.   MOV   AL, TRUE
  80.   JMP   @out            (* Pech gehabt haben alle mit einem XT286. *)
  81. @xt:                    (* Kennen Sie jemanden mit so einer Kiste? *)
  82.   MOV   AL, FALSE
  83. @out:
  84. END;
  85. {$ENDIF}
  86.  
  87. FUNCTION XTGeneric(num, Direction: BYTE): INTEGER;
  88. VAR
  89.   SelectBit, SelectStick: BYTE;
  90.   JoyCount,  counter    : INTEGER;
  91. BEGIN
  92.   IF Direction <= 1 THEN
  93.   BEGIN
  94.     SelectBit := $01;
  95.     IF num > 1 THEN SelectBit := $04;
  96.   END
  97.   ELSE
  98.   BEGIN
  99.     SelectBit := $02;
  100.     IF num > 1 THEN SelectBit := $08;
  101.   END;
  102.   SelectStick := $03;
  103.   IF num > 1 THEN SelectStick := $0C;
  104.   counter := 0;
  105.   REPEAT
  106.     JoyCount := Port[GamePort];
  107.     Inc(counter);
  108.   UNTIL (JoyCount AND SelectStick = 0) OR (counter = 500);
  109.   Port[GamePort] := JoyCount;
  110.   counter := 0;
  111.   REPEAT
  112.     JoyCount := Port[GamePort];
  113.     Inc(counter);
  114.   UNTIL (JoyCount AND SelectBit = 0) OR (counter = 500);
  115.   IF counter <> 500 THEN XTGeneric := counter
  116.                     ELSE XTGeneric := 0
  117. END;
  118.  
  119. FUNCTION IsInstalled: BOOLEAN;
  120. VAR
  121.   Regs: Registers;
  122. BEGIN
  123.   IF ATFunctions THEN
  124.   BEGIN
  125.     Regs.AH := $84;
  126.     Regs.DX := 0;
  127.     Intr($15, Regs);
  128.     IsInstalled := (NOT Odd(Regs.Flags));
  129.    END
  130.    ELSE
  131.    BEGIN
  132.      IsInstalled := TRUE;
  133.      Intr($11, Regs);     (* Check bei PC-XT über Konfigurationsbyte *)
  134.      IF (Regs.AH AND $80) = $80 THEN
  135.      BEGIN
  136.        IF (XTGeneric(1, 1) = 0) AND (XTGeneric(1, 2) = 0) AND
  137.           (XTGeneric(2, 1) = 0) AND (XTGeneric(2, 2) = 0) THEN
  138.           IsInstalled := FALSE
  139.         ELSE
  140.           IsInstalled := TRUE;
  141.     END
  142.     ELSE
  143.       IsInstalled := FALSE;
  144.   END;
  145. END;
  146.  
  147. PROCEDURE FireButton(VAR f1, f2, f3, f4: BOOLEAN);
  148. VAR
  149.   Regs  : Registers;
  150.   button: BYTE;
  151. BEGIN
  152.   f1 := TRUE; f2 := TRUE; f3 := TRUE; f4 := TRUE;
  153.   IF ATFunctions THEN
  154.   BEGIN
  155.     Regs.AH := $84;
  156.     Regs.DX := 0;
  157.     Intr($15, Regs);
  158.     IF NOT Odd(Regs.Flags) THEN
  159.     BEGIN
  160.       f1 := (Regs.AL AND $10) <> $10;
  161.       f2 := (Regs.AL AND $20) <> $20;
  162.       f3 := (Regs.AL AND $40) <> $40;
  163.       f4 := (Regs.AL AND $80) <> $80;
  164.     END;
  165.    END
  166.    ELSE
  167.    BEGIN
  168.      f1 := (Port[GamePort] AND $10) <> $10;
  169.      f2 := (Port[GamePort] AND $20) <> $20;
  170.      f3 := (Port[GamePort] AND $40) <> $40;
  171.      f4 := (Port[GamePort] AND $80) <> $80;
  172.   END;
  173. END;
  174.  
  175. PROCEDURE WhereXY1(VAR x, y: INTEGER);
  176. VAR
  177.   Regs: Registers;
  178. BEGIN
  179.   IF ATFunctions THEN
  180.   BEGIN
  181.     Regs.AH := $84;
  182.     Regs.DX := 1;
  183.     Intr($15, Regs);
  184.     IF NOT Odd(Regs.Flags) THEN
  185.     BEGIN
  186.       x := Regs.AX;
  187.       y := Regs.BX
  188.     END
  189.     ELSE
  190.     BEGIN
  191.       x := 0;
  192.       y := 0;
  193.     END;
  194.   END
  195.   ELSE
  196.   BEGIN
  197.     x := XTGeneric(1, 1);
  198.     y := XTGeneric(1, 2);
  199.   END;
  200. END;
  201.  
  202.  
  203. PROCEDURE WhereXY2(VAR x, y: INTEGER);
  204. VAR
  205.   Regs: Registers;
  206. BEGIN
  207.   IF ATFunctions THEN
  208.   BEGIN
  209.     Regs.AH := $84;
  210.     Regs.DX := 1;
  211.     Intr($15, Regs);
  212.     IF NOT Odd(Regs.Flags) THEN
  213.     BEGIN
  214.       x := Regs.CX;
  215.       y := Regs.DX
  216.     END
  217.     ELSE
  218.     BEGIN
  219.       x := 0;
  220.       y := 0;
  221.     END;
  222.   END
  223.   ELSE
  224.   BEGIN
  225.     x := XTGeneric(2, 1); y := XTGeneric(2, 2);
  226.   END;
  227. END;
  228.  
  229. END.
  230.  
  231. (*===================================================================*)
  232.