Release PandaBAS 0.826 released!


Deep avatar
Oct 12, 2010
Up on the Repo RIGHT NOW:

Enjoy - lots of changes to this version, not least of which is a massive speed improvement due to a new rendering system :)

Here's the changelog for those that like that sort of thing:




UNDIM array() will remove an array from memory - can be quite slow, so avoid using it in tight loops!

CLEAR [array()[,value/value$]] will fill an array with a value or string depending on type

IVAL takes a string and extracts as much of an integer as it can - "128|678" will return "128" for example - does not perform evaluation as for VAL

POS has a new (optional) parameter - POS(substr,string[,start]) begins searching "string" for "substr" at position "start"

CHANGE: UDGs have been changed, and no longer require the CHR$ 1 prefix in a string. As a result, there's only 128 of them in a font

SPRITE NEW id COPY id - to copy from one already existing sprite to another. Use COLLIDE and WRAP after COPY to override behaviour

SCREEN$ - as from Sinclair BASIC, identifies characters at an x and y coordinate. Only for mono fonts, matches current INK and PAPER

REPLACE$ function does a text "search and replace" with three parameters: string to search, text to replace, text to replace with

CURVE now optionally takes three coordinates (as opposed to just two) - x1,y1 TO x2,y2 TO x3,y3 which ignores previous plotted position

TIME$ takes similar parameters to DATE$ and works on time (hours, minutes, seconds)

DATE$ takes a time (TIME function for example) and a string to format, ie "dd/mm/yyyy"

Direct expressions and their results are now added to the command history for quick recall

SPRITE COLLIDE CLEAR now takes an optional sprite ID to only clear the collision flag of that sprite

The HEX function works like BIN - returns a decimal version of the hexadecimal argument. As with BIN, there's no need for prefixes

DO can now take an optional numeric argument - DO 35: PRINT "X": LOOP will loop 35 times without needing a variable to keep count

Sorting arrays can now be performed in both ascending and descending order by adding the INVERSE switch

All commands which output graphics primitives (CIRCLE, PRINT etc) can now use alpha channel information and render to a 32bit window

32bit font support - each character's pixel is a 4byte value (ARGB) format

RGBtoHSV and HSVtoRGB now accept either a single integer argument or three separate arguments

32bit display target, in preparation for 32bit graphic support. This means quite a slow down in some situations on single-core machines

Subdivided rectangles are now used in the renderer to prevent overdraw - very large speed increase on single-core machines

Further optimisations - expression re-ordering, so the optimiser can be more efficient

You can now use the ":" character as a tab-character to indent your FOR..NEXT loops if you really want

OVER 10 - multiplies two pixels together

OVER 8 and OVER 9 - Maximum and minimum respectively - performs a pixel-by-pixel compare

Optimised the stack-machine which has gained a significant speed increase

Numeric array accesses are now much faster

ARSIZE a$() returns the number of items in any array, including dynamic arrays

LBOUND(a$(),i) returns the lower bounds of the i'th subscript of a non-dynamic array

UBOUND(a$(),i) returns the upper bounds of the i'th subscript of a non-dynamic array

TRANSPARENT 1/0 inlined into PRINT commands now works for mono fonts too

JOIN$ function takes a string array and a separator - LET b$=JOIN$(a$()," ") will compile all of a$() into one string, each separated by a space.

String splitting: DIM a$(SPLIT "my|test|string", NOT "|") will split the string into an array of three strings, excluding the "|" - NOT is optional if you want to keep it in

ON EVERY events don't now take a condition if you don't want them to - it's optional

ON... Events no longer need an explicit RETURN after their handler statements

PRINT USING mask$;item;item;item etc - similar to a regular USING formatting string

USING$ function - identical to PRINT USING() but returns a formatted string

Specifying a default fill no longer requires an emptry string for the texture - CIRCLE x,y,r FILL will suffice

PACKAGE truncation and consolidation - optimised package size on close

DECIMAL(val$,base) function converts from a base to decimal

Arbitrary base numbers can now be inlined. Eg: 10 PRINT A10QP\36 (note the backslash) denotes a base-36 number

RECTANGLE can now take coordinates as x,y,w,h as well as x1,y1 TO x2,y2

