# Psion SIBO / Workabout — Hardware Reference for Programmers

Scope and sources. This reference is compiled **only** from two Psion manuals:

- **HDK** — *The Psion SIBO Hardware Development Kit*, Psion PLC, Rev 1.00, May 1995.
- **WPG** — *Workabout Programming Guide* (Workabout Programmers Reference), hardware
  appendices / introduction.

Citations are given as `[HDK p.N]` or `[WPG §/p]`. Where a fact is asserted by the manuals it is
cited; nothing here is invented. The manuals themselves note that both refer onward to a separate
*Hardware Reference manual* and *SIBO Computers Programmers Reference* for the full physical
memory map — those documents are **not** in scope, so the memory-map section below is limited to
what the two supplied manuals actually state, and gaps are marked explicitly.

> **MX note.** The two supplied manuals describe the **V30H**-based Workabout (NEC V30H at
> 7.68 MHz) and the ASIC1/ASIC2/ASIC4/ASIC5/ASIC9 family. **They do not mention the V30MX or
> ASIC9MX.** Every statement about the **V30MX / ASIC9MX / Workabout MX** in this document is
> therefore flagged as **[MX — not in supplied manuals]** and is presented only as an orientation
> note, not as a sourced fact. Treat all MX specifics as *uncertain / to be confirmed against the
> MX hardware reference.*

---

## 1. SIBO architecture overview

All Psion machines in this family are built on the proprietary **SIBO** ("SIxteen Bit Organiser")
architecture: a battery-powered, 8086-class computer system designed for size, weight and power
[HDK p.2; WPG §basic hardware].

Key components of the architecture [HDK p.2; WPG p.1-x]:

- An **8086-class processor**.
- A **power-management system** that selectively powers subsystems under software control.
- An **asynchronous high-speed serial protocol** (the *Psion SIBO serial interface*) between the
  machine and its peripherals.
- **Solid State Disks (SSDs)** — fast, low-power, silicon mass storage, no moving parts.
- **Hardware protection** from aberrant software: trapping of out-of-range addressing, plus a
  **watch-dog timer** that fires if interrupts are left disabled too long.
- **Real-time clock**, **ROM-resident system software**, **graphics LCD**.
- On some models: touch digitiser pad; ISDN-8-bit combo sound.

The digital logic of a SIBO machine is implemented in custom **ASICs** (Application Specific
Integrated Circuits). At the time of the HDK there were **ten** SIBO ASICs; all are static-CMOS
surface-mount parts [HDK p.2].

### 1.1 Processor (NEC V-series)

- The MC/HC/Series 3 and the Workabout use the **NEC V30H**, "an enhanced 16-bit CMOS version of
  the 8088 found in the original IBM PC … software compatible with the 8088" [HDK p.2].
