fbpx
Wikipedia

FOCAL (programming language)

FOCAL (acronym for Formulating On-line Calculations in Algebraic Language,[1] or FOrmula CALculator[2]) is an interactive interpreted programming language based on JOSS and mostly used on Digital Equipment Corporation (DEC) Programmed Data Processor (PDP) series machines.

FOCAL
Paradigmimperative
FamilyJOSS
Designed byRichard Merrill
DeveloperDEC
First appeared1968; 56 years ago (1968)
Influenced by
JOSS
Influenced
BASIC-PLUS

JOSS was designed to be a simple interactive 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 of the language. It differs in that many of JOSS' advanced features like ranges and user-defined functions were removed to simplify the parser. Some of the reserved words (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, which was often limited to a few kilobytes (KB).

Like JOSS, and later BASICs, FOCAL on the PDP-8 was a complete environment that included a line editor, an interpreter, and input/output routines. The package as a whole was named FOCAL-8, which also ran on the PDP-5 and PDP-12. When ported to the PDP-11, the resulting FOCAL-11 relied on the underlying operating system, RT-11, 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 was also available.

FOCAL is notable as the language in which the original versions of the early video games Hamurabi and Lunar Lander were written. Both were later ported to BASIC, where they became much better known.[3] FOCAL was not popular outside the PDP platform and largely disappeared during the move to the VAX-11. It had a strong revival in the Soviet Union where PDP-11 clones were used as educational and home computers (BK series).

History edit

JOSS edit

JOSS was released in May 1963 on the one-off JOHNNIAC computer at RAND Corporation. 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, Digital Equipment Corporation'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 terminals that could be wheeled from room to room and plugged in for quick access.[4]

JOSS was highly influential. It emerged just as time-sharing was being introduced. There was significant interest in man-machine interaction and computers were seeing wider use. Whereas most time-sharing operating systems 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.[4]

FOCAL edit

The PDP-6 was DEC's first mainframe, and JOSS took full advantage of its power and memory capacity. DEC programmers were interested in JOSS, but most of their machines 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 and other 12-bit machines in the DEC lineup. To achieve this, a major change was made to reduce the amount of temporary data, or state, needed to parse the statements. One noticeable effect of this decision was that conditionals 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, 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. 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.

 
PDP-8 punched tapes, including a FOCAL-69 tape dated 7/9/69

The first version of FOCAL was released in 1968 for the PDP-8. 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 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 kilobytes (KB). The similar FOCAL-11 ran on the PDP-11 under RT-11.

Processor Technology also offered a version of 8k FOCAL, complete with Lunar Lander, for the Intel 8080-based Altair 8800 system. This was provided for the copying charge of the tape, while the source code was provided for free with other purchases.[5]

BASIC edit

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 stronghold, selling similar machines running time-sharing versions of BASIC. Notable among these was the HP 2100 series, running HP Time-Shared BASIC.[6]

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.[6] As he later noted:

DEC's FOCAL language was equal to BASIC in most aspects and even better in some, but it had one huge drawback: DEC was unwilling to license it to other computer manufacturers. FOCAL was fighting an uphill battle against BASIC, which was available on GE, Honeywell, HP, and other computers.
I think it wound up with a situation like Sony and Betamax. Sony saying, "Betamax is ours and it is a better format than VHS," which it was. But then, JVC saying, "We have VHS and Toshiba. Hey, do you want to use it? Fine, we'll license it to you for next to nothing."[6]

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.[7]

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.[8][6]

By the mid-1970s BASIC was a standard feature of all DEC machines and FOCAL use evaporated.[8]

Rebirth in the Soviet Union edit

The PDP-11 had been cloned in the Soviet Union in the 1970s for military purposes. In the 1980s, single-chip variations similar to the LSI-11 were produced that gave rise to a series of PDP-11 compatible home computers. Most notable among several models were the Electronika BK series, released in 1985. These were initially supplied with FOCAL on a ROM cartridge,[9] while a BASIC cartridge was an optional add-on. Later models supplied BASIC by default.[10]

Language edit

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

Direct and indirect modes edit

FOCAL followed the JOSS model for interaction via a command line interface. 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.[12]

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 Form 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 Type.[12]

Program statements edit

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 WRITE, the FOCAL equivalent to BASIC's LIST, leading zeros will be added; 1.10 will be printed as 01.10. This makes all lines numbers five digits long when output so that all line numbers align. Statements referring to those lines do not need the leading zeros, for example, GOTO 1.10.[13]

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 which can be called with DO, for example, DO 5 will jump to the subroutine written in group 5. The editor also used these during edit-time, for example, one could WRITE 2 to produce a listing of the code in group 2, or ERASE 4 to delete all of the lines in group 4.[13]

Every line must start with a command keyword following the line number.[13] There is no concept of a "default command" as is the case in BASIC with its optional LET 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.[14]

Commands edit

ASK edit

The ASK command (abbreviation A) will take a list of strings and variables, echo the strings and store the user input in variables.[15] Equivalent to BASIC's INPUT.

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 edit

