Altair_8800_BASIC_Reference_Manual_1975 BASIC Manual 75
User Manual: BASIC Manual 75
Open the PDF directly: View PDF  .
.
Page Count: 108 [warning: Documents this large are best viewed by clicking the View PDF Link!]

M!TS ALTA!R BASiC 
REFERENCE MANUAL 
1ab!e of Contents: 
INTRODUCTION I 
GETTING STARTED WITH BASIC 1 
REFERENCE MATERIAL 23 
APPENDICES 45 
A) HOW TO LOAD BASIC 46 
B) INITIALIZATION DIALOG 51 
C) ERROR MESSAGES 53 
D) SPACE HINTS 56 
E) SPEED HINTS 58 
F) DERIVED FUNCTIONS 59 
G) SIMULATED MATH FUNCTIONS 60 
H) CONVERTING BASIC PROGRAMS NOT 
WRITTEN FOR THE ALTAIR 62 
I) USING THE ACR INTERFACE 64 
J) BASIC/MACHINE LANGUAGE INTERFACE 66 
K) ASCII CHARACTER CODES 69 
L) EXTENDED BASIC 71 
M) BASIC TEXTS 73 
@MITS, Inc., 1975 
PRtNTED )N U.S.A.  "Creative E!ectronics" 
P.O. BOX 8636 
ALBUQUERQUE. NEW MEXtCO 87108 

ALM1R - ---- ——
 Bd5ir 
The following are additions and corrections to the ALTAIR BASIC REFERENCE 
MANUAL. Be sure to read this over carefully before continuing. 
1) If you are loading BASIC from paper tape, be sure your Serial I/O 
board is strapped for eight data bits and no parity bit. 
2) On page 53 in Appendix C, the meaning for an "OS" error should read: 
Out of String Space. Allocate more string space by using 
the "CLEAR" command with an argument (see page 42), and then 
run your program again. If you cannot allocate more string 
space, try using smaller strings or less string variables. 
3) On page 42, under the "CLEAR" command, It is stated that "CLEAR" with 
no argument sets the amount of string space to 200 bytes. This is in-
correct. "CLEAR" with no argument leaves the amount of string space 
unchanged. When BASIC is brought up, the amount of string space is 
initially set to 50 bytes. 
4) On page 30, under the "DATA" statement, the sentence "IN THE 4K VERSION 
OF BASIC, DATA STATEMENTS MUST BE THE FIRST STATEMENTS ON A LINE," 
should be changed to read, "IN THE 4K VERSION OF BASIC, A DATA STATE-
MENT MUST BE ALONE ON A LINE." 
5) If you desire to use a terminal interfaced to the ALTAIR with a 
Parallel I/O board as your system console, you should load from the 
ACR interface (wired for address 6). Use the ACR load procedure de-
scribed in Appendix A, except that you should raise switches 15 § 13 
when you start the boot. The Parallel I/O board must be strapped to 
address 0. 
6) If you get a checksum error while loading BASIC from a paper tape or a 
cassette, you may be able to restart the boot loader at location 0 with 
the appropriate sense switch settings. This depends on when the error 
occurs. The boot loader is not written over until the last block of 
BASIC is being read; which occurs during approximately the last two 
feet of a paper tape, or the last 10 to 15 seconds of a cassette. If 
the checksum error occurs during the reading of the last block of BASIC, 
the boot will be overwritten and you will have to key it in again. 
7) The number of nulls punched after a carriage return/line feed does not 
need to be set >=3 for Teletypes or >=6 for 30 CPS paper tape terminals, 
as described under the "NULL" command on page 23 of the BASIC manual. 
In almost all cases, no extra nulls need be punched after a CR/LF on 
Teletypes, and a setting of nulls to 3 should be sufficient for 30 CPS 
paper tape terminals. If any problems occur when reading tape (the 
first few characters of lines are lost), change the null setting to 1 
for Teletypes and 4 for 30 CPS terminals. 

8) If you have any problems loading BASIC, check to make sure that your 
terminal interface board (SIO or PIO) is working properly. Key in the 
appropriate echo program from below, and start it at location zero. 
Each character typed should be typed or displayed on your terminal. If 
this is not the case, first be sure that you are using the correct echo 
program. If you are using the correct program, but it is not function-
ing properly, then most likely the interface board or the terminal is 
not operating correctly. 
Jn tAe /bZZoMtng program ZtsttMjs^ t^e MM/n&er to t^e Z-e/t t^e sZasTz 
ts t^e oetaZ address and t^e TiMW^er to t&e rtjAt ^s t^e ocMZ. code /or t^at 
address. 
FOR REV 0 SERIAL I/O BOARDS WITHOUT THE STATUS BIT MODIFICATION 
0/333 1 / QOQ 2 / 34b 
3/040 4/313 5 / 000 
b / 000 7 / 333 10 / 001 
11 / 353 13 / 001 13 / 303 
14 / 000 15 / 000 
FOR REV 1 SERIAL I/O BOARDS (AND REV 0 MODIFIED BOARDS) 
0 / 333 
3 / 33E 
b / 333 
11 / 001 
14 / 000 
1 / 000 
4 / 000 
7 / 001 
IB / 303 
3 /  017 
5 /  000 
10 /  333 
13 /  000 
FOR PARALLEL 1/0 BOARDS 
0 / 333 
3 / 003 
t= / 000 
11 / 333 
14 / 000 
1 / 000 
4 / 313 
7 / 333 
13 / 001 
15 / 000 
3 /  34b 
5 /  000 
10 /  001 
13 /  303 
For those of you with the book, MY COMPUTER LIKES ME when i speak in 
BASIC, by Bob Albrecht, the following information may be helpful. 
1) ALTAIR BASIC uses "NEW" instead of "SCR" to delete the current 
program. 
2) Use Control-C to stop execution of a program. Use a carriage-
return to stop a program at an "INPUT" statement. 
3) You don't need an "END" statement at the end of a BASIC program. 

Before a computer can perform any useful function, it must be "told" 
what to do. Unfortunately, at this time, computers are not capable of 
understanding English or any other "human" language. This is primarily 
because our languages are rich with ambiguities and implied meanings. 
The computer must be told precise instructions and the exact sequence of 
operations to be performed in order to accomplish any specific task. 
Therefore, in order to facilitate human communication with a computer, 
programming languages have been developed. 
ALTAIR BASIC* is a programming language both easily understood and 
simple to use. It serves as an excellent "tool" for applications in 
areas such as business, science and education. Mith only a few hours of 
using BASIC, you will find that you can already write programs with an 
ease that few other computer languages can duplicate. 
Originally developed at Dartmouth University, BASIC language has 
found wide acceptance in the computer field. Although it is one of the 
simplest computer languages to use, it is very powerful. BASIC uses a 
small set of common English words as its "commands". Designed specifi-
cally as an "interactive" language, you can give a command such as 
"PRINT 2 + 2", and ALTAIR BASIC will immediately reply with "4". It 
isn't necessary to submit a card deck with your program on it and then 
wait hours for the results. Instead the full power of the ALTAIR is "at 
your fingertips". 
Generally, if the computer does not solve a particular problem the 
way you expected it to, there is a "Bug" or error in your program, or 
else there is an error in the data which the program used to calculate 
its answer. If you encounter any errors in BASIC itself, please let us 
know and we'll see that it's corrected. Write a letter to us containing 
the following information: 
1) System Configuration 
2) Version of BASIC 
3) A detailed description of the error 
Include all pertinent information 
such as a listing of the program in 
which the error occurred, the data 
placed into the program and BASIC'S 
printout. 
All of the information listed above will be necessary in order to pro-
perly evaluate the problem and correct it as quickly as possible. We 
wish to maintain as high a level of quality as possible with all of our 
ALTAIR software. 
* BASIC ^s g reg-z^gre^ trademark o/ Par^moM^T: Z/n^grst^z/. 

Me hope that you enjoy ALTAIR BASIC, and are successful in using it 
to solve all of your programming needs. 
In order to maintain a maximum quality level in our documentation, 
we will be continuously revising this manual. If you have any sugges-
tions on how we can improve it, please let us know. 
If you are already familiar with BASIC programming, the following 
section may be skipped. Turn directly to the Reference Material on 
page 22. 
M9TE; MZTF 4LT4.Z7? R4RTC ts at?at^aMe under ^oense or pMrcTxzse 
agreements. 6*op$/tn<y or ot&erMtse dtstrt&Mt^ng MPTF so/tMare OMt-
stde t^ze terms o/ SMc^! an agreement may &e a v^oZat^cn of cop^rtg-^zt 
^aMs or t&e agreement ^tseZf. 
If any immediate problems with MITS software are encountered, feel 
free to give us a call at (505) 265-7553. The Software Department 
is at Ext. 3; and the joint authors of the ALTAiR BASIC Interpreter, 
Bill Gates, Paul Allen and Monte Davidoff, will be glad to assist you. 

'mtmrEE) 
WM 
! 

This section is not intended to be a detailed course in BASIC pro-
gramming. It will, however, serve as an excellent introduction for those 
of you unfamiliar with the language. 
The text here will introduce the primary concepts and uses of BASIC 
enough to get you started writing programs. For further reading sugges-
tions, see Appendix M. 
If your ALTAIR does not have BASIC loaded and running, follow the 
procedures in Appendices A 5 B to bring it up. 
We recommend that you try each example in this section as it is pre-
sented. This will enhance your "feel" for BASIC and how it is used. 
Once your I/O device has typed " OK ", you are ready to use ALTAIR 
BASIC. 
M3TE; commands to ^LTAZT? BASTC shouM end zJtth a carriage 
return. The carriage return teZZs BASTC that z/OM haue /Yntshed' 
tz/ptng the command. Jf z/OM ma^e a tz/ptng error, t^/pe a &ac&-
arroM ^ J, z^s^aHz/ sht/t/O, or an zander Ztne to e^^mtnate the 
Zast character. Repeated use o/ " " e^m^nate prevtOMS 
characters. i4n at-stgn ( ^ ^ MtZ.^ e^tm^nate the entire Ztne 
that z/OM are tz/p^ng. 
Now, try typing in the following: 
PRINT 10-4 (end with carriage,return) 
ALTAIR BASIC will immediately print: 
t, 
OK 
The print statement you typed in was executed as soon as you hit the 
carriage return key. BASIC evaluated the formula after the "PRINT" and 
then typed out its value, in this case 6. 
Now try typing in this: 
PRINT 1/2,3*10 f"*" means mM^pZz/, '7" means d^dej 
ALTAIR BASIC will print: 
.5 3D 
As you can see, ALTAIR BASIC can do division and multiplication as 
well as subtraction. Note how a " , " (comma) was used in the print com-
mand to print two values instead of just one. The comma divides the 72 
character line into 5 columns, each 14 characters wide. The last two of 
the positions on the line are not used. The result is a " , " causes 
BASIC to skip to the next 14 column field on the terminal, where the 
value 30 was printed. 
2 

Commands such as the "PRINT" statements you have just typed in are 
called Direct Commands. There is another type of command called an In-
direct Command. Every Indirect command begins with a Line Number. A 
Line Number is any integer from 0 to 65529. 
Try typing in the following lines: 
10 PRINT 2+3 
20 PRINT 2-3 
A sequence of Indirect Commands is called a "Program". Instead of 
executing indirect statements immediately, ALTAIR BASIC saves Indirect 
Commands in the ALTAIR's memory. When you type in RUN , BASIC will 
execute the lowest numbered indirect statement that has been typed in 
first, then the next highest, etc. for as many as were typed in. 
Suppose we type in RUN now: 
RUN 
ALTAIR BASIC will type out: 
5 
-1 
OK 
In the example above, we typed in line 10 first and line 20 second. 
However, it makes no difference in what order you type in indirect state-
ments. BASIC always puts them into correct numerical order according to 
the Line Number. 
If we want a listing of the complete program currently in memory, 
we type in LIST . Type this in: 
LIST 
ALTAIR BASIC will reply with: 
10 PRINT B+3 
B0 PRINT E-3 
OK 
Sometimes it is desirable to delete a line of a program altogether. 
This is accomplished by typing the Line Number of the line we wish to 
delete, followed only by a carriage return. 
Type in the following: 
10 
LIST 
3 

ALTAIR BASIC will reply with: 
BO PRINT E-3 
OK 
We have now deleted line 10 from the program. There is no way to 
get it back. To insert a new line 10, just type in 10 followed by the 
statement we want BASIC to execute. 
Type in the following: 
10 PRINT 2*3 
LIST 
ALTAIR BASIC will reply with: 
10 PRINT E*3 
B0 PRINT B-3 
OK 
There is an easier way to replace line 10 than deleting it and then 
inserting a new line. You can do this by just typing the new line 10 and 
hitting the carriage return. BASIC throws away the old line 10 and re-
places it with the new one. 
Type in the following: 
10 PRINT 3-3 
LIST 
ALTAIR BASIC will reply with: 
10 PRINT 3-3 
E0 PRINT B-3 
OK 
It is not recommended that lines be numbered consecutively. It may 
become necessary to insert a new line between two existing lines. An in-
crement of 10 between line numbers is generally sufficient. 
If you want to erase the complete program currently stored in memory, 
type in " NEW ". If you are finished running one program and are about 
to read in a new one, be sure to type in " NEW " first. This should be 
done in order to prevent a mixture of the old and new programs. 
Type in the following: 
NEW 
ALTAIR BASIC will reply with: 
OK 
4 

Now type in: 
LIST 
ALTAIR BASIC will reply with: 
OK 
Often it is desirable to include text along with answers that are 
printed out, in order to explain the meaning of the numbers. 
Type in the following: 
PRINT "ONE THIRD IS EQUAL TO",1/3 
ALTAIR BASIC will reply with: 
ONE THIRD IS EdUAL TO .333333 
OK 
As explained earlier, including a " , " in a print statement causes 
it to space over to the next fourteen Column field before the value fol-
lowing the " , " is printed. 
If we use a " ; " instead of a comma, the value next will be printed 
immediately following the previous value. 
M^m&ers are a^Maz/s printed Mtth at Zeast owe tratZtMg space, 
/tm/ text to printed ts a^zjaz/s to &e enclosed w douMe quotes. 
Try the following examples: 
A) PRINT "ONE THIRD IS EQUAL TO";1/3 
ONE THIRD IS Et2UAL TO .333333 
OK 
B) PRINT 1,2,3 
15 3 
OK 
C) PRINT 1;2;3 
13 3 
OK 
D) PRINT -l;2;-3 
-1 B -3 
5 

OK 
We will digress for a moment to explain the format of numbers in 
ALTAIR BASIC. Numbers are stored internally to over six digits of ac-
curacy. When a number is printed, only six digits are shown. Every 
number may also have an exponent (a power of ten scaling factor). 
The largest number that may be represented in ALTAIR BASIC is 
1.70141*1038, while the smallest positive number is 2.93874*10*39. 
When a number is printed, the following rules are used to determine 
the exact format: 
1) If the number is negative, a minus sign (-) is printed. 
If the number is positive, a space is printed. 
2) If the absolute value of the number is an integer in the 
range 0 to 999999, it is printed as an integer. 
3) If the absolute value of the number is greater than or 
equal to .1 and less than or equal to 999999, it is printed 
in fixed point notation, with no exponent. 
4) If the number does not fall under categories 2 or 3, 
scientific notation is used. 
Scientific notation is formatted as follows: SX.XXXXXESTT . 
(each X being some integer 0 to 9) 
The leading "S" is the sign of the number, a space for a 
positive number and a " - " for a negative one. One non-
zero digit is printed before the decimal point. This is 
followed by the decimal point and then the other five digits 
of the mantissa. An "E" is then printed (for exponent), 
followed by the sign (S) of the exponent; then the two 
digits (TT) of the exponent itself. Leading zeroes are 
never printed; i.e. the digit before the decimal is never 
zero. Also, trailing zeroes are never printed. If there 
is only one digit to print after all trailing zeroes are 
suppressed, no decimal point is printed. The exponent 
sign will be " + " for positive and " - " for negative. 
Two digits of the exponent are always printed; that is 
zeroes are not suppressed in the exponent field. The 
value of any number expressed thus is the number to the 
left of the "E" times 10 raised to the power of the number 
to the right of the "E". 
No matter what format is used, a space is always printed following 
a number. The 8K version of BASIC checks to see if the entire number 
will fit on the current line. If not, a carriage return/line feed is 
executed before printing the number. 

The following are examples of various numbers and the output format 
ALTAIR BASIC will place them into: 
NUMBER 
+1 
-1 
6523 
-23.460 
1E20 
-12.3456E-7 
1.234S67E-10 
1000000 
999999 
.1 
.01 
.000123 
OUTPUT FORMAT 
1 
-I 
L5B3 
-33.4b 
1E+B0 
-l.B345t,E-0b 
1.B3457E-10 
lE+Ob 
.1 
1E-Q3 
1-B3E-04 
A number input from the terminal or a numeric constant used in a 
BASIC program may have as many digits as desired, up to the maximum length 
of a line (72 characters). Howevbr, only the first 7 digits are signifi-
cant, and the seventh digit is rounded up. 
PRINT 1.2345678901234567890 
1.E3457 
OK 
The following is an example of a program that reads a value from the 
terminal and uses that value to calculate and print a result: 
10 INPUT R 
20 PRINT 3.14159*R*R 
RUN 
7 10 
314.151 
OK 
Here's what's happening. When BASIC encounters the input statement, 
it types a question mark (?) on the terminal and then waits for you to 
type in a number. When you do (in the above example 10 was typed), execu-
tion continues with the next statement in the program after the variable 
(R) has been set (in this case to 10). In the above example, line 20 
would now be executed. When the formula after the PRINT statement is 
evaluated, the value 10 is substituted for the variable R each time R ap-
pears in the formula. Therefore, the formula becomes 3.14159*10*10, or 
314.159. 
If you haven't already guessed, what the program above actually does 
is to calculate the area of a circle with the radius "R". 
7 

11* wo wanted to calculate the area of various clrclcs, wc could keep 
ru-running the program over each time for each succcssivc circle. But, 
there's an easier way to do it simply by adding another line to the pro-
gram as follows: 
30 GOTO 10 
RUN 
? 10 
314.151 
? 3 
ER.E743 
? 4.7 
L1.3T77 
? 
OK 
By putting a " GOTO " statement on the end of our program, we have 
caused it to go back to line 10 after it prints each answer for the suc-
cessive circles. This could have gone on indefinitely, but we decided 
to stop after calculating the area for three circles. This was accom-
plished by typing a carriage return to the input statement (thus a blank 
M32TF; Typing a carriage return to an tnpMt statement tn tTze 4X 
version of BASTC Mt^ ea^se a 5W error (see Re/erenoe AfatertaZJ. 
The letter "R" in the program we just used was termed a "variable". 
A variable name can be any alphabetic character and may be followed by 
any alphanumeric character. 
In the 4K version of BASIC, the second character must be numeric 
or omitted. In the 8K version of BASIC, any alphanumeric characters 
after the first two are ignored. An alphanumeric character is any let-
ter (A-Z) or any number (0-9). 
Below are some examples of legal and illegal variable names: 
line). 
LEGAL  ILLEGAL 
IN 4K VERSION 
A 
Z1  % (1st character must be alphabetic) 
Z1A (variable name too long) 
QR (2nd character must be numeric) 
IN 8K VERSION 
TP 
PSTG$ 
COUNT 
TO (variable names cannot be reserved 
words) 
RG0TO (variable names cannot contain 
reserved words) 

The words used as BASIC statements are "reserved" for this specific 
purpose. You cannot use these words as variable names or inside of any 
variable name. For instance, "FEND" would be illegal because "END" is a 
reserved word. 
The following is a list of the reserved words in ALTAIR BASIC: 
4K RESERVED WORDS 
ABS CLEAR DATA DIM END FOR GOSUB GOTO IF INPUT 
INT LET LIST NEW NEXT PRINT READ REM RESTORE 
RETURN RND RUN SGN SIN SQR STEP STOP TAB( THEN 
TO USR 
8K RESERVED WORDS INCLUDE ALL THOSE ABOVE, AND IN ADDITION 
ASC AND ATN CHR$ CLOAD CONT COS CSAVE DEF EXP 
FN FRE INP LEFT$ LEN LOG MID$ NULL ON OR NOT 
OUT PEEK POKE POS RIGHT$ SPC( STR$ TAN VAL WAIT 
Remember, in the 4K version of BASIC variable names are only a letter 
or a letter followed by a number. Therefore, there is no possibility of 
a conflict with a reserved word. 
Besides having values assigned to variables with an input statement, 
you can also set the value of a variable with a LET or assignment state-
ment. 
Try the following examples: 
A=5 
OK 
PRINTA,A*2 
5 10 
OK 
LETZ=7 
OK 
PRINT Z,Z-A 
7 B 
OK 
9 

As can be seen from the examples, the "LET" is optional in an assign-
ment statement. 
BASIC "remembers" the values that have been assigned to variables 
using this type of statement. This "remembering" process uses space in 
the ALTAIR's memory to store the data. 
The values of variables are thrown away and the space in memory 
used to store them is released when one of four things occur: 
1) A new line is typed into the program or an old 
line is deleted 
2) A CLEAR command is typed in 
3) A RUN command is typed in 
4) NEW is typed in 
Another important fact is that if a variable is encountered in a 
formula before it is assigned a value, it is automatically assigned the 
value zero. Zero is then substituted as the value of the variable in 
the particular formula. Try the example below: 
PRINT Q,Q+2,Q*2 
0 2 0 
OK 
Another statement is the REM statement. REM is short for remark. 
This statement is used to insert comments or notes into a program. When 
BASIC encounters a REM statement the rest of the line is ignored. 
This serves mainly as an aid for the .programmer himself, and serves 
no useful function as far as the operation of the program in solving a 
particular problem. 
Suppose we wanted to write a program to check if a number is zero 
or not. With the statements we've gone over so far this could not be 
done. What is needed is a statement which can be used to conditionally 
branch to another statement. The "IF-THEN" statement does just that. 
Try typing in the following program: (remember, type NEW first) 
10 INPUT B 
20 IF B=0 THEN 50 
30 PRINT "NON-ZERO" 
40 GOTO 10 
50 PRINT "ZERO" 
60 GOTO 10 
When this program is typed into the ALTAIR and run, it will ask for 
a value for B. Type any value you wish in. The ALTAIR will then come to 
the "IF" statement. Between the "IF" and the "THEN" portion of the state-
ment there are two expressions separated by a relation. 
!0 

