CHIP-8에 대해 공부하게 된 계기
CHIP-8은 가상 머신에서 실행되는 저수준 명령어 체계입니다. 운영체제를 공부하면서 CPU, 메모리, 레지스터 같은 컴퓨터 구조의 개념을 접하게 되었고, 이를 직접 구현해보며 더 깊게 이해하고 싶어 CHIP-8을 공부하게 되었습니다.
CHIP-8 에뮬레이터라고 부르지만, 실제 하드웨어를 에뮬레이션하는 것이 아니라 CHIP-8 명령어를 해석하고 실행하는 인터프리터를 작성하는 작업에 가깝습니다.
역사
1977년 당시 게임을 개발하는 과정은 매우 어려웠습니다. 게임을 만들기 위해서는 CPU가 직접 이해할 수 있는 복잡한 기계어를 사용해야 했기 때문입니다.
이를 더 쉽게 만들기 위해 RCA의 엔지니어인 조 웨이스베커(Joseph Weisbecker)는 CHIP-8이라는 새로운 실행 환경을 만들었습니다.
여기까지만 들으면 CHIP-8이 프로그래밍 언어라고 생각할 수도 있습니다. 하지만 CHIP-8은 단순한 언어가 아니라 가상의 작은 컴퓨터 시스템입니다.
┌──────────────────┐
│ CHIP-8 │
│ │
│ CPU │
│ 메모리 │
│ 화면 │
│ 키보드 │
└──────────────────┘
실제 컴퓨터에서는 다음과 같은 구조로 동작합니다.
실제 컴퓨터
↓
CHIP-8 인터프리터 실행
↓
그 안에서 CHIP-8 게임 실행
구성 요소
메모리(RAM)
CHIP-8은 총 4096개의 메모리 공간을 가지고 있습니다.
이 메모리에는 다음과 같은 데이터가 저장됩니다.
- 게임
- 그림
- 숫자
즉, 게임 실행에 필요한 모든 정보가 메모리에 저장됩니다.
레지스터
CHIP-8에는 16개의 8비트 범용 레지스터가 존재합니다.
V0
V1
V2
...
VF
각 레지스터는 개발자가 원하는 값을 저장하는 용도로 사용할 수 있습니다.
예를 들어
V0 = 플레이어 X좌표
V1 = 플레이어 Y좌표
V2 = 점수
처럼 사용할 수 있습니다.
프로그램 카운터(PC)
프로그램 카운터(Program Counter)는 현재 실행해야 하는 명령어의 위치를 저장합니다.
예를 들어
PC = 200
이라면 메모리 주소 200에 있는 명령어를 실행한다는 의미입니다.
CHIP-8의 명령어는 항상 2바이트 크기이기 때문에 명령어를 실행한 후 PC는 다음과 같이 증가합니다.
PC = 200 → PC = 202
인덱스 레지스터(I)
인덱스 레지스터 I는 특정 데이터가 저장된 메모리 주소를 가리킬 때 사용합니다.
예를 들어 메모리 0x300부터 그림 데이터가 저장되어 있다고 가정해봅시다.
주소
0x300 11110000
0x301 10010000
0x302 10010000
0x303 11110000
컴퓨터는 그림이 어디에 저장되어 있는지 알아야 화면에 출력할 수 있습니다.
따라서,
I = 0x300
으로 저장하면 I는 그림 데이터가 시작되는 위치를 기억하게 됩니다.
스택
처음에는 CHIP-8에 스택이 왜 필요한지 의문이 들었습니다. 하지만 함수 호출 과정을 이해하면서 스택이 중요한 역할을 한다는 것을 알게 되었습니다.
예를 들어 슈팅 게임의 실행 흐름이 다음과 같다고 가정해봅시다.
게임 시작
플레이어 이동
적 이동
총알 쏘기
점수 계산
다음 프레임
총알을 발사하는 과정에서는 여러 작업이 필요합니다.
- 총알 위치 정하기
- 총알 방향 정하기
- 총알 효과음 재생하기
- 총알 애니메이션 재생하기
이 작업들을 하나의 함수로 만들어 관리할 수 있습니다.
0x500: ShootBullet()
- 총알 생성
- 위치 설정
- 방향 설정
- 효과음 재생
- 종료
게임을 실행중:
0x200 게임 시작
0x202 플레이어 이동
0x204 적 이동
0x206 ShootBullet() 호출 ← 현재 실행 중
0x208 점수 계산
0x20A 다음 프레임
현재 명령어가 0x206이라면 ShootBullet() 함수가 있는 0x500으로 이동합니다.
하지만 함수 실행이 끝난 후 어디로 돌아가야 하는지 알아야 합니다.
그래서 함수 호출 전에 돌아갈 주소를 스택에 저장합니다.
스택
┌────────┐
│0x208 │
└────────┘
함수가 종료되면 스택에서 0x208을 꺼내 다시 실행을 이어갑니다.
화면
CHIP-8의 화면 크기는 64x32 픽셀입니다.
각 픽셀은 0과 1로 표현되며, 흑백 화면으로 출력됩니다.
키패드
CHIP-8은 16개의 버튼을 가지고 있습니다.

// COSMAC VIP 키패드
1 2 3 C
4 5 6 D
7 8 9 E
A 0 B F
// 최신 PC 키패드
1 2 3 4
Q W E R
A S D F
Z X C V
게임에서는 다음과 같이 입력을 확인합니다.
"5번 버튼 눌렸나?"
"A 버튼 눌렸나?"
게임 실행
CHIP-8 인터프리터는 아래 과정을 초당 수백 번 반복합니다.
명령 읽기
↓
무슨 뜻인지 해석
↓
실행
↓
다음 명령
이 과정을 반복하면서 게임이 실행됩니다.
화면에 그림
CHIP-8에서는 그림을 스프라이트(Sprite)라는 작은 데이터 형태로 저장합니다.
예를 들어:
11110000
10010000
10010000
11110000
이라는 데이터가 있다면 화면에는 다음과 같이 출력됩니다.
■■■■
■□□■
■□□■
■■■■
이처럼 작은 픽셀 데이터 조합을 이용해 캐릭터와 게임 요소를 표현합니다.