Fabasicm_new FA BASIC M Fabasicm

User Manual: FA-BASIC-M Online ation - AutomationDirect

Open the PDF directly: View PDF PDF.
Page Count: 181

DownloadFabasicm_new FA-BASIC-M Fabasicm
Open PDF In BrowserView PDF
AutomationDirect.com

FACTS Extended BASIC
Reference Manual

Manual Order Number: FA-BASIC-M

TRADEMARKS
Automationdirect.com is a Trademark of Automationdirect.com
CoProcessor is a Trademark of FACTS Engineering, Inc.

COPYRIGHT

Copyright 2004, FACTS Engineering Inc., 8049 Photonics Dr., New Port Richey, Florida,
34655. World rights reserved.

Last Issued Date: August 1999
Current Issued Date: March 2006

WARNING
Thank you for purchasing automation equipment from FACTS Engineering. We want your
new FACTS Engineering automation equipment to operate safely. Anyone who installs or
uses this equipment should read this publication (and any other relevant publications)
before installing or operating the equipment.
To minimize the risk of potential safety problems, you should follow all applicable local and
national codes that regulate the installation and operation of your equipment. These codes
vary from area to area and usually change with time. It is your responsibility to determine
which codes should be followed, and to verify that the equipment, installation, and
operation is in compliance with the latest revision of these codes.
At a minimum, you should follow all applicable sections of the National Fire Code, National
Electrical Code, and the codes of the National Electrical Manufacturers Association
(NEMA). There may be local regulatory or government offices that can help determine
which codes and standards are necessary for safe installation and operation.
Equipment damage or serious injury to personnel can result from the failure to follow all
applicable codes and standards. We do not guarantee the products described in this
publication are suitable for your particular application, nor do we assume any responsibility
for your product design, installation, or operation.
If you have any questions concerning the installation or operation of this equipment, or if
you need additional information, please call us at 1-800-783-3225.
This document is based on information available at the time of its publication. While efforts
have been made to be accurate, the information contained herein does not purport to cover
all details or variations in hardware and software, nor to provide for every possible
contingency in connection with installation, operation, and maintenance. Features may be
described herein which are not present in all hardware and software systems. FACTS
Engineering assumes no obligation of notice to holders of this document with respect to
changes subsequently made. FACTS Engineering retains the
right to make changes to hardware and software at any time, without notice. FACTS
Engineering makes no representation or warranty, expressed, implied, or statutory with
respect to, and assumes no responsibility for the accuracy, completeness, sufficiency, or
usefulness of the information contained herein. No warranties of merchantability of fitness
for purpose shall apply.

MANUAL HISTORY
Refer to this history in all correspondence and/or discussion of this manual.
Title: FACTS Extended BASIC Reference Manual
Part Number FA-BASIC-M
Issue / Date
August 1999
March 2006

Effective
Pages
1.1
2.1
2.2
3.3
3.11
4.9
4.20
4.21
4.24
4.26
4.31
4.44
4.45
4.46
4.49
4.65
4.70
4.72
4.73
4.83
4.86
4.90
4.98
4.99
4.110
6.2
C.2
D.1

Description of Changes
Last Released Version
Added 205 and 05/06 CoProcessors
Added reference to F0-CP-M
Added reference to 05/06 CoPro under ‘RESET’
Change note on mode 3 to bold
Typo fix under ‘Usage’
Added “Not Recommended for New Applications”
Changed wording under 2nd paragraph under ‘Usage’
Added “Not Recommended for New Applications”
Corrected spacing
Removed reference to “(pin 5)” under ‘Example’
Added “Automation Direct’s DirectNet” in example description
Changed description of port number under ‘Usage’ to be more generic
Added new sentence under ‘Usage’
Added statements under ‘See also’
Removed extra CR/LF
Changed line 20 to “ON I-1…”
Added commas in line 10 and 30
Added “to a” in first sentence under ‘Usage’
Added P3. under shorthand
Added page number for SETPORT in third paragraph under ‘Usage’
Added statement under ‘See also’
Added note that AAR is only available on port 1
Corrected page number reference for DSR/DTR in next to last paragraph
Corrected spacing
Added calculation for number of strings from a given STRING statement
Added some more STRING statement examples
Under ‘Usage’ changed third word from ‘command’ to ‘statement’
Under ‘Usage’ added paragraph about a hex string expression
Corrected EQUAL TO operator
Corrected ASCII table – ‘O’ was missing
Changed text to indicate the ‘Typical Execution Times’ are for a specific
module

TABLE OF CONTENTS
CHAPTER 1 : INTRODUCTION ...............................................................................................1.1
PURPOSE OF THIS DOCUMENT ..............................................................................1.1
FACTS BASIC MODULE TYPES................................................................................1.1
CHAPTER 2 : GETTING STARTED WITH FACTS EXTENDED BASIC ...........................2.1
MINIMUM READING REQUIREMENT.........................................................................2.1
FIRST TIME USERS ......................................................................................................2.1
OPERATING MODES ...................................................................................................2.1
RESET ............................................................................................................................2.2
GENERAL MEMORY USAGE .....................................................................................2.2
Data Memory......................................................................................................2.3
Program Memory ...............................................................................................2.3
DEFINITION OF TERMS ...............................................................................................2.4
Commands .........................................................................................................2.4
Statements..........................................................................................................2.5
Program Lines....................................................................................................2.5
Floating Point Numbers.....................................................................................2.6
Integer Numbers .................................................................................................2.6
Operators ............................................................................................................2.7
Variables.............................................................................................................2.7
Expressions ........................................................................................................2.9
CHAPTER 3 : SYSTEM COMMANDS....................................................................................3.1
AUTOLN..........................................................................................................................3.2
AUTOSTART ..................................................................................................................3.3
AUTOSTART Reset Mode Table .....................................................................3.3
Retaining Variables in the Absence of Power ................................................3.5
COMMAND@.................................................................................................................3.6
CONT...............................................................................................................................3.7
DELPRM.........................................................................................................................3.8
EDIT.................................................................................................................................3.9
ERASE..........................................................................................................................3.10
LIST................................................................................................................................3.11
NEW ..............................................................................................................................3.12
PROGRAM or PRM .....................................................................................................3.13
RENUMBER.................................................................................................................3.14
RESET ..........................................................................................................................3.15
RUN ...............................................................................................................................3.16
SAVE.............................................................................................................................3.17
CHAPTER 4 : STATEMENTS ..................................................................................................4.1
ABS - Mathematical Operator ......................................................................................4.2
ASC - String Operator ...................................................................................................4.3
ATN - Mathematical Operator.......................................................................................4.4
BIT and BITS - Input/Output ...........................................................................................4.5

BREAK - Flow Control...................................................................................................4.6
BYTE - Advanced Operator ..........................................................................................4.7
CALL - Advanced Operator ..........................................................................................4.8
CBY - Advanced Operator – Not Recommended for New Applications..................4.9
CHR$ - String Operator...............................................................................................4.10
CLEAR - Flow Control.................................................................................................4.11
CLEAR I - Interrupts .....................................................................................................4.12
CLEAR S - Flow Control .............................................................................................4.13
COMERR - Advanced Operator.................................................................................4.14
COPY - Memory Management....................................................................................4.15
COS - Mathematical Operator....................................................................................4.17
CR - Input/Output ..........................................................................................................4.18
DATA - Input/Output .....................................................................................................4.19
DATE$ - String Operator.............................................................................................4.20
DBY - Advanced Operator – Not Recommended for New Applications................4.21
DELAY - Miscellaneous...............................................................................................4.22
DIM - Memory Management........................................................................................4.23
DO-UNTIL - Flow Control.............................................................................................4.24
DO-WHILE - Flow Control...........................................................................................4.25
DSR - Miscellaneous ...................................................................................................4.26
DTR - Miscellaneous....................................................................................................4.27
END - Flow Control......................................................................................................4.28
ERRCHK - Miscellaneous ...........................................................................................4.29
EXP - Mathematical Operator ....................................................................................4.33
FOR-TO-STEP-NEXT - Flow Control ........................................................................4.34
GO_PROGRAM or GOPRM - Flow Control..............................................................4.35
GOSUB - Flow Control ................................................................................................4.37
GOTO - Flow Control ...................................................................................................4.39
HEX$ - String Operator ...............................................................................................4.40
IDLE - Interrupts............................................................................................................4.41
IF-THEN-ELSE - Flow Control....................................................................................4.42
INKEY$ - String Operator ............................................................................................4.43
INLEN - Input/Output.....................................................................................................4.44
INPLEN - Input/Output..................................................................................................4.45
INPUT - Input/Output.....................................................................................................4.46
Input Error Handling..........................................................................................4.47
Non-Standard ASCII Character Input .............................................................4.48
Special Case of Control Character Input.......................................................4.49
INSTR - String Operator ..............................................................................................4.50
INT - Mathematical Operator.......................................................................................4.51
LCASE$ - String Operator..........................................................................................4.52
LEFT$ - String Operator..............................................................................................4.53
LEN - String Operator..................................................................................................4.54
LET - Miscellaneous ....................................................................................................4.55
LOAD@ or LD@ - Advanced Operator.....................................................................4.56

LOCKOUT - Flow Control............................................................................................4.58
LOF - Memory Management.......................................................................................4.59
LOG - Mathematical Operator ....................................................................................4.60
MID$ - String Operator ................................................................................................4.61
MTOP - Advanced Operator .......................................................................................4.62
OCTHEX$ - String Operator.......................................................................................4.63
ON-GOSUB - Flow Control .........................................................................................4.64
ON-GOTO - Flow Control ............................................................................................4.65
ONERR - Flow Control.................................................................................................4.66
ONPORT - Interrupt......................................................................................................4.67
ONTIME - Interrupt........................................................................................................4.68
Interrupt Priority - ONPORT and ONTIME......................................................4.69
PH0. and PH1. - Input/Output......................................................................................4.70
PICK - Input/Output.......................................................................................................4.71
POP - Advanced Operator..........................................................................................4.72
PRINT - Input/Output.....................................................................................................4.73
PUSH - Advanced Operator .......................................................................................4.74
READ - Input/Output.....................................................................................................4.75
REM - Miscellaneous ...................................................................................................4.76
RESTORE - Input/Output.............................................................................................4.77
RETI - Interrupt..............................................................................................................4.78
RETURN - Flow Control...............................................................................................4.79
REVERSE$ - String Operator ....................................................................................4.80
RIGHT$ - String Operator............................................................................................4.81
RND - Mathematical Operator ....................................................................................4.82
SETINPUT - Input/Output.............................................................................................4.83
SETPORT - Input/Output..............................................................................................4.85
Software Handshaking ....................................................................................4.87
Hardware Bi-directional CTS/RTS Handshaking .........................................4.87
Uni-directional CTS Hardware Flow Control.................................................4.87
No Handshaking ...............................................................................................4.87
SGN - Mathematical Operator ....................................................................................4.91
SIN - Mathematical Operator ......................................................................................4.92
SPC - Input/Output........................................................................................................4.93
SQR - Mathematical Operator ....................................................................................4.94
STOP - Flow Control....................................................................................................4.95
STORE@ or ST@ - Advanced Operator ..................................................................4.96
STR$ - String Operator................................................................................................4.97
STRING - Memory Management ................................................................................4.98
SYSTEM - Miscellaneous............................................................................................4.99
TAB - Input/Output ..................................................................................................... 4.100
TAN - Mathematical Operator.................................................................................. 4.101
TIME - Interrupt........................................................................................................... 4.102
TIME$ - String Operator ........................................................................................... 4.103
TRACE - Debug ........................................................................................................ 4.104

UCASE$ - String Operator ...................................................................................... 4.106
USING - Input/Output................................................................................................. 4.107
Formatting Numbers ..................................................................................... 4.108
Formatting Exponential Numbers................................................................ 4.108
Formatting Strings......................................................................................... 4.109
VAL - String Operator............................................................................................... 4.110
WORD - Advanced Operator................................................................................... 4.111
@(line, column) - Input/Output .................................................................................. 4.112
CHAPTER 5 : MATHEMATICAL OPERATORS ....................................................................5.1
Table of Dyadic Mathematical Operators....................................................................5.1
CHAPTER 6 : LOGICAL AND RELATIONAL OPERATORS ...............................................6.1
LOGICAL OPERATORS ...............................................................................................6.1
Table of Logical Operators ...............................................................................6.1
Logical Operators Truth Tables ........................................................................6.1
RELATIONAL OPERATORS........................................................................................6.2
Table of Relational Operators...........................................................................6.2
CHAPTER 7 : ERROR MESSAGES.......................................................................................7.1
ARGUMENT STACK OVERFLOW .............................................................................7.1
ARITHMETIC OVERFLOW...........................................................................................7.1
ARITHMETIC UNDERFLOW........................................................................................7.1
ARRAY SIZE - SUBSCRIPT OUT OF RANGE...........................................................7.2
BAD ARGUMENT..........................................................................................................7.2
BAD SYNTAX.................................................................................................................7.2
CAN'T CONTINUE .........................................................................................................7.2
CONTROL STACK OVERFLOW ................................................................................7.2
CORRUPTED PROGRAM ENCOUNTERED............................................................7.3
DIVIDE BY ZERO...........................................................................................................7.3
EXPRESSION TOO COMPLEX..................................................................................7.3
INVALID LINE NUMBER...............................................................................................7.3
MEMORY ALLOCATION...............................................................................................7.3
NO DATA ........................................................................................................................7.3
NOT ENOUGH FREE SPACE.....................................................................................7.4
PROGRAM ACCESS ...................................................................................................7.4
STRING TOO LONG......................................................................................................7.4
UNABLE TO VERIFY.....................................................................................................7.4
CHAPTER 8 : ADVANCED......................................................................................................8.1
FLOATING POINT STORAGE FORMAT....................................................................8.1
NON-DIMENSIONED VARIABLE STORAGE FORMAT..........................................8.2
DIMENSIONED VARIABLE STORAGE FORMAT....................................................8.3
STRING VARIABLE STORAGE FORMAT.................................................................8.4
COMMUNICATIONS WITH AUTOMATIC CRC-16....................................................8.5
CRC Operation...................................................................................................8.5
Transmitting with CRC .......................................................................................8.5
Receiving with CRC ...........................................................................................8.5
Initial Remainder.................................................................................................8.5

Examining the CRC-16 Characters .................................................................8.6
CRC Demo Program.........................................................................................8.6
APPENDIX A : STACKING THE DECK ................................................................................ A.1
PLACING THE BASIC MODULE INTO SERVICE ................................................... A.1
APPENDIX B : RESERVED WORDS ................................................................................... B.3
Reserved Words ........................................................................................................... B.3
APPENDIX C : ASCII TABLES...............................................................................................C.1
CONTROL CHARACTER TABLE ..............................................................................C.1
ASCII CONVERSION TABLE......................................................................................C.2
APPENDIX D : BASIC PROGRAM EXECUTION SPEED .................................................D.1
TIPS FOR SPEEDING UP YOUR PROGRAMS .......................................................D.2
APPENDIX E : SUMMARY OF STATEMENTS AND OPERATORS................................. E.1
Commands .................................................................................................................... E.1
Flow Control................................................................................................................... E.1
Input/Output .................................................................................................................... E.2
Interrupts......................................................................................................................... E.2
Mathematical Operators............................................................................................... E.2
Memory Management................................................................................................... E.3
Miscellaneous ................................................................................................................ E.3
String Operators............................................................................................................ E.3
Advanced ....................................................................................................................... E.3

CHAPTER 1 : INTRODUCTION
PURPOSE OF THIS DOCUMENT
This document describes the FACTS Extended BASIC interpreter that is used in FACTS Engineering BASIC
module products. This document is intended to be used in conjunction with the user's manual specific to
the module that has been purchased. This manual describes the commands, statements, and general
information about the interpreter. Information that is specific to a particular module such as module
specifications, port pinouts, and module specific instructions are documented in that module's user's
manual.
This manual contains numerous programming and application examples, however, it is assumed that the
user has some BASIC or other higher level language programming experience. This is not a "How to Write
BASIC/Ladder Logic Program" manual.

FACTS BASIC MODULE TYPES
There are five categories of FACTS Engineering BASIC modules, they are:
- 305 BASIC Modules
- 305 CPU BASIC Modules
- 405 CoProcessor Modules
- 205 CoProcessor Modules
- 05/06 CoProcessor Modules
305 BASIC Modules are placed in an I/O slot of a DL305 base. These modules communicate with the
DL305 PLC CPU via the TRANSFER instruction in the BASIC module and ladder logic in the CPU.
Hardware and software features unique to these modules are described in the 305 BASIC Modules manual,
F3-AB-M.
305 CPU BASIC Modules are placed in the CPU slot of a DL305 base. These modules have special
instructions to read and write the I/O modules in the DL305 base such as STATUSIO, ACTIVATE, and
DEACTIVATE. Hardware and software features unique to these modules are described in the 305
Programmable CPU manual, F3-RTU-M.
405 BASIC CoProcessor Modules are placed in an I/O slot of a DL405 CPU base. These modules
communicate with the CPU via the S405_, BMOVE, and DPORT instructions. No PLC ladder logic is
required. Hardware and software features unique to these modules are described in the 405 BASIC
CoProcessors manual, F4-CP-M.
205 BASIC CoProcessor Modules are placed in an I/O slot of a DL205 CPU base. These modules
communicate with the CPU via the S205_, BMOVE, and SHARED instructions. No PLC ladder logic is
required. Hardware and software features unique to these modules are described in the 205 BASIC
CoProcessors manual, F2-CP-M.
05/06 BASIC CoProcessor Modules are placed in an I/O slot of a DL05 or DL06 CPU. These modules
communicate with the CPU via the S06_, BMOVE, and DPORT instructions. No PLC ladder logic is
required. Hardware and software features unique to these modules are described in the 05/06 BASIC
CoProcessors manual, F0-CP-M.

INTRODUCTION

1.1

1.2

INTRODUCTION

CHAPTER 2 : GETTING STARTED WITH FACTS EXTENDED BASIC
MINIMUM READING REQUIREMENT
First time users already familiar with BASIC programming should at least review the commands
AUTOSTART, NEW, LIST, SAVE and DELPRM. Also review the statements SETPORT, SETINPUT, and
the user's manual specific to the module that will be used.

FIRST TIME USERS
It is recommended that first time users begin by entering and executing the examples in the "QUICK
START" section in Appendix A of the module specific user's manual (F4-CP-M, F3-AB-M, F3-RTU-M, F2CP-M, F0-CP-M). This section takes the user through the various steps of BASIC program development.
FACTS Extended BASIC is based on the MCS BASIC-52 interpreter with many feature enhancements and
control oriented instructions added. FACTS Extended BASIC reads, interprets, and executes a list of
instructions that are stored in module memory. This list of instructions is the user's program. The program
is written and loaded into memory by the user. The functionality of the program is determined by the
instructions contained in the program.

OPERATING MODES
The FACTS Extended BASIC interpreter operates in two modes, the direct or COMMAND mode and the
interpreter or RUN mode.
Commands can only be entered when the module is in the COMMAND mode. The BASIC Interpreter takes
immediate action after a command has been entered.
Entering, editing, listing and moving programs is done in the COMMAND mode. The module can be
programmed to enter either mode after a reset or on power up with the AUTOSTART command.

GETTING STARTED WITH FACTS EXTENDED BASIC

2.1

RESET
A module reset occurs under the following conditions for the following module types:
305 BASIC modules
- Power cycle occurs
- User types the RESET command at the command prompt
- 305 CPU goes to run mode
Note: The 305 64K User Memory BASIC Module cannot be accessed until the 305 CPU is in RUN mode.
The 305 128K User Memory modules can be selected by jumper placement to reset when the 305
CPU goes to program mode.
305 CPU BASIC modules, 405 CoProcessor modules, 205 CoProcessor modules, and 05/06 CoProcessor
Modules
- Power cycle occurs
- User types the RESET command at the command prompt
In rare instances, a reset may also be generated by the on-board watch dog timer.
When a reset occurs the interpreter checks the current AUTOSTART mode. The AUTOSTART mode
determines what the interpreter will do. See AUTOSTART for a detailed description. Based on the current
AUTOSTART parameters the interpreter will wait for a space bar character on the command port, run a
specified program, or print the power up message out of the command port and give a command prompt.
GENERAL MEMORY USAGE
All FACTS BASIC modules (305 BASIC, 305 CPU BASIC, 405 CoProcessor, 205 CoProcessor, 05/06
CoProcessor) have the same general memory layout. The memory layout consists of data memory and
program memory. Typically, programs are debugged in data memory and then backed-up to and run out of
program memory. Programs can also be backed-up to disk using the included ABM Commander for
Windows programming and documentation software on a Windows Operating System PC.
Data memory and program memory are both battery backed. Two encapsulated lithium batteries (contained
in the RAM socket) are used to back the RAM memory(s). These batteries are non-replaceable and can be
expected to maintain the data and programs in RAM for over 10 years.

2.2

GETTING STARTED WITH FACTS EXTENDED BASIC

