Skip to main content

The Analytical Engine vs. The ZX81

Many people got started with computing in my age group with the Sinclair ZX81 (which in the US was sold as the Timex Sinclair 1000).


Reading through Allan Bromley's excellent papers on Babbage's Analytical Engine (as described in 1847) I thought it might be fun to compare the two machines.

The ZX81 has 1KB of memory in which programs and data had to be stored. The Analytical Engine as first imagined would have had 50 variables capable of each storing a 30 digit decimal number. That's equivalent to each variable having 100 bits and hence the memory for the Analytical Engine would have been 5000 bits (675 bytes). Later Babbage proposed much larger memory sizes with up to 50 decimal digits per variables and 1000 variables: that would have been a memory of 166 bits per variable or over 20 KB of memory.

Critically, the Analytical Engine's programs would be stored on punched cards and executed directly from them so that entire memory space was for data (not the program). In contrast the ZX81 had to load the program from magnetic tape into its 1KB of RAM.

But the ZX81 was much, much faster than Babbage's machine. It had a clock speed of 3.25 MHz. The Analytical Engine was based around a standard cycle time of 1/7s which is the same as 7Hz. To get an idea of the speed of the machines, here's a comparison of a 100 bit add on the two machines.

On the Analytical Engine it would take about three seconds to fetch the two numbers from memory (the store) and perform the addition. Although this is long Babbage added the ability to do a pipeline of multiple additions with overlapped reads from memory and addition happened in parallel. The ZX81 does not have that ability.

