차이점

이 페이지의 선택한 이전 버전과 현재 버전 사이의 차이점을 보여줍니다.

차이 보기로 연결

dcpu-16 [2012-04-29 11:48] (현재)
lifthrasiir 새로 만듦
줄 1: 줄 1:
 +====== DCPU-16 ======
  
 +[[Markus Persson]]이 현재 개발 중인 게임 [[0x10c]]에서 우주선을 제어하기 위한 목적으로 개발 중인 가상의 [[16비트]] [[컴퓨터]] 명세. 게임 상에서는 일종의 [[IBM PC]]와 같은 지위를 가지고 있는 것으로 가정하고 있는 것 같다.
 +
 +0x10<sup>c</sup>가 [[프로그래밍게임]]의 요소를 가지게 된 일등 공신으로서, [[레딧]]에 [[http://www.reddit.com/r/dcpu16|dcpu16]] 서브레딧이 따로 있을 정도이다. **그리고 Persson은 이 서브레딧에다가 최신 명세를 올린다.** 거의 공식 창구 취급. 게다가 이걸 해 보겠다고 [[어셈블리]]를 배우겠다는 족속들까지 생겨나서, [[sanxiyn]]은 [[DLX]], [[LC-3]]이나 [[MIX]]/[[MMIX]] 등의 교육용 아키텍처를 위협하는 새로운 대안이 아니냐는 농담 아닌 얘기를 하기까지 했다.
 +
 +아래 서술에서는 [[2012년 4월 현재]] 최신판인 1.7 명세를 기준으로 한다.
 +
 +===== 특징 =====
 +
 +게임의 기술적 배경이 1988년을 기준으로 삼고 있기 때문에 DCPU-16도 그 즈음의 아키텍처랑 비스무리하게 생겼...어야 할 것 같은데 사실은 에뮬레이션을 간단하게 하기 위해 좀 더 구린 편이다. 기술적으로는:
 +
 +  * 최소 어드레싱 단위: 16비트 = 1워드.(([[바이트]]의 기술적인 정의에 따르면 1바이트 = 16비트라는 말도 성립하는데, 기존의 "바이트"의 사용과 너무 충돌해서 명세에서 대놓고 "워드"라는 말만 쓰고 있다.))
 +  * [[램]]: 2<sup>16</sup>워드, 메모리 맵 입출력을 일부 사용한다.
 +  * [[레지스터]]: 일반 레지스터 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]''), 제한된 레지스터 자동 증감 간접((''I''/''J'' 레지스터는 ''STI''/''STD'' 명령에서 자동으로 증가되거나 감소된다.))
 +    * 산술 연산: 부호 있는 사칙연산/나머지와 부호 없는 사칙연산/나머지를 모두 지원한다. 부호가 필요할 경우 [[2의보수]]를 사용하며, 덧셈과 뺄셈의 경우 자리올림/자리내림을 위한 특수한 명령이 따로 있다([[x86]]의 ''ADC'' 같은 것). 명령 집합의 특성상 모든 연산은 16×16→32이며, 심지어 나눗셈조차도 똑같은 포맷((16비트 피연산자를 16비트 피연산자로 나눈 결과를 16.16 [[고정소숫점]] 포맷으로 변환한다.))이다(!).
 +    * 비트 연산: [[비트AND]], [[비트OR]], [[비트XOR]], 산술/논리 [[비트연산#비트시프트|시프트]]. [[비트NOT]]은 XOR을 사용하여 구현되며, 비트 시프트가 ''EX'' 레지스터를 건들기 때문에 비트 회전은 ''EX'' 레지스터와의 OR을 한 번 더 해서 구현된다.
 +    * 브랜치: ''PC''를 직접 건들 수 있어서 모든 종류의 브랜치는 ''SET PC, ...''((일부 최적화하는 어셈블러는 ''**XOR** PC, ...'' 같은 인코딩을 사용하기도 한다.))와 같은 형태로 구현된다(...). 조건부 브랜치는 ''IFE X, Y; SET PC, ...''와 같이 조건에 따라 다음 명령(그게 몇 워드라 하더라도)을 건너 뛰는 형태로 구현된다.
 +    * [[인터럽트]]: ''IA''에 설정된 인터럽트 핸들러 하나만 지원. 서로 다른 종류의 인터럽트는 ''A'' 레지스터로 구분한다. 인터럽트 핸들러가 구동 중이거나 명시적으로 요청되었을 경우(''IAQ 1'') 최대 256개까지 인터럽트를 [[큐]]에 쌓아 둘 수 있다. 그보다 많으면 [[HCF|불이 난다]]....
 +    * 하드웨어: ''HWN''/''HWQ''를 사용하여 하드웨어 나열(enumeration)을 할 수 있으며, ''HWI''를 사용해서 하드웨어에 인터럽트를 보낼 수도 있다. 반대로 하드웨어는 활성화된 경우(적어도 하드웨어 인터럽트가 한 번 이상 요청되어야 한다) 일반 소프트웨어 인터럽트를 보낼 수도 있으며, 메모리 맵 I/O를 위해 메모리를 건들거나 레지스터를 건들 수도 있다.
 +  * 속도: 기본 CPU 클럭은 **100[[헤르츠|kHz]]**. 1988년에 정말로 있던 아키텍처랑 비교해도 수십배 정도 느리다! 덕분에 사람들이 로비를 해서 비트 연산이 2사이클이던 걸 1사이클로 줄이고, ''STI''/''STD'' 같이 autoincrement/decrement를 하는 명령들도 여럿 생겨났다.
 +  * 하드웨어: 더블 버퍼링과 사용자 정의 글꼴을 지원하는 12행 32열 [[스크린]], 키보드, 최소 1/60초 단위로 동작하는 클럭 같은 게 추가될 예정이다.
 +
 +===== 바깥 링크 =====
 +
 +  * [[http://dcpu.com/doc/dcpu-16.txt|"공식" 명세]] (다만 이 명세는 현재 개발 중인 명세와 몇 버전 정도 떨어져 있다.)
 +
 +{{tag>명령집합}}

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