The Nanoprocessor is a mostly-forgotten processor developed by Hewlett-Packard in 1974 as a microcontroller for their products. Strangely, this processor couldn’t even add or subtract, probably why it was called a nanoprocessor and not a microprocessor. Despite this limitation, the Nanoprocessor powered numerous Hewlett-Packard devices ranging from interface boards and voltmeters to spectrum analyzers and data capture terminals. The Nanoprocessor’s key feature was its low cost and high speed: Compared against the contemporary Motorola 6800, the Nanoprocessor cost $15 instead of $360 and was an order of magnitude faster for control tasks.
Recently, the six masks used to manufacture the Nanoprocessor were released by Larry Bower, the chip’s designer, revealing details about its design. The composite mask image below shows the internal circuitry of the integrated circuit. The blue layer shows the metal on top of the chip, while the green shows the silicon underneath. The black squares around the outside are the 40 pads for connection to the IC’s external pins. I used these masks to reverse-engineer the circuitry of the processor and understand its simple but clever RISC-like design.
This is a very detailed and in-depth article, so definitely not for the faint of heart. Definitely a little over my head, but I know for a fact there’s quite a few among you that love and understand this sort of stuff deeply.
The thought of a processor without an ALU, reminds me how much programming is done without much mathematics. (aside from boolean logic).
Yes, but if I understand right the article, it has increment/decrement instructions, so it can add and subtract, only that it does it more slowly.
I don’t know. I don’t think it is possible to have a processor without at least one ALU. You need a program counter after all.
javiercero1,
Usually a counting circuit is considered more elementary than an ALU.
Also, it’s not even technically necessary to have a program counter at all. A turing machine can be implemented with shift registers or even some kind of physical sliding mechanism.
https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/turing-machine/one.html
Well, sure… you don’t even need a silicon chip for a Turing machine, just an infinite roll of paper.
It’s not just the program counter, but branching and comparison… you still need some kind of ALU.
Honestly, this doesn’t sound like a processor at all. Just a very early version of a chipset.
javiercero1,
Actually the point was that our CPUs are no more capable than turning machines, which don’t need an ALU. The functions of an ALU can be built on top of simpler logic gates. Having an ALU is desirable, but not strictly necessary.
I’ve never worked with a processor that didn’t support addition or subtraction, but I have worked with processors that didn’t support multiplication and division (and floating point as well). The absence of these is annoying, but you can overcome it by implementing the missing functionality yourself. It doesn’t take much in terms of logic gates to create the building blocks for a “software defined ALU”, assuming you have enough address space to work in.
Give me a NAND gate and I’ll build the world
The HP NP had branching. Check out the code below reverse engineered from the article. Controlling human operated devices, like volt meters. usually involves long waits. Plenty of time to add with increments or multiply with shifts (if it had shift). Also check out the ability to manipulate individual accumulator bits and branch on bits. I bet lots of shortcuts are made possible by that, including multiplying faster than incrementing and with no shift.
d0 STR-0 Store the next byte (7) in register 0.
07
0c SLE Skip two instructions if accumulator <= register 0.
03 DED Decrement the accumulator in decimal mode
5f NOP No operation
d0 STR-0 Store the next byte (0x31) in register 0
31
30 SBZ-0 Skip two instruction bytes if accumulator bit 0 is zero
81 JMP-1 Jump to 0x1c9 (end of this code block)
c9
a1 CBN-1 Clear accumulator bit 1
d0 STR-0 Store the next byte (0x30) in register 0
30
0f SAN Skip two instruction bytes if accumulator not zero
d0 STR-0 Store next byte (0x28) in register 0
These old processors must be taken into the context of the epoch. In the late 60’s /early 70’s, microprocessors were made of dozen of chips, progressively reduced as higher integration components would be fabbed.
This processor could be used as a sequencer without an ALU, but you could also add an external ALU to make it a more conventional CPU. HP didn’t have do design their own ALU chip as Texas Instruments sold versatile and high performance ALUs (74181…). At that date, HP fabrication technology was lagging (metal gate transistors) so it was cheaper to use a COTS chip than make a larger compoment.
In the 70’s, it’s quite normal to have high-performance CPUs made of a few complex chips : ALU, Memory, sequencer…
In the realm of microcontrollers, Fairchild F8 is also original, there is an ALU in the microprocessor, but no program counter, no index register. These registers are in the attached ROM[s] or memory controller. The processor has no address bus.