Data Memory
Data Memory is the segment of memory which is used for program editing and development. All programs
store variables in this memory. This memory is also referred to as bank 0 or PROGRAM 0.
The control environment oriented interpretative FACTS Extended BASIC language is contained in 32K or
64K (see the module specific user's manual) non-addressable bytes of ROM. A portion of data memory is
reserved for use by the BASIC interpreter. The amount of memory reserved depends on the specific module
type.
PROGRAM 0 is the program stored in data memory. It may be executed automatically by the AUTOSTART
command or by another program (eg. 1000 GO_PROGRAM 0).
PROGRAM 0 may be copy protected by use of the LOCKOUT statement.
Program Memory
All modules provide the user with a portion of memory referred to as program memory. This segment of
memory is used to SAVE or file programs. Programs SAVEd in a program memory file can be moved back
to data memory (see the EDIT command) for further editing, debugging, trial execution and then re-SAVEd
in the program memory file.
Multiple programs can be SAVEd in program memory to create a file of application and utility programs.
Programs can be executed directly out of program memory by the AUTOSTART command or by other
programs with the GO_PROGRAM statement. Programs can also be "CHAINED" together using
AUTOSTART mode 2.

GETTING STARTED WITH FACTS EXTENDED BASIC

2.3

DEFINITION OF TERMS
Commands
1.

The ">" prompt character is sent by BASIC to inform the user that it is in the COMMAND mode and
ready to receive characters.

2.

Commands can only be entered when the module is in the COMMAND mode.

3.

BASIC takes immediate action after a command has been entered.

4.

Commands which begin with a number from 0 to 65535 are interpreted as program lines and are
terminated with a carriage return.

5.

Many of the instructions and all of the operators can be entered without line numbers and executed
immediately. This a powerful debugging tool.
>PRINT1 21*196.3
4122.3
>FOR I=0 to 12 : P. 2**I, " ", : NEXT I
1 2 4 8 16 32 64 128 256 512 1024 2048 4096
>B=10
>CONT
>PH0. 97
61H
>$(0)="?"
>P. ASC($(0),1)
>63

6.

2.4

Commands which can not be included in program lines will be presented in CHAPTER 3: SYSTEM
COMMANDS. Some typical system commands are RUN, LIST, SAVE and NEW.

GETTING STARTED WITH FACTS EXTENDED BASIC

Statements
A statement consists of an instruction (eg. PRINT, INPUT, LET, GOTO) and may include numbers,
variables, operators and line numbers. Application programs are constructed with statements.

Program Lines
1.

Each program line contains a statement. Multiple statements may be entered on a single line if
separated by a colon (:).

2.

Execution of program lines is deferred until the module is instructed to run a program. See
AUTOSTART, RUN, GOTO, GO_PROGRAM.

3.

A program line may contain no more than 79 characters.

4.

Program lines need not be entered in numerical order, because BASIC will use the line numbers to
order the program lines sequentially.

5.

A program line number can only be used once in a program and only one line number is permitted
on each program line.
NOTE: If the same line number is entered multiple times then the last one entered will overwrite the
previous one.

6.

Spaces (blanks) entered in program lines between instructions, operators, variables, expressions
and numbers are ignored by BASIC, however, BASIC automatically inserts spaces during a LIST in
order to improve the appearance and readability of the program.

7.

Program lines begin with a number in the range of 0 to 65535 and are terminated with a carriage
return.

GETTING STARTED WITH FACTS EXTENDED BASIC

2.5

Floating Point Numbers
1.

Floating point numbers range from ±E-127 to ±.99999999E+127.

2.

Floating point numbers may be input and output using two different notations.
A. Fractional Floating Point (93.65)
B. Exponential Floating Point (39.6537E+6)

3.

BASIC rounds floating point numbers to eight significant digits.

4.

Each floating point number requires six bytes of memory for storage.

Integer Numbers
1.

Integer numbers range from 0 to 65535 (0FFFFH).

2.

Integer numbers may be input and output using two different notations.
A. Decimal Integer

(127)

B. Hexadecimal Integer

(0A53H)

3.

Integers which are represented in hexadecimal format must begin with a valid digit so that they can
be distinguished from variables (A0H is entered 0A0H).

4.

When BASIC logical operators, such as .OR. require an integer, BASIC will truncate the fractional
part of the number leaving the integer portion for the operation.

5.

Integers require six bytes of memory for storage.

2.6

GETTING STARTED WITH FACTS EXTENDED BASIC

Operators
1.

Operators perform a pre-defined function. Operators such as RND and LOF return a number and do
not require an argument. Operators such as SIN and ABS require an argument on which the
operation is performed. Some operators which require two arguments in order to perform the
operation are .AND., + (add), - (subtract), and = (equal).

2.

Operators are distinguished by their type. The two general types of operators are:
A. Mathematical
B. Logical and Relational

Variables
1.

A variable must start with a letter and may contain up to 79 characters or numbers including the
underline character. Valid variables are:
S0L_1 RELAY10 INP103 REG410
NOTE: Only the number of characters in the variable name and the first and last characters are
significant in uniquely identifying the variable.
TMRACCUMM1 = TMRPRESET1 since both variables are the same length, both start with "T" and
both end with "1".
Instead of using variable names like REG0, REG1, REG10, and REG20 use a dimensioned array
like REG().

2.

Array variables include a one dimensional expression or subscript ranging from 0 to 254 enclosed in
parentheses. Valid array variable are:
K(9) ARRAYVAR(PRESSURE) OUT(INT(A**K))
FACTS Extended BASIC does not include double subscript arrays such as A(X,Y). BASIC can
represent a two dimensional array as an "unraveled" one dimensional array. To convert the two
dimensional array A(ROW,COLUMN) into a one dimensional array start with the dimension
statement DIM A(ROW*COLUMN). Then instead of using the double subscript notation B =
A(I,J), use the equivalent single subscript expression B = A(COLUMN*I+J-COLUMN). The BASIC
program STATS.ABM (in the \LIBRARY subdirectory) contains an example statistics program which
uses the concept of a double subscript array.

GETTING STARTED WITH FACTS EXTENDED BASIC

2.7

3.

String variables are a special form of array variables and are represented by the dollar sign character
and an expression enclosed in parentheses. The dimension of the string variables ranges from 0 to
254. Use the STRING statement to allocate memory for string variables. Valid string variables are:
1000 $(0)="First string variable"
1010 I=2
1020 $(I)="Third string variable"
1030 K24=1
1040 $(K24)="Second string variable"

4.

5.

2.8

Where execution speed is a prime concern, not all variables are created equal.
A.

It takes BASIC somewhat longer to process dimensional variables than it does to process
variables that involve only characters. See APPENDIX D, BASIC PROGRAM EXECUTION
SPEED.

B.

It takes BASIC longer to process variables with many characters than it does to process
variables that involve only a single character. See APPENDIX D, BASIC PROGRAM
EXECUTION SPEED.

Although not typical of many BASIC's, variable names may not contain any of the key words which
constitute the BASIC instruction set. The variables BEND and LETOFF could not be used since
they contain the key words END and LET. APPENDIX B, RESERVED WORDS lists all the
reserved words which may not be used as part of a variable name. As a general rule, variable
names without vowels will be ok since most key words contain at least one vowel. Exceptions to
this are the key words CHR$, CR, DTR, RND, SGN, and SQR.

GETTING STARTED WITH FACTS EXTENDED BASIC

Expressions
1.

Mathematical Expressions
A mathematical expression is a formula which evaluates to a number. An expression may involve
operators, numbers and variables. An expression may simply be a number or a variable or it may
be complex such as (B-SQR(B**2-4*A*C))/(2*A).

2.

Relational Expressions
A relational expression is a logical expression which tests the relationship between two operands.
Relational expressions involve the use of = (equal), <> (not equal), > (greater than), < (less than),
>= (greater than or equal too), and <= (less than or equal too). A relational expression may be as
simple as IF B>20 THEN ..., or as complex as COS(B**2)>SQR(SIN(C).AND.NOT(B>C).

3.

Precedence of Operators in Expressions
The rules for evaluating an expression are simple, When an expression is scanned from left to right
an operation is not performed until an operator of lower or equal precedence is encountered. The
precedence of operators from the highest to the lowest in BASIC are:
A. operators enclosed in parentheses ()
B. exponentiation (**)
C. negation (-)
D. multiplication (*) and division (/)
E. addition (+) and subtraction (-)
F. relational expressions (=,<>,>,<,>=,<=)
G. logical and (.AND.)
H. logical or (.OR.)
I. logical exclusive or (.XOR.)

GETTING STARTED WITH FACTS EXTENDED BASIC

2.9

2.10

GETTING STARTED WITH FACTS EXTENDED BASIC

CHAPTER 3 : SYSTEM COMMANDS
All system commands must be entered while the ASCII/BASIC module is in the COMMAND mode. Any
attempt to include a system command in a program will generate a BAD SYNTAX error message. The
system commands described in this chapter are:
AUTOLN
AUTOSTART
COMMAND@
CONT
DELPRM
EDIT
ERASE
LIST
NEW
PROGRAM
RENUMBER
RESET
RUN
SAVE

SYSTEM COMMANDS

3.1

AUTOLN
Function

Automatic program line number entry

Syntax

AUTOLN starting line number, increment

Usage

Use AUTOLN to automatically enter line numbers during program entry. Automatic line
numbering begins with starting line number. Successive program lines will be increased by
the specified increment.
increment is optional. The default value of increment is 10.
Enter Control-C to stop automatic line numbering.
Enter Control-D to skip the currently displayed line number.

Example

>LIST
1000 REM Begin welder control
1010 PRINT1 $(0)
1020 IF DEBUG THEN PRINT2 $(0)
1030 ...
>AUTOLN 1002,2
1002 REM Quickly add additional documentation
1004 REM $(0) = address + command
1006 REM Welder ack will be in $(1) upon RETURN
1008 REM No welder response, $(1)=""
1010 
1012 REM DEBUG=NOT(0) to monitor Port 1 activity
1014 
READY
>LIST
1000 REM Begin welder control
1002 REM Quickly add additional documentation
1004 REM $(0) = address + command
1006 REM Welder ack will be in $(1) upon RETURN
1008 REM No welder response, $(1)=""
1010 PRINT1 $(0)
1012 REM DEBUG=NOT(0) to monitor Port 1 activity
1020 IF DEBUG THEN PRINT2 $(0)
1030 ...

3.2

SYSTEM COMMANDS

AUTOSTART
Function

Selects the modules operating mode after a reset

Syntax

AUTOSTART mode, program, baud, MTOP

Usage

AUTOSTART when entered with no arguments will generate a message reminding the user
of the AUTOSTART syntax.
mode is a number, 0, 1, 2 or 3 which selects a particular reset procedure as shown in the
following table.

AUTOSTART Reset Mode Table
Mode

Name

Description and Procedure

0

Edit

Puts the module in command mode after a module reset and is used
throughout program development.
Use the stored baud rate and enter COMMAND mode. Variable tables
are not CLEARed

1

RUN
(Clear)

Run a specified program after module reset.
CLEAR the variable tables and execute the program specified by
program.

2

RUN
(Do Not Clear)

Run a specified program after module reset. This mode also retains
variables in the absence of power and after the execution of a
GO_PROGRAM statement.
Do not CLEAR the variable tables and execute the program specified by
program.

3

Edit
(Space-Bar)

After a reset the module expects the user to send a space bar character
to the command port. The module will set the command port baud rate
to the baud rate of the device that sent the space bar character.
Note that port 2 does not support AUTOSTART mode 3 if port 2 is
the command port (mode 0 will be used if 3 is selected).
Interpret first character received as a space character to determine baud.
Enter COMMAND mode without CLEARing variables.

baud is an expression specifying the communications rate. AUTOSTART does not verify that the baud rate
specified is "valid". Typical baud rates are 300, 600, 1200, 2400, 4800, 9600, and 19200. The baud rate
stored by AUTOSTART will be the default rate used for both ports. The baud rate for either port can be
changed in the program using the SETPORT statement.
MTOP is an expression specifying the last battery-backed memory location which Extended BASIC can use
for variable storage. The default value for MTOP is defined in the module specific user's manuals. Memory
addresses above MTOP are available to the user. MTOP is included for downward compatibility with Intel
MCS-51 programs. New applications will normally not change this value.

SYSTEM COMMANDS

3.3

Example 1

Change the baud rate.
>AUTOSTART 0,0,9600
Mode = 0, Edit
Program = 0
Baud = 9600

Example 2

Run program 0 after a reset without clearing the variable tables.
>AUTOSTART 2,0
Mode = 2, RUN (no CLEAR)
Program = 0
Baud = 9600

Example 3

Run program 1 after a reset and initialize all variables to zero. Set the baud rate for both
ports initially to 1200. Allocate 200 bytes of memory for use by the user.
>AUTOSTART 1, 1, 1200, 65535-200
Mode = 1, RUN (CLEAR)
Program = 1
Baud = 1200

3.4

SYSTEM COMMANDS

Retaining Variables in the Absence of Power
Mode 2 retains all variables (including string and dimensional variables) during loss of power, however, the
BASIC statements CLEAR, MTOP, STRING and the BASIC commands RUN and NEW will erase the
variable tables. Therefore these statements should not be included in a program when using mode 2.
NOTE: When debugging a program that uses AUTOSTART mode 2, use 'GOTO line number'; 'GOPRM
program number, line number'; or the RESET command to start the program.
Module startup can be simplified by adding BASIC commands without line numbers at the beginning of the
text file to download. As the file is downloaded the module will execute the commands. See the example
below.
Example

NEW
: REM Clear Program 0
DELPRM1
: REM Delete Program 1
AUTOSTART 2,1 : REM Set the AUTOSTART Mode
STRING 8001,79 : REM Allocate String Storage
DIM REG(128) : REM Dimension an Array
10 REM Program Start
...

Strings

Since mode 2 does not clear the variable tables, strings should be allocated explicitly with
the command mode statement STRING. To allocate memory for strings simply enter a
STRING command as shown in the examples below or include the STRING command
without a line
number at the beginning of the text file containing the program to
download. If the variable tables are subsequently cleared then a STRING command must
be entered again.
The variable tables will be cleared by: Executing a RUN or NEW command, or executing
the CLEAR, MTOP, or STRING statements.

Example

Arrays

>STRING 2551, 254

Allocate memory for 10 strings, each with a maximum length of
254 characters.

>STRING 8001, 79

Allocate memory for 100 strings, 79 characters maximum each
string.

Since mode 2 does not clear the variable tables, arrays should be DIMensioned explicitly
with the command mode statement. Using a DIM statement in a program with mode 2
selected will generate an error. If the variable tables are subsequently cleared then a DIM
command must be entered again.
The variable tables will be cleared by: Executing a RUN or NEW command, or executing
the CLEAR, MTOP, or STRING statements.

Example

>DIM REG(254), INP(64), OUT(32)

SYSTEM COMMANDS

3.5

COMMAND@
Function

Selects the programming port

Syntax

COMMAND@ port

Usage

port is either 1 or 2 and specifies the programming/command port. BASIC sends all
messages to and accepts only COMMANDs from the specified port.
The default programming/command port is typically Port 1, see the module specific user's
manual to verify. AUTOSTART specifies the initial baud rate for Port 1. SETPORT may be
used to change the Port 1 baud rate, however, after a reset the AUTOSTART value is used.
The default baud rate for Port 2 is 9600. After a reset, the baud rate specified by the last
SETPORT statement will be used. Port 2 does not support AUTOSTART mode 3 (mode 0
will be used if 3 is selected).
Use COMMAND@ to debug communications with an external device connected to the
opposite port. COMMAND@ can be used to get complete utilization of both ports while
minimizing the need for cable swapping or the use of switch boxes.

Example

Assume the program for a diagnostic/shift report printer connected to Port 2 has been
completed. Now it is desired to operate a stepper motor controller using Port 1. To begin
programming the stepper:
>SETPORT 2, 9600
>COMMAND@2

Sets the baud rate for Port 2
Programming port is now Port 2

Move the programming device cable from Port 1 to Port 2
To go back to programming at Port 1, enter COMMAND@1
Advanced

The programming port can be selected in the program for making remote programming
changes through the optional built in Port 2 phone modem.
SYSTEM(7)=0 : REM Select Port 1 for programming
SYSTEM(7)=NOT(0) : REM Select Port 2 for programming
See the TELESERV.ABM application example in the ABM Commander Plus
ABM\ABM-TM directory.

3.6

SYSTEM COMMANDS

CONT
Function

Resume program execution.

Syntax

CONT

See Also

TRACE, STOP

Usage

Continue is typically used during program debugging. If program execution is halted by
typing a  or by the STOP statement then CONT will cause program execution to
resume where it was stopped. Before resuming program execution, values of variables can
be displayed or changed. If the program is changed it cannot be continued.

Example

>10 DO
>20 I=I+1: PRINT1 I
>30 WHILE I>0
>RUN
1
2
3
4
5
6

( typed)

STOP - IN LINE 30
READY
>I=-1
>CONT
0
READY
>

SYSTEM COMMANDS

3.7

DELPRM
Function

Delete a stored program

Syntax

DELPRM program number

Usage

program number is the number of the stored program to be deleted. Program numbers are
assigned by the SAVE command. The numbers correspond to the order in which the
programs were SAVEd. After the delete program operation has been successfully verified,
the number of stored programs and the number of program storage bytes remaining is
displayed. The number of stored programs does not include program 0. DELPRM can be
used to remove any of the stored programs.
Typing DELPRM 0 has the same effect as typing NEW.

Example

READY
>DELPRM 4
7 stored programs, 28381 bytes free
>

3.8

SYSTEM COMMANDS

EDIT
Function

Move a SAVEd program to PROGRAM 0 for editing.

Syntax

EDIT

Usage

The EDIT command is used to copy the currently selected program in the program file to
PROGRAM 0 for editing. EDIT executes a NEW command before copying the program.
Select a program from the program file with the PROGRAM command.
The original program will still be stored in the program file.
To delete the original program use DELPRM.

Example

>PRM1
PRM1
READY
>LIST
10 REM EDIT Command Example
20 FOR X=1 TO 5
30 PRINT1 "HELLO"
40 NEXT X
PRM1
READY
>EDIT
PRM0
READY
>LIST
10 REM EDIT Command Example
20 FOR X=1 TO 5
30 PRINT1 "HELLO"
40 NEXT X
PRM0
READY
>20 FOR X= 1 TO 10
>LIST
10 REM EDIT Command Example
20 FOR X=1 TO 10
30 PRINT1 "HELLO"
40 NEXT X

SYSTEM COMMANDS

3.9

ERASE
Function

Delete a range of line numbers in the program

Syntax

ERASE starting line number, ending line number

Usage

The ERASE command is used to remove the program lines from starting line number to
ending line number.
We recommend backing-up the program to disk or saving a copy in the program file prior to
making major program changes with ERASE since there is no "UNERASE" command.

Example

>LIST
10 REM ERASE example
20 IF DEBUG THEN GOSUB 200
30 INLEN2=0
40 INLEN1=0
50 REM Start of main program
>ERASE 10, 40
>LIST
50 REM Start of main program

3.10

SYSTEM COMMANDS

LIST
Function

Display the currently selected program.

Syntax

LIST start line num, finish line num

Usage

The LIST command is used to display the currently selected program. LIST inserts spaces
in the program after line numbers and before and after instructions to improve the
appearance and readability of the program. LIST can be used in these ways:
LIST Displays the entire program.
LIST line num Displays the program from line num to the end.
LIST line num, line num Displays only a single program line num.
LIST start line, finish line Displays line numbers beginning with start line and ending with
finish line.

Example

>LIST
10 REM LIST EXAMPLE
20 A=B : C=2
30 END
READY
>LIST 20
20 A=B : C=2
30 END
READY
>LIST 10,20
10 REM LIST EXAMPLE
20 A=B : C=2
READY
>LIST 20,
20 A=B : C=2
A listing can be terminated by entering . LIST can also be stopped by entering
XOFF  and then restarted by entering XON . Note that the only serial port
input that BASIC will accept after XOFF is XON or . See SETPORT for more
information on XON and XOFF flow control.

SYSTEM COMMANDS

3.11

NEW
Function

Erase PROGRAM 0 and CLEAR variables.

Syntax

NEW

Usage

The NEW command is used to erase PROGRAM 0 in data memory. NEW also deletes all
variables. There is no "UNDO NEW" command so use NEW with caution.
Executing NEW has the same effect as DELPRM 0.

3.12

SYSTEM COMMANDS

PROGRAM or PRM
Function

Select a SAVEd program

Syntax

PROGRAM number

Usage

The PROGRAM command is used to select a program for LISTing or RUNning. number
specifies which program the user wishes to access (see SAVE). If an attempt is made to
select a program number which is greater than the number of stored programs in the
program file or less than 0 then the message ERROR: PROGRAM ACCESS will be
generated. This error message will also be generated if an attempt is made to make
changes to a program still in program memory.

SYSTEM COMMANDS

3.13

RENUMBER
Function

Renumber a range of program lines

Syntax

RENUMBER starting, ending, increment, new starting

Usage

RENUMBER will allow you to add program lines to a section of the program where
previously there was no room.
All program lines from starting program line to ending program line, and all references to
these lines anywhere in the program will be renumbered.
increment is optional and specifies the difference between consecutive line numbers.
increment defaults to a value of 10.
If a new starting line number is specified then the entire program is renumbered by the
increment amount. The new starting line number is the first line number of the renumbered
program. In this case, the starting and ending parameters are ignored but must be included
in the RENUMBER command.

Example

>LIST
10 STRING 8001, 79 : REM STRING does a CLEAR
20 DEBUG = 0
30 LOCKOUT = 0
40 BREAK = 1
50 IF NOT DEBUG THEN GOTO 101
100 INLEN1 = 0
101 DIM REG(20)
102 FOR I = 1 TO 20
103 REG(I) = 1
104 NEXT I
200 . . .
>RENUMBER 100,104,5
>LIST
10 STRING 8001, 79 : REM STRING does a CLEAR
20 DEBUG = 0
30 LOCKOUT = 0
40 BREAK = 1
50 IF NOT DEBUG THEN GOTO 105
100 INLEN1 = 0
105 DIM REG(20)
110 FOR I = 1 TO 20
115 REG(I) = 1
120 NEXT I
200 . . .

3.14

SYSTEM COMMANDS

RESET
Function

Execute a software reset

Syntax

RESET

Usage

RESET executes the same software initialization routines executed after a hardware reset
has occurred. RESET can be executed in the COMMAND mode to verify AUTOSTART
operation.

SYSTEM COMMANDS

3.15

RUN
Function

CLEAR the variable tables and execute the selected program

Syntax

RUN

Usage

Entering RUN causes BASIC to set all variables to zero, clear interrupts, reset stacks and
begin execution of the currently selected program at the first line number. Program
execution may be halted by sending the module a  character. To disable the
 feature see the BREAK statement. RUN always begins execution with the lowest
number program line.
NOTE: If you are using AUTOSTART mode 2, then do not use the RUN command to start
the program. To begin execution without clearing variables or at some point in the
program other than the beginning, use GOTO.

Example

>10 For J=1 to 3 :PRINT1 J:NEXT J
>20 PRINT1 "GO"
>RUN
1
2
3
GO
READY
>

3.16

SYSTEM COMMANDS

SAVE
Function

Store selected program in the program file

Syntax

SAVE

Usage

The SAVE command is used to store the currently selected program, either in data
memory (PROGRAM 0) or in the program file, into the next free space in the program file.
Programs are stored sequentially in the program file. Each time the SAVE command is
executed, the number of programs filed will be increased by one. The number of programs
stored is only limited by the size of the programs and the amount of program file memory
available. When the SAVE command is entered, BASIC will return the program's file
number. This number is used by PROGRAM and GO_PROGRAM to retrieve or execute a
program in the file.

Example

>PRM 0
>LIST
10 PRINT1 "TEST PROGRAM"
>SAVE
Saving program 7
7 Stored programs, 51154 program storage bytes free
>GOPRM 7
TEST PROGRAM
>NEW Erase program 0
>PRM 0
>LIST

Yep, it's gone

>PRM 7

Select PROGRAM 7 again

>EDIT Move it back to PROGRAM 0
>PRM 0
READY
>LIST
10 PRINT1 "TEST PROGRAM"
PROGRAM 0 was stored in the program memory file as PROGRAM 7. Then the stored
program was retrieved for further editing. See DELPRM to delete a program stored in the
program file.

SYSTEM COMMANDS

3.17

3.18

SYSTEM COMMANDS

CHAPTER 4 : STATEMENTS
This chapter contains an alphabetical listing of the FACTS extended BASIC statements and operators that
are featured in all BASIC module types. The module specific user's manual describes any differences from
these statements as well as any fetures specific to a particular module.
The statements are desribed in the following format:
STATEMENT

Statement Type

Function

Function Description

Syntax

Syntax Description

See Also

Related statements

Usage

Additional Information

Examples

STATEMENTS

4.1

ABS - Mathematical Operator
Function

Returns the absolute value of expression.

Syntax

ABS(expression)

Usage

Returns the absolute value of expression.

Example

PRINT ABS(5)
5

4.2

PRINT ABS(-5)
5

STATEMENTS

ASC - String Operator
Function

Changes or returns the ASCII code of a character in a string

Syntax

code = ASC(string variable, position)
ASC(string variable, position) = code

See Also

CHR$

Usage

The ASC operator returns the ASCII code (0-255) for the character at any specific position
in string variable.
The ASC statement assigns the ASCII code (0-255) to the character at any specific
position in string variable.
The valid range for position is 1 to 255.
Normally the string handling functions MID$, INSTR, LEFT$, and RIGHT$ would be used to
manipulate strings. A special case exists when the ASCII control characters 
(NULL, ASCII = 0) and  (CR, ASCII = 13) must be manipulated within strings.
These characters are used as delimiters by all of the string handling statements except
ASC. Therefore, only the ASC function can by used to process strings with the NULL and
CR characters within the string.
BASIC adds a carriage return character (ASCII, 13) to identify the end of a string.

Example

>$(0)="123"
>ASC($(0),2)=65 : REM ASCII code for "A"
>P. $(0)
1A3
>P. ASC($(0),3), SPC(2), CHR$(ASC($(0),3))
51 3

STATEMENTS

4.3

ATN - Mathematical Operator
Function

Returns the arctangent of expression

Syntax

ATN(expression)

Usage

Returns the arctangent of expression. The result is in radians. Calculations are carried out
to 7 significant digits. The ATN operator returns a result between -PI/2 (-3.1415926/2) and
PI/2.

Example

PRINT ATN(3.1415926)
1.2626272

4.4

PRINT ATN(1)
.78539804

STATEMENTS

BIT and BITS - Input/Output
Function

Decode and Encode a 16 bit variable

Syntax

var = BIT(subscript)
BIT(subscript) = expr
var = BITS
BITS = expr

See Also

PICK

Usage

BIT will normally be used to decode PLC CPU input status points or to encode PLC
outputs. subscript references a particular bit position (0) to (15) or S for all 16 bits.

Example

PRM 0
READY
>LIST
10 REM
20 WRD=65534 : REM WRD is a variable that contains a
30 BITS=WRD : REM 16 bit value of an I/O Register
30 FOR BT=0 TO 15
40 PRINT1 " BIT(",BT,") -> ",
50 IF BIT(BT) THEN PRINT1 " ON " ELSE PRINT1 "OFF"
60 NEXT BT
PRM 0
READY
>RUN
BIT(0) -> OFF
BIT(1) -> ON
BIT(2) -> ON
BIT(3) -> ON
BIT(4) -> ON
BIT(5) -> ON
BIT(6) -> ON
BIT(7) -> ON
BIT(8) -> ON
BIT(9) -> ON
BIT(10) -> ON
BIT(11) -> ON
BIT(12) -> ON
BIT(13) -> ON
BIT(14) -> ON
BIT(15) -> ON

STATEMENTS

4.5

BREAK - Flow Control
Function

Enable and disable  program stop

Syntax

BREAK = true or false

See Also

LOCKOUT, CONT

Usage

true or false is an expression which when equal to 0 disables program termination by a
. If true or false is not 0 then BASIC checks during INPUT and after executing
each program line to see if a Ctrl-C has been entered. A program interrupted with 
can be resumed at the point of interruption with CONT.
NOTE: true = zero , false = non-zero
Normally, BREAK is enabled during program development only. BREAK should be
disabled for most industrial applications.
If BREAK is disabled by BASIC then program execution will continue until reaching an END
or STOP statement or until an error is generated.
AUTOSTART mode 1 or 2 executes a program after a reset. If the program has BREAK
disable, and never executes an END statement, then the program cannot be accessed
normally. To access the program, you must change the AUTOSTART mode. See the
module specific user's manual for the location of the CLR ALL / AUTOSTART jumper which
bypasses the stored AUTOSTART parameters.

Example

>REM Enable program interruption
>10 BREAK = 1
>REM Disable program interruption
>10 BREAK = 0
>REM If  is enabled then disable it
>10 IF BREAK THEN BREAK = 0
>REM If  is disabled then enable it
>10 IF NOT(BREAK) THEN BREAK = 1

4.6

STATEMENTS

BYTE - Advanced Operator
Function

Read or write a byte value in variable storage memory

Syntax

variable = BYTE (address)
BYTE (address) = data byte

See Also

LOAD@, STORE@, WORD

Usage

BYTE is used to retrieve or assign a data byte, from 0 to 255, to an address in the
battery-backed variable storage memory. The range of valid addresses is module specific.
The range of memory reserved for use by the BASIC interpreter should not be written to
by the user. An alternative to using AUTOSTART mode 2 to retain data in the absence of
power is to store a value in data memory. To do this the user must allocate some free
memory (memory not used by BASIC) for the data to store. The MTOP operator, described
later in this chapter, is used to provide the user with free memory for the storage of data.

Example

Store a string above MTOP
>MTOP=16383
Allocate 16K of data memory. This is equivalent to 16,384 eight bit PLC CPU retentive data
registers.
>AUTOSTART mode, program, baud, 16383
Store the new value for MTOP
>30 STRING 100,10 : REM Allocate memory for strings
>40 INPUT "WHAT IS YOUR NAME? ",$(1) : REM Input string
>50 I=0 : DO : I=I+1
>60 BYTE(16385+I)=ASC($(1),I) : REM Store ASCII codes
>70 UNTIL ASC($(1),I)=13 : REM End of input
>80 BYTE(16384)=I-1
>90 REM Store length of string to point to next free
>91 REM memory location

STATEMENTS

4.7

CALL - Advanced Operator
Function

CALL invokes an assembly or machine language subprogram

Syntax

CALL address

Usage

The CALL statement is used to call an assembly language program. address is the
starting memory location of the assembly language routine. Assembly language routines
must be located in program memory.
Those users that have an understanding of the architecture and assembly language of the
Intel MCS-51 Micro-controller family and wish to add a custom function should consult the
factory for additional information and application assistance.
Generally, all system resources and interrupts are used by BASIC. Called routines should
PUSH/POP all internal memory locations used. Most products support loading assembly
or 'C' language programs in battery-backed RAM. This enables adding custom functions
without burning an EPROM.

4.8

STATEMENTS

CBY - Advanced Operator – Not Recommended for New Applications
Function

Read contents of memory address in program storage memory

Syntax

variable = CBY (address)

Usage

The CBY operator can be used to assign the contents of individual memory locations in
program memory to a variable. Since program memory cannot be written directly, the CBY
operator cannot be assigned a value.

STATEMENTS

4.9

CHR$ - String Operator
Function

Converts an ASCII code into a single character string

Syntax

string variable = CHR$(code)

See Also

ASC

Usage

CHR$ returns a single character string corresponding to an ASCII code. CHR$ is useful for
creating strings containing non-printable characters and characters which cannot be
entered from the keyboard.
code must be in the range 0 to 255.

Example

ANSI escape sequence using CHR$
>$(0)=CHR$(27)+"[2J"

Special

Clear the screen

The string delimiter characters carriage return (ASCII code = 13) and null (ASCII code = 0)
can be PRINTed with CHR$. CHR$ returns a zero length string for these codes.
Use the ASC operator to embed null and carriage return characters within a string. Use
PRINT USING(\count\) to print strings with embedded carriage return and null characters.

Example

>PRINT "Display a line repeatedly",CHR$(13)," PRINT"
PRINT a line repeatedly
>$(0)=CHR$(13)
>PRINT LEN($(0))
0

4.10

STATEMENTS

CLEAR - Flow Control
Function

CLEAR erases the variable tables

Syntax

CLEAR

See Also

CLEAR I, CLEAR S

Usage

The CLEAR statement is used to set all variables including strings and dimensioned arrays
to zero, to disable interrupts, to reset control stacks and to cancel the ONERR statement.
CLEAR does not effect the software timer, the battery-backed calendar clock, or reset the
memory allocated by the STRING statement.

STATEMENTS

4.11

CLEAR I - Interrupts
Function

Disable program interrupts

Syntax

CLEAR I

See Also

CLEAR, CLEAR S

Usage

The CLEAR I statement resets the BASIC interrupt flag and disables program interrupts
enabled by the ONTIME and ONPORT statements. This statement can be used to prevent
interrupts during certain sections of a BASIC program. ONTIME and ONPORT must be
executed again before the respective interrupts will be enabled.

4.12

STATEMENTS

CLEAR S - Flow Control
Function

Reset control and argument stacks

Syntax

CLEAR S

See Also

CLEAR, CLEAR I

Usage

The CLEAR S statement is used to reset BASIC's control and argument stacks. This
statement can be used to exit prematurely from a subroutine (GOSUB-RETURN) or from a
FOR-NEXT, DO-UNTIL or DO-WHILE control loop. After executing a CLEAR S statement
the user will normally use a GOTO statement to jump back to the main body of the
program.
CLEAR S cancels all GOSUB routines and control loops.

Example

>10 PRINT1 "Multiplication Test"
>30 INPUT "How many seconds do you want? ",S
>40 ONTIME S,200
>50 FOR I=2 TO 9
>60 N=INT((RND)*10)
>70 PRINT1 N,"*",I,"= ? ",
>80 TIME=0
>90 INPUT ,$(0)
>95 R = VAL($(0))
>100 IF R<>N*I THEN PRINT1 "WRONG" : GOTO 60
>110 PRINT1 "THAT'S RIGHT!"
>130 NEXT I
>140 PRINT1 : PRINT1 "THAT'S ALL OF THEM"
>150 END
>200 CLEAR S
>210 PRINT1 "YOU TOOK TOO LONG"
>220 GOTO 20

STATEMENTS

4.13

COMERR - Advanced Operator
Function

CRC-16 error flag

Syntax

true or false = COMERR port number

Usage

If CRC-16 error checking is enabled, COMERR will be true when a CRC-16 error has been
detected following an INPUT1, INPUT2, or INPUT3 statement. COMERR is false when the
calculated CRC-16 matches the two CRC-16 characters received. If a parity error is
encountered the character is ignored (causing a CRC-16 error). COMERR is turned off (set
to false) at the start of an INPUT statement.
NOTE: true = zero , false = non-zero

Example

4.14

See CHAPTER 8, ADVANCED

STATEMENTS

COPY - Memory Management
Function

Copy a block of ABM memory

Syntax

COPY starting_address, ending_address, destination_address
COPY starting_address, K(number bytes), destination_address

Usage

COPY a block of ABM memory beginning at source starting_address up through and
including source ending_address to the ABM memory beginning at destination_address.
Optionally, the number of bytes of memory to COPY may be specified as an expression in
parenthesis following "K".
The maximum block size which can be copied is 65535 bytes.
NOTE: See the module specific user's manual for the memory map of the module that you
are using.

Example

This example creates tables of string variables which are stored at the top of data storage
bank 1. COPY is used to store and retrieve the string variable tables. This is useful when
more that 254 string variables are required or when the amount of memory allocated for
strings needs to be reduced.

STATEMENTS

4.15

1000
1010
1020
1030
1040
1045
1050
1060
1070
1080
1090
1100
1110
1120
1130
1140
1150
1160
1170
1180
1190
1200
1210
1220
1230
1240
1250
1260
1265
1270
1280
1290
1300
1310
1320
1330
1340
1350
1360
1365
1370
1380
1390
1400
1410
1415
1420
1430
1440

4.16

REM
REM SWAPPING STRING VARIABLES
REM USED TO EXTEND THE NUMBER OF STRING VARIABLES
REM TO SAVE MEMORY, STRINGS MAY BE DEFINED LITERALLY
REM DURING THE PROGRAM DOWNLOAD PROCESS AND SAVED IN
REM NON-VOLATILE MEMORY USING COPY.
REM
REM Allocate memory for 10, 254 character strings
STRING 2551,254
REM Number of bytes in a bank of memory
BANK=65535
REM Total number of bytes of string storage space
SIZE=MTOP-WORD(104H)
REM Start of string storage space
TBL(0)=WORD(104H)
REM Starting location of string table 1, at end of bank 1
TBL(1)=BANK*2+1-SIZE
REM Starting location of string table 2, at end of bank 1
TBL(2)=BANK*2+1-SIZE*2
REM BUILD TEST STRING ARRAY, TABLE 1
FOR I=0 TO 9
FOR J=1 TO 254
ASC($(I),J)=I+48
NEXT J
PRINT2 $(I)
NEXT I
REM SAVE STRING TABLE 1
COPY TBL(0),K(SIZE),TBL(1)
REM BUILD TEST STRING ARRAY, TABLE 2
FOR I=0 TO 9
FOR J=1 TO 254
ASC($(I),J)=I+65
NEXT J
PRINT2 $(I)
NEXT I
REM SAVE STRING TABLE 2
COPY TBL(0),K(SIZE),TBL(2)
REM GET STRING TABLE 1
COPY TBL(1),K(SIZE),TBL(0)
REM PRINT STRING TABLE 1
FOR I=0 TO 9
PRINT2 $(I)
NEXT I
REM GET STRING TABLE 2
COPY TBL(2),K(SIZE),TBL(0)
REM PRINT STRING TABLE 2
FOR I=0 TO 9
PRINT2 $(I)
NEXT I

STATEMENTS

COS - Mathematical Operator
Function

Returns the cosine of expression

Syntax

COS(expression)

Usage

Returns the cosine of expression. expression is in radians. Calculations are carried out to
7 significant digits. expression must be between + or -200000.

Example

PRINT COS(3.14/4)
.7071067

PRINT COS (0)
1

STATEMENTS

4.17

CR - Input/Output
Function

Used in PRINT statement to output a carriage return

Syntax

PRINT CR

See Also

PRINT, SPC, TAB, USING, @

Usage

The CR function is short hand notation for CHR$(13). CR will cause a carriage return
character (ASCII=13) to be sent to the serial port when encountered in the PRINT
statement. No line feed character will be sent.
The CR function will appear to not work properly with printers and terminals which
automatically add a line feed when the carriage return character is received. The CR
function can be used to repeatedly update the same line on a CRT.

Example

>10 FOR J=1 TO 100
>20 PRINT1 USING(###), J, CR,
>30 NEXT J
Equivalent program using CHR$
>10 FOR J=1 TO 100
>20 PRINT1 USING(###), J, CHR$(13),
>30 NEXT J

4.18

STATEMENTS

DATA - Input/Output
Function

DATA specifies expressions for READ statements

Syntax

DATA expr, expr, ...

See Also

READ, RESTORE

Usage

expr is a numeric expression or constant. DATA declares the expressions which can be
assigned to variables following the READ statement. Multiple expressions specified in a
DATA statement are separated by commas. DATA statements may be placed anywhere in
the program since they are not executed. DATA statements are linked together in the
order that they appear in the program.

Example

10
20
30
40
50

REM Load array REG with constants
FOR D=1 to 5
READ REG(D)
NEXT D
DATA 35, -1, 10E3, 0FFEH, REG(2)*2+D

STATEMENTS

4.19

DATE$ - String Operator
Function

DATE$ sets and retrieves the battery-backed calendar clock date

Syntax

DATE$ = string expression
string variable = DATE$

See Also

TIME$

Usage

When correctly formatted, string expression sets the battery-backed calendar clock month,
day of month, year, and day of the week. string expression must be in one of the following
forms:
mm-dd-yy-w
mm/dd/yy/w

(eg. DATE$ = "9-25-88-7")

string variable will contain the battery-backed calendar clock date returned by DATE$.
DATE$ returns a variable length string in the form:
dayofweek-mm-dd-yy.
The battery-backed calendar clock is accurate to +/- 1 minute per month at 24 degrees C.
Example

>DATE$ = "10/10/88/1"
>PRINT1 DATE$
Monday 10-10-88
>DATE$ = "2-29"
>PRINT1 DATE$
Monday 02-29-88
>DATE$ = "1-1-90/4"
>P. DATE$
Thursday 01-01-90
>PRINT1 "The year is 19"+MID$(DATE$,LEN(DATE$)-1)
The year is 1990
>MON_POS = INSTR(DATE$," ")+1
>DAY_POS = INSTR(DATE$,"-")+1
>P. "We are in month ";VAL(MID$(DATE$,MON_POS,2))
We are in month 1

4.20

STATEMENTS

DBY - Advanced Operator – Not Recommended for New Applications
Function

Write to special memory locations (8052 CPU internal memory)

Syntax

variable = DBY (address)
DBY (address) = data byte

See Also

SYSTEM

Usage

DBY is used to retrieve or assign a data byte to one of the 256 bytes of special memory
within the BASIC module. address must be between 0 and 255 (0FFH) inclusive.
NOTE: The memory locations addressed by the DBY operator are reserved for use by the
BASIC interpreter and may change with firmware revisions. Where possible, the
equivalent SYSTEM statement should be used.

Summary of DBY usage
MEMORY
LOCATION
DBY(21)
DBY(23)
DBY(24)
DBY(25)
DBY(26)
DBY(27)
DBY(30)
DBY(31)
DBY(35)
DBY(41)
DBY(71)

USAGE BY BASIC
Null character count set by NULL command
Format of PRINT statement set by USING
Destination program memory address minus one for PGM statement - low byte.
Also DELAY time base.
Source information address for PGM statement - low byte. Also CRC-16 low byte
Destination program memory address minus one for PGM statement - high byte.
Also CRC-16 high byte
Source information address for PGM statement - high byte. Also RTS Off-Delay
character count for Hardware handshaking.
Number of bytes to write in the PGM statement - Low Byte
Number of bytes to write in the PGM statement - High Byte
Turn ON or OFF CRC-16 Error Checking
DBY(41)=NOT(0) = COMMAND@2
DBY(41)=0 = COMMAND@1
Fractional portion of TIME

STATEMENTS

4.21

DELAY - Miscellaneous
Function

Insert a pause

Syntax

DELAY msec

See Also

ONTIME, TIME

Usage

msec is an expression indicating the number of milliseconds Extended BASIC should
pause before executing the next statement.
Using DELAY rather than software do-nothing loops results in programs that run
appropriately on future hardware which will have clock speeds greater than currently
possible.

Example

4.22

10
20
30
40
50
60
70

PRINT2 "Are you awake?"
DELAY 10 : REM Pause 10 msec for a response
IF INLEN2=0 THEN GOTO 60
PRINT1 "The device on port 2 is alive"
END
PRINT1 "The device on port 2 is asleep"
END

STATEMENTS

DIM - Memory Management
Function

Allocates memory for numeric arrays

Syntax

DIM var(expr), var(expr), ...

Usage

DIM declares non-string array variables and allocates space in data memory for their
storage. expr specifies the number of elements or subscripts in the array and must be
less than 255. BASIC arrays must be one dimensional. To implement a two dimensional
array see DOUBLE SUBSCRIPT ARRAYS in the the GETTING STARTED chapter.
The DIM statement can appear anywhere in the program except before a STRING
statement. Attempting to re-dimension an array or to access an array element that is
outside the scope of the dimensioned variable will generate the message, ERROR:
ARRAY SIZE - SUBSCRIPT OUT OF RANGE - IN LINE XX.
Since AUTOSTART mode 2 retains data in DIMensioned arrays, the DIM statement must
be executed in COMMAND mode. Do not re-dimension arrays in the program when using
AUTOSTART mode 2.
If an arrayed variable is used that has not been dimensioned by the DIM statement then
BASIC will automatically dimension the array to 10 elements. It is good practice to
explicitly dimension all arrays.

Example

10 DIM A(20),B(20)
20 C(2)=9 :REM ARRAY ASSIGNED DEFAULT SIZE OF 10
30 DIM D(C(2)*2)
40 REM EXPRESSION C(2)*2 MUST ALWAYS BE <= 254

STATEMENTS

4.23

DO-UNTIL - Flow Control
Function

Loop until test at bottom of loop is TRUE

Syntax

DO UNTIL relational expr

See Also

DO WHILE

Usage

The DO-UNTIL statements allow the user to repeatedly execute the program lines between
the DO and UNTIL statements. relational expr when equal to zero represents FALSE and
the loop continues, otherwise the loop ends.
The maximum number of nested DO-UNTIL loops which BASIC can handle is 52.
Attempting to execute the DO-UNTIL statements in the COMMAND mode will generate a
BAD SYNTAX error message.

Example

DO-UNTIL Loop
>10 DO
>20 I=I+1
>30 PRINT1 I,
>40 UNTIL I=5
>50 PRINT1
>RUN
12345

4.24

NESTED DO-UNTIL Loops
>10 DO:I=I+1:DO:C=C+1
>20 PRINT1 C,I*C
>30 UNTIL C=3:C=0:PRINT1
>40 UNTIL I=3
>RUN
112233
122436
132639

STATEMENTS

DO-WHILE - Flow Control
Function

Loop while test at bottom of loop is TRUE

Syntax

DO WHILE relational expr

See Also

DO UNTIL

Usage

The DO-WHILE statements allow the user to repeatedly execute the program lines between
the DO and WHILE statements. relational expr when equal to zero represents FALSE and
the loop ends, otherwise the loop continues.
The maximum number of nested DO-WHILE loops which BASIC can handle is 52.
Attempting to execute the DO-WHILE statements in the COMMAND mode will generate a
BAD SYNTAX error message.

Example

DO-WHILE loop

Nested DO-WHILE and DO-UNTIL loop

>10 DO
>20 I=I+1
>30 PRINT1 I," ",
>40 WHILE I<5
>50 PRINT1
>RUN

>10 DO : I=I+1 : DO : C=C+1
>20 PRINT1 C,SPC(1),I*C,
>30 UNTIL C=3 : C=0 : PRINT1
>40 WHILE I<3
>RUN

12345

112233
122436
132639

STATEMENTS

4.25

DSR - Miscellaneous
Function

Get status of hardware handshaking input line

Syntax

var = DSRn

See Also

DTR, SETPORT

Usage

n specifies the serial port either 1 or 2. var returns the current state of the CTS line either
TRUE (all ones) or FALSE (zero).
When hardware handshaking is enabled by the SETPORT statement, modem RTS/CTS
protocol automatically controls the PRINT statement. With hardware handshaking
disabled, custom handshaking can be implemented with DSR.

Example

The CTS input line at port 1 is connected to a hardware handshaking output line of an
external device. For instance, this could be the RTS or DTR output of a DTE device.
Prevent over-flowing the external devices input buffer.
...
1000 IF NOT DSR2 THEN RETURN
1010 REM Device at port 2 is ready for more data
1020 PRINT2 . . .

4.26

STATEMENTS

DTR - Miscellaneous
Function

Control output of hardware handshaking line

Syntax

DTRn = expr
var = DTRn

See Also

DSR, SETPORT

Usage

n specifies the serial port either 1 or 2. expr when equal to zero turns the RTS line for the
specified port OFF, otherwise it is turned ON. var returns the current state of the RTS line
either TRUE (all ones) or FALSE (zero).
DTR2 is used with the on board modem to force it immediately into the command state
(even if it was on-line). User program control of this pin permits changing ports without
hanging up the phone or losing communication. DTR2 must be true to enable the modem
(DTR2=1).
When hardware handshaking is enabled by the SETPORT statement, modem RTS/CTS
protocol automatically controls the PRINT statement. With hardware handshaking
disabled, custom handshaking can be implemented with DTR.

Example 1

Modem at port 2
>REM Turn OFF DTR for PORT 2 to force modem off line
>DTR2 = 0
>REM Turn ON DTR for PORT 2 to enable modem
>DTR2 = 1

Example 2

The RTS output line at port 1 is connected to a hardware handshaking input line of an
external device. For instance, this could be the CTS or DSR input of a DTE device.
>REM Stop the external device from transmitting
>DTR1 = 0
>REM Enable the device to transmit
>DTR1 = 1

Example 3

Prevent over flow of the type-a-head buffer
>IF INLEN1>127 THEN DTR1=0 ELSE DTR1=1

STATEMENTS

4.27

END - Flow Control
Function

Halt program execution

Syntax

END

See Also

STOP

Usage

The END statement is used to halt execution of a BASIC program. The continue
command, CONT, will not function if the END statement is used to terminate program
execution. BASIC will automatically terminate the program after executing the last
program line.

Example

REM Run the program in data memory on power-up
AUTOSTART 1, 0, 9600
Mode = 1, RUN (CLEAR)
Program = 0
Baud = 9600
READY
>
>05 REM Prevent access to program and data by
>06 REM unauthorized personnel
>10 LOCKOUT = 1
>15 $(0)="For my eyes only" : REM Password
>17 REM Set INPUT time-outs to 2 seconds
>20 SETINPUT 1,1,0,LEN($(0)),2000,2000
>30 INPUT, $(1)
>40 CHAR = 0
>50 DO
>60 CHAR = CHAR + 1
>70 IF LEN($(0))=CHAR - 1 THEN LOCKOUT=0 : END
>80 WHILE MID$($(0),CHAR,1)=UCASE$(MID$($(1),CHAR,1))
>90 REM Stop program if INPUT matches password else
>100 REM continue
main program begins here
.
.
.

4.28

STATEMENTS

ERRCHK - Miscellaneous
Function

Error check a string or a block of ABM memory

Syntax

ERRCHK ($(expr),n), K (number of characters), type
ERRCHK starting_address, ending_address, type
ERRCHK starting_address, K (number of bytes), type

See Also

SYSTEM

Usage

ERRCHK speeds building and receiving messages for most ASCII communication
protocols.
Error checking begins with the nth character of the specified string variable, $(expr). If the
optional expression n is not specified then ERRCHK begins with the first character in the
string. The number of characters in the string to ERRCHK must be specified.
Error check ABM memory by specifying the starting_address and either an ending_address
or the number of bytes to error check.
The maximum block size which can be error checked is 65535 bytes.
Type specifies the error checking method either 1, 2 or 3.
1 LRC, Longitudinal Redundancy Check (XOR of specified bytes)
2 CRC, Cyclic Redundancy Check (Polynomial = X^16+X^15+X^2+1)
3 Check Sum (Sum specified bytes / Divide by 256
/ Integer remainder is the Checksum)

The error check characters are stored in SYSTEM(5).
MSB = PICK(SYSTEM(5),H)
LSB = PICK(SYSTEM(5),L)

STATEMENTS

4.29

Example

100
110
112
120
130
140
150
160
170
180
210
220
230
240
250
2000
2020
2030
2040
2050
2060
2070
2080
2090
2110
2120

4.30

Check sum is a simple error checking method which is used by many devices. ERRCHK
type Check Sum is compatible with the OPTOMUX protocol.

REM This example turns ON and OFF all 16 channels of a 16
REM pt. output module in slot 1 (First I/O module=slot
REM 0). This program is compatible with the
REM 305-OPTO or 305-CPU.
SETPORT 1,9600,N,8,1
SETPORT 2,9600,N,8,1,N,M
STRING 2551,254
SETINPUT 1,1,0,0,100,10
REM Build and send power up reset command to Bridge CPU.
$(1)="01A" : GOSUB 2000
REM Build and send the command to turn ON 16 outputs
$(0)="01K" : GOSUB 2000
REM Build and send the string to turn OFF 16 outputs.
$(0)="01L" : GOSUB 2000
END
REM Send OPTOMUX command $(1) and get response $(2)
REM
REM Calculate checksum for command string
ERRCHK ($(1),1),K(LEN($(1))),3
REM Add the checksum to the command string
$(1)=$(1)+HEX$(DBY(25),1)
PRINT1 "COMMAND -> ",$(0)
PRINT2 ">";$(0);
INPUT2 $(2); : PRINT1 "RECEIVED -> ",$(2)
IF $(2)<>"A" THEN ERR=NOT(0) ELSE ERR=0
RETURN

STATEMENTS

Example

110
120
130
140
150
160
175
190
200
220
230
240
250
290
310
330
350
360
380
390
400
420
460
480
490
500
550
560

Longitudinal Redundancy Check is used in a large number of protocols because it is both
more reliable than a simple check sum and easy to implement. ERRCHK type LRC is
compatible with Automation Direct’s DirectNet, TI's HOSTLINK, GE's CCM2 and TI's
DYNAMIC RTU protocols.

REM The following example is used to calculate the LRC for
REM a HOSTLINK message that will write to registers
REM 400-461. The program requires a cable from Port 2
REM of the ASCII BASIC module to the 335 CPU.
REM
SETPORT 1,9600,N,8,1 : SETPORT 2,9600,N,8,1
STRING 2551,254 : DIM WT(100)
SETINPUT 1,1,0,0,100,10
Y=1 : REM Write a 1 to every register
FOR I=1 TO 50 : WT(I)=Y : NEXT I
REM Send an Enquire message to the 335 CPU
PRINT2 CHR$(78),CHR$(21H),CHR$(5);
INPUT2 ,$(1) : REM Get Enquire Ack.
$(0)=CHR$(1)+"01810041003200"+CHR$(17H) : REM Build header
ERRCHK ($(0),2),K(14),1 : REM Calculate header LRC
ASC($(0),17)=DBY(25) : REM Add LRC to the header string
PRINT2 USING(\17\),$(0); : REM Send the header out port 2
INPUT2 ,$(1)
IF ASC($(1),1)<>6 THEN GOTO 190
REM Build the Write data string
$(0)=CHR$(2)
FOR POS=2 TO 51 : ASC($(0),POS)=WT(POS-1) : NEXT POS
ASC($(0),POS)=3
ERRCHK ($(0),2),K(50),1 : REM Calculate LRC for write data
ASC($(0),POS+1)=DBY(25)
PRINT2 USING(\53\),$(0); : INPUT2 ,$(1)
IF ASC($(1),1)=6 THEN Y=Y+1 : REM Bump reg. if resp is ack
GOTO 220

STATEMENTS

4.31

Advanced

Cyclic Redundancy Check is the most reliable of the three error checking methods.
Normally the built in CRC-16 capabilities are used for communications. This is described in
the ADVANCED Chapter of the FACTS Extended BASIC Reference Manual. ERRCHK
type CRC is useful for verifying program and data memory integrity. ERRCHK is also used
to perform a CRC-16 calculation on a portion of a string after it has been INPUT.

Example

The following example searches a string for a start of message character. ERRCHK is
then used to calculate the CRC-16 characters of the remainder of the string

300
310
320
330
340
350
360
370
380
390
400
410
420
430

4.32

REM Build sample string with Start of Text char (STX)
REM
$(0)="0123456789"+CHR$(2)+"0123456789"
REM
REM Find where the STX character is located
REM
POS=INSTR($(0),CHR$(2))+1
REM
REM Calculate CRC-16 error code of string $(0) starting
REM with the number after the STX character
REM
ERRCHK ($(0),POS),K(10),2
PRINT1 "STRING WITH CRC -> ",MID$($(0),POS,10);
PRINT1 CHR$(DBY(25)),CHR$(DBY(26))

STATEMENTS

EXP - Mathematical Operator
Function

Raises the number "e" (2.7182818) to the power of the expression.

Syntax

EXP(expression)

Usage

Raises the number "e" (2.7182818) to the power of the expression.

Example

PRINT EXP(1)
2.7182818

PRINT EXP(LOG(2))
2

STATEMENTS

4.33

FOR-TO-STEP-NEXT - Flow Control
Function

Loop with automatic up or down incrementing index

Syntax

FOR index = starting index TO end index STEP index increment
NEXT index

Usage

Unlike many BASIC's, the FOR-TO-STEP-NEXT statements may be executed in both the
RUN and COMMAND mode.
These statements permit the user to execute the program lines between the FOR and
NEXT statements for a specified number of times. When the FOR statement is executed,
the starting index value is assigned to the index variable. When the NEXT statement is
executed the index increment value is added to index. index is then compared to the
ending index value. If index increment is positive and index is less than or equal to ending
index, then control will be transferred back to the statement following the FOR statement.
index will also continue to increment if index increment is negative and index is greater than
or equal to ending index.
The STEP statement is optional and if omitted, the index increment value will default to 1.
The index variable in the NEXT statement is optional and if omitted, it is assumed to be the
index variable used in the last FOR statement.
A maximum of 9 nested FOR NEXT lops may be executed.

Example

>10 FOR I=-3 TO 3
>20 PRINT1 I," ", : NEXT : PRINT1
>RUN
-3 -2 -1 0 1 2 3
READY
>
>10 FOR I=3 TO-3 STEP -2
>20 PRINT1 I," ", : NEXT I : PRINT1
>RUN
3 1 -1 -3
READY
>
Display a region of memory from the COMMAND mode
>FOR I=32768 TO 32768+5 : PHO. CBY(I) : NEXT
30H FFH FFH EEH 7FH FFH
Display the decimal number represented by the 9th through 12th bit positions of a binary
number.
>FOR I=9 TO 12 : P.2**I," ", : NEXT
512 1024 2048 4096

4.34

STATEMENTS

GO_PROGRAM or GOPRM - Flow Control
Function

Begin execution of a specified program

Syntax

GO_PROGRAM program number, line number

See Also

GOSUB, GOTO

Usage

program number identifies the stored program to begin executing and should be in the
range 0-255. GOPRM 0 specifies the program in data memory and GOPRM 1 specifies the
first program in the program memory file. If GOPRM program number specifies a number
greater than the number of programs stored in program memory, then the statement is
ignored. If the AUTOSTART reset mode is 2 or if the optional line number is specified then
all variables and strings are retained after a GOPRM statement.
GOPRM could be used to break a large programming task up into separate smaller
programs. Advantages to this programming approach are:
1)
2)
3)
4)
5)

