HOME

TheInfoList



OR:

FOCAL (acronym for Formulating On-line Calculations in Algebraic Language, or FOrmula CALculator) is an interactive interpreted
programming language A programming language is a system of notation for writing computer programs. Programming languages are described in terms of their Syntax (programming languages), syntax (form) and semantics (computer science), semantics (meaning), usually def ...
based on
JOSS JOSS (acronym for JOHNNIAC Open Shop System) was one of the first interactive, time-sharing programming languages. It pioneered many features that would become common in languages from the 1960s into the 1980s, including use of line numbers as bo ...
and mostly used on
Digital Equipment Corporation Digital Equipment Corporation (DEC ), using the trademark Digital, was a major American company in the computer industry from the 1960s to the 1990s. The company was co-founded by Ken Olsen and Harlan Anderson in 1957. Olsen was president until ...
(DEC)
PDP PDP may refer to: Computing and technology * Packet Data Protocol in wireless GPRS/HSDPA networks * Parallel distributed processing in Connectionism#Parallel distributed processing, connectionism * Plasma display panel * Policy Decision Point in t ...
series machines. JOSS was designed to be a simple language to allow programs to be easily written by non-programmers. FOCAL is very similar to JOSS in the commands it supports and the general
syntax In linguistics, syntax ( ) is the study of how words and morphemes combine to form larger units such as phrases and sentences. Central concerns of syntax include word order, grammatical relations, hierarchical sentence structure (constituenc ...
of the language. It differs in that many of JOSS' advanced features like ranges and
user-defined function A user-defined function (UDF) is a function provided by the user of a program or environment, in a context where the usual assumption is that functions are built into the program or environment. UDFs are usually written for the requirement of its c ...
s were removed to simplify the
parser Parsing, syntax analysis, or syntactic analysis is a process of analyzing a string of symbols, either in natural language, computer languages or data structures, conforming to the rules of a formal grammar by breaking it into parts. The term '' ...
and allow the system to run in less memory. Some of the
reserved word In a programming language, a reserved word (sometimes known as a reserved identifier) is a word that cannot be used by a programmer as an identifier, such as the name of a variable, function, or label – it is "reserved from use". In brief, an '' ...
s (keywords) were renamed so that they all start with a unique first letter. This allows users to type in programs using one-character statements, further reducing memory needs. This was an important consideration on the
PDP-8 The PDP-8 is a family of 12-bit minicomputers that was produced by Digital Equipment Corporation (DEC). It was the first commercially successful minicomputer, with over 50,000 units sold during the model's lifetime. Its basic design follows the pi ...
, which was often limited to a few
kilobyte The kilobyte is a multiple of the unit byte for Computer data storage, digital information. The International System of Units (SI) defines the prefix ''kilo-, kilo'' as a multiplication factor of 1000 (103); therefore, one kilobyte is 1000&nbs ...
s (KB). Like JOSS, and later
BASIC Basic or BASIC may refer to: Science and technology * BASIC, a computer programming language * Basic (chemistry), having the properties of a base * Basic access authentication, in HTTP Entertainment * Basic (film), ''Basic'' (film), a 2003 film ...
s, FOCAL on the PDP-8 was a complete environment that included a
line editor In computing, a line editor is a text editor in which each editing command applies to one or more complete lines of text designated by the user. Line editors predate screen-based text editors and originated in an era when a computer operator typic ...
, an
interpreter Interpreting is translation from a spoken or signed language into another language, usually in real time to facilitate live communication. It is distinguished from the translation of a written text, which can be more deliberative and make use o ...
, and
input/output In computing, input/output (I/O, i/o, or informally io or IO) is the communication between an information processing system, such as a computer, and the outside world, such as another computer system, peripherals, or a human operator. Inputs a ...
routines. The package as a whole was named ''FOCAL-8'', which also ran on the
PDP-5 The PDP-5 was Digital Equipment Corporation's first 12-bit computer, introduced in 1963. History An earlier 12-bit computer, named LINC has been described as the first minicomputer and also "the first modern personal computer." It had 2,048 1 ...
and PDP-12. When ported to the
PDP-11 The PDP–11 is a series of 16-bit minicomputers originally sold by Digital Equipment Corporation (DEC) from 1970 into the late 1990s, one of a set of products in the Programmed Data Processor (PDP) series. In total, around 600,000 PDP-11s of a ...
, the resulting ''FOCAL-11'' relied on the underlying
operating system An operating system (OS) is system software that manages computer hardware and software resources, and provides common daemon (computing), services for computer programs. Time-sharing operating systems scheduler (computing), schedule tasks for ...
,
RT-11 RT-11 (Real-time 11) is a discontinued small, low-end, single-user real-time operating system for the full line of Digital Equipment Corporation PDP-11 16-bit computers. RT-11 was first implemented in 1970. It was widely used for real-time compu ...
, to provide file support and editing. The language definition was updated twice, to ''FOCAL-69'' and a very slightly modified ''FOCAL-71''. A port to the
Intel 8080 The Intel 8080 is Intel's second 8-bit computing, 8-bit microprocessor. Introduced in April 1974, the 8080 was an enhanced successor to the earlier Intel 8008 microprocessor, although without binary compatibility.'' Electronic News'' was a week ...
was also available. FOCAL is notable as the language in which the original versions of the early
video game A video game or computer game is an electronic game that involves interaction with a user interface or input device (such as a joystick, game controller, controller, computer keyboard, keyboard, or motion sensing device) to generate visual fe ...
s ''Hamurabi'' and ''Lunar Lander'' were written. Both were later ported to BASIC, where they became much better known. FOCAL was not popular outside the PDP platform and largely disappeared during the move to the
VAX-11 The VAX-11 is a discontinued family of 32-bit superminicomputers, running the Virtual Address eXtension (VAX) instruction set architecture (ISA), developed and manufactured by Digital Equipment Corporation (DEC). Development began in 1976. In ...
. It had a strong revival in the
Soviet Union The Union of Soviet Socialist Republics. (USSR), commonly known as the Soviet Union, was a List of former transcontinental countries#Since 1700, transcontinental country that spanned much of Eurasia from 1922 until Dissolution of the Soviet ...
where PDP-11 clones were used as educational and
home computer Home computers were a class of microcomputers that entered the market in 1977 and became common during the 1980s. They were marketed to consumers as affordable and accessible computers that, for the first time, were intended for the use of a s ...
s ( BK series).


History


JOSS

JOSS JOSS (acronym for JOHNNIAC Open Shop System) was one of the first interactive, time-sharing programming languages. It pioneered many features that would become common in languages from the 1960s into the 1980s, including use of line numbers as bo ...
was released in May 1963 on the one-off JOHNNIAC computer at
RAND Corporation The RAND Corporation, doing business as RAND, is an American nonprofit global policy think tank, research institute, and public sector consulting firm. RAND engages in research and development (R&D) in several fields and industries. Since the ...
. In RAND, use grew rapidly, and the machine, originally built in 1953, quickly ran out of capability. JOHNNIAC was decommissioned in 1966 and JOSS was reimplemented on a newly purchased
PDP-6 The PDP-6, short for Programmed Data Processor model 6, is a computer developed by Digital Equipment Corporation (DEC) during 1963 and first delivered in the summer of 1964. It was an expansion of DEC's existing 18-bit systems to use a 36-bit da ...
,
Digital Equipment Corporation Digital Equipment Corporation (DEC ), using the trademark Digital, was a major American company in the computer industry from the 1960s to the 1990s. The company was co-founded by Ken Olsen and Harlan Anderson in 1957. Olsen was president until ...
's (DEC) first "big" machine. Use continued to grow and by 1970, the system was being used by 500 to 600 users across the country and had spawned several innovations such as mobile
computer terminal A computer terminal is an electronic or electromechanical hardware device that can be used for entering data into, and transcribing data from, a computer or a computing system. Most early computers only had a front panel to input or display ...
s that could be wheeled from room to room and plugged in for quick access. JOSS was highly influential. It emerged just as
time-sharing In computing, time-sharing is the Concurrency (computer science), concurrent sharing of a computing resource among many tasks or users by giving each Process (computing), task or User (computing), user a small slice of CPU time, processing time. ...
was being introduced. There was significant interest in man-machine interaction and computers were seeing wider use. Whereas most
time-sharing In computing, time-sharing is the Concurrency (computer science), concurrent sharing of a computing resource among many tasks or users by giving each Process (computing), task or User (computing), user a small slice of CPU time, processing time. ...
operating system An operating system (OS) is system software that manages computer hardware and software resources, and provides common daemon (computing), services for computer programs. Time-sharing operating systems scheduler (computing), schedule tasks for ...
s of the era concentrated on user account and file management, leaving the users to do their own programming, JOSS provided file editing and a programming language in one package. RAND showed the system to a parade of people in the industry.


FOCAL

The PDP-6 was DEC's first
mainframe A mainframe computer, informally called a mainframe or big iron, is a computer used primarily by large organizations for critical applications like bulk data processing for tasks such as censuses, industry and consumer statistics, enterpris ...
, and JOSS took full advantage of its power and memory capacity. The DEC programmers were familiar with the system and interested in JOSS, but most of the computers DEC sold had nowhere near the power needed to run it. Written by Richard Merrill, FOCAL removed features from JOSS as required in order to be able to run in the much more limited memory space of the
PDP-8 The PDP-8 is a family of 12-bit minicomputers that was produced by Digital Equipment Corporation (DEC). It was the first commercially successful minicomputer, with over 50,000 units sold during the model's lifetime. Its basic design follows the pi ...
and other
12-bit Before the widespread adoption of ASCII in the late 1960s, six-bit character codes were common and a 12-bit word, which could hold two characters, was a convenient size. This also made it useful for storing a single decimal digit along with a si ...
machines in the DEC lineup. To achieve this, a major change was made to reduce the amount of temporary data, or ''
state State most commonly refers to: * State (polity), a centralized political organization that regulates law and society within a territory **Sovereign state, a sovereign polity in international law, commonly referred to as a country **Nation state, a ...
'', needed to parse the statements. One noticeable effect of this decision was that
conditionals Conditional (if then) may refer to: *Causal conditional, if X then Y, where X is a cause of Y *Conditional probability, the probability of an event A given that another event B *Conditional proof, in logic: a proof that asserts a conditional, a ...
could only be used for branches, in contrast to JOSS, where conditionals can be applied to any statement. The other noticeable change was to rearrange the keywords so each started with a unique letter. This simplified the
parser Parsing, syntax analysis, or syntactic analysis is a process of analyzing a string of symbols, either in natural language, computer languages or data structures, conforming to the rules of a formal grammar by breaking it into parts. The term '' ...
, which needed to read only the first letter of the command on a line of code, and could then skip forward to the next
whitespace character A whitespace character is a character data element that represents white space when text is rendered for display by a computer. For example, a ''space'' character (, ASCII 32) represents blank space such as a word divider in a Western scrip ...
. It would then compare that against an internal list of possible keywords, which was one character per entry. In contrast, JOSS had to continue reading until it had read the entire command word and then compared that against a list containing complete words. Not only did this change save memory in the parser, users could also save memory by typing in only that letter, reducing the size of the
source code In computing, source code, or simply code or source, is a plain text computer program written in a programming language. A programmer writes the human readable source code to control the behavior of a computer. Since a computer, at base, only ...
. The first version of FOCAL was released in 1968 for the
PDP-8 The PDP-8 is a family of 12-bit minicomputers that was produced by Digital Equipment Corporation (DEC). It was the first commercially successful minicomputer, with over 50,000 units sold during the model's lifetime. Its basic design follows the pi ...
. An updated version followed the next year, which was later known as FOCAL-69. The system as a whole, regardless of version, was known as FOCAL-8 when it was ported to other machines in the 12-bit series, including the
PDP-5 The PDP-5 was Digital Equipment Corporation's first 12-bit computer, introduced in 1963. History An earlier 12-bit computer, named LINC has been described as the first minicomputer and also "the first modern personal computer." It had 2,048 1 ...
and PDP-12. It was popular as it was highly efficient in memory use, which was often severely limited on these machines to a few
kilobyte The kilobyte is a multiple of the unit byte for Computer data storage, digital information. The International System of Units (SI) defines the prefix ''kilo-, kilo'' as a multiplication factor of 1000 (103); therefore, one kilobyte is 1000&nbs ...
s (KB). The similar FOCAL-11 ran on the
PDP-11 The PDP–11 is a series of 16-bit minicomputers originally sold by Digital Equipment Corporation (DEC) from 1970 into the late 1990s, one of a set of products in the Programmed Data Processor (PDP) series. In total, around 600,000 PDP-11s of a ...
under
RT-11 RT-11 (Real-time 11) is a discontinued small, low-end, single-user real-time operating system for the full line of Digital Equipment Corporation PDP-11 16-bit computers. RT-11 was first implemented in 1970. It was widely used for real-time compu ...
.
Processor Technology Processor Technology Corporation was a personal computer company founded in April 1975, by Gary Ingram and Bob Marsh in Berkeley, California. Their first product was a 4K byte RAM board that was compatible with the MITS Altair 8800 computer but ...
also offered a version of 8k FOCAL, complete with Lunar Lander, for the
Intel 8080 The Intel 8080 is Intel's second 8-bit computing, 8-bit microprocessor. Introduced in April 1974, the 8080 was an enhanced successor to the earlier Intel 8008 microprocessor, although without binary compatibility.'' Electronic News'' was a week ...
-based
Altair 8800 The Altair 8800 is a microcomputer introduced in 1974 by Micro Instrumentation and Telemetry Systems (MITS) based on the Intel 8080 CPU. It was the first commercially successful personal computer. Interest in the Altair 8800 grew quickly after i ...
system. This was provided for the copying charge of the tape, while the
source code In computing, source code, or simply code or source, is a plain text computer program written in a programming language. A programmer writes the human readable source code to control the behavior of a computer. Since a computer, at base, only ...
was provided for free with other purchases.


BASIC

While FOCAL was becoming popular on DEC machines, BASIC was becoming a more popular alternative on other platforms. By the late 1960s, several companies were making inroads in DEC's
minicomputer A minicomputer, or colloquially mini, is a type of general-purpose computer mostly developed from the mid-1960s, built significantly smaller and sold at a much lower price than mainframe computers . By 21st century-standards however, a mini is ...
stronghold, selling similar machines running time-sharing versions of BASIC. Notable among these was the
HP 2100 The HP 2100 is a series of 16-bit minicomputers that were produced by Hewlett-Packard (HP) from the mid-1960s to early 1990s. Tens of thousands of machines in the series were sold over its 25-year lifetime, making HP the fourth-largest minicomp ...
series, running
HP Time-Shared BASIC HP Time-Shared BASIC (HP TSB) is a BASIC, BASIC programming language Interpreter (computing), interpreter for Hewlett-Packard's HP 2100#HP 2000, HP 2000 line of minicomputer-based time-sharing computer systems. TSB is historically notable as th ...
. David H. Ahl had recently joined DEC's PDP-8 Group, just as the company became interested in selling the machine into educational settings. Due to the popularity of BASIC in the education market, especially with the growing library of BASIC programs from the Minnesota Educational Computing Consortium, Ahl found selling the machine with FOCAL was difficult despite its advantages. As he later noted: Ahl took it upon himself to produce a BASIC system for the platform, hiring a company he later learned was a single programmer in Brooklyn to produce a version for the 4 kWord PDP-8. DEC began selling packaged versions of the PDP-8 with terminals and the BASIC as the "EduSystem" lineup, with larger systems in the series having expanded versions of BASIC, and in some cases, also FOCAL and FORTRAN. Some PDP-11 based EduSystems were also created. Ahl then began porting programs from FOCAL to BASIC, notably ''The Sumer Game'' (which he renamed ''Hamurabi''), a version of ''Lunar Lander'', and many smaller FOCAL demos. Combining his ports with submissions from outside programmers, he managed to collect enough material to have DEC publish ''101 BASIC Computer Games'' in 1973. The book was an immediate success and ultimately ran through three printings to 1975. By the mid-1970s BASIC was a standard feature of all DEC machines and FOCAL use evaporated.


Rebirth in the Soviet Union

The PDP-11 had been cloned in the
Soviet Union The Union of Soviet Socialist Republics. (USSR), commonly known as the Soviet Union, was a List of former transcontinental countries#Since 1700, transcontinental country that spanned much of Eurasia from 1922 until Dissolution of the Soviet ...
in the 1970s for military purposes. In the 1980s, single-chip variations similar to the
LSI-11 The PDP–11 is a series of 16-bit minicomputers originally sold by Digital Equipment Corporation (DEC) from 1970 into the late 1990s, one of a set of products in the Programmed Data Processor (PDP) series. In total, around 600,000 PDP-11s of al ...
were produced that gave rise to a series of PDP-11 compatible
home computer Home computers were a class of microcomputers that entered the market in 1977 and became common during the 1980s. They were marketed to consumers as affordable and accessible computers that, for the first time, were intended for the use of a s ...
s. Most notable among several models were the
Electronika BK The Electronika BK is a series of 16-bit computing, 16-bit PDP-11-compatible home computers developed under the Electronika brand by NPO Scientific Center, then the leading microcomputer design team in the Soviet Union. It is also the predecessor ...
series, released in 1985. These were initially supplied with FOCAL on a
ROM cartridge A ROM cartridge, usually referred to in context simply as a cartridge, cart, cassette, or card, is a replaceable part designed to be connected to a consumer electronics device such as a home computer, video game console or, to a lesser extent, ...
, while a BASIC cartridge was an optional add-on. Later models supplied BASIC by default.


Language

The following description is based on FOCAL-69 as seen in the FOCAL-8 language reference manual.


Direct and indirect modes

FOCAL followed the JOSS model for interaction via a
command line interface A command-line interface (CLI) is a means of interacting with software via commands each formatted as a line of text. Command-line interfaces emerged in the mid-1960s, on computer terminals, as an interactive and more user-friendly alternati ...
. This allowed users to type in commands in "direct mode", which were performed immediately, or to prefix them with a line number, in which case they were added to the program if they were unique, or overrode existing code if the same number had previously been used. The method of operation is similar to BASIC's " immediate mode" vs. "program mode". It contrasts with JOSS, in which all commands, both program and direct, were saved and loaded as part of the user's workspace. This allowed JOSS to have commands without line numbers, which they used for definitions and other tasks. FOCAL lacked this capability, so those instructions that needed to be loaded and saved became options on other program-mode commands like .


Program statements

Every line in a FOCAL program must start with a line number. As with JOSS, line numbers are fixed-point numbers consisting of two two-digit integers separated by a period. In FOCAL-8, valid line numbers range from 1.01 through 31.99. When printed out, using , the FOCAL equivalent to BASIC's , leading zeros will be added; 1.10 will be printed as . This makes all lines numbers five characters long when output so that all line numbers align. Statements referring to those lines do not need the leading zeros, for example, . The number on the left of the period is known as the "group number". Groups provide some level of code organization that is lacking in languages like Fortran or BASIC. The primary use of these was to use a group as a
subroutine In computer programming, a function (also procedure, method, subroutine, routine, or subprogram) is a callable unit of software logic that has a well-defined interface and behavior and can be invoked multiple times. Callable units provide a ...
which can be called with , for example, will jump to the subroutine written in group 5. The editor also used these during edit-time, for example, one could to produce a listing of the code in group 2, or to delete all of the lines in group 4. Every line must start with a command keyword following the line number. There is no concept of a "default command" as is the case in BASIC with its optional statement. Multiple statements can be placed on a single line, separated by semicolons. Usually, the behavior is no different than if the statements had been on separate lines, except in the case of FOR loops.


Commands


ASK

The command (abbreviation A) will take a list of strings and variables, echo the strings and store the user input in variables. Equivalent to BASIC's . 01.01 ASK "NAME", NAME 01.02 ASK "COORDINATES", X, Y 01.03 ASK "A1",A1,"OMEGA",W,"T0",T0,"DAMPING FACTOR",DAMPINGFACTOR If the user doesn't enter a number but enters text, the system will convert the initial character to a number with "A"=1, "B"=2, etc.


COMMENT

The command (abbreviation C) creates a remark. Equivalent to BASIC's . The original manual lists as a synonym of COMMENT, used to mark empty lines, but this has no internal difference. 01.01 COMMENT: THE SUMER GAME, BY RICHARD MERRILL


DO

The command (abbreviation D) branches execution to a subroutine. It is the equivalent of BASIC's . The subroutine is referenced either by group number or line number. If a line number is provided, that single line is run and then automatically returns to continue execution at the statement after the . If no line number is provided, execution starts at the first line of the block and continues until the end of the block is reached. is supported, but is only required to return early from the group, it is not needed at the end of the group. 01.15 DO 7.24 01.16 DO 8


FOR

The command (abbreviation F) implements a
for loop In computer science, a for-loop or for loop is a control flow Statement (computer science), statement for specifying iteration. Specifically, a for-loop functions by running a section of code repeatedly until a certain condition has been satisfi ...
. When three arguments are specified, the first is the initial value of the loop variable, the second is the increment, and the third value is the terminating value for the loop. If only two values are provided, the first is the initial value and the second is the terminating value, and the increment is set to 1. This is the pattern from FORTRAN's loops, as opposed to BASIC's where the increment is the last value, if present. In contrast to other parts of the language where multiple statements on a line are independent, the always runs the statements that follow it on the line before the termination has been met, and then continues to the next line. Thus, loops have to be on a single line, or alternatively, call a subroutine with . There is no equivalent of BASIC's . 01.01 FOR X=1,10; TYPE X,! 01.02 FOR X=0,10,100; DO 2 A sample FOR loop: 01.10 ASK "HOW MUCH MONEY DO YOU WANT TO BORROW ?",PRINCIPAL 01.20 ASK "FOR HOW MANY YEARS ?",TERM 01.30 FOR RATE=4.0,.5,10;DO 2.0 01.40 QUIT 02.10 SET INTEREST=PRINCIPAL*(RATE/100)*TERM 02.20 TYPE "RATE",RATE," ","INTEREST",INTEREST,!


GOTO

The command (abbreviation G) jumps program execution to the specified line number. It is identical to the same-named statement in BASIC. In FOCAL, is also used to begin execution, like BASIC's , but in this use, the documentation refers to it as instead of in spite of the underlying command being the same. 01.05 GOTO 1.01 02.90 TYPE !!,"TRY AGAIN.",!!!!!;GOTO 1.1


IF

The command (abbreviation I) provides a conditional branch based on the sign of the expression. After the numeric expression, the IF command can take one to three line numbers. If the expression is less than zero, execution branches to the first line number; if equal to zero, to the second line number; if greater than zero, to the third line number. The language lacked relative operators such as greater than, equal or less than. To branch if X > 5, one must compare X - 5. 02.20 IF (25-25) 2.4,2.3,2.4 03.01 IF (X) 3.1,3.02,3.1 IF could be short-formed by placing a semicolon (or end of line) beyond the first line number. For example: 02.20 IF (X)1.8; TYPE "Q" 02.30 IF (X)1.8,2.50 02.40 TYPE "P" In this case the test at 2.20 will cause the program to jump to line 1.8 if the test is negative, otherwise it will continue and type "Q" to the console. Line 2.30 will jump to 1.8 or 2.5 if the value is negative or zero, and otherwise continue to type "P" to the console.


QUIT

The command (abbreviation Q) terminates execution of the program and returns control to the editing environment. Equivalent to BASIC's or . 01.10 FOR X=-10,1,10;TYPE X 01.20 QUIT


RETURN

The command (abbreviation R) branches execution from a subroutine back to the calling location. The use of is optional at the last line of a subroutine, a subroutine returns at the last line in the group anyway. The following is a sample subroutine for converting a yes/no prompt into a valu

22.78 COMMENT: 'YES OR NO' SUBROUTINE 22.80 ASK "ANSWER YES OR NO ? ",AN 22.82 IF (AN-0YES)22.84,22.86 22.84 IF (AN-0NO)22.8,22.88,22.8 22.86 SET X=2;RETURN 22.88 SET X=1;RETURN


SET

The command (abbreviation S) assigns the results of an expression to the specified variable. Equivalent to BASIC's . 01.30 SET PI=3.14156 01.60 SET INTEREST=PRINCIPAL*(RATE/100)*TERM


TYPE

The command (abbreviation T) provides for output of one or more items separated by commas. Equivalent to BASIC's . Items can be variables, literal strings surrounded by double-quotes, or a variety of control characters. The control characters include the to output a carriage return and line feed, for the carriage return alone, and for a tab character. Control characters can be strung together, for example, will output three CR/LFs without the need to separate them with commas. TYPE UMBERS, E1, "TEXT", !, #, :, $ OR %...OUTPUT 01.10 TYPE "HI THERE, GOOD LOOKING. HOW MUCH MONEY DO YOU WANT TO BORROW?",! 01.50 TYPE "INTEREST",INTEREST,! 01.80 TYPE "THE INTEREST FOR",TERM," YEARS",!,"IS",INTEREST, " DOLLARS.",!! 01.90 TYPE "NEW YORK",!,"WASHINGTON",!,"ATLANTA",!,"DALLAS",! 02.10 TYPE "X",X," ","X^2",X^2," ","SQRT",FSQT(X) 03.20 TYPE ".",# 02.20 TYPE !!!!! also included an optional format specifier indicated using the format , where x is the number of digits to the left of the decimal, and yz is the number of digits to the right of the period. The default format was , meaning a maximum of eight digits and four to the right of the period. So, for example: SET A=67823 TYPE %6.01,A = 67823.0 TYPE %5,A = 67823 TYPE %8.03,A = 67823.000 TYPE %,A = 6.7823E4 Note the extra leading spaces in some examples, padding out the full defined width. Using % alone caused the output to be printed in "floating point format" using the E. A special control character was which caused a table of all defined variables and their values to be printed. Only the first two letters of the name will be printed, padded with a zero if need be. Arrays elements are printed on separate lines and variables with only one element will be indexed (00). For example: TYPE $ A0(00)=67823


Variables

Variable names may start with any letter except F (F is reserved for functions) and may contain any sequence of letters and numbers. However, only the first two characters are significant. For example, the following code sample from ''FOCAL: A New Conversational Language'' refers to the same variable as DESTINATION and then DES. Internally, both references refer to a variable designated DE: 01.80 ASK DESTINATION 02.30 IF (DES-14) 2.4,3.1,2.4 Any variable may be treated as an array, allowing subscripts from -2048 through 204


Math

FOCAL contained five mathematical operators: * for exponents – the exponent is converted to a 12-bit integer * for multiplication * for division * for addition * for subtraction One curiosity of the 1968 version of FOCAL was that the operators had independent precedence, as in the order above. Although this certainly applies to exponentiation, multiplication, and division, there is some ambiguity in the 1968 FOCAL manual with regards to addition and subtraction. Specifically, examples that demonstrate operator precedence for multiplication and division are provided, but examples demonstrating operator precedence for addition and subtraction are lacking. Nevertheless, the literal interpretation of the 1968 FOCAL manual suggests that the formula would be evaluated in the order 2-(3+1) and thus produce -2. This was very different than most languages, where the + and - had equal precedence and would be evaluated (2-3)+1 to produce 0. This can cause subtle errors when converting FOCAL source code to other systems. However, the + and - have the same precedence in FOCAL-69 and FOCAL-71, so yields 0, as expected. FOCAL was unusual in that mathematical expressions could use (), [], and <> interchangeably in matched pairs to establish precedence. For example, the following is a valid expression: 01.30 SET A=<10*[5+1]*(1+5)> All of these are the same level of precedence and read left-to-right when at the same level, so this statement will be evaluated [], then (), then <>, to produce 360. The language contained the following built-in functions: * – Absolute value * – Arctangent * – Cosine of argument in radians * – Natural base to the power of the argument * – Integer part of the argument * – Naperian log * – Random number * – Sign of the argument; FSGN(0)=1 in FOCAL-69, but FSGN(0)=0 in FOCAL-71 and later versions * – Sine of an angle given in radians * – Square root


Character functions

FOCAL-71 added two new functions for inputting single-character values, similar to ASK but returning ASCII values. * stops until the user types a character and then returns the ASCII code * outputs the ASCII value as a character to the console or file


Other functions

FOCAL also included several special-purpose functions: * reads a value from the PDP-8's analog-to-digital converters, with the channel number as the parameter * plots at a given Y location * plots at a given X location


Environment commands


Running programs

FOCAL used in the editor to start a program. However, a rule-of-thumb was to shorten this to . This is the equivalent of in BASIC. can also be used in the editor to start execution at a specified line.


Editing commands

New lines are entered into a program by simply starting the command with a line number. The editing commands were ERASE (abbreviation E), MODIFY (abbreviation M), and WRITE (abbreviation W): * ERASE – zero out all variables; this is sometimes used in programs to reset them * ERASE ''line number'' – delete the statement at a specified line * ERASE ''group number'' – delete all statements in a specified group * ERASE ALL – delete an entire program * MODIFY ''line number'' – allow editing a specified line * WRITE ''line number'' – display the statement at a specified line * WRITE ''group number'' – display all statements in a specified group * WRITE ALL – display a specified program


File commands

The file command was OPEN (abbreviation O): * – prepare to read from the start of a file * – prepare to write from the start of a file * – resume input * – resume output * – output the buffer and close a file


Library commands

FOCAL included the ability to manage collections of FOCAL programs as a code library. Programs could call other programs in a chain fashion using LIBRARY CALL, or call a single subroutine in another program using LIBRARY GOSUB. Program names could be six characters long. The LIBRARY command (abbreviation L) had the following sub-commands: * LIBRARY DELETE evice:'program name'' – delete a program * LIBRARY LIST evice:file name] – catalog * LIBRARY RUN evice:'program name'' ine number/code> – chain a program, optionally resuming at a specified line number * LIBRARY SAVE evice:'program name'' – save a program * LIBRARY EXIT – return to the PDP-8 monitor program FOCAL-71 added: * LIBRARY CALL evice:'program name'' – load a program * LIBRARY GOSUB evice:'program name'' roup number/code> – call a subroutine in an external program


Error codes

Since the interpreter lacked sufficient memory space to store error messages, or even a table of error numbers, FOCAL used a workaround by reporting the address of the error-detecting code as a fixed-point number. For example, the
division by zero In mathematics, division by zero, division (mathematics), division where the divisor (denominator) is 0, zero, is a unique and problematic special case. Using fraction notation, the general example can be written as \tfrac a0, where a is the di ...
error was detected it would report , where 28.73 represents the code checking for this error at memory page 28 plus an offset of 73 words, and 01.10 is the line number where the error occurred. Pages in the PDP-8 were 128 bytes long, so this address translates to location 3657.


Changes between versions

DEC released three versions of FOCAL for the PDP-8 series, the original, known simply as FOCAL, and two updated versions, FOCAL,1969 and FOCAL,1971. FOCAL,1969 was largely identical to the original, but FOCAL,1971 was major update that added file handling, new mathematics, and a variety of other changes. In contrast to the first two versions, which were stand-alone systems, FOCAL,1971 was based on the emerging OS/8 (then still known as PS/8) and relied more heavily on that operating system for file handling and editing.


FOCAL,1971

One change in the new version was a 10-digit math package for added precision. The function now returned zero if the input expression evaluated to zero. Previously this would return one. The now used a better algorithm that produced more randomly distributed numbers. It also added the new function that took a string and returned its
ASCII ASCII ( ), an acronym for American Standard Code for Information Interchange, is a character encoding standard for representing a particular set of 95 (English language focused) printable character, printable and 33 control character, control c ...
value (akin to BASIC's ) and which took a number and returned a string with that ASCII character (). As all of these options used up limited memory, when started, FOCAL,1971 entered a dialog that asked the user what features they wanted to use.


Comparison with JOSS

FOCAL is, for all intents, a cleaned-up version of JOSS with changes to make the syntax terser and easier to parse. Almost all FOCAL commands have a one-to-one correspondence with JOSS and differ only in details. The most obvious change at first glance is that JOSS is case-insensitive and outputs keywords in mixed-case whereas FOCAL was upper-case only. Additionally, JOSS statements end with a period, making them look like written statements, whereas FOCAL has no required line-ending. One major difference is that JOSS included a complete set of comparison operations and a
boolean logic In mathematics and mathematical logic, Boolean algebra is a branch of algebra. It differs from elementary algebra in two ways. First, the values of the variable (mathematics), variables are the truth values ''true'' and ''false'', usually denot ...
system that operated within and constructs. Furthermore, branches and loops could be applied to any statement, in contrast to FOCAL, where the only operation either could carry out was the equivalent to a goto. For example, in JOSS, one could: 1.10 Type A if X>10. 1.20 Type i for i=1(1)10. The first line optionally prints A based on the value of X, and the second prints the numbers 1 to 10. In contrast, FOCAL lacked the ability to compare values, and loops were applied by skipping to the next line when they completed. The equivalent code in FOCAL would be: 1.10 IF (X-10),,1.30 1.20 TYPE A! 1.30 FOR I=1,1,10;TYPE I,! JOSS' implementation makes common constructs easier to build and more closely match a programmer's intentions, at the cost of making the runtime more complex. For example, JOSS allowed ranges in loops to be described in a flexible fashion like 1,2,3,10(5)50,75,78. This flexibility comes at a cost; in FOCAL the start, stop, and step can be written in a custom in-memory structure and easily updated as the loop is performed, whereas JOSS requires it to reevaluate an expression that may be, but often isn't, more complex. In order to make the code terser in FOCAL, changes were relatively minor. For example, JOSS' becomes the slightly smaller FOCAL , while becomes . Command keywords were also shortened where possible, so JOSS' becomes FOCAL's , both to make it shorter and to allow the letter D to be uniquely used for . To simplify the parser, some JOSS constructs were removed. For example, JOSS could perform multiple assignments with while in FOCAL these had to be made individual statements, . Likewise, JOSS' , used to format output, was combined into FOCAL's with the .


Comparison with BASIC

Comparisons between FOCAL and BASIC were inevitable since both languages were common on
minicomputer A minicomputer, or colloquially mini, is a type of general-purpose computer mostly developed from the mid-1960s, built significantly smaller and sold at a much lower price than mainframe computers . By 21st century-standards however, a mini is ...
s of the same era, and the two languages have much in common in syntax and structure. In most cases, there is a direct conversion of FOCAL code to and from BASIC. For example, to ask a user to input a value, in FOCAL one would: ASK "What is your age?",AGE while in BASIC the equivalent is: With the exception of a few features that were missing from one or the other, and some relatively minor differences in syntax, the two languages are very similar. One notable exception is the in BASIC, which allowed any statement to be placed after the , making it more similar with JOSS' control structures. BASIC reversed the ordering of the code compared to JOSS, placing the conditional expression at the start of the line rather than the end; in BASIC one uses whereas JOSS used . FOCAL's was more like BASIC's computed goto, , but the allowed any number of lines as targets, as opposed to only three for negative, zero and positive as in FOCAL. Another major difference between the two is that FOCAL lacked inherent support for strings as data elements that could be assigned to variables. As was the case in early BASICs or FORTRAN versions before the addition of strings (in F77), this limitation was generally avoided through the use of literal strings in input and output commands. It was only when manipulating individual strings, or characters in them, that this became a significant problem. As string variables were not supported, inputting a string used a
kludge A kludge or kluge () is a workaround or makeshift solution that is clumsy, inelegant, inefficient, difficult to extend, and hard to maintain. This term is used in diverse fields such as computer science, aerospace engineering, Internet slang, ...
that converted any characters typed in by a user to their numeric character value. For example, if one typed at an input statement, FOCAL would convert the H to "8", the numeric value of "H" in the PDP-8's
six-bit character code A six-bit character code is a character encoding designed for use on computers with word lengths a multiple of 6. Six bits can only encode 64 distinct characters, so these codes generally include only the upper-case letters, the numerals, some pun ...
s ("H" is the eighth letter). It would then interpret the "E" as starting an exponent, then it would try to compute "8" to the "LLO" power, which would take several seconds of CPU time and result in a value of 0.76593020E+103, not a helpful response. Nevertheless, by asking questions that would be responded to using single-letter responses, like "Do you need instructions, Y or N", programmers could test the result against known character values to produce what looked like character input. Prepending a zero to a string would coerce it to numeric, so programs could test for specific multicharacter strings using IF statements such as which will branch to 2.00 if A = "BROWN" or 1.00 otherwise. However the program would throw an overflow error if the user entered text with unfortunately-placed 'E' characters. For instance, one could test for "BROWN" or "RED" but not "GREEN" or "YELLOW". FOCAL's PDP-8 implementation used a
floating point In computing, floating-point arithmetic (FP) is arithmetic on subsets of real numbers formed by a ''significand'' (a signed sequence of a fixed number of digits in some base) multiplied by an integer power of that base. Numbers of this form ...
representation that represented numbers as four 12-bit words, forty-eight bits in total, with thirty-six bits of mantissa and twelve bits of exponent. This allowed for both significantly higher precision and a significantly wider range of values than most contemporary interpreters, making FOCAL a reasonable choice for serious numerical work. This high precision, and good choices for default decimal output formatting, meant that difficulties with binary-to-decimal rounding were not evident to beginning users. For comparison,
Microsoft BASIC Microsoft BASIC is the foundation software product of the Microsoft company and evolved into a line of BASIC interpreters and compiler(s) adapted for many different microcomputers. It first appeared in 1975 as Altair BASIC, which was the first v ...
initially used a 32-bit format, while later versions expanded this to 40-bits. Most BASICs had problems with rounding that led to simple equations resulting in tiny non-zero remainders. It is generally agreed that FOCAL was more efficient in its use of resources than comparable BASIC systems. On a typical machine of the day, often with 6 to 24 kilobytes of
magnetic-core memory In computing, magnetic-core memory is a form of random-access memory. It predominated for roughly 20 years between 1955 and 1975, and is often just called core memory, or, informally, core. Core memory uses toroids (rings) of a hard magneti ...
, FOCAL could handle larger and more complex programming tasks than BASIC.


Versions and spinoffs

The Coca-Cola Corporation used a customized version of FOCAL called COKE. FOCAL was later implemented on the PDP-7, PDP-9, PDP-10, PDP-11, PDP-12, PDP-5 and LINC-8. The FOCAL manual showed how to add commands to the FOCAL parser, so many sites added specialized commands for operating custom hardware. The Digital Equipment Computer Users' Society collected many patches and enhancements for FOCAL. There were even major enhanced offshoots of FOCAL, such as FOCAL-W, which added many features, including better mass storage file I/O and even virtual variable memory. In the mid-1970s DELTA was a more sophisticated version of FOCAL. Program line numbers went from 00 to 99 "parts" and 000000 to 999999 "steps" executed in alphanumeric order. DELTA had some specialized commands for the Tektronix 4010/14 display scope. In
Russia Russia, or the Russian Federation, is a country spanning Eastern Europe and North Asia. It is the list of countries and dependencies by area, largest country in the world, and extends across Time in Russia, eleven time zones, sharing Borders ...
, it saw use as late as the early 1990s in mass-produced home computers of the
Electronika BK The Electronika BK is a series of 16-bit computing, 16-bit PDP-11-compatible home computers developed under the Electronika brand by NPO Scientific Center, then the leading microcomputer design team in the Soviet Union. It is also the predecessor ...
series.
Microsoft Microsoft Corporation is an American multinational corporation and technology company, technology conglomerate headquartered in Redmond, Washington. Founded in 1975, the company became influential in the History of personal computers#The ear ...
sold a version of FOCAL supplied on paper-tape. According to Raymond Chen, the master tape is missing and FOCAL is no longer available.


Example code

The original Lunar Lander makes an excellent example for examining FOCAL code, as it uses most of the features of the language. This code is from the original, found o
Jim Storer's Lunar Lander page
T "CONTROL CALLING LUNAR MODULE. MANUAL CONTROL IS NECESSARY"! T "YOU MAY RESET FUEL RATE K EACH 10 SECS TO 0 OR ANY VALUE"! T "BETWEEN 8 & 200 LBS/SEC. YOU'VE 16000 LBS FUEL. ESTIMATED"! T "FREE FALL IMPACT TIME-120 SECS. CAPSULE WEIGHT-32500 LBS"! T "FIRST RADAR CHECK COMING UP"!!!;E T "COMMENCE LANDING PROCEDURE"!"TIME,SECS ALTITUDE," T "MILES+FEET VELOCITY,MPH FUEL,LBS FUEL RATE"! S A=120;S V=1;S M=32500;S N=16500;S G=.001;S Z=1.8 T " ",%3,L," ",FITR(A)," ",%4,5280*(A-FITR(A)) T %6.02," ",3600*V," ",%6.01,M-N," K=";A K;S T=10 T %7.02;I (200-K)2.72;I (8-K)3.1,3.1;I (K)2.72,3.1 T "NOT POSSIBLE";F X=1,51;T "." T "K=";A K;G 2.7 I (M-N-.001)4.1;I (T-.001)2.1;S S=T I ((N+S*K)-M)3.5,3.5;S S=(M-N)/K D 9;I (I)7.1,7.1;I (V)3.8,3.8;I (J)8.1 D 6;G 3.1 T "FUEL OUT AT",L," SECS"! S S=(FSQT(V*V+2*A*G)-V)/G;S V=V+G*S;S L=L+S T "ON THE MOON AT",L," SECS"!;S W=3600*V T "IMPACT VELOCITY OF",W,"M.P.H."!,"FUEL LEFT:"M-N," LBS"! I (1-W)5.5,5.5;T "PERFECT LANDING !-(LUCKY)"!;G 5.9 I (10-W)5.6,5.6;T "GOOD LANDING-(COULD BE BETTER)"!;G 5.9 I (22-W)5.7,5.7;T "CONGRATULATIONS ON A POOR LANDING"!;G 5.9 I (40-W)5.81,5.81;T "CRAFT DAMAGE. GOOD LUCK"!;G 5.9 I (60-W)5.82,5.82;T "CRASH LANDING-YOU'VE 5 HRS OXYGEN"!;G 5.9 T "SORRY,BUT THERE WERE NO SURVIVORS-YOU BLEW IT!"!"IN " T "FACT YOU BLASTED A NEW LUNAR CRATER",W*.277777," FT.DEEP." T !!!!"TRY AGAIN?"! A "(ANS. YES OR NO)"P;I (P-0NO)5.94,5.98 I (P-0YES)5.92,1.2,5.92 T "CONTROL OUT"!!!;Q S L=L+S;S T=T-S;S M=M-S*K;S A=I;S V=J I (S-.005)5.1;S S=2*A/(V+FSQT(V*V+2*A*(G-Z*K/M))) D 9;D 6;G 7.1 S W=(1-M*G/(Z*K))/2;S S=M*V/(Z*K*(W+FSQT(W*W+V/Z)))+.05;D 9 I (I)7.1,7.1;D 6;I (-J)3.1,3.1;I (V)3.1,3.1,8.1 S Q=S*K/M;S J=V+G*S+Z*(-Q-Q^2/2-Q^3/3-Q^4/4-Q^5/5) S I=A-G*S*S/2-V*S+Z*S*(Q/2+Q^2/6+Q^3/12+Q^4/20+Q^5/30) The program is cleanly separated into many subroutines. This was almost universal in FOCAL programs (and JOSS), as the line number scheme made such constructs easy to use. This program uses nine routines. The first, group 1, simply prints out the instructions using the ype statement and sets the initial values for the run. The mass of fuel is not recorded directly, instead, it uses the current ass and empty mass, , so the remaining fuel is and the lander runs out of fuel when is 0. Also note the rase at the end of line , which resets all the variable values. The main game loop is driven by group 2. As the code "falls" through group 1 into group 2 during the first run, the initial values are printed out in the first two lines. Near the end of line , the user is sked to input the burn rate as , and then the loop timer is reset using . Line tests the user's input against several possibilities, if it is over 200 or below 8 it types "NOT POSSIBLE" and a row of periods, and then loops back to ask the user to try again. If the value is between these values, it jumps forward to group 3. Note that the limited capabilities of FOCAL's command are evident here, in BASIC this could be reduced to a single Group 3 first tests to see if the fuel has run out, and jumps to group 4 if it has. Then it tests if the 10-second period in has expired and, if so, loops back to print everything out again, which has the side-effect of resetting and to 10. Line tests to see if the amount of fuel burned this period, , will reduce the mass of the vehicle as a whole, , beyond the empty weight, N. If not, it moves on, if it will, it instead sets the loop timer to the amount of time the remaining fuel will burn, thus ending the loop early. In either case, it calls group 9 to update the velocity and position. It then loops over groups 7, 8 and 9 until the value of I converges. When the 10-second timer runs out, or it reaches the end due to the fuel test in line or the altitude test in . In the latter cases, it will jump to group 4 and fall through to group 5, or jump to group 5 directly. Group 5 types the end-of-game results and then asks the user if they'd like to try again. If so, it jumps to to clear out all values and print the headers again, if not if falls through to and uits.


See also

*
JOSS JOSS (acronym for JOHNNIAC Open Shop System) was one of the first interactive, time-sharing programming languages. It pioneered many features that would become common in languages from the 1960s into the 1980s, including use of line numbers as bo ...
, the Rand language that inspired FOCAL *
MUMPS MUMPS ("Massachusetts General Hospital Utility Multi-Programming System"), or M, is an imperative, high-level programming language with an integrated transaction processing key–value database. It was originally developed at Massachusetts Gen ...
, a data-manipulation language based on JOSS and FOCAL concepts


References


Bibliography

* * *


External links

* tp://ftp.pdp8.net/software/games/focal/ FOCAL source code FOCAL source for several programs, including Lunar Lander, Sumer Game, and others
DEC's FOCAL 1969 Promotional BookletThe Computer History Simulation Project (Focal is available as a free download here)
*C-source version that runs under several operating systems, including Linux
the C-source for a modern DOS version suitable for teaching


(in Russian)

(in Russian)
Фокал снаружи и изнутри. (пишется)
– FOCAL outside and inside. (in progress) (in Russian)
Файл справки к фокалу-1б
– Help file for FOCAL-1B (in Russian) {{Digital Equipment Corporation JOSS programming language family Digital Equipment Corporation