Southampton BASIC System explained

See also: SOB (disambiguation). Southampton BASIC System (SOBS) was a dialect of the BASIC programming language developed for and used on ICT 1900 series computers in the late 1960s and early 1970s; it was implemented as an incremental BASIC interpreter under the MINIMOP operating system at the University of Southampton[1] and also ran under MAXIMOP.

It was operated from a Teletype terminal, though CRT terminals could also be used.

Language characteristics

In common with many early implementations of BASIC, SOBS needed lines to have line numbers, both to allow a user to add new lines to the program in the desired place and also as targets for GOTO and GOSUB statements. A RENUMBER facility was available to allow for sections of the code to be renumbered, by default in increments of 10, to allow more space in the middle of a program.

Other than line numbers, all numeric values were represented internally as floating point.

Statements

The language had relatively few statements by comparison with modern programming languages:

StatementPurpose
DATAStored data for READing into variables at runtime
DIM ''var''(''size'')...Dimension an array. One-, two- and three-dimensional arrays were supported.
ENDHalt execution of the program.
FOR ''var''=''start'' TO ''end'' [STEP ''incr'']Perform a set of statements repeatedly for varying values of var
GOSUB ''line''Call a subroutine at a given line number; flow would return to the next statement when a RETURN was executed.
GOTO ''line''Unconditional branch to a given line number.
IF ''expr'' THEN ''line'' [ELSE ''line'']Conditionally branch. The THEN and ELSE parts could only give line numbers to go to.
INPUT ''var''Prompt the user for input data
LET ''var''=''expr''Assign a value to a variable. Unlike many modern dialects of BASIC, LET was not an optional word.
NEXT ''var''Perform the next iteration of a FOR loop.
PRINTOutput to the Teletype
READ ''var''...Read data from DATA statements into variables
REMShort for REMark, this allowed for a comment to be placed on a line
RESTORE [''line'']Reset the READ pointer in order to re-read DATA
RETURNReturn to the line following a GOSUB.
Note in particular the lack of a WHILE-like statement; FOR was the only looping construct available to programmers.

Variables

Variable names for numeric values were either a single letter, or a single letter followed by a single numeric digit, thus allowing for 286 discreet variables in total. Strings were supported; variable names for them had the same restriction but were followed by a pound (£) symbol.

Functions

A limited number of numeric functions were provided, all of which took one numeric parameter:

FunctionFunction(

x

) returned
SIN

\sinx

COS

\cosx

ATN

\arctanx

SQR

\sqrt{x}

LOG

logx

EXP

ex

INTThe largest integer not greater than

x

SGN-1, 0, or 1, depending on whether

x

was less than, equal to, or greater than zero
ABS

-x

if

x

was negative, otherwise

x

Support for strings was more limited, with only one function, LEN, which returned the length of the string parameter. Sub-strings were supported with square brackets, so A£[2,3] referred to the sub-string of the string from the 2nd character to the 3rd character inclusive, so10 LET A£ = "FOO"20 PRINT A£[2,3]would print OO

This syntax was also supported on the left-hand side of an assignment, so10 LET A£ = "FOO"20 LET A£[2,2] = "BAR"30 PRINT A£would print FBARO

Arrays

Support for handling arrays of data was relatively strong, with MAT statements able to read an entire array from DATA statements, and perform useful matrix operations such as matrix addition, matrix subtraction, matrix multiplication, and finding the inverse matrix for a square matrix.

Example:10 DIM A(3,3)20 MAT READ A30 DATA 1,1,2,1,0,2,0,2,140 DIM B(3,3)50 MAT READ B60 DATA 0,0,1,0,1,0,1,0,070 DIM C(3,3),D(3,3)80 MAT C=A*B90 MAT D=INV(C)100 MAT PRINT D,

A is read from the first DATA statement

\begin{pmatrix} 1&1&2\\ 1&0&2\\ 0&2&1 \end{pmatrix}

B is read from the second DATA statement

\begin{pmatrix} 0&0&1\\ 0&1&0\\ 1&0&0 \end{pmatrix}

C is calculated by multiplying A and B

\begin{pmatrix} 2&1&1\\ 2&0&1\\ 1&2&0 \end{pmatrix}

D is calculated as the inverse of C

\begin{pmatrix} 2&2&1\\ 1&-1&0\\ 4&-3&-2 \end{pmatrix}

The output would be2 2 11 -1 04 -3 -2

Debugging

SOBS had primitive debugging capabilities, limited mostly to the TRACE statement. TRACE ON would cause the interpreter to print each line number as it was executed.

Notes and References

  1. Rees . M.J. . Oppenheimer . A.W. . SOBS – an incremental BASIC system . Software: Practice and Experience . Wiley InterScience . 21 January 1977 . 7 . 5 . 631–643 . https://archive.today/20130105083634/http://www3.interscience.wiley.com/journal/113444749/abstract?CRETRY=1&SRETRY=0 . dead . 5 January 2013 . 10.1002/spe.4380070508 . 33989728 . 18 May 2009.