home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 02 / praxis / joytaste.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1990-11-16  |  5.2 KB  |  168 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     JOYTASTE.PAS                       *)
  3. (*    Speicherresidentes Programm zur Tastenemulation     *)
  4. (*           mit dem Joystick am IBM-Gameport             *)
  5. (*                                                        *)
  6. (*       (c) 1991 by Andreas Bartels  &  toolbox          *)
  7. (* ------------------------------------------------------ *)
  8. PROGRAM JoyStick_Tasten_Emulation;
  9. (* Version 1.2 (c) Andreas Bartels & toolbox, 08.11.1990  *)
  10.  
  11. {$M 1024,0,0} (* Speicherplatzbedarf beschränken ! *)
  12.  
  13. USES crt, dos, graph;
  14.  
  15. CONST
  16.   (* Die Bytes $4F0 bis $4FF im RAM sind unter MS-DOS für *)
  17.   (* den Anwender reserviert und meist nicht genutzt ...  *)
  18.  
  19. Inst_Check  = $4FC; (* Checkbit für erfolgte Installation *)
  20. Start_Check = $4FD; (* Zähler *)
  21. N_Start     = 2;    (* Start immer, wenn Zähler = N_Start *)
  22.  
  23. (* Zeichen als Character (ASCII-Code) *)
  24. (* Taste       :    ARRAY[1..3]
  25.                  OF ARRAY[1..3]
  26.                  OF CHAR        = (  ( '7','8','9' ),
  27.                                      ( '4','5','6' ),
  28.                                      ( '1','2','3' )  );  *)
  29.  
  30. (* Scancodes (hier, der Cursortasten + Delete) *)
  31. Taste       : ARRAY[1..3]
  32.               OF ARRAY[1..3]  (* x : 1   2   3 *)    (* y *)
  33.               OF BYTE        = (  ( 71, 72, 73 ),    (* 1 *)
  34.                                   ( 75, 83, 77 ),    (* 2 *)
  35.                                   ( 79, 80, 81 )  ); (* 3 *)
  36.  
  37. VAR
  38.       Tastatur_Puffer_Anfang : WORD absolute $40:$1A;
  39.       Tastatur_Puffer_Ende   : WORD absolute $40:$1C;
  40.  
  41.       altvec                 : POINTER;
  42.       Taste_aktiv            : BOOLEAN;
  43.       EmByte,
  44.       X_Mitte, Y_Mitte,
  45.       XWert, YWert,
  46.       T1, T2                 : BYTE;
  47.  
  48. PROCEDURE JoyStick_abfragen;
  49.  
  50. VAR
  51.       Regs : REGISTERS;
  52.  
  53. BEGIN (* JoyStick_abfragen *)
  54.  
  55.   (* JoyStick-Stellung abfragen *)
  56.   Regs.AH := $84;
  57.   Regs.DX := $01;
  58.   Intr( $15,Regs );
  59.   XWert := Regs.AX;
  60.   YWert := Regs.BX;
  61.  
  62.   (* TastenStellung abfragen *)
  63.   Regs.AH := $84;
  64.   Regs.DX := $00;
  65.   Intr( $15,Regs);
  66.   T1 := 1 - Lo( Regs.AX SHL 3 )SHR 7;
  67.   T2 := 1 - Lo( Regs.AX SHL 2 )SHR 7;
  68.  
  69. END;  (* JoyStick_abfragen *)
  70.  
  71. FUNCTION Emulierte_Taste : BYTE;
  72.  
  73. (*  Gibt  ASCII oder Scancode der emulierten Taste zurück *)
  74.  
  75. VAR
  76.       XDig, YDig : ShortInt;
  77.  
  78. BEGIN (* Emulierte_Taste *)
  79.   JoyStick_abfragen;
  80.  
  81.  (*  Joystick-Status in Zahl  für Array 'Taste' umwandeln *)
  82.   XDig := 2;
  83.   IF XWert < X_Mitte * 0.7 THEN XDig :=  1;
  84.   IF XWert > X_Mitte * 1.3 THEN XDig :=  3;
  85.   YDig := 2;
  86.   IF YWert < Y_Mitte * 0.7 THEN YDig :=  3;
  87.   IF YWert > Y_Mitte * 1.3 THEN YDig :=  1;
  88.  
  89.   (* Nur, wenn  der  Joystick  aktiviert ist, wird die zu *)
  90.   (* ......................  emulierende  Taste  bestimmt *)
  91.   Taste_aktiv := false;
  92.   IF (XDig*YDig <> 4) OR (T1+T2 > 0) THEN
  93.      Taste_aktiv := true;
  94.  
  95.   IF Taste_aktiv THEN  BEGIN
  96.      IF T1+T2 > 0 THEN
  97.           Emulierte_Taste := Ord( Taste[ 2,2 ] )
  98.      ELSE Emulierte_Taste := Ord( Taste[ YDig,XDig ] );
  99.   END; (* IF, Taste_aktiv *)
  100. END;  (* Emulierte_Taste *)
  101.  
  102.  
  103. PROCEDURE Emuliere_Taste_Mit_JoyStick;
  104. Interrupt;
  105.  
  106. BEGIN (* Emuliere_Taste_Mit_JoyStick *)
  107.   IF Mem[0:Start_Check] >= N_Start THEN  BEGIN
  108.      EmByte := Emulierte_Taste;
  109.      IF Taste_aktiv THEN  BEGIN
  110.         IF   Tastatur_Puffer_Ende + 2
  111.           <> Tastatur_Puffer_Anfang     THEN  BEGIN
  112.  
  113. (*   Zur  normalen  ASCII-Tasten-Emulation                *)
  114. (*         Mem[$40:Tastatur_Puffer_Ende]   := EmByte;     *)
  115.  
  116. (*  Zur Emulation von Funktions- oder Spezialtasten wird  *)
  117. (*  .......................... der Scan-Code übermittelt  *)
  118.            Mem[$40:Tastatur_Puffer_Ende]   := 0;
  119.            Mem[$40:Tastatur_Puffer_Ende+1] := EmByte;
  120.  
  121.            Mem[0:Start_Check] := 0; (* Zähler neu starten *)
  122.            INC( Tastatur_Puffer_Ende, 2 );
  123.            IF Tastatur_Puffer_Ende >= $3D THEN
  124.               Tastatur_Puffer_Ende := $1E;
  125.         END;                        (* IF, Tastatur_Pu... *)
  126.      END;                           (* IF, Taste_aktiv    *)
  127.   END;                              (* IF, Mem[0:Start... *)
  128.  
  129.   INC( Mem[0:Start_Check] );
  130. END;                       (* Emuliere_Taste_Mit_JoyStick *)
  131.  
  132.  
  133.  
  134. BEGIN  (* Hauptprogramm JoyStick_Tasten_Emulation *)
  135.  
  136.     (* Prüfen, ob 'JoyTaste' bereits resident geladen ist *)
  137.   IF Mem[0:Inst_Check] = 1 THEN  BEGIN
  138.    Write( 'JoyTaste wurde bereits installiert !' );
  139.     Exit;
  140.   END;                               (* IF, Mem[0:Inst... *)
  141.  
  142.   (* Nullstellung  des angeschlossenen Joysticks abfragen *)
  143.   WriteLn( 'Bitte Joystick in Neutralstellung bringen und ',
  144.            'Taste drücken !' );
  145.   ReadLn;
  146.   JoyStick_abfragen;
  147.   X_Mitte :=  XWert;
  148.   Y_Mitte :=  YWert;
  149.  
  150.   (* Zähler initialisieren *)
  151.   Mem[0:Start_Check] :=  0;
  152.  
  153.   (* Alten Interrupt-Vektor sichern *)
  154.   GetIntVec( $1C,altvec );
  155.  
  156.   (* Timer-Interrupt $1C (=28) 'verbiegen' *)
  157.   SetIntVec( $1C,@Emuliere_Taste_Mit_JoyStick );
  158.  
  159.   (* Erfolgte Initialisierung eintragen *)
  160.   Mem[0:Inst_Check] := 1;
  161.  
  162.   (* Programm speicherresident machen und beenden *)
  163.   Keep( DosExitCode );
  164.  
  165. END. (* Hauptprogramm JoyStick_Tasten_Emulation *)
  166.  
  167. (* --------- ENDE JOYTASTE.PAS ---------------------------*)
  168.