Example

Smaller programs will execute quicker (less lines to scan).
Smaller programs will up load and down load faster (fast edits).
Smaller programs are easier to document and maintain.
Program variables can be local or shared (global).
Some of the smaller programs could be used in several applications.

02 REM Main program in data memory, PROGRAM = 0
04 REM REG program will input presets and set registers
10 REG = 3
20 ALRM = 5 : REM ALRM program will display alarms
22 REM PRO program will display process parameters and
24 REM current presets
30 PRO = 2
...
1000 IF SETUP THEN GO_PROGRAM REG
...
2000 IF ALARM THEN GO_PROGRAM ALRM
...
3000 IF DISPLAY THEN GO_PROGRAM PRO

STATEMENTS

4.35

Example

GO_PROGRAM accesses "subroutines" in other programs

PRM 0
READY
>list
1000 REM Demonstrate GO_PROGRAM "subroutines"
1010 REM
1020 REM User help screens are stored in a SAVEd program.
1030 REM This reduces the size of the main program.
1040 REM Maintenance of both programs is simplified.
1050 REM
1060 REM Initialize the program names to the program location
1070 REM
1080 HELP_PROG=3
1090 MAIN_PROG=0
1100 REM
1110 REM Initialize the help "subroutine" line numbers
1120 REM
1130 SETUP_HELP=2000
1140 DEBUG_HELP=4000
1150 CAL_HELP=6000
1160 REM
1170 REM Main Program Starts Here
1180 REM
1190 RESUME=SYSTEM(8) : GO_PROGRAM HELP_PROG,SETUP_HELP
1200 PRINT2 "Setup Help Completed"
1210 RESUME=SYSTEM(8) : GO_PROGRAM HELP_PROG,DEBUG_HELP
1220 PRINT2 "Debug Help Completed"
1230 RESUME=SYSTEM(8) : GO_PROGRAM HELP_PROG,CAL_HELP
1240 PRINT2 "Calibration Help Completed"
1250 END
PRM 3
READY
>list
2000 PRINT2 "Begin Setup Help"
3999 GO_PROGRAM MAIN_PROG,RESUME
4000 PRINT2 "Begin Debug Help"
5999 GO_PROGRAM MAIN_PROG,RESUME
6000 PRINT2 "Begin Calibration Help"
7999 GO_PROGRAM MAIN_PROG,RESUME
PRM 0
READY
>run
Begin Setup Help
Setup Help Completed
Begin Debug Help
Debug Help Completed
Begin Calibration Help
Calibration Help Completed

