home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* JOYTASTE.PAS *)
- (* Speicherresidentes Programm zur Tastenemulation *)
- (* mit dem Joystick am IBM-Gameport *)
- (* *)
- (* (c) 1991 by Andreas Bartels & toolbox *)
- (* ------------------------------------------------------ *)
- PROGRAM JoyStick_Tasten_Emulation;
- (* Version 1.2 (c) Andreas Bartels & toolbox, 08.11.1990 *)
-
- {$M 1024,0,0} (* Speicherplatzbedarf beschränken ! *)
-
- USES crt, dos, graph;
-
- CONST
- (* Die Bytes $4F0 bis $4FF im RAM sind unter MS-DOS für *)
- (* den Anwender reserviert und meist nicht genutzt ... *)
-
- Inst_Check = $4FC; (* Checkbit für erfolgte Installation *)
- Start_Check = $4FD; (* Zähler *)
- N_Start = 2; (* Start immer, wenn Zähler = N_Start *)
-
- (* Zeichen als Character (ASCII-Code) *)
- (* Taste : ARRAY[1..3]
- OF ARRAY[1..3]
- OF CHAR = ( ( '7','8','9' ),
- ( '4','5','6' ),
- ( '1','2','3' ) ); *)
-
- (* Scancodes (hier, der Cursortasten + Delete) *)
- Taste : ARRAY[1..3]
- OF ARRAY[1..3] (* x : 1 2 3 *) (* y *)
- OF BYTE = ( ( 71, 72, 73 ), (* 1 *)
- ( 75, 83, 77 ), (* 2 *)
- ( 79, 80, 81 ) ); (* 3 *)
-
- VAR
- Tastatur_Puffer_Anfang : WORD absolute $40:$1A;
- Tastatur_Puffer_Ende : WORD absolute $40:$1C;
-
- altvec : POINTER;
- Taste_aktiv : BOOLEAN;
- EmByte,
- X_Mitte, Y_Mitte,
- XWert, YWert,
- T1, T2 : BYTE;
-
- PROCEDURE JoyStick_abfragen;
-
- VAR
- Regs : REGISTERS;
-
- BEGIN (* JoyStick_abfragen *)
-
- (* JoyStick-Stellung abfragen *)
- Regs.AH := $84;
- Regs.DX := $01;
- Intr( $15,Regs );
- XWert := Regs.AX;
- YWert := Regs.BX;
-
- (* TastenStellung abfragen *)
- Regs.AH := $84;
- Regs.DX := $00;
- Intr( $15,Regs);
- T1 := 1 - Lo( Regs.AX SHL 3 )SHR 7;
- T2 := 1 - Lo( Regs.AX SHL 2 )SHR 7;
-
- END; (* JoyStick_abfragen *)
-
- FUNCTION Emulierte_Taste : BYTE;
-
- (* Gibt ASCII oder Scancode der emulierten Taste zurück *)
-
- VAR
- XDig, YDig : ShortInt;
-
- BEGIN (* Emulierte_Taste *)
- JoyStick_abfragen;
-
- (* Joystick-Status in Zahl für Array 'Taste' umwandeln *)
- XDig := 2;
- IF XWert < X_Mitte * 0.7 THEN XDig := 1;
- IF XWert > X_Mitte * 1.3 THEN XDig := 3;
- YDig := 2;
- IF YWert < Y_Mitte * 0.7 THEN YDig := 3;
- IF YWert > Y_Mitte * 1.3 THEN YDig := 1;
-
- (* Nur, wenn der Joystick aktiviert ist, wird die zu *)
- (* ...................... emulierende Taste bestimmt *)
- Taste_aktiv := false;
- IF (XDig*YDig <> 4) OR (T1+T2 > 0) THEN
- Taste_aktiv := true;
-
- IF Taste_aktiv THEN BEGIN
- IF T1+T2 > 0 THEN
- Emulierte_Taste := Ord( Taste[ 2,2 ] )
- ELSE Emulierte_Taste := Ord( Taste[ YDig,XDig ] );
- END; (* IF, Taste_aktiv *)
- END; (* Emulierte_Taste *)
-
-
- PROCEDURE Emuliere_Taste_Mit_JoyStick;
- Interrupt;
-
- BEGIN (* Emuliere_Taste_Mit_JoyStick *)
- IF Mem[0:Start_Check] >= N_Start THEN BEGIN
- EmByte := Emulierte_Taste;
- IF Taste_aktiv THEN BEGIN
- IF Tastatur_Puffer_Ende + 2
- <> Tastatur_Puffer_Anfang THEN BEGIN
-
- (* Zur normalen ASCII-Tasten-Emulation *)
- (* Mem[$40:Tastatur_Puffer_Ende] := EmByte; *)
-
- (* Zur Emulation von Funktions- oder Spezialtasten wird *)
- (* .......................... der Scan-Code übermittelt *)
- Mem[$40:Tastatur_Puffer_Ende] := 0;
- Mem[$40:Tastatur_Puffer_Ende+1] := EmByte;
-
- Mem[0:Start_Check] := 0; (* Zähler neu starten *)
- INC( Tastatur_Puffer_Ende, 2 );
- IF Tastatur_Puffer_Ende >= $3D THEN
- Tastatur_Puffer_Ende := $1E;
- END; (* IF, Tastatur_Pu... *)
- END; (* IF, Taste_aktiv *)
- END; (* IF, Mem[0:Start... *)
-
- INC( Mem[0:Start_Check] );
- END; (* Emuliere_Taste_Mit_JoyStick *)
-
-
-
- BEGIN (* Hauptprogramm JoyStick_Tasten_Emulation *)
-
- (* Prüfen, ob 'JoyTaste' bereits resident geladen ist *)
- IF Mem[0:Inst_Check] = 1 THEN BEGIN
- Write( 'JoyTaste wurde bereits installiert !' );
- Exit;
- END; (* IF, Mem[0:Inst... *)
-
- (* Nullstellung des angeschlossenen Joysticks abfragen *)
- WriteLn( 'Bitte Joystick in Neutralstellung bringen und ',
- 'Taste drücken !' );
- ReadLn;
- JoyStick_abfragen;
- X_Mitte := XWert;
- Y_Mitte := YWert;
-
- (* Zähler initialisieren *)
- Mem[0:Start_Check] := 0;
-
- (* Alten Interrupt-Vektor sichern *)
- GetIntVec( $1C,altvec );
-
- (* Timer-Interrupt $1C (=28) 'verbiegen' *)
- SetIntVec( $1C,@Emuliere_Taste_Mit_JoyStick );
-
- (* Erfolgte Initialisierung eintragen *)
- Mem[0:Inst_Check] := 1;
-
- (* Programm speicherresident machen und beenden *)
- Keep( DosExitCode );
-
- END. (* Hauptprogramm JoyStick_Tasten_Emulation *)
-
- (* --------- ENDE JOYTASTE.PAS ---------------------------*)