The COMMENT command (abbreviation C) creates a remark.[16] Equivalent to BASIC's REM. The original manual lists CONTINUE as a synonym of COMMENT, used to mark empty lines, but this has no internal difference.[17]

01.01 COMMENT: THE SUMER GAME, BY RICHARD MERRILL 

DO edit

The DO command (abbreviation D) branches execution to a subroutine. It is the equivalent of BASIC's GOSUB. The subroutine is referenced either by group number or line number. If a line number is provided, that single line is run and then returns to the statement after the DO. 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 or a RETURN is encountered. RETURN is only required to return early from the group, it is not needed at the end of the group.[18]

01.15 DO 7.24 01.16 DO 8 

FOR edit

The FOR command (abbreviation F) implements a for loop. 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 DO loops, as opposed to BASIC's FOR 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 FOR 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 DO. There is no equivalent of BASIC's NEXT.[14]

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 edit

The GOTO command (abbreviation G) jumps program execution to the specified line number.[18] It is identical to the same-named statement in BASIC. In FOCAL, GOTO is also used to begin execution, like BASIC's RUN, but in this use, the documentation refers to it as GO instead of GOTO in spite of the underlying command being the same.

01.05 GOTO 1.01 02.90 TYPE !!,"TRY AGAIN.",!!!!!;GOTO 1.1 

IF edit

The IF 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.[19]

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.[19]

QUIT edit

The QUIT command (abbreviation Q) terminates execution of the program and returns control to the editing environment.[16] Equivalent to BASIC's STOP or END.

01.10 FOR X=-10,1,10;TYPE X 01.20 QUIT 

RETURN edit

The RETURN command (abbreviation R) branches execution from a subroutine back to the calling location.[16] The use of RETURN 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 value.[1]

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 edit

The SET command (abbreviation S) assigns the results of an expression to the specified variable.[20] Equivalent to BASIC's LET.

01.30 SET PI=3.14156 01.60 SET INTEREST=PRINCIPAL*(RATE/100)*TERM 

TYPE edit

The TYPE command (abbreviation T) provides for output of one or more items separated by commas.[21] Equivalent to BASIC's PRINT.

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.[15]

