조이스틱 프로그래밍

도스박물관
둘러보기로 이동검색으로 이동

조이스틱 (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 스위치를 조이스틱 버튼처럼 동작시키기
  • 가변저항 기반의 홈브류 입력 장치 제작

출처