A relation is one of the following six symbols: 
RELATION  MEANING 
=> 
<= 
> 
< 
EQUAL TO 
GREATER THAN 
LESS THAN 
NOT EQUAL TO 
LESS THAN OR EQUAL TO 
GREATER THAN OR EQUAL TO 
The IF statement is either true or false, depending upon whether the 
two expressions satisfy the relation or not. For example, in the pro-
gram we just did, if 0 was typed in for B the IF statement would be true 
because 0=0. In this case, since the number after the THEN is 50, execu-
tion of the program would continue at line 50. Therefore, "ZERO" would 
be printed and then the program would jump back to line 10 (because of 
the GOTO statement in line 60). 
Suppose a 1 was typed in for B. Since 1=0 is false, the IF state-
ment would be false and the program would continue execution with the 
next line. Therefore, "NON-ZERO" would be printed and the GOTO in line 
40 would send the program back to line 10. 
Now try the following program for comparing two numbers: 
10 INPUT A,B 
20 IF A<=B THEN 50 
30 PRINT "A IS BIGGER" 
40 GOTO 10 
50 IF A<B THEN 80 
60 PRINT "THEY ARE THE SAME" 
70 GOTO 10 
80 PRINT "B IS BIGGER" 
90 GOTO 10 
When this program is run, line 10 will input two numbers from the 
terminal. At line 20, if A is greater than B, A<=B will be false. This 
will cause the next statement to be executed, printing "A IS BIGGER" and 
then line 40 sends the computer back to line 10 to begin again. 
At line 20, if A has the same value as B, A<=B is true so we go to 
line 50. At line 50, since A has the same value as B, A<B is false; 
therefore, we go to the following statement and print "THEY ARE THE SAME" 
Then line 70 sends us back to the beginning again. 
At line 20, if A is smaller than B, A<=B is true so we go to line 50 
At line 50, A<B will be true so we then go to line 80. "B IS BIGGER" is 
then printed and again we go back to the beginning. 
Try running the last two programs several times. It may make it 
easier to understand if you try writing your own program at this time 
using the IF-THEN statement. Actually trying programs of your own is 
the quickest and easiest way to understand how BASIC works. Remember, 
to stop these programs just give a carriage return to the input state-
ment. 
11 

One advantage of computers is their ability to perform repetitive 
tasks. Let's take a closer look and see how this works. 
Suppose we want a table of square roots from 1 to 10. The BASIC 
function for square root is "SQR"; the form being SQR(X), X being the 
number you wish the square root calculated from. We could write the pro-
gram as follows: 
10 PRINT 1,SQR(1) 
20 PRINT 2,SQR(2) 
30 PRINT 3,SQR(3) 
40 PRINT 4,SQR(4) 
50 PRINT 5,SQR(5) 
60 PRINT 6,SQR(6) 
70 PRINT 7,SQR(7) 
80 PRINT 8,SQR(8) 
90 PRINT 9,SQR(9) 
100 PRINT 10,SQR(10) 
This program will do the job; however, it is terribly inefficient. 
We can improve the program tremendously by using the IF statement just 
introduced as follows: 
10 N=1 
20 PRINT N,SQR(N) 
30 N=N+1 
40 IF N<=10 THEN 20 
When this program is run, its output will look exactly like that of 
the 10 statement program above it. Let's look at how it works. 
At line 10 we have a LET statement which sets the value of the vari-
able N at 1. At line 20 we print N and the square root of N using its 
current value. It thus becomes 20 PRINT 1,SQR(1), and this calculation 
is printed out. 
At line 30 we use what will appear at first to be a rather unusual 
LET statement. Mathematically, the statement N=N+1 is nonsense. However, 
the important thing to remember is that in a LET statement, the symbol 
" = " does not signify equality. In this case " = " means "to be replaced 
with". All the statement does is to take the current value of N and add 
1 to it. Thus, after the first time through line 30, N becomes 2. 
At line 40, since N now equals 2, N<=10 is true so the THEN portion 
branches us back to line 20, with N now at a value of 2. 
The overall result is that lines 20 through 40 are repeated, each 
time adding 1 to the value of N. When N finally equals 10 at line 20, 
the next line will increment it to 11. This results in a false state-
ment at line 40, and since there are no further statements to the pro-
gram it stops. 
This technique is referred to as "looping" or "iteration". Since 
it is used quite extensively in programming, there are special BASIC 
statements for using it. We can show these with the following pro-
gram. 
12 

10 FOR N=1 TO 10 
20 PRINT N,SQR(N) 
30 NEXT N 
The output of the program listed above will be exactly the same as 
the previous two programs. 
At line 10, N is set to equal 1. Line 20 causes the value of N and 
the square root of N to be printed. At line 30 we see a new type of 
statement. The "NEXT N" statement causes one to be added to N, and then 
if N<=10 we go back to the statement following the "FOR" statement. The 
overall operation then is the same as with the previous program. 
Notice that the variable following the "FOR" is exactly the same as 
the variable after the "NEXT". There is nothing special about the N in 
this case. Any variable could be used, as long as they are the same in 
both the "FOR" and the "NEXT" statements. For instance, "Zl" could be 
substituted everywhere there is an "N" in the above program and it would 
function exactly the same. 
Suppose we wanted to print a table of square roots from 10 to 20, 
only counting by two's. The following program would perform this task: 
10N=10 
20 PRINT N,SQR(N) 
30 N=N+2 
40 IF N<=20 THEN 20 
Note the similar structure between this program and the one listed 
on page 12 for printing square roots for the numbers 1 to 10. This pro-
gram can also be written using the "FOR" loop just introduced. 
10 FOR N=10 TO 20 STEP 2 
20 PRINT N,SQR(N) 
30 NEXT N 
Notice that the only major difference between this program and the 
previous one using "FOR" loops is the addition of the "STEP 2" clause. 
This tells BASIC to add 2 to N each time, instead of 1 as in the 
previous program. If no "STEP" is given in a "FOR" statement, BASIC as-
sumes that one is to be added each time. The "STEP" can be followed by 
any expression. 
Suppose we wanted to count backwards from 10 to 1. A program for 
doing this would be as follows: 
10 1=10 
20 PRINT I 
30 1=1-1 
40 IF I>=1 THEN 20 
Notice that we are now checking to see that I is greater than or 
equal to the final value. The reason is that we are now counting by a 
negative number. In the previous examples it was the opposite, so we 
were checking for a variable less than or equal to the final value. 
13 

