Автор: Richard M. Taylor,Richard Taylor
Год: 1984
Издатели: Your Computer
Языки:
Английский
Формат:
TZX лента
Требования:
ZX Spectrum 16K,
ZX Spectrum 48K
Ссылки:
Страница на ZXArt
Страница на World Of Spectrum
Страница на Spectrum Computing
Скриншоты:
Год: 1984
Издатели: Your Computer
Языки:
Формат:
Требования:
Ссылки:
Скриншоты:
Display
Richard Taylor points the way
to better graphics display commands
for the 16K and 48K Spectrum
The Spectrum has a distinct lack of commands to produce
graphic displays. Its PLOT, DRAW and CIRCLE commands are
very rudimentary and do nothing to exploit the full graphic
potential of this high resolution machine. To produce
displays worthy of this machine's graphic capabilities
requires a complex and confusing assortment of the vague
statements that Sinclair Basic does possess. Other machines
often have commands to draw ellipses, rectangles and
triangles and the additional facility to paint specific
areas of the screen in different colours. In order to
partially remedy this fundamental problem, I present a
machine-code program for both the 16K and 48K machines.
[At this point, the instructions followed for entering,
checking and saving the code, none of which is relevant
if you already have the TZX - which you should if you're
reading this. We return to the text at:]
To load the program back into the machine use:
For 48K owners
CLEAR 64623: LOAD ""CODE
For 16K owners
CLEAR 31855: LOAD ""CODE
[which, reasonably, assumes that you only entered the code
for your own machine. The TZX contains both; take care to
load the correct one.]
The commands are put in REM statements. Each REM state-
ment which contains the new commands must be preceded by a
RANDOMIZE USR 64624
on 48K machines and
RANDOMIZE USR 31856
on 16K machines. The REM statement must be the next command
after this machine-code call instruction, be it the next
statement on the same line or the first statement on the
following line. If this rule is neglected then the computer
will respond with error C - "Nonsense in BASIC".
Whether you type the commands in upper or lower case or
a combination of the two, the new statements will be recog-
nised by the computer. If any sort of error occurs as a
result of incorrect syntax, it will be interpreted by the
computer as an error C.
In normal Basic commands which print onto the display,
it is possible to put colour parameters just after the
keyword. This is not possible with the new commands, so you
must use a slightly different method. If you intend to use
the universal colours which have been set up using the INK,
PAPER, FLASH, BRIGHT, OVER and INVERSE commands as solitary
statements, then you must make the first command in the REM
statement a TEMPS. This merely indicates to the computer
that you wish to use the universal colours in all succeed-
ing commands in that REM statement.
Conversely, if you wish to set up your own temporary
colours then you must place a dummy PRINT statement as the
statement preceding the RANDOMIZE USR instruction. This
PRINT statement contains the colour information. For
example:
PRINT INK 3; PAPER 7;
will set the colours to magenta ink on yellow paper. The
PRINT statement does not actually affect the contents of
the screen, only the temporary colours. When using this
method, no TEMPS command is required as you are not using
the universal colours.
There now follows a description of each of the six
commands:
MOVE x,y: This command simply moves the plot position to
x,y. As Sinclair Basic stands, it has no facility to do
this unless you use
PLOT INVERSE 1; OVER 1; INK 8; PAPER 8;
BRIGHT 8; FLASH 8;x,y
but this is a little bit complicated. The command is espe-
cially useful for moving the plot position prior to using a
paint command.
The two parameters, x and y, can be entered in one of a
couple of ways. Either you can put the number in directly -
i.e.
MOVE 128,88
or you can use a variable name - i.e.
MOVE a,b
The only stipulation when using variables is that it must
be a single letter simple numeric variable. If you use a
variable that is not defined then the computer will respond
with the usual error 2 - "Variable not found".
The above notes apply to any of the other new commands
which have parameters. Please note that you are not allowed
to do any mathematics in the parameters, e.g.
MOVE a-1,b-3
Instead you could do something like
LET x=a-1: LET y=b-3
and then
MOVE x,y
LINE x,y or LINE (x1,y1)-(x2,y2): The LINE command has
two different possible formats. The first format has the
form
LINE x,y
where x and y are the co-ordinates of a point on the
screen. The command draws a line from the last position
plotted to the point supplied. The advantage of this is
that it uses real screen points rather than the relative
displacements used on the Sinclair DRAW command. This
method is often more easy to use.
The colour of the line is determined by a dummy PRINT
statement preceding the RANDOMIZE USR command if you are
using temporary colours or by a preceding TEMPS instruction
if you are using the universal colours.
The second form of the command is slightly different and
is similar to the line command found on micro-computers
running Microsoft Basic. Its form is
LINE (x1,y1)-(x2,y2)
It draws a line from the point x1,y1 to the point x2,y2.
This has the same effect as the rather more cumbersome
MOVE x1,y1/LINE x2,y2
BOX x,y: This command draws a rectangle on screen at the
current position with a length of x and a height of y. The
last plotted position is used as the bottom left hand
corner of the rectangle.
Again, the colour of the box is determined in a similar
way to that in the previous command, LINE.
CIRCLE x,y: Unlike the normal CIRCLE command, this one
allows you to draw ellipses as well as normal circles. The
circle's centre is determined by the last plotted position.
The first of the two parameters, x, is the radius of the
circle while the second parameter gives the height-width
ratio of the circle. This must be in the range of 1 to 255,
10 being the ratio for a normal circle.
PAINT: This command allows you to paint a particular
area of the screen in a certain colour. The command paints
from the last plotted position in all directions until it
reaches an ink border. It is important that the start
position is not a point which has been plotted to an ink
colour - hence the need for a MOVE command - otherwise the
computer will think that that is an ink border and the
painting will not go as you would expect it to go. The
routine will not paint behind objects which are in the
start position's "shadow"; see figure 2.
+--------------------------+
|#################Unpainted|
|#################area##|##|
|#######+----------+ | |
|###o###| | v |
|###^###| | |
|###|###+----------+ |
|#Start####################|
|#position#################|
+--------------------------+
Figure 2.
It is sometimes necessary to start from a couple of pouits
to completely paint an irregular area. The command will,
however, properly paint any rectangle where-ever the start
position is, as long as it is inside the rectangle's boun-
daries.
WCLS a,b,c,d: This command allows you to clear part of
the screen, while leaving the remainder intact. This is
often a useful facility when you are using different parts
of the screen for different purposes. The parameters a and
b describe the column and line positions respectively of
the top left hand corner of the area to be cleared.
Parameter c describes how many columns are to be cleared
while the final parameter, d, describes how many lines are
to be cleared. As you may have noticed, these line and
column numbers are given the opposite way around to the way
in which they are given for the PRINT AT instruction, which
has the line number first, followed by the column number.
The screen area cleared is described in a diagrammatic form
in figure 3.
+--------------------------+
|\_ -------- c -------> |
| \_ |
| | \_ |
| | |
| d Area |
| | cleared |
| v |
| |
+--------------------------+
Figure 3.
The colour of the cleared area is described in the normal
fashion for the new commands. Please note, however, when
using the TEMPS command the area is cleared with
PAPER 8; FLASH 8; BRIGHT 8;
so that only the ink colour is actually altered. This
situation can be remedied by using an empty dummy print
statement instead of a TEMPS command - i.e.
PRINT;
Listing 4 to 7 give example uses of the new commands and
serve to clear up any misunderstandings you might have
concerning the syntax. [The magazine versions worked only
on a 48K machine, and had to be modified for the 16K; the
ones on the TZX adapt themselves to RAMTOP.]
Richard Taylor points the way
to better graphics display commands
for the 16K and 48K Spectrum
The Spectrum has a distinct lack of commands to produce
graphic displays. Its PLOT, DRAW and CIRCLE commands are
very rudimentary and do nothing to exploit the full graphic
potential of this high resolution machine. To produce
displays worthy of this machine's graphic capabilities
requires a complex and confusing assortment of the vague
statements that Sinclair Basic does possess. Other machines
often have commands to draw ellipses, rectangles and
triangles and the additional facility to paint specific
areas of the screen in different colours. In order to
partially remedy this fundamental problem, I present a
machine-code program for both the 16K and 48K machines.
[At this point, the instructions followed for entering,
checking and saving the code, none of which is relevant
if you already have the TZX - which you should if you're
reading this. We return to the text at:]
To load the program back into the machine use:
For 48K owners
CLEAR 64623: LOAD ""CODE
For 16K owners
CLEAR 31855: LOAD ""CODE
[which, reasonably, assumes that you only entered the code
for your own machine. The TZX contains both; take care to
load the correct one.]
The commands are put in REM statements. Each REM state-
ment which contains the new commands must be preceded by a
RANDOMIZE USR 64624
on 48K machines and
RANDOMIZE USR 31856
on 16K machines. The REM statement must be the next command
after this machine-code call instruction, be it the next
statement on the same line or the first statement on the
following line. If this rule is neglected then the computer
will respond with error C - "Nonsense in BASIC".
Whether you type the commands in upper or lower case or
a combination of the two, the new statements will be recog-
nised by the computer. If any sort of error occurs as a
result of incorrect syntax, it will be interpreted by the
computer as an error C.
In normal Basic commands which print onto the display,
it is possible to put colour parameters just after the
keyword. This is not possible with the new commands, so you
must use a slightly different method. If you intend to use
the universal colours which have been set up using the INK,
PAPER, FLASH, BRIGHT, OVER and INVERSE commands as solitary
statements, then you must make the first command in the REM
statement a TEMPS. This merely indicates to the computer
that you wish to use the universal colours in all succeed-
ing commands in that REM statement.
Conversely, if you wish to set up your own temporary
colours then you must place a dummy PRINT statement as the
statement preceding the RANDOMIZE USR instruction. This
PRINT statement contains the colour information. For
example:
PRINT INK 3; PAPER 7;
will set the colours to magenta ink on yellow paper. The
PRINT statement does not actually affect the contents of
the screen, only the temporary colours. When using this
method, no TEMPS command is required as you are not using
the universal colours.
There now follows a description of each of the six
commands:
MOVE x,y: This command simply moves the plot position to
x,y. As Sinclair Basic stands, it has no facility to do
this unless you use
PLOT INVERSE 1; OVER 1; INK 8; PAPER 8;
BRIGHT 8; FLASH 8;x,y
but this is a little bit complicated. The command is espe-
cially useful for moving the plot position prior to using a
paint command.
The two parameters, x and y, can be entered in one of a
couple of ways. Either you can put the number in directly -
i.e.
MOVE 128,88
or you can use a variable name - i.e.
MOVE a,b
The only stipulation when using variables is that it must
be a single letter simple numeric variable. If you use a
variable that is not defined then the computer will respond
with the usual error 2 - "Variable not found".
The above notes apply to any of the other new commands
which have parameters. Please note that you are not allowed
to do any mathematics in the parameters, e.g.
MOVE a-1,b-3
Instead you could do something like
LET x=a-1: LET y=b-3
and then
MOVE x,y
LINE x,y or LINE (x1,y1)-(x2,y2): The LINE command has
two different possible formats. The first format has the
form
LINE x,y
where x and y are the co-ordinates of a point on the
screen. The command draws a line from the last position
plotted to the point supplied. The advantage of this is
that it uses real screen points rather than the relative
displacements used on the Sinclair DRAW command. This
method is often more easy to use.
The colour of the line is determined by a dummy PRINT
statement preceding the RANDOMIZE USR command if you are
using temporary colours or by a preceding TEMPS instruction
if you are using the universal colours.
The second form of the command is slightly different and
is similar to the line command found on micro-computers
running Microsoft Basic. Its form is
LINE (x1,y1)-(x2,y2)
It draws a line from the point x1,y1 to the point x2,y2.
This has the same effect as the rather more cumbersome
MOVE x1,y1/LINE x2,y2
BOX x,y: This command draws a rectangle on screen at the
current position with a length of x and a height of y. The
last plotted position is used as the bottom left hand
corner of the rectangle.
Again, the colour of the box is determined in a similar
way to that in the previous command, LINE.
CIRCLE x,y: Unlike the normal CIRCLE command, this one
allows you to draw ellipses as well as normal circles. The
circle's centre is determined by the last plotted position.
The first of the two parameters, x, is the radius of the
circle while the second parameter gives the height-width
ratio of the circle. This must be in the range of 1 to 255,
10 being the ratio for a normal circle.
PAINT: This command allows you to paint a particular
area of the screen in a certain colour. The command paints
from the last plotted position in all directions until it
reaches an ink border. It is important that the start
position is not a point which has been plotted to an ink
colour - hence the need for a MOVE command - otherwise the
computer will think that that is an ink border and the
painting will not go as you would expect it to go. The
routine will not paint behind objects which are in the
start position's "shadow"; see figure 2.
+--------------------------+
|#################Unpainted|
|#################area##|##|
|#######+----------+ | |
|###o###| | v |
|###^###| | |
|###|###+----------+ |
|#Start####################|
|#position#################|
+--------------------------+
Figure 2.
It is sometimes necessary to start from a couple of pouits
to completely paint an irregular area. The command will,
however, properly paint any rectangle where-ever the start
position is, as long as it is inside the rectangle's boun-
daries.
WCLS a,b,c,d: This command allows you to clear part of
the screen, while leaving the remainder intact. This is
often a useful facility when you are using different parts
of the screen for different purposes. The parameters a and
b describe the column and line positions respectively of
the top left hand corner of the area to be cleared.
Parameter c describes how many columns are to be cleared
while the final parameter, d, describes how many lines are
to be cleared. As you may have noticed, these line and
column numbers are given the opposite way around to the way
in which they are given for the PRINT AT instruction, which
has the line number first, followed by the column number.
The screen area cleared is described in a diagrammatic form
in figure 3.
+--------------------------+
|\_ -------- c -------> |
| \_ |
| | \_ |
| | |
| d Area |
| | cleared |
| v |
| |
+--------------------------+
Figure 3.
The colour of the cleared area is described in the normal
fashion for the new commands. Please note, however, when
using the TEMPS command the area is cleared with
PAPER 8; FLASH 8; BRIGHT 8;
so that only the ink colour is actually altered. This
situation can be remedied by using an empty dummy print
statement instead of a TEMPS command - i.e.
PRINT;
Listing 4 to 7 give example uses of the new commands and
serve to clear up any misunderstandings you might have
concerning the syntax. [The magazine versions worked only
on a 48K machine, and had to be modified for the 16K; the
ones on the TZX adapt themselves to RAMTOP.]