Skip to content

Instantly share code, notes, and snippets.

@bivoje
Last active April 18, 2024 19:52
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bivoje/a426fdb8e8e5e449e6e5d3b0599824b5 to your computer and use it in GitHub Desktop.
Save bivoje/a426fdb8e8e5e449e6e5d3b0599824b5 to your computer and use it in GitHub Desktop.
Markdown 포맷으로 변환된 TIS-100 매뉴얼 한국어 번역

TIS-100

Tessellated Intelligence System


레퍼런스 매뉴얼

음--

랜디 삼촌이 갑자기 돌아가신 일은 아직도 충격적이구나. 조사관이 사망 원인을 알려주길 기다리는 동안 컴퓨터나 다른 유품들을 정리하는 중이란다. 한번은 차고를 보러 갔는데 나한테는 전부 고철더미로 보일 뿐이더구나. 나중에 사진도 찍어서 보내줄게.

일단 그이가 죽을 때까지 남편의 작업대에 놓여있던 장치를 같이 보냈단다. 아마도 너라면 이걸로 그이가 뭘 하고 있었는지 알아낼 수 있을거야. 네 삼촌도 하던 일을 누군가가 끝마쳐주는 편이 좋으실테지.

사랑을 담아,

도리스 이모가.

개요

Tessellated Intelligence System 은 다수의 아기종 노드들이 비균등하게 연결된 초 병렬 컴퓨터 아키텍쳐입니다. Tessellated Intelligence System 은 자동화된 금융거래, 대용량 데이터 수집, 민간인 행동 분석과 같은 복잡한 데이터 스트림 처리에 효과적입니다.

참고: 본 매뉴얼의 이러한 '참고'표시들은 특별한 주의를 요하거나 다른 문서를 참조해서 추가 정보를 얻을 수 있을 때 삽입됩니다.

시스템 구조 및 조직

Tessellated Intelligence System 은 기판에 조립된 수많은 독립 노드들로 이루어져있습니다. (특정 기기에 있는 노드 수는 각 모델의 매뉴얼을 참조하십시오.) 노드 타입은 크게 연산과 기억, 그 외 몇가지 변화형으로 분류될 수 있습니다.

대부분의 노드는 최대 4개의 이웃노드와 포트를 통해 연결됩니다. 포트는 노드 간에 간단한 메세지 교환을 지원합니다. 포트를 통한 통신은 한 노드가 포트에 읽기/쓰기를 수행한 후 반대편 노드가 쓰기/읽기를 할 때까지 기다리는 방식으로 조율됩니다.

참고: 두 노드가 서로에게 동일한 통신 명령(읽기나 쓰기)을 수행하면 교착상태에 빠져 하드웨어 오류가 발생합니다. 포트를 효율적이고 안전하게 사용하는 방법에 관해서는 별도의 문서 "Tessellated Intelligence System 모범 예제 - 노드 간 통신 패턴"을 참고하십시오.

참고: 만약 노드가 통신 명령을 내렸는데 반대편 노드가 대응하지 않는다면, 해당 노드는 교착상태에 빠지고 하드웨어 오류가 발생합니다. (규칙에 예외사항 존재; 자세한 내용은 각 노드 타입에 대한 문서를 참조) 포트를 효율적이고 안전하게 사용하는 방법에 관해서는 "Tessellated Intelligence System 모범 예제 - 노드 간 통신 패턴"을 참고하십시오.

참고: 이 문서에선 노드 통신 작업 혹은 명령의 동기화나 시간 당 처리량에 대해 다루지 않습니다. 해당 사항은 하드웨어 모델과 버전에 따라 달라 집니다. 특정 기기의 기능에 관한 자세한 설명은 각 모델의 매뉴얼을 참고하십시오.

노드 타입 T20 - 보류됨

참고: 이 노드 타입은 Tessellated Intelligence System 의 특정 모델에만 사용되도록 제한되었으며 따라서 본 문서에서 서술되지 않습니다. 노드 타입 T20에 관한 문서는 해당 타입의 노드를 포함한 장치에만 동봉되어 배포됩니다. 허가 없이 이 노드에 관한 문서의 사본을 요청할 시, 관련 법에 의거해 국가안전부에 통보됩니다. ???