The "STEP" statement previously shown can also be used with negative 
numbers to accomplish this same purpose. This can be done using the same 
format as in the other program, as follows: 
10 FOR 1=10 TO 1 STEP -1 
20 PRINT I 
30 NEXT I 
"FOR" loops can also be "nested". An example of this procedure fol-
lows: 
10 FOR 1=1 TO 5 
20 FOR J=1 TO 3 
30 PRINT I,J 
40 NEXT J 
50 NEXT I 
Notice that the "NEXT J" comes before the "NEXT I". This is because 
the J-loop is inside of the 1-loop. The following program is incorrect; 
run it and see what happens. 
10 FOR 1=1 TO 5 
20 FOR J=1 TO 3 
30 PRINT I,J 
40 NEXT I 
50 NEXT J 
It does not work because when the "NEXT I" is encountered, all know-
ledge of the J-loop is lost. This happens because the J-loop is "inside" 
of the 1-loop. 
It is often convenient to be able to select any element in a table 
of numbers. BASIC allows this to be done through the use of matrices. 
A matrix is a table of numbers. The name of this table, called the 
matrix name, is any legal variable name, "A" for example. The matrix 
name "A" is distinct and separate from the simple variable "A", and you 
could use both in the same program. 
To select an element of the table, we subscript "A" : that is to 
select the I'th element, we enclose I in parenthesis "(I)" and then fol-
low "A" by this subscript. Therefore, "A(I)" is the I'th element in the 
matrix "A". 
M3TF; JTn tMs section of t&e manual Me zJtZZ &e concerned h^t?! 
one-dtmenstonaZ matrices (Fee Reference A/atertaZJ 
"A(I)" is only one element of matrix A, and BASIC must be told how 
much space to allocate for the entire matrix. 
This is done with a "DIM" statement, using the format "DIM A(15)". 
In this case, we have reserved space for the matrix index "I" to go from 
0 to 15. Matrix subscripts always start at 0; therefore, in the above 
example, we have allowed for 16 numbers in matrix A. 
14 

If "A(I)" is used in a program before it has been dimensioned, BASIC 
reserves space for 11 elements (0 through 10). 
As an example of how matrices are used, try the following program 
to sort a list of 8 numbers with you picking the numbers to be sorted. 
10 DIM A(8) 
20 FOR 1=1 TO 8 
30 INPUT A(I) 
50 NEXT I 
70F=0 
80 FOR 1=1 TO 7 
90 IF A(I)<=A(I+1) THEN 140 
100T=A(I) 
110 A(I)= A(I+1) 
120A(I+1)=T 
130 F=1 
140 NEXT I 
150 IF F=1 THEN 70 
160 FOR 1=1 TO 8 
170 PRINT A(I), 
180 NEXT I 
When line 10 is executed, BASIC sets aside space for 9 numeric values, 
A(0) through A(8). Lines 20 through 50 get the unsorted list from the 
user. The sorting itself is done by going through the list of numbers and 
upon finding any two that are not in order, we switch them. "F" is used 
to indicate if any switches were done. If any were done, line 150 tells 
BASIC to go back and check some more. 
If we did not switch any numbers, or after they are all in order, 
lines 160 through 180 will print out the sorted list. Note that a sub-
script can be any expression. 
Another useful pair of statements are "GOSUB" and "RETURN". If you 
have a program that performs the same action in several different places, 
you could duplicate the same statements for the action in each place with-
in the program. 
The "GOSUB"-"RETURN" statements can be used to avoid this duplication. 
When a "GOSUB" is encountered, BASIC branches to the line whose number fol-
lows the "GOSUB". However, BASIC remembers where it was in the program 
before it branched. When the "RETURN" statement is encountered, BASIC 
goes back to the first statement following the last "GOSUB" that was exe-
cuted. Observe the following program. 
10 PRINT "WHAT IS THE NUMBER"; 
30 GOSUB 100 
40T=N 
50 PRINT "WHAT IS THE SECOND NUMBER"; 
70 GOSUB 100 
80 PRINT "THE SUM OF THE TWO NUMBERS IS",T+N 
90 STOP 
100 INPUT N 
15 

110 IF N = INT(N) THEN 140 
120 PRINT "SORRY, NUMBER MUST BE AN INTEGER. TRY AGAIN." 
130 GOTO 100 
140 RETURN 
What this program does is to ask for two numbers which must be inte-
gers, and then prints the sum of the two. The subroutine in this pro-
gram is lines 100 to 130. The subroutine asks for a number, and if it 
is not an integer, asks for a number again. It will continue to ask until 
an integer value is typed in. 
The main program prints " hJHAT IS THE NUMBER ", and then calls the 
subroutine to get the value of the number into N. When the subroutine 
returns (to line 40), the value input is saved in the variable T. This 
is done so that when the subroutine is called a second time, the value 
of the first number will not be lost. 
" hiHAT IS THE SECOND NUMBER " is then printed, and the second value 
is entered when the subroutine is again called. 
When the subroutine returns the second time, " THE SUM OF THE Th<0 
NUMBERS IS " is printed, followed by the value of their sum. T contains 
the value of the first number that was entered and N contains the value 
of the second number. 
The next statement in the program is a "STOP" statement. This causes 
the program to stop execution at line 90. If the "STOP" statement was not 
included in the program, we would "fall into" the subroutine at line 100. 
This is undesirable because we would be asked to input another number. If 
we did, the subroutine would try to return; and since there was no "GOSUB" 
which called the subroutine, an RG error would occur. Each "GOSUB" exe-
cuted in a program should have a matching "RETURN" executed later, and the 
opposite applies, i.e. a "RETURN" should be encountered only if it is 
part of a subroutine which has been called by a "GOSUB". 
Either "STOP" or "END" can be used to separate a program from its 
subroutines. In the 4K version of BASIC, there is no difference between 
the "STOP" and the "END". In the 8K version, "STOP" will print a mes-
sage saying at what line the "STOP" was encountered. 
Suppose you had to enter numbers to your program that didn't change 
each time the program was run, but you would like it to be easy to change 
them if necessary. BASIC contains special statements for this purpose, 
called the "READ" and "DATA" statements. 
Consider the following program: 
10 PRINT "GUESS A NUMBER"; 
20 INPUT G 
30 READ D 
40 IF D=-999999 THEN 90 
50 IF DoG THEN 30 
60 PRINT "YOU ARE CORRECT" 
70 END 
90 PRINT "BAD GUESS, TRY AGAIN." 
95 RESTORE 
16 

100 GOTO 10 
110 DATA 1,393,-39,28,391,-8,0,3.14,90 
120 DATA 89,5,10,15,-34,-999999 
This is what happens when this program is run. When the "READ" 
statement is encountered, the effect is the same as an INPUT statement. 
But, instead of getting a number from the terminal, a number is read 
from the "DATA" statements. 
The first time a number is needed for a READ, the first number in 
the first DATA statement is returned. The second time one is needed, 
the second number in the first DATA statement is returned. When the en-
tire contents of the first DATA statement have been read in this manner, 
the second DATA statement will then be used. DATA is always read se-
quentially in this manner, and there may be any number of DATA statements 
in your program. 
The purpose of this program is to play a little game in which you 
try to guess one of the numbers contained in the DATA statements. For 
each guess that is typed in, we read through all of the numbers in the 
DATA statements until we find one that matches the guess. 
If more values are read than there are numbers in the DATA state-
ments, an out of data (OD) error occurs. That is why in line 40 we check 
to see if -999999 was read. This is not one of the numbers to be matched, 
but is used as a flag to indicate that all of the data (possible correct 
guesses) has been read. Therefore, if -999999 was read, we know that the 
guess given was incorrect. 
Before going back to line 10 for another guess, we need to make the 
READ'S begin with the first piece of data again. This is the function of 
the "RESTORE". After the RESTORE is encountered, the next piece of data 
read will be the first piece in the first DATA statement again. 
DATA statements may be placed anywhere within the program. Only 
READ statements make use of the DATA statements in a program, and any 
other time they are encountered during program execution they will be 
ignored. 
TRE FCLLCWiWC JT^FOFAMyJOF APPLIES TO 2WF VERSION 
OF BASIC (WLY 
A list of characters is referred to as a "String". MITS, ALTAIR, 
and THIS IS A TEST are all strings. Like numeric variables, string 
variables can be assigned specific values. String variables are distin-
guished from numeric variables by a "$" after the variable name. 
For example, try the following: 
A$="ALTAIR8800" 
OK 
PRINT A$ 
ALTAIR aaoo 
OK 
17 

In this example, we set the string variable A$ to the string value 
"ALTAIR 8800". Note that we also enclosed the character string to be as-
signed to A$ in quotes. 
Now that we have set A$ to a string value, we can find out what the 
length of this value is (the number of characters it contains). We do 
this as follows: 
PRINT LEN(A$),LEN("MITS") 
11 4 
OK 
The "LBN" function returns an integer equal to the number of chara-
cters in a string. 
The number of characters in a string expression may range from 0 to 
255. A string which contains 0 characters is called the "NULL" string. 
Before a string variable is set to a value in the program, it is initial-
ized to the null string. Printing a null string on the terminal will 
cause no characters to be printed, and the print head or cursor will not 
be advanced to the next column. Try the following: 
PRINT LEN(Q$);Q$;3 
Q 3 
OK 
Another way to create the null string is: Q$="" 
Setting a string variable to the null string can be used to free up 
the string space used by a non-null string variable. 
Often it is desirable to access parts of a string and manipulate 
them. Now that we have set A$ to "ALTAIR 8800", we might want to print 
out only the first six characters of A$. We would do so like this: 
PRINT LEFT$(A$,6) 
ALTAIR 
OK 
"LEFT$" is a string function which returns a string composed of the 
leftmost N characters of its string argument. Here's another example: 
FOR N=1 TO LEN(A$):PRINT LEFT$(A$,N):NEXT N 
A 
AL 
ALT 
ALTA 
ALTAI 
ALTAIR 
ALTAIR 
ALTAIR 5 
ALTAIR 66 
18 

ALTAIR 660 
ALTAIR 6600 
OK 
Since A$ has 11 characters, this loop will be executed with N=l,2, 
3,...,10,11. The first time through only the first chatacter will be 
printed, the second time the first two characters will be printed, etc. 
There is another string function called "RIGHT$y which returns the 
right N characters from a string expression. Try substituting "iRlGHT$" 
for "LEFT$" in the previous example and see what happens. 
There is also a string function which allows us to take characters 
from the middle of a string. Try the following: 
FOR N=1 TO LEN(A$):PRINT MID$(A$,N):NEXT N 
ALTAIR 6600 
LTAIR 6600 
TAIR 6600 
AIR 6600 
IR 6600 
R 6600 
6600 
6600 
600 
00 
0 
OK 
"MID$" returns a string starting at the Nth position of A$ to the 
end (last character) of A$. The first position of the string is posi-
tion 1 and the last possible position of a string is position 255. 
Very often it is desirable to extract only the Nth character from 
a string. This can be done by calling MID$ with three arguments. The 
third argument specifies the number of characters to return. 
For example: 
FOR N=1 TO LEN(A$):PRINT MID$(A$,N,1),MID$(A$,N,2):NEXT N 
A  AL 
L  LT 
T  fA 
A  AI 
1  IR 
R  R 
6 
6  66 
6  60 
0  00 
0  0 
OK 
19 

See the Reference Material for more details on the workings of 
"LEFT$", "RIGHT$" and "MID$". 
Strings may also be concatenated (put or joined together) through 
the use of the "+" operator. Try the following: 
B$="MITS"+" "+A$ 
OK 
PRINT B$ 
NITS ALTAIR 6600 
OK 
Concatenation is especially useful if you wish to take a string apart 
and then put it back together with slight modifications. For instance: 
C$=LEFT$(B$,4)+"-"+MID$(B$,6,6)+"-"+RIGHT$(B$,4) 
OK 
PRINT C$ 
HITS-ALTAIR-6600 
OK 
Sometimes it is desirable to convert a number to its string repre-
sentation and vice-versa. "VAL" and "STR$" perform these functions. 
Try the following: 
STRING$="567.8" 
OK 
PRINT VAL(STRING$) 
5L7.6 
OK 
STRING$=STR$(3.1415) 
OK 
PRINT STRING$,LEFT$(STRING$,5) 
3-1415 3-14 
OK 
"STR$" can be used to perform formatted I/O on numbers. You can 
convert a number to a string and then use LEFT$, RIGHT$, MID$ and con-
catenation to reformat the number as desired. 
"STR$" can also be used to conveniently find out how many print 
columns a number will take. For example: 
PRINT LEN(STR$(3.157)) 
b 
20 

OK 
If you have an application where a user is typing in a question such 
as "WHAT IS THE VOLUME OF A CYLINDER OF RADIUS 5.36 FEET, OF HEIGHT 5.1 
FEET?" you can use "VAL" to extract the numeric values 5.36 and 5.1 from 
the question. For further functions "CHR$" and "ASC" see Appendix K. 
The following program sorts a list of string data and prints out 
the sorted list. This program is very similar to the one given earlier 
for sorting a numeric list. 
100 DIM A$(15):REM ALLOCATE SPACE FOR STRING MATRIX 
110 FOR 1=1 TO 15:READ A$(I):NEXT I:REM READ IN STRINGS 
120 F=0:I=1:REM SET EXCHANGE FLAG TO ZERO AND SUBSCRIPT TO 1 
130 IF A$(I)<=A$(I+1) THEN 180:REM DON'T EXCHANGE IF ELEMENTS 
IN ORDER 
140 T$=A$(I+1):REM USE T$ TO SAVE A$(I+1) 
150 A$(I+1)=A$(I):REM EXCHANGE TWO CONSECUTIVE ELEMENTS 
160A$(I)=T$ 
170 F=1:REM FLAG THAT WE EXCHANGED TWO ELEMENTS 
180 1=1+1: IF I<15 GOTO 130 
185 REM ONCE WE HAVE MADE A PASS THRU ALL ELEMENTS, CHECK 
187 REM TO SEE IF WE EXCHANGED ANY. IF NOT, DONE SORTING. 
190 IF F THEN 120:REM EQUIVALENT TO IF F<>0 THEN 120 
200 FOR 1=1 TO 15:PRINT A$(I):NEXT I: REM PRINT SORTED LIST 
210 REM STRING DATA FOLLOWS 
220 DATA APPLE,DOG,CAT,MITS,ALTAIR,RANDOM 
230 DATA MONDAY,"***ANSWER***"," FOO" 
240 DATA COMPUTER, FOO,ELP,MILWAUKEE,SEATTLE,ALBUQUERQUE 
2! 

u 
u 
22 

o 
B451C LAfVEU^EE 
O 
23 

COMMANDS 
A command is usually given after BASIC has typed OK. This is called 
the "Command Level". Commands may be used as program statements. Certain 
commands, such as LIST, NEW and CLOAD will terminate program execution 
when they finish. 
NAME EXAMPLE PURPOSE/USE 
CLEAR *(SEE PAGE 42 FOR EXAMPLES AND EXPLANATION) 
LIST LIST Lists current program 
LIST 100 optionally starting at specified line. 
List can be control-C'd (BASIC will 
finish listing the current line) 
NULL NULL 3 (Null command only in 8K version, but 
paragraph applicable to 4K version also) 
Sets the number of null (ASCII 0) charac-
ters printed after a carriage return/line 
feed. The number of nulls printed may 
be set from 0 to 71. This is a must for 
hardcopy terminals that require a delay 
after a CRLFf It is necessary to set the 
number of nulls typed on CRLF to 0 before 
a paper tape of a program is read in from 
a Teletype (TELETYPE ts a registered 
trademark of *7:e TELFTTPF CCRP0A4T.RW . 
In the 8K version, use the null command 
to set the number of nulls to zero. In 
the 4K version, this is accomplished by 
patching location 46 octal to contain the 
number of nulls to be typed plus 1. 
(Depositing a 1 in location 46 would set 
the number of nulls typed to zero.) When 
you punch a paper tape of a program using 
the list command, null should be set >=3 
for 10 CPS terminals, >=6 for 30 CPS ter-
minals. When not making a tape, we recom-
mend that you use a null setting of 0 or 1 
for Teletypes, and 2 or 3 for hard copy 
30 CPS terminals. A setting of 0 will 
work with Teletype compatible CRT's. 
RUN RUN Starts execution of the program currently 
in memory at the lowest numbered state-
ment. Run deletes all variables (does a 
CLEAR) and restores DATA. If you have 
stopped your program and wish to continue 
execution at some point in the program, 
use a direct GOTO statement to start 
execution of your program at the desired 
line. *CRLF=carriage return/line feed 
24 

RUN EDO  (8K version only) optionally starting 
at the specified line number 
NEhJ NEM Deletes current program and all variables 
TRE FCLLCMZWC COMMANDS ARE JFV TRE FX KERRKW ONLY 
CONT CONT Continues program execution after a 
control/C is typed or a STOP statement 
is executed. You cannot continue after 
any error, after modifying your program, 
or before your program has been run. 
One of the main purposes of CONT is de-
bugging. Suppose at some point after 
running your program, nothing is printed. 
This may be because your program is per-
forming some time consuming calculation, 
but it may be because you have fallen 
into an "infinite loop". An infinite loop 
is a series of BASIC statements from 
which there is no escape. The ALTAIR will 
keep executing the series of statements 
over and over, until you intervene or 
until power to the ALTAIR is cut off. 
If you suspect your program is in an 
infinite loop, type in a control/C. In 
the 8K version, the line number of the 
statement BASIC was executing will be 
typed out. After BASIC has typed out OK, 
you can use PRINT to type out some of the 
values of your variables. After examining 
these values you may become satisfied that 
your program is functioning correctly. 
You should then type in CONT to continue 
executing your program where it left off, 
or type a direct GOTO statement to resume 
execution of the program at a different 
line. You could also use assignment (LET) 
statements to set some of your variables 
to different values. Remember, if you 
control/C a program and expect to continue 
it later, you must not get any errors or 
type in any new program lines. If you 
do, you won't be able to continue and will 
get a "CN" (continue not) error. It is 
impossible to continue a direct command. 
CONT always resumes execution at the next 
statement to be executed in your program 
when control/C was typed. 
25 

CLOAD CLOAD P Loads the program named P from the 
cassette tape. A NEW command is auto-
matically done before the CLOAD com-
mand is executed. When done, the CLOAD 
will type out OK as usual. The one-
character program designator may be any 
printing character. CSAVE and CLOAD 
use I/O ports 6 § 7. 
See Appendix I for more information. 
CSAVE CSAVE P Saves on cassette tape the current pro-
gram in the ALTAIR's memory. The pro-
gram in memory is left unchanged. More 
than one program may be stored on cassette 
using this command. CSAVE and CLOAD use 
I/O ports 6 § 7. 
See Appendix I for more information 
OPERATORS 
SYMBOL SAMPLE STATEMENT 
A=100 
LET Z=E-5 
B=-A 
t 130 PRINT X+3 
140 X=R*(B*D) 
150 PRINT X/1.3 
IbO Z=R+T+3 
170 J=100-I 
PURPOSE/USE 
Assigns a value to a variable 
The LET is optional 
Negation. Note that 0-A is subtraction, 
while -A is negation. 
Exponentiation (8K version) 
(equal to X*X*X in the sample statement) 
0+0=1 0 to any other power = 0 
AtB, with A negative and B not an integer 
gives an FC error. 
Multiplication 
Division 
Addition 
Subtraction 
RULES FOR EVALUATING EXPRESSIONS: 
1) Operations of higher precedence are performed before opera-
tions of lower precedence. This means the multiplication and 
divisions are performed before additions and subtractions. As 
an example, 2+10/5 equals 4, not 2.4. When operations of equal 
precedence are found in a formula, the left hand one is executed 
first: 6-3+5=8, not -2. 
26 

2) The order in which operations are performed can always be 
specified explicitly through the use of parentheses. For in-
stance, to add 5 to 3 and then divide that by 4, we would use 
(5+3)/4, which equals 2. If instead we had used 5+3/4, we 
would get 5.75 as a result (5 plus 3/4). 
The precedence of operators used in evaluating expressions is as 
follows, in order beginning with the highest precedence: 
fFVcte; Operators Zested on the same Ztne have the same precedence J 
1) FORMULAS ENCLOSED IN PARENTHESIS ARE ALhJAYS EVALUATED FIRST 
5) + EXPONENTIATION C3R VER32YW ONLY; 
3) NEGATION -X UHERE X MAY BE A FORMULA 
4) * / MULTIPLICATION AND DIVISION 
5) + - ADDITION AND SUBTRACTION 
L) RELATIONAL OPERATORS: = E<2UAL 
feq^aZ precedence for <> NOT Et2UAL 
an s^; < LESS THAN 
> GREATER THAN 
<= LESS THAN OR E<2UAL 
>= GREATER THAN OR Et2UAL 
VERSION ONLY) (These 2 be^oM are Log^caZ Operators) 
7) NOT LOGICAL AND BITWISE "NOT" 
LIKE NEGATION, NOT TAKES ONLY THE 
FORMULA TO ITS RIGHT AS AN ARGUMENT 
a) AND LOGICAL AND BITWISE "AND" 
OR LOGICAL AND BITWISE "OR" 
In the 4K version of BASIC, relational operators can only be used 
once in an IF statement. However, in the 8K version a relational ex-
pression can be used as part of any expression. 
Relational Operator expressions will always have a value of True (-1) 
or a value of False (0). Therefore, (5#4)=0, (5=5)=-l, (4>5)=0, (4<5)=-l, 
etc. The THEN clause of an IF statement is executed whenever the formula 
after the IF is not equal to 0. That is to say, IF X THEN... is equivalent 
to IF X<>0 THEN... . 
27 

SYMBOL  SAMPLE STATEMENT  PURPOSE/USE 
ID IF A=15 THEN 40 
70 IF A<>0 THEN 5 
30 IF B>100 THEN 5 
1L0 IF B<3 THEN 10 
Expression Equals Expression 
Expression Does Not Equal Expression 
Expression Greater Than Expression 
Expression Less Than Expression 
<=,=< 130 IF 100<=B+C THEN 10 
>=,=> 110 IF (2=>R THEN 50 
AND B IF A<5 AND B<B THEN 7 
OR IF A<1 OR B<B THEN B 
NOT IF NOT <23 THEN 4 
Expression Less Than Or Equal 
To Expression 
Expression Greater Than Or Equal 
To Expression 
(RK Version cnZz/J If expression 1 
(A<5) AND expression 2 (B<2) are both 
true, then branch to line 7 
(3K Version on^J If either expres-
sion 1 (A<1) OR expression 2 (B<2) is 
true, then branch to line 2 
f&K yerstcw on^z/J If expression 
"NOT Q3" is true (because Q3 is 
false), then branch to line 4 
/Vote.- NOT fM9T *rne=faZseJ 
AND, OR and NOT can be used for bit manipulation, and for performing 
boolean operations. 
These three operators convert their arguments to sixteen bit, signed 
two's, complement integers in the range -32768 to +32767. They then per-
form the specified logical operation on them and return a result within 
the same range. If the arguments are not in this range, an "FC" error 
results. 
The operations are performed in bitwise fashion, this means that each 
bit of the result is obtained by examining the bit in the same position 
for each argument. 
The following truth table shows the logical relationship between bits 
OPERATOR ARG. 1 ARG. 2 
AND 
RESULT 
1 
0 
0 
0 
(cont.J 
28 

OPERATOR ARG. 1 ARG. 2  RESULT 
OR 1 1 1 
10 1 
0 1 1 
0 0 0 
NOT 1 - 0 
0 - 1 
EXAMPLES: fin aH of the examples &eZoM, ZeaJtng zeroes on 
wn^ers are not shcMn.J 
b3 AND lb=lb Since 63 equals binary 111111 and 16 equals binary 
10000, the result of the AND is binary 10000 or 16. 
15 AND 14=14 15 equals binary 1111 and 14 equals binary 1110, so 
15 AND 14 equals binary 1110 or 14. 
-1 AND 5=6 -1 equals binary 1111111111111111 and 8 equals binary 
1000, so the result is binary 1000 or 8 decimal. 
4 AND 5=0 4 equals binary 100 and 2 equals binary 10, so the 
result is binary 0 because none of the bits in either 
argument match to give a 1 bit in the result. 
4 OR 5=b Binary 100 OR'd with binary 10 equals binary 110, or 
6 decimal. 
10 OR 10=10 Binary 1010 OR'd with binary 1010 equals binary 1010, 
or 10 decimal. 
-1 OR -3=-l Binary 1111111111111111 (-1) OR'd with binary 
1111111111111110 (-2) equals binary 1111111111111111, 
or -1. 
NOT D=-l The bit complement of binary 0 to 16 places is sixteen 
ones (1111111111111111) or -1. Also NOT -1=0. 
NOT X NOT X is equal to -(X+l). This is because to form the 
sixteen bit two's complement of the number, you take the 
bit (one's) complement and add one. 
NOT l=-5 The sixteen bit complement of 1 is 1111111111111110, 
which is equal to -(1+1) or -2. 
A typical use of the bitwise operators is to test bits set in the 
ALTAIR's inport ports which reflect the state of some external device. 
Bit position 7 is the most significant bit of a byte, while position 
0 is the least significant. 
29 

For instance, suppose bit 1 of I/O port 5 is 0 when the door to Room 
X is closed, and 1 if the door is open. The following program will print 
"Intruder Alert" if the door is opened: 
10 IF NOT (INP(5) AND 2) THEN 10 This line will execute over 
and over until bit 1 (mask-
ed or selected by the 2) be-
comes a 1. When that happens, 
we go to line 20 . 
ALERT" Line 20 will output "INTRUDER 
ALERT". 
statement 10 with a "WAIT" statement, which 
This line delays the execution of the next 
statement in the program until bit 1 of 
1/0 port 5 becomes 1. The WAIT is much 
faster than the equivalent IF statement 
and also takes less bytes of program 
storage. 
The ALTAIR's sense switches may also be used as an input device by 
the INP function. The program below prints out any changes in the sense 
switches. 
10 A=300:REt1 SET A TO A VALUE THAT DILL FORCE PRINTING 
BO J=INP(E55):IF J=A THEN B0 
30 PRINT J;:A=J:G0T0 BO 
The following is another useful way of using relational operators: 
1B5 A=-(B>C)*B-(B<=C)*C This statement will set the variable 
A to MAX(B,C) = the larger of the two 
variables B and C. 
STATEMENTS 
/Vote; -Tn tTze foZZoning description of statements, an arjMment of 7 
or ^ denotes a nMmeric variaMe, X denotes a numeric expression, de-
notes a string expression and an Z or <7 denotes an expression tTzat is 
trMncated to an integer before t/ze statement is executed. Truncation 
means tMt any fractional part of t&e number is Zest, e.g. 3.3 becomes 
3, 4.0Z. becomes 
^n expression is a series of uariaMes, operators, function caMs 
and constants M^ic/: after tTze operations and function caHs are performed 
Msing t^e precedence rn^es, eva&Ma^es a numeric or string t?a%ne. 
4 constant is either a number /3.J4J or a string ZiteraZ ("FWJ. 
B0 PRINT "INTRUDER 
However, we can replace 
has exactly the same effect. 
10 tit AIT 5,B 
30 

NAME EXAMPLE  PUKPOSii/USE 
DATA 10 DATA li3-.-lE3-..04 Specifies data, read from left to right. 
Information appears in data statements 
in the same order as it will be read in 
the program. IN THE 4K VERSION OF BASIC, 
DATA STATEMENTS MUST BE THE FIRST STATE-
MENTS ON A LINE. Expressions may also 
appear in the 4K version data statements. 
BO DATA " FOO",ZOO C3R Verstcn,) Strings may be read from 
DATA statements. If you want the string 
to contain leading spaces (blanks), colons 
(:) or commas (,), you must enclose the 
string in double quotes. It is impossible 
to have a double quote within string data 
or a string literal. (""MITS"" is illegal) 
(RK Vers^cMj The user can define functions 
like the built-in functions (SQR, SGN, ABS, 
etc.) through the use of the DEF statement. 
The name of the function is "FN" followed 
by any legal variable name, for example: 
FNX, FNJ7, FNKO, FNR2. User defined 
functions are restricted to one line. A 
function may be defined to be any expres-
sion, but may only have one argument. In 
the example B 6 C are variables that are 
used in the program. Executing the DEF 
statement defines the function. User de-
fined functions can be redefined by exe-
cuting another DEF statement for the same 
function. User defined string functions 
are not allowed. "V" is called the dummy 
variable. 
Execution of this statement following the 
above would cause Z to be set to 3/B+C, 
but the value of V would be unchanged. 
DIM 113 DIM A(3),B(10) Allocates space for matrices. All matrix 
elements are set to zero by the DIM state-
ment. 
114 DIM R3(5,5),D3(B,B,E) (SR Vers^cnJ Matrices can have more 
than one dimension. Up to 255 dimen-
sions are allowed, but due to the re-
striction of 72 characters per line 
the practical maximum is about 34 
dimensions. 
115 DIM <21(N),Z(E*I) Matrices can be dimensioned dynamically 
during program execution. If a matrix 
is not explicitly dimensioned with a DIM 
statement, it is assumed to be a single 
dimensioned matrix of whose single subscript 
M 
DEF 100 DEF FNA(V)=V/B+C 
110 Z=FNA(3) 

may range from 0 to 10 (eleven elements). , j 
117 A(B)=4 If this statement was encountered before 
a DIM statement for A was found in the 
program, it would be as if a DIM A(10) 
had been executed previous to the execu-
tion of line 117. All subscripts start 
at zero (0), which means that DIM X(100) 
really allocates 101 matrix elements. 
END m END Terminates program execution without 
printing a BREAK message, (see STOP) 
CONT after an END statement causes exe-
cution to resume at the statement after 
the END statement. END can be used any-
where in the program, and is optional. 
FOR 300 FOR V=1 TO 1-3 STEP -b (see NEXT statement) V is set 
equal to the value of the expres-
sion following the equal sign, in 
this case 1. This value is called 
the initial value. Then the state-
ments between FOR and NEXT are 
executed. The final value is the 
value of the expression following 
the TO. The step is the value of 
the expression following STEP. ^ 
When the NEXT statement is encoun-
tered, the step is added to the 
variable. 
3ld FOR V=1 TO 1-3 If no STEP was specified, it is 
assumed to be one. If the step is 
positive and the new value of the 
variable is <= the final value (9.3 
in this example), or the step value 
is negative and the new value of 
the variable is => the final value, 
then the first statement following 
the FOR statement is executed. 
Otherwise, the statement following 
the NEXT statement is executed. 
All FOR loops execute the statements 
between the FOR and the NEXT at 
least once, even in cases like 
FOR V=1 TO 0. 
315 FOR V=10*N TO 3-4/(3 STEP S(3R(R) Note that expressions 
(formulas) may be used for the in-
itial, final and step values in a 
FOR loop. The values of the ex-
pressions are computed only once, 
before the body of the FOR NEXT 
loop is executed. 
32 

330 FOR V=1 TO 1 STEP -1 
330 FOR U=1 TO 10: FOR U=1 
GOTO 50 GOTO 100 
When the statement after the NEXT 
is executed, the loop variable is 
never equal to the final value, 
but is equal to whatever value 
caused the FOR...NEXT loop to ter-
minate. The statements between 
the FOR and its corresponding NEXT 
in both examples above (310 § 320) 
would be executed 9 times. 
TO :NEXT L):NEXT h) Error: do not 
use nested FOR...NEXT loops with 
the same index variable. 
FOR loop nesting is limited only 
by the available memory, 
(see Appendix D) 
:hes to the statement specified. 
GOSUB 10 GOSUB 110 Branches to the specified statement (910) 
until a RETURN is encountered; when a 
branch is then made to the statement 
after the GOSUB. GOSUB nesting is limited 
only by the available memory, 
(see Appendix D) 
IF...GOTO  33 IF X<=Y+B3-4 GOTO 13  (6R VersioHj Equivalent to IF...THEN, 
except that IF...GOTO must be followed 
by a line number, while IF...THEN can 
be followed by either a line number 
or another statement. 
IF...THEN  IF X<10 THEN 5 Branches to specified statement if the 
relation is True. 
30 IF X<0 THEN PRINT "X LESS THAN 0" Executes all of the 
statements on the remainder of the line 
after the THEN if the relation is True. 
35 IF X=5 THEN 50:Z=A WARNING. The "Z=A" will never be 
executed because if the relation is 
true, BASIC will branch to line 50. 
If the relation is false Basic will 
proceed to the line after line 25. 
Bb IF X<0 THEN PRINT "ERROR, X NEGATIVE": GOTO 350 
In this example, if X is less than 0, 
the PRINT statement will be executed 
and then the GOTO statement will 
branch to line 350. If the X was 0 or 
positive, BASIC will proceed to 
execute the lines after line 26. 
33 

INPUT  3 INPUT V,U,U3 
5 INPUT "VALUE";V 
Requests data from the terminal (to be 
typed in). Each value must be separated 
from the preceeding value by a comma (,). 
The last value typed should be followed 
by a carriage return. A "?" is typed as 
a prompt character. In the 4K version, a 
value typed in as a response to an INPUT 
statement may be a formula, such as 
2*SIN(.16)-3. However, in the 8K version, 
only constants may be typed in as a re-
sponse to an INPUT statement, such as 
4.SE-3 or "CAT". If more data was re-
quested in an INPUT statement than was 
typed in, a "??" is printed and the rest 
of the data should be typed in. If more 
data was typed in than was requested, 
the extra data will be ignored. The 8K 
version will print the warning "EXTRA 
IGNORED" when this happens. The 4K ver-
sion will not print a warning message. 
(FX VerstCMj Strings must be input in the 
same format as they are specified in DATA 
statements. 
(<% Vers^cnJ Optionally types a prompt 
string ("VALUE") before requesting data 
from the terminal. If carriage return 
is typed to an input statement, BASIC 
returns to command mode. Typing CONT 
after an INPUT command has been inter-
rupted will cause execution to resume at 
the INPUT statement. 
LET  300 LET W=X 
310V=5.1  Assigns a value to a variable 
"LET" is optional. 
NEXT  340 NEXT V 
345 NEXT 
350 NEXT V,h) 
Marks the end of a FOR loop. 
C3.K Version) If no variable is given, 
matches the most recent FOR loop. 
fRK VorstCMj A single NEXT may be used 
to match multiple FOR statements. 
Equivalent to NEXT V:NEXT W. 
ON...GOTO  100 ON I GOTO 10,30,30,40 (FX VersionJ Branches to the line 
indicated by the I'th number after 
the GOTO. That is: 
IF 1=1, THEN GOTO LINE 10 
IF 1=2, THEN GOTO LINE 20 
IF 1=3, THEN GOTO LINE 30 
IF 1=4, THEN GOTO LINE 40. 
34 

If 1=0 or I attempts to select a non-
existent line (>=5 in this case), the 
statement after the ON statement is 
executed. However, if I is >255 or 
<0, an FC error message will result. 
As many line numbers as will fit on 
a line can follow an ON...GOTO. 
105 ON SGN(X)+2 GOTO H0,50,L0 
This statement will branch to line 40 
if the expression X is less than zero, 
to line 50 if it equals zero, and to 
line 60 if it is greater than zero. 
ON...GOSUB 
110 ON I GOSUB 50,bO (FR Version; Identical to "ON...GOTO", 
except that a subroutine call (GOSUB) is 
executed instead of a GOTO. RETURN from 
the GOSUB branches to the statement after 
the ON...GOSUB. 
OUT 355 OUT I,J (RK Version; Sends the byte J to the 
output port I. Both I
 §
 J must be >=0 
and <=255. 
POKE 357 POKE I,J CSR Version; The POKE statement stores 
the byte specified by its second argu-
ment (J) into the location given by its 
first argument (I). The byte to be stored 
must be =>0 and <=255, or an FC error will 
occur. The address (I) must be =>0 and 
<=32767, or an FC error will result. 
Careless use of the POKE statement will 
probably cause you to "poke" BASIC to 
death; that is, the machine will hang, and 
you will have to reload BASIC and will 
lose any program you had typed in. A 
POKE to a non-existent memory location is 
harmless. One of the main uses of POKE 
is to pass arguments to machine language 
subroutines. (see Appendix J) You could 
also use PEEK and POKE to write a memory 
diagnostic or an assembler in BASIC. 
PRINT 3L0 PRINT X,Y;Z Prints the value of expressions on the 
370 PRINT terminal. If the list of values to be 
360 PRINT X,Y; printed out does not end with a comma (,) 
310 PRINT "VALUE IS";A or a semicolon (;), then a carriage 
400 PRINT AE,B, return/line feed is executed after all the 
values have been printed. Strings enclosed 
in quotes (") may also be printed. If a 
semicolon separates two expressions in the 
list, their values are printed next to 
each other. If a comma appears after an 
35 

expression in the list, and the print head 
is at print position 56 or more, then a 
carriage return/line feed is executed. 
If the print head is before print position 
56, then spaces are printed until the car-
riage is at the beginning of the next 14 
column field (until the carriage is at 
column 14, 28, 42 or 56...). If there is no 
list of expressions to be printed, as in 
line 370 of the examples, then a carriage 
return/line feed is executed. 
410 PRINT MIDt(A3,B); (RK Version) String expressions may be 
printed. 
READ 410 READ ViM Reads data into specified variables from 
a DATA statement. The first piece of data 
read will be the first piece of data list-
ed in the first DATA statement of the pro-
gram. The second piece of data read will 
be the second piece listed in the first 
DATA statement, and so on. When all of 
the data have been read from the first 
DATA statement, the next piece of data to 
be read will be the first piece listed in 
the second DATA statement of the program. 
Attempting to read more data than there 
is in all the DATA statements in a pro-
gram will cause an OD (out of data) error. 
In the 4K version, an SN error from a READ 
statement can mean the data it was at-
tempting to read from a DATA statement was 
improperly formatted. In the 8K version, 
the line number given in the SN error will 
refer to the line number where the error 
actually is located. 
Allows the programmer to put comments in 
his program. REM statements are not exe-
cuted, but can be branched to. A REM 
statement is terminated by end of line, 
but not by a":". 
In this case the V=0 will never be exe-
cuted by BASIC. 
In this case V=0 will be executed 
REM 500 REN NOtd SET V-0 
505 REM SET V=0: V=0 
50k V-0: REM SET V-0 
RESTORE 510 RESTORE Allows the re-reading of DATA statements. 
After a RESTORE, the next piece of data 
read will be the first piece listed in 
the first DATA statement of the program. 
The second piece of data read will be 
the second piece listed in the first DATA 
statement, and so on as in a normal 
READ operation. 
36 

RETURN 50 RETURN Causes a subroutine to return to the 
statement after the most recently exe-
cuted GOSUB. 
STOP 1000 STOP Causes a program to stop execution and to 
enter command mode. 
C3R Version; Prints BREAK IN LINE 9000. 
(as per this example) C0NT after a STOP 
branches to the statement following the 
STOP. 
UAIT B05 UAIT I,J,K (3R Version; This statement reads the 
B0L MAIT I,J status of input port I, exclusive OR's 
K with the status, and then AND's the re-
sult with J until a non-zero result is 
obtained. Execution of the program con-
tinues at the statement following the 
WAIT statement. If the WAIT statement 
only has two arguments, K is assumed to 
be zero. If you are waiting for a bit 
to become zero, there should be a one in 
the corresponding position of K. I, J 
and K must be =>0 and <=255. 
4K INTRINSIC FUNCTIONS 
ABS(X) 150 PRINT ABS(X) 
INT(X) 140 PRINT INT(X) 
RND(X) 170 PRINT RND(X) 
Gives the absolute value of the expression 
X. ABS returns X if X>=0, -X otherwise. 
Returns the largest integer less than or 
equal to its argument X. For example: 
INT(.23)=0, INT(7)=7, INT(-.1)=-1, INT 
(-2)= -2, INT(1.1)=1. 
The following would round X to D decimal 
places:  INT(X*10tD+.5)/10+D 
Generates a random number between 0 and 1. 
The argument X controls the generation of 
random numbers as follows: 
X<0 starts a new sequence of random 
numbers using X. Calling RND with 
the same X starts the same random 
number sequence. X=0 gives the last 
random number generated. Repeated 
calls to RND(0) will always return 
the same random number. X>0 gener-
ates a new random number between 0 
and 1. 
Note that (B-A)*RND(1)+A will gener-
ate a random number between A S B. 
37 

SGN(X) 230 PRINT SGN(X) Gives 1 if X>0, 0 if X=0, and -1 if X<0. 
SIN(X) 110 PRINT SIN(X) Gives the sine of the expression X. X is 
interpreted as being in radians. Note: 
COS (X)=SIN(X+3.14159/2) and that 1 Radian 
=180/PI degrees=57.2958 degrees; so that 
the sine of X degrees= SIN(X/57.2958). 
S(3R(X) 160 PRINT S(2R(X) Gives the square root of the argument X. 
An FC error will occur if X is less than 
zero. 
TAB(I) B40 PRINT TAB(I)  Spaces to the specified print position 
(column) on the terminal. May be used 
only in PRINT statements. Zero is the 
leftmost column on the terminal, 71 the 
rightmost. If the carriage is beyond 
position I, then no printing is done. I 
must be =>0 and <=255. 
USR(I) BOO PRINT USR(I)  Calls the user's machine language sub-
routine with the argument I. See POKE 
PEEK and Appendix J. 
8K FUNCTIONS finches aH those Msted M7K?er 4R JNyRJNSZC FWCyfONS 
p^MS the foZZ.oMtMQ' tw a&Ztt-MM.J 
ATN(X) BIO PRINT ATN(X) 
COS(X) BOO PRINT COS(X) 
EXP(X) 150 PRINT EXP(X) 
FRE(X) B70 PRINT FRE(0) 
INP(I) Bb5 PRINT INP(I) 
Gives the arctangent of the argument X. 
The result is returned in radians and 
ranges from -PI/2 to PI/2. (PI/2=1.5708) 
Gives the cosine of the expression X. X 
is interpreted ias being in radians. 
Gives the constant "E" (2.71828) raised 
to the power X. (E+X) The maximum 
argument that can be passed to EXP with-
out overflow occuring is 87.3365. 
Gives the number of memory bytes currently 
unused by BASIC. Memory allocated for 
STRING space is not included in the count 
returned by FRE. To find the number of 
free bytes in STRING space, call FRE with 
a STRING argument, (see FRE under STRING 
FUNCTIONS) 
Gives the status of (reads a byte from) 
input port I. Result is =>0 and <=255. 
38 

LOG(X) IbO PRINT LOG(X) 
PEEK 35b PRINT PEEK(I) 
Gives the natural (Base ii) lonarithm of 
Its argument X. To obtain the Huso Y 
logarithm of X use the formula LOG (X)/LOG (Y) 
Example: The base 10 (common) log of 
7 = LOG(7)/ LOG(10). 
The PEEK function returns the contents of 
memory address I. The value returned will 
be =>0 and <=255. If I is >32767 or <0, 
an FC error will occur. An attempt to 
read a non-existent memory address will 
return 255. (see POKE statement) 
POS(I) BbO PRINT POS(I) 
SPC(I) B5Q PRINT SPC(I) 
Gives the current position of the terminal 
print head (or cursor on CRT's). The 
leftmost character position on the terminal 
is position zero and the rightmost is 71. 
Prints I space (or blank) characters on 
the terminal. May be used only in a 
PRINT statement. X must be =>0 and <=255 
or an FC error will result. 
TAN(X) BQ0 PRINT TAN(X)  Gives the tangent of the expression X. 
X is interpreted as being in radians. 
STRINGS (FX Version OnZz/J 
1) A string may be from 0 to 255 characters in length. All string 
variables end in a dollar sign ( $ ); for example, A$, B9$, K$, 
HELL0$. 
2) String matrices may be dimensioned exactly like numeric matrices. 
For instance, DIM A$(10,10) creates a string matrix of 121 elements, 
eleven rows by eleven columns (rows 0 to 10 and columns 0 to 10). 
Each string matrix element is a complete string, which can be up to 
255 characters in length. 
3) The total number of characters in use in strings at any time during 
program execution cannot execeed the amount of string space, or an 
OS error will result. At initialization, you should set up string 
space so that it can contain the maximum number of characters which 
can be used by strings at any one time during program execution. 
NAME EXAMPLE PURPOSE/USE 
DIN B5 DIM A3(10,10) Allocates space for a pointer and length 
for each element of a string matrix. No 
string space is allocated. See Appendix D. 
39 

LET 37 LET A6="FOO"+V6  Assigns the value of a string expression 
to a string variable. LET is optional. 
> 
< 
<= 
>= 
String comparison operators. Comparison 
is made on the basis of ASCII codes, a 
character at a time until a difference 
is found. If during the comparison of 
two strings, the end of one is reached, 
the shorter string is considered smaller, 
Note that "A " is greater than "A" since 
trailing spaces are significant. 
30 LET Z3=R3+%3 String concatenation. The resulting 
string must be less than 256 characters 
in length or an LS error will occur. 
INPUT 40 INPUT X3  Reads a string from the user's terminal. 
String does not have to be quoted; but if 
not, leading blanks will be ignored and 
the string will be terminated on a "," or 
":" character. 
READ 50 READ X3  Reads a string from DATA statements within 
the program. Strings do not have to be 
quoted; but if they are not, they are 
terminated on a "," or ":" character or 
end of line and leading spaces are ignored. 
See DATA for the format of string data. 
PRINT bO PRINT X* 
70 PRINT "F00"+A3  Prints the string expression on the user's 
terminal. 
STRING FUNCTIONS C8X Version OM^j 
ASC(X3) 300 PRINT ASC(X3)  Returns the ASCII numeric value of the 
first character of the string expression 
X$. See Appendix K for an ASCII/number 
conversion table. An FC error will occur 
if X$ is the null string. 
CHR3M) 375 PRINT CHR3(I) 
FRE(X3) 373 PRINT FREf"") 
LEFT3(X3,I) 
310 PRINT LEFT3(X3,I) string expression X$. 
an FC error occurs. 
40-
Returns a one character string whose single 
character is the ASCII equivalent of the 
value of the argument (I) which must be 
=>0 and <=255. See Appendix K. 
When called with a string argument, FRE 
gives the number of free bytes in string 
space. 
Gives the leftmost I characters of the 
If I<=0 or >255 

LEN(X3) 330 PRINT LEN(X3) 
MIDS(X$,I) 
Gives the length of the string expression 
X$ in characters (bytes). Non-printing 
characters and blanks are counted as part 
of the length. 
MID$ called with two arguments returns 
330 PRINT MID3(X3,I) characters from the string expression X$ 
starting at character position I. If 
I>LEN(I$), then MID$ returns a null (zero 
length) string. If I<=0 or >255, an FC 
error occurs. 
MID3(X3,I,J) MID$ called with three arguments returns 
340 PRINT MID3(X3,I,J) a string expression composed of the 
characters of the string expression X$ 
starting at the 1th character for J char-
acters. If I>LEN(X$), MID$ returns a null 
string. If I or J <=0 or >255, an FC 
error occurs. If J specifies more char-
acters than are left in the string, all 
characters from the 1th on are returned. 
RIGHTS(XS,I) 
330 PRINT RIGHTS(XS,I) 
STRS(X) 310 PRINT STRS(X) 
VAL(XS) 330 PRINT VAL(XS) 
Gives the rightmost I characters of 
the string expression X$. When I<=0 
or >255 an FC error will occur. If 
I>=LEN(X$) then RIGHT$ returns all of 
X$. 
Gives a string which is the character 
representation of the numeric expression 
X. For instance, STR$(3.1)=" 3.1". 
Returns the string expression X$ converted 
to a number. For instance, VAL("3.1")=3.1 
If the first non-space character of the 
string is not a plus (+) or minus (-) sign 
a digit or a decimal point (.) then zero 
will be returned. 
SPECIAL CHARACTERS 
CHARACTER USE 
@ Erases current line being typed, and types a carriage 
return/line feed. An is usually a shift/P. 
-*- f&acAxEPrczj or wafer Hue,) Erases last character typed. 
If no more characters are left on the line, types a 
carriage return/line feed. "-<-" is usually a shift/0. 
41 

CARRIAGE RETURN A carriage return must end every line typed in. Re-
turns print head or CRT cursor to the first position 
(leftmost) on line. A line feed is always executed 
after a carriage return. 
Interrupts execution of a program or a list command. 
Control/C has effect when a statement finishes exe-
cution, or in the case of interrupting a LIST com-
mand, when a complete line has finished printing. In 
both cases a return is made to BASIC'S command level 
and OK is typed. 
C<% Version,) Prints "BREAK IN LINE XXXX" , where 
XXXX is the line number of the next statement to 
be executed. 
A colon is used to separate statements on a line. 
Colons may be used in direct and indirect statements. 
The only limit on the number of statements per line 
is the line length. It is not possible to GOTO or 
GOSUB to the middle of a line. 
CONTROL/O Typing a Control/0 once causes BASIC to suppress all 
output until a return is made to command level, an 
input statement is encountered, another control/0 is 
typed, or an error occurs. 
? Question marks are equivalent to PRINT. For instance, 
? 2+2 is equivalent to PRINT 2+2. Question marks can 
also be used in indirect statements. 10 ? X, when 
listed will be typed as 10 PRINT X. 
MISCELLANEOUS 
1) To read in a paper tape with a program on it (8K Version), type a 
control/0 and feed in tape. There will be no printing as the tape 
is read in. Type control/0 again when the tape is through. 
Alternatively, set nulls=0 and feed in the paper tape, and when done 
reset nulls to the appropriate setting for your terminal. 
Each line must be followed by two rubouts, or any other non-printing 
character. If there are lines without line numbers (direct commands) 
the ALTAIR will fall behind the input coming from paper tape, so 
this in not recommending. 
Using null in this fashion will produce a listing of your tape in 
the 8K version (use control/0 method if you don't want a listing). 
The null method is the only way to read in a tape in the 4K version. 
To read in a paper tape of a program in the 4K version, set the 
number of nulls typed on carriage return/line feed to zero by patch-
ing location 46 (octal) to be a 1. Feed in the paper tape. When 
42 
CONTROL/C 
: (colon) 

the tape has finished reading, stop the CPU and repatch location 46 
to be the appropriate number of null characters (usually 0, so de-
posit a 1). When the tape is finished, BASIC will print SN ERROR 
because of the "OK" at the end of the tape. 
2) To punch a paper tape of a program, set the number of nulls to 3 for 
110 BAUD terminals (Teletypes) and 6 for 300 BAUD terminals. Then, 
type LIST; but, do not type a carriage return. 
Now, turn on the terminal's paper tape punch. Put the terminal on 
local and hold down the Repeat, Control, Shift and P keys at the same 
time. Stop after you have punched about a 6 to 8 inch leader of 
nulls. These nulls will be ignored by BASIC when the paper tape is 
read in. Put the terminal back on line. 
Now hit carriage return. After the program has finished punching, 
put some trailer on the paper tape by holding down the same four 
keys as before, with the terminal on local. After you have punched 
about a six inch trailer, tear off the paper tape and save for 
later use as desired. 
3) Restarting BASIC at location zero (by toggling STOP, Examine loca-
tion 0, and RUN) will cause BASIC to return to command level and 
type "OK". However, typing Control/C is preferred because Control/ 
C is guaranteed not to leave garbage on the stack and in variables, 
and a Control C'd program may be continued, (see CONT command) 
4) The maximum line length is 72 characters?* If you attempt to type too 
many characters into a line, a bell (ASCII 7) is executed, and the 
character you typed in will not be echoed. At this point you can 
either type backarrow to delete part of the line, or at-sign to delete 
thewhole line. The character you typed which caused BASIC to type 
the bell is not inserted in the line as it occupies the character 
position one beyond the end of the line. 
*CLEAR CLEAR Deletes all variables. 
CLEAR X f<% Version; Deletes all variables. When 
used with an argument "X", sets the amount 
of space to be allocated for use by string 
variables to the number indicated by its 
argument "X". 
10 CLEAR SO C3R Version; Same as above; but, may be used 
at the beginning of a program to set the exact 
amount of string space needed, leaving a maxi-
mum amount of memory for the program itself. 
NOTE: If no argument is given, the string 
space is set at 200 by default. An OM error 
will occur if an attempt is made to allocate 
more string space than there is available 
memory. 
.**For inputting only. 
43 

u 
u 
44 
u 

45 

HOW TO LOAD BASIC 
When the ALTAIR is first turned on, there is random garbage in its 
memory. BASIC is supplied on a paper tape or audio cassette. Somehow 
the information on the paper tape or cassette must be transfered into the 
computer. Programs that perform this type of information transfer are 
called loaders. 
Since initially there is nothing of use in memory; you must toggle 
in, using the switches on the front panel, a 20 instruction bootstrap 
loader. This loader will then load BASIC. 
To load BASIC follow these steps: 
1) Turn the ALTAIR on. 
2) Raise the STOP switch and RESET switch simultaneously. 
3) Turn your terminal (such as a Teletype) to LINE. 
Because the instructions must be toggled in via the switches on the 
front panel, it is rather inconvenient to specify the positions of each 
switch as "up" or "down". Therefore, the switches are arranged in groups 
of 3 as indicated by the broken lines below switches 0 through 15. To 
specify the positions of each switch, we use the numbers 0 through 7 as 
shown below: 
3 SWITCH GROUP 
LEFTMOST MIDDLE RIGHTMOST 
Down 
Down 
Down 
Down 
Up 
Up 
Up 
Up 
Down 
Down 
Up 
Up 
Down 
Down 
Up 
Up 
Down 
Up 
Down 
Up 
Down 
Up 
Down 
Up 
OCTAL 
NUMBER 
0 
1 
2 
3 
4 
5 
So, to put the octal number 315 in switches 0 through 7, the switches 
would have the following positions: 
7 6 
UP UP 
3 
5 
DOWN 
4 
DOWN 
1 
3 
UP 
2 
UP 
1 
DOWN 
5 
0 
UP 
-SWITCH 
-POSITION 
-OCTAL NO. 
46 

Note that switches 8 through IS were not used. Switches 0 through 
7 correspond to the switches labeled DATA on the front panel. A memory 
address would use all 16 switches. 
The following program is the bootstrap loader for users loading from 
paper tape, and not using a REV 0 Serial I/O Board. 
OCTAL ADDRESS OCTAL DATA 
000 041 
001 17S 
002 037 (for 8K; for 4K use 017) 
003 061 
004 022 
005 000 
006 333 
007 000 
010 017 
011 330 
012 333 
013 001 
014 275 
015 310 
016 055 
017 167 
020 300 
021 351 
022 003 
023 000 
The following 21 byte bootstrap loader is for users loading from a 
paper tape and using a REV 0 Serial I/O Board on which the update changing 
the flag bits has not been made. If the update has been made, use the 
above bootstrap loader. 
OCTAL ADDRESS OCTAL DATA 
000 041 
001 175 
002 037 (for 8K; for 4K use 017) 
003 061 
004 023 
005 000 
006 333 
007 000 
010 346 
011 040 
012 310 
013 333 
014 001 
015 275 
016 310 
017 055 
020 167 
47 

OCTAL ADDRESS OCTAL DATA j 
(cont.)" * ' ^ 
021 300 
022 351 
023 003 
024 000 
The following bootstrap loader is for users With BASIC supplied on 
an audio cassette. 
OCTAL ADDRESS OCTAL DATA 
006 041 
001 175 
002 037 (for 8K; for 4K use 017) 
003 061 
004 022 
005 000 
006 333 
007 006 
010 017 
011 330 
012 333 
013 007 
014 275 
015 310 
016 055 ^ 
017 167 ^ 
020 300 
021 351 
022 003 
023 000 
To load a bootstrap loader: 
1) Put switches 0 through 15 in the down position. 
2) Raise EXAMINE. 
3) Put 041 (data for address 000) in switches 0 through 7. 
4) Raise DEPOSIT. 
5) Put the data for the next address in switches 0 through 7. 
6) Depress DEPOSIT NEXT. 
7) Repeat steps 5 § 6 until the entire loader is toggled in. 
8) Put switches 0 through 15 in the down position. 
9) Raise EXAMINE. 
10) Check that lights DO through D7 correspond with the data that should 

