Collection Item

Home | Contact

Olivetti Programma 101 "Perottina"

Brand: Olivetti (Olivetti Underwood in the US).
Model: Programma 101.
Origin: Ivrea, Italy.
Introduction: 1965 at a price of $3200, around $23000 of 2013!
Description: The Olivetti Programma 101 is recognized as the world's first desktop computer commercially produced. A complete computer with RAM (random access memory), CPU (central processing unit), display (only 2 lamps!), keyboard, printer and a "mass storage" device in one 65-pound compact and elegant cabinet. There is no need to connect to any external device, only to AC plug. This is not a simple calculator with some programming capability, it is a true computer that you can also use as a regular calculator. Of course the Programma 101 is quite far from modern PC, but it made possible to use a computer at home, office, school and many other places previously not reached by huge mainframes of that time. Just compare this pictures:


A huge computer room

A computer for personal use

The Programma 101 also made possible that regular people can use a computer, not only programmers or IT specialists. Usually this machine is called "programmable calculator" instead of "computer" because its program instructions represent basic operations of a calculator, they address "registers" instead of "bytes" or "words" of memory and there is no alphabetic capability, but the concept of "stored program" that uses allows us to consider this machine a true computer.

"The Programma 101 is at the limit of what we call a stored program computer. It has a sufficient instruction set to be classified as a computer, but the storage for temporary data, constants, and programs is limited. The machine's instruction set is interesting because memory is not addressed explicitly. A jump, for example, is executed by scanning the program for a particular marker which was named in the jump instruction." (1)

The Programma 101 was designed by a small team led by Pier Giorgo Perotto of Olivetti at Ivrea, Italy, between 1962 and 1964. The external case was designed by the italian architect and designer Mario Bellini, who also made the design of other remarkable products for Olivetti like the Logos 55, Divisumma 18, Divisumma 28 and Logos 7.

Please compare the laboratory spartan design of the prototype and the final design made by Bellini:

(Left picture by courtesy of Associazione Archivio Storico Olivetti, Ivrea, Italy)

"Though not strictly a calculator, the P101 computer embodies a design philosophy that permeates all of Bellini's work: the use of sculptural shapes and new materials to evoke an expressive quality of the machine and stimulate an emotional response on the part of the user. The P101 is covered in cast aluminum, which can easily be curved into organic shapes, consists of numerous anthropomorphic references, such as a tongue-like projection on which the keyboard sits and gill-like slats on the side of the machine, and contains Bellini's first use of a stretched membrane. The stretched plastic membrane was Bellini's solution to the problem of integrating the square base of the key to the circular top. This gently-sloping, tent-like appearance of the keys contributes greatly to the elegant look of the machine." (2)

The Programma 101 was introduced to general public at the 1964-1965 New York Fair, the total production run was around 44,000 units and only in the U.S. Olivetti sold around 40,000!


The development team in 1963
Top left: Gastone Garziera, Top right: Giancarlo Toppi,
Bottom left: Pier Giorgio Perotto (leader of the team),
Bottom right: Giovanni De Sandre

Exhibition at the 1964-65 New York Fair


The Programma 101 was used in important projects of that time like the Apollo project at NASA.

(Pictures by courtesy of Associazione Archivio Storico Olivetti, Ivrea, Italy)

Please see the additional readings section for more information.


References:
(1) "Computer Structures: Readings and Examples", R.Hamming & E. Feigenbaum, McGraw-Hill computer science series.
(2) "The Vintage Calculators Web Museum", Olivetti electronic calculators, click here to read the complete article.
Hardware: The Programma 101 includes all components in one beauty cabinet. There is no integrated circuits or chips, only discrete components like transistors, diodes and capacitors, hundreds and hundreds of them...