4.36

STATEMENTS

GOSUB - Flow Control
Function

Execute a subroutine

Syntax

GOSUB line number

See Also

GO_PROGRAM, GOTO, RETURN

Usage

GOSUB causes BASIC to transfer control directly to the program line specified by line
number. When the RETURN statement is encountered in the subroutine, BASIC
returns program control to the statement immediately following GOSUB.

Example 1

SUBROUTINE
>10 FOR I=1 TO 5
>20 GOSUB 50
>30 NEXT I
>40 END
>50 PRINT1 I,SPC(1),
>60 RETURN
>RUN
12345
READY
>

Example 2

NESTED SUBROUTINE
>10 FOR I=1 TO 5 : GOSUB 50
>20 NEXT I : END
>30 A=I*I
>40 RETURN
>50 GOSUB 30 : PRINT1 I,SPC(1),A,SPC(1)
>60 RETURN
>RUN
1 1 2 4 3 9 4 16 5 25
READY
>

STATEMENTS

4.37

Example 3

Premature exit from a subroutine without CLEAR S
>10 GOSUB 20
>20 I=I+1 : IF I=100 THEN END
>30 GOTO 10
>RUN
ERROR: CONTROL STACK OVERFLOW IN LINE 20
READY
>P.I
52

Example 4

Premature exit from a subroutine using CLEAR S
>10 GOSUB 20
>20 I=I+1 : IF I=100 THEN END
>30 CLEAR S : GOTO 10
>RUN
READY
>P.I
100

4.38

STATEMENTS

GOTO - Flow Control
Function

Transfers execution to the specified program line number

Syntax

GOTO line number

See Also

GO_PROGRAM, GOSUB

Usage

The GOTO statement will cause BASIC to transfer control directly to the program line
specified by line number. If the line number does not exist, the message, ERROR:
INVALID LINE NUMBER will be generated.
If the GOTO statement is executed in the COMMAND mode, BASIC does not perform the
equivalent to the CLEAR statement. Instead control is transferred to the specified program
line with the values of all variables and the status of interrupts unchanged.
If GOTO is executed in the COMMAND mode after a line has been edited, all variables are
set to zero and all interrupts are disabled.

Example

10
20
30
40
100

DEBUG=NOT(0)
IF NOT(DEBUG) THEN GOTO 100
PRINT1 "Debug enabled, type CONT to resume"
STOP
...

STATEMENTS

4.39

HEX$ - String Operator
Function

Converts an integer number into its ASCII hex string equivalent

Syntax

string variable = HEX$(expression, 1)

See Also

OCTHEX$, PH0., PH1., STR$

Usage

expression can range from 0 to 65,535. The 1 is optional and if included causes HEX$ to
suppress leading zeros.

Example

>PRINT1 HEX$(10)
A
>PRINT1 HEX$(65535)
FFFF
>P. HEX$(800)
0320
>P. HEX$(10)
000A

HEX$ with leading zeros suppressed.
>P. HEX$(800,1)
320
>P. HEX$(10,1)
A

Related To convert an ASCII hex string into an integer number, add a "0" at the beginning of
the string and a "H" to the end of the string and use VAL.
Decimal equivalent of a hexadecimal string:
P. VAL("0"+"FFFF"+"H")
65535

4.40

STATEMENTS

IDLE - Interrupts
Function

Suspend program execution until interrupt

Syntax

IDLE

See Also

ONPORT, ONTIME, RETI

Usage

The IDLE statements forces BASIC to halt program execution until either an ONTIME or
ONPORT specified interrupt is generated. Once the interrupt occurs the interrupt routine is
executed and program execution continues with the statement immediately following IDLE.
Note that if BASIC enters an interrupt routine from IDLE and the user executes a CLEAR I
statement in the interrupt routine, the user must re-enable the interrupt before exiting from
the routine. If this is not done then BASIC will IDLE until reset.
If necessary, IDLE can be used to decrease interrupt response time.

STATEMENTS

4.41

IF-THEN-ELSE - Flow Control
Function

Conditional execution of statements

Syntax

IF relational expression THEN statement(s) ELSE statement(s)

Usage

If relational expression does not equal zero (TRUE), the statement(s) following THEN are
executed. If relational expression is zero (FALSE) then the statement(s) following ELSE
are executed. If ELSE is omitted, execution continues with the next program line. Multiple
statement(s) separated by a colon (:) may be executed after the THEN (IF TRUE) or after
ELSE (IF FALSE).

Example

>10 INPUT1 A
>20 IF A<=2 PRINT1 "FIN" : GOTO 30 ELSE GOTO 22
>22 PRINT1 A/2, SPC(2), : A=A/2: GOTO 20
>30 END
>RUN
?8
4 2 FIN
The GOTO keyword is optional when used immediately after THEN or ELSE.
>10 IF B*B>C THEN GOTO 50 ELSE GOTO 100
- OR >10 IF B*B >C THEN 50 ELSE 100
The THEN keyword can be replaced by any valid BASIC statement. The following
examples yield the same result.
>10 IF I=2 THEN 50 ELSE PRINT1 I
>10 IF I=2 GOTO 50 ELSE PRINT1 I
>10 IF I=2 THEN GOTO 50 ELSE PRINT1 I

4.42

STATEMENTS

INKEY$ - String Operator
Function

Inputs a single character without echoing from the port input buffer

Syntax

string variable = INKEY$ port

See Also

INPUT

Usage

INKEY$ removes the first character in the input buffer specified by port and assigns it to
string variable.
INKEY$ returns a carriage return (ASCII 13) if the input buffer is empty (INLENport = 0). To
distinguish between an empty buffer and an actual carriage return character, simply assure
that there are characters waiting in the input buffer before executing INKEY$.
INLENport
can be used to check for characters waiting in the buffer.

Example

1000
1010
1015
1020
1022
1025
1026
1027
1028
1030
1040
1050
1060
1070
1080
1082
1085
1090

REM INKEY$ example
REM Port 1 TXD looped back to RXD
REM
SETPORT 1,9600,N,8,1,S,M
REM
REM Add a comma at end of PRINT statement to
REM suppress CR LF
REM CR LF not suppressed in this example
REM
PRINT1 CHR$(0),CHR$(13),"a",CHR$(13),CHR$(0),"b"
PRINT2 INLEN1," characters in input buffer"
FOR I=1 TO INLEN1
$(I)=INKEY$1
IF ASC($(I),1)=0 THEN PRINT2 "Null=",I:GOTO 1090
IF ASC($(I),1)=13 THEN PRINT2 "CR=",I:GOTO 1090
IF ASC($(I),1)=10 THEN PRINT2 "LF=",I:GOTO 1090
PRINT2 $(I)," = ",I
NEXT

PRM 0
READY
>RUN
8 characters in input buffer
Null=1
CR=2
a=3
CR=4
Null=5
b=6
CR=7
LF=8
PRM 0
READY
>

STATEMENTS

4.43

INLEN - Input/Output
Function

INLEN function returns number of characters waiting in an input buffer INLEN statement
clears the specified type-a-head input buffer

Syntax

character count = INLEN port number
INLEN port number = 0

See Also

INPLEN, INPUT

Usage

port number identifies the serial communication port (1,2,or 3 depending on which module
is used). character count is a variable which contains the number of characters in the
specified communication port type-a-head input buffer. If the 255 character type-a-head
buffer is filled, all additional characters except for Control-C and XON/XOFF
(Control-Q/Control-S) are ignored and character count will continue to return 255.
Setting INLEN port number to zero clears the input buffer.

Example

4.44

10
11
20
30
40
50
60
70
100

REM Wait for 10 characters in the input
REM buffer
IF INLEN < 10 THEN GOTO 20
INPUT2, $(0)
IF INSTR($(0),"RA1")=1 THEN GOTO 100
REM Transmission not for this remote address
INLEN2 = 0 : REM Flush input buffer
GOTO 20
REM Process rest of input buffer
...

STATEMENTS

INPLEN - Input/Output
Function

Returns the number of characters INPUT

Syntax

character count = INPLEN

See Also

INLEN, INPUT, SETINPUT

Usage

INPLEN returns the number of characters received by the last INPUT statement executed.
INPLEN is only slightly faster then LEN (~1 msec). INPLEN is useful when INPUTing
strings of 8-bit ASCII characters or binary data which may include an ASCII 13 (LEN will
stop counting characters when it encounters a carriage return character, ASCII 13).
If the only character INPUT is the terminating character as defined by the SETINPUT
statement then INPLEN=0.

Example

10 STRING 2551,254 : REM 10, 254 char. strings
20 INPUT $(0)
30 IF INPLEN > 2 THEN PRINT1 INPLEN
>RUN
?STRING LENGTH = ?
17
10 INPUT A
20 PRINT1 INPLEN : REM Print length of last INPUT
>RUN
?135.6
5

STATEMENTS

4.45

INPUT - Input/Output
Function

Loads variables with data from Port (1, 2 or 3 depending on which module is used)

Syntax

INPUTn prompt string, variable, variable, ...

See also

INKEY$, SETINPUT, SETPORT, INPLEN, INLEN

Usage

n specifies the port number containing the data or characters for the variable list. If more
than one numeric variable is prompted for in a single INPUT statement, then each number
must be separated by a comma (,). By default, a carriage return character signals the end
of a list of numeric and string data entry.
prompt string is an optional string constant. If prompt string is omitted, a question mark (?)
will be sent to prompt for data. If a comma is placed before the first variable following
INPUT then the question mark prompt will not be sent.
INPUT operation is controlled by the SETINPUT statement. INPUT and SETINPUT can
perform more functions than the statements INPUT$, INPUT #, and LINE INPUT found in
other BASICs. Unique to FACTS Extended BASIC is the ability to input without echoing,
the capability to redefine the INPUT termination character (eg. = instead of cr) and to
control the time which INPUT will wait for data (see SETINPUT).
A string variable list functions the same as multiple INPUT statements, however, INPLEN
will only return the number of characters INPUT in the last string variable.
If a numeric variable list is used then each number entered must be separated by a comma
(,). A carriage return must be entered to signal the end of the numeric variable list. This
method of data entry is not recommended for most applications.

Example

>10 INPUT NUM, D1 : REM Enter a return after each #
>20 INPUT, D
: REM Comma suppressed ? prompt
>30 SETINPUT 1 : REM Enable no-echo
>40 INPUT, $(0)
>30 PRINT NUM, SPC(1), D1, SPC(1), D, SPC(2), $(0)
>RUN
?10, 30
5
10 30 5
READY
>

4.46

STATEMENTS

Input Error Handling
If data is not INPUT for every numeric variable of an input list then the variables in the list are not changed.
If an alphanumeric character is entered for a numeric variable then the message TRY AGAIN is generated.
When more numeric data is entered than there are variables in the INPUT list, the message EXTRA
IGNORED is generated and all the data up to the next INPUT terminating character (usually a carriage
return) is ignored.
Because of the above limitations it is nearly always best to input numeric data into a string and then convert
the string into a number.
Example

REM Could get stuck in endless loop if data not input correctly
10 INPUT1 "ENTER TIME (HR,MIN,SEC)",HR,MIN,SEC
20 PRINT1 "CURRENT TIME IS",HR,":",MIN,":",SEC
RUN
ENTER TIME (HR,MIN,SEC)
10 30 47
INPUT must be a number, TRY AGAIN
ENTER TIME (HR,MIN,SEC)
10,30,47
CURRENT TIME IS 10:30:47
REM Better method is to always input data into a string
10 TRYS=0
15 INPUT1 "Enter time (Hour:Minutes:Seconds)",$(0)
20 TRYS = TRYS + 1
25 HR = VAL($(0))
30 IF HR>=0.AND.HR<=23 THEN GOTO 50
35 PRINT "Hour must be <= 23"
40 IF TRYS = 3 THEN GOTO 100 : REM Skip if operator is a clod
45 GOTO 15
50 MIN_POS = INSTR($(0),":")+1
55 $(1) = MID$($(0),MIN_POS)
60 MIN = VAL($(1))
70 SEC_POS = INSTR($(1),":")+1
80 SEC = VAL(MID$($(0),SEC_POS))
90 PRINT1 "Current time is",HR,":",MIN,":",SEC
95 TIME$=STR$(HR)+":"+STR$(MIN)":"+STR$(SEC)
100 . . .

STATEMENTS

4.47

Special

When more numeric data is present than there are variables in the INPUT list then the
message EXTRA IGNORED is generated and all the data up to the next INPUT terminating
character (usually a carriage return) is ignored.

Example

10 INPUT A, B
>RUN
?234, 42, 10
EXTRA IGNORED

Non-Standard ASCII Character Input
Control characters (ASCII 0 - 31) are by default echoed but not loaded into variables. To INPUT control
characters use SETINPUT to set no-edit ON.
To INPUT special 8-bit codes which are not a part of the standard ASCII character set (ASCII 128 to 255)
use SETPORT to select 8 data bits.
Example

REM Turn echo ON and control character input ON
10 NO_ED = 1
20 NO_ECHO = 0
30 SETINPUT NO_ECHO, NO_ED
40 GOSUB 100
45 REM Disable ctrl char. input, enable input edit
50 SETINPUT NO_ECHO, 0
60 PRINT1 : GOSUB 100
70 END
100 INPUT "Enter , Back_space, 1234",$(0)
110 PRINT1 "Length of string input = ",INPLEN
120 PRINT1 "First character of string is ",
121 PRINT1 LEFT$($(0),1)
130 RETURN
RUN
Enter , Back_space, 1234
1234
Length of string input = 6
First character of string is (terminal beeps due to BELL character)
Enter , Back_space, 1234
1234
Length of string input = 4
First character of string is 1

4.48

STATEMENTS

Special Case of Control Character Input
A special case of control character input exists when the ASCII control characters  (NULL, ASCII =
0) and  (CR,ASCII = 13) represent data. These characters are used as delimiters by all of the
string handling statements except ASC. Therefore, only the ASC function can by used to process strings
containing the NULL and CR characters as data.
Example

10
11
20
30
31
40
41
50
60
70
71
75
80
90
100

NO_ED = 1
REM Enable no-edit (input control characters)
SETINPUT 0, NO_ED, 0, 5, 10000, 2000
PRINT1 "Enter ",CHR$(34),"12  ",
PRINT1 "3",CHR$(34)
PRINT1 "You have 5 seconds to enter the first"
PRINT1 "character"
INPUT1 ,$(0)
PRINT1 "Length of input = ",INPLEN
PRINT1 "LEN statement says length of string = ",
PRINT1 LEN($(0))
PRINT1 "ASCII values for all characters INPUT: ",
FOR POS = 1 TO INPLEN
PRINT ASC($(0),POS),SPC(2),
NEXT POS

>RUN
Enter "12   3"
You have 5 seconds to enter the first character
3
Length of input = 5
Length of string = 2
ASCII values for all characters INPUT: 49 50 13 0 51

STATEMENTS

4.49

INSTR - String Operator
Function

INSTR searches a string for a pattern string

Syntax

position = INSTR(search string expression, pattern string expression)

Usage

INSTR returns the position of pattern string in search string. If pattern string isn't found in
search string then position will be 0. If either string has a length of 0 then INSTR returns a
0. Both strings may be string expressions.

Example

10
20
30
40
50
60

STRING 2551,254
INPUT "Enter string to search ",$(0)
$(1) = "PassWord"
POS = INSTR($(0),$(1))
IF POS = 0 THEN PRINT1 "ACCESS DENIED" : END
PRINT1 "Password is correct"

>RUN
Enter string to search PASSWORD
ACCESS DENIED
READY
>RUN
Enter string to search PassWord
Password is correct

10
20
30
40
50

STRING 2551,254
$(0)="MONTUEWEDTHURFRISATSUN"
INPUT "Please enter the day of the week? ",$(1)
IF INSTR($(0),$(1))=0 THEN GOTO 30
PRINT1 "This day is position ",INSTR($(0),$(1))

>RUN
Please enter the day of the week?
WED
This day is position 7
READY
>P. INSTR($(0),"TUE")
4

4.50

STATEMENTS

INT - Mathematical Operator
Function

Returns the integer portion of expression.

Syntax

INT(expression)

Usage

Returns the integer portion of expression.

Example

PRINT INT(3.7)
3

PRINT INT(100.876)
100

STATEMENTS

4.51

LCASE$ - String Operator
Function

LCASE$ returns a string consisting of lowercase characters only

