Description
- This description is based on the original Bally manuals as well as .
Zgrass was based on a standard set of BASIC commands and used most of its syntax. Where Zgrass differed from BASIC was that all commands were in fact functions and returned values, similar to the C programming language. If there was no obvious return value it was expected that a function would return 1 if it succeeded, and 0 if it failed. For instance, the command PRINT PRINT 10
would be illegal in BASIC, but in Zgrass this would print 10 1
, the 1 being the value returned by second PRINT
, meaning "I successfully output the string '10'".
Programs in Zgrass were referred to as "macros", and stored as strings. Both of these oddities were deliberate, as Zgrass allowed any string to become a program. For instance, MYBOX="BOX 0,0,100,100,2"
defines a string (no need for a $ as in BASIC) containing a snippet of Zgrass code. Simply typing MYBOX
from that point on would run the command(s) inside. This feature can be used in place of the more traditional GOSUB
command from BASIC, but has the added advantage of having a well defined name as opposed to an opaque line number. In addition the command remains a string, and can be manipulated at runtime with standard string operations.
Most BASIC interpreters of the era converted the input text into a "tokenized" version in which each of the commands was replaced by a single number (typically one byte long). This made the program run faster because it didn't have to continually decode the commands from the strings every time. Zgrass's use of string-based macros made this difficult, so they didn't bother with tokenization. Instead they included a compiler which could be used on any particular macro, speeding it up many times. Programs would often consist of a mix of compiled and uncompiled macros.
Line numbers were optional in Zgrass, and typically only appeared on lines that were the target of a GOTO
. Most BASIC interpreters required line numbers for every line of code, but this was due to their use in the "line editor"–if you needed to edit that line, the only way to refer to it was by number. Zgrass used a more advanced full-screen editor that eliminated this need. Zgrass allowed any string to act as a "line number", GOTO 10
and GOTO MARKER
were both valid. Zgrass also included nameless branches, using the SKIP
instruction, which would move forward or back a given number of lines.
In keeping with its original purpose as a graphics language, Zgrass included numerous commands for simple drawing. Zgrass's coordinate system was based on that of the original graphics chip that Nutting had designed, based on a 320×202 grid. The Astrocade, for unknown reasons, used only half the resolution, a 160×101 display. To avoid potential mapping problems, the coordinate space's zero point was placed in the center of the screen. −160 to 160 were valid X locations, and -101 to 101 valid Y locations. For use on the Astrocade you used the positive locations only, whereas on the UV-1 the entire space was available.
Zgrass added a fairly complete set of array functions, as arrays are widely used in graphics. This included the ability to "capture" parts of the display into an array as a bitmap, which could then be manipulated as any other graphic item. This allowed Zgrass to include sprite-like functionality in the language, something the Nutting hardware did not include. Another feature the Astrocade did not include was the ability to process arrays with any reasonable speed, so the UV-1 included the Zilog supplied FPU for added performance.
Zgrass included three priorities (called levels) that allowed macros to be run normally, or in "foreground" or "background" levels. This added a simple form of multitasking which was tremendously useful in an animation-oriented language. Game authors could place joystick-reading routines in a macro set to run in the background, and then the joystick would be read automatically whenever the current drawing macro completed. Functions placed in the foreground ran before either, and was often used for timers and other "low latency" needs. Zgrass included a TIMEOUT
function that would call macros on a timed basis, making the implementation of timers very easy.
Zgrass also included a series of commands that "covered" CP/M, which allowed the disk to be accessed without exiting to the command prompt. You could easily save out macros to named files, and load them in the same way, allowing you to construct programs by loading up various macros from the disk into one large program. The commands also automatically made a backup copy of every save. Similar features were supported for cassette tape storage, but oddly the syntax was marred, disk commands were D-something, like DPUT
while tape commands were something-TAPE, like PUTTAPE
.
With programs constructed from randomly selected modules, Zgrass needed to have better control over its variables than BASIC. In BASIC all variables are "global", so if two subroutines both use the variable i
(very common) then they could set each other's values leading to hard to debug problems. Under Zgrass a programmer loading up two modules would almost certainly find that both used i as a loop counter, and thus could cause problems. To address this problem, Zgrass allowed one to use lowercase letters for variables, in which case the variable was local only to that macro. Oddly the examples provided with the language do not make widespread use of this feature, potentially confusing new programmers who might not be aware the feature even exists.
Read more about this topic: GRASS (programming Language)
Famous quotes containing the word description:
“It [Egypt] has more wonders in it than any other country in the world and provides more works that defy description than any other place.”
—Herodotus (c. 484424 B.C.)
“He hath achieved a maid
That paragons description and wild fame;
One that excels the quirks of blazoning pens.”
—William Shakespeare (15641616)
“I fancy it must be the quantity of animal food eaten by the English which renders their character insusceptible of civilisation. I suspect it is in their kitchens and not in their churches that their reformation must be worked, and that Missionaries of that description from [France] would avail more than those who should endeavor to tame them by precepts of religion or philosophy.”
—Thomas Jefferson (17431826)