Memory: A total memory of 240 characters in BCD encoding (around 1000-1200 useful bits) implemented via a magnetostrictive metal wire acoustic delay line. The unit of 18 x 19 x 2 cm in size has a coiled metal wire of 6.5 meter long. Using a transducer a series of acoustic pulses (bits) are inserted into one end of the wire. The pulse travels along the wire at the sound speed and reach the other end where the signal is "read" by another transducer and converted again into an electric pulse. This electric pulse re-converted into an acoustic pulse by the magnetostrictive effect and re-inserted into the wire and the loop continues indefinitely while the machine is running.

Source of the image: http://www.oldcomputers.arcula.co.uk

Keyboard: Main keyboard has 37 keys, plus decimal selector wheel (0 to 15 decimal positions) and three special switches for Program Record, Print Program and Keyboard Release. Also there is an On/Off switch.

Display: Only two bulb lamps:
Blue lamp: On: Ready for input, Flashing: Program or process running.
Red lamp: Error condition occurs (overflow, divide by zero, etc.)

Printer: A 30-character-per-second drum printer, 22 digit plus sign, decimal point and two columns to print program instructions.

Magnetic card unit: Allows write and read programs and/or data over a flexible card with a magnetic band.
Programming model: This is a concise description of the programming model. For full information please read the General Reference Manual or see the interesting Francesco Bonomi's Programma 101 website.

Memory organization: The memory of the Programma 101 is not measured in megabytes or gigabytes, instead is measured in single characters: Only 240 characters! Each character contains a digit or a special sign, apparently the machine uses a BCD encoding (4 bit per character) so the total memory capacity is 120 bytes or 960 bits!

Memory has 10 registers of 24 characters each. Each register has an unique identifier as follows:

Register: Type: Description:
M Operative (Median) Used during operations.
A Operative (Accumulator) Used during operations.
R Operative (Result) Used during operations.
B Storage Storage of data.
C Storage Storage of data.
D Storage Storage of data or program instructions.
E Storage Storage of data or program instructions.
F Storage Storage of data or program instructions.
P1 Storage Storage program instructions.
P2 Storage Storage program instructions.

M, A and R registers are used by the machine during operations, so you can not store "permanent" data here.
B, C, D, E and F registers are used to store numeric data or program instructions. B and C store only data. D, E and F can store data or program instructions in different combinations. Numeric data grows from D towards F and program instructions grows from F towards D. The minimum program size is 48 instructions (P1 and P2 with 24 instructions each) and B to F storing data. The maximum program size is 120 instructions (D, E, F, P1 and P2 with 24 instructions each) and only B and C storing data. P1 and P2 only store program instructions. This schema of sharing data storage and instructions is still in use in modern programmable calculators!


Each register B to F can be used in "full" or in "split" mode. In full mode each register stores 22 digit plus decimal point and sign (data) or 24 program instructions and you identify the register by the corresponding letter. In split mode each register is divided in two "subregisters": first and second subregister, each contains 11 digit plus decimal point and sign or 12 program instructions. You identify the first subregister with the corresponding letter and the second one with the "split" operator "/", for example F/ to refer the second subregister of F. In print-outs, the first subregister (or the whole register) is printed in upper case and the second subregister is printed in lower case, for example "F" identify the first subregister (or the whole register) and "f" is for the second subregister.


Program instructions: Can be classified in Mathematical, Transfer, Jump and Support instructions.

1.- Mathematical instructions: Add, Subtract, Multiply, Divide, Square Root and Absolute value.

1.1.- Add (+), Subtract (-), Multiply (x) and Divide (:):
Format of the instruction (*):
[register] operator
If you type only the operator (+, -, x or :) the machine makes:
A,R ← A operator M
I mean: The contents of the A register is added, subtracted, multiplied or dividied by the contents of the M register and the result is stored in A, rounded off by the selection of the decimal wheel. Also, in Add, Subtract and Multiply the result is stored in R in full precision, without rounding off. In a division, the machine stores in R the remainder of the division.
If you enter a register and then the operator the machine makes:
M ← Register
A,R ← A operator M
First copies the contents of the selected register to M and then computes the operation as described previously.
Examples:
+ Add M plus A and the result is stored in A.
B  - Subtract B from A. Previously copies B onto M.
C  /  : Divides A by the second subregister of C.
(*) Square brackets [ and ] denotes an optional parameter.

