ㅎㅇ
여기서 설명한 기능들 전부 구현한 cpu임.
근데 테스트는 하나하나 자세히 안해봐서 기능이 다 되는지는 모름.

RAM에서 데이터는 32비트 수 * 384 만큼 저장가능하고
커맨드는 360개 넣을 수 있음.

https://factorioprints.com/view/-MXs4NugVEx0H5sZkErU






<사용방법>

오른쪽의 조합기들에 신호를 등록해서 프로그램을 입력함.

위쪽의 조합기 두 개 중 오른쪽 거를 껐다가 키면 작동 시작됨.

왼쪽 거를 껐다가 키면 램이 초기화됨.


(용어설명)

RAM:I_Data : 램에 입력할 데이터

RAM:I_Index : 램에 입력하는 데이터가 저장될 번지수

--RAM:I_Data 랑 RAM:I_Index를 동시에 입력해주면 1틱 뒤 램에 해당 데이터가 저장됨.

RAM:O_Index : 램에서 출력할 데이터의 번지수.

--입력하면 1틱 뒤 해당 번지에서 데이터가 출력된다.

--출력된 데이터는 바로 ALU에서 하는 연산의 첫 번째 항으로 들어가고 (A + B 라면 A), 바로 1틱 후 두 번째 항(A + B라면 B)로 들어간다.

--예를 들어 1틱째에 RAM: O_Index를 5만큼 주었다면 2틱째엔 ALU에서 A가 [5] (램의 5번째에 저장되어있던 수를 뜻함)가 되고 3틱째엔 B가 [5]가 됨.

--2번쨰 예로 RAM:O_Index를 1틱째에 2, 2틱쨰에 3 출력한다면 2틱째에 A가 [2], 3틱째에 A가[3], B가 [2], 4틱째에 B가 [3]이 된다.

RAM:Output : RAM:O_Index신호를 입력 후 1틱 뒤 RAM에서 출력되는 값

ALU:Calc : ALU에서 할 연산을 결정한다.

--데이터 두 개가 ALU에 입력되고 1틱 후에 입력한다.

--예를들어 바로 위 예제에서 3틱쨰에 A가 [3]이고 B가 [2]이므로 4틱째에 ALU:Calc 신호를 입력하면 된다.

--신호는 1~34의 값을 가지는데, 1~17번은 순서대로 +, -, *, /, %, ^(제곱), <<, >>, &, |, ^(xor), >, <, =, >=, <=, != 이며

--18번부터는 A + B 이던 것이 B + A로 바뀌는식이다.

--ALU:Calc 신호를 입력하고 1틱뒤엔 연산값이 ALU에서 출력된다.

ALU:Output : ALU:Calc 신호를 입력하고 1틱 후에 ALU에서 출력되는 값.

--자동으로 RAM:I_Data로 들어간다.

JMP: 점프할 명령어 수.

--다음 실행할 명령어는 여기에 입력한 수만큼 앞뒤고 점프된다.

--실행 속도는 0틱이므로 JMP신호와 동시에 다음 명령어로 넘어가도 된다.

--3번째 명령어를 실행할 때 JMP에 1을 입력하면 다음 명령어는 4번째가 아닌 5번째가 되며, -2를 입력했다면 2번째가 된다.

PRT: 외부로 값을 출력한다.


(명령어)


해체계획기 * 1 : 프로그램 종료

청사진 * N : N+2틱 후 다음 커맨드를 실행함.

이번 커맨드의 실행 시간이 5틱이면 거기에 청사진 신호를 3만큼 포함하면 됨.


저장탱크 * N : 1틱째에 RAM:O_Index를 N만큼 준다

노랑벨트 * N, 화력투입기 * M : N+1틱째에 RAM:O_Index를 M만큼 준다.

빨강벨트 * N, 투입기 * M : 위와 같다. 한 명령어에서 램에서 데이터를 여러 번 뽑기 위해 여러 개를 만들었다.