Syntax

string variable = LCASE$(string expression)

See Also

UCASE$

Usage

LCASE$ returns a string equal to string expression except that all uppercase alphabetic
characters in string expression are converted to lowercase.

Example

>10 PRINT1 "Print-out year to date summary report?"
>11 INPUT1 ,"(y/n) ",$(0)
>20 IF LCASE$($(0))="y" THEN GOTO 100
>30 PRINT1 LCASE$("PRINT-OUT CANCELED!")
>40 END
>100 REM Print-out year to date summary report
.
.
.
>RUN
Print-out year to date summary report? (y/n) N
print-out canceled!
READY
>

4.52

STATEMENTS

LEFT$ - String Operator
Function

LEFT$ returns an n character string beginning with the first character

Syntax

string variable = LEFT$(string expression, n)

See Also

MID$, REVERSE$, RIGHT$

Usage

n is an expression and specifies the number of characters of string expression to be
assigned to string variable. n must be in the range 0 to 254. LEFT$ returns a string
consisting of the first through the nth character of string expression. If n is greater than or
equal to the length of string expression then all of string expression is assigned to string
variable.. If n is 0 then LEFT$ returns the null string.

Example

>PRINT1 LEFT$("CAN'T DO",3);" DO"
CAN DO
READY
>

STATEMENTS

4.53

LEN - String Operator
Function

LEN returns the number of characters in a string

Syntax

LEN (string expression)

Usage

LEN returns the number of characters in string expression, 0 to 254.

Example