1.2.- Square Root:
Format of the instruction (*): [register] √
If you type only the operator √ the machine makes:
A ← Square Root of M
Computes the square root of M and the result, rounded off by the selection of the decimal wheel, is stored in A. In this case R is unuseful.
If you type a register and then √ the machine makes:
M ← Register
A ← Square Root of M
First copies the contents of the selected register to M and then computes the square root as described previously.
Examples:
Computes the square root of M and the result is stored in A.
F  /   Square root of second subregister of F. Previously copies F/ onto M.
(*) Square brackets [ and ] denotes an optional parameter.

1.3.- Absolute value. When you press the
A↕ the machine computes the absolute value of A, storing the result in A. Just simply eliminates the possible negative sign of A.
Format of the instruction: A↕

2.- Transfer instructions. Copy one register to another register. There are few combinations available:

2.1.-
M↑ "Copy the contents of M into another register":
Format of the instruction: register
M↑
Examples:
B  M↑ Copies the contents of M into B.
C  /  M↑ Copies the contents of M into the second subregister of C.

2.2.-
A↓"Copy the contents of a register into A":
Format of the instruction: register A↓
Examples:
B  A Copies the contents of B into A.
C  /  A Copies the contents of second subregister of C into A.

2.3.- A↕ "Exchange the contents of A with another register":
Format of the instruction: register A
Examples:
D  A↕ Exchanges the contents of D and A.
E  /  A↓ Exchanges the contents of second subregister of E and A.
Note: Remember if you type A↕ alone the machine computes the absolute value of A.

2.4.-
/  A↕ "Copy decimal part of A into M":
Format of the instruction: / A↕
This instruction copies the decimal part of A into M. For example, if A contains 3.141592 then M will contain 0.141592. The decimal wheel selection is irrelevant.

2.5.- R  S "Exchange R and D".
Format of the instruction: R S
This special instruction exchanges the contents of R and D. It is useful when you read magnetic cards during a program execution. As D, E and F are overwritten, the RS instruction allows to save temporary D register into R.

3.- Jump instructions. Alter the execution sequence transfering the program control to a specified instruction. To make a jump you need an origin instruction and a destination instruction in a fixed combination, I mean, a particular origin instruction transfers the control to a particular destination instruction as described in the following table:

Origin: V W X Z CV CW CX CZ DV DW DX DZ RV RW RX RZ
Destination: AV AW AX AZ BV BW BX BZ EY EW EX EZ FV FW FX FZ

There are two types of origin instructions: Unconditional and Conditional. Unconditional means the machine jumps always from the origin to the destination instruction. Conditional means that the jump occurs only if the A register contains a value greater than 0 (zero). If not, the machine continues with the instruction that follows to the origin instruction. The notation for conditional jumps is similar to unconditional jumps (previous table), except for the use of a slash "/" as follows:

Origin: /V /W /X /Z C/V C/W C/X C/Z D/V D/W D/X D/Z R/V R/W R/X R/Z
Destination: A/V A/W A/X A/Z B/V B/W B/X B/Z E/Y E/W E/X E/Z F/V F/W F/X F/Z

There are 32 jump instructions (16 unconditional and 16 conditional) and 32 destination "labels".
Unfortunately is quite confusing the usage of the letters so it is difficult to remember the relationship between origin and destination instructions. For this you can use the following remainder:

This letter: No letter C D R
Jumps to this letter: A B E F

Examples:
If you type
C  V the machine will jump to B  V (unconditional jump).
If you type
D  /  X the machine will jump to E  X only if A contains a value greater than 0 (conditional jump).

Note: When you have a program loaded in memory, you can start the program execution at a specific destination point entering the corresponding origin instruction. For example, if you press V the program will start at AV.

4.- Support instructions: There are three miscellaneous instructions:

