DCPU-16

Markus Persson이 현재 개발 중인 게임 0x10c에서 우주선을 제어하기 위한 목적으로 개발 중인 가상의 16비트 컴퓨터 명세. 게임 상에서는 일종의 IBM PC와 같은 지위를 가지고 있는 것으로 가정하고 있는 것 같다.

0x10c프로그래밍게임의 요소를 가지게 된 일등 공신으로서, 레딧dcpu16 서브레딧이 따로 있을 정도이다. 그리고 Persson은 이 서브레딧에다가 최신 명세를 올린다. 거의 공식 창구 취급. 게다가 이걸 해 보겠다고 어셈블리를 배우겠다는 족속들까지 생겨나서, sanxiynDLX, LC-3이나 MIX/MMIX 등의 교육용 아키텍처를 위협하는 새로운 대안이 아니냐는 농담 아닌 얘기를 하기까지 했다.

아래 서술에서는 2012년 4월 현재 최신판인 1.7 명세를 기준으로 한다.

특징

게임의 기술적 배경이 1988년을 기준으로 삼고 있기 때문에 DCPU-16도 그 즈음의 아키텍처랑 비스무리하게 생겼…어야 할 것 같은데 사실은 에뮬레이션을 간단하게 하기 위해 좀 더 구린 편이다. 기술적으로는:

  • 최소 어드레싱 단위: 16비트 = 1워드.1)
  • : 216워드, 메모리 맵 입출력을 일부 사용한다.
  • 레지스터: 일반 레지스터 8개(A/B/C/X/Y/Z/I/J), 명령 포인터(PC), 스택 포인터(SP), 오버플로 레지스터(EX), 인터럽트 핸들러(IA).
  • 명령집합: 1~3워드 가변. 첫 워드가 명령(5비트)과 첫 피연산자(5비트), 그리고 둘째 피연산자(6비트)를 모두 들고 있기 때문에 디코딩은 쉬운 편이다.
    • 어드레싱모드: 상수(42), 레지스터(A), 절대([42]), 레지스터 간접([A]), 레지스터 상대([A+42]), 스택 포인터 상대([SP+42]), 스택 포인터 자동 증감 간접([SP++][–SP]), 제한된 레지스터 자동 증감 간접2)
    • 산술 연산: 부호 있는 사칙연산/나머지와 부호 없는 사칙연산/나머지를 모두 지원한다. 부호가 필요할 경우 2의보수를 사용하며, 덧셈과 뺄셈의 경우 자리올림/자리내림을 위한 특수한 명령이 따로 있다(x86ADC 같은 것). 명령 집합의 특성상 모든 연산은 16×16→32이며, 심지어 나눗셈조차도 똑같은 포맷3)이다(!).
    • 비트 연산: AND, OR, XOR, 산술/논리 시프트. NOT은 XOR을 사용하여 구현되며, 비트 시프트가 EX 레지스터를 건들기 때문에 비트 회전은 EX 레지스터와의 OR을 한 번 더 해서 구현된다.
    • 브랜치: PC를 직접 건들 수 있어서 모든 종류의 브랜치는 SET PC, …4)와 같은 형태로 구현된다(…). 조건부 브랜치는 IFE X, Y; SET PC, …와 같이 조건에 따라 다음 명령(그게 몇 워드라 하더라도)을 건너 뛰는 형태로 구현된다.
    • 인터럽트: IA에 설정된 인터럽트 핸들러 하나만 지원. 서로 다른 종류의 인터럽트는 A 레지스터로 구분한다. 인터럽트 핸들러가 구동 중이거나 명시적으로 요청되었을 경우(IAQ 1) 최대 256개까지 인터럽트를 에 쌓아 둘 수 있다. 그보다 많으면 불이 난다….
    • 하드웨어: HWN/HWQ를 사용하여 하드웨어 나열(enumeration)을 할 수 있으며, HWI를 사용해서 하드웨어에 인터럽트를 보낼 수도 있다. 반대로 하드웨어는 활성화된 경우(적어도 하드웨어 인터럽트가 한 번 이상 요청되어야 한다) 일반 소프트웨어 인터럽트를 보낼 수도 있으며, 메모리 맵 I/O를 위해 메모리를 건들거나 레지스터를 건들 수도 있다.
  • 속도: 기본 CPU 클럭은 100kHz. 1988년에 정말로 있던 아키텍처랑 비교해도 수십배 정도 느리다! 덕분에 사람들이 로비를 해서 비트 연산이 2사이클이던 걸 1사이클로 줄이고, STI/STD 같이 autoincrement/decrement를 하는 명령들도 여럿 생겨났다.
  • 하드웨어: 더블 버퍼링과 사용자 정의 글꼴을 지원하는 12행 32열 스크린, 키보드, 최소 1/60초 단위로 동작하는 클럭 같은 게 추가될 예정이다.

바깥 링크

  • "공식" 명세 (다만 이 명세는 현재 개발 중인 명세와 몇 버전 정도 떨어져 있다.)
1) 바이트의 기술적인 정의에 따르면 1바이트 = 16비트라는 말도 성립하는데, 기존의 "바이트"의 사용과 너무 충돌해서 명세에서 대놓고 "워드"라는 말만 쓰고 있다.
2) I/J 레지스터는 STI/STD 명령에서 자동으로 증가되거나 감소된다.
3) 16비트 피연산자를 16비트 피연산자로 나눈 결과를 16.16 고정소숫점 포맷으로 변환한다.
4) 일부 최적화하는 어셈블러는 XOR PC, … 같은 인코딩을 사용하기도 한다.

도쿠위키DokuWiki-custom(rev 9085d92e02)을 씁니다.
마지막 수정 2012-04-29 11:48 | 작성자 lifthrasiir