조이스틱 프로그래밍
도스박물관
조이스틱 (Game Port) 프로그래밍
IBM PC/XT~AT 계열에서 사용하는 조이스틱(Game Port)은 기본적으로 I/O 포트 201h을 통해 접근합니다. 두 개의 조이스틱을 지원하며, 각 조이스틱은 X/Y 축 위치와 2개의 버튼 입력을 제공합니다.
포트 201h 비트 구조
| 비트 | 기능 | 설명 |
|---|---|---|
| 0 | Joystick 1 X | 0 = 타이밍 동작 중 |
| 1 | Joystick 1 Y | 0 = 타이밍 동작 중 |
| 2 | Joystick 2 X | 0 = 타이밍 동작 중 |
| 3 | Joystick 2 Y | 0 = 타이밍 동작 중 |
| 4 | Joystick 1 버튼 1 | 0 = 눌림 |
| 5 | Joystick 1 버튼 2 | 0 = 눌림 |
| 6 | Joystick 2 버튼 1 | 0 = 눌림 |
| 7 | Joystick 2 버튼 2 | 0 = 눌림 |
Bits 0~3은 가변저항(0~100kΩ)을 사용하는 저항 기반 아날로그 입력이며, RC 타이머의 충·방전 시간을 측정하는 방식입니다.
아날로그 축 타이밍 공식
게임포트는 RC 회로 특성으로 인해 선형이 아닌 지수적 변화량을 가집니다.
time = 24.2µs + (0.011µs × resistance)
역산:
resistance = (time - 24.2) / 0.011
※ 포트 201h의 값을 읽기 전에 반드시 포트 201h에 아무 값이나 write 하여 타이머를 초기화해야 합니다.
BIOS 인터럽트를 통한 조이스틱 읽기 (INT 15h, AH=84h)
직접 RC 타이밍을 계산하지 않고, BIOS 기능을 사용할 수 있는 경우 다음 서비스를 이용할 수 있습니다.
1) 버튼 상태 읽기 (DX = 0)
INT 15h AH = 84h DX = 0
반환값(AL 비트 7~4):
| 비트 | 설명 |
|---|---|
| 4 | Joystick 1 버튼 1 (1 = 눌림) |
| 5 | Joystick 1 버튼 2 |
| 6 | Joystick 2 버튼 1 |
| 7 | Joystick 2 버튼 2 |
2) 위치(X/Y) 읽기 (DX = 1)
INT 15h AH = 84h DX = 1
반환 레지스터:
| 레지스터 | 내용 |
|---|---|
| AX | Joystick 1 X 좌표 |
| BX | Joystick 1 Y 좌표 |
| CX | Joystick 2 X 좌표 |
| DX | Joystick 2 Y 좌표 |
이 값들은 마우스와 달리 비선형 값이므로 프로그램 시작 시 다음과 같은 보정(calibration)을 하는 것이 일반적입니다.
- 중앙 위치
- 최상단-좌측
- 최하단-우측
BIOS 지원 여부 확인
아래 호출에서 Carry Flag(CF)를 확인하여 BIOS 지원 여부를 판단합니다.
- CF = 0 → 지원
- CF = 1 → 미지원
게임포트 응용: DIY 장치 연결
게임 포트는 단순한 저항·스위치 입력 장치이므로 다음과 같은 확장도 가능합니다.
- 저항값 변화를 이용한 간단한 센서 장치
- 두 개의 ON/OFF 스위치를 조이스틱 버튼처럼 동작시키기
- 가변저항 기반의 홈브류 입력 장치 제작
출처
- HELPPC 2.10 (David Hurgens)
- Gameport / Joystick Programming Reference
- https://www.fysnet.net/joystick.htm