TIS-100
스팀 상점 페이지
gog.com
1. 개요
Zachtronics에서 출시한 프로그래밍게임. TIS-100이라는 의문의 메시지 패싱 병렬처리 아키텍쳐를 가진 가상의 기계에 어셈블리어로 프로그램을 작성하여 퍼즐을 풀어나가는 게임이다.
2016년 11월 18일, 정신적 후속작으로 SHENZHEN I/O가 출시되었다.
2. 스토리
게임을 처음 시작하면 매뉴얼을 읽겠냐는 메세지가 나오며, 매뉴얼을 열면 도전과제 RTFM이 달성된다(...).
매뉴얼의 처음 시작은 주인공의 이모[1] 인 도리스(Doris)가 주인공에게 보내는 편지로 시작된다. 편지의 내용은, TIS-100을 만든 주인공의 삼촌 랜디(Randy)가 갑작스럽게 죽음을 맞았으며, 이모는 그의 유품을 정리하던 중 이 장치를 발견하게 되어 주인공에게 이 장치를 보내며 '너라면 너의 삼촌이 무엇을 하고자 했는지 알아낼 수 있을 것이다.'라는 말로 편지가 끝나며 이후 매뉴얼이 시작된다.
이 게임에서 다루게 될 기계장치인 TIS-100은 게임 시작 시점에서 자가진단 세그먼트를 제외한 다른 세그먼트들은 고장난 상태이다. 하나의 세그먼트에는 12개의 노드가 있으며, 주어진 조건에 맞춰 노드에 어셈블리어 소스 코드를 집어넣어 조건에 맞춰 동작시키면 세그먼트가 복구됨과 동시에 다른 고장난 세그먼트들에도 접근할 수 있게 된다. 게임을 진행하다보면 통신을 전혀 할 수 없는 노드들 중에 디버그 버튼이 있는 노드가 있다. 세그먼트 하나당 하나씩은 나오며, 이 노드들을 통해 게임의 배경이 90년대라는 것을 알 수 있으며, 주인공의 삼촌이 작성해놓은 것으로 추정되는 텍스트들을 볼 수 있다.
3. TIS-100
본 게임의 플레이 대상이 되는 기계로 node라는 개별 스칼라 단위의 프로세서가 병렬로 작동하며 각각의 node는 인접한 node와 메시지 패싱으로 통신이 가능한 구조다. node 자체는 주석과 라벨을 제외한 명령어가 13개 밖에 안되는 매우 간단한 프로세서지만 메시지 패싱을 이용하여 인접 코어와 통신하여 병렬연산을 하거나 파이프라인을 만드는 등 다양한 응용이 가능하다.
3.1. 노드
- 일반 모듈 : 게임 내내 일반적으로 보게 되는 것. 명령어와 값들을 입력받아 이를 수행하는 역할을 한다. 실제로 명령어를 입력하는 모듈은 이거 하나 뿐이다.
- 스택 메모리 모듈 : 여러 개의 값을 저장하는 모듈. 어느 방향에서 입력을 받기만 하면 그 값을 저장하고, 또 어느 방향에서든 값을 읽으려 하면 그 값을 출력해준다. 쌓인 값들은 반대 순서로 출력되고, 출력된 값은 이 메모리에서 지워진다.
- 시각화 모듈 : 게임 중반부부터 보게 되는 모듈. 특정한 순서로 값을 입력받아 화면에 도트를 찍는다. 샌드박스 모드에서 이걸 이용해 동굴을 빠져나가는 게임이나 공을 받아내는 게임을 만드는 괴수들도 존재한다. 자세한 사용법은 하단의 '시각화 모듈의 사용법'을 참고하자.
3.2. 명령어
아키텍쳐 구조
- LEFT, RIGHT, UP, DOWN : 노드의 입출력 방향이다.
- ANY : 노드의 어느 방향에서든 입력을 받거나 출력할 때 사용한다. 읽을 때는 먼저 들어온 것부터 읽고, 동시에 들어오면 LAST에 기록된 방향을 읽는다. 출력도 마찬가지.
- LAST : ANY를 사용하여 마지막으로 입력을 받거나 출력한 방향.
- ACC : 노드별로 하나씩 붙어 있는 레지스터. 값을 넣어두고 더하거나 빼는 등의 조작을 할 수 있다.
- BAK : ACC의 임시 저장 장소. 역시 노드마다 하나씩 붙어있다. 이 부분은 직접 조작할 수 없고, 명령어 SWP를 사용하여 ACC와 자리를 바꾸거나, SAV를 사용하여 ACC의 값을 복사하는 것만이 가능하다.
- NIL : 일종의 Null값과 비슷한데, 숫자로는 0으로 취급된다. 이동시키는 값의 목적지가 NIL이라면 그 값은 그냥 지워지고, ACC에 NIL을 옮기면 ACC의 값이 0이 된다.
- # : 주석. # 뒤의 글자는 모두 주석이 된다.
- : : 라벨. 'LOOP:'와 같이 사용한다.
- ! : 중단점. 이 부분에 도달하면 프로그램의 실행이 일시 정지된다.
- NOP : 아무것도 하지 않는다. 다른 노드와 타이밍을 맞출 때 넣기도 하며, JRO 명령어를 사용할 때 끼워넣기도 한다. 자세한 설명은 JRO 부분에서 후술.
- MOV (위치 또는 값), (위치) : 특정한 위치의 값이나 상수를 다른 쪽으로 넘긴다. [2][3][4] MOV 명령어가 실행 중일때는 값을 입력받거나 출력할 때까지 그 노드의 실행이 중단된다.
- SWP : ACC와 BAK의 값을 서로 바꾼다.
- SAV : ACC의 값으로 BAK의 값을 덮어쓴다.
- ADD (값) : 값을 ACC에 더한다. 'ADD 3'과 같이 사용한다. 숫자 뿐만이 아니라 다른 노드에서 넘어오는 입력을 더할 수도 있다. 'ADD ACC'도 가능하여 ACC의 값을 2배로 만들 수 있다.
- SUB (값) : 값을 ACC에서 뺀다. 이 외에는 ADD와 동일.
- NEG : ACC가 음수이면 양수로, 양수이면 음수로 바꾼다.
- JMP (라벨) : 해당 라벨로 건너뛴다.
- JEZ (라벨) : ACC의 값이 0이면 해당 라벨로 건너뛴다.
- JNZ (라벨) : ACC의 값이 0이 아니면 해당 라벨로 건너뛴다.
- JGZ (라벨) : ACC의 값이 0보다 크면 해당 라벨로 건너뛴다.
- JLZ (라벨) : ACC의 값이 0보다 작으면 해당 라벨로 건너뛴다.
- JRO (값) : 현재 명령어가 위치한 라인에서 값 만큼 떨어진 위치에 있는 명령어를 실행한다. 방향은 양수이면 아래 방향, 음수이면 위 방향이다. 예를 들어, 'JRO 0'은 JRO 명령어로부터 아래로 0줄 떨어진 명령어인 'JRO 0'을 실행하게 되므로 해당 모듈의 실행상태가 완전히 정지된다. 이 명령어를 사용할 때 주의해야 할 점이, JRO 명령어가 있는 위치를 0으로 처리하므로 'JRO 1'과 같은 명령어는 그냥 아무것도 안하고 다음 명령어를 수행하는 NOP 명령어와 다를게 없다. 또한, JRO 명령어로는 아무리 큰 값을 입력해도 마지막 줄에 있는 명령어를 건너뛸 수가 없다. 따라서 음수값을 넣어 맨 위로 보내거나 맨 아래에 NOP 명령어를 삽입하여 해결할 수 있다. 여담으로, 'JRO ACC'와 같이 ACC를 사용할 수도 있다.
- HCF[5] : 기계를 강제로 종료시킨다. 물론 염소 시뮬레이터 마냥 완전히 꺼지지는 않고, 곧바로 기계가 다시 실행된다. 이 명령은 숨은 명령으로, 이 명령을 실행하는 일 자체가 스팀 과제로 등록되어 있다.
3.3. 시각화 모듈의 사용법
시각화 모듈은 크게 좌표설정, 색상입력(반복), 입력 종료의 세가지 단계를 통해 이미지를 출력한다.
- 좌표설정 : x좌표와 y좌표를 순서대로 입력받는다. 입력받은 좌표가 이미지 출력의 시작점이 된다. 좌표는 왼쪽 위 모서리를 (0, 0)으로 잡으며, x좌표는 0~29의 30칸, y좌표는 0~17의 18칸 범위를 가진다.[6] 음수는 입력 종료에 해당하므로 입력할 수 없다.
- 색상입력 : 좌표가 설정된 이후부터 입력 가능하며, 설정된 좌표로부터 오른쪽으로 한 칸씩 이동하며 입력된 색상의 이미지를 하나씩 출력한다. 색상은 0-검정[7] , 1-어두운 회색, 2-밝은 회색, 3-흰색, 4-빨간색 으로 대응된다. 단, 콘솔의 가로길이인 30을 초과하더라도 자동으로 줄 바꿈 처리가 되지 않으므로 두 줄 이상 이미지를 출력하려면 반드시 입력을 종료한 후 좌표를 새로 설정해야 한다.
- 입력 종료 : 언제든지 0보다 작은 값을 입력하게 되면 입력이 종료된다. 입력이 종료된 이후에는 다시 시작좌표를 설정해야 이미지가 출력된다.
4. 엔딩
TIS-100의 세그먼트를 일정 개수 이상 수리하면, TIS-NET이 열리면서 새로운 25개의 세그먼트에 접근할 수 있다.
이 세그먼트에도 하나씩 DEBUG 버튼이 달린 노드가 있는데, 이 버튼을 누르면 두 사람의 대화로 추정되는 내용이 나온다. 이후에는 주인공의 삼촌인 Randy까지 합세하면서 전개가 점점 급박해지는데, 이 내용을 해석해보면 TIS-100의 정체를 알아낼 수 있다.
'''TIS-100은 그냥 컴퓨터가 아니라, 다른 비슷한 평행세계들을 연결하기 위한 더 큰 시스템의 일부였다.''' 평행세계는 일반적인 방법으로 알아낼 수 없지만, TIS-100을 양자역학에서 말하는 '관측'의 도구로 사용함으로써 다른 TIS-100이 있는 세계를 '확정'하고, 그 세계로 포탈을 열어 그 세계에 있는 자원을 가져오려 한 것. 이 때문에 TIS-100끼리 양자적으로 얽혀있어서 서로 다른 연도, 다른 나라의 세 명이 같이 대화할 수 있었던 것이다.[8] 이를 피하기 위해서 이들은 TIS-100의 프로그램들을 할 수 있는대로 파손시켜 그들이 자신들의 세계를 관측하지 못 하게 막으려 한다.
맨 마지막 세그먼트를 풀면 이들이 마지막으로 남긴 대화를 볼 수 있다. 내용인즉, 이들은 결국 포탈을 막는 데 성공했으나, 그 부가적인 효과로 시간의 루프가 만들어졌다. 즉, 자신들이 찾아낸 TIS-100은 자신들이 파손시킨 TIS-100이었고, 이 세 명은 모두 이 루프를 영원히 떠돌게 되었다. 이 때 주인공의 삼촌인 랜디가 자신의 TIS-100을 창고에 넣어놨다고 말하는데, 이게 바로 플레이어가 다루고 있는 TIS-100이다.
이 이전에도 설정을 뒷받침하는 근거를 찾을 수 있는데, 대표적으로 메인 화면에서 F2를 누르면 나오는 메시지에 미 국방부와 함께 양자 정보 과학 연구소가 언급된다. 메모리 변조가 발견되는 즉시 국가안보국에 신고하라는 내용도 있는 것으로 보아, TIS-100 자체가 국가 기밀 기계로 취급된 것으로 보인다. 덤으로, 이 화면에서 독수리를 클릭하면 스팀 과제가 걸린 숨은 퍼즐을 풀 수 있다.
5. 기타
일반인 기준으로는 충공깽한 진입 난이도를 자랑한다.[9] 일단 튜토리얼이 따로 없고 사용자 매뉴얼만을 제공하고 있다. 문제는 매뉴얼이 정말 TIS-100 프로그램 개발에 쓰는 레퍼런스 매뉴얼이라 게임플레이에 대한 안내가 단 한줄도 없다는 것. 더불어 이 레퍼런스를 다 이해 못하면 플레이가 어렵다. 그러니 일단 플레이하려면 게임과 매뉴얼을 잘 읽어보고(...) 알아서 이해한 뒤 플레이해야 한다. 단 어셈블리는 매우 간단하고 명령어 종류도 적어서 이해하는 것 자체는 크게 어렵지 않다. 매뉴얼을 읽는 것이 귀찮다면 'F1'를 눌러서 간단히 정리된 명령어 목록을 볼 수 있다.
이 게임에는 '정답'이 없다. 일단 과제를 성공시키고 나면 지금까지 플레이어들의 통계와 자신의 위치를 보여줄 뿐... 즉 '얼마나 효율적으로 프로그램을 짤 수 있는지'를 보는 게 목적이다. 일례로 도전과제중 'PARALLELIZE'라는 도전과제는 신호 증폭기(SIGNAL AMPLIFIER) 세그먼트를 100 사이클 이내로 푸는 것이다.[10]
그리고 몇몇 프로그램은 버그가 있거나 난이도가 너무 높아서 그런지 업데이트되면서 짤렸다. 예를 들어 주어진 수가 소수인지를 판단해야 하는(...) 'PRIME DETECTOR' 프로그램은 삭제되었고, 일종의 버그 때문에 정상적으로는 풀 수 없었던 'PATTERN DETECTOR'는 퍼즐 구조가 변경되었다.[11]
본래 메시지 패싱이 병렬 컴퓨팅에 적합한 구조라고는 해도 TIS-100은 queue를 이용하여 비동기 통신을 하는 고급 메시지 패싱 기계가 아니기 때문에 데드락을 포함해 오만가지 거지같은 일들을 다 당해볼 수 있다.
해외 유저포럼을 보면 플레이어 가운데 프로그래머가 압도적으로 많다는 느낌이다.
[1] 원문에는 Aunt라고 적혀있다. 편지 내에서 주인공과의 관계는 정확히 알 수 없다.[2] 예를 들어 'MOV UP, DOWN'은 노드의 위에서 받는 입력을 아래의 노드로 패스한다.[3] ANY를 넣으면 모든 방향에서의 입력을 받는다.[4] MOV 0,DOWN 와 같이 아예 상수를 넘기는 것이 가능하다.[5] Halt and Catch Fire의 약자이다. 시스템 360을 위해 농담조로 작성되던 어셈블리어 용어집에서 유래하여, 한 번 실행하면 CPU가 하드 리셋 등 물리적 수단을 동원하지 않고는 탈출할 수 없는 무한 루프에 빠지는 일련의 명령어를 의미하는 단어가 되었다. Catch fire (불이 붙음)은 비유적 의미로, 아무 짓도 안 하는데 CPU는 최대 출력이니 언젠가는 타오르지 않을까 하는 농담이다.[6] 즉, 왼쪽 상단 끝의 좌표가 (0, 0), 오른쪽 하단 끝의 좌표가 (29, 17)이 된다.[7] 검은색이 바탕이라 안찍히는 것 같지만 제대로 찍히고 있다![8] 쉽게 풀어 설명하면, 원자의 '상태'는 관측하기 전까지는 여러 가능성이 공존하고 있다가, 관측을 하면 하나의 상태로 확정된다는 논리를 확장한 것이다. 포탈을 안정되게 여려면 어떤 세계로 향하는 지 정확히 알아야 하는데, 그러기 위해서 TIS-100을 사용하여 다른 세계를 관측, 확정시킨 것. [9] 프로그램이 아니라 퍼즐로 생각하고, 좀 불친절한 게임이라는 점을 감안 하면 그다지 진입 난이도가 높은 편은 아니다[10] 방법을 대강 설명하자면 주어지는 입력값을 두 방향으로 분산시켜서 한 번에 두 개를 처리하는 것이다.[11] 원래 과제는 입력에서 1, 5, 4가 연속으로 나오면 1을 출력하라는 것인데, 어떻게 프로그램을 짜도 1, 1, 5, 4나 1, 5, 1, 5, 4가 나오면 패턴을 찾을 방법이 없다... 그럼에도 클리어가 되는 이유는 두 번째 테스트가 랜덤이라 저 두 패턴이 나오지 않을 때가 있기 때문.