- **Workabout:** NEC V30H, clocked at **7.68 MHz** [WPG p.1-x, Tech Spec: "NEC V30 running at
  7.68 MHz"].
- The V30H is a **fully static** design: all internal storage (registers) is static, so there is
  **no minimum clock speed** and the clock can be stopped at any instant with **no loss of state**.
  SIBO exploits this to stop the clock while the CPU is idle, saving power [HDK p.2].

> **[MX — not in supplied manuals]** Later Workabout variants are marketed as the **Workabout MX**,
> based on the **NEC V30MX** core integrated in the **ASIC9MX**. Neither the V30MX nor ASIC9MX
> appears in the HDK or WPG supplied here; their clock rate, memory reach and register differences
> are **not documented in these sources** and must be confirmed elsewhere. Software written to the
> V30H/8086 programming model and the ASIC register interfaces below is the documented baseline.

### 1.2 Chip integration levels

- **Discrete generation** (MC, HC, Series 3): three principal chips — **V30H + ASIC1 + ASIC2**
  [HDK p.2].
- **Integrated generation** (Series 3a, Workabout): V30H, ASIC1 and ASIC2 collapsed into a single
  custom chip, **ASIC9** (plus general I/O and PSU-control logic). ASIC9 "integrates all the
  digital logic required to produce a SIBO architecture computer less the memory onto one chip",
  and adds a free-running clock (FRC) and a codec interface for sound [HDK p.4].

So on the Workabout, the functions attributed below to "ASIC1" (system/interrupt/LCD) and "ASIC2"
(peripheral/serial-protocol/power) are physically inside **ASIC9** [HDK p.4].

> **[MX — not in supplied manuals]** On the MX, the equivalent single-chip part is **ASIC9MX** with
> the **V30MX** core. Same architectural role as ASIC9 is assumed; specifics unconfirmed here.

---

## 2. The ASICs and their roles

| ASIC | Role (from HDK p.4) |
|------|---------------------|
| **ASIC1** | Main **system controller**. Connects directly to the V30H, controlling all CPU bus cycles (forming a micro-controller-like unit executing 8086 code). Blocks: bus controller, programmable timer, **eight-input interrupt controller**, **LCD controller**, memory-decode circuitry. |
| **ASIC2** | **Peripheral controller**. Contains the system clock oscillator; controls standby↔operating switching; interfaces to PSU, keyboard, buzzer and SSDs; contains the **eight-channel SIBO serial-protocol controller**; drives the reduced-external and extended-internal expansion ports. |
| **ASIC4** | Serial-protocol **slave** for addressing memory / memory-mapped peripherals. Used in SSDs. A cut-down ASIC5. See §5. |
| **ASIC5** | General-purpose I/O **slave** with an on-board **UART**; several modes (RS232 / parallel / barcode / card-reader / memory pack). See §6. |
| **ASIC9** | Composite: **V30H + ASIC1 + ASIC2** + general I/O + PSU control on one die; adds FRC and codec interface. Used in S3a and Workabout. |

On the **host** side of the SIBO serial link the controller (SPC) is in **ASIC2** (HC/MC/S3) or
**ASIC9** (S3a/Workabout). On the **peripheral** side the slave (SPS) is **ASIC4** or **ASIC5**
[HDK p.4, p.6].

> **[MX — not in supplied manuals]** **ASIC9MX** — the composite CPU/LCD/system chip on the MX — is
> not described in these sources. Assume it plays the ASIC9 role (V30MX core + ASIC1/ASIC2
> functions). No register-level MX detail is available here.

---

## 3. Memory: ROM / RAM / SSD and segments

What the supplied manuals state:

- **ROM:** all Workabout models have **1 MB internal masked ROM** holding the OS (EPOC), the
  MS-DOS-like Command Processor, OPL editor and other utilities [WPG p.1-9, Tech Spec].
- **RAM:** Workabout ships with either **256 KB** or **1 MB** internal RAM (Tech Spec lists memory
  build codes A=256 KB, B=512 KB, C=1 MB, D=2 MB) [WPG p.1-x, Tech Spec, serial-number table].
- **SSD:** two SSD drives, exposed as **drive A:** (top) and **drive B:** (bottom); RAM or Flash
  SSDs, "up to 8 MB" of extra storage [WPG p.1-3, Tech Spec]. SSDs retain data independently of the
  main power source [WPG p.1-4]. Contents of the internal RAM are preserved across power-off (the
  machine resumes previous state on power-on) [WPG p.1-x].
- **Internal drive M:** internal RAM is also exposed as a filing volume **M:** (with
  `M:RAMDRIVE`), formattable like an SSD volume [WPG §FORMAT, §MEM].

### 3.1 The programmer's memory model (segments, protection)

- The CPU is 8086-class, so software sees the standard **16-bit segmented** address model
  (segment:offset, 16-byte "paragraphs") [HDK, WPG passim]. `LSEG` reports each segment's **segment
  address**, **size in paragraphs** (1 paragraph = 16 bytes) and **access count** [WPG §LSEG].
- **Memory protection:** any attempt by an application to write **outside its own data segment**
  causes the OS to terminate it (a **"panic"**); likewise leaving interrupts disabled too long
  (watch-dog) [WPG §Resetting; HDK p.2].
- **`MEM`** reports free RAM in KB; this exceeds free bytes on `M:` because "some parts of internal
  memory are reserved for code and data segments" [WPG §MEM].
- The OS **moves memory segments** at runtime (e.g. when a driver is installed/removed). Drivers
  must cope: FAR return addresses into the OS stay valid, but a driver's own absolute segment
  address may change, so ISR/PDD addresses must be re-established on **resume** (see §7.4)
  [HDK p.40–42].

### 3.2 Banking / paging — status in these sources

The physical **memory map and paging/banking scheme of the host CPU are not laid out in the
supplied manuals**; both defer to the separate *SIBO Computers Programmers Reference* / *Hardware
Reference* [WPG p.1-3: "See the SIBO Computers Programmers Reference manual for further details
regarding SSDs"; HDK p.2]. What the HDK *does* document is the **address decode inside ASIC4/ASIC5
slaves**, i.e. how a peripheral or SSD's own address space is banked via **chip-select blocks**:

- **ASIC4:** 8 chip-selects forming selectable **addressing blocks**, size software-defined,
  **default 32 KB/block**; the filing system re-sizes the block when reaching the top of the
  address space [HDK p.24]. Up to **28 address bits (256 MB)** in Extended mode; **21 bits + 4
  chip-selects (4 × 2 MB)** in SSD/compatibility mode [HDK p.25]. See §5.
- **ASIC5 (pack mode):** address lines A0–A20 generated across ports B/D/C, with **CS0–CS3**
  selected by SEL0/SEL1; **counter mode** on port B auto-increments the low address so 256
  consecutive locations can be read without re-addressing [HDK p.30, p.57].

> **Gap flagged:** the host-side ROM/RAM/SSD address ranges, and any V30-level bank registers, are
> **not in these two manuals**. Do not infer them from the peripheral-side decode above.

---

## 4. SIBO serial protocol (host ↔ peripheral bus)

Everything a program does to an ASIC4/ASIC5 peripheral goes over the **two-wire synchronous SIBO
serial link** [HDK p.6]:

- **CLK** — clock, always **output from the controller** (ASIC2/ASIC9). Nominal **3.84 MHz** for
  memory interfaces; **1.536 MHz continuous** for peripherals. Tri-stated low when idle
  [HDK p.6].
- **DATA** — bi-directional, synchronous. Direction is set by the transport layer, not the
  physical layer. Changed on falling CLK edge by the transmitter, latched on rising edge by the
  receiver; pulled low when idle [HDK p.6].

**Framing (physical layer).** 12-bit frames, 8 data bits each → theoretical max ≈ **312 KB/s**
[HDK p.6]. Frame = `ST` (start, goes high) · `CTL` (0 = control frame, 1 = data frame) · `I1`
(idle/turn-around) · `D0–D7` · `I2` (idle) [HDK p.7]. Four frame types: **Null** (sync all slaves —
12 clocks with DATA held low), **Control**, **Data-out** (controller→slave), **Data-in**
(slave→controller; controller drives cycles 1–2 then tri-states, slave drives D0–D7) [HDK p.7].

**Transport layer.** The controller has two registers: a write-only **Control register** and a
read/write **Data register** (byte or word) [HDK p.8]. Control bytes are classified by **bit 7,
the Select (S) bit**:

- **S = 0 — Slave-select mode.** Byte = `R` (reset bit) + **6-bit slave ID**. ID 0 is illegal, so
  up to **63 slaves** per controller. `R=0` resets, `R=1` selects. Selecting a slave with `R=1`
  makes it return a **non-zero 8-bit info byte**; a reply of **0 means no slave of that ID present**
  [HDK p.8–9].
- **S = 1 — Slave-control mode.** Byte = `R/W` (0=write,1=read) · `B/W` (0=byte,1=word) · `S/M`
  (0=single,1=multi) · 4 slave-specific data bits. Byte-pair (word) transfers are **listed as not
  implemented** [HDK p.9].

**Timing rules (clock cycles, ≈260 ns each at 3.84 MHz)** [HDK p.10–11]:
control-byte process = 12 cycles; byte transfer = 12 cycles; byte-pair = 24 cycles. After writing
the control register, wait ≥12 cycles before touching the data register or writing another control
word.

Assembler helper macros the HDK uses for all of this [HDK p.52]:

| Macro | Action |
|-------|--------|
| `SCONTOUT` | Output control byte in AL |
| `SDATAOUT` | Output data byte in AL |
| `SDATAIN`  | Input a data byte into AL |
| `SBUSY`    | Wait while the link is busy |
| `XNOP`     | Short wait |
| `HwNullFrame` | Emit a null frame to sync slaves |

Serial-protocol control defines (`SerialSelect`, `SerialReadSingle`, `SerialWriteSingle`, slave
IDs) live in `ospack.inc` / `ossibo.inc` [HDK p.59].

---

## 5. ASIC4 — memory / peripheral slave

Purpose: convert SIBO serial frames into the address/data/control signals needed to drive memory
and memory-mapped peripherals; used in SSDs and in ASIC4-based expansion boards [HDK p.24].

**Bus:** 8-bit data, **28-bit address**, **8 chip-selects** (CS0–CS7) [HDK p.24].

### 5.1 Modes (selected by slave ID)

Select ASIC4 with the appropriate ID, then read the info byte [HDK p.25]:

- **SSD / ASIC5-compatibility mode — ID 2.** Mimics an ASIC5 in pack mode; compatible with all
  existing SSD software. Max **21 address bits + 4 CS (4 × 2 MB)**.
- **ASIC4 Extended mode — ID 6.** Up to **28 address bits (256 MB)**. On reset, four extra config
  bits come from A27–A24; **A27 = M** selects standard-SSD (M=0) or **mixed mode (M=1)** —
  memory + peripherals. Mixed mode is the one of interest for peripheral developers.

**Mixed mode split:** address space halves — lower half = memory-mapped peripherals (any use),
upper half = pure memory (typically a control ROM the filing system can mount). Chip-selects split:
**CS0–CS3 = peripheral blocks, CS4–CS7 = memory devices 1–4** [HDK p.25–26].

**Reset config** is read from the data bus (**Info Byte**, D0–D7) and A24–A27 (extended nibble),
set with pull-up/pull-down resistors (~100 k so the bus can still drive the lines in normal
operation) [HDK p.26].

### 5.2 ASIC4 registers (mixed/peripheral mode) [HDK p.53–55]

| Reg | Name | R/W | Notes |
|-----|------|-----|-------|
| **0** | **Data Register** | R/W | Drives/reads D0–D7 (tri-state when idle). **On reset holds the Info Byte** (see below). |
| **1** | **Input Register** (read) / **Device-Size Register** (write) | R/W | Read: extended-info bits + live state of general inputs **In0–In2** and X2. Write: bits S3–S0 set the address-decoder block size (32 KB … 256 MB); defaults to `0x0F` (unused) on reset. |
| **2** | **Address-Increment Register** | W | A write increments address lines A0–A3. |
| **3** | **Address Register** | W (multi-byte, LSB first) | Loads all 28 address lines. Bytes: **ATO = A0–A7, AT1 = A8–A15, AT2 = A16–A23, AT3 = A24–A27**. Writing the first byte resets A8–A27 to 0. AT3 bits 4–6 can steer CS0–CS3. Cleared on reset. |
| **4,5,6** | — | — | **Not implemented.** |
| **7** | **Control Register** | W | Bits: `7 LBO · 6 TSTA · 5 LTM · 4 VPS · 3 EDA · 2 CSS · 1 WRS · 0 OES`. Setting **LBO** / **VPS** drives those pins high (usable as GP outputs). **OES/WRS** control read/write accesses. |

**Info Byte** (Reg 0 at reset) [HDK p.53]: bits encode **device type** (RAM / Intel Flash type 1 /
type 2 / read-only SSD / hardware write-protected SSD), **number of devices** (1–4), and **device
size** (000 = no SSD present, then 32 KB → 2 MB). In Extended mode a further **Extended Info Byte**
(M, De, Ne, Se) identifies the peripheral type — e.g. `1 0 0 1` = Turbo RS232 (16550), `1 0 1 0` =
3Fax, `1 1 1 1` = extended info held in ROM [HDK p.54].

**Access sequence** (bottom 256 addresses) [HDK p.58–59]: control-write to the **Address** register
→ data-write the address → control-frame read/write to the **Data** register → transfer the byte.
The HDK gives `Input`/`Output` assembler routines doing exactly this; **interrupts must be off**
during them so the host does not multitask mid-transfer.

**Other pins** [HDK p.27, p.55]: `In0–In2` GP inputs; `LBO` (open-drain low-battery driver), `VPS`
(VPP control) GP outputs; `OE`/`WR` bus control; `SCLK`/`SDAT` the serial link; `SDIR` protocol
direction bit; `POR` reset; `ATST` test (pull high = address test mode); `MCSD`/`X2D2` tie to GND
via 100 k. A PSRAM mode reuses some pins for refresh/oscillator.

---

## 6. ASIC5 — UART / parallel / barcode / card-reader slave

Three primary functions: a **UART** (up to **48000 baud**), **general-purpose I/O**, and
**address/data lines** for memory / memory-mapped peripherals [HDK p.29].

### 6.1 Modes

- **Pack mode:** generates full address/data/control to access memory; **no peripheral functions**.
- **Peripheral mode:** limited memory addressing (lines reused for I/O). Entered by setting the
  **peripheral bit (bit 0) in the Port-B mode register** [HDK p.29].

**Port re-use** [HDK p.30]:

- **PA0–PA7** — 8-bit non-latched GP I/O; in peripheral mode **PA0–PA3 = UART RX, CTS, DSR, DCD**;
  **PA4** is a change-of-state interrupt source (e.g. Centronics **BUSY**, or **RI** on the VIC —
  see below). In pack mode PA0–PA7 is the memory data bus.
- **PB0–PB7** — latched output / **counter** mode; in pack mode = address **A0–A7**.
- **PD0–PD7** — GP outputs; in pack mode = address **A8–A15**; in peripheral mode **PD0/PD1/PD2 =
  UART TX, RTS, DTR**.
- **PC0–PC4** — in pack mode = address **A16–A20**; in peripheral mode **PC4/PC7** = inverted
  edge-triggered interrupt inputs, **PC5** = interrupt output, **PC6** = GP latched output +
  pack/peripheral select at reset, **PC0–PC3** = a **dual synchronous serial port** for magnetic
  card readers.

**UART details** [HDK p.29–30, p.61]: needs the host link in **continuous-clocking** mode (baud
clocks are derived from the 1.536 MHz link clock). No internal buffering — the **Transmitter
Holding Register must be empty** before writing. One shared **active-high interrupt line**; software
reads the status/interrupt registers to find the cause. Reading the UART Status register clears the
Tx interrupt.

**Barcode:** the UART receives data from a dedicated barcode-scanner IC [HDK p.30].
**Card readers:** two synchronous serial ports (PC0–PC3) take clocked serial data [HDK p.30].

**Reset config** read from **PA0–PA7** (device type/size, like ASIC4); **PC6** selects pack vs
peripheral; in peripheral mode PA0–PA7 indicate the peripheral type (RS232 port / Centronics port,
combinable) [HDK p.31].

### 6.2 ASIC5 register set — the sixteen registers

Reading/writing a register is two steps: send a control byte selecting the register, then
read/write the data [HDK p.56]. Register list [HDK p.56–57, cross-checked against the
`SYS$AS5.ASM` defines at HDK p.102]:

| Reg | Name | R/W | Function |
|-----|------|-----|----------|
| **0** | **Port A data** | R/W | Read/write Port A; a read/write triggers a memory access cycle (pack mode) or one-cycle CS0 strobe (peripheral mode). |
| **~2** | **Port B data** | R/W | Latches PB0–PB7 (= A0–A7 in pack mode); read returns last value. |
| **~4** | **Port B mode / Inc** | R/W | **bit 0 = 0 memory / 1 peripheral (enables UART)**; also selects **counter** vs **latch** mode and "baud rate out on Port B". Counter increments on Port A access. |
| **~5** | **Port C/D write** | W | First write latches PD0–PD7; subsequent (multiwrite) writes latch Port C, incl. **SEL0/SEL1** choosing CS0–CS3. In peripheral mode PD0 = UART TX (bit 0 has no effect). |
| **6** | **Interrupt Mask** | R/W | 1 = enable that event's interrupt; 0 = disable. All disabled on reset. |
| **~7** | **Interrupt Status / Type-Ctrl** | R | Reading indicates interrupt source; bit meanings mirror the mask. |
| **8** | **UART Status / UART Control** | R/W | Format (stop/data bits, parity), break, and status (Tx empty, Rx/parity/framing/overrun errors). |
| **9** | **UART Receive / Transmit holding register** | R/W | Read = received char; write = char to transmit. |
| **10** | **UART Baud rate LSB** | W | Low byte of baud divisor. |
| **11** | **UART Baud rate MSB** | W | High byte of baud divisor. |
| **12** | **MCR shift register** | — | Magnetic-card-reader shift register. |
| **13** | **Barcode read data** | R | Returns states of the barcode lines / general interrupt bits. |
| **14** | **Synchronous Port 2 read** | R | Second synchronous serial port (card reader). |
| **(15)** | (sync port 1 / reserved) | — | Synchronous-port-1 data; documented in prose (sync port 1 & 2 char-received are distinct interrupt sources). |

> The HDK's printed register table is OCR-garbled for some indices; the register **names, R/W
> attributes and functions** above are taken verbatim from the HDK prose (p.56–57) and the
> assembler comment block in `SYS$AS5.ASM` (p.102): *Port A R/W · Port B R/W · Inc/Mode · Port CD
> write-only · Interrupt mask R/W · IntType/Ctrl · UART Status/Ctrl · Receive/Transmit · Baud Rate
> (×2, write-only) · MCR shift register · Barcode data & ints.* Exact numeric slots for the
> mid-range registers should be confirmed against the include files (`ospack.inc`, `ossibo.inc`).

**Interrupt-mask bits** [HDK p.56, and `S_*` defines p.102]: UART character received; UART
transmitter awaiting character; modem/handshake change of state; **synchronous port 1 char
received**; **synchronous port 2 char received**; **barcode data / general interrupt**. Reading the
**Interrupt Status** register (same bit layout, high = active) identifies the source [HDK p.56].

**UART Status/Control bits** (`SYS$AS5.ASM`, HDK p.102):

| Define | Value | Meaning |
|--------|-------|---------|
| `S_RXENB` | `0000_0001b` | Receive interrupt enable |
| `S_TXENB` | `0000_0010b` | Transmit interrupt enable |
| `S_TXEMPTY` | `0001_0000b` | Transmit buffer empty (status) |
| `S_RXINT` | `0000_0001b` | Receive interrupt pending |
| `S_TXINT` | `0000_0010b` | Transmit interrupt pending |
| `S_MDINT` | `0000_0100b` | Modem-status interrupt |
| `S_CTS`/`S_RTS`/`S_DCD`/`S_DSR`/`S_DTR` | `01b`/`02b`/`04b`/`02b`/`04b` | Handshake-line states |
| `OVERRUN_ERROR` | `0100_0000b` | Character overrun |
| `PARITY_ERROR` | `1000_0000b` | Parity error |
| `S_PERIPHERALMODE` | `0000_0011b` | ASIC5 RS232 (peripheral) mode |
| `S_UART_OFF` | `0000_0010b` | ASIC5 peripheral mode, UART off |

**Baud rate.** `Divisor = 1 − (96000 / desired_baud)`, written as a 16-bit word: LSB → reg 10,
MSB → reg 11 [HDK p.61]. The driver's `BaudRateTable` (HDK p.102) holds the two's-complement
divisors, e.g. `-0x077F, -0x04FF, -0x0368, -0x02CC, -0x027F, -0x013F, -0x009F, -0x004F, -0x0035,
-0x0030, -0x0027, -0x0019, -0x0013, -0x000C, -0x0009, -0x0004` for the standard rates.

### 6.3 Selecting / configuring ASIC5

Before use, select the chip (and re-select after every hold/resume from power-down, pack-door, or
insert/remove) [HDK p.56]. Selection differs by mode:

- Peripheral: `mov al,(SerialSelect or Asic5NormalId)` → `SCONTOUT` → `SDATAIN`; a **zero reply
  means no ASIC5 present** [HDK p.56].
- Pack: same with `Asic5PackId` [HDK p.56]. An **ASIC4 will answer a pack-mode select** (it
  impersonates an ASIC5 in pack mode) [HDK p.56].

---

## 7. I/O ports, interrupts and the channel model

### 7.1 Eight hardware interrupts

SIBO supports **8 level-triggered hardware interrupts**, IRQ0 (highest) … IRQ7 (lowest), handled by
the interrupt controller in **ASIC1 (or ASIC9)**. Expansion ports carry an interrupt line into this
controller [HDK p.3]:

- **Extended internal** expansion ports: **active-low** interrupt input.
- **Reduced external** expansion ports (S3a 6-pin, Workabout LIF): **active-high** interrupt input.

Servicing order [HDK p.3]:

1. Device asserts its IRQ line.
2. The controller (ASIC2/ASIC9) places the **vector of the highest-priority pending device** on the
   data bus; the CPU jumps to that ISR.
3. The ISR clears the interrupt at the device (device-specific action).
4. The ISR writes the **non-specific end-of-interrupt (NSEOI/NSEOD)** location to tell the
   controller the interrupt is cleared.
5. Repeat if another is pending.

**Nested interrupts are not possible** on these 8086-class processors [HDK p.3].

### 7.2 The four channel variables

To be portable across host machines, a driver parameterises four values per expansion channel
[HDK p.52]:

- **Channel interrupt mask** — an 8-bit value OR'd into the mask register (`A1InterruptMask` or
  `A9BInterruptMask`, depending on whether the controller is ASIC1 or ASIC9) to enable interrupts on
  that channel; also passed to `HwGetChannel` / `HwFreeChannel`.
- **Channel interrupt number** — 16-bit, used with `GenSetRevector` / `GenResetRevector` to say
  which default ISR the driver replaces.
- **Channel interrupt vector** — 16-bit pointer to the driver's ISR.
- **Hardware SIBO channel** — used by `HwSelectChannel` to route serial frames to that channel.

### 7.3 Per-platform channel map [HDK p.52]

| Host | Controller | Ports and channels |
|------|-----------|--------------------|
| **Series 3** | ASIC2 | Expansion port C = serial **channel 7**, interrupt `Asic2Int` (IRQ4), select `SelectChannel7`. |
| **Series 3a** | ASIC9 | Expansion port C = serial **channel 5**, mask `A9MSlave`, revector `IHwIrq2Revector` (IRQ2), select `SelectChannel5`. |
| **Workabout / HC (3-channel)** | ASIC9 / ASIC2 | Port **A** (top) and port **B** (bottom) internal + port **C** (side/cradle); masks `ExpIntLeftA` / `A9MExpIntA`, `ExpIntRightB` / `A9MExpIntB`, plus the slave/`Asic2Int` channel; selects `ExpChannelLeftA`, `ExpChannelRightB`, `SelectChannel5/7`. |

Build flags select the machine so one driver source compiles for all: **Consumer (S3a)** = 1 SIBO
channel; **HC/S3C** = 3 channels; S3 = single-channel [HDK p.51–52; `SYS$AS5.ASM` p.102].

### 7.4 Owning and selecting a channel

The S3/S3a/HC have **three** Psion serial links: two are the SSD slots, the third is the expansion
port [HDK p.60]. Only **one link is selected at a time**.

- **`HwGetChannel`** (AL = channel interrupt mask): reserve a channel; **carry clear = success**.
  Normally called from the driver's **open** vector; open should fail if the channel is unavailable
  [HDK p.60].
- **`HwFreeChannel`** (AL = mask): release it (on close) [HDK p.60].
- **`HwSelectChannel`** (AL = select code): make a channel current; **returns the previously
  selected channel in AL** so it can be restored on exit [HDK p.60].

Discipline [HDK p.60]: select the correct channel on entry to any vector/ISR that talks down it, and
restore the previous one on exit. **Disable interrupts (multitasking) between select and restore** —
but only briefly, because the **watch-dog** forbids leaving interrupts off indefinitely; hence
comms happen in short bursts. Idiom:

```asm
    pushf
    cli
    mov  al, SelectChannel5
    HwSelectChannel        ; old channel returned in AL
    push ax
    ; ... Input / Output to the peripheral ...
    pop  ax
    HwSelectChannel        ; restore previous channel
    popf
```

### 7.5 Channel unit letters (open qualifiers)

A driver can support several channels distinguished by a **single-letter qualifier** appended to
the device name, allocated from `'A'` [HDK p.38]. Convention: **A = top port, B = bottom port,
C = side/cradle port** [HDK p.38]. Example: `p_open(&pcb,"PAR:A",-1)`. On the S3a only **one** SIBO
channel (port C) can be opened; on Workabout/HC up to **three** (A, B, C) [HDK p.38]. The VIC's
extra serial connectors appear to the Workabout as standard serial devices **ports I and F**, and
the extended 15-way port is addressed as **port C** [WPG Appendix A, VIC].

### 7.6 Direct I/O (HC extended internal ports)

On the HC's 25-way extended internal ports, expansion devices also get **direct processor I/O**:
`AD0–AD7` (multiplexed addr/data, low half only → up to 128 I/O addresses, even addresses only),
`ALE`, `IOWR`, `IORD`, `EES` (External Expansion Select — high during I/O to that device), `INTR`
(active-high IRQ to ASIC1). Port 1 decodes I/O `100–1FF`, port 2 `200–2FF`; A0 is always low for
valid writes so A1 is the lowest usable address line [HDK p.19]. Each HC port also carries one SIBO
serial channel (port 1 = channel 5, port 2 = channel 6) [HDK p.20]. (The Workabout uses a 26-way
Torson connector for its internal expansion — see §8.)

---

## 8. Expansion slots, ports and connectors

### 8.1 Overview by machine [HDK p.2]

| Machine | SSD ports | Expansion |
|---------|-----------|-----------|
| MC / HC | 2 | Two independent single-row **25-way extended internal** ports (SIBO channel + direct parallel I/O + 7.2 V battery). |
| Series 3 / 3a | 2 | One **6-pin reduced external** port (port C): SIBO serial channel + limited power (**< 25 mA**). |
| **Workabout** | 2 (A: top, B: bottom) | Two internal expansion points + one **11-pin LIF** external port. Each internal port = single-row **26-way** carrying two high-speed serial ports. |

### 8.2 Workabout internal 26-way (Torson) connector [HDK p.13]

Signals: **Vcc1** = 3.0 V nominal, **≤ 100 mA**; **Vcc2** = 5 V nominal, **≤ 200 mA**; **RUN**
(low = powered down, high = powered up — used to power-down/reset the module); **SCK2/SCK3** serial
clocks (run continuously at **1.536 MHz** when the port is in use; clock the ASIC5 UART in the
RS232-AT/TTL and AT/Barcode modules); **SD2/SD3** bi-directional serial data; **EINT1/EINT2**
active-low interrupt inputs; **EXON** active-high turn-on. All logic at **3.0/3.3 V** (per Vcc1).
Unused lines are reserved for a codec interface.

The Workabout expansion module (RS232/TTL or RS232/Barcode) connects the main board to the module
via this 26-way Torson connector + flexi cable; modules are **factory-fitted** [WPG p.1-3,
Appendix A]. The RS232/TTL module runs up to **19,200 baud**; the RS232/Barcode module uses an HP
HBCR-1612 micro to decode and transmit barcode data at up to **9,600 baud** [WPG Appendix A].

### 8.3 Workabout external 11-pin LIF connector [HDK p.14–16]

The reduced external port for connecting to the Cradle system. Standard pin functions (Polarisation
Type B, cradle perspective) [HDK p.16]:

| Pin | Name | Function |
|-----|------|----------|
| 1 | LCA | Local Computer Active — high when the computer is on. Workabout can **source 100 mA** from this pin (HC/HCDOS: 5 mA). |
| 2 | EXON | External switch-ON, active-high (+5 V) — asserted by a remote/cradle device to switch the computer on. |
| 3 | THERM | Battery thermistor terminal. |
| 4 | DLA | Disconnect Local ASIC (does not apply to Workabout). |
| 7 | VIN | Power supply to computer (+10 V). |
| 8 | SCLK | Serial-channel clock. |
| 9 | GND | Power / signal ground / −ve battery (1 A). |
| 10 | SDATA | Serial-channel data. |
| 11 | STATUS | Cradle status; pulled-up for open-collector sensing (low = remote device present). |

Type-A polarisation repurposes several pins for RS232 signals. The LIF cover can be moulded with a
polarising pin in up to four positions to differentiate variants [HDK p.14].

### 8.4 S3/S3a 6-pin reduced external port (port C) [HDK p.12]

Six wires: **MSD/MCLK** (a master SIBO serial channel — **channel 7 on S3, channel 5 on S3a**),
**SDS/INT** and **SCK/EXON** (dual-function: form a slave serial channel, or SDS/INT is an
active-high interrupt, and a rising edge on SCK/EXON wakes the machine from standby), **VCC** (+5 V,
switched off in standby, **max 25 mA**). Opening the pack doors on an S3a or Workabout **cuts power
to external peripherals** [HDK p.12].

---

## 9. Power

- **Workabout power sources** [WPG p.1-4, Appendix A]: NiCd rechargeable pack **or** 2 × AA
  alkaline (main), plus a **3 V lithium CR1620 backup** battery that preserves internal RAM when the
  main source is absent (recommend yearly replacement; alone it preserves memory for a limited
  period). External: a Series 3 mains adaptor via the **LIF Converter** (also trickle-charges), and
  (from Jan/Feb 1997) a **vehicle power adaptor** / Docking Station.
- Power management is **software-controlled** and selective; the machine auto-switches-off after
  ~5 minutes idle by default [WPG p.1-4, §basic hardware].
- Under **low battery** the Workabout may run the screen/keyboard but refuse to write Flash SSD or
  access expansion devices; it turns off if such an operation is attempted [WPG p.1-4].
- **States:** standby vs operating/idle. In standby, switched supplies (VCC/Vcc2) are **off**;
  peripheral designs must not drive lines high in standby (pull-down inputs cause excessive standby
  current) [HDK p.12, p.19].
- **Peripheral power budgets** (from the connector tables): S3a port C **< 25 mA**; HC 25-way Vcc2
  **50 mA** (or use unregulated **Vsup** 5.5–12 V with a low-dropout regulator for higher loads);
  Workabout Torson **Vcc1 100 mA / Vcc2 200 mA**; LIF **LCA 100 mA** [HDK p.12, p.19–20, p.13,
  p.16].
- **Power-fail handling for drivers** [HDK p.41]: on power loss there is ~**2 ms** to power
  everything down; the hold vector must be fast or the RAM-hold voltage drops and the machine
  cold-reboots, losing internal RAM (including any loaded driver). On a power-fail hold the OS has
  already reset the SIBO channels, so a channel driver need only record the reason for its resume
  vector. Hold reasons passed in AH: `DevHoldNormal` (memory move), `DevHoldPowerDown` (standby),
  `DevHoldPowerFail` (supply lost) [HDK p.42].

---

## 10. The SIBO serial link (host ↔ PC / peripheral)

- The **3-Link** is an **ASIC5-based** cable that converts the S3/S3a port-C SIBO serial channel to
  **RS232** (host ↔ PC/printer), using the ASIC5 on-board UART + line drivers [HDK p.5, p.35].
- Workabout communications: the OS provides serial comms at up to **19,200 baud**, with **XMODEM /
  YMODEM** (and ZMODEM except in early models) file transfer, plus a scripting language for modem
  control [WPG §basic hardware, Tech Spec].
- The high-speed inter-machine link is the same continuously-clocked SIBO serial channel described
  in §4; the physical media are the S3a 6-pin port C, the HC 8-pin side port C (used by the HC
  cradle), or the Workabout 11-pin LIF via the LIF Converter [HDK p.12, p.20; WPG Appendix A].

---

## 11. Programmer's cheat-sheet

- Talking to a peripheral = **own a channel** (`HwGetChannel`) → **select it** (`HwSelectChannel`,
  save/restore the old one, interrupts off, short bursts) → drive the slave with control/data frames
  via `SCONTOUT`/`SDATAOUT`/`SDATAIN` → **free it** (`HwFreeChannel`) on close [HDK p.52, p.60].
- **ASIC4 access** = set Address register (multi-byte, LSB first) → read/write Data register; only
  even/low-256 addresses in the simple routines; interrupts off during a transfer [HDK p.53–59].
- **ASIC5 UART** = enable continuous clocking, set peripheral bit (Port-B mode bit 0), write baud
  divisor `1 − 96000/baud` (LSB reg 10, MSB reg 11), set format in UART Status/Control (reg 8),
  Tx via reg 9 only when `S_TXEMPTY`, Rx via reg 9, one shared active-high IRQ; read status/interrupt
  registers to find the cause [HDK p.56–61].
- **Interrupts** = 8 levels, IRQ0 highest, level-triggered, **no nesting**; clear at the device then
  write NSEOI [HDK p.3].
- **Segments** = 8086 model; writing outside your data segment or hogging interrupts → **panic**
  [WPG §Resetting; HDK p.2].

---

## 12. Known gaps / uncertainties in these sources

- **V30MX / ASIC9MX / Workabout MX:** absent from both supplied manuals. All MX statements above
  are flagged **[MX — not in supplied manuals]** and are orientation only. Confirm against the MX
  hardware reference.
- **Host CPU physical memory map and any bank/page registers:** not in these manuals (deferred to
  *SIBO Computers Programmers Reference* / *Hardware Reference*). Only the peripheral-side
  (ASIC4/ASIC5) chip-select block decode is documented here.
- **Exact ASIC5 register numeric slots (regs ~2, 4, 5, 7):** the printed table is OCR-damaged; names
  and functions are reliable (prose + `SYS$AS5.ASM`), but verify the numeric indices against
  `ospack.inc` / `ossibo.inc`.
- Several connector pin tables in the WPG appendix are OCR-garbled (RS232 module pinouts, VIC 15-way
  pinout); signal names are recoverable but pin numbers should be checked against a clean copy.
