{ 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.