[Back to JOYSTICK SWAG index] [Back to Main SWAG index] [Original]

    {
    Anyone know how to read the Joystick.... I only need Joy(1) read....
    I have used 1 Procedure i d/led, but all it did was tell me if the buttons
    were down (it didnt work in telling me which direction (it should of))
    }
    Program JOYSTICK;

    Uses Crt, Dos;

    (*
    WRITTEN BY JAMES P. MCADAMS - 25 DECEMBER 1984

    Program DEMONSTRATinG THE USE of TURBO PASCAL to ACCESS THE
    IBM-PC GAME CONTROL ADAPTER. THE TWO Function CALLS ARE EACH
    CompLETE in ITSELF. EITHER ONE or BOTH CAN BE MOVED to ANY
    Program THAT NEEDS THE USE of JOYSTICKS or PADDLES.
    *)

    Var
    I: Integer;
    TEMP: Byte;

       Function BUTtoN_PRESSED (WHICH_ONE: Char): Boolean;
       (* RETURN True if THE BUTtoN IS PRESSED *)
       Const
          JOYPorT = $201; (* LOCATION of THE GAME PorT *)
       Var
          MASK: Byte;
       begin
       if not (WHICH_ONE in ['A'..'D']) then WHICH_ONE := 'A';
       Case WHICH_ONE of
          'A': MASK := 16;
          'B': MASK := 32;
          'C': MASK := 64;
          'D': MASK := 128;
          end;
       BUTtoN_PRESSED := (PorT [JOYPorT] and MASK) = 0;
       end; (* BUTtoN_PRESSED *)

       Function JOYSTICK_POS (WHICH_ONE: Char): Integer;
       (*
       With A KRAFT JOYSTICK, VALUES RETURNED ARE in THE RANGE 4 to ABOUT
       140. if YOUR MACHinE RUNS FASTER THAN A STandARD IBM-PC or if YOU
       MODifY YOUR GAME ADAPTER CARD With BIGGER CAPACItoRS, YOU WILL
       GET LARGER COUNTS and YOU MUST MODifY "MAXCOUNT".

       CALLinG A JOYSTICK THAT IS not in USE or ONE THAT HAS GONE
       OVER-RANGE (COUNT REACHED MAXCOUNT) YIELDS A VALUE of 0.
       *)
       Const
          MAXCOUNT =  2000; (* MODifY THIS if YOU CAN GET LONGER COUNTS     *)
          JOYPorT  = $201; (* For inForMATION ONLY: LOC of GAME inPUT PorT *)
       Var
          COUNTER: Integer;
          MASK: Byte;
       begin
       if not (WHICH_ONE in ['A'..'D']) then WHICH_ONE := 'A';
       Case WHICH_ONE of
          'A': MASK := 1;
          'B': MASK := 2;
          'C': MASK := 4;
          'D': MASK := 8;
          end;
       (*
       THIS ASSEMBLY CODE CAUses THE CX REGISTER to COUNT doWN FROM "MAXCOUNT"
       toWARD ZERO. WHEN CX REACHES ZERO or WHEN THE ONE-SHOT ON THE GAME
       ADAPTER TIMES OUT, THE LOOPinG StoPS and "COUNTER" IS ASSIGNED THE NUMBER
       of COUNTS THAT toOK PLACE. MAXCOUNT SHOULD BE CHOSEN SO THAT CX NEVER
       REACHES 0 SO THAT THE USABLE RANGE of THE JOYSTICK WILL not BE LIMITED.
       *)
       Inline (
          $B9/MAXCOUNT/       (*       MOV CX,MAXCOUNT inITIALIZE doWN-COUNTER *)
          $BA/JOYPorT/        (*       MOV DX,JOYPorT  PorT ADDR of JOYSTICKS  *)
          $8A/$A6/MASK/       (*       MOV AH,MASK[BP] MASK For DESIRED 1-SHOT *)
          $EE/                (*       OUT DX,AL       START THE ONE-SHOTS     *)
          $EC/                (* READ: in  AL,DX       READ THE ONESHOTS       *)
          $84/$C4/            (*      TEST AL,AH       CHECK DESIRED ONE-SHOT  *)
          $E0/$FB/            (*    LOOPNZ READ        Repeat Until TIMED OUT  *)
          $89/$8E/COUNTER);   (*       MOV COUNTER[BP],CX  THIS MAKES CX AVAIL-*)
                              (*                           ABLE to TURBO       *)
       if COUNTER = 0
          then JOYSTICK_POS := 0 (* OVER-RANGE or not in USE *)
          else JOYSTICK_POS := MAXCOUNT - COUNTER;
       end; (* JOYSTICK_POS *)

    begin    (***** DEMO Program - MAin CODE *****)
    ClrScr;
    GotoXY (1, 2);
    WriteLN ('JOYSTICKS':10, 'BUTtoNS':10);
    Write   ('A':5, 'B':5, 'A':5, 'B':5);

    While True do (* PRESS CTRL C to StoP THE Program *)
       begin
       GotoXY (1, 5);
       Write (JOYSTICK_POS ('A'):5, JOYSTICK_POS ('B'):5);
       if BUTtoN_PRESSED ('A')
          then Write ('PRES':5)
          else Write ('UP':5);
       if BUTtoN_PRESSED ('B')
          then Write ('PRES':5)
          else Write ('UP':5);
       end;
    end.

[Back to JOYSTICK SWAG index] [Back to Main SWAG index] [Original]