노드 타입 T21 - 기본 실행 노드

1. 아키텍처

기본 실행 노드Tessellated Intelligence System 의 작동에 핵심 역할을 수행합니다. 연산은 기본 실행 노드 안에서 수행되거나 특별 연산 노드 혹은 기억 노드 에 위임될 수 있습니다.

기본 실행 노드기본 실행 노드 명령어 집합 에 맞게 정의된 프로그램을 실행합니다. 기본 실행 노드 프로그램 은 계산 작업이나 통신 작업들을 지시합니다. 작업들은 프로그램의 첫 명령어부터 시작해 순서대로 실행됩니다. 프로그램의 마지막 명령어를 수행한 후엔, 자동으로 첫 명령어로 돌아가 실행을 계속합니다. 이런 특성으로, 연속반복 작업을 하도록 작성된 프로그램에는 기본 실행 노드 가 자주 사용됩니다.

Tessellated Intelligence System 의 모든 노드에 포함된 공통된 통신포트와 더불어, 기본 실행 노드 는 프로그램 실행에 사용되는 몇 개의 레지스터를 가지고 있습니다. 기본 실행 노드 에 이 외에 추가적인 저장공간은 없습니다; 추가적인 저장공간이 필요하다면 다른 기본 실행 노드기억 노드 를 같이 사용해야 합니다.

모든 레지스터는 -999에서 999사이의 (경계포함) 정수값을 저장합니다. 레지스터 값이 어떻게 비트로 저장될지는 구현체에 따라 다릅니다. 다만, 레지스터의 구현에 관한 지식은 기본 실행 노드 를 프로그래밍 하는데 필요하지 않습니다.

1-1. ACC

종류: 내부 레지스터

설명: ACC는 기본 실행 노드 의 기본적인 기억 레지스터입니다. ACC 산술 명령어나 조건 명령어를 비롯한 많은 명령어의 암묵적인 입력인자 또는 출력대상 역할을 합니다.

1-2. BAK

종류: 내부 레지스터 (직접 접근 불가)

설명: BAK는 임시 ACC 값의 임시 저장 레지스터입니다. SAV와 SWP 명령어를 통해 접근 가능하며 직접 읽거나 쓸 수 없습니다.

1-3. NIL

종류: 내부 레지스터 (특수)

설명: NIL의 값을 읽으면 0을 받게 됩니다. NIL에 값을 써도 아무 효과가 없습니다. 명령어의 계산 결과는 버리고 부가효과만을 필요로 한다면 NIL을 출력지로 사용할 수 있습니다.

1-4. LEFT, RIGHT, UP, DOWN

종류: 포트

설명: 4개의 통신 레지스터, UP, DOWN, LEFT, RIGHT는 기본 실행 노드 가 주변의 노드들과 통신하기 위해 사용하는 4개의 포트에 각각 대응합니다. 어떤 포트는 하드웨어적으로 다른 노드와 연결이 끊겨있을 수 있습니다. 그런 포트에 읽기나 쓰기 지시를 내린다면 그 상태로 무한정 기다리게 됩니다. 특정 노드에서 어떤 포트를 사용할 수 있는지 확인하려면 노드의 연결 도해를 참조하십시오.

1-5. ANY

종류: 포트 (유사포트)

설명: ANY가 명령어의 입력인자로 쓰였을 경우, 명령어는 어떤 포트로부터건 가장 먼저 들어오는 값을 읽어 사용합니다. ANY가 출력대상으로 쓰였을 경우 이 노드가 가진 포트에 가장 먼저 읽기 지시를 내린 노드에 값이 전달됩니다.

1-6. LAST

종류: 포트 (유사포트)