be in address 000. A light on means the switch was up, a light off 
means the switch was down. So for address 000, lights D1 through D4 
and lights D6 § D7 should be off, and lights DO and DS should be on. 
If the correct value is there, go to step 13. If the value is wrong, 
continue with step 11. 
11) Put the correct value in switches 0 through 7. 
12) Raise DEPOSIT. 
13) Depress EXAMINE NEXT. 
14) Repeat steps 10 through 13, checking to see that the correct data is 
in each corresponding address for the entire loader. 
15) If you encountered any mistakes while checking the loader, go back 
now and re-check the whole program to be sure it is corrected. 
16) Put the tape of BASIC into the tape reader. Be sure the tape is 
positioned at the beginning of the leader. The leader is the section 
of tape at the beginning with 6 out of the 8 holes punched. 
If you are loading from audio cassette, put the cassette in the re-
corder. Be sure the tape is fully rewound. 
17) Put switches 0 through 15 in the down position. 
18) Raise EXAMINE. 
19) If you have connected to your terminal a REV 0 Serial I/O Board 
on which the update changing the flag bits has not been made, raise 
switch 14; if you are loading from an audio cassette, raise switch 
15 also. 
If you have a REV 0 Serial I/O Board which has been updated, or have 
a REV 1 I/O Board, switch 14 should remain down and switch 15 should 
be raised only if you are loading from audio cassette. 
20) Turn on the tape reader and then depress RUN. Be sure RUN is depres-
sed while the reader is still on the leader. Do not depress run be-
fore turning on the reader, since this may cause the tape to be read 
incorrectly. 
If you are loading from a cassette, turn the cassette recorder to 
Play'. Wait 15 seconds and then depress RUN. 
21) Wait for the tape to be read in. This should take about 12 minutes 
for 8K BASIC and 6 minutes for 4K BASIC. It takes about 4 minutes 
to load 8K BASIC from cassette, and about 2 minutes for 4K BASIC. 
Do not move the switches while the tape is being read in. 
49 

