# OS/8

OS/8 is the primary operating system used on the Digital Equipment Corporation's PDP-8 minicomputer.
PDP-8 operating systems which precede OS/8 include:
* R-L Monitor, also referred to as MS/8.
* P?S/8, requiring only 4K of memory.
* PDP-8 4K Disk Monitor System
* PS/8 ("Programming System/8"), requiring 8K. This is what became OS/8 in 1971.
Other/related DEC operating systems are OS/78, OS/278, and OS/12. The latter is a virtually identical version of OS/8, and runs on Digital's PDP-12 computer.
Digital released OS/8 images for non-commercial purposes which can be emulated through SIMH.

## Overview

OS/8 provides a simple operating environment that is commensurate in complexity and scale with the PDP-8 computers on which it ran. I/O is supported via a series of supplied drivers which uses polled (not interrupt-driven) techniques. The device drivers have to be cleverly written as they can occupy only one or two memory pages of 128 12-bit words, and have to be able to run in any page in field 0. This often requires considerable cleverness, such as the use of the OPR instruction (7XXX) for small negative constants.
The memory-resident "footprint" of OS/8 is only 256 words; 128 words at the top of Field 0 and 128 words at the top of Field 1. The rest of the operating system (the USR, "User Service Routines") swaps in and out of memory transparently (with regard to the user's program) as needed. This disk-resident (or more properly, system-device-resident) part of OS/8 is the first 14K words (56 blocks) of the SYS: device, including swap space.
The remaining memory contents are preserved between some of the basic user commands. This is exploited by the process by which executable programs are built: for example, an assembly language program is first assembled into a .BN (binary) file. Then one or more .BN files are loaded into memory using the LOAD (ABSLDR) command. You could then execute the loaded program with the START command, debug it with ODT, or SAVE it to a .SV file which can be later retrieved with the GET command or executed immediately with R or RUN commands. Information about the currently loaded program is maintained in the CCB (Core Control Block), which is located on the SYS: device. This information includes which parts of memory are used by the program (which parts should be saved) and the program's starting address.
This concept of preserved memory being associated with a user or job also appears in other DEC operating systems, including TOPS-10 for the PDP-10, where such memory is known as a context.
OS/8 can boot from a hard disk and present the command prompt in under half a second.

## The Concise Command Language

Early versions of OS/8 have a very rudimentary command-line interpreter with very few basic commands: GET, SAVE, RUN, ASSIGN, DEASSIGN, and ODT. With version 3 they add a more sophisticated overlay called CCL (Concise Command Language) that implements many more commands. OS/8's CCL is directly patterned after the CCL found on Digital's PDP-10 systems running TOPS-10. In fact, much of the OS/8 software system is deliberately designed to mimic, as closely as possible, the TOPS-10 operating environment. (The CCL command language is used on PDP-11 computers running RT-11, RSX-11, and RSTS/E, providing a similar user operating environment across all three architectures: PDP-8s, PDP-10s, and PDP-11s.)
The basic OS and CCL implements many rather sophisticated commands, many of which still do not exist in modern command languages, not even in MS-DOS, Windows, or Unix-like operating systems.
For example, the COMPILE command automatically finds the right compiler for a given source file and starts the compile/assemble/link cycle.
The ASSIGN and DEASSIGN commands permit the use of logical device names in a program instead of physical names (as required in MS-DOS). For example, a program can write to device FLOP:AAA.TXT, and with an initial "ASSIGN FLOP: RXA2:" then the file is created on physical device RXA2 (the second floppy disk drive). VAX/VMS and the Amiga's operating system AmigaOS (and other OSes built around TRIPOS) make considerable use of this feature.
The SET command is capable of setting many system options by patching locations in the system binary code. One of them, a command under OS-78, is SET SYS OS8, which re-enables the MONITOR commands that are not part of OS-78.
The BUILD command can reconfigure the OS on the fly, even adding device drivers, often without having to reboot the OS.

## The OS/8 Filesystem

OS/8 supports a simple, flat file system on a variety of mass storage devices including:
* TU56 DECtapes
* DF32 32KW fixed-head disks
* RF08 256KW fixed-head disks
* RK01/02/03/04/05 cartridge disk drives
* RL01/02 cartridge disk drives
* RX01/02 floppy diskette drives
Filenames on the PDP-8 take the form of FFFFFF.XX where "F" represents an uppercase, alphanumeric character of the filename and "X" represents an uppercase, alphanumeric character of the extension (filetype).
* .PA : Assembly language
* .SV : saved core-images (executable programs)
* .FT : Fortran source files
* .DA : Data files
The contents of any given file is stored contiguously in a single "extent". Allocation works as follows: a program first opens a tentative file (using the User Service Router (USR) "ENTER" function). This assigns either the largest free extent to the file, or if the desired file size is known in advance, the smallest extent that it fits in. ENTER returns the starting block number and size of the file to the program which then writes to the file by directly calling the device driver. Once writing is complete, the program calls the USR "CLOSE" function. CLOSE marks the tentative file as a permanent file and creates an extent for the remaining free space for future allocations. It also deletes (marks as available free space) any other file with the same name. This facilitates replacing an existing file with a new version, for example after editing ("CLOSE" doubles as the file deletion call). Only one tentative file per volume may be open at a time. This seems limiting, but works for something like the PAL8 assembler since only one output file is generated at a time for each pass.
PIP includes an option to compress ("squeeze") the filesystem, so that all unallocated space is moved to a single extent at the end of the disk. This can be invoked by the SQuish CCL command, much as MUNG can be used to run a TECO macro.
OS/8 volumes have a limited maximum storage size (4096 blocks of 256 twelve-bit words) and the RK05 (2.4MB) moving-head disk exceeds this size: "1.6 million words of storage". Because of this, RK05 cartridges are divided into two partitions. For example, the first RK05 on a system is known as both RKA0: (SY:) and RKB0:. This division refers to "the outer cylinders" and "the inner cylinders".

### ASCII

There are two systems for handling ASCII text. ASCII files are stored as three 8-bit characters per pair of 12-bit words. The first two characters (marked with bits a0–a7 and b0–b7 below) are stored whole in their words, while the third character (bits c0–c7) is stored with half of its bits in word 1 and the other half in word 2.
* WORD 1: c0 c1 c2 c3 | a0 a1 a2 a3 a4 a5 a6 a7
* WORD 2: c4 c5 c6 c7 | b0 b1 b2 b3 b4 b5 b6 b7 ASCII files end with a CTRL/Z (ASCII 232).
6-bits per character uppercase only ASCII strings are also used. In this case, two characters efficiently fit in each word. This is used for filenames in directory entries, but also for strings in BASIC. In BASIC, even though strings use 6-bit characters, you may print any 8-bit code by using the PNT function within PRINT, for example use PNT(27) to print an ASCII ESC character.

### OS/8 date format

OS/8 allocates the PDP-8's 12 bit words for storing dates per:
* 4 bits for the month
* 5 bits for the date therein
* 3 bits for the year.
The insufficiency of a three-bit year field, capable of storing only eight years, was recognized when COS-310 was developed.

## OS/8 CUSPs (Utility Programs)

The CUSPs (Commonly-Used System Programs, that is utilities) supplied with OS/8 include:
* BUILD (the program to install a configured OS/8 system onto mass storage)
* DIR (the directory-listing program)
* EDIT (A line-oriented editor)
* MACREL (A relocating assembler that, unlike PAL, implements macros. Written by Stanley Rabinowitz of DEC's Small Systems Group. Stan had an ASCII-artwork picture of a fish in his office that said "MACREL IS A FISH")
* FLAP (An absolute assembler derived from RALF)
* FORTRAN-II.
* FOTP (File-Oriented Transfer Program, an alternative to PIP)
* PAL (The assembler)
* PIP (the Peripheral Interchange Program, used to copy files)
* PIP10 (a version of PIP used to copy files to from PDP-10 DECtapes)
* RALF (Another relocating assembler for the FPP)
* TECO (Text Editor and COrrector, a sophisticated editor). The MUNG command runs TECO macros.
* CCL, the command line interpreter, supplied in source form and user-extensible.

## Programming languages
### BASIC

A single-user BASIC and two multi-user versions of BASIC are available as options.
The single-user BASIC uses several overlays to provide the full functionality of the language; when OS/8 is booted from a DECtape, a noticeable delay occurred each time BASIC is required to switch overlays as they need to be read from tape.
The multi-user versions of BASIC (EDU20 and EDU25) differ only in whether or not they support block-replaceable devices (DECtape or disk). Due to cost constraints, many PDP-8s have punched paper tape readers as their only mass-storage I/O device. EDU20 loads from paper tape and can do output to a paper tape writer if the machine has one, whereas EDU25 understands the structure of a filesystem, can load from DECtape or disk, and can create files on DECtape or disk. Both can run multiple BASIC programs simultaneously using a primitive task-scheduler that round-robins among the attached terminals. Memory is always tight because the PDP-8 uses core memory, which was extremely expensive compared to RAM technology. In 8K of 12-bit words EDU20 can support up to 4 terminals at once, although more memory was recommended. EDU25 requires an additional 4K memory bank (for a minimum of 12K) because the code contains a disk device driver and a filesystem handler. While running, EDU20 and EDU25 are self-contained programs that don't use any OS/8 system calls. Immediately upon being invoked from the OS/8 command interpreter, they overwrite OS/8's entire resident portion – all 256 words of it. Upon startup, EDU25 saves the contents of memory to DECtape or disk and restores it upon exit. But EDU20 cannot do this as it is targeted at hardware configurations without any block-replaceable device.

### FORTRAN

In addition to a freely available FORTRAN II compiler, there is also a rather complete FORTRAN IV compiler available. This compiler generates code for the optional FPP-8 floating-point processor, which is essentially a separate CPU, only sharing memory with the PDP-8 CPU. With the FPP-8 option installed, the FORTRAN runtime code detects it and uses the FPP-8 to run the main program code, and the PDP-8 CPU runs as an I/O processor. Lacking the FPP-8, the runtime code instead calls an FPP-8 interpreter running on the PDP-8 CPU, so the program runs at reduced speed.
This FORTRAN IV compiler in version 1 has the interesting bug that DO loops counted incorrectly: DO loops would count 1,2,3,5,6,7,… (skipping 4). A quick patch was released to fix this.