설명: LAST는 ANY 유사포트를 써서 마지막으로 읽거나 쓴 포트를 가리킵니다. 그 외에는 포트를 직접 명시한것과 동일하게 작동합니다. ANY 유사포트를 이용해 성공적인 읽기나 쓰기가 한번이라도 이루어지기 전에 LAST에 읽거나 쓰기를 수행한다면, 결과는 구현체에 따라 달라집니다. LAST 유사포트의 사용법을 보여주는 예제 코드는 "Tessellated Intelligence System 모범 예제 - 노드 통신 패턴"을 참조하십시오.

2. 명령어 집합

<SRC>나 <DST> 명령어 인자로 포트나 내부 레지스터를 사용할 수 있습니다. 포트를 사용하면 그 포트는 연결된 노드가 값을 읽거나 써서 통신을 완료할때까지 실행을 지연시킵니다. 또한, <SRC>에는 -999에서 999사이의 (경계포함) 정수 상수값을 쓸 수도 있습니다.

BAK는 <SRC>나 <DST> 인자로 사용될 수 없습니다. BAK의 값은 SAV와 SWP 명령어를 사용해서만 접근할 수 있습니다.

<LABEL> 인자는 프로그램 안의 점프지점을 지칭하기 위한 임의의 문자열 이름을 받습니다.

2-1. 주석

문법: # COMMENT TEXT

설명: #과 그 뒤의 모든 문자는 무시됩니다.

