EXTENDED BASIC
by Robert Newman
from Your Computer, September 1984


EXPANDED BASIC

Nine new commands for Spectrum Basic, courtesy of Robert Newman.


I HAVE WRITTEN a machine code routine which adds nine new commands to
Spectrum Basic which will run with or without Interface 1. The
machine-code routine must be loaded and initialised before either
writing a program or loading a program which uses the new commands. If
you do this it is not necessary to save the machine code again when
you save your program.

A short Basic program, listing 1 (16K) or listing 2 (48K), is used to
load the machine code above RAMtop, and perform the initialisation.
This program should be typed in, and then saved on a cassette or
Microdrive cartridge to auto-run from line 3. If you use a Microdrive,
the program can be given the filename "run"; ie.:
	SAVE *"m";1;"run" LINE 3
or
	SAVE "BASIC+" LINE3

NEW the computer, then type in and RUN listing 3, the machine code
loader program. Copy the machine code bytes from either listing 4 or 5
depending upon memory size. Great care must be taken while copying
from the machine code dump, since a single mistake could cause the
computer to crash.

You should now have a working copy of the Basic+ interpreter. To test
it, rewind the tape and clear the computer by typing RANDOMIZE USR 0.
Then load the initialisation program and machine code, and type *ZAP
which should produce a laser type sound effect.


Graphic characters

*USE (Nchars),(Memory): (Nchars) is the number of different graphic
characters that you want to use, and can take values from 1 to 255.
(Memory) is the memory size in bytes needed for storing those
characters. To calculate the number of bytes required to store each
character, divide its width by 8, and add 1 for any remainder, then
multiply by its height.

This command causes part of the memory to he reserved for the storage
of your graphics characters. The total number of bytes required is
(Memory)+(Nchars)*4 bytes. For example, the command *USE 8,256
reserves 288 bytes. If you try to reserve more memory for your
graphics than the spare memory available, this will halt your program
with a runtime error.

The graphics memory area is situated just before the start of the
machine code. If necessary, RAMtop will be lowered - and the machine
stack and GO SUB stack moved - to make room for the graphics memory.
The routine will only lower RAMtop, and never moves it to a higher
address. This is to allow your own machine-code routines to be used
with extended Basic provided that they are located between the
graphics memory and RAMtop.

The *Use command clears the graphics memory and character size
definitions - see *Def - and can be used more than once in a program
for this purpose. If there is no *Use command in a program, the
command USE 8,256 is assumed by the routine.

*DEF (Char),(Width),(Ht): After *Use, the *Def command is used to set
the size of a graphics character. (Char) is the character number,
which can take values from 1 to (Nchars). (Width) and (Ht) are the
sizes of this character in pixels - from 1 to 256 pixels wide, and
from 1 to 176 pixels high. You must set the size of a character before
using it in one of the remaining commands, which are:-
*GET (char),(xpos),(ypos)
*PUT (char),(xpos),(ypos)
*CLR (char),(xpos),(ypos)
Lines 2,3 and 4 of the initialisation program can be deleted once the
machine code has loaded, but you must not delete line 1, otherwise
none of the new commands will be recognised when you RUN your program.

During runtime, if the command cannot be executed, the error message
produced is code Q - "Parameter error."

*BRK 0 and *BRK 1: These commands allow the break key to be disabled
(*BRK 0), or re-enabled (*BRK 1).

*ZAP: This command gives a laser-type zap sound.

*NSE (Length): This command gives white noise for a time depending
upon (Length) which can take values from 1 to 255. Depending upon the
length, this can sound like an explosion, gunshot, etc. A machine-gun
type sound can be made using a loop - eg.: FOR j=1 TO 10: *NSE 50:
PAUSE 10: NEXT j

*SCR (Paper),(Ink): This command changes the Paper and Ink colours of
the screen without erasing its contents. Paper and Ink can take values
from 0 to 9 as with the normal colour commands.

The remaining commands are concerned with printing of user-defined
graphics. These can be copied from the screen into graphics memory
with *Get and then printed anywhere on the screen with *Put. The
routine can handle graphics of any size from 1 by 1 pixels to 256 by
176 pixels, and caters for up to 255 different graphics characters.

First, you need to decide how much memory you want to set aside for
the storage of graphics characters. This is done with the *Use
command.

In all three commands, (Char) is the character number - the size of
which must have previously been defined with *Def. (Xpos) and (Ypos)
are the pixel co-ordinates of a point on the screen at the top left
hand corner of the area from where the graphic character information
is to be copied from, printed to, or erased.

The *Get command will copy a character from the specified position on
the screen, and store it in graphics memory. It can then be printed
anywhere on the screen using *Put. If the values of (Xpos) and (Ypos)
cause part of the character to go over the edge, then it will
wrap-around to the opposite side of the screen. The *Clr command can
be used to erase a character, or alternatively it can be used to clear
a window on the screen.

For example, the instructions:
*DEF 1,16,16: *GET 1,0,175: *PUT 1,240,15
would copy an are of the screen 16 by 16 pixels in size from the top
left of the screen to the bottom right.