4.1.-
* "Clear register":
Format of the instruction: register *
Clears (store zeroes) the specified register.
Examples:
B  * clears B register.
D  /  * clears the second subregister of D.

4.2.-
"Print register":
Format of the instruction: register
and /◊
Prints the specified register. The special notation
/◊ "vertical spacing" leaves a blank line to separate blocks of print-outs.

4.3.- S "Start/Stop program":
Format of the instruction: S
This instruction stops the program execution and wait for an external entry. The user enter a number and then press S to restart execution. This number is stored in M register and can be use in further operations.

The following table summarizes the Programma 101 instruction set:
Square brackets [ and ] denotes an optional parameter.

Mathematical instructions:
[register] + Add Adds M or register to A.
[register] - Subtract Subtracts M or register from A.
[register] x Multiply Multiplies M or register to A.
[register] : Divide Divides M or register by A.
[register] √ Square Root Square root of M or register into A.
A↕ Absolute Value Absolute value of A into A.

Transfer instructions:
register M↑ Copy from M Copy M into register.
register A↓ Copy into A Copy register into A.
register A↕ Exchange A Exchange A and register.
/ A↕ Copy decimal part Copy decimal part of A into M.
R S Exchange R and D Special exchange of registers R and D.

Jump instructions:
An origin instruction V, W, X, Z, CV, CW, CX, CZ, DV, DW, DX, DZ, RV, RW, RX and RZ jumps inconditionally to a destination instruction AV, AW, AX, AZ, BV, BW, BX, BZ, EY, EW, EX, EZ, FV, FW, FX and FZ, respectively.
An origin instruction /V, /W, /X, /Z, C/V, C/W, C/X, C/Z, D/V, D/W, D/X, D/Z, R/V, R/W, R/X and R/Z jumps to a destination instruction A/V, A/W, A/X, A/Z, B/V, B/W, B/X, B/Z, E/Y, E/W, E/X, E/Z, F/V, F/W, F/X and F/Z respectively, if A register contains a value greather than 0 (zero).

Support instructions:
register * Clear register Clear register.
register Print register Print register.
/◊ Print space Print blank line.
S Start/Stop Start a program or Stop program to allow input.



How to use constants in programs:
When you type a program there is no way to enter a numeric constant, for example 3.1415 for Pi. One solution is to enter the constant as any other argument of the program. Also, you can store the constant into a register in a magnetic card. But if you want to store the constant as a part of the program, you must use a special sequence of instructions. This instructions will store the constant into M register.

First you must enter the special pseudo-instruction A  /  A↑ to indicate the start of a constant definition and then you must enter a special instruction for each digit of the constant, beginning from the last digit. The last instruction of the sequence will contains the first digit of the constant. Instructions for the digits have two parts: An attribute part and a digit part, the instruction must combine both codes:

Attribute part
Last digit? Sign Decimal point? Code
No + No R
No + Yes R/
No - No F
No - Yes F/
Yes + No D
Yes + Yes D/
Yes - No E
Yes - Yes E/
Digit part
Digit Code
0 S
1 M
2 A↓
3  A↕
4 +
5 -
6 x
7 :
8  ◊
9 *
Last digit? -This digit is the last of the sequence. Only the last digit must say "Yes".
Sign -The sign of all digits must be the same.
Decimal point? -This digit includes the decimal point at the right. Only one digit can say "Yes".

For example: To store the value 3.1415 into M you must type this complex sequence:

A  /  A↑ Begin of the constant sequence
R  - Digit 5, no last digit, Positive, no decimal point
R  M↑ Digit 1, no last digit, Positive, no decimal point
R  + Digit 4, no last digit, Positive, no decimal point
R  M↑ Digit 1, no last digit, Positive, no decimal point
D  /  A↕ Digit 3, last digit, Positive, decimal point after this digit: "3."



Program instructions print-outs:
When you print a program, the printer uses only two columns for the instructions, please see detailed pictures of the printer, so it needs to abreviate the notation.
Letters with the split operator are printed in lowercase and two-characters instructions like A↕ are printed only the rightmost characters, I mean, .
For example: This instruction
E  /  A↓ is printed simply as e  


