;
; Read PC joystick (game) port: int joystick(int results[4], char flags)
; results = Integer array to receive the AX, AY, BX, and BY values
; flags = Bits 0,1,2,3 = Disable AX,AY,BX,BY (1 = Disable)
; Returns : Bits 0,1,2,3 = Error reading AX,AY,BX,BY (1 = Error)
; Bits 4,5,6,7 = Buttons A1,A2,B1,B2 (0 = Pressed)
;
; Values placed in 'results' will range from 0 to 'n', where 'n' is
; dependant on the speed of the hardware. Experiment with your system
; to determine the actual maximum values, and scale the results to
; the range of measurements you are taking.
;
; To add to DDS MICROC-C 8086 library: CD to LIB86 subdirectory, copy in
; this file, and issue the commands: (omit memory models you don't want)
; slib i=tiny a=joystick
; slib i=small a=joystick
;
; Copyright 1989-2000 Dave Dunfield
; All rights reserved.
;
; Permission granted for personal (non-commercial) use only.
;
joystick MOV BX,SP ;Address parms
MOV AH,2[BX] ;Get mask flags
MOV BX,4[BX] ;Get array address
MOV DX,#$0201 ;Address game port
XOR CX,CX ;Zero initial count
AND AX,#$0F00 ;Mask AH, AL=0
OUT DX,AL ;Write to I/O port
?1 IN AL,DX ;Read I/O port
OR AL,AH ;Mask already received ports
TEST AL,#$01 ;AX bit set
JNZ ?2 ;No, its not
MOV [BX],CX ;Save position
OR AH,#$01 ;Disable further AX
?2 TEST AL,#$02 ;AY bit set
JNZ ?3 ;No, try next
MOV 2[BX],CX ;Save position
OR AH,#$02 ;Disable further AY
?3 TEST AL,#$04 ;BX bit set?
JNZ ?4 ;No, try next
MOV 4[BX],CX ;Save position
OR AH,#$04 ;Disable further BX
?4 TEST AL,#$08 ;BY bit set?
JNZ ?5 ;No, try next
MOV 6[BX],CX ;Save position
OR AH,#$08 ;Disable further BY
?5 INC CX ;Advance count
JZ ?6 ;Overflow...
CMP AH,#$0F ;All bits set?
JNZ ?1 ;No, keep looking
?6 NOT AH ;Invert bits
AND AL,AH ;Set flags
XOR AH,AH ;Zero high
RET
Interested: