
Ich habe einmal auf diese Art zwei Lichtschranken bedient und damit die
Geschwindigkeit von Fahrzeugen gemessen - war ein Projekt im Rahmen des
Jugend-Ferienprogramms in unserem Kaff.

Den Kindern hat's Spass gemacht: 'Wie schnell sind meine Rollschuhe?'

Ergebnis: das schnellste Auto (Wohngebiet, direkt am Kindergarten, Tempo 30)
schaffte 80 km/h (war meine Verwandtschaft :-)))) ).

Der GamePort ist normalerweise ueber Port $201 abzufragen:

(aus HelpPC 1.15 von David Jurgens:)

       76543210 Port at 201h used with Joysticks
                joystick a, x coord (0 = timing active)
               joystick a, y coord (0 = timing active)
              joystick b, x coord (0 = timing active)
             joystick b, y coord (0 = timing active)
            joystick a, button 1 (0=pressed)
           joystick a, button 2 (0=pressed)
          joystick b, button 1 (0=pressed)
         joystick b, button 2 (0=pressed)

       - accessed through port 201h
       - bits 3-0 are resistive inputs with the length of the pulse
         determined by 0-100K ohm resistive load.   Use this formula:

       time = 24.2 + ( 0.011 * resistance )
       or
       resistance = ( time - 24.2 ) / 0.011


       - a read should be immediately preceded by a write (any data)
         to to start timing for the resistive values.

Button-Abfrage:
if (Port[$201] and $10)=0 then ... (Joystick 1, Button 1 gedrueckt)
if (Port[$201] and $20)=0 then ... (Joystick 1, Button 2 gedrueckt)
if (Port[$201] and $40)=0 then ... (Joystick 2, Button 1 gedrueckt)
if (Port[$201] and $80)=0 then ... (Joystick 2, Button 1 gedrueckt)

Joystick-Stellungen:

   {$F+}
   function Joystick (n : byte) : longint;   {n = Port 1 bis 4}
      begin
         asm
            CLI {Keine Interrupts}
            MOV CL,n
            DEC CL
            AND CL,3
            MOV AH,1
            SHL AH,CL
            MOV DX,$201
            XOR CX,CX
            MOV AL,$FF
            OUT DX,AL

         @zaehle1:
            IN   AL,DX
            TEST AL,AH
            JE   @stabil
            LOOP @zaehle1
            JMP  @error

         @stabil:
            MOV CH,AH    {Port sichern}
            XOR AL,AL    {Timer Start}
            OUT $43,AL
            MOV AL,$A    {00001010b}
            OUT $20,AL
            IN  AL,$20
            MOV CL,AL
            IN  AL,$40
            MOV BL,AL
            IN  AL,$40
            MOV BH,AL
            MOV AX,$40
            MOV ES,AX
            MOV DX,WORD PTR ES:[6Ch]
            NOT BX
            TEST CL,1
            JZ  @exit1
            CMP BX,2
            JBE @exit1
            INC DX
         @exit1:
            MOV SI,BX     {Lo}
            MOV DI,DX     {Hi}

            MOV DX,$201
            MOV AH,CH     {Port wieder laden}
            XOR CX,CX     {Timeout-Zaehler}
            MOV AL,$FF
            OUT DX,AL

         @zaehle2:
            IN   AL,DX
            TEST AL,AH
            JE   @stop
            LOOP @zaehle2

         @stop:
            XOR AL,AL          {Timer stop}
            OUT $43,AL
            MOV AL,$A          {00001010b}
            OUT $20,AL
            IN  AL,$20
            MOV CL,AL
            IN  AL,$40
            MOV BL,AL
            IN  AL,$40
            MOV BH,AL
            MOV AX,40h
            MOV ES,AX
            MOV DX,WORD PTR ES:[6Ch]
            NOT BX
            TEST CL,1
            JZ  @exit2
            CMP BX,2
            JBE @exit2
            INC DX

         @exit2:
            SUB BX,SI      {Lo}
            SBB DX,DI      {Hi}
            JAE @ende      {Wenn Carry, dann Error}

         @error:
            XOR BX,BX
            XOR DX,DX

         @ende:
            MOV [BP-4],BX  {Lo}
            MOV [BP-2],DX  {Hi}
            STI            {Interrupts erlauben}
      end;
   end;


