Files
sibo-playground/docs/reference/07-hardware.md
T

582 lines
35 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.4042].
### 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 A0A20 generated across ports B/D/C, with **CS0CS3**
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) · `D0D7` · `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 12 then tri-states, slave drives D0D7) [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.89].
- **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.1011]:
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** (CS0CS7) [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 A27A24; **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:
**CS0CS3 = peripheral blocks, CS4CS7 = memory devices 14** [HDK p.2526].
**Reset config** is read from the data bus (**Info Byte**, D0D7) and A24A27 (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.5355]
| Reg | Name | R/W | Notes |
|-----|------|-----|-------|
| **0** | **Data Register** | R/W | Drives/reads D0D7 (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 **In0In2** and X2. Write: bits S3S0 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 A0A3. |
| **3** | **Address Register** | W (multi-byte, LSB first) | Loads all 28 address lines. Bytes: **ATO = A0A7, AT1 = A8A15, AT2 = A16A23, AT3 = A24A27**. Writing the first byte resets A8A27 to 0. AT3 bits 46 can steer CS0CS3. 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** (14), 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.5859]: 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]: `In0In2` 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]:
- **PA0PA7** — 8-bit non-latched GP I/O; in peripheral mode **PA0PA3 = 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 PA0PA7 is the memory data bus.
- **PB0PB7** — latched output / **counter** mode; in pack mode = address **A0A7**.
- **PD0PD7** — GP outputs; in pack mode = address **A8A15**; in peripheral mode **PD0/PD1/PD2 =
UART TX, RTS, DTR**.
- **PC0PC4** — in pack mode = address **A16A20**; in peripheral mode **PC4/PC7** = inverted
edge-triggered interrupt inputs, **PC5** = interrupt output, **PC6** = GP latched output +
pack/peripheral select at reset, **PC0PC3** = a **dual synchronous serial port** for magnetic
card readers.
**UART details** [HDK p.2930, 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 (PC0PC3) take clocked serial data [HDK p.30].
**Reset config** read from **PA0PA7** (device type/size, like ASIC4); **PC6** selects pack vs
peripheral; in peripheral mode PA0PA7 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.5657, 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 PB0PB7 (= A0A7 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 PD0PD7; subsequent (multiwrite) writes latch Port C, incl. **SEL0/SEL1** choosing CS0CS3. 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.5657) 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.5152; `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**:
`AD0AD7` (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 `1001FF`, port 2 `2002FF`; 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.1416]
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.512 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.1920, 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.5359].
- **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.5661].
- **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.