home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GEMini Atari
/
GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso
/
zip
/
portfoli
/
pbas41.lzh
/
pbasic.txt
< prev
next >
Wrap
Text File
|
1991-02-18
|
52KB
|
1,734 lines
Portfolio BASIC, version 4.1 (c) 1991 BJ Gleason
by BJ Gleason, The American University
INTRODUCTION
PBASIC is a simple BASIC interpreter. It only requires 38k
of disk space and about 59k of memory to run. PBASIC is a
batch oriented interpreter. It will also interact with the
built-in editor for program development.
PBASIC was one of the winners in the Compuserve/Portfolio
Conference Programming Contest, 1990.
A NOTE FROM THE AUTHOR
A number of considerate users have offered their help. If
you have an interesting application that you have developed
in PBASIC, I will be more than happy to distribute your code
in future releases. Please make sure to place your name and
other information as REMarks in the program. You can
include a documentation file as well. The only thing that I
ask is that you do not charge for the use of your program,
as I am not charging for the use of this interpreter. Send
me a note, and tell me where the code is and I will include
it in the package.
Thanks to all you have helped and are going to help!
Now that files and such have been added, I am going to take
a bit of a break. I will release upgrades as bugs dictate,
and will, as always, listen to you, the user. But quite
frankly, except for a few minor functions, I don't think
there is much else to add. PBASIC has grown about as large
as I would like it to. If it grows any larger, there will be
little room left for your code.
MANUAL AVAILABLE
A 240+ page manual on PBASIC is under works and will be
available March 1, 1991. The manual is 8.5 x 11, and has
comb binding so it can lay flat. Each instruction is
explained in detail, with examples. The manual will cost 25
dollars, including postage. If you are interested in
obtaining the manual, send a check or money order to address
on the last page of this document.
I am sorry that the manual was delayed, but there were a few
minor setbacks.
WHAT THE CRITICS SAY:
PBASIC 2.1 was reviewed by John Jainschigg in Atari
Explorer, January 1991. Here is some of he said:
"...PBASIC is a terrific little job of programming... Though
freeware, PBASIC has been professionally and completely
documented... even those who are waiting on tenterhooks for
Atari's own Portfolio BASIC may find PBASIC very useful in
the interim. The program is reasonably reliable, complete,
and professionally executed - and at the present time,
stands as the best alternative for casual programming on the
Portfolio system."
DESIGN CONSIDERATION
When I was laying out the initial design of PBASIC, here are
some of the topics I took into consideration:
- Microsoft BASIC compatible.
- Size of Interpreter (as small as possible).
- Unique features of the Portfolio.
- Using the Built-in editor for Program Editing.
- Reasonable size BASIC programs.
NEW FEATURES FOR VERSION 4.1
This release is mostly bug fixes. Two new features are the
PRINT@location, which is compatible with the Model 100.
This will make conversions easier. Also, the LOCATE
command now has an option to turn the cursor on and
off.
INTERFACING WITH THE EDITOR
Instead of trying to create an editor, PBASIC makes full use
of the built in editor.
If you run BASIC without any parameters, it will load the
last file you used in the editor. To speed up the process,
you might want to rename PBASIC.EXE to P.EXE, so you only
need to type P<RETURN> at the prompt. You can also specify
a file to execute on the command line.
Whenever an error is detected, an error message is
displayed, along with the line number. Press any key and
PBASIC will invoke the built-in editor and point to the
error position. This will only happen if the file you are
executing is the same as the one you are editing. On other
systems, you will be returned to the DOS prompt.
On a PC compatible machine, the error message will include
the line number, character position and offset from the
front of the file. This is so that the PBASIC EDITOR, for
the PC, can determine where the error is and point to it.
ALTR.COM is a small TSR program that will, only from inside
the editor, save the current file and invoke PBASIC.
PBASIC.EXE should be rename P.EXE for the <ALT-R> command to
work. ALTR takes up about 450 bytes. It can be removed by
rebooting the machine. It can only be loaded into memory
once. The <ALT-R> command will only work inside the editor.
When the program is finished, PBASIC will wait for a
keypress and then return you to the editor.
RUNNING PBASIC
There are two forms to execute PBASIC:
PBASIC [-T]
PBASIC filename.ext [-T]
In the first form, the default file is the last one edited
in the built-in editor on the Portfolio. The second form
loads and executes the specified file. If you leave off the
extension, the default ".BAS" is added.
If you have run the ALTR program before editing your code,
you can execute PBASIC by pressing <ALT-R>.
The command line switch -T will turn on the trace feature.
This is the same as putting TRON at the beginning of you
program.
GENERAL
Source code is standard ASCII format.
Source code can be in upper or lower case.
200 floating point variables. Variable names can not exceed
8 characters in length.
Strings are always allocated 256 bytes.
FOR/NEXT loops may be nested 10 deep.
GOSUBs may be nested 10 deep.
WHILE / WEND may be nested 10 deep.
REPEAT / UNTIL may be nested 10 deep.
Line numbers are not required for each statement. Only 100
line numbers are allowed. They do not have to be in
sequence. Line numbers can range from 0 to 99999.
Multiple statements per line (:) is supported.
Up to 10 Files can be open at the same time.
DEVELOPING PROGRAMS WITH GWBASIC
You can develop your programs on the PC with Microsoft BASIC
or QuickBASIC. If using Microsoft BASIC, be sure to save
the file in ASCII format [ SAVE "myfile",A ] so that it can
be read by PBASIC.
For easier development on a PC, PBE, the PBASIC Editor is
now available. PBE operates similar to Turbo Pascal, and
allows you to execute programs from inside the editor. IT
will also let you transfer files back and forth to the
Portfolio.
MATH EXPRESSIONS
Single precision math. Parentheses supported.
Standard operator evaluation. Hexadecimal and Octal
constants are supported.
- negation
^ exponent
* multiply
/ divide
% remainder (MOD)
\ integer division
+ addition
- subtraction
AND, OR, NOT, XOR, EQV, IMP
<, >, <=, >=, =, <>
NOTES ON CONVENTIONS USED
An expression (exp) can contain variables, constants. When
a dummy exp is indicated, it is suggested that you use a
constant, i.e. POS(0).
A variable name (varname) must be used when indicated.
Unless otherwise noted, all parameters can be constants,
variables or equations.
BASIC STATEMENTS
I have tried to keep the syntax and semantics for the
statements as close to Microsoft BASIC as possible. The
notes presented indicate exceptions. There are some
statements included that are not from Microsoft. They will
not run on GWBASIC.
BLOAD filename, offset
Load a file to location SEG:offset.
BSAVE filename, offset, length
Copies memory to file, starting from SEG:offset
for length bytes.
CALL address
Transfer control to SEG:address. Data is passed
via the registers with the REG statement/function.
CALL INTERRUPT intno
Invoke DOS interrupt intno. Data is passed via
the registers with the REG statement/function.
CHAIN filename
Load and execute the indicated file. All
variables are retained.
CHDIR path
Change the current directory to path.
CLOSE# fileno
Close the file.
CLS
Clears the screen.
DATA list of numbers/strings
Allows for numbers to be stored inline. Data
statements MUST have a line number. Numbers are
separated by commas. Data statements may be
located on any line of the program. Strings must
be enclosed in quotes.
12 DATA 1,2,3,4,5,6
DECR(var)
Decrement the variable by 1.
DEF SEG = exp
Assigns a segment address for direct memory
accessing via PEEK, POKE and CALL.
DIM varname(size,[size])[,varname(size,[size])....]
Creates a one or two dimensional array of single
precision floating point variables. Arrays start
at 0. Arrays are not initialized to a value.
Arrays must be defined before they are used.
Upper array bounds are not checked, arrays are not
allowed to go below 0.
END
SYSTEM and END have the same effect.
ERROR errnum
Simulate Error for testing ON ERROR GOTO.
EVAL var$
Evaluates the contents of var$ as if it was part
of a BASIC program.
FOR varname = exp TO exp [STEP exp]
FORMFEED
Send a formfeed to the printer.
GOSUB line number
GOTO line number
IF exp THEN statement [ ELSE statement ]
INCR(var)
Increment var by 1.
INPUT ["prompt" (,|;)] varname
Reads input from the keyboard. Only one variable
is allowed per input. If a comma (,) separates
the prompt string and the varname, no question
mark (?) will be printed. If a semi-colon (;) is
used, the question mark will appear.
INPUT# fileno, varname
This will read a variable from a disk file.
KILL filename
Delete filename from disk.
LOCATE row,col[,cursor]
Move the cursor to row, col. The optional
parameter cursor can be used to turn the cursor on
or off. On the Portfolio: 0=off, 1=underline,
2=block. On the PC: 0=off, 1=block, 2=block.
LPRINT list of expressions
Send output to printer. See PRINT.
MKDIR path
Create a directory named path.
NEXT [varname]
If no variable name is given, last FOR statement
is used. If variable name is given, matching FOR
is searched for and used, if found. This process
allows for exiting early from inner loops.
NUMFMT = "format"
In PBASIC numbers are not displayed in classic
GWBASIC format. GWBASIC always prints numbers
with a leading space or -, and a trailing space.
To make the porting of GWBASIC programs easier,
you can specify the format that numbers are to
print with the NUMFMT statement. The default is
"%g", and GWBASIC format would be "% g ". This
can also be used if you want all numbers in
scientific or other format. See the PRINT USING
description for the format.
ON ERROR GOTO line number
Error trapping. When an error occurs, user will
be transferred to line number. A line number of 0
will disable error trapping.
ON exp GOTO list of line numbers
ON exp GOSUB list of line numbers
OPEN "mode",fileno,filename
Open a file. Mode can be:
I Input
O Output
A Append
Fileno can be between 1 and 10. Only ten files
may be open at any one time. Filename is any
standard MS/DOS filename.
OUT port, exp
Send value to the indicated port.
PGLOAD filename
Load a .PGC file into screen memory.
PGSAVE filename
Save video memory to .PGC file.
PGSHOW filename, delay
Display a .PGC file, and wait delay seconds. If
delay is 0, wait for keypress.
POKE addr, exp
Places value at SEG:addr. SEG is set via the DEF
SEG statement. NOTE: Due to the design of the
Portfolio, if you poke screen memory (DEF
SEG=&HB000), the value may not appear. After you
poke, you should use the REFRESH statement to
update the screen.
PRINT[@l,] list of expressions
List of expressions can consist of strings,
variables, constants or expressions, separated by
the comma (,) or semi-colon (;) or a space ( ).
Starting with version 4.0, the ? can be used as an
abbreviation for PRINT. @l indicate screen
position 0-319, 40 columns by 8 rows. For Model
100 compatibility.
PRINT# fileno, list of expressions
Same as PRINT, but send output to file.
PRINT[@l,] USING format; list of variables
This is not GWBASIC compatible. To implement the
full version of the PRINT USING would take up too
much room. This version is like C's printf.
Format is a string, indicating the format to print
a single variable. Each variable in the list is
printed with that format. For more details, refer
to Turbo C's reference manual. @l indicate screen
position 0-319, 40 columns by 8 rows. For Model
100 compatibility.
Format Specifiers:
%s String
%f Real [-]dddd.dddd
%e Real [-]d.ddde[+/-]ddd
%E Real [-]d.dddE[+/-]ddd
%g Real, general format, e or f
%G Real, general format, E or f
%% Print % character in format string
% g Print numbers in GWBASIC format
Widths/Precisions:
n n characters are printed
0n n characters with leading 0's
.0 no decimal point
.n n digits after the decimal point
Examples Output
"|%10.2f|";123.123 | 123.12|
"|%10.0f|";123.123 | 123|
"|%5.0f%%|";10;15 | 10%|| 15%|
"|%010.2f|";123.456 |0000123.46|
"|%e|";456.789 |4.56789e+02|
"|%E|";567.901 |5.67901E+02|
PRINT# fileno, USING format; list of variables
Same as PRINT USING, but send output to file.
PRINTER
This is a toggle to start copying all PRINT
statements to the printer. Issue it again and it
will toggle off. It can be used instead of
converting all PRINTs to LPRINTs. Information
will still be displayed on the screen. This will
not wrap the output lines like the screen will.
PRTSC
This invokes the PRINT SCREEN function to copy the
screen out to the printer. If you are using a
laser printer, you might want to use a FORMFEED
after this to do a page eject.
PSET (row, col) [, exp]
Set the pixel at row, col to exp. The Portfolio,
regardless of the screen mode, has a maximum
64x240 for row, col. Exp can evaluate to 0 or 1.
RANDOMIZE
Initialize the random number generator.
READ list of variables
Read the values of the variables from the DATA
statements. Variables can be simple or array.
REG rn, val
Set rn to val. Allows for access to the 8086's
register set. Values for rn are:
0 - Flags
1 - AX
2 - BX
3 - CX
4 - DX
5 - SI
6 - DI
REM
Remark. The rest of the line is ignored. You can
also use the quote (') mark as a REM statement.
REPEAT / UNTIL exp
Statements between the REPEAT and UNTIL statements
are executed until exp becomes TRUE.
RESTORE [line number]
Sets the internal data pointer to the specified
line number. Line number specified must be a data
statement. If no line number is given, the data
pointer will point back to the first data
location.
RESUME line number
After an error is trapped via ON ERROR GOTO,
resume will allow a program to continue at the
indicated line number.
RETURN
Return from a subroutine invoked via a GOSUB.
RMDIR
Remove a directory from the disk. Directory must
be empty.
RUN filename
Load and execute the indicated program. All the
variables are reset.
SCREEN exp
Set the screen mode. There is no testing for
validity. Some of the values that work on the
Portfolio are:
4 graphics 320x200
5 graphics 320x200
6 graphics 640x200
7 text 80x25
8 graphics 160x200
10 graphics 640x200
These are standard PC modes, but remember that the
Portfolio Screen is only 240x64.
If you use the screen function of the portfolio,
it is highly recommended that you set the screen
back to mode 7 before you exit. Many portfolio
utilities only work in mode 7.
At present, text will not be displayed properly on
a graphics screen.
STOP
To allow for "breakpoints", STOP will terminate
the program and display the line number. It will
point the built-in editor to the last position
executed if the editor file is the same as the
file being executed.
SWAP varname, varname
Exchange the contents of two variables. They must
be of the same type.
SYSTEM
END and SYSTEM have the same effect.
TROFF
Disable line tracing.
TRON
Enable line tracing. Will display the line number
in brackets ([x]). Using this statement will slow
down the program execution. Can be placed
anywhere in program.
WAIT
Unlike the GWBASIC version, this only waits for a
key press. It gives no prompt and returns no
value.
WHILE exp / WEND
All the statements between the WHILE and WEND
statements are executed while exp is TRUE. If exp
is FALSE, the loop is not executed.
WRITE list of expressions
Similar to PRINT, but each element is separated by
a command (,), and strings are enclosed in quotes
(").
WRITE# fileno, list of expressions
Same as WRITE, but send output to file.
BASIC FUNCTIONS
I have tried to keep the syntax and semantics for the
functions as close to Microsoft BASIC as possible. The
notes presented indicate exceptions.
ABS(exp)
Returns the absolute value of exp.
ACOS(exp)
Returns the arc cosine of exp.
ASC(x$)
Returns ASCII value of the first character in x$.
ASIN(exp)
Returns the arc sine of exp.
ATN(exp)
Returns the arc tangent of exp.
BIN$(n)
Convert n to a Binary string.
CHR$(n)
Returns the ASCII character of the value n.
COMMAND$
Returns the command line tail.
COS(exp)
Returns the Cosine of exp.
COSH(exp)
Returns the Hyperbolic cosine of exp.
CSRLIN
Returns the current cursor line.
DATE$
Returns the system date.
DEG(exp)
Converts radians to degrees.
DMS(exp)
Convert degrees into degrees/minutes/seconds, in
the form ddd.mmss.
EOF(fileno)
Returns TRUE if fileno is at End-of-File.
ERL
Return the line number the error occurred on.
ERR
Returns the error number of the last error.
EXP(exp)
Returns e to the power of exp.
FALSE
Returns 0.
FIX(exp)
Returns the integer portion of exp.
FRE(exp)
Returns the free amount of memory. The parameter
exp is a dummy expression.
HEX$(n)
Converts n to a hexadecimal string.
INKEY$
If a key is pressed, the character is returned,
otherwise, the empty string ("") is returned.
INP(port)
Returns the byte value from port.
INPUT$(n,#f)
Returns the next n characters from file #f.
INSTR(x$,y$)
Returns the position of y$ in x$.
INT(exp)
Returns the integer portion of exp.
LEN(x$)
Returns the length of x$.
LCASE$(x$)
Return the lowercase version of x$.
LEFT$(x$,n)
Returns the leftmost n characters of x$.
LOG(exp)
Returns the natural logarithm of exp.
LPOS(exp)
Returns the current position of the line printer
head. Exp is a dummy expression.
LTRIM$(n$)
Strips off any leading spaces.
MID$(x$,n,m)
Returns a string from x$, starting at position n
for m characters.
MSD(exp)
Converts degrees/minutes/seconds in the form
ddd.mmss to degrees.
OCT$(n)
Converts n to an Octal string.
PBVER
Returns the version number of PBASIC.
PEEK(address)
Returns the byte from memory location SEG:address.
SEG is set via the DEF SEG instruction.
PI
Returns the value of PI = 3.14159
POINT(row,col)
Returns the value of the pixel at row,col. If
this function does not appear to work, try running
FIX0D, to fix the ROM pixel read function.
POS(exp)
Returns the current cursor column. Exp is a dummy
expression.
RAD(exp)
Convert degrees to radians.
RAND(exp)
This will return a number between 0 and exp-1.
REG(rn)
Returns rn's value. Allows for access to the
8086's register set. Values for rn are:
0 - Flags
1 - AX
2 - BX
3 - CX
4 - DX
5 - SI
6 - DI
RIGHT$(x$,n)
Returns the rightmost n characters from x$.
RND
This will return a number between 0 and 1.
RTRIM$(n$)
Strips any trailing spaces from the string.
SGN(exp)
Returns the sign of exp.
-1 exp < 0
0 exp = 0
1 exp > 0
SIN(exp)
Returns the sine of exp.
SINH(exp)
Returns the hyperbolic sine of exp.
SPACE$(n)
Returns a string of n spaces.
SPC(n)
Returns a string of n spaces.
SQR(exp)
Returns the Square Root of exp.
STR$(n)
Returns the string representation of n.
STRING$(n,m)
Returns a string composed of n characters. m is
the ASCII value of the characters.
TAB(n)
Moves the cursor to the nth column.
TAN(exp)
Returns the tangent of exp.
TANH(exp)
Returns the hyperbolic tangent of exp.
TIME$
Returns the system time.
TIMER
Returns the number of seconds since midnight.
TRUE
Returns -1.
UCASE$(x$)
Returns the uppercase version of x$.
VAL(x$)
Returns the numeric value of x$.
VARSEG(var)
Returns the segment of the variable.
VARPTR(var)
Returns the offset of the variable.
WKSREAD(filename, row, col)
Returns the numeric contents of the cell at row,
col from a worksheet file. Default Extension is
.WKS. Row/Col start at 0,0. Example B5 would be
4,1.
WKSREAD$(filename, row, col)
Returns the string contents of the cell at row,
col from a worksheet file. Default Extension is
.WKS. Row/Col start at 0,0. Example D10 would be
9,3.
WKSTYPE(filename, row, col)
Returns the type of the cell at row, col from a
worksheet file. Default Extension is .WKS.
Row/Col start at 0,0. Example AB2 would be 1,27.
Values returned:
1 EOF 12 Blank
13 Integer 14 Real
15 Label 16 Formula Result (Real)
PORTFOLIO ONLY STATEMENTS
The statements in this section are specific to the Atari
Portfolio and will not run on a regular PC. YOU CAN LOCK UP
YOUR REGULAR PC IF YOU ATTEMPT TO USE THESE. Starting with
version 4.0, using these statements on a standard PC will
generate an error message.
ALARM
This will beep the speaker, about once a second
until the user presses a key. The program will
then continue with the next statement.
BEEP
This will cause a single beep from the speaker.
BOX row1, col1, row2, col2, type
This will draw a box. Row1 and Col1 specify the
upper left corner position of the box, while Row2
and Col2 specify the lower right corner. Type is
0 for single line box, and 1 for a double line
box.
Trying to draw a box larger than the screen (8x40)
has unpredictable results.
CLICK
Make the key click sound.
DIAL string
This will dial the "number" through the speaker.
Valid characters for tones are: 0 1 2 3 4 5 6 7 8
9 A B C D * #. The letters must be in uppercase.
DISPLAY exp
Set the Portfolio screen to Normal, Static or
Tracked. 0=Static, 1=Normal, 2=Tracked. The mode
is only effective while in PBASIC. Using this
statement might clear the screen depending on the
position of the cursor.
ERRWIN row, col, "message"
This will draw a box around the message and
display it at the specified row, col. It will
then beep and wait for a keypress. The text
underneath the message is left untouched.
Trying to place the message outside the screen
(8x40) has unpredictable results.
GETDISPLAY
This function will return the current display
mode. See DISPLAY for details.
MENU(row, col, display, top line, selected, elements,
"Title", entries....)
This will display a menu, allow a selection, and
will return the item selected. If value returned
is -1, then the escape has been pressed. If the
value returned is > 255 then (value % 256) is the
selected element, and (value \ 256) is the top
line. Elements are numbered from 0.
Row and Col indicate the location of the menu.
Display is the number of elements to display at
one time. The maximum is 6. Top Line is element
at the top of the menu, and selected is the
element that the cursor is placed on. Elements is
the number of menu entries plus the Title. The
title string is first, followed by each entry.
Each element can be a string or a string variable.
Example:
mc = MENU(2,2,4,0,0,7,"Demo","A", "B", "C",
"D", "E", "F")
If the user picks A, mc = 0, for B, mc = 1. If
the user picks F, mc = 517, which means the entry
is 5, and the top line was 2. This will allow
selection from the menu from the same position the
second time it is invoked.
OFF
This will turn the Portfolio off until the user
presses a key. The program will continue
execution with the next statement.
PORT
This function will return a 1 if running on a
Portfolio, a 0 if not. Handy if you want to run
program on both machines without locking up the
PC. WARNING: There is no positive way to identify
the Portfolio. This functions checks to see if
the Interrupt 61h vector is pointing to 0000:0000.
This is not normally used on the PC, but is on the
Portfolio. If you are running a TSR that takes
over this vector, PORT will return 1.
REFRESH
Copy video memory to the LCD controller. Needed
for when you are doing direct write to screen
memory.
ROMVER
This function will return the version number of
the Portfolio rom's.
SCRLOAD n$(x)
Copy the contents from n$(x) back to the screen.
SCRSAVE n$(x)
Save the contents of the screen to n$(x). n$ must
be DIMension to be at least two strings, since the
screen requires 320 bytes to be saved. No check
is made to see if enough memory is available.
Example:
DIM s$(1) : rem s$(0), s$(1) will hold screen
SCRSAVE s$(0) : rem save it
....
SCRLOAD s$(0) : rem restore it
SOUND code, duration
This will activate the tone generator. Duration
is the length of tone in 10 msec intervals. Tone
codes are displayed below. These codes are taken
from the Atari Portfolio Technical Reference
Manual, copyrighted by the Atari Corporation.
CODE NOTE Frequency (Hz)
48 D#5 622.3
49 E5 659.3
50 F5 698.5
51 F#5 740.0
52 G5 784.0
53 G#5 830.6
54 A5 880.0
55 A#5 932.3
56 B5 987.8
57 C6 1046.5
58 C#6 1108.7
41 D6 1174.7
59 D#6 1244.5
60 E6 1318.5
61 F6 1396.9
14 F#6 1480.0
62 G6 1568.0
44 G#6 1661.2
63 A6 1760.0
4 A#6 1864.7
5 B6 1975.5
37 C7 2093.0
47 C#7 2217.5
6 D7 2349.3
7 D#7 2489.0
Aside from these codes, other values will produce
sounds as well.
STATUS exp
This will enable or disable the Status line. This
is the line that you see when you use the <LOCK>
key on the Portfolio. 0 for off, 1 for on.
TICK exp
Sets the Clock tick speed. 0 is Normal, 1 tick
every 128 seconds. 1 is Fast, 1 tick every
second. 1 uses much more power.
VCSRLIN
Returns the current virtual cursor line.
VLOCATE row,col
Move the virtual cursor to row, col. This
location will be at position 1,1 on the physical
screen.
VMOVE dir, dis
Move the screen in direction dir for dis number of
lines. Works only in Static and Tracked modes.
Same as using the ALT arrow keys. Values for dir
are 1=Up,2=Down,3=Left,4=Right.
VPOS(exp)
Returns the current virtual cursor column. Exp is
a dummy expression.
BREAKING OUT OF PROGRAMS
It appears that if you use the CONTROL-C key to break out of
a PBASIC program, it will lock up a few minutes later. I
have tried to trace this, but to no avail. Chalk it up a
difference between the PC and Portfolio. To eliminate this
problem, you can now use the ATARI key, ( /|\ ) by itself,
to exit from a PBASIC program. Press the key at any point.
As long as you hold down the key, the error message "BREAK
in xx" will remain on the screen. Release the key and you
are returned to the MD/DOS prompt. If you execute the
program from the editor, you will be returned to the editor,
with the cursor pointing to the last executed statement.
UPGRADE HISTORY
Version 4.1 February 13, 1991
Now using PKLITE for compressions, saves about 1k.
Added parameter to LOCATE statement to turn off cursor.
Increased range of HEX$/OCT$/BIN$.
Fixed ASC for characters greater than 127.
Fixed FOR loop parameters: K=5:FOR K=1 to K+5 is now 1
to 10 instead of 1 to 6.
Fixed DMS and MSD for negative numbers.
Fixed Error messages in EVAL function.
Fixed DIM out of memory for strings.
Version 4.01 February 7, 1991 (School Only)
Added @location, to PRINT statements for Model 100
compatibility.
Reorganized command table to save about 1k.
Fixed negative numbers in DATA statements problem.
Modified the NEXT statement: If no variable, top of
stack is used. If variable is given, stack is
searched for match. Allows for aborting FOR loops
early.
Fixed relational operators. Return -1 instead of 1.
Fixed symbol table overflow. Fixed documentation - 130
variables.
Add additional error checking on file handling.
Add range checking to the string operations.
Fixed INPUT: long numbers entered as strings caused
overflow errors.
Fixed String Initialization problem.
Version 4.0 February 1, 1991
New Statements: USING, CLOSE, EOF, INPUT$, NUMFMT,
OPEN, PRINT#, REPEAT, UNTIL, WEND, WHILE, WRITE#
New Functions: ACOS, AND, ASIN, COSH, DEG, DMS, EOF,
EQV, IMP, LTRIM$, MSD, OR, RAD, RTRIM$, SINH, SPC,
TAB, TANH, WKSREAD, WKSREAD$, WKSTYPE, XOR
New Portfolio Only: MENU, SCRLOAD, SCRSAVE
Sequential Files.
Menus.
Worksheet Importing Functions.
Reorganized GetToken to increase speed.
Reserved word lookup is now indexed binary search.
Code was tighten and refined.
Arrays can be used with FOR statements.
Fixed error in .PGC compression routines. To convert
any old .PGC files to the correct format, use the
following program:
10 INPUT "Filename? ";f$:IF f$ = "" THEN END
SCREEN 6:PGLOAD f$:PGSAVE f$:SCREEN 7:GOTO 10
Changed PC error messages to interface with PBE.
IF statements modified to allow for single expression
evaluation. Allows for IF EOF(1) THEN etc... If
the result is 0, it is false, anything else is
true.
Modified the FOR statement to work more like GWBASIC.
If the starting value to beyond the ending value,
the loop is not executed. This includes nested
loops.
The Atari key ( /|\ ) will now act as a break key.
Reorganized the IF statement to handle strings better.
Installed option to output numbers in GWBASIC style:
leading space or -, followed by space. Can be set
by NUMFMT="% g " at the beginning of the program.
Eliminated recursive ON ERROR trapping.
Fixed DIM problem with multiple/mixed arrays.
Fixed TAN error.
Added looping - WHILE/WEND, REPEAT/UNTIL.
Added LEN to the documentation.
Fixed CHAIN variable loss.
Added additional math error traps.
Fixed -0 problem.
Fixed negative numbers in print statements.
Disk Size - 38539 bytes
SPEED.BAS - 19.4 seconds
SIEVE.BAS - 51.4 seconds
TEST40.BAS - 17.0 seconds
TEST31.BAS - 16.5 seconds
TEST30.BAS - 15.9 seconds
TEST21.BAS - 10.0 seconds
Version 3.1a January 12, 1991
Minor bug : A$ = A$ + ... A$ is lost. Fixed.
Version 3.1 January 5, 1991
New Statements: BLOAD, BSAVE, CALL, CALL INTERRUPT,
CHAIN, CHDIR, DECR, ERROR, EVAL, INCR, KILL,
MKDIR, ON ERROR GOTO, PGLOAD, PGSAVE, PGSHOW,
RESUME, RMDIR, RUN
New Functions: BIN$, COMMAND$, ERL, ERR, FALSE, LCASE$,
PI, TRUE, UPCASE$, VARSEG, VARPTR
Corrected the spelling of Walter Daniel's name. :-}
Added support for .PGC files.
Fixed DATA wrap around problem.
Fixed DIAL problem.
Error message for Portfolio Only Statements on PC.
Disk Size - 35186 bytes
SPEED.BAS - 25.9 seconds
SIEVE.BAS - 79.5 seconds
TEST31.BAS - 21.0 seconds
TEST30.BAS - 20.5 seconds
TEST21.BAS - 13.0 seconds
Version 3.0 November 25, 1990.
Added sample programs.
Complied with Turbo C, version 2.0.
Added Help file for Portfolio Address Function.
Two Dimensional Arrays.
Expanded TEST.BAS to TEST30.BAS with strings.
Disk Size - 33123 bytes
SPEED.BAS - 27.4 seconds
TEST30.BAS - 21.5 seconds (corrected)
TEST21.BAS - 13.0 seconds (corrected)
New Functions: PBVER
Version 2.9 Beta Release - September 30, 1990.
Added Strings.
Modified READ, SWAP and DIAL to handle strings.
Added STRING arrays.
Modified IF and PRINT to work with string expressions.
Fixed PRINT" problem.
Allow line numbers directly after THEN or ELSE.
Now allows two dimensional arrays of any type.
Converted to Turbo C++, Version 1.0.
New Functions : ASC, DATE$, INSTR, INKEY$, VAL, LEFT$,
MID$, RIGHT$, CHR$, HEX$, OCT$, SPACE$, STR$,
STRING$, TIME$
Version 2.2 Not Released.
Added hashing feature to symbol table to speed up
variable table access. 10% increase in TEST.
Added automatic default extension of ".BAS"
Version 2.1 August 4, 1990
New Statements: DATA, READ, RESTORE
New Functions : LOG
TRON invoked from command line switch -T
Adjusted the screen coordinates from 0,0 to 1,1 to
match GWBASIC. While this will cause some
incompatibilities with previous versions of
PBASIC, it will make it more compatible with
GWBASIC.
Added INP to the documentation.
Added FRE to the documentation.
Installed Binary search for command checking. Speed
increase about 40%.
One letter variable names are not checked in command
table.
Fixed the load routine to allow for no CR/LF at the end
of the file.
Fixed FIX function.
Fixed scientific constants.
Fixed power (^) function.
Disk Size - 29649 bytes
SPEED.BAS - 30.9 seconds
TEST21.BAS - 12.9 seconds
Version 2.0 July 27, 1990
New Statements: LPRINT, PRINTER, FORMFEED, PRTSC, WAIT,
OUT, DIM
New Functions : LPOS, ATN, EXP, FIX, INT, COS, SIN,
SQR, TAN, TIMER, \, INP, FRE
New Portfolio Only : GETDISPLAY, DISPLAY, VLOCATE,
VMOVE, VPOS, VCSRLIN, ROMVER, PORT
200 variables, 8 significant characters.
<ALT-R> TSR to invoke BASIC from inside editor.
Program size limited to available memory.
All variables are now SINGLE PRECISION FLOATING POINT.
One Dimensional Floating Point Arrays.
Fixed FOR/NEXT looping with a negative step.
Fixed the use of FUNCTIONS in PRINT statements.
Fixed EOF error on Portfolio: Lockup if no END
statement.
Added extensive printer support.
DEFINT will now cause a syntax error.
RND was changed to make it MS compatible.
SWAP was make array compatible.
Fixed ... else "string" problem.
Added NEXT to the documentation.
Version 1.1 July 21, 1990
New Statements: DEF SEG, POKE
New Functions : PEEK
New Portfolio Only : REFRESH, TICK, CLICK, STATUS
Automatically invoke Editor on Error.
Fixed ALARM problem: keystroke was going into buffer.
Fixed ON x GOTO/GOSUB problem: Offset line count by 1.
Improved Error Detection.
Allow REM in PRINT with preceding colon (:).
Implement the quote (') as a substitute for REM.
Fix PSET documentation to indicate ()'s.
Screen mode changes, return to original on error.
Allow for spaces as separator in PRINT.
Version 1.0 July 14, 1990
Initial release.
TECHNICAL NOTES
PBASIC is about 3300 lines of code was written in Turbo C,
version 2.0, compiled to an executable file just under 58k
in size. PBASIC was then compressed with LZEXE, version
0.91, to further reduce the size to about 38k.
PBASIC will run on a regular PC, providing you do not use
any Portfolio specific statements. If you have the
Portfolio Emulation software (I60, I61), you can use all the
features. PBASIC will now generate an error if you try to
use a Portfolio only instruction on a PC.
PBASIC was developed on a Gateway 2000, 33Mhz 386 PC with 4
megabytes of memory. It was tested on the Atari Portfolio,
ROM version 1.052.
BATCH CONSIDERATIONS
If you are running PBASIC as a batch file, you can access
the ERRORLEVEL code generated upon exit.
0 - Successful exit
1 - Program aborted
2 - STOP encountered
ERROR NUMBER AND MESSAGES
1 NEXT without FOR
2 Syntax Error
3 RETURN without GOSUB
4 Out of DATA
5 Illegal Function Call
6 Overflow
7 Out of Memory
8 Undefined Line Number
9 Subscript Out of Range
10 Duplicate Definition
11 Division by Zero
13 Type Mismatch
14 Out of String Space
15 String Too Long
18 Undefined User Function
19 No RESUME
20 RESUME without Error
22 Missing Operand
30 WEND without WHILE
31 Array Undefined
32 Not A Variable
33 Too Many Line Numbers
34 Duplicate Line Number
35 Too Many Nested FORs
36 Too Many Nested GOSUBs
37 Name/Line Number Too Long
38 BREAK
39 Portfolio Only
51 Internal Error
52 Bad File Number
53 File Not Found
54 Bad File Mode
61 Disk Full
73 Advanced Feature
76 Path Not Found
FUTURE ENHANCEMENTS
- Increase compatibility with Microsoft BASIC
- Faster
THE FILES
PBAS40.ZIP
PBASIC.EXE The Interpreter.
PBASIC.TXT This file.
PBASIC.ADR Help file to be loaded into the Address book
on the Portfolio.
ALTR.COM TSR to execute PBASIC from editor.
TEST40.BAS A program to exercise the interpreter.
Should not generate any errors. It will
run on a PC or Portfolio. Take a look
at it, it demos many of the features of
the Portfolio Only routines.
C.BAT Calculate Expression from DOS. Invokes
PBASIC.EXE to display answer.
Example: C 123*(567+9845)/18
PBSA40.ZIP
Sample PBASIC programs
100DAYS.BAS Calculate 100 days after a date.
2CURVE.BAS Graph Plot program. Written by Rob Kunstadt.
ADDTIME.BAS Program to add up time in Minutes and
Seconds. Written by Louis Shapiro.
BAR.BAS Bar Chart program. Written by Rob Kunstadt.
CHART.BAS Chart hours worked. Written by Rob Kunstadt.
CIRCLE.BAS Demo of Circle Drawing Subroutine.
DAYS.BAS Calc the number of days between two dates.
ETCH.BAS Simple Drawing Program now with PGC support.
REV.BAS Game of Reverse.
VADERS.BAS Space Invaders program from Model 100 forum.
QCHESS.BAS Chess Program from the Model 100 forum.
The MUSIC Files by John Fraser
BACH1.BAS BACH2.BAS BETH2.BAS
BDAY.BAS KRIEGER.BAS PETER1.BAS
MUSIC.TXT Notes from the author.
Portfolio Graphic Files (Compressed) by Don Messerli
BOMB.PGC FUJI.PGC PORTF.PGC
USA.PGC SPRIAL.PGC GORBY.PGC
PGDEMO.BAS Sample program to demo PGC files.
Utilities
FIX0D.COM TSR fix for Portfolio graphics rom.
FIX0D.TXT
ALSO AVAILABLE
PBE.EXE PBASIC Editor for PC's
PBE.DOC Full screen editor designed for PBASIC
development for the Portfolio. Invoke PBASIC
from inside the editor. Access FT to
transmit/receive files to/from the Portfolio.
ABOUT THE AUTHOR
Mr. BJ Gleason is an Instructor at The American University
in the Computer Science and Information Systems Department.
He has been programming for over a decade now.
COMMENTS, BUGS AND IDEAS
What features do you really need in PBASIC to make it more
useful on the Portfolio? If you would like to see some new
features, contact me and I will try to accommodate you and
release a new version.
ACKNOWLEDGEMENTS
Thanks to all those Compuserve for their bug reports,
suggestions and words of encouragement. Without their
feedback, version 4.1 would have never seen the light of
day. Keep those cards and letters coming!
The author would also like to extend his thanks to Walter
Daniel, for helping me track down the ever-elusive bugs, and
putting up with a flaky copy of version 2.9. Thanks also to
Don Messerli, for his help implementing the graphic routines
to support the .PGC graphics standard. Finally, many thanks
to Ron Luks, the sysop of the APORTFOLIO conference on
Compuserve.
Thanks also to all the students (Those bug stomping fools!)
in my Programming Languages Course, Spring 1991, at the
American University.
ADDRESS
If you have an comments, suggestions or bug reports, you can
write to the author at:
BJ Gleason
The American University
CSIS (Thin Air Labs)
4400 Massachusetts Avenue, N.W.
Washington, DC 20016
Compuserve : 73337,2011
This program and documentation can be copied and distributed
freely. It can not be sold or used for commercial purposes
without permission.
PBASIC version 4.1, Copyright 1991 by BJ Gleason.
Portfolio, Atari, Microsoft, GWBASIC are trademarks of their
respective companies.
ə