22J if a (J or an 0 is printed on the terminal as the tape reads in, the 
tape has been mis-read and you should start over at step 1 on page 
46. 
23) When the tape finishes reading, BASIC should start up and print 
MEMORY SIZE?. See Appendix B for the initialization procedure. 
24) If BASIC refuses to load from the Audio Cassette, the ACR Demodulator 
may need alignment. The flip side of the cassette contains 90 seconds 
of 125's (octal) which were recorded at the same tape speed as BASIC. 
Use the Input Test Program described on pages 22 and 28 of the ACR 
manual to perform the necessary alignment. 
U 
50 

APPENDIX A SUPPLEMENT 
INITIALIZATION DIALOG 
STARTING BASIC 
Leave the sense switches as they were set for loading BASIC (Appen-
dix A). After the initialization dialog is complete, and BASIC types OK, 
you are free to use the sense switches as an input device (I/O port 255). 
After you have loaded BASIC, it will respond: 
MEMORY SIZE? 
If you type a carriage return to MEMORY SIZE?, BASIC will use all 
the contiguous memory upwards from location zero that it can find. BASIC 
will stop searching when it finds one byte of ROM or non-existent memory. 
If you wish to allocate only part of the ALTAIR's memory to BASIC, 
type the number of bytes of memory you wish to allocate in decimal. This 
might be done, for instance, if you were using part of the memory for a 
machine language subroutine. 
There are 4096 bytes of memory in a 4K system, and 8192 bytes in an 
8K system. 
BASIC will then ask: 
TERMINAL UIDTHf This is to set the output line width for 
PRINT statements only. Type in the number 
of characters for the line width for the 
particular terminal or other output device 
you are using. This may be any number 
from 1 to 255, depending on the terminal. 
If no answer is given (i.e. a carriage 
return is typed) the line width is set 
to 72 characters. 
Now ALTAIR BASIC will enter a dialog which will allow you to delete 
some of the arithmetic functions. Deleting these functions will give 
more memory space to store your programs and variables. However, you will 
not be able to call the functions you delete. Attempting to do so will 
result in an FC error. The only way to restore a function that has been 
deleted is to reload BASIC. 
The following is the dialog which will occur: 
4K Version 
UANT SIN? Answer " Y " to retain SIN, SQR and RND. 
If you answer " N ", asks next question. 
MANT S(2R? Answer " Y " to retain SQR and RND. 
If you answer " N ", asks next question. 
H 

UANT RND?  Answer " Y " to retain RND. 
Answer " N " to delete RND. 
8K Version 
DANT SIN-COS-TAN-ATN? Answer " Y " to retain all four of 
the functions, " N "to delete all four, 
or " A " to delete ATN only. 
Now BASIC will type out: 
XXXX BYTES FREE 
ALTAIR BASIC VERSION 3-D 
[FOUR-K VERSION]  "XXXX" is the number of bytes 
available for program, variables, 
matrix storage and the stack. It 
does not include string space. 
(or) 
[EIGHT-K VERSION] 
You will now be ready to begin using ALTAIR BASIC. 
52 

APPENDIX M 
ERROR MESSAGES 
After an error occurs, BASIC returns to command level and types OK. 
Variable values and the program text remain intact, but the program can 
not be continued and all GOSUB and FOR context is lost. 
When an error occurs in a direct statement, no line number is printed. 
Format of error messages: 
Direct Statement fXX ERROR 
Indirect Statement ?XX ERROR IN YYYYY 
In both of the above examples, "XX" will be the error code. The 
"YYYYY" will be the line number where the error occured for the indirect 
statement. 
The following are the possible error codes and their meanings: 
ERROR CODE MEANING 
BS Bad Subscript. An attempt was made to reference a 
matrix element which is outside the dimensions of the 
matrix. In the 8K version, this error can occur if 
the wrong number of dimensions are used in a matrix 
reference; for instance, LET A(1,1,1)=Z when A has 
been dimensioned DIM A(2,2). 
DD Double Dimension. After a matrix was dimensioned, 
another dimension statement for the same matrix was 
encountered. This error often occurs if a matrix 
has been given the default dimension 10 because a 
statement like A(I)=3 is encountered and then later 
in the program a DIM A(100) is found. 
FC Function Call error. The parameter passed to a math 
or string function was out of range. 
FC errors can occur due to: 
a) 
b) 
c) 
d) 
a negative matrix subscript (LET A(-1)=0) 
an unreasonably large matrix subscript 
(>32767) 
LOG-negative or zero argument 
SQR-negative argument 
53 

e) A+B with A negative and B not an integer 
f) a call to USH before the address o!* the 
machine language subroutine has been 
patched in 
g) calls to MID$, LEFT$, RIGHT$, INP, OUT, 
WAIT, PEEK, POKE, TAB, SPC or ON...GOTO 
with an improper argument. 
ID Illegal Direct. You cannot use an INPUT or ft?! FX Version J 
DEFFN statement as a direct command. 
NF NEXT without FOR. The variable in a NEXT statement 
corresponds to no previously executed FOR statement. 
OD Out of Data. A READ statement was executed but all of 
the DATA statements in the program have already been 
read. The program tried to read too much data or insuf-
ficient data was included in the program. 
OH Out of Memory. Program too large, too many variables, 
too many FOR loops, too many GOSUB's, too complicated 
an expression or any combination of the above, (see 
Appendix D) 
OV Overflow. The result of a calculation was too large to 
be represented in BASIC'S number format. If an underflow 
occurs, zero is given as the result and execution continues 
without any error message being printed. 
SN Syntax error. Missing parenthesis in an expression, 
illegal character in a line, incorrect punctuation, etc. 
RG RETURN without GOSUB. A RETURN statement was encountered 
without a previous GOSUB statement being executed. 
US Undefined Statement. An attempt was made to GOTO, GOSUB 
or THEN to a statement which does not exist. 
/U Division by Zero. 
FX (Jnc^M^es c/ the prey^cMS cccZes w a&%tton to the 
foZ^CM^g*. J 
CN Continue error. Attempt to continue a program when 
none exists, an error occured, or after a new line 
was typed into the program. 
54 

Long String. Attempt was made by use of the concatenation 
operator to create a string more than 255 characters long. 
Out of String Space. Save your program on paper tape or 
cassette, reload BASIC and allocate more string space 
or use smaller strings or less string variables. 
String Temporaries. A string expression was too complex. 
Break it into two or more shorter ones. 
Type Mismatch. The left hand side of an assignment 
statement was a numeric variable and the right hand 
side was a string, or vice versa; or, a function which 
expected a string argument was given a numeric one or 
vice versa. 
Undefined Function. Reference was made to a user defined 
function which had never been defined. 
55 

APPENDIX M 
SPACE HINTS 
In order to make your program smaller and save space, the following 
hints may be useful. 
1) Use multiple statements per line. There is a small amount of 
overhead (5bytes) associated with each line in the program. Two of these 
five bytes contain the line number of the line in binary. This means 
that no matter how many digits you have in your line number (minimum line 
number is 0, maximum is 6SS29), it takes the same number of bytes. Put-
ting as many statements as possible on a line will cut down on the number 
of bytes used by your program. 
2) Delete all unnecessary spaces from your program. For instance: 
10 PRINT X, Y, Z 
uses three more bytes than 
10 PRINTX,Y,Z 
Note: All spaces between the line number and the first non-
blank character are ignored. 
3) Delete all REM statements. Each REM statement uses at least 
one byte plus the number of bytes in the comment text. For instance, 
the statement 130 REM THIS IS A COMMENT uses up 24 bytes of memory. 
In the statement 140 X=X+Y: REM UPDATE SUM, the REM uses 14 bytes of 
memory including the colon before the REM. 
4) Use variables instead of constants. Suppose you use the constant 
3.14159 ten times in your program. If you insert a statement 
10 P=3.14159 
in the program, and use P instead of 3.14159 each time it is needed, you 
will save 40 bytes. This will also result in a speed improvement. 
5) A program need not end with an END; so, an END statement at 
the end of a program may be deleted. 
6) Reuse the same variables. If you have a variable T which is used 
to hold a temporary result in one part of the program and you need a tem-
porary variable later in your program, use it again. Or, if you are asking 
the terminal user to give a YES or NO answer to two different questions 
at two different times during the execution of the program, use the same 
temporary variable A$ to store the reply. 
7) Use GOSUB's to execute sections of program statements that per-
form identical actions. 
8) If you are using the 8K version and don't need the features of 
the 8K version to run your program, consider using the 4K version in-
stead. This will give you approximately 4.7K to work with in an 8K machine, 
as opposed to the 1.6K you have available in an 8K machine running the 
8K version of BASIC. 
56 

9) Use the zero elements of matrices; for instance, A(0), B(0,X). 
STORAGE ALLOCATION INFORMATION 
Simple (non-matrix) numeric variables like V use 6 bytes; 2 for the 
variable name, and 4 for the value. Simple non-matrix string variables 
also use 6 bytes; 2 for the variable name, 2 for the length, and 2 for a 
pointer. 
Matrix variables use a minimum of 12 bytes. Two bytes are used for 
the variable name, two for the size of the matrix, two for the number of 
dimensions and two for each dimension along with four bytes for each of 
the matrix elements. \ 
String variables also use one byte of string space for each character 
in the string. This is true whether the string variable is a simple string 
variable like A$, or an element of a string matrix such as Ql$(5,2). 
When a new function is defined by a DEF statement, 6 bytes are used 
to store the definition. 
Reserved words such as FOR, GOTO or NOT, and the names or the 
intrinsic functions such as COS, INT and STR$ take up only one byte of 
program storage. All other characters in programs use one byte of pro-
gram storage each. 
When a program is being executed, space is dynamically allocated on 
the stack as follows: 
1) Each active FOR...NEXT loop uses 16 bytes. 
2) Each active GOSUB (one that has not returned yet) uses 6 bytes. 
3) Each parenthesis encountered in an expression uses 4 bytes and 
each temporary result calculated in an expression uses 12 bytes. 
.57 

APPENDIX A
 SUPPLEMENT 
SPEED HINTS 
The hints below should improve the execution time of your BASIC pro-
gram. Note that some of these hints are the same as those used to decrease 
the space used by your programs. This means that in many cases you can 
increase the efficiency of both the speed and size of your programs at 
the same time. 
1) Delete all unnecessary spaces and REM's from the program. This 
may cause a small decrease in execution time because BASIC would otherwise 
have to ignore or skip over spaces and REM statements. 
2) TRZS ZS PROBABLY TRE A/OFT IMPORTANT SPEED RLNT BY A FACTOR OF 
Use variables instead of constants. It takes more time to con-
vert a constant to its floating point representation than it does to fetch 
the value of a simple or matrix variable. This is especially important 
within FOR...NEXT loops or other code that is executed repeatedly. 
3) Variables which are encountered first during the execution of 
a BASIC program are allocated at the start of the variable table. This 
means that a statement such as 5 A=0:B=A:C=A, will place A first, B second, 
and C third in the symbol table (assuming line 5 is thie first statement 
executed in the program). Later in the program, when BASIC finds a refer-
ence to the variable A, it will search only one entry in the symbol table 
to find A, two entries to find B and three entries to find C, etc. 
4) f<% FerstonJ NEXT statements without the index variable. NEXT 
is somewhat faster than NEXT I because no check is made to see if the 
variable specified in the NEXT is the same as the variable in the most re-
cent FOR statement. 
5) Use the 8K version instead of the 4K version. The 8K version 
is about 40% faster than the 4K due to improvements in the floating point 
arithmetic routines. 
6) The math functions in the 8K version are much faster than their 
counterparts simulated in the 4K version, (see Appendix G) 

APPENDIX M 
DERIVED FUNCTIONS 
The following functions, while not intrinsic to ALTAIR BASIC, can be 
calculated using the existing BASIC functions. 
FUNCTION 
SECANT 
COSECANT 
COTANGENT 
INVERSE SINE 
INVERSE COSINE 
INVERSE SECANT 
INVERSE COSECANT 
INVERSE COTANGENT 
HYPERBOLIC SINE 
HYPERBOLIC COSINE 
HYPERBOLIC TANGENT 
HYPERBOLIC SECANT 
HYPERBOLIC COSECANT 
HYPERBOLIC COTANGENT 
INVERSE HYPERBOLIC 
SINE 
INVERSE HYPERBOLIC 
COSINE 
INVERSE HYPERBOLIC 
TANGENT 
INVERSE HYPERBOLIC 
SECANT 
INVERSE HYPERBOLIC 
COSECANT 
INVERSE HYPERBOLIC 
COTANGENT 
FUNCTION EXPRESSED IN TERMS OF BASIC FUNCTIONS 
SEC(X) = l/COS(X) 
CSC(X) = 1/SIN(X) 
COT(X) = 1/TAN(X) 
ARCSIN(X) = ATN(X/SQR(-X*X+1)) 
ARCCOS(X) = -ATN(X/SQR(-X*X+1))+1.5708 
ARCSEC(X) = ATN(SQR(X*X-1))+(SGN(X)-1)*1.5708 
ARCCSC(X) = ATN(1/SQR(X*X-1))+(SGN(X)-1)"1.5708 
ARCCOT(X) = -ATN(X)+1.5708 
SINH(X) = (EXP(X)-EXP(-X))/2 
COSH(X) = (EXP(X)+EXP(-X))/2 
TANH(X) = -EXP(-X)/(EXP(X)+EXP(-X))*2+1 
SECH(X) = 2/(EXP(X)+EXP(-X)) 
CSCH(X) = 2/(EXP(X)-EXP(-X)) 
COTH(X) = EXP(-X)/(EXP(X)-EXP(-X))*2+1 
ARGSINH(X) = LOG(X+SQR(X*X+l)) 
ARGCOSH(X) = LOG(X+SQR(X*X-l)) 
ARGTANH(X) = LOG((l+X)/(l-X))/2 
ARGSECH(X) = LOG((SQR(-X*X+l)+l)/X) 
ARGCSCH(X) = L0G((SGN(X)*SQR(X*X+1)+1)/X) 
ARGCOTH(X) = LOG((X+l)/(X-l))/2 
59 

APPENDIX M 
SIMULATED MATH FUNCTIONS 
The following subroutines are intended for 4K BASIC users who want 
to use the transcendental functions not built into 4K BASIC. The cor-
responding routines for these functions in the 8K version are much faster 
and more accurate. The REM statements in these subroutines are given for 
documentation purposes only, and should not be typed in because they take 
up a large amount of memory. 
The following are the subroutine calls and their 8K equivalents: 
The unneeded subroutines should not be typed in. Please note which 
variables are used by each subroutine. Also note that TAN and COS require 
that the SIN function be retained when BASIC is loaded and initialized. 
bOOOO REM EXPONENTIATION: P^=X1TYT 
L0010 REM NEED: EXPn LOG 
bOOBO REM VARIABLES USED: 
b0030 P1=l : E1=0 : IF Y^=0 THEN RETURN 
b0040 IF X1<0 THEN IF INT(Y1)=YT THEN P1=1-3*Y1+4*INT(Y1/B) : X1=-X1 
b0050 IF X^<>0 THEN GOSUB bOOlO : X1=Y1*LT : GOSUB bOlbO 
bOObO P^P^EI : RETURN 
b0070 REM NATURAL LOGARITHM: L1=L0G(X1) 
bOOaO REM VARIABLES USED: A1nB1-,C1iE'l-,L'lnX'l 
bOOlO E^=0 : IF X1<=0 THEN PRINT "LOG FC ERROR"^ : STOP 
bOOIS A^=l : B^=B : : REM THIS DILL SPEED UP THE FOLLOWING 
bOlOO IF X^>=A^ THEN : : GOTO bOlOO 
bOHO IF X*=!<C^ THEN : : GOTO bOHO 
bOlBO 707107)/(X1+.707107) : 
b0130 L1= (((-
 -
 %1H71)
 *L^+B. 5353^) - 5) * -
 b^3147 
b0135 RETURN 
bOl^O REM EXPONENTIAL: E^EXP(X^) 
b0150 REM VARIABLES USED: A'hEI-.LlnX'l 
bOlbO L^=INT(1.44B7*X^)+1 : IF L1<1E7 THEN bOlBO 
b0170 IF X1>0 THEN PRINT "EXP OV ERROR"^ : STOP 
b0175 E^=0 : RETURN 
bOlBO E^=.b^3147*L^-X5 : A^=1.3BiaaE-3-1.4131bE-H*E1 
bOllO A^=(-3013bE-3).lb57WE-B) 
bOlTS E^=
 (((A*!-. Ibbbb5) . 5) *E1-1)
 *E^+1 : AT^B 
