home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / joystick.swg / 0002_JOYSTCK2.PAS.pas < prev    next >
Pascal/Delphi Source File  |  1993-05-28  |  4KB  |  109 lines

  1. {
  2. Anyone know how to read the Joystick.... I only need Joy(1) read....
  3. I have used 1 Procedure i d/led, but all it did was tell me if the buttons
  4. were down (it didnt work in telling me which direction (it should of))
  5. }
  6. Program JOYSTICK;
  7.  
  8. Uses Crt, Dos;
  9.  
  10. (*
  11. WRITTEN BY JAMES P. MCADAMS - 25 DECEMBER 1984
  12.  
  13. Program DEMONSTRATinG THE USE of TURBO PASCAL to ACCESS THE
  14. IBM-PC GAME CONTROL ADAPTER. THE TWO Function CALLS ARE EACH
  15. CompLETE in ITSELF. EITHER ONE or BOTH CAN BE MOVED to ANY
  16. Program THAT NEEDS THE USE of JOYSTICKS or PADDLES.
  17. *)
  18.  
  19.  
  20.  
  21. Var
  22. I: Integer;
  23. TEMP: Byte;
  24.  
  25.  
  26.    Function BUTtoN_PRESSED (WHICH_ONE: Char): Boolean;
  27.    (* RETURN True if THE BUTtoN IS PRESSED *)
  28.    Const
  29.       JOYPorT = $201; (* LOCATION of THE GAME PorT *)
  30.    Var
  31.       MASK: Byte;
  32.    begin
  33.    if not (WHICH_ONE in ['A'..'D']) then WHICH_ONE := 'A';
  34.    Case WHICH_ONE of
  35.       'A': MASK := 16;
  36.       'B': MASK := 32;
  37.       'C': MASK := 64;
  38.       'D': MASK := 128;
  39.       end;
  40.    BUTtoN_PRESSED := (PorT [JOYPorT] and MASK) = 0;
  41.    end; (* BUTtoN_PRESSED *)
  42.  
  43.  
  44.    Function JOYSTICK_POS (WHICH_ONE: Char): Integer;
  45.    (*
  46.    With A KRAFT JOYSTICK, VALUES RETURNED ARE in THE RANGE 4 to ABOUT
  47.    140. if YOUR MACHinE RUNS FASTER THAN A STandARD IBM-PC or if YOU
  48.    MODifY YOUR GAME ADAPTER CARD With BIGGER CAPACItoRS, YOU WILL
  49.    GET LARGER COUNTS and YOU MUST MODifY "MAXCOUNT".
  50.  
  51.    CALLinG A JOYSTICK THAT IS not in USE or ONE THAT HAS GONE
  52.    OVER-RANGE (COUNT REACHED MAXCOUNT) YIELDS A VALUE of 0.
  53.    *)
  54.    Const
  55.       MAXCOUNT =  2000; (* MODifY THIS if YOU CAN GET LONGER COUNTS     *)
  56.       JOYPorT  = $201; (* For inForMATION ONLY: LOC of GAME inPUT PorT *)
  57.    Var
  58.       COUNTER: Integer;
  59.       MASK: Byte;
  60.    begin
  61.    if not (WHICH_ONE in ['A'..'D']) then WHICH_ONE := 'A';
  62.    Case WHICH_ONE of
  63.       'A': MASK := 1;
  64.       'B': MASK := 2;
  65.       'C': MASK := 4;
  66.       'D': MASK := 8;
  67.       end;
  68.    (*
  69.    THIS ASSEMBLY CODE CAUses THE CX REGISTER to COUNT doWN FROM "MAXCOUNT"
  70.    toWARD ZERO. WHEN CX REACHES ZERO or WHEN THE ONE-SHOT ON THE GAME
  71.    ADAPTER TIMES OUT, THE LOOPinG StoPS and "COUNTER" IS ASSIGNED THE NUMBER
  72.    of COUNTS THAT toOK PLACE. MAXCOUNT SHOULD BE CHOSEN SO THAT CX NEVER
  73.    REACHES 0 SO THAT THE USABLE RANGE of THE JOYSTICK WILL not BE LIMITED.
  74.    *)
  75.    Inline (
  76.       $B9/MAXCOUNT/       (*       MOV CX,MAXCOUNT inITIALIZE doWN-COUNTER *)
  77.       $BA/JOYPorT/        (*       MOV DX,JOYPorT  PorT ADDR of JOYSTICKS  *)
  78.       $8A/$A6/MASK/       (*       MOV AH,MASK[BP] MASK For DESIRED 1-SHOT *)
  79.       $EE/                (*       OUT DX,AL       START THE ONE-SHOTS     *)
  80.       $EC/                (* READ: in  AL,DX       READ THE ONESHOTS       *)
  81.       $84/$C4/            (*      TEST AL,AH       CHECK DESIRED ONE-SHOT  *)
  82.       $E0/$FB/            (*    LOOPNZ READ        Repeat Until TIMED OUT  *)
  83.       $89/$8E/COUNTER);   (*       MOV COUNTER[BP],CX  THIS MAKES CX AVAIL-*)
  84.                           (*                           ABLE to TURBO       *)
  85.    if COUNTER = 0
  86.       then JOYSTICK_POS := 0 (* OVER-RANGE or not in USE *)
  87.       else JOYSTICK_POS := MAXCOUNT - COUNTER;
  88.    end; (* JOYSTICK_POS *)
  89.  
  90.  
  91. begin    (***** DEMO Program - MAin CODE *****)
  92. ClrScr;
  93. GotoXY (1, 2);
  94. WriteLN ('JOYSTICKS':10, 'BUTtoNS':10);
  95. Write   ('A':5, 'B':5, 'A':5, 'B':5);
  96.  
  97. While True do (* PRESS CTRL C to StoP THE Program *)
  98.    begin
  99.    GotoXY (1, 5);
  100.    Write (JOYSTICK_POS ('A'):5, JOYSTICK_POS ('B'):5);
  101.    if BUTtoN_PRESSED ('A')
  102.       then Write ('PRES':5)
  103.       else Write ('UP':5);
  104.    if BUTtoN_PRESSED ('B')
  105.       then Write ('PRES':5)
  106.       else Write ('UP':5);
  107.    end;
  108. end.
  109.