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)]
뭔소린지 모르겠다...
선생님... 미친신 겁니까... - dc App
ㄷㄷㄷㄷ 않이..
게임산지 30분됐는데 이거보고 환불했다
이런거 만드려면 뭐 봐야함? 참고한 자료 뭐뭐 있냐
팩토리오가 32비트 수끼리 더하는 거를 한 기계에서 할 수 있다던지, 신호가 틱 단위로 정확하게 이동된다던지 등등 여러 가지 현실보다 유리한 점이 있기 때문에 어차피 잘 알지도 못하는 cpu구조는 그냥 대략적으로 참조만 하고 맘대로 엄청 간단화시킴
Cpu 구조는
https://youtu.be/FZGugFqdr60
여기 보고 도움 많이 얻은 거 같음
일단 아무생각 없이 입력할인덱스, 입력할데이터, 출력할인덱스를 받아 동작하는 램을 만들기로 했고 우연히 전에 만든 문자 입력기에 그 구조 비슷한게 있어서 쉽게만듬 그다음엔 입력값과 연산유형을 받아서 연산값벹는 alu나 인덱스값 받아서 갖고 있던 커멘드 벹는 cmd출력기나 cmd받아서 일정 틱 딜레이한후 쏴주는 디코더는 구조가 선형적이라쉽게만들수있었음
거기에 현재 cmd 인덱스 갖고있다가 디코더에서 커멘드 받으면 그 인덱스 쏴주고 1 증기시키는 카운터 만들고 연결하니까 됨.. 그래서 이게 합쳐놓으면 복잡해보이지만 부품별로 쪼개놓으면 간단한회로라 그냥 하나씩 하니까 어떻게든 되는듯 아마 현실 cpu를 그대로 재현하려고 했으면 너무 어려워서 실패했을듯
크래시코스 이미 본 영상으로 뜨네 ㅋㅋㅋ 나중에 시간나면 한번 뜯어볼게 그리고 6502 팩토리오에서 만드는 사람도 있더라
ㄷㄷ..