파랑벨트 * N, 긴팔투입기 * M : 위와 같다. 아래 모두 계속 위와 같다.

노랑지하벨트, 빠른투입기

~

노랑분배기, 붂음선별투입기

빨강분배기, 원유배럴 : 위와같다. 계속 위와 같다

파랑분배기, 중유배럴

나무, 경유베럴

석탄, 윤활유배럴

~

구리광석, 물배럴

우라늄광석, 구리전선

물고기, 철막대기


돌용광로 * N : N틱쨰에 나오는 ALU:Output신호를 그 다음 틱에 RAM:O_Index로 들어가게 해준디.

강철용광로 * N : 위와동일

전기용광로 * N : 위와동일


화력채광드릴 * N : N틱쨰에 나오는 RAM:Output신호를 그 다음 틱에 RAM:O_Index로 들어가게 해준디.

전기채광드릴 * N : 위와동일

해안펌프 * N : 위와동일


로켓연료 * N : JMP에 N만큼 입력

핵연료(원전말고 태우는용) * N : N틱째에 나오는 ALU:Output신호를 그 다음 틱에 JMP로 들어가게 해준다.

외골격 * N : N틱째에 나오는 RAM:Output신호를 그 다음 틱에 JMP로 들어가게 해준다.


기관포탑 * N : PRT에 N만큼 입력

레이저포탑 * N : N틱째에 나오는 ALU:Output신호를 그 다음 틱에 PRT로 들어가게 해준다.

화염방사포탑 * N : N틱째에 나오는 RAM:Output신호를 그 다음 틱에 PRT로 들어가게 해준다.


조명 * N, 산술연산조합기* M : N+1틱째에 ALU:Calc신호를 M만큼 보낸다

빨간전선, 수량비교조합기 : 위와동일

초록전선, 일정신호조합기 : 위와동일


속도모튤1~3 * N, 효율모듈1~3 * M : N+1틱째에 ALU의 A+B에서 B에 M만큼 준다.

1~17번은 A+B에서 B가 M이되는거고 18~34번은 B+A에서 B가 M이된다.

생산모듈1~3 * N : N틱째에 나오는 ALU:Output신호를 그 다음 틱에 B로 들어가게 해준다.


나무상자 * N : 1틱째에 RAM:I_Index신호를 N만큼 준다

철상자 * N, 강철상자 * M : N+1틱째에 RAM:I_Index신호를 M만큼 준다

파이프 * N : N틱째에 나오는 ALU:Output 신호를 다음 틱에 RAM:I_Index로 들어가게 해준다

지하파이프 * N : N틱째에 나오는 RAM:Output 신호를 다음 틱에 RAM:I_Index로 들어가게 해준다


신호기 * N : 1틱째에 RAM:I_Data 신호를 N만큼 준다

로켓격납고 * N, 인공위성 * M : N+1틱째에 RAM:I_Data 신호를 M만큼 준다

복구팩 * N : N틱째에 나오는 RAM:Output 신호를 다음 틱에 RAM:I_Data 로 들어가게 해준다




<시용예시>


나무상자4(N) 신호기3(M) 청사진1 : [4(N)] = 3(M)

저장탱크 4(N) 노랑벨트 1 화력투입기 5(M) 조명 3 산술연산조합기 2(O) 철상자 4 강철상자 7(P) 청사진 3 : [5(M)] -(O) [4(N)] = [7(P)]

저장탱크 4(N) 화력채광드릴 1 노랑벨트 3 화력투입기 5(M) 조명 5 산술연산조합기 3(O) 철상자 6 강철상자 7(P) 청사진 5 : [5(M)] *(O) [[4(N)]] = [7(P)]

저장탱크 6(N) 외골격 1 청사진 1 : JUMP [6]

저장탱크 6(N) 노랑벨트 1 화력투입기 5(M) 조명 3 산술연산조합기 4(O) 레이저포탑 5 청사진 3 : PRINT [5(M)] /(O) [6(N)]