10 STRING 2551,254 : REM Allocate 10, max. length
20 INPUT "Please enter a string ",$(0)
30 PRINT1 "The length of the string is ",LEN($(0)
>RUN
Please enter a string OK, A STRING
The length of the string is 12
READY
>$(0)="ABCDEFGHIJK"
>P. LEN( LEFT$( $(0), INSTR( $(0),"E")))
5
READY
>

4.54

STATEMENTS

LET - Miscellaneous
Function

LET assigns the value of an expression to a variable

Syntax

LET variable = expression

Usage

expression is a numeric or string expression whose value is assigned to variable. The key
word LET is optional.

Example

10
15
20
30
40
50
60

STRING 2551,254
A = 123.4 * 10
$(0) = "ONE"
$(1) = "TWO"
$(2) = $(0) + $(1) + "THREE"
$(3) = CHR$(38) + "FOUR"
PRINT1 CHR$(34)+$(2)+$(3)+CHR$(34)+" = ",A

>RUN
"ONETWOTHREE&FOUR" = 1234
The following statement is also valid.
60 PRINT1 CHR$(34),$(2),$(3),CHR$(34)," = ",A
10 STRING 2551,254
20 FOR COUNT = 1 TO 50
30 $(0) = $(0) + "*"
40 NEXT COUNT
50 PRINT1 $(0)
60 PRINT1 : PRINT1 SPC(21),"HEADER"
70 PRINT1 : PRINT1 $(0)
>RUN
*************************************************
HEADER
*************************************************

STATEMENTS

4.55

LOAD@ or LD@ - Advanced Operator
Function

Retrieves a six byte floating point number from memory

Syntax

LOAD@ address

See Also

BYTE, STORE@, WORD

Usage

LOAD@ allows the user to retrieve floating point numbers stored in data memory with the
STORE@ statement. address is the highest memory location where the number is stored.
Execution of the LD@ statement places the number on the argument stack from which
BASIC can assign it to a variable with the POP statement.
Since a floating point number requires six bytes of storage, the statement ST@ 32767
would save the last number PUSHed onto the stack in locations 32767, 32766, 32765,
32764, 32763, and 32762.
Because BASIC stores strings and non-dimensional variables in memory from MTOP down,
the user must set up a portion of free memory to be used by the ST@ and LD@
statements.

4.56

STATEMENTS

Example

Allocate a protected region of memory for variable storage
>MTOP=28000 : REM Set and store the new MTOP value
>AUTOSTART mode, program, baud, 28000
PUSH 1234.56 Place number to be stored on stack
>ST@ 28000+7 Store the number in data memory above
MTOP
>LD@ 28007

Retrieve (load) the stored number

>POP NUM

Assign the retrieved number to a variable

>PRINT NUM
1234.56
>05 REM Store floating point numbers in data memory
>10 DIM D(3) : D(1) = 907.701
>20 D(2) = 3256
>30 D(3) = 39.25E+9
>40 INDEX = 1
>50 FOR MEM = 28007 TO 28007+2*6 STEP 6
>51 REM MEM points to the value
>60 PUSH D(INDEX)
>70 ST@ MEM : REM Store the value
>80 INDEX = INDEX + 1
>90 NEXT MEM
>RUN
The three values are now stored in memory
>105 REM Re-load the numbers stored above
>110 FOR MEM = 28007 TO 28007+2*6 STEP 6
>115 REM MEM points to the numbers
>120 LD@ MEM
>130 POP NUM
>140 PRINT1 NUM
>150 NEXT MEM
>RUN
907.701
3256
3.925 E+10

STATEMENTS

4.57

LOCKOUT - Flow Control
Function

Force program execution

Syntax

LOCKOUT = true or false

See Also

BREAK

Usage

true or false is an expression which when equal to 0 disables LOCKOUT. If true or false is
non-zero then BASIC will not return to the command mode. If a  is entered, an
END or STOP statement is executed, or an error is generated then BASIC will restart the
module based on the currently stored AUTOSTART parameters.
LOCKOUT is used to provide program and variable data security by preventing access to
unauthorized personnel. If LOCKOUT is enabled, then command mode can only be
returned to by removing the module and moving the CLR ALL / AUTO jumper on the board
to the position that disables the AUTOSTART function and clears all data memory after a
reset (See the module specific user's manual). LOCKOUT could also be enabled and
disabled in the program with a password as shown in the example for the END statement.
LOCKOUT is also used to safely recover from BASIC program anomalies and unexpected
input conditions or external events.

Example

05
10
20
30
40

REM Recover from an un-trapped error condition
LOCKOUT = NOT(0) : REM Force program execution
INPUT1 "Code to send to the PLC CPU"CODE
DUMMY = TRANSFER (CODE)
LOCKOUT = 0 : REM Disable LOCKOUT

>RUN
Code to send to the PLC CPU
?300
ERROR: BAD ARGUMENT - IN LINE 30
30 DUMMY=TRANSFER(CODE)
-----------------------X
READY
Code to send to the PLC CPU
?255

4.58

STATEMENTS

LOF - Memory Management
Function

Returns the size of the currently selected program

Syntax

LOF

Usage

LOF tells the user how many bytes of memory the currently selected program occupies.
LOF can be used in both the RUN and COMMAND modes.
LOF can be used to compare the size of the program being edited with the available free
space in the program storage file.
LOF can be used to determine the number of bytes of RAM memory that is available for
string and numerical variable storage. LOF does not account for the number of bytes of
memory currently used for strings and numerical storage.

Example

>PRM 0
>P. 32767 - LOF - 1279
28345
READY
>
32767 = Top of data memory (MTOP)
1279 = Data memory used by the interpreter

STATEMENTS

4.59

LOG - Mathematical Operator
Function

Returns the natural logarithm of expression

Syntax

LOG(expression)

Usage

Returns the natural logarithm of expression. expression must be greater than 0. This
calculation is carried out to 7 significant digits.

Example

PRINT LOG(12)
2.484906

4.60

PRINT LOG(EXP(1))
1

STATEMENTS

MID$ - String Operator
Function

MID$ returns an m character string beginning with the nth character

Syntax

string variable = MID$(string expression, n, m)

See Also

LEFT$, REVERSE$, RIGHT$

Usage

MID$ returns a string beginning with the nth character of string expression. m is an
expression and specifies the number of characters of string expression to be assigned to
string variable.. Both n and m must be in the range 0 to 254. If m is omitted or there are
fewer than m characters to the right of the nth character of string expression, then all of the
remaining characters of string expression are assigned to string variable. If n is 0 or greater
than the length of string expression, then MID$ returns the null string.

Example

>10 STRING 2551,254 : REM Allocate 10 max length
>20 $(0)="1JAN2FEB3MAR4APR5MAY6JUN7JUL8AUG9SEP10OCT11"
>21 $(0)=$(0)+"NOV12DEC13"
>30 MONTH = 10
>40 START = INSTR($(0),STR$(MONTH))+1
>50 STP = INSTR($(0),STR$(MONTH+1))
>60 PRINT1 "The month is ",
>61 PRINT1 MID$($(0),START,STP-START)
>RUN
The month is OCT
READY
>

STATEMENTS

4.61

MTOP - Advanced Operator
Function

Limit memory available to the BASIC interpreter

Syntax

variable = MTOP
MTOP = address

Usage

After reset, BASIC normally assigns a value to MTOP by reading the value stored at the
beginning of program memory by AUTOSTART.
See the module specific user's manual for the MTOP default.
BASIC will not use any variable memory beyond the address assigned to MTOP.
If address is greater than the last valid memory address, then a MEMORY ALLOCATION
error will be generated.
If MTOP is used in a program it should be the first statement in the program because
BASIC stores strings and non-dimensional variables from MTOP down.

Example

>PRINT MTOP
32767
>MTOP=16383

(default value)
(assign new value)

>PRINT MTOP
16383
REM Store new MTOP value for next power-up
>AUTOSTART mode, program, baud, 16383

4.62

STATEMENTS

OCTHEX$ - String Operator
Function

Converts an octal (base 8) number into its ASCII hex string equivalent

Syntax

string variable = OCTHEX$(expression, 1)

See Also

HEX$, PH0., PH1.

Usage

expression can range from 0 to 177777. The 1 is optional and if included causes OCTHEX$
to suppress leading zeros.

Example

PRINT1 OCTHEX$(10)
0008
PRINT1 OCTHEX$(177777)
FFFF
P. OCTHEX$(7777+1) : REM LAST USER V-MEMORY LOCATION
1000
OCTHEX$ with leading zeros suppressed.
P. OCTHEX$(700,1)
1C0
P. OCTHEX$(10,1)
8

Related

To convert an ASCII hex string into a decimal number, add a "0" at the beginning of the
string and a "H" to the end of the string and use VAL.
P. VAL("0"+OCTHEX$(7777+1)+"H")
4096

Advanced

Use this command to convert a known V-Memory octal address into it's hexadecimal
equivalent. This statement is useful for look-up tables and other types of "calculated" PLC
memory accesses.
Assume an operator provides the starting V-Memory address of a look-up table. This value
is 1400. The equivalent hexadecimal address is
STRADDR = VAL("0"+OCTHEX$(1400+1)+"H")
The value of the 10th element in the specified look-up table is
TBL(9) = S405_(STRADDR+9)
The 10th element in the table is at V-Memory octal address, V1411.

STATEMENTS

4.63

ON-GOSUB - Flow Control
Function

Call subroutine beginning at one of several possible line numbers

Syntax

ON expression GOSUB line number, line number

See Also

ON GOTO

Usage

expression selects the beginning line number for a subroutine call. If expression evaluates
to zero then execution continues at the program line specified by the first line number in
the list. After a RETURN statement is executed in the subroutine, execution resumes
with the statement following the ON-GOSUB.
If the value of expression is greater than or equal to the number of line numbers in the list,
then the BAD SYNTAX error message will be generated.

Example

4.64

10 IF (MODEL<0).OR.(MODEL>3) THEN GOSUB 100
20 ON MODEL GOSUB 1000, 2000, 3000, 4000
...
100 REM Subroutine to enter model number
150 RETURN
...
1000 REM Build array tables for manufacturing MODEL=0
1999 RETURN
...
2000 REM Build array tables for testing MODEL=1
2999 RETURN
...
3000 REM Build array tables for monitoring MODEL=2
3999 RETURN
...
4000 REM Build array tables for building MODEL=3
4999 RETURN
...

STATEMENTS

ON-GOTO - Flow Control
Function

Jump to one of several possible line numbers

Syntax

ON expression GOTO line number, line number

See Also

ON GOSUB

Usage

expression selects the program line number where execution will continue. If expression
evaluates to zero then execution continues at the program line specified by the first line
number in the list.
If the value of expression is greater than or equal to the number of line numbers in the list,
then the BAD SYNTAX error message will be generated.

Example

05 REM Display messages on single line display
10 FOR I = 1 TO 4
15 PRINT2 $(0) : REM Clear display and scroll
20 ON I-1 GOTO 100, 110, 120, 130
30 NEXT I
40 END
100 PRINT2 "*** Caution ***"
105 DELAY 2 : GOTO 30
110 PRINT2 "Machine Automatic Cycle Starting Now"
115 DELAY 4 : GOTO 30
120 PRINT2 "Processing beginning on Model ",$(1)
125 DELAY 3 + LEN($(1))/10 : GOTO 30
130 PRINT2 "Depress RESET push button to cancel"
140 DELAY 3.5 : GOTO 30

STATEMENTS

4.65

ONERR - Flow Control
Function

Specify program line to go to if an arithmetic error occurs

Syntax

ONERR line number

See Also

SYSTEM

Usage

If an arithmetic error occurs after the ONERR statement is executed, BASIC will pass
control to the program line number specified in the last ONERR statement. The ONERR
statement only traps arithmetic errors. The user may examine data memory location
(BYTE) 257 (101H) in an error handling routine to determine which error condition occurred.
ONERR Code Table
Error Condition
DIVIDE BY ZERO
ARITH. OVERFLOW
ARITH. UNDERFLOW
BAD ARGUMENT

Example

4.66

Error Code
10
20
30
40

>10 ONERR 100:I=4
>20 PRINT1 100/I,
>30 I=I-2
>40 GOTO 20
>100 IF BYTE(257)=10 THEN PRINT1 "DIVIDE BY ZERO ERROR"
>110 IF BYTE(257)=20 THEN PRINT1 "ARITHMETIC OVERFLOW"
>120 IF BYTE(257)=30 THEN PRINT1 "ARITHMETIC UNDERFLOW"
>130 IF BYTE(257)=40 THEN PRINT1 "BAD ARGUMENT ERROR"
>140 END
>RUN
25
50
DIVIDE BY ZERO ERROR

STATEMENTS

ONPORT - Interrupt
Function

Specifies the beginning line number for serial port event handling

Syntax

ONPORTn, line number

See Also

IDLE, RETI

Usage

ONPORT enables interruption of normal BASIC program flow following reception of a
character at the serial port specified by n. line number is the beginning program line for the
ONPORT interrupt handling subroutine. The ONPORT statement will enable only a single
BASIC program interrupt to occur.
Future events on the specified serial port are not trapped (interrupt enabled) until another
ONPORT statement is executed. Therefore, another ONPORT statement would normally
be included in the interrupt subroutine if serial port event trapping is to continue.
A line number of 0 to will disable the specified ONPORT interrupt.
An ONPORT enabled interrupt causes program execution to continue at line number
following completion of the current statement.
NOTE: ONPORT does not wait for the completion of the DELAY or IDLE statements before
passing control to the ONPORT interrupt routine.
After a RETI statement is executed in the interrupt handling subroutine, execution resumes
with the statement following the last statement executed before the interrupt occurred.

Example

10
20
30
40
50
60
70

REM Main program loop
REM Here we get PLC CPU Logic status.
REM If Logic status indicates a cycle fault then
REM we get the I/O status to determine the cause
REM and display it (at Port 1). Otherwise display
REM process parameters.
ONPORT2, 1000 : REM Trap input from Bar Code
...
500 GOTO 10 : REM End of main program loop
...
1000 REM Process Bar Code data string
...
1400 ONPORT2, 1000 : REM Monitoring the bar code reader
1410 RETI
The ONPORT statement may be used for both speed and convenience. Application less
sensitive to response time could also regularly check to see if there are any characters
waiting in the input buffer using the INLEN statement (IF INLEN2>0 THEN GOSUB ...).

STATEMENTS

4.67

ONTIME - Interrupt
Function

Time based interrupt of normal program flow

Syntax

ONTIME set time, line number

See Also

IDLE, RETI, SYSTEM, TIME

Usage

ONTIME enables interruption of normal BASIC program flow when the value of TIME is
greater than or equal to the value of set time. set time may be any value from .005 to
65535.995 seconds. line number is the beginning program line for the ONTIME interrupt
handling subroutine. RETI signals the end of the subroutine.
The ONTIME statement will enable only a single BASIC program interrupt to occur. Future
TIME based interrupts will not occur until another ONTIME statement is executed.
Therefore, another ONTIME statement would normally be included in the interrupt
subroutine.
A line number of 0 to will disable the ONTIME interrupt.
An ONTIME enabled interrupt causes program execution to continue at the specified line
number following completion of the current statement. After a RETI statement is executed
in the interrupt handling subroutine, execution resumes with the statement following the last
statement executed before the interrupt occurred.

Example

>10 TIME=0
>20 ONTIME 2, 100
>30 INPUT "A NUMBER"X
>40 PRINT1 X," ",TIME
>50 END
>100 PRINT1 "INTERRUPT"
>110 RETI
>RUN
A NUMBER
?10
(WAIT AT LEAST 2 SECONDS)
INTERRUPT
10 3.945
>10 TIME=0 : DBY(71)=0 : REM Zero timer
>20 CLOCK 1 : REM Start the timer
>15 ONTIME 1, 100 : REM Enable interrupt to line 100
>20 DO
>30 REM nothing in this example
>40 UNTIL DOOMSDAY
>50 END
>100 PRINT1 "PROGRAM INTERRUPTED PERIODICALLY"
>110 REM Next interrupt to occur 3 seconds later
>115 IF TIME>65000 THEN TIME=TIME-65000
>120 ONTIME TIME+3, 100
>130 RETI

4.68

STATEMENTS

Interrupt Priority - ONPORT and ONTIME
FACTS Extended BASIC establishes a higher priority for the ONTIME interrupt than it does for the ONPORT
interrupts. In other words, an ONTIME interrupt can interrupt an ONPORT interrupt. This priority was
established so that critical time based tasks such as maintaining a PID control can be accomplished.
To prevent an ONTIME interrupt from occurring during an ONPORT interrupt subroutine, temporarily stop the
software timer.
Example

Holding off ONTIME interrupts
10 TIME = 0 : DBY(71)=0 : REM Zero the timer
100 ONPORT1, 1000 :
REM Handle operator input
110 ONTIME 2, 2000 : REM Display TIME$/DATE$
200
REM Main program loop
...
500 GOTO 200 :
REM End Main program loop
1000 ONTIME 0 :
REM Disable the ONTIME Interrupt
1010
REM Process operator input
...
1400 IF INLEN1>0 THEN GOTO 1010 : REM Loop if more
1410 ONPORT1, 1000 :
REM Enable next ONPORT int.
1510 ONTIME 2, 2000 : REM Reenable the ONTIME int.
1520 RETI : REM End of operator input subroutine
2000 PRINT @(1,50),DATE$,SPC(2),TIME$
2010 TIME=0 : DBY(71)=0 :
REM Zero the timer
2020 ONTIME 2, 2000 : REM Enable next ONTIME
2030 RETI : REM End of ONTIME interrupt subroutine

STATEMENTS

4.69

PH0. and PH1. - Input/Output
Function

Prints 2 and 4 digit hexadecimal numbers

Syntax

PH0. expr, expr, ...

See Also

HEX$, OCTHEX$

Usage

PH0. and PH1. statements operate the same as the PRINT statement except that values
are output in hexadecimal format. The PH1. statement always prints out four hexadecimal
digits whereas the PH0. statement suppresses the two leading zeros if the number to be
printed is less than 256 (0100H). The character "H" is printed after the number to identify
the number as a hexadecimal.
Values printed by the PH0. and PH1. statements are truncated to an integer. If the number
to be printed is not within the range of a valid integer (0-65535 inclusive), then BASIC will
default to the PRINT statement format of output.

Example

>5 FOR I=1 TO 2
>10 INPUT "HEXADECIMAL NUMBER",H
>20 PRINT1 H
>30 INPUT "DECIMAL NUMBER",D
>40 PH0. D : PH1. D
>45 PRINT
>50 NEXT I
>RUN
HEXADECIMAL NUMBER
?0A5H
165
DECIMAL NUMBER
?250
FAH
00FAH
HEXADECIMAL NUMBER
?32H
50
DECIMAL NUMBER
?257
101H
0101H

4.70

STATEMENTS

PICK - Input/Output
Function

Operates on 16 bit integers on a byte, nibble or bit basis

Syntax

PICK (variable, portion) = expression
variable = PICK (expression, portion)

See Also

BITS

Usage

The PICK instruction assigns the value of expression to the specified portion of a numeric
variable. Only the specified portion of the variable is affected by PICK. All other bits
remain unchanged. If the value of expression will not fit into the specified portion of the
variable then a BAD ARGUMENT error will occur.
The PICK operator returns the specified portion of expression and assigns it to a numeric
variable. PICK returns true (0FFFFH) and false (0) bit values for use in relational
expressions.
portion may specify a bit position, a nibble (group of 4 bits), a byte (group of 8 bits), or a
word (all 16 bits).
Use "B(n)" to specify one of 16 bit positions,where n = 0-15.
Use "N(n)" to specify one of four nibbles, where n = 0-3.
Use "H" to PICK the High byte or use "L" to PICK the low byte.
Use "B" to specify a word hexadecimal to BCD conversion.

Example

Pick apart a 16 bit value
10 REG = 1120H
20 PH1. "REG = ",REG," in hexadecimal"
30 PRINT1 "1st nibble = ",PICK(REG,N(0)), SPC(5),
40 PRINT1 "3rd nibble = ",PICK(REG,N(2))
50 PRINT1 "Value in binary = "; : FOR BT=0 TO 15
60 IF PICK(REG,B(BT)) THEN GOTO 62 ELSE GOTO 64
62 P=NOT(P) : PRINT1 "1"; : GOTO 70
64 PRINT1 "0";
70 NEXT BT
80 IF P THEN $(0)="ODD" ELSE $(0)="EVEN"
90 PRINT1 "Word contains a ",$(0)," number of 1 bits"
95 PH1. REG," or ",REG," treated as BCD = ",
96 PRINT1 PICK(REG,B)," decimal"
100 HB = PICK(REG,H) : REM Swap the bytes
110 PICK(REG,H)=PICK(REG,L) : PICK(REG,L)=HB
120 PRINT "REG with bytes swapped = ",REG
>RUN
REG = 1120H in hexadecimal
1st nibble = 0
3rd nibble = 1
Value in binary = 0000010010001000
Word contains an ODD number of 1 bits
1120H or 4384 treated as BCD = 1120 decimal
REG with bytes swapped = 2011

STATEMENTS

4.71

POP - Advanced Operator
Function

Retrieves a value off the stack

Syntax

POP variable, variable, ...

See Also

PUSH

Usage

The POP statement retrieves a value off the top of the argument stack and assigns it to a
variable. The last variable in the POP statement variable list will be assigned the last value
off of the argument stack.

Example

See the PUSH Example

4.72

STATEMENTS

PRINT - Input/Output
Function

Transmits data out of the specified serial port

Syntax

PRINTn expr, expr, ...

Shorthand

P.,P1., P2., P3.

See Also

TAB
SPC
CR,
@(y,x)
USING

Usage

PRINT transmits data out the serial port specified by n. expr may be either a string or
numeric expression or constant. Multiple values can be output in a single PRINT statement
if separated by commas.

Absolute cursor positioning on current line
Relative cursor positioning on current line
Return cursor to position 1 on current line (no LF)
Absolute cursor positioning on ANSI screen
To align decimal points of PRINTed numbers and to PRINT a specified number of
characters of a string variable.

A carriage return and line feed character are normally sent at the end of each PRINT. This
function can be suppressed by adding a comma at the end of the PRINT statement.
Program PRINT statements can be started and stopped from external devices with XOFF
 and XON  or with the Hardware Handshaking input CTS. See SETPORT
page 4.85 for more information on serial port flow control.
Example

>10 FOR I=1 TO 3 : PRINT1 I, : NEXT I : PRINT1 -5
>RUN
123-5
READY
>PRINT1 2**16-1," BYTES OF MEMORY! (", 65.535E3,") "
65535 BYTES OF MEMORY! (65535)
READY
>

Special

Use the CHR$ operator to PRINT special 8-bit codes which are not a part of the standard
ASCII character set shown in Appendix D. For example, PRINT CHR$(219) will PRINT a
solid box ¦ on an IBM PC.
Use PRINT USING(\n\), $(var) to PRINT the first n characters of string var when the ASCII
string delimiter characters null (ASCII=0) and carriage return (ASCII=13) are contained
within the string as data values (or use CHR$ to PRINT them explicitly).

STATEMENTS

4.73

PUSH - Advanced Operator
Function

Places a value on the stack

Syntax

PUSH expression

See Also

POP

Usage

PUSH places the value of expression onto the argument stack. The value of the last
expression in the PUSH statement list of expressions will be the last value placed on the
stack.
PUSH and POP are convenient for passing values to and from general purpose subroutines.

Example

Example uses PUSH and POP to pass data to a general purpose subroutine which
performs the repetitive task of separating four BCD digits.
>10 PUSH 700 + 53
>20 GOSUB 100
>30 TRANSFER(128) : TRANSFER(LSB)
>31 REM Send 4 BCD digits to PLC
>40 TRANSFER(129) : TRANSFER(MSB)
>50 INPUT "VALUE FOR REGISTER PAIR 400/401? ",$(0)
>60 PUSH VAL($(0))
>70 GOSUB 100
>80 PRINT1 "Register 400 = ",LSB
>85 PRINT1 "Register 401 = ",MSB
>90 END
>100 POP D : MSB = INT(D/100)
>101 REM Most significant two digits
>110 LSB = D-INT(D/100)
>111 REM Least significant two digits
>120 RETURN
>RUN
VALUE FOR REGISTER PAIR 400/401? 9642
Register 400 = 42
Register 401 = 96

4.74

STATEMENTS

READ - Input/Output
Function

Assigns DATA statement constant values to variables

Syntax

READ variable, variable, ...

See Also

DATA, RESTORE

Usage

READ assigns the value of a numeric expression specified in a DATA statement to
variable. Multiple variables in the READ list are separated by commas. The first variable
in the first READ statement in the program is assigned the value of the first expression in
the first DATA statement in the program. Each additional variable encountered in a READ
statement is assigned the value of the next expression in a DATA statement. DATA
statements appear to READ statements as one long list of expressions. If the last
expression in the last DATA statement has been read and another READ statement is
executed, BASIC will halt program execution with error, NO DATA - IN LINE xx.

Example

>STRING 8001, 79 : REM Allocate space for 100 * 79 strings
>10
>20
>30
>40
>50
>60
>70
>80
>90
>91

REM Load error codes
FOR CODE = 1 TO 4
READ ERR(CODE)
NEXT CODE
DATA 2, 4, 7, 22
$(2) = "Out of paper"
$(4) = "Parts feeder low"
$(7) = "Supply pressure too low"
$(22)= "Cannot proceed without final payment on"
$(22)=$(22)+"this machine"

STATEMENTS

4.75

REM - Miscellaneous
Function

Identifies non-executable comments

Syntax

REM comment

Usage

The REM statement is used to add comments to a program. Everything on a line following
the REM instruction is ignored by BASIC.
The fact that the REM statement is executable in the COMMAND mode maybe useful in
certain applications. If a computer is used to load programs into the ASCII/BASIC module,
REM statements without line numbers could be included in the computers version of the
program, yet would not appear in the BASIC module's program. This would permit the
master program to be self documenting without consuming memory space in the target
system.
ABM Commander Plus carries this concept a step further by optionally down loading
programs with all remarks in the program removed. Program lines which begin with a
remark are reduced to just the line number and REM so that these line numbers can still be
used in GOTO and GOSUB statements.

Example

4.76

>10 REM Output the code
>20 PRINT1 CD
>30 IF INLEN2 = 0 THEN GOTO 30 : REM Wait for input

STATEMENTS

RESTORE - Input/Output
Function

Allows DATA statement constant values to be READ again

Syntax

RESTORE

See Also

DATA, READ

Usage

RESTORE positions the pointer used by READ back to the beginning of DATA. Following
RESTORE, the next READ variable will be assigned the value of the first expression in the
first DATA statement in the program.

Example

10 REM Use DATA-READ-RESTORE
11 REM to define a pseudo function
20 REM Function's arg is passed to function in WRD
30 WRD = 4598
40 RESTORE : READ MSB, LSB
50 PRINT "Register pair 413/412 is ",MSB,"/",LSB
60 WRD = 248
70 RESTORE : READ HIGH, LOW
80 PRINT "Two most significant BCD digits are ",HIGH
90 PRINT "Two least significant BCD digits are ",LOW
120 DATA INT(WRD/100), WRD - INT(WRD/100)*100
>RUN
Register pair 413/412 is 45/98
Two most significant BCD digits are 2
Two least significant BCD digits are 48

STATEMENTS

4.77

RETI - Interrupt
Function

Mark the end of an interrupt handling subroutine

Syntax

RETI

See Also

IDLE, ONPORT, ONTIME

Usage

RETI is used to exit from interrupt routines specified by the ONTIME or ONPORT
statements. The RETI performs a function similar to the RETURN statement plus identifies
the end of the interrupt routine so that interrupts can again be acknowledged. If the user
fails to execute the RETI statement in the interrupt subroutine, all future interrupts will be
ignored (see also CLEAR I).

4.78

STATEMENTS

RETURN - Flow Control
Function

Mark the end of a subroutine

Syntax

RETURN

See Also

GOSUB

Usage

RETURN is used to mark the end of a subroutine and cause program flow to resume with
the statement following the most recently executed GOSUB statement. The
GOSUB-RETURN sequence can be nested. In other words, subroutines can call other
subroutines subject to the size limitation of the control stack.

Example

>10 FOR I=1 TO 5
>20 GOSUB 50
>30 NEXT I
>40 END
>50 PRINT1 I,SPC(1),
>60 RETURN
>RUN
12345
>10 FOR I=1 TO 5 : GOSUB 50
>20 NEXT I : END
>30 A=I*I
>40 RETURN
>50 GOSUB 30 : PRINT1 I,SPC(1),A,SPC(1),
>60 RETURN
>RUN
1 1 2 4 3 9 4 16 5 25

STATEMENTS

4.79

REVERSE$ - String Operator
Function

REVERSE$ returns a n character string beginning with the last character

Syntax

string variable = REVERSE$(string expression, n)

See Also

LEFT$, MID$, RIGHT$

Usage

n is an expression and specifies the number of characters of string expression to be
assigned to string variable. n must be in the range 0 to 254. REVERSE$ returns a string
consisting of the last through the nth character of its string expression. If n is greater than
or equal to the length of string expression then all of string expression is returned. If n is 0
then REVERSE$ returns the null string.
REVERSE$ allows you to reverse the order of all or part of a string in a single statement.

Example

>PRINT1 REVERSE$("SDRAWKCAB",20)
BACKWARDS
>PRINT1 REVERSE$("N20G45",2)
54

4.80

STATEMENTS

RIGHT$ - String Operator
Function

RIGHT$ returns a string starting with the nth character from the last character

Syntax

string variable = RIGHT$(string expression, n)

See Also

LEFT$, MID$, REVERSE$

Usage

n is an expression and specifies the number of characters of string expression to be
assigned to string variable. n must be in the range 0 to 254. RIGHT$ returns a string
consisting of the nth through last character of its string expression. If n is greater than or
equal to the length of string expression then all of string expression is returned. If n is 0
then RIGHT$ returns the null string.
RIGHT$ allows you to pick off the end of a string.

Example

>PRINT1 RIGHT$("FACTS EXTENDED BASIC",5)
BASIC
Using MID$ and LEN to achieve same result as RIGHT$
>$(0)="END SEGMENT"
>PRINT1 MID$($(0),LEN($(0))-6)
SEGMENT

STATEMENTS

4.81

RND - Mathematical Operator
Function

Returns a pseudo-random number in the range between 0 and 1 inclusive

Syntax

RND

Usage

Returns a pseudo-random number in the range between 0 and 1 inclusive. The RND
operator uses a 16-bit binary seed and generates 65536 pseudo-random numbers before
repeating the sequence. The numbers generated are specifically between 0/65535 and
65535/65535 inclusive. Unlike most BASICs, the RND operator in this BASIC does not
require an argument or a dummy argument. In fact, if an argument is placed after the RND
operator, a BAD SYNTAX error will occur.

Example

PRINT RND
.30278477

4.82

STATEMENTS

SETINPUT - Input/Output
Function

Configure the INPUT statement

Syntax

SETINPUT no echo, no edit, terminator, length, wait for first, wait for last

See Also

INPUT, SETPORT, INLEN, INPLEN

Usage

SETINPUT establishes operational parameters for subsequent INPUT statements. When
entered with no arguments, a message reminding the user of the SETINPUT syntax will be
generated.
no echo is the only SETINPUT parameter which is not optional and must be either a 0 or a
1. If no echo is 1 then characters received by the INPUT statement will not be echoed.
When no echo is 0, INPUT will echo all characters received. The default is 0, echo.
no edit is a single character, either a 0 or a 1. If no edit is 1 then Back Space (ASCII 8),
Control-D (ASCII 4), and Delete (ASCII 127) editing will be disabled and all control
characters (ASCII 0 to 31) will be INPUT (XON/XOFF characters are ignored when software
handshaking is on). If no edit is 0 INPUT editing is enabled and all other control characters
will be ignored. This permits deletion of the previous character input. The default is 0,
enable BS/DEL.
terminator is any ASCII character, 0 to 255. INPUT stops when the terminator character is
received. If terminator is 0 then end of input character checking is disabled. The default
terminator is a carriage return (ASCII 13).
length is an expression which specifies the maximum number of characters (per string)
which INPUT will receive. INPUT stops if the number of character received is equal to
length. The range of length is 0 to 255. If length is 0 or 255 then 255 characters will be
INPUT and a BEL character (ASCII 7) will be echoed if more than 255 characters are
transmitted. length defaults to 0.
wait for first is an integer expression, 0 to 65535, which specifies the maximum time in
milliseconds that the INPUT statement will wait for receipt of the first character. If a
character is not received within the specified time then BASIC will resume execution with
the statement following the INPUT statement. If wait for first is 0 then the INPUT statement
will wait indefinitely for a character. This is the default.
wait for last is an integer expression, 0 to 65535, which specifies the maximum time in
milliseconds that the INPUT statement will wait for receipt of each character subsequent to
receiving the first. If another character is not received within the specified time then BASIC
will resume execution with the statement following the INPUT statement. If wait for last is 0
then the INPUT statement will not time-out. This is the default.

STATEMENTS

4.83

Example 1

10 REM Don't echo characters INPUT
20 SETINPUT 1

Example 2

10 REM Always INPUT 3 characters
20 SETINPUT 0, 0, 0, 3

Example 3

10
11
20
30
31
40

Example 4

05 REM INPUT one char without echoing within 60 secs
10 SETINPUT 1, 0, 0, 1 , 60000
20 INPUT2 "Press any key to continue...",$(0)

4.84

TERM = 61 : REM Set the INPUT terminating
REM
character to "="
WAIT1 = 3000 : REM Time-out if no INPUT in 3 secs
WAIT2 = 100 : REM Time-out if no more INPUT in
REM
.1 seconds
SETINPUT 1 ,0 , TERM, 79, WAIT1, WAIT2

STATEMENTS

SETPORT - Input/Output
Function

Configure a communications port.

Syntax

SETPORT port, baud, parity, data bits, stop bits, handshake, multidrop

See Also

INPUT, SETINPUT

Usage

SETPORT specifies the baud rate, framing, and flow control for a serial port. When
SETPORT is entered with no arguments a message reminding the user of the SETPORT
syntax and options will be generated.
Since each serial port has an independent 255 character type-a-head input buffer, data can
be received from external serial devices at the same time the BASIC module is performing
another task such as a PID loop calculation or inputting PLC CPU register values. In some
communication intensive applications the number of characters in each input buffer should
be examined by the main program periodically so that data can be INPUT before a buffer is
filled (see INLEN statement).
port indicates which serial port is being configured. port is the only SETPORT argument
which is not optional and must be 1, 2, or 3 depending on which module you have. Each of
the ports can be configured differently and retain their configuration until another SETPORT
statement is executed. If SETPORT is not used then the serial ports default to no parity, 7
data bits, 1 stop bit, and software handshaking. The default baud rate is established by
AUTOSTART.
baud is an expression specifying the communications rate. SETPORT does not verify that
the baud rate specified is "valid". Typical baud rates are 300, 600, 1200, 2400, 4800, 9600,
19200, 38400, 57600, 115,200. See your module specific user's manual to determine what
baud rates your module supports.

STATEMENTS

4.85

parity is a single character or A(remote address, mask) specifying the status of the parity
bit as shown below.
O
Odd parity
E
Even parity
N
No parity bit (If 7 data bits then parity bit is ignored on received characters and 0 on
transmitted characters)
A
Enables the Automatic Address Recognition (AAR) function. remote address is an
expression ranging from 0 to 255 which specifies the remote or slave station
address of the module. Note: This option is only available on port 1.
mask is optional. If mask is not specified then the module will only receive data following
receipt of the remote address byte or the Broadcast Address byte 255. Zeros in the mask
byte define "don't care" bit positions in the remote address byte to enable the module to
receive data for a group of addresses.
Enabling the AAR function forces an 11-bit data frame with an 8-bit word and 1 stop bit.
The 9th parity bit is used to distinguish between address and data bytes. The hardware on
the ASCII/BASIC Module checks the 9th parity bit. If it is a 1 then the address byte
received is compared to remote address (optionally modified with mask). Note that this
address comparison occurs in hardware not software. If there is a match then the address
byte and subsequent data bytes are loaded into the type-a-head input buffer.
data bits specifies the number of data bits and must be 7 or 8. Receive parity is ignored at
Port 2 and Port 3 for 8 bit words.
stop bits specifies the number of stop bits and must be 1 or 2. Note that 7 data bits and 2
stop bits is the same as 7 data bits mark parity and 1 stop bit. Likewise, 8 data bits and 2
stop bits is the same as 8 data bits mark parity and 1 stop bit.
handshake is a
below.
S or T
H
U
N

single character specifying the communication flow control as shown
Software handshaking (XON/XOFF on a per char. basis)
Hardware bi-directional CTS/RTS handshaking
Uni-directional CTS hardware flow control
No handshaking

If none of the above handshaking options are appropriate for your application then consider
BASIC flow control using the DTR and DSR operators. The RS-232 output RTS is
controlled with the BASIC DTR operator. The status of the RS-232 input CTS is returned by
the BASIC DSR operator (see DSR and DTR beginning on page 4.26).
Specify a "M" for multidrop to enable the RS-422/485 transmitters only when PRINTing.
Specify a "P" for point-to-point to leave the RS-422/485 transmitters ON even when not
PRINTing. See the User's Manual for wiring examples.

4.86

STATEMENTS

Software Handshaking
The Software flow control character  (XOFF, ASCII 19) is used by an external device to tell the
module to stop PRINTing. When the receive buffer on the external device is sufficiently unloaded, it
transmits a  (XON, ASCII 17) signal back to the module, telling it to continue transmitting. Software
handshaking operates on a per character basis (not on a line by line basis like Intel's MCS-51 BASIC). That
is, FACTS Extended BASIC checks to see if XOFF was received before PRINTing the next character.
Software handshaking is often used with terminals (ABM Commander uses it), printers and external
modems when the serial transmissions are all 7-bit ASCII.

Hardware Bi-directional CTS/RTS Handshaking
Hardware bi-directional CTS/RTS handshaking operates on a character by character basis and is typically
used with external modems or when there is 8-bit data in the serial transmissions. In this case, software
flow control cannot be used because the software flow control characters XON (ASCII 17) and XOFF (ASCII
19) may appear as data in the communication stream.
The RTS signal is an output from the BASIC module which becomes active at the beginning of a PRINT
statement. It is requesting clearance from the external device for a transmission (says ABM is ready to
PRINT). The CTS signal is an input to the BASIC module which when on indicates that the module may
begin transmitting to the external device (says ok to PRINT).
At the end of the PRINT statement the RTS signal is deactivated after approximately two character times for
baud rates less than 9600. If the baud rate is 9600 or higher then the RTS signal is deactivated immediately
after the last character in the PRINT statement is transmitted.
If the BASIC module does not see the CTS signal within 1 second of asserting the RTS signal then the RTS
signal is dropped and the handshaking mode is changed to none (N).

Uni-directional CTS Hardware Flow Control
Uni-directional CTS hardware flow control operates on a character by character basis and is typically used
with external modems.
The CTS signal is an input to the BASIC module which the modem turns off to instruct the module to stop
sending data. The modem turns on the CTS signal to instruct the BASIC module to resume sending data.
Uni-directional CTS hardware flow control is exactly like Bi-directional RTS/CTS hardware flow control
except that the RTS signal from the module is always asserted.

No Handshaking
When interfacing to devices which do not support any type of handshaking, the user must be careful that
characters are not lost in a transmission. Printers, for example, can easily be interfaced to the BASIC
module by selecting a baud rate sufficiently slow to allow the printer time to keep up.

STATEMENTS

4.87

Example

05
10
14
16
20

REM Configure Port 1 for comm. with a terminal
SETPORT 1, 9600, N, 7, 1, S
REM Configure Port 2 for comm. with a binary
REM transmitter
SETPORT 2, 1200, O, 8, 1, N

Example

Configure Port 1 for 9600 baud, no parity, 8 bit word, 1 stop bit, software XON/XOFF
handshaking, and multi-drop RS-422/485 mode.
SETPORT 1, 9600, N, 8, 1, S, M

Example

The following example demonstrates using the built-in hardware Automatic Address
Recognition feature.
Slave Station

1000
1010
1030
1040
1050
1060
1070
1080
1090
1100
1110
1120
1130
1140
1150
1160
1170
1180
1190
1200
1220
1230
1240
1250
1260
1270

4.88

STRING 2551,254 : REM 10, 254 char. strings
RA=2 : REM Enable AAR and define our remote address
SETPORT 1,9600,A(RA),8,1,N,M
REM Interrupt main program to INPUT data for our RA
INLEN1=0 : ONPORT 1,1070
GOTO 1240 : REM Execute main program
REM Turn OFF echo, INPUT all ASCII, no term. character
REM Maximum data block size = 254 bytes
REM Wait forever for first character
REM INPUT data until space between chars > 1 char. time
SETINPUT 1,1,0,0,0,(11/9.600)
REM Input the data block from the Master Station
INPUT1 ,$(0)
GOSUB 1230 : REM Process the data from the Master
REM If broadcast address then do not respond
IF ASC($(0),1)=255 THEN GOTO 1190
REM Send response to Master Station here
PRINT1 CHR$(1),CHR$(6),CHR$(RA), : REM An ACK
REM Interrupt main program to INPUT data for our RA
ONPORT 1,1070
RETI : REM Return to main program
RETURN : REM Nothing to process in this example
REM Begin Main Program Loop
DO
REM Nothing
UNTIL 1=0

STATEMENTS

Master Station
1000
1020
1030
1040
1050
1052
1060
1070
1080
1090
1100
1110
1120
1130
1140
1150
1160
1162
1170

RA=1 : REM Enable AAR and establish our remote address
SETPORT 1,9600,A(RA),8,1,N,M : SETPORT 2,9600,N,8,1
REM With AAR enabled, the first byte of a PRINT
REM statement will have the 9th bit set. This is slave
REM station address. The data block may be printable
REM ASCII or hexadecimal ASCII
PRINT1 CHR$(2),"Message for station 2 only",
STA=2 : GOSUB 1120 : REM Get ACK from slave 2
PRINT1 CHR$(3),"Message for station 3 only",
STA=3 : GOSUB 1120 : REM Get ACK from slave 3
PRINT1 CHR$(255),"Message for all
stations",
GOTO 1030 : REM Loop
REM Wait for response from slaves
SETINPUT 1,1,0,254,200,(11/9.600)
INPUT1 ,$(0)
IF INPLEN=0 THEN PRINT2 "No Answer station ",STA : RETURN
IF ASC($(0),2)=6 THEN GOTO 1162 ELSE GOTO 1170
PRINT2 "ACK FROM SLAVE ",ASC($(0),3)
RETURN

Advanced

Using mask to define groups of slave station addresses
Automatic Address Recognition (AAR) reduces the CPU time required to service serial
communications. Since the CPU is only interrupted when it receives its own address, the
software overhead to compare addresses is eliminated.
Once AAR is enabled by the SETPORT statement, the 9th bit of the first byte of each
PRINT statement is set. This byte is the address of the target slave. The 9th bit is cleared
for the remaining characters in the PRINT statement.
When a target slave receives a matching address byte, that byte and all subsequent bytes
are loaded into the type-a-head input buffer. Upon completion of an INPUT statement, the
slave automatically returns to the hardware AAR mode. Execution of an INLEN1=0
statement will also clear the input buffer and block further data reception until another
matching address byte is received.
The master can communicate with all slaves by using the Broadcast Address (255). The
master can selectively communicate with groups of slaves using a Group Address. A
slaves individual address is specified by remote address. The optional mask byte defines
don't care bit positions in the remote address thus providing the flexibility to address one or
more slaves at a time. If the number of zeros in the mask byte is equal to N, then the
maximum number of slaves in the group is 2**N.

STATEMENTS

4.89

Example

Slave Station 1:
remote address 1111 0001 (0F1H)
mask
1111 1010 (0FAH)
Group Address 1111 0x0x (0F0H, 0F1H, 0F4H, 0F5H)
Slave Station 2:
remote address 1111 0011 (0F3H)
mask
1111 1001 (0F9H)
Group Address 1111 0xx1 (0F1H, 0F3H, 0F5H, 0F7H)
Slave Station 3:
remote address 1111 0000 (0F0H)
mask
1111 1100 (0FCH)
Group Address 1111 00xx (0F0H, 0F1H, 0F2H, 0F3H)
The unique address for slave 1 is 0F4H. The unique address for slave 2 is 0F7H. The
unique address for slave station 3 is 0F2H. The Group Address for all 3 slaves is 0F1H.
The Group Address for stations 1 and 2 is 0F5H. The Group Address for stations 2 and 3
is 0F3H and the Group Address for stations 1 and 3 is 0F0H.

4.90

STATEMENTS

SGN - Mathematical Operator
Function

Return the sign of expression

Syntax

SGN(expression)

Usage

Will return a value of +1 if expression is greater than zero, zero if expression is equal to
zero, and -1 if expression is less than zero.

Example

PRINT SGN(52) PRINT SGN(0)
1
0

PRINT SGN(-8)
-1

STATEMENTS

4.91

SIN - Mathematical Operator
Function

Returns the sine of expression

Syntax

SIN(expression)

Usage

Returns the sine of expression. expression is in radians. Calculations are carried out to 7
significant digits. expression must be between +20000 and -200000.

Example

PRINT SIN(0)
0

4.92

PRINT SIN(60*3.14/180)
.8657599

STATEMENTS

SPC - Input/Output
Function

Used in PRINT statement to output a number of spaces

Syntax

PRINT SPC (number)

See Also

PRINT, CR, TAB, USING, @(Line, Column)

Usage

number is an expression which specifies the number of space characters to print (0-255).
SPC is used to place additional spaces between values output by the PRINT statement.

Example

10
15
20
30
40
50

$(0)="TEMPERATURE"
$(1)="PRESSURE"
PRINT1 $(0),SPC(4),$(1)
T_POS=LEN($(0))/2-3
P_POS=LEN($(0))+4+LEN($(1))/2-3
PRINT1 USING(###.###),SPC(T_POS),A,SPC(P_POS),B

TEMPERATURE
0.

PRESSURE
0.

STATEMENTS

4.93

SQR - Mathematical Operator
Function

Return the square root of expression

Syntax

SQR(expression)

Usage

Returns the square root of expression. expression may not be less than zero. The result
returned will be accurate to within + or - a value of 5 on the least significant digit.

Example

PRINT SQR(9)
3

4.94

PRINT SQR(45)
6.7082035

STATEMENTS

PRINT SQR(100)
10

STOP - Flow Control
Function

Suspend program execution

Syntax

STOP

See Also

END, CONT

Usage

STOP is used to halt program execution. After program execution has been stopped,
variables can be displayed and modified. Program execution may be resumed where it has
stopped with the CONT command. The STOP statement allows for easy program
"debugging".

Example

>10 FOR I=0 TO 9 : D(I)=I : NEXT
>15 STOP
>20 FOR I=0 TO 9 : PRINT1 D(I), SPC(1), : NEXT
>RUN
STOP-IN LINE 20
READY
>FOR I=5 TO 9 : P. D(I), : NEXT
56789
>D(9)=0
>CONT
0123456780
READY
>

STATEMENTS

4.95

STORE@ or ST@ - Advanced Operator
Function

Stores a six byte floating point number at specified memory address

Syntax

STORE@ address

See Also

BYTE, WORD, LOAD@

Usage

STORE@ allows the user to store floating point numbers anywhere in data memory.
address is the highest memory location where the number is to be stored. The number to
be stored must first be put on the argument stack with the PUSH statement.

Example

See CHAPTER 9, ADVANCED

4.96

STATEMENTS

STR$ - String Operator
Function

STR$ returns the string equivalent of a mathematical expression

Syntax

string variable = STR$(mathematical expression)

See Also

VAL

Usage

STR$ converts mathematical expression into an equivalent decimal string which is assigned
to string variable.

Example

P. STR$(+123.4)
123.4
P. STR$(-.002)
-.002
P. STR$(3.1415926*10**-6)
.0000031415926
P. STR$(80H)
128
P. STR$(-12 E10)
-120000000000

STATEMENTS

4.97

STRING - Memory Management
Function

Allocate memory for string storage

Syntax

STRING total, length

Usage

STRING allocates memory for alphanumeric string variables much the same way as the
DIM statement allocates memory for numerical array variables. STRING specifies the total
number of bytes of data memory which will be allocated for string storage and the
maximum length of each string. length must be in the range 2 to 254. Each string requires
a byte of memory for each character in the string and one additional byte overall.
The following formula can be used to determine the total memory needed to store a given
number of strings with a particular maximum string length:
total = ((length + 1) * number )+ 1
This formula can be used to calculate the number of strings configured by a given STRING
statement:
number = (total-1)/(length+1)
Considering the amount of data memory available to the user for variable storage, one way
to allocate memory for string storage is to "just make sure it's enough".
If STRING is used in the program it must be after MTOP but before the DIM statement.
This is because STRING first CLEARs memory up to MTOP prior to allocating the string
storage space. The only way to de-allocate memory for string storage is with a STRING
0,0 statement (NEW, CLEAR and RUN erase the string variables but don't free up the
memory allocated by STRING).

Example

Allocate memory for 100 strings with up to 79 characters in each string.
>P. (79+1)*100+1
8001
>10 STRING 8001,79
STRING 2551,254 : REM 10 strings * 254 characters
STRING 25501,254 : REM 100 strings * 254 characters
STRING 7651,254 : REM 30 strings * 254 characters
STRING 5101,254 : REM 20 strings * 254 characters

Special

If program variables and data are to be retained during loss of power (AUTOSTART mode=2,
RUN with no CLEAR), then the STRING statement should be entered once as a command
prior to running the program.
REM Explicitly allocate memory for 99, 44 character strings
>P. (44+1)*99+1
4456
READY
>STRING 4456, 44

4.98

STATEMENTS

SYSTEM - Miscellaneous
Function

Read and set system information

Syntax

SYSTEM (code) = expr.
var = SYSTEM(code)

Usage

The SYSTEM statement is used to access various system data which can be accessed
using a BASIC Statement or Command. The system codes below are supported in all
modules. Refer to the module specific user's manual for additional system codes unique to
that module.

CODE

DESCRIPTION

0

Address of start of user PRM 0

1

Re-Print last error message in command mode. Return line number of last error in run mode.

2

If true then add CRC-16 error check characters to PRINT statements and check CRC-16 on strings
INPUT. COMERRn is true if the INPUT error check fails.

3

If true, output CRC-16 LSB first. If false, output CRC-16 MSB first.

4

TIMEr millisecond value (was DBY(71)).

5

ERRCHK value.

6

Address of first free memory location in bank 1. This is the location of the first byte after the end of
the saved programs.

7

Selects Port 1 for the programming port if expr. evaluates to 0. If expr. is 1 then Port 2 becomes
the programming port. This is the run time equivalent to COMMAND@.

8

Returns the next line number in the BASIC program. If SYSTEM(8) is on the last line of the
program it returns 0. (See the GO-PROGRAM statement).

STATEMENTS

4.99

TAB - Input/Output
Function

Used in PRINT statement to specify print position

Syntax

PRINT TAB (expression)

See Also

PRINT, CR, SPC, USING, @(Line, Column)

Usage

TAB specifies which position to begin printing the next item in the PRINT statement list.
The value of expression should be less than 256. If the cursor (current print position) is
beyond the specified TAB position, TAB is ignored and printing begins at the cursor.

Example

>10 PRINT TAB(4),"TEMPERATURE",TAB(19),"PRESSURE"
>RUN
TEMPERATURE
PRESSURE
READY
>10 STRING 8001,79
>20 FOR I=1 TO 3
>30 INPUT $(I)
>40 NEXT
>50 FOR I=1 TO 3
>60 PRINT1 TAB(I*3),I*3,$(I),
>70 NEXT
>RUN
?A
?CDE
?GHIJK
3A
^ ^

Special

6CDE9GHIJK third TAB ignored
"^" denotes TAB position (not printed)

The current cursor position for purposes of TAB is determined by counting the number of
characters PRINTed since the last carriage return. When sending escape sequences to an
operator interface terminal, problems can be avoided by using SPC instead of TAB to
position output.
TAB can be used with the built in ANSI screen cursor positioning function @(line, column).
The current cursor position is not port specific. To prevent TAB problems, PRINT a carriage
return to reset the current cursor position to zero before beginning to PRINT TABed output
at a different port.

4.100

STATEMENTS

TAN - Mathematical Operator
Function

Returns the tangent of expression

Syntax

TAN(expression)

Usage

Returns the tangent of expression. expression is in radians. Calculations are carried out to
7 significant digits. expression must be between + or -200000.

Example

PRINT TAN(3.14/4)
1

PRINT TAN(0)
0

STATEMENTS

4.101

TIME - Interrupt
Function

TIME sets and retrieves the software timer value.

Syntax

TIME = expression
variable = TIME

See Also

ONTIME, SYSTEM

Usage

TIME is used to retrieve or assign a value to the software timer (this is different than the
Real Time Battery-Backed Calendar/Clock TIME$). After a reset, the software timer is
enabled and the TIME operator will increment once every 5 milliseconds. TIME is
expressed in seconds. When TIME reaches a count of 65535.995 seconds, TIME returns
back to a count of zero.
When TIME is assigned a value only the integer portion of TIME is changed. If desired, the
fraction portion of TIME can be changed as shown below. The fractional portion of TIME is
separated from the integer value so that periodic ONTIME interrupts can be made without
any loss in accuracy.

Example

>TIME=0
>PRINT1 TIME
.725
>SYSTEM(4)=0
>PRINT1 TIME
0
>SYSTEM(4)=500
>PRINT1 TIME
.5

4.102

STATEMENTS

TIME$ - String Operator
Function

TIME$ sets and retrieves the battery-backed calendar clock time

Syntax

TIME$ = string expression
string variable = TIME$

See Also

DATE$

Usage

When correctly formatted, string expression sets the optional battery-backed calendar
clock hours (in military form, 0-23), minutes, and seconds. string expression must be in
the following form:
hh:mm:ss

(eg. TIME$ = "1:4:32")

string variable contains the battery-backed calendar clock time returned by TIME$. TIME$
returns a fixed length string in the form hh:mm:ss.ss.
The battery-backed calendar clock is accurate to +/- 1 minute per month at 24 degrees C.
Example

>TIME$ = "14:02:00" (Set clock to 2:02 P.M.)
>TIME$ = "13" (Set clock back one hour)
>P. TIME$
13:02:33.21
>TIME$ = "0:7" (Set clock to 7 minutes after midnight)
>10 REM Routine to set the clock up or back one hour
>20 PRINT1 "Set clock forward or backward one hour"
>21 INPUT1 ," (F/B) ",$(0)
>30 $(0)=UCASE$($(0)) : REM Assure upper case
>40 IF $(0)="F" THEN FWD = 1 : GOTO 100
>50 IF $(0)="B" THEN FWD = 0 : GOTO 100
>60 END
>100 HOUR = VAL(TIME$)
>110 IF FWD THEN HOUR=HOUR+1 ELSE HOUR=HOUR-1
>120 IF HOUR<0 THEN HOUR=23
>130 IF HOUR>23 THEN HOUR=0
>140 TIME$ = STR$(HOUR)+MID$(TIME$,3)

STATEMENTS

4.103

TRACE - Debug
Function

Display program execution flow and variable assignments

Syntax

TRACE mode, line number

Usage

The TRACE operating mode expression must be equal to 0, 1, or 2.
mode 0 turns the TRACE function OFF.
mode 1 displays line numbers and variable assignments during program execution. To
cancel mode 1, enter Ctrl-C, TRACE 0, CONT or place a TRACE 0 statement in the
program.
mode 2 displays the next line number, any variable assignments and then the single step
trace prompt, "]". To trace the next line and stop, press the Space-Bar. To display the
single step trace control keys press "H". The single step trace control keys are:
SPACE-BAR =
0 = STOP
1 = Non-Stop
2 = CONT

Single Step (same as TRACE 2, CONT)
(same as TRACE 0)
(same as TRACE 1, CONT)
(same as TRACE 0, CONT)

Before entering a line number at the trace prompt, turn trace OFF by pressing "0". ABM
Commander Plus Versions 4.11 and higher automatically turn off the single step trace
mode whenever you edit a listing.
Any BASIC statement or COMMAND may be entered at the single step trace prompt.
Typical usage is to PRINT or assign new values to variables.
Optionally you may specify the program line number to begin tracing. If line number is
omitted then tracing begins at the current line.
Specifying a line number to begin single step tracing eliminates the need to edit the
program to insert STOP statements.
Use the TRACE 2, line number statement at the single step trace prompt to resume full
speed execution until line number is reached.

4.104

STATEMENTS

Example:

Enter a TRACE command or place TRACE statements in the program to turn the
debugging feature ON and OFF as required.
10
12
15
20
25
30
40
100
120
1000
1010

FOR I=1 TO 10
IF (I>4).AND.(I<7) THEN TRACE 1 ELSE TRACE 0
J=I*2
NEXT I
TRACE 1
GOTO 100
PRINT1 "THIS LINE NEVER IS EXECUTED"
GOSUB 1000
END
A=9999 : PRINT1 "PRINT STATEMENT ",A/3
RETURN

>RUN
LN10 = 1
LN12
Trace OFF
Trace ON
LN15 = 10
LN20 = 6
LN12
LN15 = 12
LN20 = 7
LN12
Trace OFF
Trace ON
LN30
LN100
LN1000 = 9999
LN1000 PRINT STATEMENT 3333
LN1010
LN120
READY
>TRACE 2,15
>RUN
Step ON, Press H for help
LN15 = 10
]
(press Space-Bar)
LN20 = 2
]P. I
1

STATEMENTS

4.105

UCASE$ - String Operator
Function

UCASE$ returns a string consisting of uppercase characters only

Syntax

string variable = UCASE$ (string expression)

See Also

LCASE$

Usage

UCASE$ returns a string equal to string expression except that all lowercase alphabetic
characters in string expression are converted to uppercase.

Example

>10 INPUT1 "Print year to date summary? (y/n) ",$(0)
>20 IF UCASE$($(0))="Y" THEN GOTO 100
>30 PRINT1 UCASE$("print-out canceled!")
>40 END
>100 REM Print-out year to date summary report
.
.
.
>RUN
Print-out year to date summary report? (y/n) n
PRINT-OUT CANCELED!
READY
>

4.106

STATEMENTS

USING - Input/Output
Function

Formats PRINTed values and strings

Syntax

PRINT USING (format), expr, expr, ...

See Also

PRINT, CR, SPC, TAB, @(Line, Column)

Shorthand

U.

Usage

format specifies how the list of expressions will be PRINTed.
Three different formats may be specified. Fixed decimal point format PRINTing may be
specified for either exponential or decimal notation and is used to PRINT a column of
numbers with all the decimal points aligned. String format PRINTing is used to print a fixed
length string (including the string delimiter characters null and carriage return).
Once a print format is specified, it will be used in all subsequent PRINT statements or until
a PRINT USING(0) statement is encountered. PRINT USING(0) causes numbers in the
range ± .2 to ± 99999999 to be displayed in decimal notation. Numbers out of this range
will be displayed in exponential notation.
Multiple USING statements may appear in a single PRINT statement.
Use a comma after the USING statement to prevent the BAD SYNTAX error message.

STATEMENTS

4.107

Formatting Numbers
Syntax

PRINT USING (#.#), numeric expression

Usage

PRINT USING (#.#) will cause the value of all subsequent numeric expressions to be
printed with a fixed number of digits before and after the decimal point. The number of
pound sign characters, "#", before and after the decimal point determine the number of
significant digits that will be printed.
The decimal point may be omitted if it is desired to output only an integer.
The maximum number of "#" characters is eight total. If the value to be output does not fit
into the currently specified format then BASIC will output a question mark character (?)
followed by the value in USING(0) format.

Example

>10 PRINT1 USING (##.###),
>20 FOR I=0 TO 30 STEP 5
>30 PRINT1 SQR(I**3)
>40 NEXT I
>RUN
0.
11.180
31.622
58.094
89.442
?125
?164.31677

Formatting Exponential Numbers
Syntax

PRINT USING (Fx), numeric expression

Usage

This PRINT formatting function will cause subsequent numeric expressions to be output to
be in a fixed floating point exponential notation format. The value of x determines how
many significant digits will be printed. The minimum value for x is 3 while the maximum
value is 8.

Example

>10 PRINT1 USING (F3),
>15 FOR J=1 TO 2
>20 FOR K=1 TO 5
>30 PRINT1 J*K, SPC(2),
>40 NEXT K
>45 PRINT1
>50 NEXT J
1.00 EO 2.00 EO 3.00 EO 4.00 EO 5.00 EO
2.00 EO 4.00 EO 6.00 EO 8.00 EO 1.00 E1
>P. 7, SPC(2), U.(F4), 4, SPC(2), U.(F3), 5, SPC(2), USING(F8), 0
7.00 EO 4.000 EO 5.00 EO 0.0000000 EO

4.108

STATEMENTS

Formatting Strings
Syntax

PRINT USING (\expr\), string expression

Usage

The value of expr is the number of characters in string expression which will be PRINTed.
PRINTing always starts at the beginning of the string. This function can be used to PRINT
strings containing null characters (ASCII 0) and carriage returns (ASCII 13).

Example

10
20
30
40
50
60
65
70
75
77
78
80
83
85
90
100
105
110
120
121

REM Allocate space for 10 strings
REM 254 characters each string maximum
REM STRING (254+1)*10+1,254
STRING 2551,254
$(0)="0123456789"
PRINT1 $(0)
PRINT1 "PRINT a portion of a string"
PRINT1 USING(\5\),$(0)
$(0)="ABC"+CHR$(10)
PRINT1 "BASIC marks string end with a ",
PRINT1 ASC($(0), LEN($(0))+1)
PRINT1 $(0)
PRINT1 "PRINT past the end of string marker"
L=LEN($(0))*4
PRINT1 USING(\L\),$(0)
ASC($(0),1)=0
PRINT1 "Normal PRINT won't print a null character"
PRINT1 $(0)
PRINT1 "Formatted String PRINTing will!",
PRINT1 USING (\3\),$(0)

>RUN
0123456789
PRINT a portion of a string
01234
BASIC marks string end with a 13
ABC
PRINT past the end of string marker
ABC
56789
Normal PRINT statement won't print a null character
Formatted String PRINTing will! BC

STATEMENTS

4.109

VAL - String Operator
Function

VAL returns the numeric equivalent of a string expression

Syntax

string variable = VAL (string expression)

See Also

STR$

Usage

VAL converts string expression into an equivalent number. If string expression contains
nonnumeric characters, then VAL returns the number up to the point of the nonnumeric
character. If string expression begins with a nonnumeric character then VAL returns 0.
If the string expression represents a hexadecimal number then prepend “0” and append “H”
as shown here:
X=VAL(“0”+$(0)+”H”)

Example 1

10
20
30
40
50

INPUT1 "Please enter SETPOINT 1 ",$(0)
IF (VAL($(0))>=0).AND.(VAL($(0))<4096) GOTO 50
PRINT1 "Setpoint must be in the range 0 to 4095"
GOTO 10
SP1=VAL($(0))

Example 2

10
20
30
40
50
60
70
80

$(0)="M1@X23.4Y6.8Z1.2="
XPOS=INSTR($(0),"X")+1
YPOS=INSTR($(0),"Y")+1
ZPOS=INSTR($(0),"Z")+1
X=VAL(MID$($(0),XPOS))
Y=VAL(MID$($(0),YPOS))
Z=VAL(MID$($(0),ZPOS))
PRINT1 X*Y+Z," = ",23.4*6.8+1.2

READY
>RUN
160.23 = 160.23
READY
>

4.110

STATEMENTS

WORD - Advanced Operator
Function

WORD reads from or writes to a specific memory location two bytes

Syntax

var = WORD (address)
WORD (address) = expr

See Also

BYTE, LOAD@, STORE@

Usage

address is an expression from 0 to 65535, representing a two byte memory location.
WORD retrieves or assigns an integer value (0 to 65535). WORD can be used to store
integer values in a region of memory protected from BASIC (from MTOP to 32767). WORD
can also be used to retrieve integer values any where in memory.

Example

Store values in non-volatile memory after SAVEd programs in bank 1.
1000 FRE_ADDR = SYSTEM(6) : REM 1st free location
1010 FOR IDX = 1 TO 100
1020 WORD(FRE_ADDR+I) = REG(I)
1030 NEXT IDX
Retrieves values stored in non-volatile memory after SAVEd programs in bank 1.
1000 FRE_ADDR = SYSTEM(6) : REM 1st free location
1010 FOR IDX = 1 TO 100
1020 REG(I) = WORD(FRE_ADDR+I)
1030 NEXT IDX

STATEMENTS

4.111

@(line, column) - Input/Output
Function

Cursor positioning using ANSI escape sequence

Syntax

@(line, column)

See Also

PRINT, CR, SPC, TAB, USING

Usage

This operator is used in PRINT statements to generate the required escape sequence to
position the cursor on an ANSI or DEC VT100 compatible terminal. line specifies the
vertical position and column specifies the horizontal position on the screen. The cursor
positioning operator is often used to easily place text on an operator interface terminal.

Example1

The following two PRINT statements are equivalent.
LINE = 5 : COL = 50
PRINT1 @(LINE,COL),"UPPER RIGHT"
PRINT1 CHR$(27),"[",LINE,";",COL,"H","UPPER RIGHT"

Example 2

The following cursor control PRINT statements gives the user more control over the ABM
Commander screen (Version 6.0 and greater).
PRINT1 @(1,1); : REM Position Cursor at coordinates 1,1
PRINT1 CHR$(27),"[2J"; : REM Clear Screen
PRINT1 CHR$(27),"[2L"; : REM Turn Cursor OFF
PRINT1 CHR$(27),"[2K"; : REM Turn Cursor ON

4.112

STATEMENTS

CHAPTER 5 : MATHEMATICAL OPERATORS
The mathematical operators described in this chapter are:
+
*
/
**

Table of Dyadic Mathematical Operators

OPERATOR

DESCRIPTION

GENERALIZED FORM

EXAMPLE

+

Addition

expr + expr

PRINT 2+3
5

-

Subtraction

expr - expr

PRINT 2-3
-1

*

Multiplication

expr * expr

PRINT 2*3
6

/

Division

expr / expr

PRINT 2/3
.66666667

**

Exponentiation

expr ** expr

PRINT 2**3
8

MATHEMATICAL OPERATORS

5.1

5.2

MATHEMATICAL OPERATORS

CHAPTER 6 : LOGICAL AND RELATIONAL OPERATORS
The operators described in this chapter are:
LOGICAL
.AND. .OR.
.XOR. NOT()

RELATIONAL
=
>
<>
<

>=
<=

LOGICAL OPERATORS
The logical operators perform their functions on valid integers on a bit by bit basis (16 bits). Non-integer
arguments in the range 0 to 65535 (0FFFFH) inclusive are truncated. Numbers outside of this range will
generate the message, ERROR: BAD ARGUMENT.

Table of Logical Operators
OPERATOR

DESCRIPTION

GENERALIZED FORM

EXAMPLE

.AND.

AND

expr .AND. expr

PRINT 2.AND.3
2

.OR.

OR

expr .OR. expr

PRINT 2.OR.3
3

.XOR.

EXCLUSIVE OR

expr .XOR. expr

PRINT 2.XOR.3
1

NOT()

NOT

NOT(expr)

PRINT NOT(2)
65533

Logical Operators Truth Tables
A .AND. B

A.OR. B

A .XOR. B

NOT(A)

A
0
0
1
1

A
0
0
1
1

A
0
0
1
1

A RESULT
0
1
1
0

B RESULT
0
0
1
0
0
0
1
1

B RESULT
0
0
1
1
0
1
1
1

B RESULT
0
0
1
1
0
1
1
0

LOGICAL AND RELATIONAL OPERATORS

6.1

RELATIONAL OPERATORS
The relational operators are used to test whether the specified relationship between two expressions is
TRUE or FALSE. If the relationship is TRUE then all ones are returned, 65535 (0FFFFH). If the relationship
is FALSE then a 0 is returned.

Table of Relational Operators
OPERATOR

DESCRIPTION

GENERALIZED FORM

EXAMPLE

=

EQUAL TO

expr = expr

PRINT 2=3
0

<>

NOT EQUAL TO

expr <> expr

PRINT 2<>3
65535

>

GREATER THAN

expr > expr

PRINT 2>3
0

<

LESS THAN

expr < expr

PRINT 2<3
65535

>=

GREATER THAN OR
EQUAL TO

expr >= expr

PRINT 2>=3
0

<=

LESS THAN OR
EQUAL TO

expr <= expr

PRINT 2<=3
65535

Since relational operators return a valid integer, specifically either a 0 or 65535, then the logical operators
can use the results of relational operations to form complex relational expressions.
Examples

>10 IF X<=Y.AND.(X>Z.OR.X=O) THEN...
>10 IF NOT(A.OR.B).AND.C THEN...
In the first example above, the parentheses were used to cause the result of the logical OR
operation to be used as one of the arguments in the logical AND operation. Often times,
complex expressions can be written with few parentheses if the user understands the
precedence of operators. See CHAPTER 2 to review the precedence of operators in
expressions. When in doubt about operator precedence, it is recommended that
parentheses be used.

6.2

LOGICAL AND RELATIONAL OPERATORS

CHAPTER 7 : ERROR MESSAGES
The error messages described in this chapter are:
ARGUMENT STACK OVERFLOW
ARITHMETIC UNDERFLOW
BAD ARGUMENT
CAN'T CONTINUE
CORRUPTED PROGRAM ENCOUNTERED
EXPRESSION TOO COMPLEX
MEMORY ALLOCATION
NOT ENOUGH FREE SPACE
STRING TOO LONG

ARITHMETIC OVERFLOW
ARRAY SIZE - SUBSCRIPT OUT OF RANGE
BAD SYNTAX
CONTROL STACK OVERFLOW
DIVIDE BY ZERO
INVALID LINE NUMBER
NO DATA
PROGRAM ACCESS
UNABLE TO VERIFY

When errors occur in the COMMAND mode, an error message will be generated and printed out the
command port. When an error occurs during program execution, the program is terminated, an error
message is generated and printed out the command port. Then the program line number which caused the
error printed out the command port with an 'X' approximately where in the line the error occurred.
Example

ERROR: BAD SYNTAX - IN LINE 110
110 PRINT 14+12*
-----------------x

ARGUMENT STACK OVERFLOW
An ARGUMENT STACK OVERFLOW error normally occurs when an attempt is made to POP data off the
stack when no data is present. The error will also occur if the user overflows the argument stack by
PUSHing too many expressions onto the stack.

ARITHMETIC OVERFLOW
If the result of an arithmetic operation exceeds the upper limit of a BASIC floating point number, an
ARITHMETIC OVERFLOW ERROR will occur. The largest floating point number in BASIC is + or
-99999999E+127. For instance, 1E+70*1E+70 would cause an ARITHMETIC OVERFLOW error.

ARITHMETIC UNDERFLOW
If the result of an arithmetic operation exceeds the lower limit of a BASIC floating point number, an
ARITHMETIC UNDERFLOW error will occur. The smallest floating point number in BASIC is + or -1E-127.
For instance, 1E-80/1E+80 would cause an ARITHMETIC UNDERFLOW error.

ERROR MESSAGES

7.1

ARRAY SIZE - SUBSCRIPT OUT OF RANGE
If an array is dimensioned by a DIM statement and then you attempt to access a variable that is outside of
the dimensioned bounds, an ARRAY SIZE error will be generated. This error will also occur if you attempt
to re-dimension an array.
Example

>DIM A(10)
>PRINT A(11)
ERROR: ARRAY SIZE - SUBSCRIPT OUT OF RANGE
READY
>

BAD ARGUMENT
When the argument of an operator is not within the limits of the operator a BAD ARGUMENT error will be
generated. For instance, A=TRANSFER(257) would generate a BAD ARGUMENT error because the
argument for the TRANSFER is limited to the range 0 to 255. PRINT ASC($(2),1) will generate an error if
string storage space has not been allocated by STRING.

BAD SYNTAX
A BAD SYNTAX error means that either an invalid BASIC command, statement, or operator was entered
and BASIC cannot interpret the entry. The user should check and make sure that everything was typed in
correctly. A BAD SYNTAX error may also be generated if a reserved key word is used as part of a variable
(see Appendix C).

CAN'T CONTINUE
Program execution can be halted by either entering a  through the command port or by executing a
stop statement. Normally, program execution can be resumed by typing in the CONT command. However,
if the user edits the program after halting execution and then enters the CONT command, a CAN'T
CONTINUE Error will be generated. A  must be typed during program execution or a STOP
statement must be executed before the CONT command will work.

CONTROL STACK OVERFLOW
CONTROL STACK OVERFLOW errors will normally occur if a RETURN is executed before a GOSUB, a
WHILE or UNTIL, before a DO, or a NEXT before a FOR.
A CONTROL STACK OVERFLOW error will also occur if the control stack pointer is forced "out of bounds".
158 bytes of memory are allocated for the control stack. FOR-NEXT loops require 17 bytes of control stack
DO-UNTIL, DO-WHILE, and GOSUB require 3 bytes of control stack. This means that 9 nested FOR-NEXT
loops is the maximum BASIC can handle because 9 times 17 equals 153. If the user attempts to use more
control stack than is available, a CONTROL STACK OVERFLOW error will be generated.

7.2

ERROR MESSAGES

CORRUPTED PROGRAM ENCOUNTERED
When a corrupted program is encountered in the stored program memory space then the end of file marker
is moved to the first valid program line before the corruption. This truncates the rest of the program and
deletes all programs following it. Program memory could conceivably be changed due to electrical noise
such as static electricity.

DIVIDE BY ZERO
If a division by ZERO is attempted (e.g. 12/0), a DIVIDE BY ZERO error will occur.

EXPRESSION TOO COMPLEX
An EXPRESSION TOO COMPLEX error occurs when BASIC does not have enough stack space to evaluate
an expression (too many parenthesis) . We have never seen this error in the real world, however, if you
manage to generate this message then the expression must be simplified by obtaining intermediate results.

INVALID LINE NUMBER
This error normally occurs when the program attempts to branch to a line number which does not exist. The
error could be caused by any of the statements which reference line numbers such as GOTO, GOSUB,
ONPORT and others. The error may also occur when the program in the edit buffer (PROGRAM=0) is
corrupted.
To check program zero, enter the following.
>PRM 0
select program zero
>P. LOF
PRINT length of program
If LOF returns the byte count of the length of the program then program zero is not corrupted.
If LOF generates the INVALID LINE NUMBER message then something has changed the contents of
program zero. To correct the error, issue a NEW command and reload a back-up of the program.

MEMORY ALLOCATION
MEMORY ALLOCATION errors are generated when the user attempts to access strings that are 'outside'
the defined string limits or when there is insufficient memory for variable storage. Additionally, if the top of
memory value, MTOP, is assigned a value that does not contain any data memory, a memory allocation
error will occur.

NO DATA
If a READ statement is executed and no DATA statement exists or all data has been read and a RESTORE
instruction was not executed the message ERROR: NO DATA-IN LINE XXX will be generated.

ERROR MESSAGES

7.3

NOT ENOUGH FREE SPACE
The NOT ENOUGH FREE SPACE message is generated after a SAVE COMMAND when the length of the
currently selected program (usually program 0 in the edit buffer) exceeds the number of bytes remaining in
the stored program memory space.
The number of stored programs and the number of bytes remaining is displayed following reset when
AUTOSTART is in edit mode (mode 0 or 3).
The free program storage space available can also be determined by entering a DELPRM command for a
program which does not exist.
To determine length of the program being saved use LOF.
Example

>DELPRM 5
4 stored programs, 6381 bytes free
>P. LOF
7673

PROGRAM ACCESS
Attempting to select a stored program which does not exist will generate the PROGRAM ACCESS error
message. The number of the last stored program is displayed following a reset when AUTOSTART is in edit
mode (mode 0 or 3).

STRING TOO LONG
The STRING TOO LONG message is generated when an attempt is made to create a string longer than the
maximum string length defined by the STRING statement. Use STRING to allocate memory for longer
strings or break the string up into segments.

UNABLE TO VERIFY
If an error occurs while a program is being SAVEd, an UNABLE TO VERIFY error will be generated.

7.4

ERROR MESSAGES

CHAPTER 8 : ADVANCED
FLOATING POINT STORAGE FORMAT
The STORE@ and LOAD@ statements can be used in a BASIC program to save and retrieve floating point
numbers in absolute memory locations. Each floating point number requires six bytes of memory for
storage. All non-dimensioned variables are stored as floating point numbers in a normalized packed BCD
format as shown in the following example.
Example

>PUSH 1.2345678
>STORE@ 30000

Location
30000

Value
81H

Description
Exponent
-7FH = 10**-1
80H = 10**0
81H = 10**1
82H = 10**2
Number zero = zero exponent

29999

00H

Sign bit - 00H = Positive, 01H = Negative

29998

78H

Least Significant Two BCD digits

29997

56H

Next Least Significant Two BCD digits

29996

34H

Next Most Significant Two BCD digits

29995

12H

Most Significant Two BCD digits

ADVANCED

8.1

NON-DIMENSIONED VARIABLE STORAGE FORMAT
Variables require 8 bytes of memory for storage. Two bytes are used to describe the variable name while
the remaining 6 bytes are used to store the floating point number as described previously. The following
example shows how the variable CHAR would be stored.
Example

>STRING 0,0
>CHAR = .12345
>P. WORD(104H)
32767

Location

Value

Description

32766

52H

ASCII value for the last character used to define a variable. In this
example, the ASCII value for the character "R".

32765

119

ASCII value for the first character used to define a variable plus 26 times
the number of characters in the variable name greater than 2 (67 + 26 *
(4-2) = 119).

32764

80H

Floating point exponent

32763

0

Sign bit

32762

0

Least Significant Two BCD digits

32761

50H

Next Least Significant Two BCD digits

32760

34H

Next Most Significant Two BCD digits

32759

12H

Most Significant Two BCD digits

8.2

ADVANCED

DIMENSIONED VARIABLE STORAGE FORMAT
Dimensioned variables require 8 bytes of memory for storage. The following example shows how the
variable ARRAY(2) would be stored.
Example

>STRING 0,0
>ARRAY(2) = -12.8
>P. WORD(104H)
32767

Location

Value

Description

32766

217

ASCII value for the last character used to define array variable name plus
128. In this example, the ASCII value for the character "Y" (89 + 128 =
217).

32765

143

ASCII value for the first character used to define a variable plus 26 times
the number of characters in the variable name greater than 2 (65 + 26 *
(5-2) = 143).

32764

11

Maximum number of elements in the dimensioned variable. By default this
is 11 (ARRAY(0) through ARRAY(10)).

32763

6

Least significant byte of the base address for ARRAY

32762

4

Most significant byte of the base address for ARRAY

ADVANCED

8.3

STRING VARIABLE STORAGE FORMAT
The STRING statement defines the maximum string length and the memory allocated for string storage.
STRING 2551,254 allocates memory for 10, 254 character strings (10 * (254+1) + 1 = 2551). String
variables are stored from WORD(104H) up to MTOP as shown in the following example.
Example

>STRING 21,9 Allocate memory for two, nine character strings
>$(0)="ONE"
>$(1)="TWO"
>PRINT CHR$(BYTE(WORD(104H)))
O
>PRINT CHR$(BYTE(1+WORD(104H)+9*1))
T

8.4

ADVANCED

COMMUNICATIONS WITH AUTOMATIC CRC-16
Cyclic redundancy check (CRC) is a reliable means of checking for communication errors. A CRC algorithm
is much more effective than parity and sum checking algorithms. FACTS Extended BASIC uses a 16 bit
CRC and is thus referred to as CRC-16. This CRC implementation may be configured to communicate with
other devices which implement a 16 bit CRC such as Modbus RTU protocol.
CRC Operation
The transmitting device generates two CRC-16 characters for each transmission and adds those characters
to the end of the transmission. The receiving device then calculates the CRC-16 on the incoming data and
verifies that the result is the same as the actual CRC-16 characters received. The CRC-16 function requires
that both the transmitting and receiving devices use the same CRC algorithm, use the same initial
remainder, and transmit the CRC characters in the same order. The CRC function is enabled and disabled
as shown below.
10 SYSTEM(2)=NOT(0) : REM Enable the CRC function
10 SYSTEM(2)=0 : REM Disable the CRC function
Transmitting with CRC
When the CRC function is enabled, BASIC calculates two CRC-16 characters for each PRINT statement.
Every character transmitted by any one PRINT statement is included in the calculation. By default, BASIC
then adds the two CRC-16 characters, most significant byte (MSB) first and least significant byte (LSB) last
to the end of the transmission. The order in which the CRC-16 characters are added at the end of the
transmission can be selected by the user's program as shown below.
10 SYSTEM(3)=0 : REM Tx MSB first, LSB last
10 SYSTEM(3)=NOT(0) : REM Tx LSB first, MSB last
Receiving with CRC
When the CRC function is enabled, BASIC calculates two CRC-16 characters for each INPUT statement.
Every character received by any one INPUT statement is included in the calculation. By default, BASIC
then looks at the last two characters INPUT for the two CRC-16 characters, MSB first and LSB last. BASIC
looks for the CRC-16 characters is the same order in which BASIC would transmit the characters. If the
characters don't match, a communication error has occurred. BASIC sets the communication error flag,
COMERR, to all 1s following a CRC error. If the correct CRC-16 characters are received, BASIC sets
COMERR to 0.
Initial Remainder
The initial remainder (starting CRC characters) is all 1s after a reset. The initial remainder may be changed
by the user's program as shown below.
10 WORD(132H) = 0 : REM Change initial remainder to all 0s
10 WORD(132H) = 0FFFFH : REM Change initial remainder to all 1s
NOTE: WORD(0132H) is the Initial Remainder location for all BASIC modules expect the F0-CP128
which uses WORD(012CH).

ADVANCED

8.5

Examining the CRC-16 Characters
For debugging purposes, the last two CRC-16 characters generated either for a transmission or a reception
can be examined by BASIC as shown below.
10
15
20
25

PRINT1 "The ASCII value of the last CRC-16 MSB = ",
PRINT1 PICK(SYSTEM(5),H)
PRINT1 "The ASCII value of the last CRC-16 LSB = ",
PRINT1 PICK(SYSTEM(5),L)

CRC Demo Program
The following program demonstrates the use of the built in CRC function. The program allows you to
simulate data reception using the keyboard. In practice, data received in a string by the INPUT statement
would be examined using the ASC operator. The ASC operator can be used to "pick-off" characters in a
string.
100 REM CRC-16 Error Checking Demo for FACTS Extended BASIC
110 CLEAR : STRING 8001,79
120 PRINT1 "Default initial CRC-16 remainder = ",WORD(132H)
130 SETINPUT 0,1,0,6,65535,5000
140 PRINT1 "CRC-16 with MSB first"
150 PRINT1 "Please enter the following : "
160 SYSTEM(2)=1 : SYSTEM(3)=0 : REM Enable CRC-16 MSB First
170 GOSUB 240
180 PRINT1 "CRC-16 with LSB first"
190 PRINT1 "Please enter the following : "
200 SYSTEM(2)=1 : SYSTEM(3)=1 : REM Turn ON CRC-16 LSB first
210 SETINPUT 0,1,0,6,65535,5000
220 GOSUB 240
230 END
240 PRINT1 "KJHS",
250 INPUT1 ,$(1)
260 SYSTEM(2)=0 : REM Disable CRC-16 error checking
270 IF COMERR THEN GOSUB 290 ELSE GOSUB 300
280 RETURN
290 PRINT1 " CRC-16 ERROR "
300 PRINT1 : PRINT1
310 PRINT1 "CRC-16 MSB -> ",PICK(SYSTEM(5),H),
315 PRINT1 " Character -> ",CHR$(PICK(SYSTEM(5),H))
320 PRINT1 "CRC-16 LSB -> ",PICK(SYSTEM(5),L),
325 PRINT1 " Character -> ",CHR$(PICK(SYSTEM(5),L))
330 PRINT1 : PRINT1
340 RETURN

8.6

ADVANCED

APPENDIX A: STACKING THE DECK
PLACING THE BASIC MODULE INTO SERVICE
After the programming and fine tuning cycle has been completed (some call this debug), the module is
ready to be put into long term service.
The following steps are recommended to provide the maximum reliability as required in most industrial
applications. These steps will help prevent undesirable operation due to an error not trapped in the program,
uncontrollable outside forces such as electrostatic discharge or due to an extremely out of tolerance
operating environment.
1.

Make a back-up copy of the program(s).

2.

Disable  break by adding a "BREAK=0" statement to the program(s).

3.

Force program execution by adding a "LOCKOUT=NOT(0)" statement to the program.

4.

Enter the appropriate AUTOSTART command.

To stop program execution for further editing, see the BREAK statement.
Also, LOCKOUT can be disabled and BREAK can be enabled under software control. See the END
statement description for an example.

STACKING THE DECK

A.1

A.2

STACKING THE DECK

APPENDIX B: RESERVED WORDS
The following is an alphabetical list of all of the words reserved for use by the FACTS Extended BASIC
interpreter. Although not all of the key words listed are used in the ASCII/BASIC module instruction set,
variables may not CONTAIN any of the words shown.
Reserved Words
ATN
AUTOSTART
BIT
BYTE
BREAK
CALL
CBY
CLEAR
CLOCK
COMERR
CONT
COS
CR
DATA
DBY
DELAY
DELPRM
DIM
DO
DSR
DTR
EDIT
ELSE
END
ERASE
EXP
FOR
GOPRM
GO_PROGRAM
GOSUB
GOTO

IDLE
IF
INLEN
INPLEN
INPUT
INSTR
INT
LEN
LET
LOCKOUT
LOF
LOG
MTOP
NEW
NEXT
NOT
ON
ONERR
ONEX1
ONPORT
ONTIME
PGM
PI
PRINT
PRM
PROGRAM
POP
PUSH
RAM
READ

REM
RENUMBER
RESET
RESTORE
RETI
RETURN
RND
ROM
RROM
SAVE
SETINPUT
SETPORT
SGN
SIN
SPC
SQR
STEP
STOP
STRING
TAB
TAN
THEN
TIME
TO
UNTIL
VAL
WHILE
WORD
XBY
XFER

Reserved Symbols
@$,.
( ) + - * / **
> < = >= <= <>
.AND.
.OR.
.XOR.

RESERVED WORDS

B.3

B.4

RESERVED WORDS

APPENDIX C: ASCII TABLES

CONTROL CHARACTER TABLE
Control
Code

ASCII
Character

Decimal
Value

Abbreviation
Definition

































SP
DEL

NULL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
SP
DEL

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
127

null
start of heading
start of text
end of text
end of transmission
enquiry
acknowledge
bell
backspace
horizontal tabulation
line feed
vertical tabulation
form feed
carriage return
shift out
shift in
data link escape
device control 1
device control 2
device control 3
device control 4
negative acknowledge
synchronous idle
end of transmission block
cancel
end of medium
substitute
escape
file separator
group separator
record separator
unit separator
space
delete

RESERVED WORDS

C.1

ASCII CONVERSION TABLE

C.2

RESERVED WORDS

APPENDIX D: BASIC PROGRAM EXECUTION SPEED
This appendix is intended to provide the user with the feel for the execution speed of FACTS Extended
BASIC. Due to the vast number of programming possibilities it would be impractical to provide a list of
BASIC statements and execution times, however, typical speeds for executing common tasks will be
shown. Finally, some programming tips will be presented for those applications were maximum execution
speed is important.
FACTS Extended BASIC is a highly efficient interpretive full featured BASIC. The efficiency of the
implementation is exemplified by the fact that the interrupt driven timer feature only consumes about .4% of
the total CPU time.
Timing the execution speed of a section of a BASIC program is easily done using the modules timer.
5000 TIME=0 : REM Reset current time in seconds
5020 SYSTEM(4)=0 : REM Reset current time in milliseconds
5030 REM Start timing loop
5040 FOR I=1 TO 1000
5050 GOSUB 100 : REM Time the subroutine at line 100
5060 NEXT I : REM End timing loop
5070 T=TIME : REM Save time required for 1000 executions
5080 PRINT "Time required to execute the subroutine is ",T-1.655,
5090 PRINT " milliseconds"
Example
>50 GOTO 5000
>100 A = 127 * 2
>110 RETURN
>RUN
Time required to execute the subroutine is 1.655 milliseconds. This will vary depending on which module
you are using.
Below are some typical execution times for a F4-CP128-1. The time required to execute the FOR-NEXT
timing loop, in lines 5000 to 5090 shown above was subtracted from the values below. In all cases a
RETURN was executed at line 110.
Typical Execution Times
Operation

Time

100
100
100
100
100
100
100
100
100

3.17
90.1
44.4
21.5
10.7
5.65
3.25
18.48
.57

A = 16/2
PRINT "Test String", : REM at 1200 baud
PRINT "Test String", : REM at 2400 baud
PRINT "Test String", : REM at 4800 baud
PRINT "Test String", : REM at 9600 baud
PRINT "Test String", : REM at 19,200 baud
PRINT "Test String", : REM at 38,400 baud
A = 2**7
BITS=A : REM Decode an 8 bit I/O register

RESERVED WORDS

D.1

TIPS FOR SPEEDING UP YOUR PROGRAMS
During program execution, when FACTS Extended BASIC encounters a new line reference such as
"GOSUB 6000", it scans the entire program starting at the lowest line number. Therefore, frequently
referenced lines should be placed as early in the program as possible. For example, a GOSUB to a
RETURN statement at the end of a long program could require 8 msec to execute. A GOSUB to a RETURN
statement early in the same program (1 RETURN) might require only 1.5 msec to execute.
Variables which are encountered first during the execution of a BASIC program are allocated at the start of
the variable table. Defining "Z" as the 10th variable in a program caused the statement "IF Z=2 THEN END"
to execute in 1.30 msec. Defining "Z" first in the program caused the same statement to execute in 1.11
msec (+ 15%).
An eight character name may require 20% more time to interpret than a single character variable. Likewise,
a dimensioned variable may require 35% more time to process. Time for a single character variable is
typically less than 1 msec.
Often a faster method of solving the problem will provide the most significant speed increase. For example,
exponential calculations could be used to decode the status of PLC CPU I/O points. However, the BIT
statement will typically perform the same task 10 times faster.

D.2

RESERVED WORDS

APPENDIX E: SUMMARY OF STATEMENTS AND OPERATORS

Commands
AUTOSTART
CONT
DELPRM
EDIT
LIST
NEW
NULL
PROGRAM
RESET
RUN
SAVE

Selects the modules operating mode after a reset
Resume program execution
Delete a stored program
Move a SAVEd program to PROGRAM 0 for editing
Display the currently selected program
Erase PROGRAM 0 and CLEAR variables
Add null characters after each carriage return
Select a SAVEd program
Execute a software reset
CLEAR the variable tables and execute the selected program
Store selected program in the program file

Flow Control
BREAK
CLEAR S
DO-UNTIL
DO-WHILE
END
FOR
GO-PRM
GOSUB
GOTO
IF
LOCKOUT
ON-GOSUB
ON-GOTO
ONERR Specify
RETURN
STOP

Enable and disable Ctrl-C program stop
Reset control and argument stacks
Loop until test at bottom of loop is TRUE
Loop while test at bottom of loop is TRUE
Halt program execution
Loop with automatic up or down incrementing index
Begin execution of a specified program
Execute a subroutine
Transfers execution to the specified program line number
Conditional execution of statements
Force program execution
Call subroutine beginning at one of several possible line numbers
Jump to one of several possible line numbers
program line to go to if an arithmetic error occurs
Mark the end of a subroutine
Suspend program execution

SUMMARY OF STATEMENTS AND OPERATORS

E.1

Input/Output
BIT(S)
CR
DATA
INLEN

Decode PLC inputs and encode PLC outputs
Used in PRINT statement to output a carriage return
Specifies expressions for READ statements
Returns number of characters waiting in an input buffer or Clears the specified type-a-head
input buffer
INPLEN Returns the number of characters INPUT
INPUT
Loads variables with data from Port 1,2, or 3.
PH0./PH1.
Prints 2 and 4 digit hexadecimal numbers
PICK
Operate on 16-Bit integers on a byte, nibble, or bit basis
PRINT
Transmits data out of the specified serial port
POP
Retrieves a value off the stack
PUSH
Places a value on the stack
READ
Assigns DATA statement constant values to variables
RESTORE
Allows DATA statement constant values to be READ again
SETINPUT
Configure the INPUT statement (INPUT$, LINE INPUT,INPUT# & more)
SETPORT
Configure a communications port.
SPC
Used in PRINT statement to output a number of spaces
TAB
Used in PRINT statement to specify print position
USING
Formats PRINTed values and strings
@(y,x)
Cursor positioning using ANSI escape sequence

Interrupts
CLEAR I
IDLE
ONPORT
ONTIME
RETI
TIME

Disable program interrupts
Suspend program execution until interrupt
Specifies the beginning line number for serial port event handling
Time based interrupt of normal program flow
Mark the end of an interrupt handling subroutine
Sets and retrieves the software timer value controlled by CLOCK

Mathematical Operators
ABS
INT
SGN
SQR
LOG
EXP
SIN
COS
TAN
ATN
RND

E.2

Returns the absolute value of an expression
Returns the integer portion of an expression
Returns +1 if an expression is greater than zero, zero if an expression is equal to zero, and
-1 if an expression is less than zero.
Returns the square root of an expression
Returns the natural logarithm of an expression
Raises the number "e" (2.7182818) to the power of an expression
Returns the sine of an expression
Returns the cosine of an expression
Returns the tangent of an expression
Returns the arctangent of an expression
Returns a pseudo-random number in between 0 and 1 inclusive

SUMMARY OF STATEMENTS AND OPERATORS

Memory Management
CLEAR
COPY
DIM
LOF
STRING

Erase variable memory
Copy a block of ABM memory
Allocates memory for numeric arrays
Returns the size of the currently selected program
Allocate memory for string storage

Miscellaneous
DELAY
DTR
ERRCHK

Insert a pause
Control output of hardware handshaking line
Generate Checksum, LRC, or CRC-16 error check characters on a string or block of
memory
LET
Assign a value to a variable
REM
Identifies non-executable comments
SYSTEM
Read and set various system parameters
TRACE Trace program execution

String Operators
ASC
Changes or returns the ASCII code of a character in a string
CHR$
Converts an ASCII code into a single character string
DATE$
Sets and retrieves the battery-backed calendar clock date
INSTR
Searches a string for a pattern string
LCASE$
Returns a string consisting of lowercase characters only
LEFT$
Returns an n character string beginning with the first character
LEN
Returns the number of characters in a string character
MID$
Returns an m character string beginning with the nth character
RIGHT$ Returns an n character string beginning with the last character
STR$
Returns the string equivalent of a mathematical expression
TIME$
Sets and retrieves the battery-backed calendar clock time
UCASE$
Returns a string consisting of uppercase characters only
VAL
Returns the numeric equivalent of a string expression
OCTHEX$
Convert an octal number into its ASCII hex string equivalent

Advanced
BYTE
CALL
CBY
COMERR
DBY
LOAD@
MTOP
STORE@
WORD

Read or write a byte value in variable storage memory
Invokes an assembly or machine language subprogram
Read contents of memory address in program storage memory
CRC-16 error flag
Write to special memory locations (8052 CPU internal memory)
Retrieves a six byte floating point number from memory
Limit memory available to the BASIC interpreter
Stores a six byte floating point number at specified memory address
Reads from or writes to a specific memory location two bytes

SUMMARY OF STATEMENTS AND OPERATORS

E.3



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.2
Linearized                      : No
Page Count                      : 181
Creator                         : fabasicm_new.doc - Microsoft Word
Create Date                     : 2006:03:09 09:22:14
Title                           : fabasicm_new.doc
Author                          : MacS
Producer                        : Acrobat PDFWriter 5.0 for Windows NT
EXIF Metadata provided by EXIF.tools

Navigation menu