참고: 두 개의 주석기호 (##) 뒤에 오는 문장은, 존재할 경우, 프로그램의 제목으로 사용됩니다. 제목은 디버거에서 프로그램을 훑어보기 쉽도록 표기됩니다.

2-2. 레이블

문법: <LABEL>:

설명: 레이블은 점프지점 명시하기 위해 사용됩니다. 점프지점으로 사용되었을 경우 레이블 이후에 오는 명령어가 다음으로 실행됩니다.

예시:

LOOP:               한 줄 째로 레이블로 사용합니다.
L: MOVE 8, ACC      레이블과 명령어를 같은 줄에 쓸 수도 있습니다.

2-3. NOP

문법: NOP

동치 문법: ADD NIL

설명: NOP은 노드의 내부상태나 통신 포트에 아무 작용도 하지 않는 유사 명령어입니다. NOP은 자동으로 ADD NIL 명령어로 치환됩니다.

2-4. MOV

문법: MOV <SRC>, <DST>

설명: <SRC>의 값을 읽어서 <DST>에 씁니다.

예시:

MOV 8, ACC          정수상수 8 값이 ACC 레지스터에 저장됩니다.
MOV LEFT, RIGHT     LEFT 포트에서 값 하나를 읽어와 RIGHT 포트에 씁니다.
MOV UP, NIL         UP 포트에서 값 하나를 읽어와서는 무시합니다.

2-5. SWP

문법: SWP

설명: ACC와 BAK의 값을 서로 뒤바꿉니다.

2-6. SAV

문법: SAV

설명: ACC의 값을 BAK에 덮어씁니다.

2-7. ADD

문법: ADD <SRC>

설명: <SRC>의 값과 ACC의 값을 더한 결과를 ACC에 덮어씁니다.

예시:

ADD 16      상수값 16이 ACC 레지스터의 값에 더해집니다.
ADD LEFT    LEFT 포트에서 값 하나를 읽어 ACC에 더합니다.

2-8. SUB

문법: SUB <SRC>

설명: ACC의 값에서 <SRC>의 값을 뺀 결과가 ACC에 덮어쓰입니다.

예시:

SUB 16      상수값 16이 ACC 레지스터의 값에서 감산됩니다.
SUB LEFT    LEFT 포트에서 읽어온 값 만큼 ACC에서 감산됩니다.

2-9. NEG

문법: NEG

설명: ACC의 값의 부호를 바꿉니다. 0 값은 변하지 않습니다.

2-10. JMP

문법: JMP <LABEL>

설명: 조건없이 실행전이합니다. <LABEL> 레이블 아래에 있는 명령어가 다음에 수행됩니다.

2-11. JEZ

문법: JEZ <LABEL>

설명: 조건부로 실행전이합니다. ACC의 값이 0인 경우 <LABEL> 레이블 아래에 있는 명령어가 실행됩니다.

2-12. JNZ

문법: JNZ <LABEL>

설명: 조건부로 실행전이합니다. ACC의 값이 0이 아닌경우 <LABEL> 레이블 아래에 있는 명령어가 실행됩니다.

2-13. JGZ

문법: JGZ <LABEL>

설명: 조건부로 실행전이합니다. ACC의 값이 양수인 경우 (0 초과) <LABEL> 레이블 아래에 있는 명령어가 실행됩니다.

2-14. JLZ

문법: JLZ <LABEL>

설명: 조건부로 실행전이합니다. ACC의 값이 음수인 경우 (0 미만) <LABEL> 레이블 아래에 있는 명령어가 실행됩니다.

2-15. JRO

문법: JRO <SRC>

설명: 조건없이 실행전이합니다. 현재 명령어 위치에서 <SRC> 만큼 이동한 명령어가 다음에 실행됩니다.

예시:

JRO 0       현재 명령어가 다음에도 실행됩니다. 효과적으로 실행을 무기한 중단합니다.
JRO -1      직전의 명령어가 이 다음에 실행됩니다.
JRO 2       직후의 명령어를 건너뛰고 그 다음 명령어부터 실행합니다.
JRO ACC     다음 실행할 명령어가 ACC 값에 따라 결정됩니다. !!

3. 예시 프로그램

아래의 예시 프로그램은 LEFT 포트에서 순차적으로 값을 읽어, 두 배 한 후 RIGHT 포트에 씁니다. 기본 실행 노드의 자동반복 특성으로, 마지막 줄이 실행된 후 다시 맨 첫 줄부터 계속 실행됩니다.

MOV LEFT, ACC       LEFT 포트에서 ACC 레지스터로 값을 읽어옵니다.
ADD ACC             ACC에 ACC값을 더해 두 배로 만듭니다.
MOV ACC, RIGHT      ACC 레지스터의 값을 RIGHT 포트에 씁니다.

아래의 예시 프로그램은 UP 포트에서 순차적으로 값을 읽어, 양수는 RIGHT 포트에, 음수는 LEFT 포트에 씁니다. 0인 값은 버려집니다.

START:
  MOV UP, ACC      UP  포트에서 ACC 레지스터로 값을 읽어옵니다.
  JGZ POSITIVE      ACC 값이 0보다 크다면 "POSITIVE"로 점프합니다.
  JIZ NEGATIVE      ACC 값이 0보다 작다면 "NEGATIVE"로 점프합니다.
  JMP START         값이 양수도 음수도 아닙니다. "START"로 점프합니다.
POSITIVE:
  MOV ACC, RIGHT    ACC 레지스터의 값을 RIGHT에 씁니다. 
  JMP START         "START"로 점프합니다.
NEGATIVE:
  MOV ACC, LEFT     ACC 레지스터의 값을 LEFT에 씁니다. 
  JMP START         "START"로 점프합니다.

노드 타입 T30 - 스택 기억 노드

1. 구조

스택 기억 노드 는 간단한 스택기반 통신 프로토콜을 이용해 대량의 값을 읽거나 쓸 수 있습니다. (특정 기기에 있는 스택 기억 노드 의 용량은 각 모델의 매뉴얼을 참조하십시오)

2. 통신 프로토콜

모든 스택 기억 노드 와의 통신은 포트를 통해 이루어집니다. 스택 기억 노드 에 쓰기 지시를 내리면 그 값이 스택의 맨 윗부분에 추가됩니다. 스택이 꽉 찼다면 공간이 생길때까지 쓰기 지시가 지연됩니다. 스택 기억 노드 에 읽기 지시를 내리면 스택의 맨 위 값을 지우고 그 값을 돌려줍니다. 스택이 비었다면 어딘가에서 값이 들어올때까지 읽기 지시가 지연됩니다.

스택 기억 노드 는 보통 다수의 다른 노드들과 연결되어 여러 노드와 지시를 받을 수 있습니다. 스택 기억 노드 에 동시에 읽기와 쓰기 지시가 들어오는 경우, 어느 것이 먼저 수행될지는 알 수 없습니다. 다만, 각 지시는 통신 프로토콜에 규정된 대로 처리됩니다. 스택 기억 노드 를 다수의 노드와 효율적이고 구상대로 사용하는 법에 대해서는 "Tessellated Intelligence System 모범예제 - 노드 통신 패턴"을 참고하십시오.

노드 타입 T31 - 임의 접근 기억 노드

주목: 임의 접근 기억 노드는 현재로썬 표준 Tessellated Intelligence System 장치에 포함되지 않습니다. 관심있는 사용자들은 에뮬레이터와 초기형prototype 하드웨어를 이용해 볼 수 있습니다. 기술 명세와 작동이 확정되지 않아 본 문서에서 누락됩니다.

할 일 목록

- 누가 TIS-100을 중고시장에 팔았는지 알아내기

- 시그널 증폭기signal multiplier 다시 만들기

- 부분 최적화에 관한 책 찾기

- 자동차 번호판 갱신하기

내장 대화형 디버거

1. 키보드 단축키

대화형 디버거는 아래의 키보드 단축키를 지원합니다.

  • Control-Z: 마지막 수정 취소
  • Control-Y: 마지막 수정 복원
  • Control-X: 클립보드에 선택된 영역 잘라내기
  • Control-C: 클립보드에 선택된 영역 복사
  • Control-V: 클립보드 내용 붙여넣기
  • Control-Arrow: 근처 실행 노드로 이동
  • F1: 명령어 집합 빠른참조 보기
  • F2: 변조방지 인증 보기 ??
  • F5: 현재 프로그램 시작
  • F6: 현재 프로그램 멈춤 / 한 줄 실행

2. 중단점breakpoint

중단점을 설정하려면 줄의 시작에 느낌표 (!)를 추가하십시오. 중단점을 설정하면 해당 줄을 실행하기 전에 프로그램이 멈춥니다. 한 줄씩 실행해서 디버깅하기엔 너무 오래걸리는 경우, 중단점을 이용해 간편히 할 수 있습니다.

MOV LEFT, ACC
!ADD ACC            프로그램이 이 명령을 실행하기 직전에 멈춤니다.
MOV ACC, DOWN

시각화 모듈

1. 시각화 모듈의 사용

TIS-100 은 프로그램이 이미지를 생성하고 화면에 표시할 수 있도록 하는 시각화 모듈을 포함합니다. 모듈의 내용은 연속된 숫자 지시를 통해 변경할 수 있습니다. 지시는 x좌표, y좌표, 1개 이상의 색 값, 마지막 음수 값 (주로 -1)로 이루어집니다. 좌표 체계는 화면구역의 좌상단을 기준으로 (0,0)에서 시작합니다.

시각화 모듈은 다음의 색 값을 지원합니다. 0. 검정

  1. 어두운 회색
  2. 밝은 회색
  3. 하얀색
  4. 빨간색

2. 시각화 모듈 해상도

표준 TIS-100 의 시각화 모듈은 가로 30글자, 세로 18글자를 표현할 수 있습니다.

image console sandbox 는 가로 36글자, 세로 22글자로 확장된 시각화 모듈을 가지고 있습니다.

3. 예시 지시열

0, 0, 3, -1                 모듈의 화면 좌상단 모서리에 하얀 픽셀 하나를 그립니다.
0, 0, 4, 4, 4, 4, 4, -1     모듈의 화면 좌상단 모서리에 빨간색 가로줄을 그립니다.
@bivoje
Copy link
Author

bivoje commented Jan 20, 2022

깃헙 기본 포매팅 방식이 html 태그 임베딩을 삭제하기때문에 몇몇 장식적 효과가 보이지 않습니다. 다른 온라인 에디터에 마크다운 원본을 붙여넣고 프리뷰를 하면 제대로 볼 수 있습니다.
노란 배경글은 삼촌이 매뉴얼에 칠한 형광펜, 예제 외의 연한 회색은 삼촌의 볼펜글씨입니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment