아폴로 항법 컴퓨터 | 1966
Apollo Guidance Computer
아폴로 항법 컴퓨터(AGC)는 아폴로 프로그램을 위해 제작된 디지털 컴퓨터로, 각 아폴로 명령 모듈(CM)과 아폴로 달 착륙선(LM)에 탑재되었다. AGC는 우주선의 항법, 내비게이션, 제어를 위한 계산과 전자 인터페이스를 제공했다. 이 컴퓨터는 실리콘 집적 회로(IC)를 기반으로 한 첫 번째 컴퓨터였으며, 성능은 1970년대 후반의 첫 번째 가정용 컴퓨터들인 애플 II, TRS-80, 코모도르 PET과 비슷했다.
AGC는 16비트 워드 길이를 가지며, 15개의 데이터 비트와 1개의 패리티 비트를 포함하고 있다. AGC의 대부분 소프트웨어는 '코어 로프 메모리'라는 특수한 읽기 전용 메모리에 저장되었는데, 이는 자성 코어를 통해 와이어를 엮어 만든 것이다. 또한 작은 크기의 읽기/쓰기 코어 메모리도 존재했다.
우주비행사들은 DSKY(디스플레이 및 키보드, "DIS-kee"라고 발음)라는 숫자 표시기와 키보드를 사용해 AGC와 소통했다. AGC와 DSKY 사용자 인터페이스는 1960년대 초 아폴로 프로그램을 위해 MIT 계측 연구소에서 개발되었으며, 1966년 처음으로 비행을 시작했다.
프로젝트 제미니에서는 우주비행사들이 조종석을 통해 수동으로 비행했지만, 아폴로 프로젝트에서는 대부분 컴퓨터가 비행을 담당했으며, 달 착륙 시에만 잠시 수동 비행이 이루어졌다. 달 임무마다 두 개의 AGC가 탑재되었으며, 하나는 명령 모듈에, 또 하나는 아폴로 달 착륙선에 설치되었다. 단, 아폴로 7호는 지구 궤도 임무였고, 아폴로 8호는 달 궤도 임무를 위해 달 착륙선이 필요 없었다. 명령 모듈에 탑재된 AGC는 그 항법, 내비게이션, 제어(GNC) 시스템의 중심이었다. 달 착륙선에 탑재된 AGC는 아폴로 PGNCS(주 항법, 내비게이션, 제어 시스템)를 작동시켰고, 이 시스템은 '핑스(pings)'라고 발음되었다.
각 달 임무에는 두 대의 추가 컴퓨터가 있었다. 하나는 새턴 V 로켓의 발사체 디지털 컴퓨터(LVDC)로, 발사체의 계측 링에 장착되었고, 또 다른 하나는 달 착륙선의 비상 항법 시스템(AGS, 'ags'로 발음됨)이었다. AGS는 달 착륙선의 PGNCS가 고장 날 경우에 사용되었으며, 달에서 이륙하고 명령 모듈과 재회할 수 있었지만 착륙은 할 수 없었다.
AGC의 설계는 MIT 계측 연구소에서 찰스 스타크 드래퍼의 지도 하에 이루어졌으며, 하드웨어 설계는 엘던 C. 홀(Eldon C. Hall)이 주도했다. 초기의 아키텍처 작업은 J.H. 라닝(J.H. Laning Jr.), 알버트 홉킨스(Albert Hopkins), 리차드 배틴(Richard Battin), 라몬 알론소(Ramon Alonso), 휴 블레어-스미스(Hugh Blair-Smith) 등이 수행했다. 비행 하드웨어는 레이시온(Raytheon)에서 제작했으며, 허브 탈러(Herb Thaler)도 아키텍처 팀의 일원이었다.
IC 기술이 1963년의 인터플래네터리 모니터링 플랫폼(IMP)에서 처음 사용된 후, AGC에서도 집적 회로(IC) 기술이 채택되었다. 아폴로 비행 컴퓨터는 실리콘 IC 칩을 사용한 첫 번째 컴퓨터였다. 블록 I 버전은 4,100개의 IC를 사용했으며, 각 IC는 단일 3입력 NOR 게이트를 포함하고 있었다. 이후 블록 II 버전(유인 비행에 사용된 버전)은 약 2,800개의 IC를 사용했으며, 대부분은 듀얼 3입력 NOR 게이트였고, 소수의 확장기와 감지 증폭기도 포함되었다. 이 IC들은 페어차일드 반도체(Fairchild Semiconductor)에서 생산되었으며, 저항-트랜지스터 논리(RTL) 방식으로 제작되었다. 이 IC들은 플랫 팩 형태로 만들어졌으며, 와이어 랩으로 연결된 후, 그 배선은 주물 에폭시 플라스틱에 내장되었다.
AGC에서 사용된 하나의 IC 유형(듀얼 3입력 NOR)은 다른 초기 IC 컴퓨터 설계에서 발생한 문제를 피할 수 있게 해주었다. 예를 들어, 미닛맨 II 미사일의 유도 컴퓨터는 다수의 다이오드-트랜지스터 논리와 다이오드 논리 게이트를 혼합하여 사용했기 때문에 문제가 발생했다. NOR 게이트는 모든 다른 게이트를 만들 수 있는 보편적인 논리 게이트이지만, 더 많은 게이트를 사용해야 한다는 단점이 있었다.
AGC의 메모리는 2,048개의 지워질 수 있는 자성 코어 메모리와 36,864개의 읽기 전용 코어 로프 메모리로 구성되어 있었다. 두 메모리 모두 사이클 타임은 11.72 마이크로초였다. 메모리 워드 길이는 16비트로, 15개의 데이터 비트와 1개의 패리티 비트를 포함하고 있었다. CPU 내부의 16비트 워드 형식은 14개의 데이터 비트, 1개의 오버플로우 비트, 그리고 1개의 부호 비트(1의 보수 표현)로 구성되었다.
AGC의 사용자 인터페이스는 DSKY(디스플레이 및 키보드)로, 일반적으로 "DIS-kee"라고 발음된다. DSKY는 다양한 표시등, 숫자 디스플레이, 그리고 계산기 스타일의 키보드를 가지고 있었다. 명령은 두 자릿수 숫자로 입력되었으며, 여기서 Verb는 수행할 동작의 유형을, Noun은 해당 동작에 영향을 받을 데이터를 지정했다.
각 숫자는 녹색(530nm) 고전압 전자 발광 7세그먼트 디스플레이를 통해 표시되었으며, 이 디스플레이는 전기 기계적 릴레이에 의해 구동되었기 때문에 업데이트 속도에 제한이 있었다. 세 자리의 5자리 부호 있는 숫자는 8진수나 10진수로 표시될 수 있었고, 보통 우주선의 자세나 필요한 속도 변화(델타-V) 같은 벡터를 표시하는 데 사용되었다. 내부 데이터는 미터법 단위로 저장되었지만, 표시되는 값은 미국의 관습 단위로 나타났다. 이 계산기 스타일의 인터페이스는 그 당시로서는 최초의 형태였다.
명령 모듈에는 AGC에 연결된 두 개의 DSKY가 있었다: 하나는 주요 계기판에, 다른 하나는 관성 항법 플랫폼을 정렬하기 위한 섹스턴트 근처의 하부 장비 구역에 위치해 있었다. 달 착륙선에는 AGC에 연결된 하나의 DSKY가 있었다. 비행 감독자 자세 표시기(FDAI)는 AGC에 의해 제어되며, 명령 모듈과 LM의 지휘관 콘솔에 있는 DSKY 위에 위치해 있었다.
AGC의 타이밍 기준은 2.048 MHz 크리스탈 클락에서 나왔다. 이 클락은 두 번 나누어져 1.024 MHz 네 가지 주파수를 생성하며, AGC는 이를 사용해 내부 작업을 수행했다. 1.024 MHz 클락은 다시 두 번 나누어져 512 kHz의 신호인 마스터 주파수가 생성되었으며, 이 신호는 아폴로 우주선의 외부 시스템을 동기화하는 데 사용되었다.
마스터 주파수는 링 카운터를 통해 5로 나누어져 102.4 kHz 신호를 만들었고, 이 신호는 다시 17단계의 F1(51.2 kHz)부터 F17(0.78125 Hz)까지 나누어졌다. F10 단계(100 Hz)는 AGC에 되돌려져 실시간 시계를 증가시키고 다른 필수 카운터를 갱신하는 데 사용되었다. F17 단계는 AGC가 대기 모드에 있을 때 간헐적으로 AGC를 실행하는 데 사용되었다.
AGC는 일반적인 계산을 위해 네 개의 16비트 레지스터를 가지고 있었으며, 이를 중앙 레지스터라고 불렀다:
- A: 일반적인 계산을 위한 누산기
- Z: 프로그램 카운터 – 다음에 실행할 명령의 주소
- Q: DV 명령의 나머지 값과 TC 명령 후의 반환 주소
- LP: MP 명령 후의 하위 곱셈 결과
또한 코어 메모리에는 주소 20에서 23에 해당하는 네 개의 위치가 있었고, 이들은 '편집 위치'라고 불렸다. 이 위치에 저장된 값은 하나의 비트 위치가 이동하거나 회전된 형태로 나타났으며, 그 중 하나는 오른쪽으로 7비트가 이동하여 7비트 해석용 연산 코드 중 하나를 추출했다. 이 동작은 블록 I와 블록 II AGC 모두에 공통적이었다.
AGC는 내부 작업 중에 사용되는 추가적인 레지스터도 가지고 있었다:
- S: 12비트 메모리 주소 레지스터, 메모리 주소의 하위 부분
- Bank/Fbank: 4비트 ROM 은행 레지스터, 고정-스위칭 모드에서 1킬로워드 ROM 은행을 선택
- Ebank: 3비트 RAM 은행 레지스터, 지워질 수 있는-스위칭 모드에서 256워드 RAM 은행을 선택
- Sbank (슈퍼-은행): Fbank의 확장된 1비트, 36킬로워드 ROM의 마지막 4킬로워드는 Fbank만으로 접근할 수 없어서 필요했다
- SQ: 4비트 순차 레지스터; 현재 명령
- G: 16비트 메모리 버퍼 레지스터, 메모리에서 데이터를 이동시킬 때 사용
- X: 덧셈기의 'x' 입력 (덧셈기는 모든 1의 보수 산술 연산을 수행)
- Y: 덧셈기의 'y' 입력
- U: 실제로는 레지스터가 아니라 덧셈기의 출력 (X와 Y 레지스터의 1의 보수 합)
- B: 일반 용도의 버퍼 레지스터, 또한 다음 명령을 미리 가져오는 데 사용
- C: 별도의 레지스터는 아니지만 B 레지스터의 1의 보수
- IN: 네 개의 16비트 입력 레지스터
- OUT: 다섯 개의 16비트 출력 레지스터
AGC(아폴로 유도 컴퓨터) 명령어 집합
아폴로 유도 컴퓨터(AGC)는 기본 명령어와 확장 명령어로 나뉘어진 명령어 집합을 사용했다. 명령어 형식은 3비트의 연산 코드(opcode)와 12비트의 메모리 주소로 구성되었다. Block I AGC는 총 11개의 명령어를 가졌으며, 이들은 기본 명령어와 확장 명령어로 구분된다. 처음 8개는 기본 명령어이고, 마지막 3개는 확장 명령어로 특별한 명령어 시퀀스를 통해 실행된다.
기본 명령어 (3비트 연산 코드로 직접 접근 가능)
TC (Transfer Control, 제어 전송):
- 이 명령어는 명령어에 지정된 주소로 무조건 분기하는 역할을 한다.
- 리턴 주소는 자동으로 Q 레지스터에 저장되며, 이 기능을 통해 TC 명령어는 서브루틴 호출에도 사용될 수 있다.
CCS (Count, Compare, and Skip, 카운트, 비교, 건너뛰기):
- 복잡한 조건부 분기 명령어로, A 레지스터에 명령어에서 지정한 주소의 데이터를 불러온다.
- 그 후, 감소된 절대값(DABS)을 계산하여 A 레지스터에 저장한다. A 레지스터의 값에 따라 4가지 분기 중 하나로 건너뛰기를 한다.
- CCS 명령어는 반복문이나 조건 분기에서 자주 사용되었으며, AGC에서 반복문을 만들 때 중요한 역할을 했다.
INDEX (인덱스):
- 명령어에 지정된 주소에서 데이터를 더하여 다음 명령어의 주소를 수정한다. 이는 배열이나 테이블을 처리할 때 사용된다.
RESUME (재개):
- INDEX 명령어의 특별한 형태로, INDEX 25로 정의된다. 이 명령어는 인터럽트가 발생한 위치에서 실행을 재개하는 데 사용된다.
XCH (Exchange, 교환):
- A 레지스터와 메모리의 내용을 교환하는 명령어이다. 만약 메모리 주소가 읽기 전용 메모리(ROM)에 있다면, 메모리의 내용은 영향을 받지 않고 A 레지스터의 값이 로드된다. 그러나 지울 수 있는 메모리(RAM)에서는 오버플로우 수정이 일어날 수 있다.
CS (Clear and Subtract, 지우고 뺄셈):
- A 레지스터에 명령어에서 지정된 메모리 주소의 1의 보수 값을 로드하는 명령어이다.
TS (Transfer to Storage, 저장소로 전송):
- A 레지스터의 값을 지정된 메모리 주소에 저장하는 명령어이다. TS 명령어는 오버플로우를 감지하고, 이를 수정하여 다중 정밀도의 더하기/빼기를 처리할 수 있도록 한다. 만약 오버플로우가 발생하면, 상위 비트가 메모리로 전송되고, A 레지스터는 +1 또는 -1로 변경된다.
AD (Add, 더하기):
- 메모리의 내용을 A 레지스터에 더하고 결과를 A 레지스터에 저장하는 명령어이다. A 레지스터의 왼쪽 두 비트는 오버플로우 상태를 나타낼 수 있으며, 두 숫자를 더할 때 두 개 이상의 수를 더하는 경우 오버플로우가 발생할 수 있다.
확장 명령어 (특수 TC 명령어로 접근)
MASK (비트 단위 연산):
- 메모리의 값과 A 레지스터의 값을 비트 단위로 AND 연산하여 그 결과를 A 레지스터에 저장하는 명령어이다.
MP (Multiply, 곱셈):
- A 레지스터의 내용을 지정된 메모리 주소의 데이터와 곱하고, 고위 곱셈 결과는 A 레지스터에, 저위 곱셈 결과는 LP 레지스터에 저장하는 명령어이다. 이때 곱셈 결과의 부호는 일치한다.
DV (Divide, 나누기):
- A 레지스터의 내용을 지정된 메모리 주소의 데이터로 나누고, 몫은 A 레지스터에, 나머지는 Q 레지스터에 저장하는 명령어이다. AGC는 고정 소수점 수를 취급하기 때문에 나누는 수가 피제수보다 작으면 잘못된 결과가 나올 수 있다.
SU (Subtract, 뺄셈):
- 명령어에서 지정된 메모리 주소의 데이터를 A 레지스터에서 빼고 그 결과를 A 레지스터에 저장하는 명령어이다.
AGC의 명령어는 기본적으로 12개의 타이밍 펄스(타이밍 주기)로 구성된 그룹으로 실행된다. 각 타이밍 펄스는 최대 5개의 제어 펄스를 트리거하여 실제 작업을 수행한다. 예를 들어, MP(곱셈) 명령어는 8개의 하위 시퀀스를 사용하며, 첫 번째 시퀀스인 MP0 이후에는 MP1 시퀀스가 6번 반복되고, 마지막에는 MP3 시퀀스가 실행된다. Block II에서는 곱셈 명령어가 3개의 하위 시퀀스로 줄어들었다.
AGC에서 메모리는 12비트 주소를 가진 1킬로워드의 은행으로 구성되었으며, 그 중 첫 번째 은행은 지울 수 있는 메모리(RAM), 나머지 은행은 고정 메모리(ROM)로 사용되었다. 각 명령어는 메모리 주소를 통해 데이터를 주고받으며, 메모리 주기는 12개의 타이밍 펄스 동안 실행된다.
인터럽트와 비자발적 카운터
AGC는 다섯 가지 벡터화된 인터럽트를 지원했다:
- Dsrupt: 주기적인 시간 간격으로 트리거되어 사용자 디스플레이(DSKY)를 업데이트한다.
- Erupt: 다양한 하드웨어 오류나 경고가 발생했을 때 생성된다.
- Keyrupt: 사용자의 키보드에서 키가 눌렸을 때 발생한다.
- T3Rrupt: 하드웨어 타이머에서 주기적으로 발생하며 AGC의 실시간 시계를 업데이트한다.
- Uprupt: 16비트의 업링크 데이터를 AGC로 로드할 때마다 발생한다.
AGC는 각 인터럽트에 반응할 때 현재 실행 중인 프로그램을 잠시 중단하고, 짧은 인터럽트 서비스 루틴을 실행한 후 중단되었던 프로그램을 다시 이어서 실행한다.
AGC에는 20개의 비자발적 카운터도 있었다. 이들은 업/다운 카운터나 시프트 레지스터로 기능하는 메모리 위치였다. 카운터는 내부 입력에 반응하여 증감하거나 시프트될 수 있었다. 증가는 Pinc, 감소는 Minc, 시프트는 Shinc라는 마이크로 명령어 서브시퀀스가 두 개의 일반 명령어 사이에 삽입되어 처리되었다.
인터럽트는 카운터가 오버플로우할 때 발생할 수 있었다. T3rupt와 Dsrupt 인터럽트는 100Hz 하드웨어 클럭에 의해 구동되는 카운터가 오버플로우할 때 발생했으며, 많은 Pinc 서브시퀀스를 실행한 후 발생했다. Uprupt 인터럽트는 카운터가 Shinc 서브시퀀스를 실행하여 16비트의 업링크 데이터를 AGC에 시프트했을 때 발생했다.
대기 모드
AGC에는 전원 절약 모드가 있었으며, 이 모드는 대기 허용 스위치에 의해 제어되었다. 이 모드에서는 2.048 MHz 클럭과 스케일러를 제외한 AGC 전원이 꺼졌다. 스케일러에서 나온 F17 신호는 AGC 전원을 켜고 1.28초 간격으로 AGC를 다시 켰다. 이 모드에서 AGC는 필수 기능을 수행하고 대기 허용 스위치를 체크하며, 여전히 활성화되어 있으면 전원을 끄고 다시 잠들었다.
대기 모드에서는 AGC가 대부분의 시간을 잠자고 있었기 때문에 10ms 간격으로 실시간 시계를 업데이트하는 데 필요한 Pinc 명령어를 실행할 수 없었다. 이를 보완하기 위해 AGC가 대기 모드에서 깨어날 때마다 실시간 시계를 1.28초씩 업데이트하는 기능을 수행했다.
대기 모드는 미드코스 비행 중 AGC가 필요하지 않을 때 5~10W의 전력을 절약하도록 설계되었다. 그러나 실제로는 AGC는 모든 비행 단계에서 계속 켜져 있었고, 이 기능은 사용되지 않았다.
데이터 버스
AGC에는 16비트 읽기 버스와 16비트 쓰기 버스가 있었다. 중앙 레지스터(A, Q, Z, 또는 LP) 또는 다른 내부 레지스터에서 데이터가 읽기 버스로 게이팅될 수 있었다. 읽기 버스는 비반전 버퍼를 통해 쓰기 버스에 연결되어 있었고, 읽기 버스에 나타나는 데이터는 쓰기 버스에도 나타났다. 다른 제어 신호들은 쓰기 버스의 데이터를 레지스터로 다시 복사할 수 있었다.
데이터 전송은 이렇게 작동했다: 다음 명령어의 주소를 B 레지스터에서 S 레지스터로 이동하려면 RB(읽기 B) 제어 신호가 발행되었고, 이 신호는 B 레지스터의 주소를 읽기 버스로 이동시킨 후, 다시 쓰기 버스로 이동시켰다. WS(쓰기 S) 제어 신호는 쓰기 버스에서 S 레지스터로 주소를 이동시켰다.
여러 레지스터에서 데이터를 읽기 버스로 동시에 전송할 수 있었다. 이때, 각 레지스터의 데이터는 포함된 OR 연산으로 읽기 버스에 합성되었다. 이 포함된 OR 기능은 Mask 명령어를 구현하는 데 사용되었으며, 논리 AND 연산을 수행하는 데 활용되었다. AGC는 기본적으로 논리 AND를 수행할 수 없었지만, 버스를 통한 논리 OR와 C 레지스터를 통한 보수(반전)를 활용하여 De Morgan's theorem을 적용함으로써 논리 AND와 동등한 연산을 구현했다. 이는 두 피연산자를 반전시키고, 버스를 통해 논리 OR 연산을 수행한 후 결과를 다시 반전시킴으로써 이루어졌다.
소프트웨어
AGC 소프트웨어는 AGC 어셈블리 언어로 작성되었고, 로프 메모리에 저장되었다. 대부분의 소프트웨어는 읽기 전용 로프 메모리에 저장되어 운영 중 변경할 수 없었으나, 일부 중요한 소프트웨어는 표준 읽기-쓰기 자기 코어 메모리에 저장되어 있었고, 이는 우주비행사가 DSKY 인터페이스를 사용하여 덮어쓸 수 있었다. 예를 들어, 아폴로 14호에서는 이러한 방식으로 일부 소프트웨어를 덮어썼다.
AGC는 J. Halcombe Laning이 설계한 간단한 실시간 운영 체제에 의해 제어되었다. 이 운영 체제는 Exec라는 배치 작업 스케줄링 시스템과 Waitlist라는 인터럽트 기반 선점형 스케줄러를 포함하고 있었다. Exec는 협력적 다중 작업을 지원하며, Waitlist는 타이머 기반 태스크들을 스케줄링하여 작업을 제어했다. 태스크는 짧은 실행 단위로, 자신을 재스케줄링하거나 Exec를 통해 더 긴 작업을 시작할 수 있었다. 계산은 미터법을 사용했지만, 디스플레이 출력은 아폴로 우주비행사들이 익숙한 단위인 피트, 초당 피트, 해리 포스로 표시되었다.
AGC는 MIT 계측 실험실에서 개발한 소프트웨어 인터프리터를 갖추고 있었으며, 이를 통해 AGC가 원래 지원하지 않던 더 복잡하고 기능적인 의사 명령어들을 구현할 수 있었다. 이 인터프리터는 가상 머신을 실행하며, 16비트와 24비트의 이중 정밀도 삼각법, 스칼라 및 벡터 산술, 심지어 MXV(행렬 × 벡터) 명령어까지 지원했다. 인터프리터 코드는 AGC 네이티브 코드와 혼합하여 사용할 수 있었다. 인터프리터 코드는 실행 시간은 길어졌지만, 메모리 요구 사항은 더 적었고, 새로운 명령어를 AGC에 추가할 때보다 메모리 절약이 가능했다. 평균적으로 의사 명령어는 약 24ms를 실행하는 데 소요되었다.
AGC의 소프트웨어는 또한 Pinball이라는 인터럽트 기반 사용자 인터페이스 루틴 세트를 제공하여 키보드 및 디스플레이 서비스를 처리했다. 우주비행사는 이 루틴을 사용하여 메모리의 특정 위치를 8진수나 10진수로 표시하고, 주기적으로 특정 메모리 위치를 새로 고침하는 모니터 루틴을 사용할 수 있었다. 또한 작업을 시작할 수 있는 루틴도 제공되었다.
MIT 계측 실험실에서 개발된 AGC 설계 원칙은 비동기식 소프트웨어, 우선순위 스케줄링, 테스트, 인간-기계 협력 의사결정 능력 등 소프트웨어 엔지니어링의 기초를 확립하는 데 중요한 역할을 했다. AGC 설계 요구사항이 정의될 당시, 필요한 소프트웨어와 프로그래밍 기법은 존재하지 않았기 때문에 이를 처음부터 설계해야 했다.
블록 II
AGC의 블록 II 버전은 1966년에 설계되었다. 기본적인 블록 I 아키텍처는 유지하면서, 지우기 가능한 메모리가 1킬로워드에서 2킬로워드로 증가했고, 고정 메모리는 24킬로워드에서 36킬로워드로 확장되었다. 명령어 집합은 11개에서 34개로 늘어났으며, I/O 채널이 도입되어 블록 I의 I/O 레지스터를 대체했다. 블록 II 버전은 실제로 달에 갔던 AGC 버전이다. 블록 I은 무인 아폴로 4호와 6호 비행에 사용되었고, 불운의 아폴로 1호에도 탑재되었다.
블록 II에서 메모리와 명령어 집합을 확장하기로 한 결정은 흥미로운 설계적 결과를 가져왔다. 블록 I의 제한적인 3비트 운영 코드와 12비트 주소를 그대로 유지하면서도 추가적인 명령어를 삽입할 수 있도록 다양한 트릭들이 사용되었다. 예를 들어, 특정 기능을 구현하기 위해 특수한 메모리 주소를 참조하는 방식이 사용되었다. 예를 들어, 주소 25를 참조하면 인터럽트에서 복귀하는 RESUME 명령어가 실행되었고, 주소 17은 INHINT(인터럽트 금지) 명령을, 주소 16은 인터럽트를 다시 활성화하는 RELINT 명령을 실행했다. 다른 명령어들은 EXTEND라는 특별한 TC 버전으로 앞에 붙여서 구현되었다. 주소 공간은 고정 메모리와 지우기 가능한 메모리를 사용하는 Bank(고정)와 Ebank(지우기 가능) 레지스터를 통해 확장되었기 때문에, 주어진 시간에 주소를 지정할 수 있는 메모리는 현재의 은행과 소량의 고정-고정 메모리, 그리고 지우기 가능한 메모리에 국한되었다. 또한 은행 레지스터는 최대 32킬로워드를 주소 지정할 수 있었기 때문에, 마지막 4킬로워드를 액세스하려면 Sbank(슈퍼-은행) 레지스터가 필요했다. 모든 교차-은행 서브루틴 호출은 고정-고정 메모리를 통해 특별한 기능을 사용하여 원래 은행을 복구한 후 반환되어야 했다. 본질적으로 이는 멀리 있는 포인터 시스템이었다.
블록 II AGC는 또한 EDRUPT 명령어를 가지고 있었다(이름은 "Ed's Interrupt"의 축약형으로, 이 명령어를 요청한 프로그래머 Ed Smally의 이름에서 유래했다). 이 명령어는 인터럽트를 생성하지 않으며, 인터럽트 처리에서 일반적으로 수행되는 두 가지 작업을 실행한다. 첫 번째 작업은 추가 인터럽트를 금지하는 것으로, 이를 다시 활성화하려면 RESUME 명령어가 필요하다. 두 번째 작업은 프로그램 카운터(Z)의 현재 값을 ZRUPT 레지스터에 로드하는 것이다. 이 명령어는 아폴로 소프트웨어에서 한 번만 사용되었으며, 그 사용 목적은 달 착륙 모듈의 디지털 자동조종 장치(DAP) 사이클 종료 시퀀스를 설정하는 것이었다. 이 명령어가 LEM AGC의 Luminary 소프트웨어를 에뮬레이션하는 데 문제를 일으킨 것으로 여겨지고 있다.
1201 및 1202 프로그램 알람
DSKY와 버즈 올드린 (Apollo 11 달 착륙 모듈 Eagle, 달로 가는 도중)
아폴로 11호의 달 착륙 중, AGC는 1202 알람(“Executive overflow - NO CORE SETS”)과 1201 알람(“Executive overflow - NO VAC AREAS”)을 발생시켰다. AGC의 반응은 소프트 리스타트였으며, 그 원인은 의도적으로 대기 상태에 두었던 조우 레이더에서 발생한 빠르고 지속적인 사이클 훔치기 때문이었다. 이 레이더는 만약의 상황을 대비해 착륙 중에 필요할 경우를 대비해 대기 중이었다.
착륙 과정에서 AGC의 처리기는 보통 약 85%가량 로드되어 있었다. 추가로 초당 6,400 사이클이 훔쳐져 들어가면서, 처리기의 부하가 13% 정도 증가했고, 예정된 모든 작업을 완료할 시간이 겨우 남았다. 착륙 5분 전에, 버즈 올드린은 컴퓨터에 1668 명령어를 입력했다. 이 명령어는 DELTAH(레이더에서 감지된 고도와 계산된 고도 차이)를 주기적으로 계산하고 표시하라는 지시였다. 1668 명령어는 처리기 작업 부하를 10% 더 증가시켜 executive overflow와 1202 알람을 발생시켰다. 그 후, 휴스턴에서 "GO" 명령을 받은 올드린은 1668 명령어를 다시 입력했고 또다시 1202 알람이 발생했다. 두 번째 알람을 보고하면서, 올드린은 "1668이 실행될 때 이 알람이 발생하는 것 같습니다."라고 말했다.
AGC 소프트웨어는 우선순위 스케줄링을 사용하여 설계되었고, 자동으로 복구되었다. 낮은 우선순위 작업인 1668 디스플레이 작업을 삭제하고, 중요한 유도 및 제어 작업을 완료했다. 유도 컨트롤러인 스티브 베일스와 그의 지원 팀(잭 가르만 포함)은 여러 차례 "GO" 신호를 보내며 착륙을 성공적으로 이끌었다.
문제의 원인은 AGC의 프로그램 오류나 조종사의 실수가 아니라, 이미 아폴로 5호 엔지니어들에 의해 알려지고 문서화된 하드웨어 설계 버그였다. 그러나 이 문제는 테스트 중에 한 번만 발생했기 때문에, 엔지니어들은 새로운 레이더 시스템을 테스트하는 것보다 기존 하드웨어를 사용하는 것이 더 안전하다고 결론지었다. 실제 하드웨어에서, 조우 레이더의 위치는 800Hz AC의 두 다른 주파수 소스에서 유도된 신크로로 인코딩되었는데, 하나는 컴퓨터의 타이밍 기준으로 사용된 소스였다. 두 800Hz 소스는 주파수는 잠금되었지만, 위상 잠금은 되어 있지 않았고, 미세한 랜덤 위상 변화로 인해 안테나가 급격히 "진동"하는 것처럼 보였지만 실제로는 정지해 있었다. 이 가상의 움직임이 사이클 훔치기를 빠르게 생성했다.
J. Halcombe Laning의 소프트웨어 및 컴퓨터 설계 덕분에 아폴로 11호 착륙 미션이 성공할 수 있었다. 만약 Laning의 설계가 없었다면, 착륙은 안정적인 유도 컴퓨터의 부족으로 인해 중단되었을 것이다.
아폴로 외의 응용 프로그램
소스 코드 공개
2003년, 론 버키는 가상 AGC 프로젝트를 시작하여 아폴로 유도 컴퓨터(AGC)의 소스 코드를 복원하고 기능적인 에뮬레이터를 만드는 것을 목표로 했다. 이 프로젝트의 일환으로 1960년대의 하드 카피에서 필사하고 디지털화된 원본 코드가 가상 AGC 프로젝트와 MIT 박물관을 통해 공개되었다. 이 노력은 2016년 중반에 전 NASA 인턴인 크리스 가리가 코드를 GitHub에 업로드하면서 다시 주목을 받았고, 이는 큰 미디어 관심을 불러일으켰다.
