The Web Site to Remember National Semiconductor's Series 32000 Family


After the team in England build succesfully the 32016 Second Processor in a small FPGA (see Systems/Acorn/Downgrading the M32632 to NS32016) they looked for other projects. And they find one: emulating the 32016 Second Processor on a Raspberry Pi. This small computer is based on an ARM processor running at 700 MHz. The team has already emulated some other processors, see their thread at

The team found an emulation of a Series 32000 processor written in C in the internet. This project was started some years ago but it was not finished. The current status of the code including the improvements of the team can be found at github.

One central part of each second processor is the tube. Of course this device is not available on a Raspberry Pi. Therefore it is replaced by a software interface to an SPI port. The SPI port is transfering data serially over three signal wires. This interface is not found in a BBC Micro. But there is an FPGA emulation of the BBC Micro available, the BeebFPGA. It is no problem to include the SPI port into the FPGA. If you want to know more about the BeebFPGA go here.

Figure 1 shows the hardware ensemble for the emulation. The BeebFPGA is implemented in the DE1 board of Altera. It is an FPGA development board with a lot of stuff to play with. The mass storage devices of the BBC Micro are emulated by an SD card. Therefore no additional hardware is necessary. The small Raspberry Pi is shown in the upper right corner. The coloured cable between the DE1 board and the Raspberry Pi is the SPI connection. The grey cables at the bottom right side are used for an logic analyzer. They are not required for normal operation of the board.

Fig. 1. Maximum of emulation: the DE1 from Altera emulates the BBC Micro and the Raspberry Pi emulates the 32016 Second Processor.

The emulator is working quite well. PanOS, bas32, bas32f and the Fortran compiler are running. Numbers for CLOCKSP are available. After they included floating point support I have sent them the Linpack benchmark. Figure 2 shows the output of the emulator running Linpack.

Fig. 2. The Emulator running the Linpack benchmark as of 19 March 2016: the result is correct, but the performance is very low ...

The Linpack result was a surprise to me. Because of the 700 MHz ARM processor I was expecting a terribly fast beast. But the emulation is slower than an NS32532 running at 25 MHz: 300 kflops versus 340 kflops. See M32632/Performance/Linpack for further results. Currently the code of the emulator is not optimized for speed. There is for sure some room for improvements ...

I took the original source code and modified it a little bit. The result is a basic form of the emulator. Basic means that only a minimum system with a 256 kBytes memory starting at address 0 and no peripherals is emulated. The source code is available here:

After compilation the usage is simple, just enter "emul32k inputfile". "inputfile" is a binary file which is loaded at address 0. Program execution of Series 32000 microprocessors starts at address 0. The program runs until it executes a BPT (Breakpoint Trap) instruction. When the emulator stops it shows the register content. The floating-point registers are only shown if the F-flag in the configuration register is set. Two options are available. Entering a hexadecimal address after "inputfile" shows the memory content starting at the given address. 8 lines of 16 bytes are printed by default. The last option changes the number of lines printed.

An example assembler program is given in the zip file, prim.32K . It can be assembled with the crossassembler, see Software/Crossassembler.

Currently there are some limitations in the emulator software. Address generation is limited to 24 bits. This is done because the linker program uses the upper 8 bits not for addresses. The MMU is not supported. The FPU emulation depends on the floating-point characteristic of the host. For a true FPU emulation independent of the host the arithmetic operations should be programmed in C.

This chapter was last modified on 2 October 2016. Next chapter: GNU Toolchain