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 "perl compile.pl samples/wumpus2.bas" This produces "TARG_test.pir" and "TARG_localfuncs.pir" 3. Type "perl 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