MATCH(regexp$,text$) returns the position of the first match using a regular expression against the supplied text


CAT shows the wildcard match string correctly

The wildcard "*" when used with CAT now matches at least no characters instead of one

Error messages (including 0:OK) would halt all sound when displayed - now sound is stopped when the error is cleared

The IN operator now has a lower priority than functions and inequalities, but higher than AND/OR/NOT

A small bug in string slice assigns that caused a crash in multistatement lines

Expressions that start with a decimal point no longer fail to parse on the command line

Collision bugs where many sprites collide at once

Fixed a small bug in package handling that caused overwriting and CAT to fail

Omitting a loop-control variable in FOR EACH caused the editor to hang

Small rounding errors in the turtle graphics routines

The new, faster render loop caused out of bounds errors for SDL under linux when drawing to offscreen surfaces

FOR .. NEXT loops that have lost their destination are flagged as such in LIST VAR now

All RGB (and ARGB) colours use the same format now

RED, GREEN, BLUE didn't retrieve the correct values due to the 32bit update changes to the palette system

HEX$ and BIN$ didn't work with some larger numbers

RENUMBER sets lines that jump out of the program (past the last line) to a line greater than the last line

Structure member assignment failed due to an error in LET

ON EVERY <x> didn't insert the correct keyword handler after the frame counter

INCLUDE with an invalid filename crashed SpecBAS

INCLUDE with multiple files (or multiple INCLUDEs on one line) failed to add procs or crashed

Accessing an array using an array as an index works now

Possible fix for keyboards that use Alt-Gr for some characters (such as Portuguese)

Sprite collisions were a tad sticky, even after clearing the collision flag

Base notation didn't work for any base that was a multiple of 10

Base notation can now be used as a direct expression

A long-standing bug where GOSUB statements were ignored by the RENUMBER command

The IN operator was too high a priority, rendering 2+1 IN [0 TO 3] as 3, rather than 1

Clicking and dragging the mouse off SpecBAS's window whilst in the editor caused a crash

CASE...WHEN IN... statements caused a hang

Single-line CASE...WHEN...END CASE constructs, although insane, now work properly

Auto-DIMmed arrays set their values in the wrong arrays at times

SPRITE ANIM PLAY ignore the OPTION parameter if start and end were left unspecified

DIM SPLIT arrays created empty arrays in some circumstances

Array keys (associative arrays) now follow the values properly when sorted

SPRITE ANIM PLAY got frame indices mixed up - Again

ELSE was treated as a statement in itself, which screwed up things like RETURN after an ELSE GOSUB

IIF and IIF$ would cause a crash if they evaluated to FALSE more than once in a loop

INPUT now uses the current scaling for the initial position of the INPUT prompt

DELETE past the end of the program caused a crash

FOR EACH with a string var and a range of characters stupidly appended an extra "$" to the varname, rendering it unusable

Sprites wrap correctly when overlapping other sprites

Sprites no longer stutter when they collide (if their collision flag is disabled)

Editor windows were transparent - not that you'd notice, but they render faster now

Zones return their correct ID numbers when other zones are deleted

DIV now does a proper integer divide...

Runs of arithmetic operators weren't always correctly merged

PALETTE HSV now accepts HUE values in the correct range of 0 to 360

INKEY$ now picks up other keys that may be pressed when a key goes up

WAIT (all versions) cleared the keybuffer inappropriately, causing INKEY$ to lose keys

In the Win32 version, some keys weren't recognised correctly at times, turned out to be a Unicode issue

DEF PROC, when executed, didn't jump past the end of the procedure properly

END PROC didn't exit cleanly after a loop

EXIT didn't clean the stack properly and so caused issues with END PROC

Timed events (ON <condition> EVERY <framecount>) now trigger after the correct time interval

ON ERROR (and other ON events) didn't return properly after they had been handled

Adding an extra index to a string array reference wasn't parsed as a slicer

String multiplication was occasionally incorrectly parsed
Have fun, and feedback here or on the official forum:

As usual, the manual is inside the PND, and is available in your Documentation section of the XFCE menu.

PC windows/Linux and Raspberry PI versions to come later.

Last edited by a moderator: