Game I/O Adapter Port
Port 201H is designated as the Game Adapter Port or Joystick Port. It is
not supported by the PC/XT BIOS, but AT BIOS service INT 15H 84H provides
an easy-to-use interface for the adapter.
It is an analog-to-digital converter which can be used by scientific
measuring tools and other devices which present an analog (resistive)
input to the interface. It accepts up to four digital inputs (on/off data
such as the press of a button) and up to four resistive inputs (such as an
X-ordinate of a joystick or a temperature value from an electronic
thermometer).
The value obtained by an IN from 201H is as diagrammed:
╓─7┬─6┬─5┬─4╥─3┬─2┬─1┬─0╖
║B2│B1│A2│A1║By│Bx│Ay│Ax║
╙──┴──┴──┴──╨──┴──┴──┴──╜
╚════╦════╝ ╚═════════╩═► Coordinates (resistive, time-dependent inputs)
╚══════════════════► Buttons/Triggers (digital inputs)
You can read the buttons (digital inputs) with:
mov dx,201H
out dx,al ;initiate transaction; AL=anything
in al,dx ;read bits 4-7 for buttons: 0=pressed, 1=open
The joysticks, paddles, measuring devices (resistive inputs) are read by
tracking the time that an X or Y bit stays high (1) after an OUT 201,xxx.
To read an individual resistive input (e.g., joystick A, X ordinate):
mov dx,201H
out dx,al ;initiate transaction AL=anything
mov cx,-1 ;set resistance counter for first loop
again: in al,dx ;read the settings
inc cx ;bump counter
test al,1 ;has X-ordinate for joystick A gone low?
jnz again ;loop until it does (when bit=0, we're done)
The delay value accumulated in CX will indicate the X-ordinate position of
joystick A. The resulting value is CPU-dependent. To ensure accuracy, it
would be better to use a hardware timer, rather than a loop counter.
See Also: INT 15H 84H (joystick support)
I/O Port Map
-♦-