노르웨이 최초의 IBM 650 컴퓨터(1959년), "EMMA"로 알려짐. 650 콘솔 장치(우측, 외부 측면 패널이 열려 있음), 533 카드 읽기/펀치 장치(중앙, 입출력 장치). 655 전원 장치는 누락됨. 천공 카드 분류기(좌측, 650의 일부가 아님). 현재 오슬로의 노르웨이 과학 기술 박물관에 전시 중. | |
| 종류 | 디지털 컴퓨터 |
| 이전 기종 | IBM CPC (604, 605) |
| 후속 기종 | IBM 7070 (고성능 기종)IBM 1620 (저성능 기종) |
| 관련 기기 | IBM 701, IBM 702; IBM 608 |




IBM 650 자기 드럼 데이터 처리기(영어: IBM 650 Magnetic Drum Data-Processing Machine)는 1950년대 중반 IBM에서 생산한 초기 디지털 컴퓨터이다. 이 기기는 세계 최초의 대량 생산 컴퓨터였다. 약 2,000대의 시스템이 생산되었으며, 마지막 기기는 1962년에 생산되었다. 또한 의미 있는 수익을 창출한 최초의 컴퓨터이기도 하다. 첫 번째 모델은 1954년 말에 설치되었으며, IBM 650은 1950년대에 가장 인기 있는 컴퓨터였다.
650은 각각 과학 및 비즈니스 목적이었던 IBM 701과 IBM 702 컴퓨터보다 느리지만 저렴한 대안으로 비즈니스, 과학 및 공학 사용자들에게 제공되었다. 또한 IBM 604와 같은 계산 펀치에서 컴퓨터로 업그레이드하려는 천공 카드 기기 사용자들을 대상으로 마케팅되었다.: 5
비교적 낮은 비용과 쉬운 프로그래밍 덕분에 650은 잠수함 승조원 성과 모델링부터 고등학생 및 대학생 대상의 컴퓨터 프로그래밍 교육에 이르기까지 다양한 분야를 개척하는 데 사용되었다. IBM 650은 대학에서 매우 인기가 많았으며, 한 세대의 학생들이 처음으로 프로그래밍을 배우는 계기가 되었다.
1953년에 발표되었으며, 1956년에는 최대 4개의 디스크 저장 장치를 추가할 수 있는 IBM 650 RAMAC으로 개선되었다. 읽기/펀치 장치나 전원 공급 장치를 제외한 모델 4 IBM 650 콘솔 단품의 1959년 구매 가격은 $150,000 (equivalent to about $1,700,000 in 2025)였다. 650 및 구성 장치에 대한 지원은 1969년에 종료되었다.
650은 2-주소, 2진-5진법 부호화 10진법 컴퓨터(데이터와 주소 모두 10진법)로, 메모리는 회전하는 자기 드럼을 사용했다. 문자 지원은 입출력 장치가 천공 카드의 영문자와 특수 문자 인코딩을 2자리 10진수 코드로 변환하는 방식으로 제공되었다.
650은 디지털 직렬 방식의 기계로 125 kHz 주파수로 클록되었으며 기본 디지털 시간은 8 μs였다. 650은 부호를 포함한 10자리 워드를 가졌고 워드 사이에 1 디지털 시간의 스위칭 간격이 있었기 때문에, IBM 650 타이밍의 기본 단위인 워드 시간은 12 디지털 시간 또는 96 μs였다. 드럼의 각 트랙에는 50개의 워드가 있었으며, 드럼은 50 워드 시간마다 한 번씩 회전했다(4.8 ms, 또는 12,500 rpm). 명령어 처리 시간은 드럼에서 명령어 데이터와 다음 명령어의 위치를 찾는 데 걸리는 시간과, 곱셈 및 나눗셈의 경우 승수와 몫의 자릿수에 따라 달라졌다. 덧셈 또는 뺄셈 명령어의 전체 시간은 7~106 워드 시간, 즉 약 0.7~10.2 ms였다. 곱셈은 23~253 워드 시간, 나눗셈은 63~293 워드 시간(각각 2.2~24.3 ms 및 6.0~28.1 ms)이 소요되었다.
도널드 커누스의 책 시리즈인 컴퓨터 프로그래밍의 예술은 650에 헌정된 것으로 유명하다.
최초의 650은 1954년 12월 8일 보스턴의 존 핸콕 생명보험 컨트롤러 부서에 설치되었다.
1958년에 발표된 IBM 7070(부호가 있는 10자리 10진수 워드)은 "적어도 650과 IBM 705의 공통 후속 기종"이 될 것으로 예상되었다. 1959년에 도입된 IBM 1620(가변 길이 10진수)은 저가형 시장을 겨냥했다. 유니박 솔리드 스테이트(부호가 있는 10자리 10진수 워드를 사용하는 2-주소 컴퓨터)는 650에 대응하여 1958년 12월 스페리 랜드(Sperry Rand)에서 발표되었다. 이들 중 650과 명령어 집합이 호환되는 기기는 없었다.
기본 650 시스템은 세 개의 장치로 구성되었다.
무게: 5,400–6,263 파운드 (2.7–3.1 short ton; 2.4–2.8 t).
선택 장치:
회전하는 자기 드럼은 각각 0000~0999, 1999, 3999 주소에 1,000, 2,000, 4,000 워드의 메모리를 제공했다. 각 워드는 10개의 2진-5진법 부호화 10진법 자릿수를 가졌으며, 부호가 있는 10자리 숫자나 5개의 문자를 표현했다(2진-5진법 자릿수를 7비트로 계산하면 4000 워드는 35킬로바이트와 같음). 드럼의 워드는 드럼 주변의 밴드로 구성되었으며, 밴드당 50개의 워드, 각 모델에 따라 20, 40, 80개의 밴드가 있었다. 드럼 표면의 위치가 회전 중 읽기/쓰기 헤드 아래를 지날 때 워드에 접근할 수 있었다(12,500 rpm으로 회전, 최적화되지 않은 평균 접근 시간은 2.5 ms). 이러한 타이밍 특성 때문에 각 명령어의 두 번째 주소는 다음 명령어의 주소였다. 따라서 프로그램은 이전 명령어 실행 완료 후 즉시 접근 가능한 주소에 명령어를 배치하여 최적 프로그래밍을 수행할 수 있었다. IBM은 프로그래머가 명령어와 데이터 위치를 기록할 수 있도록 10개 열과 200개 행이 있는 양식을 제공했다. 이후 SOAP(Symbolic Optimal Assembly Program)라는 어셈블리어가 제공되어 대략적인 최적화를 수행했다.
LGP-30, 벤딕스 G-15, IBM 305 RAMAC 컴퓨터 또한 진공관과 드럼 메모리를 사용했지만 IBM 650과는 상당히 달랐다.
드럼에서 읽은 명령어는 프로그램 레지스터(현재 용어로는 명령 레지스터)로 전달되었다. 드럼에서 읽은 데이터는 10자리 분배기(distributor)를 거쳤다. 650은 20자리 누산기를 가졌으며, 공통 부호를 가진 하위 10자리와 상위 10자리 누산기로 나뉘었다. 산술 연산은 1자리 가산기에 의해 수행되었다. 콘솔(10자리 스위치, 부호 스위치 1개, 2진-5진법 표시등 10개), 분배기, 하위 및 상위 누산기는 모두 주소 지정이 가능했다(각각 8000, 8001, 8002, 8003).
1955년 5월 3일에 도입된 선택 사양인 IBM 653 저장 장치는 최종적으로 다음 5가지 기능을 제공했다.
650 명령어는 2자리 작업 코드, 4자리 데이터 주소, 그리고 다음 명령어의 4자리 주소로 구성되었다. 기본 기계에서는 부호가 무시되었지만 선택 기능이 있는 기계에서는 사용되었다. 기본 기계는 44개의 작업 코드를 가졌다. 부동 소수점, 코어 스토리지, 인덱스 레지스터 및 추가 입출력 장치와 같은 옵션에 대해 추가적인 작업 코드가 제공되었다. 모든 옵션을 설치하면 97개의 작업 코드를 사용할 수 있었다.
테이블 조회(TLU) 명령어는 참조된 10자리 워드와 동일한 드럼 밴드의 48개 연속 워드를 5ms 회전 내에 비교할 수 있었고 다음 48개 워드를 위해 제시간에 다음 밴드로 전환할 수 있었다. 이 기능은 1963년 당시 1,000배 더 빠른 이진 기계(IBM 7040의 1,500 마이크로초 대 650의 5,000 마이크로초) 성능의 약 1/3 수준이었다. 동일한 성능의 선택 사양인 '테이블 조회 일치(Table lookup Equal)' 명령어도 있었다.
읽기(RD) 명령어는 80열 카드의 숫자 데이터를 10개의 메모리 워드로 읽어들였다. 워드로의 자릿수 분배는 카드 리더의 플러그판 제어 패널 배선에 의해 결정되었다. 533 읽기/펀치 장치의 영문자 장치와 함께 사용하면 숫자열과 영숫자열(최대 30개의 영숫자열)을 조합하여 읽을 수 있었다. 확장 기능을 통해 영숫자열을 더 추가할 수 있었지만, 카드 읽기 작업 시 드럼에 10개의 워드(워드당 5문자)만 저장되었으므로 50열을 넘을 수는 없었다.



