;
; 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: