Parrot BASIC 2.0
What is it?
It's an implementation of BASIC in Parrot. Unlike version 1, this is modeled
after Microsoft's QuickBASIC version 4.5. A quick list of features:
* It's compiled directly to Parrot Assembly (TARG_test.pasm by default)
and not interpreted.
* Richer syntax than Parrot BASIC 1.0, which was modeled after
GW-BASIC
* Much, much faster than Parrot BASIC 1.0
* Support for user-defined types
* Support for variable scopes+
(+ QB has bizarre ideas of scope. Caveat Programmer.)
I couldn't find a proper book on QuickBASIC, and believe it or not Google wasn't
terribly helpful in finding a good manual. I did have a QB.exe and a few
help files for information.
What's missing?
The things that are missing fall into three classes.
"Someday I'll do these, there's hooks for it but I need a break now."
* Keywords: defint const static ubound
* SHARED in DIM statements
* Exception handling
* The keyword USING
* The "* length" modifier for strings
* Forward-declarations (DECLARE) are missing. For now, your DIM's and
functions must by defined before they're used.
* DEF FN. It's a special case of FUNCTION.
"These are *hard* and I may not do them, ever"
* Keywords: common chain bload bsave cseg
"These are nearly impossible given where Parrot is now.
maybe when the I/O gets rounded out and some libraries
get added. Like graphics, sound, and filesystem access."
* Keywords: screen pset preset line circle draw
view window pmap color palette paint
get put pcopy beep sound locate view
width resume pos poke peek rset
* Most directory manipulations
* Record (binary) I/O
And I probably have a whacked idea of I/O in QuickBASIC anyway.
What's incomplete?
Mostly the File I/O stuff. Surprisingly, basic file I/O is working properly.
See test #47.
What's a hack?
Dirty little secrets of PB2:
* single/double are simply Parrot Nx registers
* int/long are simply Parrot Ix registers
* Everything is case insensitive.
* Arrays are really hashes. Yes, "foo(a$)" is now legal BASIC.
* Other bad syntax is forgiven or Something Interesting happens
* The _STARTASM directive lets you put PASM in your BASIC code.
(see testsuite.pl for an example)
* I couldn't wrap my brain around BASIC's scoping to write the
expression evaluator properly. It's a kind of dynamic scoping
that hurts my head. So the expression evaluator is a postfix
machine.
* The DIM statement doesn't really need to indicate any kind of
size at all. DIM a$(1) will set aside a$ as any n-dimension
array of any size.
Probably many others that I've forgotten about.
How do I get going? Quickstart?
1. Edit "testrun.pl" and change the pathname at the beginning of the
script to wherever parrot is.
2. Type "compile.pl wumpus2.bas"
This produces "TARG_test.pasm" and "TARG_localfuncs.pasm"
3. Type "testrun.pl" and enjoy.
eliza2 and wumpus2 are simply ports from the Parrot BASIC 1.0 version. All
that had to be done were to add DIM statements and a RANDOMIZE.
What're more hacks?
The implementation for CLS, LOCATE, and COLOR. :)
Is there a BASIC debugger?
Yup. A simple one was added in 2003/05/16. To get it started, you have to compile
for debugging with: compile.pl program.bas debug 1
And then the commands are:
\n -- Step once, or no-op if not stepping
c -- Continue (clears step mode)
s -- Step (sets step mode)
b,xxx -- set breakpoint at x
d,xxx -- delete breakpoint at x
p,var -- display var's value (no arrays yet)
aw,var -- add var to watchlist
dw,var -- delete var from watchlist
pw -- print watches
daw -- delete all watches
Where's the advanced syntax stuff?
Once you've fixed "testrun.pl" as noted above, the script "testsuite.pl" will
run BASIC through its self-tests. If you look through the script there's examples
of almost every kind of syntax that I've got working.
What are all of these files?
RT_* Runtime Libraries. Things like the expression evaluator
and builtin functions (add, sub, mul, sin, cos, etc..)
COMP_* The compiler itself. Please, oh please don't look at this
Perl code. It's terrible. The intention is to re-write the
code in PASM and so it's very wide-open and loose for easier
translation.
TARG_* The output from the compiler. TARG_test.pasm is the main body
of your program. TARG_localfuncs.pasm is any functions and
subroutines you've declared.
compile.pl
The Compiler. Call as "compile.pl filename.bas" to compile
a BASIC program.
testrun.pl
Calls the assembler to put the program together and runs it.
testsuite.pl
The regression test, to make sure I haven't botched anything.
samples/eliza2.bas
wumpus2.bas
GW-BASIC programs "ported".
newtrek.bas
Super Star Trek, demo for PB2 syntax (incomplete implementation)
conn4.bas
Connect4 from Creative Computing
readme.bas
Reads through this readme file
END