기본 기계 작업 코드는 다음과 같다.
| 17 | AABL | 하위 누산기에 절대값 더하기 |
| 15 | AL | 하위 누산기에 더하기 |
| 10 | AU | 상위 누산기에 더하기 |
| 45 | BRNZ | 누산기가 0이 아닐 경우 분기 |
| 46 | BRMIN | 누산기가 마이너스일 경우 분기 |
| 44 | BRNZU | 상위 누산기가 0이 아닐 경우 분기 |
| 47 | BROV | 오버플로 발생 시 분기 |
| 90-99 | BRD | 분배기 위치 1-10이 8일 경우 분기 |
| 14 | DIV | 나눗셈 |
| 64 | DIVRU | 나눗셈 후 상위 누산기 리셋 |
| 69 | LD | 분배기에 로드 |
| 19 | MULT | 곱셈 |
| 00 | NO-OP | 작업 없음 |
| 71 | PCH | 카드 펀치 |
| 70 | RD | 카드 읽기 |
| 67 | RAABL | 누산기 리셋 후 하위 누산기에 절대값 더하기 |
| 65 | RAL | 누산기 리셋 후 하위 누산기에 더하기 |
| 60 | RAU | 누산기 리셋 후 상위 누산기에 더하기 |
| 68 | RSABL | 누산기 리셋 후 하위 누산기에서 절대값 빼기 |
| 66 | RSL | 누산기 리셋 후 하위 누산기에서 빼기 |
| 61 | RSU | 누산기 리셋 후 상위 누산기에서 빼기 |
| 35 | SLT | 누산기 왼쪽 시프트 |
| 36 | SCT | 누산기 왼쪽 시프트 및 카운트 |
| 30 | SRT | 누산기 오른쪽 시프트 |
| 31 | SRD | 누산기 오른쪽 시프트 및 반올림 |
| 01 | STOP | 콘솔 스위치가 정지로 설정되어 있으면 정지, 아니면 NO-OP으로 계속 |
| 24 | STD | 분배기를 메모리에 저장 |
| 22 | STDA | 하위 누산기 데이터 주소를 분배기에 저장.
그 후 분배기를 메모리에 저장 |
| 23 | STIA | 하위 누산기 명령어 주소를 분배기에 저장.
그 후 분배기를 메모리에 저장 |
| 20 | STL | 하위 누산기를 메모리에 저장 |
| 21 | STU | 상위 누산기를 메모리에 저장. |
| 18 | SABL | 하위 누산기에서 절대값 빼기 |
| 16 | SL | 하위 누산기에서 빼기 |
| 11 | SU | 상위 누산기에서 빼기 |
| 84 | TLU | 테이블 조회 |
참고: IBM 653 옵션은 추가적인 명령어 코드를 구현할 수 있었다.
IBM이 1956년에 발행한 650 프로그래밍 불레틴 5(22-6314-0)에서 발췌한 이 1카드 프로그램은 드럼 저장 장치의 대부분을 마이너스 0으로 설정한다. 이 프로그램은 콘솔 스위치와 누산기에서 실행되는 명령어 예제를 포함한다.
시작하기 위해, 로드 카드는 80개의 연속된 자릿수(아래 두 번째 열)로 펀치되어, 읽힐 때 드럼 위치 0001에서 0008까지의 내용이 표시된 대로 설정된다.
0001 0000010000
0002 0000000000-
0003 1000018003
0004 6100080007
0005 2400008003
0006 0100008000
0007 6900060005
0008 2019990003
콘솔 숫자 스위치(주소 8000)는 데이터 주소 0004를 가진 읽기 명령어로 수동 설정된다.
loc- op|data|next
ation |addr|instruction
| |addr
8000 RD 70 0004 xxxx Read load card into first band read area
각 드럼 밴드에는 읽기 영역이 있으며, 이 영역은 위치 0001-0010, 0051-0060, 0101-0110 등에 위치한다. 밴드의 어떤 주소라도 읽기 명령어에 대한 해당 밴드를 식별하는 데 사용될 수 있으며, 주소 0004는 첫 번째 밴드를 식별한다. 실행은 콘솔에서 시작되어 로드 카드의 8개 워드가 첫 번째 메모리 밴드의 위치 0001-0008로 읽힌다. 로드 카드를 읽는 경우, "다음 명령어 주소"는 "다음 명령어 주소 필드"가 아니라 "데이터 주소 필드"에서 가져온다(위에서 xxxx로 표시). 따라서 실행은 0004에서 계속된다.
0004 RSU 61 0008 0007 Reset entire accumulator, subtract into upper (8003) the value 2019990003
0007 LD 69 0006 0005 Load distributor with 0100008000
0005 STD 24 0000 8003 Store distributor in location 0000, next instruction is in 8003 (the upper accumulator)
Note: the moving of data or instructions from one drum location to another
requires two instructions: LD, STD.
이제 2-명령어 루프가 실행된다.
8003 STL 20 1999 0003 Store lower accumulator (that accumulator was reset to 0- by the RSU instruction above)
The "1999" data address is decremented, below, on each iteration.
This instruction was placed in the upper accumulator by the RSU instruction above.
Note: this instruction, now in the upper accumulator, will be decremented and then
executed again while still in the accumulator.
0003 AU 10 0001 8003 Decrement data address of the instruction in the accumulator by 1
(by adding 10000 to a negative number)
STL의 데이터 주소는 결국 0003으로 감소하고, 0003에 있는 AU ... 명령어는 0으로 덮어쓰여진다. 그 시점이 되면(STL의 다음 명령어 주소는 0003으로 유지) 실행은 다음과 같이 계속된다.
0003 NOOP 00 0000 0000 No-operation instruction, next instruction address is 0000
0000 HALT 01 0000 8000 Halt, next instruction address is the console
(this Halt instruction was stored in 0000 by the STD instruction above)

