HP Saturn

The Saturn family of 4-bit (datapath) microprocessors was developed by Hewlett-Packard in the 1980s first for the HP-71B handheld computer, released in 1984, and later for various HP calculators (starting with the HP-18C). It succeeded the Nut family of processors used in earlier calculators. The HP48SX and HP48S were the last models to use HP manufactured Saturn processors, later models used processors manufactured by NEC. The HP 49 series initially used the Saturn CPU until the NEC fab could no longer manufacture the processor for technical reasons in 2003. Starting with the HP 49g+ model in 2003, the calculators switched to a Samsung S3C2410 processor with an ARM920T core (part of the ARMv4T architecture) which ran an emulator of the Saturn hardware in software. In 2000, the HP 39G and HP 40G were the last calculators introduced based on the actual NEC fabricated Saturn hardware. The last calculators introduced to use the Saturn emulator were the HP 39gs, HP 40gs and HP 50g in 2006, as well as the 2007 revision of the hp 48gII. The HP 50g was the last calculator sold by HP using this emulator when it was discontinued in 2015 due to Samsung stopping production of the ARM processor on which it was based.

Architecture
The Saturn hardware is a nibble serial design as opposed to its Nut predecessor, which was bit-serial. Internally, the Saturn CPU has four 4-bit data buses that allow for nearly 1-cycle per nibble performance with one or two buses acting as a source and one or two acting as a destination. The smallest addressable word is a 4-bit nibble which can hold one binary-coded decimal (BCD) digit. Any unit of data in the registers larger than a nibble, up to 64-bits, can be operated on as a whole, however the Saturn CPU performs the operation serially on a nibble-by-nibble basis internally.

The Saturn architecture has an internal register width of 64 bits and 20-bits of address, with memory being addressed to 4-bit (nibble) granularity. Saturn ALU instructions support variable data width, operating on one to 16 nibbles of a word. The original Saturn CPU chips provided a four-bit external data bus, but later Saturn-based SoCs included on chip bus conversion to an 8-bit external data bus and 19-bit external address bus.

The Saturn architecture has four 64-bit GPRs (General Purpose Registers), named A, B, C and D. In addition, there are also five 64-bit "scratch" registers named R0, R1, R2, R3 and R4. These can only store data. If an ALU operation is required for data in a scratch register, then the register in question must be transferred to a GPR first. Other registers include a 1-nibble "pointer" register named P, usually used to select a nibble in a GPR or a range of nibbles (or for aligning immediate data on a specific nibble in a GPR, with wrap-around). For memory access, there are two 20-bit data pointer registers named D0 and D1. The Saturn architecture also has a PC or program counter register which can interoperate with the GPRs. There is also an 8-level, circular, LIFO 20-bit hardware return stack named RSTK used when a subroutine call instruction is issued. Additionally, the Saturn CPU is equipped with a 16-bit software status register named ST and a 1-nibble hardware status register named HS, which notably, contains the SB or "sticky bit" flag indicating whether a binary 1 was right shifted off of a GPR. Furthermore, the Saturn architecture has a 12-bit OUT register and a 16-bit IN register, which in the Yorke and Clarke SoCs, are used to capture input from the keyboard and also control the beeper. There is also a 1-bit carry flag register.

In addition to the above, the Saturn CPU has a simple, non-prioritized interrupt system. When an interrupt occurs, the CPU finishes executing the current instruction, saves the program counter to the hardware return stack (RSTK) and jumps to address 0x0000Fh, where the preceding value is in nibbles. The CPU also interacts with the keyboard scanning logic directly.

The following diagram depicts the registers (with each white square being 4-bits / a nibble except for the Carry flag, which is 1 bit):

Saturn 64-bit GPR register format and fields:

Data in the general purpose registers can be accessed via fields that fall on nibble boundaries, whereas the scratch registers allow only load and store operations. The fields, as shown in the above diagram, are W (whole 64-bit GPR), A (address, first 5 nibbles of a GPR), S (sign of mantissa, most significant nibble of a GPR), XS (exponent sign, nibble 2 of a GPR), M (mantissa, nibbles 3–14 of a GPR), X (exponent, first 3 nibbles of a GPR) and B (first byte of a GPR). In addition, there is the P field which selects a nibble from a GPR based on the P register's 4-bit value. Also, there is the WP field which selects nibbles 0 through the nibble selected in the P register. The 64 bits (16 nibbles) can hold BCD-formatted coded floating point numbers composed of a sign nibble (which is "9" if the number is negative), 12 mantissa digits and a 3-digit 10's complement exponent stored in BCD format (±499). The internal representation of BCD floating point values are a 15-digit mantissa with one sign nibble in one register combined with a 20-bit exponent, in 10's complement format, in another register. The use of BCD instead of straight binary representation is advantageous for calculators as it avoids rounding problems that occur on the binary/decimal conversion.

The Saturn CPU's instruction and data addresses are also nibble-based. The three pointer registers (including the program counter) and address registers are 20 bits wide. Due to this, the Saturn architecture can address 1 M nibbles or, equivalently, 512 K bytes. Beyond that size (e.g. in the 48GX), bank switching is used.

The original HP-71B handheld computer and the HP-28C had the Saturn processor as a separate chip. In the HP 48S/SX, 48G/GX series and HP-28S, HP-27S, HP-42S, HP-32SII and HP-20S, the Saturn CPU core is integrated as part of a more complex integrated circuit (IC) SoC.

Example code
The following is an integer implementation of a BCD decimal square root algorithm in Saturn Jazz / HP Tools assembly syntax:

** In the following A.W is assumed to contain the argument (< 1E14).
 * The result (IP(SQRT(A.W))) is in C.W:

SETDEC ASL    W        C=A     W        A=A+A   W          A=A+A   W        A=A+C   W        ASR     W        C=0     W        P=      13 LC(1)  5 -      CSR     WP        C=C-1   P  --      C=C+1   P          A=A-C   W          GONC    -- A=A+C  W          CSR     W          P=P-1 P=P-1 GONC   - SETHEX A=C    W

Chipsets and applications
The original Saturn CPU gave its name to the entire instruction set architecture. Later chips had their own code names:

The CPU code-names are inspired by members of the Lewis and Clark Expedition of 1804–1806, the first United States overland expedition to the Pacific coast and back. The virtual CPU / emulator code names were inspired by the prototype "New-Yorke" Saturn-based 8 MHz SoC that never made it to production. According to one of the ACO (Australian Calculator Operation) members, "Big Apple" was derived from the code name "New-Yorke" of the prototype 8 MHz Saturn-based SoC in a reference to New York city, hence the names "Big apple", "Mid Apple" and "Little Apple".