liefert fuer den angegebenen Stick (Joystick 1, X-Koordinate .. 2/Y) einen Wert,
der von der Stellung des Joysticks abhaengig ist.

Joystick abfragen
-----------------

Sprache : Borland Turbo Pascal 6.0
--------------------------------------------------------------------------
UNIT JoyStick;

INTERFACE

FUNCTION  JoyStickX:WORD;
FUNCTION  JoyStickY:WORD;
FUNCTION  JoyButton1:BOOLEAN;
FUNCTION  JoyButton2:BOOLEAN;

IMPLEMENTATION

USES crt;

FUNCTION JoyStickX:WORD;
BEGIN
    INLINE($1E/
           $50/
           $52/
           $56/
           $BA/$01/$02/
           $B4/$01/
           $BE/$00/$00/
           $8E/$DE/
           $FA/
           $EE/
           $46/
           $EC/
           $84/$C4/
           $75/$FA/
           $FB/
           $89/$36/$64/$12/
           $5E/
           $5A/
           $58/
           $1F);
    JoyStickX:=MemW[0:$1264];
 END;


 FUNCTION JoyStickY:WORD;
 BEGIN
    INLINE($1E/
           $50/
           $52/
           $56/
           $BA/$01/$02/
           $B4/$02/
           $BE/$00/$00/
           $8E/$DE/
           $FA/
           $EE/
           $46/
           $EC/
           $84/$C4/
           $75/$FA/
           $FB/
           $89/$36/$64/$12/
           $5E/
           $5A/
           $58/
           $1F);
    JoyStickY:=MemW[0:$1264];
 END;


 FUNCTION JoyButton1:BOOLEAN;
 BEGIN
   JoyButton1:=(Port[$201] AND 16)=0;
 END;

 FUNCTION JoyButton2:BOOLEAN;
 BEGIN
   JoyButton2:=(Port[$201] AND 32)=0;
 END;

 END.
 [20] PASCAL.GER (2:2449/820)  PASCAL.GER 
 Msg  : 595  von  720 -377                                                      
 Von  : Stefan Frings                       2:2433/107.2    Mi, 01 Nov 95 14:17 
 An   : Michael Schnick                                                         
 Subj : Re: Gameport auslesen - wie??                                           

^play: LUSTIG.YMS

*Hallo* *Michael*,


MS> Ich muss evtl. den Gameport auslesen und will mich schon einmal informieren
MS> zu diesem Thema.

MS> Wer hat eine Source, mit der ich in der Lage bin, Werte aus dem Gameport
MS> auszulesen und sie als Integerwerte erhalte.


Source nein, aber einen Text:

Der Gameport des PC
===================


Der Gameport wird durch die Portadresse $201 angesprochen. Durch schreiben
eines beliebigen Wertes wird ein Messvorgang gestartet. Je nach Position
des Knueppels geht das entsprechende Bit frueher oder spaeter auf Low. Die Zeit
haengt etwa linear von der Position des Knueppels ab. Die Feuertatsen koennen
davon unabhaengig direkt abgefragt werden.

b0: X-Achse Joystick 1
b1: Y-Achse Joystick 1
b2: X-Achse Joystick 2
b3: Y-Achse Joystick 2
b4: Feuertaste 1 links
b5: Feuertaste 1 rechts
b6: Feuertaste 2 links
b7: feuertaste 2 rechts


Elektrische Daten:

Die Feuertasten werden zwischen Gnd und dem Eingang geschaltet. Die Potis
werden zwischen +5V und dem Eingang geschaltet. Sie duerfen 1kOhm bis 1MOhm
haben, normalerweise werden 200kOhm potis verwendet (100kOhm in Mittelstel-
lung).

1    +5V
2    Taste 1 links
3    Joystick 1 X-Achse
4    Gnd
5    Gnd
6    Joystick 1 Y-Achse
7    Taste 1 rechts
8    +5V
9    +5V
10   Taste 2 links
11   Joystick 2 X-Achse
12   Gnd
13   Taste 2 rechts
14   Joystick 2 Y-Achse
15   +5V


Bei Soundkarten:

Pin 12: Midi Ausgang (invertiert)
Pin 15: Midi Eingang (invertiert)