650 명령어 집합은 간단하여 기계어로 소규모 프로그램을 작성할 수 있었으며 이는 학생 연습문제로 흔했다. 기계에 직접 로드하여 실행할 수 있는 카드당 단일 명령어 형식이 있었다.
기계어는 대규모 프로그램에는 불편했고, 시간이 흐르면서 IBM 650을 위한 다양한 프로그래밍 언어와 도구가 작성되었다. 여기에는 다음이 포함된다:
This is a reprint of IBM 650 Technical Newsletter No. 11, March 1956, form 31-6822. 이 참조 매뉴얼에는 다음 보고서가 포함되어 있으며, 외부적 특성 면에서 이 보고서에 설명된 인터프리터 시스템은 701을 위한 IBM Speedcoding System에 많은 빚을 지고 있다고 언급한다. Wolontis, V.M. 《Complete Floating Decimal Interpretive System for the IBM 650 Magnetic Drum Calculator》. Bell Laboratories, Inc, Murray Hill, New Jersey.
여기에 설명된 인터프리터 루틴은 수학적, 논리적 및 입출력 작업을 제공하는 고정 소수점 3-주소 시스템이다. 이 시스템의 로직은 뉴저지주 머레이 힐의 벨 연구소에서 개발한 650용 완전 부동 소수점 인터프리터 시스템에서 얻었다.