b01*=17 IF L^<=0 THEN A^=-5 : L^-LT : IF L1=0 THEN RETURN 
8K EQUIVALENT  SUBROUTINE CALL 
P9=X9+Y9 
L9=LOG(X9) 
E9=EXP(X9) 
C9=COS(X9) 
T9=TAN(X9) 
A9=ATN(X9) 
GOSUB 60030 
GOSUB 60090 
GOSUB 60160 
GOSUB 60240 
GOSUB 60280 
GOSUB 60310 
60 

bOEOO FOR X1=l TO LI : E1=A1*E1 : NEXT XT : RETURN 
bOElO REM COSINE: C1=COS(X1) 
LOEEO REM N-B- SIN MUST BE RETAINED AT LOAD-TINE 
L0E30 REM VARIABLES USED: CliXI 
bOBHO C1=SIN(X1+1.5706) : RETURN 
b0350 REN TANGENT: T1=TAN(X1) 
bOBLO REN NEEDS COS- (SIN NUST BE RETAINED AT LOAD-TINE) 
b0B70 REN VARIABLES USED: CliTI.XI 
bOBRO GOSUB L0340 : T1=SIN(X1)/C1 : RETURN 
LOBIO REN ARCTANGENT: A1=ATN(X1) 
b0300 REN VARIABLES USED: A1iB1-,C1-.T1nX1 
L0310 T1=SGN(X1): X1=ABS(X1): C1=0 : IF X1>1 THEN C1=l : X1=l/X1 
L0330 A1=X1*X1 : B1=((B.6bb33E-3*A1-l.blb57E-B)*A1+4.B101bE-B)*A1 
^0330 B1=((((B1-7.5BR1E-3)* A1+.10b5b3)* A1-.143031)*A1+.11113b)*A1 
L0340 A1=((B1-.33333E)*A1+1)*X1 : IF C1=l THEN A1-1.S70B-A1 
b0350 A1=T1*A1 : RETURN 
2! 

APPENDIX A SUPPLEMENT 
CONVERTING BASIC PROGRAMS NOT WRITTEN FOR THE ALTAIR 
Though implementations of BASIC on different computers are in many 
ways similar, there are some incompatibilites which you should watch for 
if you are planning to convert some BASIC programs that were not written 
for the ALTAIR. 
1) Matrix subscripts. Some BASICs use " [ " and " ] " to denote 
matrix subscripts. ALTAIR BASIC uses " ( " and " ) ". 
2) Strings. A number of BASICs force you to dimension (declare) 
the length of strings before you use them. You should remove all 
dimension statements of this type from the program. In some of 
these BASICs, a declaration of the form DIM A$(I,J) declares a string 
matrix of J elements each of which has a length I. Convert DIM 
statements of this type to equivalent ones in ALTAIR BASIC: DIM A$(J). 
ALTAIR BASIC uses " + " for string concatenation, not " , " or "
 §
 ". 
ALTAIR BASIC uses LEFT$, RIGHT$ and MID$ to take substrings of 
strings. Other BASICs use A$(I) to access the 1th character of 
the string A$, and A$(I,J) to take a substring of A$ from charac-
ter position I to character position J. Convert as follows: 
OLD NEW 
A$(I) MID$(A$,I,1) 
A$(I,J) MID$(A$,I,J-I+1) 
This assumes that the reference to a substring of A$ is in an expres-
sion or is on the right side of an assignment. If the reference to 
A$ is on the left hand side of an assignment, and X$ is the string 
expression used to replace characters in A$, convert as follows: 
OLD NEW 
A$(I)=X$ A$=LEFT$(A$,1-1)+X$+MID$(A$,1+1) 
A$(I,J)=X$ A$=LEFT$(A$,1-1)+X$+MID$(A$,J+l) 
3) Multiple assignments. Some BASICs allow statements of the 
form: 500 LET B=C=0. This statement would set the variables B 
§ C to zero. 
In 8K ALTAIR BASIC this has an entirely different effect. All the 
" ='s " to the right of the first one would be interpreted as logical 
comparison operators. This would set the variable B to -1 if C 
equaled 0. If C did not equal 0, B would be set to 0. The easiest 
way to convert statements like this one is to rewrite them as follows: 
62 

500 C-0:B=C. 
4) Some BASICs use " '\ " instead of " : " to delimit multiple 
statements per line. Change the " \'s " to " :'s " in the program. 
5) Paper tapes punched by other BASICs may have no nulls at the end 
of each line, instead of the three per line recommended for use with 
ALTAIR BASIC. 
To get around this, try to use the tape feed control on the Teletype 
to stop the tape from reading as soon as ALTAIR BASIC types a car-
riage return at the end of the line. Wait a second, and then continue 
feeding in the tape. 
When you have finished reading in the paper tape of the program, be 
sure to punch a new tape in ALTAIR BASIC'S format. This will save 
you from having to repeat this process a second time. 
6) Programs which use the MAT functions available in some BASICs 
will have to be re-written using FOR...NEXT loops to perform the 
appropriate operations. 
63 

APPENDIX A SUPPLEMENT 
USING THE ACR INTERFACE 
NOTE; T&e cassette features, CL&4P and C5/4VE, are onZz/ 
present in 5X BAFJCs M^ic?! are districted on cassette. 
BASIC on paper tape MiZZ gi^e t/ze z^ser abo^t more 
&z/tes of free memory, &nt it MiZZ not recognise t&e CL0/4D 
or commands. 
The CSAVE command saves a program on cassette tape. CSAVE takes one 
argument which can be any printing character. CSAVE can be given directly 
or in a program. Before giving the CSAVE command start your audio recorder 
on Record, noting the position of the tape. 
CSAVE writes data on channel 7 and expects the device status from 
channel 6. Patches can easily be made to change these channel numbers. 
When CSAVE is finished, execution will continue with the next state-
ment. What is written onto the tape is BASIC'S internal representation 
of the program in memory. The amount of data written onto the tape will 
be equal to the size of the program in memory plus seven. 
Variable values are not saved on the tape, nor are they affected by 
the CSAVE command. The number of nulls being printed on your terminal 
at the start of each line has no affect on the CSAVE or CLOAD commands. 
CLOAD takes its one character argument just like the CSAVE command. 
For example, CLOAD E. 
The CLOAD command first executes a "NEW" command, erasing the cur-
rent program and all variable values. The CLOAD command should be given 
before you put your cassette recorder on Play. 
BASIC will read a byte from channel 7 whenever the character ready 
flag comes up on channel 6. When BASIC finds the program on the tape, 
it will read all characters received from the tape into memory until it 
finds three consecutive zeros which mark the end of the program. Then 
BASIC will return to command level and type "OK". 
Statements given on the same line as a CLOAD command are ignored. 
The program on the cassette is not in a checksummed format, so the pro-
gram must be checked to make sure it read in properly. 
If BASIC does not return to command level and type "OK", it means 
that BASIC either never found a file with the right filename character, 
or that BASIC found the file but the file never ended with three con-
secutive zeros. By carefully watching the front panel lights, you can 
tell if BASIC ever finds a file with the right name. 
Stopping the ALTAIR and restarting it at location 0 will prevent 
BASIC from searching forever. However, it is likely that there will 
either be no program in the machine, or a partial program that has errors. 
Typing NEW will always clear out whatever program is in the machine. 
Reading and writing data from the cassette is done with the INP, OUT 
and WAIT statements. Any block of data written on the tape should have 
its beginning marked with a character. The main thing to be careful of 
is allowing your program to fall behind while data passes by unread. 
Data read from the cassette should be stored in a matrix, since 
64 

there isn't time to process data as it is being read in. You will pro-
bably want to detect the end of data on the tape with a special character. 
65 

APPENDIX M 
BASIC/MACHINE LANGUAGE INTERFACE 
In all versions of BASIC the user can link to a machine language 
subroutine. The first step is to set aside enough memory for the sub-
routine. When BASIC asks "MEMORY SIZE?", you shouldn't type a return, 
because BASIC would then write into all of memory trying to find out 
how much memory your machine has and then use whatever memory it finds. 
The memory that BASIC actually uses is constantly modified, so you 
cannot store your machine language routine in those locations. 
BASIC always uses memory starting at location 0 and as high upwards 
as you let it. BASIC cannot use non-contiguous blocks of memory. There-
fore, it is best to reserve the top locations of memory for your machine 
language program. 
For example, if you have a 4K machine and want to use a 200 byte sub-
routine, you should set memory size to 3896. Remember, BASIC always ac-
cepts numbers in decimal and that 4K is really 2+12=4096 rather than 4000. 
Now BASIC will not use any location >=* 3896. 
If you try to allocate too much memory for your machine language pro-
gram, you will get an OM (out of memory) error. This is because there is 
a certain amount of memory that BASIC must have or it will give an OM 
error and go back to the "MEMORY SIZE?" question. 
The starting location of your routine must be stored in a Ideation 
known as "USRLOC". The exact octal location of USRLOC will be given with 
each distributed version of BASIC. It is not the same for the 4K and 8K 
versions.  USRLOC for Version 3.0: 8K (both paper tape § cassette) = lll(octal) 
4K=103(octal) 
Initially USRLOC is set up to contain the address of "ILLFUN", which 
is the routine that gives an FC (function call) error. USRLOC is the two 
byte absolute address of the location BASIC calls when USR is invoked. 
USR is a function just like ABS or INT and is called as follows: 
10 X=USR(3). 
When your routine is called the stack pointer is set up and you are 
allowed to use up to 8 levels of stack (16 bytes). If you want to use 
more, you have to save BASIC'S stack pointer (SP), set up your own, and 
restore BASIC'S before you return back to BASIC. 
All of the registers (A, B, C, D, E, H, L and PSW) can be changed. 
It is dangerous to modify locations in BASIC itself unless you know what 
you are doing. This is unlikely unless you have purchased a source copy 
of BASIC. Popping more entries off of the stack than you put on is almost 
guaranteed to cause trouble. 
To retrieve the argument passed to USR, you must call the routine 
whose address is given in location 4 and 5 (DEINT). The low order 8 bits 
of an address are always stored in the lower address (4 in this case), and 
the high order 8 bits are stored in the next (higher) memory address (5 
in this case). 
66 

The argument to USR is truncated to an integer (calling USR with 3.8 
is the same as calling it with 3). If the argument is greater than 32767 
or less than -32768, an FC error will result. When DEINT returns, the 
two byte signed value of the argument will be in registers D § E. The 
high order byte would be in D, the low order byte in E. For instance: 
if the argument to USR was -1, D would equal 255 and E would equal 255; 
if the argument was 400, D would equal 1 and E would equal 144. 
To pass back a value from USR, set up a two byte value in registers 
A
 §
 B and call the routine whose address is given in locations 6 and 7. 
A
 §
 B should be set up in the same manner that D 5 E are when a value is 
passed to USR (A should contain the high order byte and B the low order 
byte). 
If the routine whose address is given in locations 6 and 7 is not 
called, the function USR in the user's program will be an identity func-
tion. That is, USR(X) will equal X. 
At the end of the USR routine a RET must be done to get back to 
BASIC. The BASIC program is completely stopped while USR is being exe-
cuted and the program will not be continued until USR returns. 
In the 4K version, the USR routine should not enable interrupts from 
a device. 4K BASIC uses the RST 7 location (56 decimal, 70 octal) to store 
a subroutine. If an interrupt occurs, this subroutine will be called which 
will have an undetermined and undesirable effect on the way BASIC behaves. 
In the 8K BASIC, locations 56, 57 and 58 decimal have been set aside 
to store a JMP to a user-provided interrupt service routine. Initially 
a RET instruction is stored at location 56, so until a user sets up the 
call to his interrupt service routine, interrupts will have no effect. 
Care must be taken in interrupt routines to save and restore the 
stack pointer, (A, B, C, D, E, H 5 L) and the PSW. Interrupt routines 
can pass data using PEEK, and can receive data using POKE. 
The interrupt service routine should re-enable interrupts with an EI 
instruction before it returns, as interrupts are automatically disabled 
when the interrupt occurs. If this procedure is not followed, the inter-
rupt service routine will never "see" another interrupt. 
Though there is only one way of calling a machine language subroutine, 
this does not restrict the user to a single subroutine. The argument pas-
sed to USR can be used to determine which routine gets called. Multiple 
arguments to a machine language routine can be passed with POKE or through 
multiple calls to USR by the BASIC program. 
The machine language routine can be loaded from paper tape or cassette 
before or after BASIC is loaded. The checksum loader, an unchecksummed 
loader, the console switches, or more conveniently the POKE function can be 
used to load the routine. 
A common use of USR for 4K users will be doing IN's and OUT's to 
special devices. For example, on a 4K machine a user wants USR to pass 
back the value of the front panel switch register: 
Answer to MEMORY SIZE? : 4050 
USRLOC patched to contain 117,322]=7722 Base 8=4050 decimal 
67 

At location 4050=7722  Basei 
8 put: 
7722/333  IN  255  ;(255 Base 10=377 Base 8) Get 
7723/377  ;the value of the switches in A 
7724/107  MOV  B,A  ;B gets low part of answer 
7725/257  XRA  A  ;A gets high part of answer 
7726/052  LHLD  6  ;get address of routine 
7727/006 
7730/000  ;that floats [A,B] 
7731/351  PCHL  ;go to that routine which will 
;return to BASIC 
;with the answer 
MORE ON PEEK AND POKE KERFJON (WLYJ 
As mentioned before, POKE can be used to set up your machine language 
routine in high memory. BASIC does not restrict which addresses you can 
POKE. Modifying USRLOC can be accomplished using two successive calls to 
POKE. Patches whibh a user wishes to include in his BASIC can also be 
made using POKE. 
Using the PEEK function and OUT statement of 8K BASIC, the user can 
write a binary dump program in BASIC. Using INP and POKE it is possible 
to write a binary loader. 
PEEK and POKE can be used to store byte oriented information. When 
you initialize BASIC, answer the MEMORY SIZE? question with the amount of 
memory in your ALTAIR minus the amount of memory you wish to use as stor-
age for byte formatted data. 
You are now free to use the memory in the top of memory in your ALTAIR 
as byte storage. See PEEK and POKE in the Reference Material for a further 
description of their parameters. 
68 

APPENDIX M 
ASCII CHARACTER CODES 
DECIMAL  CHAR.  DECIMAL  CHAR.  DECIMAL  CHA! 
000  NUL  043  +  086  V 
001  SOH  044  *  087  W 
002  STX  045  -088  X 
003  ETX  046  089  Y 
004  EOT  047  /  090  Z 
005  ENQ  048  0  091  [ 
006  ACK  049  1  092  \ 
007  BEL  050  2  093  ] 
008  BS  051  3  094  + 
009  HT  052  4  095  -t-
010  LF  053  5  096  ** 
Oil  VT  054  6  097  a 
012  FF  055  7  098  b 
013  CR  056  8  099  c 
014  SO  057  9  100  d 
015  SI  058  101  e 
016  DLE  059  102  f 
017  DC1  060  <  103  g 
018  DC 2  061  =  104  h 
019  DC3  062  >  105  i 
020  DC4  063  ?  106  j 
021  NAK  064  e  107  k 
022  SYN  065  A  108  1 
023  ETB  066  B  109  m 
024  CAN  067  C  110  n 
025  EM  068  D  111  o 
026  SUB  069  E  112  P 
027  ESCAPE  070  F  113  q 
028  FS  071  G  114  r 
029  GS  072  H  115  s 
030  RS  073  1  116  t 
031  US  074  J  117  u 
032  SPACE  075  K  118  V 
033  t  076  L  119  w 
034  "  077  M  120  X 
035  #  078  N  121  y 
036  $  079  0  122  z 
037  %  080  P *  123  { 
038  081  Q  124  t 
039  082  R  125  } 
040  (  083  S  126  ^ 
041  )  084  T  127  DEL 
042  085  U 
LF=Line Feed FF=Form Feed CR=Carriage Return DEL=Rubout 
69 

CHR$ is a string function which returns a one character string which 
contains the ASCII equivalent of the argument, according to the conversion 
table on the preceeding page. ASC takes the first character of a string 
and converts it to its ASCII decimal value. 
One of the most common uses of CHR$ is to send a special character 
to the user's terminal. The most often used of these characters is the 
BEL (ASCII 7). Printing this character will cause a bell to ring on some 
terminals and a "beep" on many CRT's. This may be used as a preface to 
an error message, as a novelty, or just to wake up the user if he has 
fallen asleep. (Example: PRINT CHR$(7);) 
A major use of special characters is on those CRT's that have cursor 
positioning and other special functions (such as turning on a hard copy 
printer). 
As an example, try sending a form feed (CHR$(12)) to your CRT. On 
most CRT's this will usually cause the screen to erase and the cursor to 
"home" or move to the upper left corner. 
Some CRT's give the user the capability of drawing graphs and curves 
in a special point-plotter mode. This feature may easily be taken advan-
tage of through use of ALTAIR BASIC'S CHR$ function. 
70 

APPENDIX L 
EXTENDED BASIC 
When EXTENDED BASIC is sent out, the BASIC manual will be updated 
to contain an extensive section about EXTENDED BASIC. Also, at this time 
the part of the manual relating to the 4K and 8K versions will be revised 
to correct any errors and explain more carefully the areas users are hav-
ing trouble with. This section is here mainly to explain what EXTENDED 
BASIC will contain. 
INTEGER VARIABLES These are stored as double byte signed quantities 
ranging from -32768 to +32767. They take up half as much space as normal 
variables and are about ten times as fast for arithmetic. They are denoted 
by using a percent sign (%) after the variable name. The user doesn't 
have to worry about conversion and can mix integers with other variable 
types in expressions. The speed improvement caused by using integers for 
loop variables, matrix indices, and as arguments to functions such as 
AND, OR or NOT will be substantial. An integer matrix of the same dimen-
sions as a floating point matrix will require half as much memory. 
DOUBLE-PRECISION Double-Precision variables are almost the oppo-
site of integer variables, requiring twice as much space (8bytes per value) 
and taking 2 to 3 times as long to do arithmetic as single-precision 
variables. Double-Precision variables are denoted by using a number sign 
(#) after the variable name. They provide over 16 digits of accuracy. 
Functions like SIN, ATN and EXP will convert their arguments to single-
precision, so the results of these functions will only be good to 6 digits. 
Negation, addition, subtraction, multiplication, division, comparision, 
input, output and conversion are the only routines that deal with Double-
Precision values. Once again, formulas may freely mix Double-Precision 
values with other numeric values and conversion of the other values to 
Double-Precision will be done automatically. 
PRINT USING Much like COBOL picture clauses or FORTRAN format 
statements, PRINT USING provides a BASIC user with complete control over 
his output format. The user can control how many digits of a number are 
printed, whether the number is printed in scientific notation and the 
placement of text in output. All of this can be done in the 8K version 
using string functions such as STR$ and MID$, but PRINT USING makes it 
much easier. 
DISK I/O EXTENDED BASIC will come in two versions, disk and non-
disk. There will only be a copying charge to switch from one to the 
other. With disk features, EXTENDED BASIC will allow the user to save and 
recall programs and data files from the ALTAIR FLOPPY DISK. Random ac-
cess as well as sequential access will be provided. Simultaneous use of 
multiple data files will be allowed. Utilities will format new disks, 
delete files and print directories. These will be BASIC programs using 
special BASIC functions to get access to' disk information such as file 
length, etc. User programs can also access these disk functions, enabling 
the user to write his own file access method or other special purpose 
7! 

disk routine. The file format can be changed to allow the use of other 
(non-floppy) disks. This type of modification will be done by Ml'i'S under 
special arrangement. 
OTHER FEATURES Other nice features which will be added are: 
Fancy Error Messages 
An ELSE clause in IF statements 
LIST, DELETE commands with line range as arguments 
Deleting Matrices in a program 
TRACE ON/OFF commands to monitor program flow 
EXCHANGE statement to switch variable values (this will speed 
up string sorts by at least a factor of two). 
Multi-Argument, user defined functions with string arguments 
and values allowed 
Other features contemplated for future release are: 
A multiple user BASIC 
Explicit matrix manipulation 
Virtual matrices 
Statement modifiers 
Record I/O 
Paramaterized GOSUB 
Compilation 
Multiple USR functions 
"Chaining" 
EXTENDED BASIC will use about 11K of memory for its own code (10K 
for the non-disk version) leaving IK free on a 12K machine. It will take 
almost 20 minutes to load from paper tape, 7 minutes from cassette, and 
less than 5 seconds to load from disk. 
We welcome any suggestions concerning current features or possible 
additions of extra features. Just send them to the ALTAIR SOFTWARE 
DEPARTMENT. 
72 

APPENDIX M 
BASIC TEXTS 
Below are a few of the many texts that may be helpful in learning 
BASIC. 
1) BASIC PROGRAMMING, John G. Kemeny, Thomas E Kurtz, 1967, pl45 
2) BASIC, Albrecht, Finkel and Brown, 1973 
3) A GUIDED TOUR OF COMPUTER PROGRAMMING IN BASIC, Thomas A Dwyer 
and Michael S. Kaufman; Boston: Houghton Mifflin Co., 1973 
Books numbered 1 $ 2 may be obtained from: 
People's Computer Company 
P.O. Box 310 
Menlo Park, California 
94025 
They also have other books of interest, such as: 
101 BASIC GAMES, Ed. David Ahl, 1974 p250 
WHAT TO DO AFTER YOU HIT RETURN or PCC's FIRST 
BOOK OF COMPUTER GAMES 
COMPUTER LIB
 §
 DREAM MACHINES, Theodore H. Nelson, 1974, pl86 