A simple program example:
I'll show you a classic program exercise I wrote to compute the factorial of an integer number.
Factorial of "n" is denoted as n! and is defined as n x (n-1) x (n-2) x ... x 1 (of course x1 is not needed).
For example: 5! is 5x4x3x2x1=120.

We will use 3 registers:
Register B: Contains the argument "n" and will be decremented by 1 in each loop.
Register C: Contains the result, at the start is 1, and will be multiplied by the contents of B in every loop.
Register D: Contains the constant 1 to be used to decrement the contents of B in every loop.

The program is this: (see column Instruction)

Instruction: Operation: Description:
A  V   Label AV, the program starts here when you press the key V
 S    Wait for user input, the number "n" will be stored into the register M
B  M↑ B ← M Initialize the register B with the argument "n" stored in M
A  /  A↑   Start of a constant definition
D  /  A↓ M 1 Store constant 1 into the register M
C  M↑ C M Initialize the register C with the constant 1 stored in M
D  M↑ D M Initialize the register D with the constant 1 stored in M
A  /  W   Label A/W, loop start
B  A↓ A B Store B into A for the multiplication
C  x A A x C Multiplication
C  A↕ C ↔ A Exchange C and A to store A into C
B  A↓ A B Store B into A for decrement
D  - A A - 1 Decrement A by 1 stored in D
/  W Cond. jump If A is greater than 0 go to label A/W, else continue
C     Print result n! and finish program execution

Remarks: This very innovative machine is in exhibition at the Museum of Modern Art (MoMa) in New York, like other designs of Mario Bellini for Olivetti like Logos 55 and Divisumma 18.
Size: 24 x 17.91 x 9.84 in, 610 x 455 x 250 mm. Weight: 65 lbs, 30 kg.
Condition: (8.5/10) Very Good, minimal marks on casing. The machine is working, except the printer hammer does not hits over the paper and the rubber belt of the printer drum has desintegrated, so the drum do not rotate.
Additional readings: "The origins of the personal computer", from www.storiaolivetti.it: click here (in italian).
"The incredible story of the first PC, from 1965": click here.
The complete Francesco Bonomi's Programma 101 website: click here.
A technical description of the Programma 101 from www.OldCalculatorMuseum.com: click here.
Download: "Olivetti Programma 101 General Reference Manual": click here.
"The Programma 101 Quick Programming Guide": click here.
Special Exhibitions: I found an Olivetti Programma 101 in exhibition at the Deutsches Museum of Munich, Germany.
Click on the picture for a full size image.

(Own pictures)

Programma 101 exhibitions at Olivetti showrooms:


Olivetti store in Paris, 1967 (1)

Olivetti Showroom. Buenos Aires, Argentina 1968 (2)
Sources:
(1): Gae Aulenti, photo by Marchi Rolly, from Domus 452, July 1967.
(2): Gae Aulenti, from Domus 466, September 1968.
Both pictures from http://www.domusweb.it


Some advertisements of the Programma 101 I found on the web, click on the thumbnail.

 
 
 
 
 

 

Books and additional images.

 

 
"Programma 101 - L'invenzione del personal computer: una storia appassionante mai raccontata" by Pier Giorgio Perotto (1) "Elementi de programmazione per calcolatore Olivetti Programma 101" by Nadia Penserini, ed Zanichelli (1) Programma 101, Biblioteca programmi, volume I, Olivetti (1) Programma 101 by Surhone, Tennoe & Henssonow, Betascript Publishing "Walking through the Italian computer history" by Associazione Italiana per l'informatica ed il Calcolo Automatico  
Programma 101 on movable computer desk (2) Programming sheet Program card Program card Concerned with curve fitting?  

(1) This books are available for download at http://www.microatena.it/
(2) Source: http://www.georgenelsonfoundation.org/george-nelson/works/olivetti-206.html

Pictures of my Programma 101.

 

Pictures taken with

 

Home | Contact