TYPE [NUMBERS, 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 !!!!! 

TYPE also included an optional format specifier indicated using the format %x.yz, 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 %8.4, meaning a maximum of eight digits and four to the right of the period.[22] 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.[23]

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:[24]

TYPE $ A0(00)=67823 

Variables edit

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[25] 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 2047.[2]

Math edit

FOCAL-69 contained five mathematical operators:[26]

  • ^ for exponents – the exponent is converted to a 12-bit integer
  • * for multiplication
  • / for division
  • + for addition
  • - for subtraction

One curiosity of FOCAL was that the operators all had independent precedence, as in the order above. That means that the formula SET T=2-3+1, it 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.[26] This can cause subtle errors when converting FOCAL source code to other systems.

FOCAL was unusual in that mathematical expressions could use (), [], and <> interchangeably in matched pairs to establish precedence.[26] 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.[26]

The language contained the following built-in functions:[27]

  • FABS() – Absolute value
  • FATN() – Arctangent
  • FCOS() – Cosine of argument in radians
  • FEXP() – Natural base to the power of the argument
  • FITR() – Integer part of the argument
  • FLOG() – Naperian log
  • FRAN() – Random number
  • FSGN() – Sign of the argument; FSGN(0)=1 in FOCAL-69, but FSGN(0)=0 in FOCAL-71 and later versions
  • FSIN() – Sine of an angle given in radians
  • FSQT() – Square root

Character functions edit

FOCAL-71 added two new functions for inputting single-character values, similar to ASK but returning ASCII values.

  • FIN stops until the user types a character and then returns the ASCII code
  • FOUT outputs the ASCII value as a character to the console or file

Other functions edit

FOCAL also included several special-purpose functions:[28]

  • FADC reads a value from the PDP-8's analog-to-digital converters, with the channel number as the parameter
  • FDIS plots at a given Y location
  • FDXS plots at a given X location

Environment commands edit

Running programs edit

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

Editing commands edit

New lines are entered into a program by simply starting the command with a line number. The editing commands were ERASE (abbreviation E),[26] MODIFY (abbreviation M),[29] and WRITE (abbreviation W):[15]

  • 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 edit

The file command was OPEN (abbreviation O):

  • OPEN INPUT [device:][file][,ECHO] – prepare to read from the start of a file
  • OPEN OUTPUT [device:][file][,ECHO] – prepare to write from the start of a file
  • OPEN RESTORE INPUT[,ECHO] – resume input
  • OPEN RESTORE OUTPUT[,ECHO] – resume output
  • OUTPUT CLOSE – output the buffer and close a file

Library commands edit

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 [device:]program name – delete a program
  • LIBRARY LIST [device:][file name] – catalog
  • LIBRARY RUN [device:]program name [line number] – chain a program, optionally resuming at a specified line number
  • LIBRARY SAVE [device:]program name – save a program
  • LIBRARY EXIT – return to the PDP-8 monitor program

FOCAL-71 added:

  • LIBRARY CALL [device:]program name – load a program
  • LIBRARY GOSUB [device:]program name [group number] – call a subroutine in an external program

Error codes edit

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 error was detected it would report ?28.73 @ 01.10, 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 edit

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 edit

One change in the new version was a 10-digit math package for added precision. The FSGN function now returned zero if the input expression evaluated to zero. Previously this would return one. The FRAN now used a better algorithm that produced more randomly distributed numbers. It also added the new FIN function that took a string and returned its ASCII value (akin to BASIC's ASC) and FOUT which took a number and returned a string with that ASCII character (CHR).

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 edit

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 system that operated within if and for 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' Do part 20. becomes the slightly smaller FOCAL DO 20, while Do step 20.1 becomes DO 20.1. Command keywords were also shortened where possible, so JOSS' Demand becomes FOCAL's ASK, both to make it shorter and to allow the letter D to be uniquely used for DO.

To simplify the parser, some FOCAL options were removed. For example, JOSS could perform multiple assignments with Set S=P, P=Q, Q=S. while in FOCAL these had to be made individual statements, SET S=P; SET P=Q; SET Q=S. Likewise, JOSS' Form, used to format output, was combined into FOCAL's TYPE with the %.

Comparison with BASIC edit

Comparisons between FOCAL and BASIC were inevitable since both languages were common on minicomputers 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:

 INPUT "What is your age?",AGE 

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 IF in BASIC, which allowed any statement to be placed after the THEN, 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 IF this THEN that whereas JOSS used that IF this. FOCAL's IF was more like BASIC's computed goto, ON X GOTO 10,20,30, but the ON...GOTO 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 that converted any characters typed in by a user to their numeric character value. For example, if one typed HELLO at an input statement, FOCAL would convert the H to "8", the numeric value of "H" in the PDP-8's six-bit character codes ("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 I (A-0BROWN) 1.00,2.00,1.00 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 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 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, FOCAL could handle larger and more complex programming tasks than BASIC.

Versions and spinoffs edit

The Coca-Cola Corporation used a customized version of FOCAL called COKE.[citation needed]

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, it saw use as late as the early 1990s in mass-produced home computers of the Electronika BK series.

Microsoft sold a version of FOCAL supplied on paper-tape.[30] According to Raymond Chen, the master tape is missing and FOCAL is no longer available.

Example code edit

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 on Jim Storer's Lunar Lander page.[31]

01.04 T "CONTROL CALLING LUNAR MODULE. MANUAL CONTROL IS NECESSARY"! 01.06 T "YOU MAY RESET FUEL RATE K EACH 10 SECS TO 0 OR ANY VALUE"! 01.08 T "BETWEEN 8 & 200 LBS/SEC. YOU'VE 16000 LBS FUEL. ESTIMATED"! 01.11 T "FREE FALL IMPACT TIME-120 SECS. CAPSULE WEIGHT-32500 LBS"! 01.20 T "FIRST RADAR CHECK COMING UP"!!!;E 01.30 T "COMMENCE LANDING PROCEDURE"!"TIME,SECS ALTITUDE," 01.40 T "MILES+FEET VELOCITY,MPH FUEL,LBS FUEL RATE"! 01.50 S A=120;S V=1;S M=32500;S N=16500;S G=.001;S Z=1.8 02.10 T " ",%3,L," ",FITR(A)," ",%4,5280*(A-FITR(A)) 02.20 T %6.02," ",3600*V," ",%6.01,M-N," K=";A K;S T=10 02.70 T %7.02;I (200-K)2.72;I (8-K)3.1,3.1;I (K)2.72,3.1 02.72 T "NOT POSSIBLE";F X=1,51;T "." 02.73 T "K=";A K;G 2.7 03.10 I (M-N-.001)4.1;I (T-.001)2.1;S S=T 03.40 I ((N+S*K)-M)3.5,3.5;S S=(M-N)/K 03.50 D 9;I (I)7.1,7.1;I (V)3.8,3.8;I (J)8.1 03.80 D 6;G 3.1 04.10 T "FUEL OUT AT",L," SECS"! 04.40 S S=(FSQT(V*V+2*A*G)-V)/G;S V=V+G*S;S L=L+S 05.10 T "ON THE MOON AT",L," SECS"!;S W=3600*V 05.20 T "IMPACT VELOCITY OF",W,"M.P.H."!,"FUEL LEFT:"M-N," LBS"! 05.40 I (1-W)5.5,5.5;T "PERFECT LANDING !-(LUCKY)"!;G 5.9 05.50 I (10-W)5.6,5.6;T "GOOD LANDING-(COULD BE BETTER)"!;G 5.9 05.60 I (22-W)5.7,5.7;T "CONGRATULATIONS ON A POOR LANDING"!;G 5.9 05.70 I (40-W)5.81,5.81;T "CRAFT DAMAGE. GOOD LUCK"!;G 5.9 05.81 I (60-W)5.82,5.82;T "CRASH LANDING-YOU'VE 5 HRS OXYGEN"!;G 5.9 05.82 T "SORRY,BUT THERE WERE NO SURVIVORS-YOU BLEW IT!"!"IN " 05.83 T "FACT YOU BLASTED A NEW LUNAR CRATER",W*.277777," FT.DEEP." 05.90 T !!!!"TRY AGAIN?"! 05.92 A "(ANS. YES OR NO)"P;I (P-0NO)5.94,5.98 05.94 I (P-0YES)5.92,1.2,5.92 05.98 T "CONTROL OUT"!!!;Q 06.10 S L=L+S;S T=T-S;S M=M-S*K;S A=I;S V=J 07.10 I (S-.005)5.1;S S=2*A/(V+FSQT(V*V+2*A*(G-Z*K/M))) 07.30 D 9;D 6;G 7.1 08.10 S W=(1-M*G/(Z*K))/2;S S=M*V/(Z*K*(W+FSQT(W*W+V/Z)))+.05;D 9 08.30 I (I)7.1,7.1;D 6;I (-J)3.1,3.1;I (V)3.1,3.1,8.1 09.10 S Q=S*K/M;S J=V+G*S+Z*(-Q-Q^2/2-Q^3/3-Q^4/4-Q^5/5) 09.40 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 Type statement and sets the initial values for the run. The mass of fuel is not recorded directly, instead, it uses the current Mass and empty mass, N, so the remaining fuel is M-N and the lander runs out of fuel when M-N is 0. Also note the Erase at the end of line 01.20, 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 02.20, the user is Asked to input the burn rate as K, and then the loop timer is reset using S T=10. Line 02.70 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 IF command are evident here, in BASIC this could be reduced to a single IF K>200 OR K<8 THEN...

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 T has expired and, if so, loops back to print everything out again, which has the side-effect of resetting T and S to 10. Line 03.40 tests to see if the amount of fuel burned this period, S*K, will reduce the mass of the vehicle as a whole, S*K-M, 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 03.10 or the altitude test in 07.10. 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 01.20 to clear out all values and print the headers again, if not if falls through to 05.98 and Quits.

See also edit

  • JOSS, the Rand language that inspired FOCAL
  • MUMPS, a data-manipulation language based on JOSS and FOCAL concepts

References edit

  1. ^ Manual 1968, p. 1.1.
  2. ^ DEC, 1957 to the Present (PDF). DEC. 1978. p. 38.
  3. ^ McCracken, Harry (2014-04-29). "Fifty Years of BASIC, the Programming Language That Made Computers Personal". Time. from the original on 2016-02-05. Retrieved 2016-02-12.
  4. ^ a b Marks, Shirley (December 1971). The JOSS Years: Reflections on an experiment (PDF) (Technical report). Rand.
  5. ^ "Watch Your Altair Grow!". Byte. April 1976. p. 48.
  6. ^ a b c d Szczepaniak 2014.
  7. ^ EduSystem Handbook (PDF). Digital. 1973. p. V.
  8. ^ a b Savetz 2013.
  9. ^ Stapleton, R.A.; Goodman, S.E. (June 1988). The Soviet Union and the Personal Computer "Revolution" (PDF) (Technical report). University of Arizona. p. 8.
  10. ^ "Elektronika BK-0010". Old Computer Museum.
  11. ^ Manual 1968.
  12. ^ a b Manual 1968, p. 2.1.
  13. ^ a b c Manual 1968, p. 2.7.
  14. ^ a b Manual 1968, p. 3.7.
  15. ^ a b c Manual 1968, p. 3.2.
  16. ^ a b c Manual 1968, p. 3.6.
  17. ^ Manual 1968, p. A.1.
  18. ^ a b Manual 1968, p. 3.4.
  19. ^ a b Manual 1968, p. 3.5.
  20. ^ Manual 1968, p. 3.3.
  21. ^ Manual 1968, p. 3.1.
  22. ^ Manual 1968, p. 2.2.
  23. ^ Manual 1968, p. 2.3.
  24. ^ Manual 1968, p. 2.5.
  25. ^ FOCAL: A New Conversational Language. Digital.
  26. ^ a b c d e Manual 1968, p. 2.4.
  27. ^ Manual 1968, p. 3.10.
  28. ^ Manual 1968, p. A.3.
  29. ^ Manual 1968, p. 3.8.
  30. ^ "What happened to the Microsoft FOCAL interpreter?". YouTube. Retrieved 2022-09-18.
  31. ^ "Lunar Lander". Lunar Landing Game Related Documents.

Bibliography edit

  • FOCAL Programming Manual (PDF). Digital Equipment Corporation. 1968.
  • Szczepaniak, John (1 May 2014). "A basic history of BASIC on its 50th birthday". Gamasutra.
  • Savetz, Kevin (April 2013). "Dave Ahl and Betsy Ahl" (Interview).

External links edit

  • FOCAL source code, FOCAL source for several programs, including Lunar Lander, Sumer Game, and others
  • DEC's FOCAL 1969 Promotional Booklet
  • The Computer History Simulation Project (Focal is available as a free download here)
  • ftp://www.cozx.com/pub/langs/focal.tar.gz[permanent dead link] C-source version that runs under several operating systems, including Linux
  • the C-source for a modern DOS version suitable for teaching
  • (in Russian) ISBN 5-06-001785-0
  • (in Russian) ISBN 5-217-00323-5
  • Фокал снаружи и изнутри. (пишется) – FOCAL outside and inside. (in progress) (in Russian)
  • Файл справки к фокалу-1б – Help file for FOCAL-1B (in Russian)

focal, programming, language, unrelated, programming, related, features, hp41, calculators, focal, hewlett, packard, focal, acronym, formulating, line, calculations, algebraic, language, formula, calculator, interactive, interpreted, programming, language, bas. For the unrelated set of programming related features on HP41 calculators see FOCAL Hewlett Packard FOCAL acronym for Formulating On line Calculations in Algebraic Language 1 or FOrmula CALculator 2 is an interactive interpreted programming language based on JOSS and mostly used on Digital Equipment Corporation DEC Programmed Data Processor PDP series machines FOCALParadigmimperativeFamilyJOSSDesigned byRichard MerrillDeveloperDECFirst appeared1968 56 years ago 1968 Influenced byJOSSInfluencedBASIC PLUS JOSS was designed to be a simple interactive 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 of the language It differs in that many of JOSS advanced features like ranges and user defined functions were removed to simplify the parser Some of the reserved words 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 which was often limited to a few kilobytes KB Like JOSS and later BASICs FOCAL on the PDP 8 was a complete environment that included a line editor an interpreter and input output routines The package as a whole was named FOCAL 8 which also ran on the PDP 5 and PDP 12 When ported to the PDP 11 the resulting FOCAL 11 relied on the underlying operating system RT 11 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 was also available FOCAL is notable as the language in which the original versions of the early video games Hamurabi and Lunar Lander were written Both were later ported to BASIC where they became much better known 3 FOCAL was not popular outside the PDP platform and largely disappeared during the move to the VAX 11 It had a strong revival in the Soviet Union where PDP 11 clones were used as educational and home computers BK series Contents 1 History 1 1 JOSS 1 2 FOCAL 1 3 BASIC 1 4 Rebirth in the Soviet Union 2 Language 2 1 Direct and indirect modes 2 2 Program statements 2 3 Commands 2 3 1 ASK 2 3 2 COMMENT 2 3 3 DO 2 3 4 FOR 2 3 5 GOTO 2 3 6 IF 2 3 7 QUIT 2 3 8 RETURN 2 3 9 SET 2 3 10 TYPE 2 4 Variables 2 5 Math 2 6 Character functions 2 7 Other functions 3 Environment commands 3 1 Running programs 3 2 Editing commands 3 3 File commands 3 4 Library commands 4 Error codes 5 Changes between versions 5 1 FOCAL 1971 6 Comparison with JOSS 7 Comparison with BASIC 8 Versions and spinoffs 9 Example code 10 See also 11 References 11 1 Bibliography 12 External linksHistory editJOSS edit Main article JOSS JOSS was released in May 1963 on the one off JOHNNIAC computer at RAND Corporation 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 Digital Equipment Corporation 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 terminals that could be wheeled from room to room and plugged in for quick access 4 JOSS was highly influential It emerged just as time sharing was being introduced There was significant interest in man machine interaction and computers were seeing wider use Whereas most time sharing operating systems 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 4 FOCAL edit The PDP 6 was DEC s first mainframe and JOSS took full advantage of its power and memory capacity DEC programmers were interested in JOSS but most of their machines 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 and other 12 bit machines in the DEC lineup To achieve this a major change was made to reduce the amount of temporary data or state needed to parse the statements One noticeable effect of this decision was that conditionals 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 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 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 nbsp PDP 8 punched tapes including a FOCAL 69 tape dated 7 9 69 The first version of FOCAL was released in 1968 for the PDP 8 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 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 kilobytes KB The similar FOCAL 11 ran on the PDP 11 under RT 11 Processor Technology also offered a version of 8k FOCAL complete with Lunar Lander for the Intel 8080 based Altair 8800 system This was provided for the copying charge of the tape while the source code was provided for free with other purchases 5 BASIC edit 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 stronghold selling similar machines running time sharing versions of BASIC Notable among these was the HP 2100 series running HP Time Shared BASIC 6 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 6 As he later noted DEC s FOCAL language was equal to BASIC in most aspects and even better in some but it had one huge drawback DEC was unwilling to license it to other computer manufacturers FOCAL was fighting an uphill battle against BASIC which was available on GE Honeywell HP and other computers I think it wound up with a situation like Sony and Betamax Sony saying Betamax is ours and it is a better format than VHS which it was But then JVC saying We have VHS and Toshiba Hey do you want to use it Fine we ll license it to you for next to nothing 6 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 7 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 8 6 By the mid 1970s BASIC was a standard feature of all DEC machines and FOCAL use evaporated 8 Rebirth in the Soviet Union edit The PDP 11 had been cloned in the Soviet Union in the 1970s for military purposes In the 1980s single chip variations similar to the LSI 11 were produced that gave rise to a series of PDP 11 compatible home computers Most notable among several models were the Electronika BK series released in 1985 These were initially supplied with FOCAL on a ROM cartridge 9 while a BASIC cartridge was an optional add on Later models supplied BASIC by default 10 Language editThe following description is based on FOCAL 69 as seen in the FOCAL 8 language reference manual 11 Direct and indirect modes edit FOCAL followed the JOSS model for interaction via a command line interface 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 12 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 Form 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 Type 12 Program statements edit 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 WRITE the FOCAL equivalent to BASIC s LIST leading zeros will be added 1 10 will be printed as 01 10 This makes all lines numbers five digits long when output so that all line numbers align Statements referring to those lines do not need the leading zeros for example GOTO 1 10 13 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 which can be called with DO for example DO 5 will jump to the subroutine written in group 5 The editor also used these during edit time for example one could WRITE 2 to produce a listing of the code in group 2 or ERASE 4 to delete all of the lines in group 4 13 Every line must start with a command keyword following the line number 13 There is no concept of a default command as is the case in BASIC with its optional LET 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 14 Commands edit ASK edit The ASK command abbreviation A will take a list of strings and variables echo the strings and store the user input in variables 15 Equivalent to BASIC s INPUT 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 edit The COMMENT command abbreviation C creates a remark 16 Equivalent to BASIC s REM The original manual lists CONTINUE as a synonym of COMMENT used to mark empty lines but this has no internal difference 17 01 01 COMMENT THE SUMER GAME BY RICHARD MERRILL DO edit The DO command abbreviation D branches execution to a subroutine It is the equivalent of BASIC s GOSUB The subroutine is referenced either by group number or line number If a line number is provided that single line is run and then returns to the statement after the DO 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 or a RETURN is encountered RETURN is only required to return early from the group it is not needed at the end of the group 18 01 15 DO 7 24 01 16 DO 8 FOR edit The FOR command abbreviation F implements a for loop 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 DO loops as opposed to BASIC s FOR 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 FOR 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 DO There is no equivalent of BASIC s NEXT 14 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 edit The GOTO command abbreviation G jumps program execution to the specified line number 18 It is identical to the same named statement in BASIC In FOCAL GOTO is also used to begin execution like BASIC s RUN but in this use the documentation refers to it as GO instead of GOTO in spite of the underlying command being the same 01 05 GOTO 1 01 02 90 TYPE TRY AGAIN GOTO 1 1 IF edit The IF 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 gt 5 one must compare X 5 19 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 19 QUIT edit The QUIT command abbreviation Q terminates execution of the program and returns control to the editing environment 16 Equivalent to BASIC s STOP or END 01 10 FOR X 10 1 10 TYPE X 01 20 QUIT RETURN edit The RETURN command abbreviation R branches execution from a subroutine back to the calling location 16 The use of RETURN 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 value 1 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 edit The SET command abbreviation S assigns the results of an expression to the specified variable 20 Equivalent to BASIC s LET 01 30 SET PI 3 14156 01 60 SET INTEREST PRINCIPAL RATE 100 TERM TYPE edit The TYPE command abbreviation T provides for output of one or more items separated by commas 21 Equivalent to BASIC s PRINT 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 15 TYPE NUMBERS 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 TYPE also included an optional format specifier indicated using the format x yz 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 8 4 meaning a maximum of eight digits and four to the right of the period 22 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 23 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 24 TYPE A0 00 67823 Variables edit 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 25 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 2047 2 Math edit FOCAL 69 contained five mathematical operators 26 for exponents the exponent is converted to a 12 bit integer for multiplication for division for addition for subtraction One curiosity of FOCAL was that the operators all had independent precedence as in the order above That means that the formula SET T 2 3 1 it 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 26 This can cause subtle errors when converting FOCAL source code to other systems FOCAL was unusual in that mathematical expressions could use and lt gt interchangeably in matched pairs to establish precedence 26 For example the following is a valid expression 01 30 SET A lt 10 5 1 1 5 gt 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 lt gt to produce 360 26 The language contained the following built in functions 27 FABS Absolute value FATN Arctangent FCOS Cosine of argument in radians FEXP Natural base to the power of the argument FITR Integer part of the argument FLOG Naperian log FRAN Random number FSGN Sign of the argument FSGN 0 1 in FOCAL 69 but FSGN 0 0 in FOCAL 71 and later versions FSIN Sine of an angle given in radians FSQT Square root Character functions edit FOCAL 71 added two new functions for inputting single character values similar to ASK but returning ASCII values FIN stops until the user types a character and then returns the ASCII code FOUT outputs the ASCII value as a character to the console or file Other functions edit FOCAL also included several special purpose functions 28 FADC reads a value from the PDP 8 s analog to digital converters with the channel number as the parameter FDIS plots at a given Y location FDXS plots at a given X locationEnvironment commands editRunning programs edit FOCAL used GOTO in the editor to start a program However a rule of thumb was to shorten this to GO This is the equivalent of RUN in BASIC GOTO can also be used in the editor to start execution at a specified line Editing commands edit New lines are entered into a program by simply starting the command with a line number The editing commands were ERASE abbreviation E 26 MODIFY abbreviation M 29 and WRITE abbreviation W 15 ERASE zero out all variables this is sometimes used in programs to reset them ERASE i line number i delete the statement at a specified line ERASE i group number i delete all statements in a specified group ERASE ALL delete an entire program MODIFY i line number i allow editing a specified line WRITE i line number i display the statement at a specified line WRITE i group number i display all statements in a specified group WRITE ALL display a specified program File commands edit The file command was OPEN abbreviation O OPEN INPUT device file ECHO prepare to read from the start of a file OPEN OUTPUT device file ECHO prepare to write from the start of a file OPEN RESTORE INPUT ECHO resume input OPEN RESTORE OUTPUT ECHO resume output OUTPUT CLOSE output the buffer and close a file Library commands edit 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 device i program name i delete a program LIBRARY LIST device file name catalog LIBRARY RUN device i program name i line number chain a program optionally resuming at a specified line number LIBRARY SAVE device i program name i save a program LIBRARY EXIT return to the PDP 8 monitor program FOCAL 71 added LIBRARY CALL device i program name i load a program LIBRARY GOSUB device i program name i group number call a subroutine in an external programError codes editSince 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 error was detected it would report 28 73 01 10 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 editDEC 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 edit One change in the new version was a 10 digit math package for added precision The FSGN function now returned zero if the input expression evaluated to zero Previously this would return one The FRAN now used a better algorithm that produced more randomly distributed numbers It also added the new FIN function that took a string and returned its ASCII value akin to BASIC s ASC and FOUT which took a number and returned a string with that ASCII character CHR 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 editFOCAL 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 system that operated within if and for 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 gt 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 Do part 20 becomes the slightly smaller FOCAL DO 20 while Do step 20 1 becomes DO 20 1 Command keywords were also shortened where possible so JOSS Demand becomes FOCAL s ASK both to make it shorter and to allow the letter D to be uniquely used for DO To simplify the parser some FOCAL options were removed For example JOSS could perform multiple assignments with Set S P P Q Q S while in FOCAL these had to be made individual statements SET S P SET P Q SET Q S Likewise JOSS Form used to format output was combined into FOCAL s TYPE with the Comparison with BASIC editComparisons between FOCAL and BASIC were inevitable since both languages were common on minicomputers 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 INPUT What is your age AGE 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 IF in BASIC which allowed any statement to be placed after the THEN 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 IF this THEN that whereas JOSS used that IF this FOCAL s IF was more like BASIC s computed goto span class kr ON span span class w span span class vg X span span class w span span class kr GOTO span span class w span span class nl 10 span span class p span span class il 20 span span class p span span class il 30 span but the ON GOTO 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 that converted any characters typed in by a user to their numeric character value For example if one typed HELLO at an input statement FOCAL would convert the H to 8 the numeric value of H in the PDP 8 s six bit character codes 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 I A 0BROWN 1 00 2 00 1 00 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 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 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 FOCAL could handle larger and more complex programming tasks than BASIC Versions and spinoffs editThe Coca Cola Corporation used a customized version of FOCAL called COKE citation needed 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 it saw use as late as the early 1990s in mass produced home computers of the Electronika BK series Microsoft sold a version of FOCAL supplied on paper tape 30 According to Raymond Chen the master tape is missing and FOCAL is no longer available Example code editThe 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 on Jim Storer s Lunar Lander page 31 01 04 T CONTROL CALLING LUNAR MODULE MANUAL CONTROL IS NECESSARY 01 06 T YOU MAY RESET FUEL RATE K EACH 10 SECS TO 0 OR ANY VALUE 01 08 T BETWEEN 8 amp 200 LBS SEC YOU VE 16000 LBS FUEL ESTIMATED 01 11 T FREE FALL IMPACT TIME 120 SECS CAPSULE WEIGHT 32500 LBS 01 20 T FIRST RADAR CHECK COMING UP E 01 30 T COMMENCE LANDING PROCEDURE TIME SECS ALTITUDE 01 40 T MILES FEET VELOCITY MPH FUEL LBS FUEL RATE 01 50 S A 120 S V 1 S M 32500 S N 16500 S G 001 S Z 1 8 02 10 T 3 L FITR A 4 5280 A FITR A 02 20 T 6 02 3600 V 6 01 M N K A K S T 10 02 70 T 7 02 I 200 K 2 72 I 8 K 3 1 3 1 I K 2 72 3 1 02 72 T NOT POSSIBLE F X 1 51 T 02 73 T K A K G 2 7 03 10 I M N 001 4 1 I T 001 2 1 S S T 03 40 I N S K M 3 5 3 5 S S M N K 03 50 D 9 I I 7 1 7 1 I V 3 8 3 8 I J 8 1 03 80 D 6 G 3 1 04 10 T FUEL OUT AT L SECS 04 40 S S FSQT V V 2 A G V G S V V G S S L L S 05 10 T ON THE MOON AT L SECS S W 3600 V 05 20 T IMPACT VELOCITY OF W M P H FUEL LEFT M N LBS 05 40 I 1 W 5 5 5 5 T PERFECT LANDING LUCKY G 5 9 05 50 I 10 W 5 6 5 6 T GOOD LANDING COULD BE BETTER G 5 9 05 60 I 22 W 5 7 5 7 T CONGRATULATIONS ON A POOR LANDING G 5 9 05 70 I 40 W 5 81 5 81 T CRAFT DAMAGE GOOD LUCK G 5 9 05 81 I 60 W 5 82 5 82 T CRASH LANDING YOU VE 5 HRS OXYGEN G 5 9 05 82 T SORRY BUT THERE WERE NO SURVIVORS YOU BLEW IT IN 05 83 T FACT YOU BLASTED A NEW LUNAR CRATER W 277777 FT DEEP 05 90 T TRY AGAIN 05 92 A ANS YES OR NO P I P 0NO 5 94 5 98 05 94 I P 0YES 5 92 1 2 5 92 05 98 T CONTROL OUT Q 06 10 S L L S S T T S S M M S K S A I S V J 07 10 I S 005 5 1 S S 2 A V FSQT V V 2 A G Z K M 07 30 D 9 D 6 G 7 1 08 10 S W 1 M G Z K 2 S S M V Z K W FSQT W W V Z 05 D 9 08 30 I I 7 1 7 1 D 6 I J 3 1 3 1 I V 3 1 3 1 8 1 09 10 S Q S K M S J V G S Z Q Q 2 2 Q 3 3 Q 4 4 Q 5 5 09 40 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 Type statement and sets the initial values for the run The mass of fuel is not recorded directly instead it uses the current Mass and empty mass N so the remaining fuel is M N and the lander runs out of fuel when M N is 0 Also note the Erase at the end of line 01 20 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 02 20 the user is Asked to input the burn rate as K and then the loop timer is reset using S T 10 Line 02 70 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 IF command are evident here in BASIC this could be reduced to a single span class kr IF span span class w span span class vg K span span class o gt span span class il 200 span span class w span span class ow OR span span class w span span class vg K span span class o lt span span class il 8 span span class w span span class kr THEN span span class o span 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 T has expired and if so loops back to print everything out again which has the side effect of resetting T and S to 10 Line 03 40 tests to see if the amount of fuel burned this period S K will reduce the mass of the vehicle as a whole S K M 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 03 10 or the altitude test in 07 10 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 01 20 to clear out all values and print the headers again if not if falls through to 05 98 and Quits See also editJOSS the Rand language that inspired FOCAL MUMPS a data manipulation language based on JOSS and FOCAL conceptsReferences edit Manual 1968 p 1 1 DEC 1957 to the Present PDF DEC 1978 p 38 McCracken Harry 2014 04 29 Fifty Years of BASIC the Programming Language That Made Computers Personal Time Archived from the original on 2016 02 05 Retrieved 2016 02 12 a b Marks Shirley December 1971 The JOSS Years Reflections on an experiment PDF Technical report Rand Watch Your Altair Grow Byte April 1976 p 48 a b c d Szczepaniak 2014 EduSystem Handbook PDF Digital 1973 p V a b Savetz 2013 Stapleton R A Goodman S E June 1988 The Soviet Union and the Personal Computer Revolution PDF Technical report University of Arizona p 8 Elektronika BK 0010 Old Computer Museum Manual 1968 a b Manual 1968 p 2 1 a b c Manual 1968 p 2 7 a b Manual 1968 p 3 7 a b c Manual 1968 p 3 2 a b c Manual 1968 p 3 6 Manual 1968 p A 1 a b Manual 1968 p 3 4 a b Manual 1968 p 3 5 Manual 1968 p 3 3 Manual 1968 p 3 1 Manual 1968 p 2 2 Manual 1968 p 2 3 Manual 1968 p 2 5 FOCAL A New Conversational Language Digital a b c d e Manual 1968 p 2 4 Manual 1968 p 3 10 Manual 1968 p A 3 Manual 1968 p 3 8 What happened to the Microsoft FOCAL interpreter YouTube Retrieved 2022 09 18 Lunar Lander Lunar Landing Game Related Documents Bibliography edit FOCAL Programming Manual PDF Digital Equipment Corporation 1968 Szczepaniak John 1 May 2014 A basic history of BASIC on its 50th birthday Gamasutra Savetz Kevin April 2013 Dave Ahl and Betsy Ahl Interview External links editFOCAL source code FOCAL source for several programs including Lunar Lander Sumer Game and others DEC s FOCAL 1969 Promotional Booklet The Computer History Simulation Project Focal is available as a free download here ftp www cozx com pub langs focal tar gz permanent dead link C source version that runs under several operating systems including Linux the C source for a modern DOS version suitable for teaching Abramov V A Dialogue language FOCAL in Russian ISBN 5 06 001785 0 Osetinsky L G FOCAL for mini computers in Russian ISBN 5 217 00323 5 Fokal snaruzhi i iznutri pishetsya FOCAL outside and inside in progress in Russian Fajl spravki k fokalu 1b Help file for FOCAL 1B in Russian Retrieved from https en wikipedia org w index php title FOCAL programming language amp oldid 1215975044 COKE, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.