73 

u 
u 
u 

75 

ALTAIR EXTENDED BASIC 
PRELIMINARY DOCUMENTATION 
THE FOLLOWING PAGES CONTAIN A CONDENSED VERSION OF THE 
COMPLETE "ALTAIR EXTENDED BASIC" DOCUMENTATION. 
In order to get this software to our customers with a 
minimum of delay, it was decided to print this prelim-
inary documentation. This will help to expedite the 
deliveries. The complete manual will be printed at a 
later date, and will be in much the same format as the 
previous existing BASIC documentation. 
READ THESE PAGES OVER CAREFULLY. SOME OF THE INFOR-
MATION CONTAINED HERE ALSO APPLIES TO THE 4K AND 8K 
VERSIONS OF BASIC. 
This is meant to be an additional section to the 
"ALTAIR BASIC REFERENCE MANUAL", and not a sepa-
rate manual in itself. 
December '75 

ALTAIR EXTENDED BASIC 
ALTAIR EXTENDED BASIC Includes all of the features found In the 8K 
version of BASIC, with some variations. There are also a large number of 
additional features making this version one of the most powerful BASICs 
available. 
The following section contains the EXTENDED BASIC features and Its 
variations from the 8K BASIC. 
NAME 
DELETE 
LIST 
COMMANDS 
EXAMPLE 
DELETE X 
DELETE -X 
PURPOSE/USE 
Deletes line In a program with 
the line number "X". "ILLEGAL 
FUNCTION CALL" error occurs 1f 
there Is no line "X". 
Deletes all lines In a program up 
to and Including line number "X". 
"ILLEGAL FUNCTION CALL" 1f no line 
"X". 
Deletes all lines In a program from 
the line number equal to or greater 
than "Y" up to and Including the 
first line equal to or less than 
"X". "ILLEGAL FUNCTION CALL" If no 
line "X". 
If deletion 1s performed, all variable values are lost. 
Also continuing 1s not allowed, and all "F0R"s and "G0SUB"s 
are made Inactive. (This 1s the same effect caused when-
ever a program 1s modified.) 
DELETE Y-X 
LIST X 
LIST or LIST-
LIST X-
LIST -X 
LIST Y-X 
77 
Lists Hne "X" 1f there Is one. 
Lists the entire program. 
Lists all lines in a program with a 
Hne number equal to or greater than 
"X". 
Lists all of the lines 1n a program 
with a Hne number less than or equal 
to "X". 
Lists all of the lines within a pro-
gram with Hne numbers equal to or 
greater than "Y", and less than or 
equal to "X". 

EXAMPLE  PURPOSE/USE 
ERASE J% Eliminates an array. If no such 
array exists an "ILLEGAL FUNCTION 
ERASE
 XX,
 I# CALL" error will occur. ERASE must 
refer to an array, not an array ele-
ERASE A$ ment [ERASE B(9) would be Illegal]. 
The space the array Is using 1s freed 
ERASE D#,NMSX up and made available for other uses. 
The array can be dimensioned again, 
but the values before the ERASE are 
lost. 
Exchanges the value of two variables. 
(If X=1 & Y=5, after SMAP X,Y the 
values would be switched; that 1s, 
now X=5 & Y=l.) Both, one or neither 
of the variables may be array elements. 
If a non-array variable that has not 
been assigned a value Is referenced 
an "ILLEGAL FUNCTION CALL" error will 
occur. Both variables must be of 
the same type (both Integers, both 
strings, both double precision or 
both single precision), otherwise a 
"TYPE MISMATCH" error will occur. 
TRON Turns on the trace flag. 
TROFF Turns off the trace flag. 
TRON & TROFF can be given In either 
direct or Indirect (program) mode. 
When the trace flag Is on, each time 
a new program line Is started, that 
line number 1s printed enclosed 1n 
"[]". No spaces are printed. For 
example: 
SMAP IX,JX 
SWAP B$(7),T$ 
SWAP D#(I),D#(I+1) 
TRON 
OK 
10 PRINT 1: PRINT "A" 
20 STOP 
RUN 
DO] 1 
A 
[20] 
BREAK IN 20 
"NEW" will also turn off the trace 
flag along with Its other functions. 

STATEMENTS 
IF-THEN-ELSE (Similar to 8K version IF-THEN state-
ment, only with the addition of a new 
"ELSE" clause.) 
IF X>Y THEN PRINT "GREATER" ELSE PRINT "NOT GREATER" 
In the above example, first the 
relational condition would be tested. 
If it is true, the THEN clause would 
be executed ("GREATER" would be 
printed). If it is false, the ELSE 
clause would be executed ("NOT GREATER" 
would be printed). 
10 IF A>B THEN PRINT "A>B" ELSE IF B>A THEN PRINT "B>A" ELSE PRINT "A=B" 
The above example would indicate 
which of the two variables was the 
largest, or if they were equal. 
As this example indicates, IF state-
ments may be nested to any desired 
level (regulated only by the maximum 
line length). An IF-THEN-ELSE state-
ment may appear anywhere within a mul-
tiple-statement Hne; the THEN clause 
being always mandatory with each IF 
clause and the ELSE clause optional. 
Care must be taken to insure that IFs 
without ELSE clauses do not cause an 
ELSE to be associated with the wrong 
IF. 
5 IF A=B THEN IF A=C THEN PRINT "A=C ELSE PRINT "A<>C" ELSE PRINT "A<>B" 
In the above example, the double 
under-lined portion of the line is 
an IF-THEN-ELSE statement which is 
all a part of the THEN clause of the 
first IF statement in the line. The 
second ELSE (single under-lined) is 
part of the first IF, and will be 
executed only if the first relational 
expression is false (A<>B). If a 
line does not contain the same number 
of ELSE and THEN clauses, the last 
ELSE is matched with the closest THEN. 
79 

TYPING 
Normally, numbers used In BASIC operations are stored and acted upon as single 
precision floating point numbers. This allows for 7 digits of accuracy. 
In the extended version of BASIC greater accuracy may be obtained by typing 
numbers as double precision. This allows for 16 digits of accuracy. In 
cases where speed is critical, it is, however, slower than single precision. 
The greatest advantage, in both speed and storage space can be obtained by using 
integer operations whenever possible. These fall within the rage <=32767 to 
>=-32768. 
Examples: 
(single precision) PRINT 1/3 
.3333333 
(double precision) PRINT 1/3D 
.3333333333333333 
(integer) PRINT 1/3% 
0 
PRINT 2.76% 
2 
The use of these types of numbers will become clearer further on in the 
text. 
Examples: 
I%(10) uses (11 * 2) + 6 + (2 * 1) = 30 
I (5,5) uses (6 * 6 * 4) + 6 + (2 * 2) = 154 

TYPING 
There are four types of values used 1n EXTENDED BASIC programming: 
NAME SYMBOL # OF BYTES/VALUE 
STRINGS (0 to 255 $ 3 
characters) 
INTEGERS (must be % 2 
-32768 and =< 
32767) 
DOUBLE PRECISION # 8 
(exponent: -38 
to +38) 16 digits 
SINGLE PRECISION ! 4 
(exponent: -38 
to +38) 7 digits 
The type a variable will be is explicitly declared by using one of the 
four symbols listed above. Otherwise, the first letter of the variable is 
used to look into the table that indicates the default type for that letter. 
Initially (after CLEAR, after RUN, after NEW, or after modifying a program) 
all letters are defaulted to SINGLE PRECISION. 
The following four statements can be used to modify the DEFAULT table: 
STATEMENT DEFAULTS VARIABLE TO 
DEFINT r INTEGER 
DEFSTRr STRING 
DEFDBL r DOUBLE PRECISION 
DEFSNG r SINGLE PRECISION 
r above indicates the position for the range to be given. This 
is to be of the following format: letter or letter 1 - letter 2. 
(In the second format, the "-" indicates from letter 1 through 
letter 2 inclusive.) 
In the above four statements the default type of all of the letters within 
the range is changed, depending on which DEF "type" is used. Initially, 
DEFSNG A-Z is assumed. Care should be taken when using these statements 
since variables referred to without type indicators may not be the same after 
the statement is executed. It is recommended that these statements be used 
only at the start of a program, before any other statements are executed. 
The following will illustrate some of the above information: 
81 

10 I%=1 
20 n=2  The example on the left would 
30 I#=3  print out: 
40 I$="ABC"  2  at line # 50 
50 PRINT 1  1  at line # 70 
60 DEFINT 1  ABC  at line # 90 
70 PRINT 1  3  at Hne  # 110 
80 DEFSTR 1 
90 PRINT 1 
100 DEFDBL 1 
110 PRINT 1 
TYPING OF CONSTANTS 
The type that a particular constant will be is determined by the following: 
1) if it is more than 7 digits or "D" is used in the exponent, 
then it will be DOUBLE PRECISION. 
2) if it is >32767 or <-32768, a decimal point (.) is used, 
or an "E" is used, then it is SINGLE PRECISION. 
3) otherwise, it is an integer. 
When a + or * operation or a comparison is performed, the operands are 
converted to both be of the same type as the most accurate operand. There-
fore, if one or both operands are double precision, the operation is done 
in double precision (accurate but slow). If neither is double precision 
but one or more operands are single precision floating point, then the 
operation will be done in single precision floating point. Otherwise, 
both operands must be integers, and the operation is performed in integer 
representation. 
If the result of an integer + or * is too big to be an integer, the oper-
ation will be done in single precision and the result will be single preci-
sion. Division (/) is done the same as the above operator, except it is never 
done at the integer level. If both operands are integers, the operation is 
done as a single precision divide. 
The operators AND, OR, NOT, \, and MOD force both operands to be integers 
before the operation is done. If one of the operands is >32767 or <-32768, an 
overflow error will occur. The result of these operators will always be an 
integer. (Except -32768\-l gives single precision.) 
No matter what the operands to + are, they will both be converted to single 
precision. The functions SIN, COS, ATN, TAN, SQR, LOG, EXP, and RND also 
convert their arguments to single precision and give the result as such, ac-
curate to 6 digits. 
Using a subscript >32767 and assigning an integer variable a value too 
large to be an integer gives an overflow error. 
82 

TYPE CONVERSION 
When a number Is converted to an integer, it is truncated (rounded down). 
For example: 
I%=.999 A%=-.01 
PRINT 1% PRINT A% 
0 -1 
It will perform as if the INT function was applied. 
When a double precision number is converted to single precision, it is 
rounded off. For example: 
D#=77777777 
I!=D# 
PRINT I! 
7.77778E+07 
No automatic conversion is done between strings and numbers. See the STR$, 
NUM, ASC, and CHR$ functions for this purpose. 
NEW FUNCTIONS 
CINT Convert the argument to an integer number 
CSNG Convert the argument to a single precision number 
CDBL Convert the argument to a double precision number 
Examples: CDBL(3)=3D 
CINT(3.9)=3 
CINT(-.01)=-1 
CSNG(312456.8)=312457 
NOTE: if X<=32767 and =>-32768 then CINT(X)=INT(X) 
otherwise, CINT will give an overflow error 
NEW OPERATORS 
\(backslash=shift L) 
Integer Division 
Examples: 1\3=0 
7\2=3 
-3\-l=3 
300\7=42 
-8\3=-2 
-1\3=0 
The integer division operator forces 
both arguments to integers and gives 
the integer value of the division 
operation. (The only exception to this 
is -37268\-l, which results in a value 
too l*arge to be an integer.) 
NOTE: A\B does not equal INT(A/B) 
(if A=-l & B=7, 0 does not 
equal -1) 
Integer division is about eight times 
as fast as single precision division. 
Its precedence is just below that of 
*&/. 

