Skip to main content
  1. Posts/

ZX Spectrum's CPU couldn't do multiplication

Today I Learned that programming on the ZX was harder than I imagined. The Z80 processor wasn’t exactly a state-of-the-art design when the ZX launched, but I never anticipated that it didn’t even come with something I take for granted today: a simple multiply instruction.

The naive approach was to make additions inside a loop, but there’s a clever technique that takes that multiplication algorithm we learned back in school and applies it to binary digits. Since anything times 0 is 0 and times 1 is itself, this approach doesn’t need a pre-computed multiplication table like we did in school. It also can save some loops by using bitwise operations. Clever.

An example: Multiplying 26 (11011) by 12 (1100)

         11011 
 ×        1100
————————————————
         00000
        00000∙
       11011∙∙
 +    11011∙∙∙
————————————————
     101000100

Result: 324 (101000100)

Other computers from that era also had to resort to these techniques, some because their CPU also lacked a multiply instruction (Commodore 64 [MOS 6510], Apple II [MOS 6502]) and other because the CPU instruction for multiplication was slower than other procedural division algorithms such as the IBM PC (Intel 8086) — in the case of x86, however, the faster algorithm relied on a pre-computed memory table, thus trading memory for speed; see the linked article.