On the ZX81 in Z80 assembler a 100 bit addition (which I've done as 13 8-bit additions here) could be implemented as follows. I've assumed that IX and IY are pointing to the operands in memory and that the result will be stored in the memory addressed by IY.

LD A,(IX+0)
ADD A,(IY+0)
LD (IY+0),A
LD A,(IX+1)
ADC A,(IY+1)
LD (IY+1),A
LD A,(IX+2)
ADC A,(IY+2)
LD (IY+2),A

[...]

LD A,(IX+12)
ADC A,(IY+12)
LD (IY+12),A

Each instruction there takes 19 clock cycles and there are a total of 39 instructions giving 741 clock cycles. With the Z80 running at 3.25MHz that set of instructions takes 0.228 ms. So for that addition the ZX81 would have been 13,000x faster.

Obviously, this is slightly bogus because there are other more complex and slow instructions in the Analytical Engine (such as division) but it gives an idea of the scale.

So, the ZX81 had much less RAM than the Analytical Engine (and who doesn't remember all the trouble of fitting everything into RAM on those machines) and was forced to use it to hold programs, but the Analytical Engine was slow in comparison.

PS If you'd like to see the Analytical Engine built, read this.

Comments

aglemann said…
"So, the ZX81 had much less RAM than the Analytical Engine"

I thought I read from your description that the ZX81 had 1KB of RAM and the AE 0.375KB - am I missing something?
I was comparing the AE proposed top memory of 20KB with the ZX81's 1KB. I will modify the text to make that clearer.
Anonymous said…
Indexed instructions are fairly slow, so it'd be faster switching to using DE+HL instead of IX+IY.

LD A,(DE)
ADD A,(HL)
LD (HL),A
INC DE
INC HL
...

7+7+7+6+6=26T compared to 19+19+19=57T for the index register method – twice as fast!

You can save a further 4T by incrementing only the low byte of the pair, if the values are arranged so they don't span 256-byte boundaries.
Unknown said…
You could get a 16KB RAM expansion pack for the ZX81 for about £50 (and you could play 3D Monster Maze on it too)
Carlos Valiente said…
"In contrast the ZX81 had to load the program from magnetic tape[..]"

..for those of you whose elder brother let you use his tape recorded -- I had to type my programs a la Babbage :-)
Richard Jones said…
Actually the Z80 did some very simple pipelining. It was able to overlap the fetch of the next instruction while retiring the previous instruction.

See: http://www.z80.info/z80arki.htm
Unknown said…
Babbage invented pipelining? In the 1840’s? Wow, incredible. Genius. (http://en.wikipedia.org/wiki/Pipelining)
Kurtkilgor said…
This comment has been removed by the author.
Lutyens said…
The ZX81 had to use the 1KB for the display file too, so even basic AE may have had more memory. If you plug in the 16KB RAM pack, lots of memory, but did the Analytical Engine have an equivalent of the Ram pack wobble problem?
CodeMonkey said…
I feel the analytical engine is being undersold here. The Z80 add you show is in binary, the AE does a 2x50 digit addition in BCD. My quick attempt at a 50 + 50 BCD addition on a 3.25MHz Z80 is 0.5ms. I think the AE can do it in 4 cards:
Load Store to Mill
Load Store to Mill
Add
Load Mill to Store
If that is 4 cycles @ 7Hz= 0.57s
The Z80 is "only" 1124 times faster
HOWEVER
If the AE performs a multiplication in the same time as an addition (I am trying to find this out) I think the AE possibly could beat the Z80 here!!!
Now how about division, that is more complex/slower than multiplication.
Again how many cycles does the AE take to do a division?
CodeMonkey said…
Curses I am undone!
The AE is (of course) multicyclic on multiplications and divisions.
Babbage had invented some clever look ahead mechanics but it looks like it would still take 59 cycles @ 7Hz ie 8.5 seconds to do a 50 x 50 decimal multiplication. The Z80 is going to beat it.
HOWEVER what about comparing it to the "first" microprocessor- the Intel 4040........

Popular posts from this blog

Your last name contains invalid characters

My last name is "Graham-Cumming". But here's a typical form response when I enter it:


Does the web site have any idea how rude it is to claim that my last name contains invalid characters? Clearly not. What they actually meant is: our web site will not accept that hyphen in your last name. But do they say that? No, of course not. They decide to shove in my face the claim that there's something wrong with my name.

There's nothing wrong with my name, just as there's nothing wrong with someone whose first name is Jean-Marie, or someone whose last name is O'Reilly.

What is wrong is that way this is being handled. If the system can't cope with non-letters and spaces it needs to say that. How about the following error message:

Our system is unable to process last names that contain non-letters, please replace them with spaces.

Don't blame me for having a last name that your system doesn't like, whose fault is that? Saying "Your last name …

All the symmetrical watch faces (and code to generate them)

If you ever look at pictures of clocks and watches in advertising they are set to roughly 10:10 which is meant to be the most attractive (smiling!) position for the hands. They are actually set to 10:09.14 if the hands are truly symmetrical. CC BY 2.0image by Shinji
I wanted to know what all the possible symmetrical watch faces are and so I wrote some code using Processing. Here's the output (there's one watch face missing, 00:00 or 12:00, because it's very boring):



The key to writing this is to figure out the relationship between the hour and minute hands when the watch face is symmetrical. In an hour the minute hand moves through 360° and the hour hand moves through 30° (12 hours are shown on the watch face and 360/12 = 30).
The core loop inside the program is this:   for (int h = 0; h <= 12; h++) {
    float m = (360-30*float(h))*2/13;
    int s = round(60*(m-floor(m)));
    int col = h%6;
    int row = floor(h/6);
    draw_clock((r+f)*(2*col+1), (r+f)*(row*2+1), r, h, floor(m…

Importing an existing SSL key/certificate pair into a Java keystore

I'm writing this blog post in case anyone else has to Google that. In Java 6 keytool has been improved so that it now becomes possible to import an existing key and certificate (say one you generated outside of the Java world) into a keystore.

You need: Java 6 and openssl.

1. Suppose you have a certificate and key in PEM format. The key is named host.key and the certificate host.crt.

2. The first step is to convert them into a single PKCS12 file using the command: openssl pkcs12 -export -in host.crt -inkey host.key > host.p12. You will be asked for various passwords (the password to access the key (if set) and then the password for the PKCS12 file being created).

3. Then import the PKCS12 file into a keystore using the command: keytool -importkeystore -srckeystore host.p12 -destkeystore host.jks -srcstoretype pkcs12. You now have a keystore named host.jks containing the certificate/key you need.

For the sake of completeness here's the output of a full session I performe…