NEW OPERATORS (cont.J 
MOD  The MOD operator forces both arguments 
to integers and returns a result 
according to the following formula: 
Examples: 4 MOD 7=4 
13 MOD 3=1 
7 MOD -11=7  A MOD B = A - [B * (A\B)] 
-6 MOD -4=-2  If B=0 then a division by zero error 
will occur. MODs precedence is just 
below that of integer division and 
just above + and -. 
USER-DEFINED-FUNCTIONS 
In the Extended version of BASIC, a user-defined function can be of any 
type and can take any number of arguments of any type. 
The result of the function will be forced to the function type before 
the value is substituted into the formula with the function call. 
The loop variable in a FOR loop can be an integer as well as a single 
precision number. Attempting to use a string or double precision vari-
able as the loop variable will cause a Type Mismatch error to occur. 
Integer FOR loops are about three times as fast as single precision FOR 
loops. If the addition of the increment to the loop variable gives a 
result that is too big to be an integer, an overflow error will occur. The 
initial loop value, increment value and the final value must all be in the 
legal range for integers or an overflow error will occur when the FOR is 
executed. 
Examples: DEF FNRAND0M%=10*RND(1)+1 
DEF FNTW0$(X$)=X$+X$ 
DEF FNA(X,Y,Z,I%)=X+Z+I%*Y 
FOR LOOPS (Integer) 
Example:  1 FOR I%=20000 TO 30000 STEP 20000 
2 PRINT 1% 
3 NEXT 1% 
RUN 
20000 
OVERFLOW IN 3 
OK 
84 

These messages replace the old error messages listed In APPENDIX C (p. 53) 
the BASIC manual. 
NEXT WITHOUT FOR 
SYNTAX ERROR 
RETURN WITHOUT GOSUB 
OUT OF DATA 
ILLEGAL FUNCTION CALL 
OVERFLOW 
OUT OF MEMORY 
UNDEFINED STATEMENT 
SUBSCRIPT OUT OF RANGE 
REDIMENSIONED ARRAY 
DIVISION BY ZERO 
ILLEGAL DIRECT 
TYPE MISMATCH 
OUT OF STRING SPACE 
STRING TOO LONG 
STRING FORMULA TOO COMPLEX 
CAN'T CONTINUE 
UNDEFINED USER FUNCTION 
Examples: 10 GOTO 50 
RUN 
UNDEFINED STATEMENT IN 50 
OK 
PRINT 1/0 
DIVISION BY ZERO 
OK 
ADDITIONAL NOTES ON EXTENDED BASIC 
PEEK & POKE In the 8K version of BASIC you can't PEEK at or POKE 
Into memory locations above 32767. In the Extended 
version this can be done by using a negative argument. 
If the address to be PEEKed or POKEd is greater than 
32767, subtract 65536 from it to give the proper 
argument. 
Examples: to PEEK at 65535 PEEK(-l) 
to POKE at 32768 POKE -32768,1% 
INT The INT function will work on numbers both 
single & double precision which are too large to 
be integers. Double precision numbers maintain 
full accuracy, (see CINT) 
Examples: 1NT(1E38)=1E38 
INT(123456789.6)=123456789 
85 

ADDITIONAL NOTES (cont.) (miscellaneous) 
Extended BASIC uses 10.2K of memory to reside. 
String space is defaulted to 100 in the Extended version. 
A comma before the THEN in an IF statement is allowed. 
USR pass routine [4,5] passes in [H,L] not [D,E], and the pass back routine 
[6,7] receives in [H,LJ not [A,B]. 
Files CSAVEd in 8K BASIC cannot be CLOADed in EXTENDED BASIC, nor the opposite. 
UPDATE TO EXISTING MATERIAL 
In cassette BASICs (both 8K* and Extended), CLOAD? some character file name, 
reads the specified file and checks it against the file in core. If the 
files do not match, the message "NO GOOD" is printed. If they do match, 
BASIC returns to command level and prints "OK". 
In the Extended version of BASIC, active FOR loops (integer or single 
precision) require 17 bytes. 
Each non-array ["string Ivariable uses [*6"1 bytes. 
integer 5 
double 11 
precision 
single 
precision 
This is because, it takes 3 bytes to store the name of a vari-
able. 
Each array uses: (# of elements)* 
Examples: 
"INT=2 
DBL=8 
STR=3 
SNG=4 
+6+2*(# of dimensions). 
I%(_10) uses (ll*2)+6+(2*l)=30 bytes 
1(5,5) uses (6*6*4)+6+(2*2)=154 bytes 
Stored programs take exactly the same amount of space as in the 8K version of 
BASIC, except the reserved word ELSE takes 2 bytes instead of 1 byte as with 
the other reserved words. 
86 

UPDATE TO EXISTING MATERIAL 
(Applies to 8K versions 3.2 and later.) 
In both Extended & 8K* BASIC, if a number is between >=lE-2 and <1E-1, 
the number will be printed as: 
.OXXXXXX (trailing zeros suppressed) 
instead of X.XXXXXXE-2 
An 8K BASIC program should run exactly the same under Extended BASIC. 
No conversion should be necessary. 
USRLOC in extended is: 
101 octal=65 decimal, 
still 111 in 8K and 4K to load. 
EXTENDed: 
(Non-disk) location 002 in the BOOT 
should be 57 (8K=37, 4K=17) 
UPDATE TO EXISTING MATERIAL 
(Applies to page 57 of version 3.2 and later.) 
Each active GOSUB takes 5 bytes. 
Each active FOR loop takes 16 bytes. 
!7 

EDIT COMMAND 
The EDIT command Is for the purpose of allowing modifications and additions 
to be made to existing program lines without having to retype the entire 
line each time. 
Commands typed in the EDIT mode are, as a rule, not echoed. Most commands 
may be preceded by an optional numeric repetition factor which may be used 
to repeat the command a number of times. This repetition factor should be 
in the range 0 to 255 (0 is equivalent to 1). If the hepetition factor is 
omitted, it is assumed to be 1. In the following examples a lower case 
"n" before the command stands for the repetition factor. 
In the following description of the EDIT commands, the "cursor" refers to 
a pointer which is positioned at a character in the Hne being edited. 
To EDIT a Hne, type EDIT followed by the number of the Hne and hit the 
carriage return. The Hne number of the Hne being EDITed will be printed, 
followed by a space. The cursor will now be positioned to the left of 
the first character in the Hne. 
NOTE: The best way of getting the "feel" of the EDIT command is to try 
EDITing a few lines yourself. Commands not recognized as part of 
the EDIT commands will be ignored. 
MOVING THE CURSOR 
A space typed in will move the cursor to the right and cause the character 
passed over to be printed out. A number preceding the space (nS) will 
cause the cursor to pass over and print out the number (n) df characters 
chosen. 
INSERTING CHARACTERS 
I Inserts new characters into the Hne being edited. After the 
I is typed, each character typed in will be inserted at the 
current cursor position and typed on the terminal. To stop 
inserting characters, type "escape" (or Alt-<-mode on some ter-
minals). 
If an attempt is made to insert a character that will make 
the Hne longer than the maximum allowed (72 characters), 
a bell will be typed (control G) on the terminal and the 
character will not be inserted. 
WARNING: It is possible using EDIT to create a Hne which, 
when listed with its Hne number, is longer than 
72 characters. Punched paper tapes containing such 
lines will not be read in properly. However, such 
lines may be CSAVEd and CLOADed without error. 

A backarrow (or underline) typed during an insert command will 
delete the character to the left of the cursor. Characters 
up to the beginning of the line may be deleted in this manner, 
and a backarrow will be echoed for each character deleted. 
However, if no characters exist to the left of the cursor, a 
bell 1s echoed instead of a backarrow. 
If a carriage return is typed during an insert command, it 
will be as if an escape and then carriage return was typed. 
That is, all characters to the right of the cursor will be 
printed and the EDITed line will replace the original line. 
X is the same as I, except that all characters to the right 
of the cursor are printed, and the cursor moves to the end 
of the line. At this point it will automatically enter the 
insert mode (see I command). 
X is very useful when you wish to add a new statement to the 
end of an existing line. For example: 
Typed by User EDIT 50 (carriage return) 
Typed by ALTAIR 50 X=X+1:Y=Y+1 
Typed by User X :Y=Y+1 (carriage return) 
In the above example, the original line #50 was: 
50 X=X+1 
The new EDITed line #50 will now read: 
50 X=X+1:Y=Y+1 
H is the same as I, except that all characters to the right 
of the cursor are deleted (they will not be typed). The insert 
mode (see I command) will then automatically be entered. 
H is most useful when you wish to replace the last statements 
on a line with new ones. 
DELETING CHARACTERS 
nD deletes n number of characters to the right of the cursor. If 
less than n characters exist to the right of the cursor, only that 
many characters will be deleted. The cursor is positive to the 
right of the last character deleted. The characters deleted are 
enclosed in backslashes (\). For example: 
Typed by User 20 X=X+1:REM JUST INCREMENT X 
Typed by User EDIT 20 (carriage return) 
Typed by ALTAIR 20 \X=X+1:\REM JUST INCREMENT X 
Typed by User 6D (carriage return) 
The new line #20 will no longer contain the characters which 
are enclosed by the backslashes. 

SEARCHING 
S The nSy command searches for the n^ occurance of the character 
y in the Hne. The search begins at the character one to the 
right of the cursor. All characters passed over during the 
search are printed. If the character is not found, the cursor 
will be at the end of the Hne. If it is found, the cursor will 
stop at that point and all of the characters to its left will 
have been printed. 
For example: 
Typed by User 50 REM INCREMENT X 
Typed by User EDIT 50 
Typed by ALTAIR 50 REM INCR 
Typed by User 2SE 
nt^y is equivalent to S, except that all of the characters 
passed over during the search are deleted. The deleted char-
acters are enclosed in backslashes. For example: 
Typed by User 10 TEST LINE 
Typed by User EDIT 10 
Typed by ALTAIR 10 \TEST\ 
Typed by User KL 
TEXT REPLACEMENT 
C A character in a Hne may be changed by the use of the C command. 
Cy, where y is some character, will change the character to the 
right of the cursor to y. The y will be typed on the terminal 
and the cursor will be advanced one position. nCy may be used 
to change n number of characters in a Hne as they are typed in 
from the terminal. (See example below.) 
If an attempt is made to change a character which does net exist, 
the change mode will be exited. 
Example: 
Typed by User 10 FOR 1=1 TO 100 
Typed by User EDIT 10 
Typed by ALTAIR 10 FOR 1=1 TO 256 
Typed by User 2S1 3C256 
ENDING AND RESTARTING 
Carriage Return Tells the computer to finish editing and print the re-
mainder of the Hne. The edited Hne replaces the original 
Hne. 
E E is the same as a carriage return, except the remainder 
of the Hne is not printed. 
90 

Q Quit. Changes to a line do not take effect until an E 
or carriage return is typed. Q allows the user to restore 
the original line without any changes which may have been 
made, if an E or carriage return has not yet been typed. 
"OK" will be typed and BASIC will await further commands. 
L Causes the remainder of the line to be printed, and then 
prints the line number and restarts EDITing at the beginning 
of the line. The cursor will be positioned to the left of the 
first character in the line. 
L is most useful when you wish to see how the changes in a line 
look so that you can decide if further EDITs are necessary. 
Example: 
Typed by User EDIT 50 
Typed by ALTAIR 50 REM INCREMENT X 
Typed by User 2SM L 
Typed by ALTAIR 50 
Causes the original copy of the line to be restored, and EDITing 
to be restarted at the beginning of the line. For example: 
Typed by User 10 TEST LINE 
Typed by User EDIT 10 
Typed by ALTAIR 10 \TEST LINE\ 
Typed by User 10D A 
Typed by ALTAIR 10 
In the above example, the user made a mistake when he deleted 
TEST LINE. Suppose that he wants to type "ID" instead of "10D" 
By using A command, the original line 10 is reentered and is 
ready for further EDITing. 
IMPORTANT 
Whenever a SYNTAX ERROR is discovered during the execution of a source 
program, BASIC will automatically begin EDITing the line that caused the 
error as if an EDIT command had been typed. For Example: 
10 APPLE 
RUN 
SYNTAX ERROR IN 10 
10 
Complete editing of a line causes the line edited to be re-inserted. 
Re-inserting a line causes all variable values to be deleted, therefore 
you may want to exit the EDIT command without correcting the line so that 
you can examine the variable values. 
This can be easily accomplished by typing the Q command while in the EDIT 
mode. If this is done, BASIC will type OK and all variable values will 
be preserved. 
91 

PRINT USING 
The PRINT USING statement can be employed in situations where a specific 
output format is desired. This situation might be encountered in such 
applications as printing payroll checks or an accounting report. Other 
uses for this statement will become more apparent as you go through the 
text. 
The general format for the PRINT USING statement is as follows: 
(line number) PRINT USING <string>; <value list> 
The "string" may be either a string variable, string expression or a string 
constant which is a precise copy of the line to be printed. All of the char-
acters in the string will be printed just as they appear, with the exception 
of the formatting characters. The "value list" is a list of the items to 
be printed. The string will be repeatedly scanned until: 1) the string ends 
and there are no values in the value list 2) a field is scanned in the string, 
but the value list is exhausted. 
The string should be constructed according to the following rules: 
STRING FIELDS 
! Specifies a single character string field. (The string itself 
is specified in the value list.) 
\n spaces\ Specifies a string field consisting of 2+n characters. Backslashes 
with no spaces between them would indicate a field of 2 characters 
width, one space between them would indicate a field 3 characters 
in width, etc. 
In both cases above, if the string has more characters than the field width, 
the extra characters will be ignored. If the string has less characters 
than the field width, extra spaces will be printed to fill out the entire 
field. 
Trying to print a number in a string field will cause a TYPE MISMATCH error 
to occur. 
Example: 10 A$="ABCDE":B$="FGH" 
20 PRINT USING "!";A$,B$ 
30 PRINT USING "\ \";B$,A$ 
(the above would print out) 
AF 
FGHABCD 
Note that where the "!" was used only the first letter of each string was printed. 
Where the backslashes were enclosed by two spaces, four letters from each string 
were printed (an extra space was printed for B$ which has only three characters). 
The extra characters in the first case and for A$ in the second case were ignored. 
92 

NUMERIC FIELDS 
With the PRINT USING statement, numeric prin-outs may be altered to suit almost 
any applications which may be found necessary. This should be done according 
to the following rules: 
# Numeric fields are specified by the # sign, each of which will 
represent a digit position. These digit positions are always 
filled. The numeric field will be right justified; that is, 
if the number printed is too small to fill all of the digit 
positions specified, leading spaces will be printed as necessary 
to fill the entire field. 
The decimal point position may be specified in any particular 
arrangement as desired; rounding is performed as necessary. 
If the field format specifies a digit is to precede the decimal 
point, that digit will always be printed (as 0 if necessary). 
The following program will help illustrate these rules: 
10 INPUT A$,A 
20 PRINT USING A$;A 
30 GOTO 10 
RUN 
? ##,12 
IE 
? ###,12 
IB 
? #####,12 
IB 
?##.##,12 
IB. 00 
? ###.,12 
IB. 
? #.###,.02 
O-OEO 
? ##.#,2.36 
E-4 
t This sign may be used at either the beginning or end of the 
numeric field, and will force the + sign to be printed at 
either end of the field as specified, if the number is positive. 
If it is used at the end of the field, and the number is negative, 
a -sign will be forced at the end of the number. 
The - sign when used at the end of the numeric field designation 
will force the sign to be printed trailing the number, If it is 
negative. If the number 1s positive, a space is printed. 
NOTE: There are cases where forcing the sign of a number to 
be printed on the trailing side will free an extra space 
for leading digits. (See exponential format.) 
93 

** The ** placed at the beginning of a numeric field designation will 
cause any unused spaces in the leading portion of the number 
printed out to be filled with asterisks. The ** also specifies 
positions for 2 more digits. (Termed "asterisk fill") 
$$ When the $$ is used at the beginning of a numeric field designation, 
a $ sign will be printed in the space immediately preceding the 
number printed. Note that the $$ also specifies positions for 
two more digits, but the $ itself takes up one of these spaces. 
Exponential format cannot be used leading $ signs, nor can nega-
tive numbers be output unless the sign is forced to be trailing. 
**$ The **$ used at the beginning of a numeric field designation 
causes both of the above (** & $$) to be performed on the number 
being printed out. All of the previous conditions apply, except 
that **$ allows for 3 additional digit positions, one of which is 
the $ sign. 
, A comma appearing to the left of the decimal point in a numeric 
field designation will cause a comma to be printed every three 
digits to the left of the decimal point in the number being 
printed out. The comma also specifies another digit position. 
A comma to the right of the decimal point in a numeric field de-
signation is considered a part of the string itself and will be 
treated as a printing character. 
tTTT Exponential Format. If the exponential format of a number is 
desired in the print out, the numeric field designation should 
be followed by tTTT (allows space for E±XX). As with the other 
formats, any decimal point arrangement is allowed. In this case, 
the significant digits are left justified and the exponent is 
adjusted. 
% If the number to be printed out is larger than the specified numeric 
field, a % character will be printed and then the number itself 
in its standard format. (The user will see the entire number.) 
If rounding a number causes it to exceed the specified field, 
the % character will be printed followed by the rounded number. 
(Such as field= .##, and the number is .999 will print % 1.00.) 
If the number of digits specified exceeds 24, a FUNCTION CALL error will occur. 
Try going through the following examples to help illustrate the preceding 
rules. A single program such as follows is the easiest method for learning 
PRINT USING. 

Examples: Type the short program into your machine as it is 
listed below. This program will keep looping and 
allow you to experiment with PRINT USING as you 
go along. 
Program:  10 INPUT A$,A 
20 PRINT USING A$;A 
30 GOTO 10 
RUN 
The computer will start by typing a ?. Fill in the numeric 
field designator and value list as desired, or follow along 
below. 
?+#,9 
+T 
?+#,io 
X+10 
?##,-2 
-B 
?+#,-2 
-3 
?#,-2 
X-3 
?+.###,.02 
+ .030 
? ####.#,100 
100.0 
?##+,2 
3+ 
? THIS IS A NUMBER ##,2 
THIS IS A NUMBER 3 
? BEFORE ## AFTER,12 
BEFORE 13 AFTER 
? ####,44444 
xnnmm 
?**##,i 
? **##,12 
**1B 
? **##,123 
*1B3 
? **##,1234 
1334 
? **##,12345 
X13345 
?**,1 
*1 
?**,22 
33 
? **.##,12 
13-00 
? **####,l 
****m 
95 

(note: not floating $) 
(note: floating $) 
? $####.##,12.34 
3 IE.34 
? $$####.##,12.56 
eiB.sb 
? $$.##,1.23 
31. E3 
? $$.##,12.34 
X31E-34 
? $$###,0.23 
30 
? $$####.##,0 
30-00 
? **$###.##,1.23 
****31.E3 
? **$.##,1.23 
*31.E3 
?**$###,l 
****$! 
?#,6.9 
7 
?#.#,6.99 
7.0 
?##-,2 
B 
? ##-,-2 
E-
?##+,2 
E+ 
? ##+,-2 
E-
? ##tttt,2 
BE+00 
? ##tttt,12 
1E+01 
? #####.###TTtT,2.45678 
B45b.?a0E-03 
? #.###tttt,123 
0.1E3E+03 
? #.##tttt,-123 
--1EE+03 
? #####,###.#,1234567.89 
lnE34nS!3?.T 
96 

APPENDIX A SUPPLEMENT 
HOW TO LOAD BASIC 
For BASIC versions 3.2 and later, the load procedure has been updated to 
allow the use of the new I/O boards (2SI0 & 4PI0), the old 88-PIO board, 
and more general channel assignments. 
Location 001 of the bootstrap loaders listed in APPENDIX A must be changed 
from 175 to 256 to load BASIC versions 3.2 and later. For the older ver-
sions of BASIC, the location should be left at 175. 
For EXTENDED BASIC, location 002 (set at 017 for 4K & 037 for 8K) should 
be set at 057. 
The checksum loader has a new error message "M" which indicates that the 
data that was loaded into memory did not read back properly (see step 22 
on page 50 of APPENDIX A). Loading into non-existent, protected or mal-
functioning memory can cause this to occur. The new error message will 
also be sent repeatedly, instead of only once. The message is sent on 
channels 1, 21 and 23; so, if no terminal device is on one of these three 
channels, the panel lights must be examined to see if a checksum error has 
occured. 
Error Detection 
The new checksum loader (BASIC versions 3.2 & later) will display X7647 
on the address lights when running properly. (X above will be 0 for 4K 
BASIC, 1 for 8K or 2 for EXTENDED.) 
When an error occurs (checksum "C"-bad tape data, memory "M"-data won't 
store properly, overlay "0"-attempt to load over top of the checksum 
loader) the address lights will then display X7637. The ASCII error 
code will be stored in the accumulator (A). 
More simply, A5 should be on with A4 & A3 off during proper loading. 
When an error occurs, A5 will turn off and A4 & A3 will turn on. 
Load Options 
OCTAL STATUS BITS 
LOAD DEVICE SWITCHES UP CHANNELS ACTIVE 
SIOA,B,C (not REV 0) none 0,1 low 
ACR Al5(and 6,7 low 
terminal opts) 
SIOA,B,C (REV 0) A14 0,1 high 
OCTAL 
MASKS 
1/200 
1/200 
40/2 
88-PIO A13 0,1 high 2/1 
4PIO A12 20,21 high 100/100 
2SIO All(andA10 20,21 high 1/2 
up=lstop bit 
down=2 stop bits) ay 

There are six different bootstrap loaders, one for each of the six types 
of I/O boards listed in the Load Option chart. Be sure that you use the 
correct one for your particular board. 
If the load device is an ACR, the Terminal Options (see second chart) 
can be set in the switches (along with A15) before the loading is done. 
If A15 is set, the checksum loader will ignore all of the other switches 
and BASIC will ignore A15. 
If the load device and the terminal device are not the same, and the load 
device is not an ACR, then only the load options should be set before the 
loading. When the load completes, BASIC will start-up and try to send a 
message to the load device. STOP BASIC, EXAMINE LOCATION 0, SET THE TER-
MINAL OPTION SWITCHES, AND THEN DEPRESS RUN. 
If the initialization dialog hasn't completed, everytime BASIC is restarted 
at zero, it will examine the sense switches and reconfigure the terminal 
input/output options. Once the initialization dialog is complete, the 
sense switches are no longer examined and the I/O configuration is fixed 
until BASIC is reloaded. 
Terminal Options 
TERMINAL DEVICE 
SIOA,B,C (not REV 0) 
SIOA,B,C(REVO) 
88-PIO 
4PIO 
2SIO 
SWITCHES UP 
none 
A14 
A13 
A12 
All 
OCTAL CHANNEL DEFAULT 
0,1 
0,1 
0,1 
20,21 (INPUT) 
22,23 (OUTPUT) 
20,21 (A10 up=l stop bit 
down=2 stop bits) 
The default channels listed above may be changed as desired by raising 
A8 and storing the lowest channel number (Input flag channel) in one 
of the following locations: 7777 (octal) for 4K BASIC 
17777 (octal) for 8K BASIC 
27777 (octal) for EXTENDED BASIC 
(non-disk version) 
NOTE: The "Input flag channel" may also be refered to as the "control 
channel" in other ALTAIR documentation. 
The above information is useful only when the load device and terminal 
device are not the same. During the load procedure A8 will be ignored; 
therefore, the board from which BASIC is loaded must be strapped for the 
channels listed in the Load Option chart. 
The following page contains three new bootstrap loaders for the 88-PIO, 
4PIO and 2SIO boards. The conditions for using the other loaders listed 
in APPENDIX A are given at the beginning of this supplement. 
98 

88-PIO (for versions 3.2 & later only) 
OCTAL ADDRESS OCTAL CODE 
000 041 
001 256 
002 017 (for 4K, 037 for 8K, 057 for EXTENDED) 
003 061 
004 023 
005 000 
Q06 333 
007 000 
010 346 NOTE: Switch A13 should be up; 
011 040 88-PIO should be strapped 
012 310 for channels 0,1. 
013 333 
014 001 
015 275 
016 310 
017 055 
020 167 
021 300 
022 351 
023 003 
024 000 
2SIO (for 
versions 3.2 & later only) 
OCTAL ADDRESS OCTAL CODE  OCTAL ADDRESS OCTAL CODE 
000  076  030 300 
001  003  031 351 
002  323  032 013 
003  020  033 000 
004  076 
005  021  (=2 stop bits 
006  323  025 
=1 stop bit) 
007  020 
010  041 
011  256 
012  017  (for 4K, 037 for 8K, 057 for EXTENDED) 
013  061 
014  032 
015  000  NOTE: Switch All should be up; 
016  333  If the 2SIO also is the 
017  020  terminal device, set A10 
020  017  up for 1 stop bit or down 
021  320  for 2 stop bits. The 2SIO 
022  333  should be strapped for 
023  021  channels 20,21. 
024  275 
025  310 
026  055 
027  167 

4PI0 (for versions 3.2 & later only) 
OCTAL ADDRESS OCTAL CODE 
000 257 
001 323 
002 020 
003 000 
004 323 
005 021 
006 076 
007 004 
010 323 
011 020 
012 041 
013 256 
014 017 (for 4K, 037 for 8K, 057 for EXTENDED) 
015 061 
016 035 
017 000 
020 333 NOTE: Switch A12 should be up. 
021 020 
022 346 
023 100 
024 310 
025 333 
026 021 
027 275 
030 310 
031 055 
032 167 
033 300 
034 351 
035 015 
036 000 
The following three programs are echo programs for the 88-PIO, the 4PIO 
and the 2SI0 boards. 
If you wish to test a device that does Input only, dump the echoed 
characters on a faster device or store them in memory for examination. 
For an Output only device, send the data in the sense switches or some 
constant for the test character. Make sure to check the ready-to-receive 
bit before doing output. 
If the echo program works, but BASIC doesn't; make sure the load device's 
UART is strapped for 8 data bits and that the ready-to-receive flag gets 
set properly on the terminal device. 
100 

ECHO PROGRAMS: 
88-PIO 
OCTAL ADDRESS OCTAL CODE OCTAL ADDRESS OCTAL CODE 
000 333 007 333 
001 000 010 001 
002 346 Oil 323 
003 040 012 001 
OM 312 013 303 
005 000 014 000 
006 000 015 000 
2SIO 
OCTAL ADDRESS 
000 
001 
002 
003 
004 
005 
006 
007 
010 
011 
012 
OCTAL CODE 
076 
003 
323 
020 (flag ch.) 
076 
021(lst. bt., 
323 025 for 2) 
020 
333 
020 
017 
OCTAL ADDRESS 
013 
014 
015 
016 
017 
020 
021 
022 
023 
024 
OCTAL CODE 
322 
010 
000 
333 
021 (data ch.) 
323 
021 
303 
010 
000 
4PIO 
OCTAL ADDRESS OCTAL CODE OCTAL ADDRESS OCTAL CODE 
000  257  024  312 
001  323  025  020 
002  020  026  000 
003  323  027  333 
004  021  030  022 
005  323  031  346 
006  022  032  100 
007  057  033  312 
010  323  034  027 
Oil  023  035  000 
012  076  036  333 
013  OM  037  021 
014  323  040  323 
015  020  041  023 
016  323  042  303 
017  022  043  020 
020  333  044  000 
021  020 
022  346 
023  100  101 

u 
24SO Alamo SB 
Albuquerque, NM 87106 
! 

88-4MCS 
PARTS LIST 
.APRIL, 1976 
2 741300  101069  5  6-32 x 3/8" Screw  100925 
1 74LS04  101042  1  #6-32 Nut  100933 
3 74LS13  101124  1  #6 Lock Washer  100942 
2 74LS14  101123  1  Heat Sink (Large)  101870 
2 74367  101040  2  Ferrite Beads  101876 
1 7805  101074 
BAG  7 
BAG 2  34  16 Pin Socket  102103 
32 2102A-4  101107  8  14 Pin Socket  102102 
1  Dip Switch (4-SPDT)  102321 
2  Card Guides  101714 
BAG 3  1  100 Pin Connector  101864 
42 .IMF 12-16V  100348  MISC. 
BAG 4  1  P.C. Board  1O0187 
1  4MCS Manual  101533 
2 .01MF 16V-1KV  100321 
1 IMF 20V  100325 
3 33MF 16V  100326 
BAG 5 
1 4 Ohm 3W 10%  102007 
32 2102A-4  101107 
BAG 3 
42 .IMF 12-16V  100348 
BAG 4 
2 .01MF 16V-1KV 100321 
1 IMF 20V 100325 
3 33MF 16V 100326 
BAG 5 
1 4 Ohm 5W 10% 102007 
2 100 0hm.%WlQ% 101924 
2 2.2K %W 10% 101945 
BAG 6 
5 6-32 x 3/8" Screw 
1 #6-32 Nut 
1 #6 Lock Washer 
1 Heat Sink (Large) 
2 Ferrite Beads 
100925 
100933 
100942 
101870 
101876 
BAG 7 
34 16 Pin Socket 
8 14 Pin Socket 
1 Dip Switch (4-SPDT) 
2 Card Guides 
1 100 Pin Connector 
102103 
102102 
102321 
101714 
101864 
MISC. 
P.C. Board 
4MCS Manual  1O0187 
101533