                        Tortoise II



           Chris Davison coaxes the Spectrum's'

             graphics out of their shells with

               an ingenious Basic-Logo mix.



One of the most outstanding features of the ZX Spectrum is

its graphics capability. Unfortunately Basic was never

designed to handle graphics and, as a result of this, it is

not easy to produce complex graphic displays.

  Logo, on the other hand, was designed to handle graph-

ics, and does so very well, but it is little more than a

graphics language. So imagine the graphics capability of

Logo combined with the mathematical and control capabili-

ties of Basic, combine them into one language and you have

Tortoise.

  The idea behind turtle graphics is simple: basically, as

readers of the BBC-orientated articles in Your Computer

January 1983 will know, you are in control of a turtle.

  You can instruct the turtle's movements along some sur-

face - for example, the screen, and hence create shapes.

For examine, telling the turtle to:

        Move forward one unit

        Turn 90 to the left

        Move forward one unit

        Turn 90 to the left

        Move forward one unit

        Turn 90 to the left

        Move forward one unit

would draw a square. The actual commands of the language

are given later on. Obviously here we can say

        Move forward one unit

        Turn 90 to the left

four times, or by using the Basic construct

        FOR-NEXT

we can say:

        FOR count=1 TO 4

            (Forward one unit

            turn 90 to the left)

        NEXT count

  Having looked at turtle graphics, let us now look at

Tortoise itself.

  The format which Tortoise commands take is as follows.

An instruction is made up of a letter followed by some

parameters separated by commas. A program is made up by a

number of instructions followed by an * and all separated

by colons.

  So the instruction to move forward five units is:

           f5

          /  \

     Letter  Parameter

and to move to square 50,50 we have

          m50,50

         / / | \

   Letter /Comma\

    Parameter Parameter

Combine the these into a Program and we have

         f5:m50,50:*

         /-|---+--\ \

      Ins1 | Ins2  \ *

         Colon   Colon

  A parameter may be any of the following: a constant, a

variable, an expression. Now that you know a little about

the language, let us look at the program itself.

  The routine at 200-330 is designed to let you play turtle

before you combine Tortoise with Basic. You are limited to

just one loop, yet you can produce some very exciting

results. After the prompt

        Instruction>

type in your program, for example, try:

        fa:r90:*

followed by Enter. The code is then displayed at the top of

the screen and the prompt:

        Loop a start>

is given. This asks you at what value you would like the

loop a to start from. Try

        2

Then you are asked where you wish the count to finish, try

        50

Finally you are asked in what steps you wish the count to

be incremented: try

        1

  The screen clears and your program is executed. If you

tried the example given, then you should see a square

spiral being drawn.

  When it finishes, the prompt

        Instruction>

appears again and you can try something else. Note that

this time your drawing will start from the last point plot-

ted, that is, at the end of the spiral, so you may with to

move back to the centre. To do this you can use the Move

command:

        m128,88:*

This time type in 1 for all three loop questions; you will

then be ready for your next program. The whole emphasis of

this type of program is on experimentation, so do not be

frightened to have a bash at something new.



  Once you have used the package a few times you may wish

to progress. If you delete 200-330, or type

        180 GO TO 400

and start your program at 400, you can now type in your own

program. Your computer will only accept Basic, so we must

fool it into thinking that Tortoise is Basic. This is done

by placing your Tortoise code into the string s$ and then

        GO SUB tort

to access the main program. So your spiral program now

looks like this:

        400 LET s$="fa:r90:*"

        410 FOR a=2 TO 50 STEP 1

        420 GO SUB tort

        430 NEXT a

        440 STOP

Do not forget to start your program with

        GO SUB 9200

This sets up all the variables used.

  When writing your Basic program, be careful not to use

the variables used by the package - see variable list. You

may use them if you wish but remember the package has its

own use for them, so exercise extreme caution. Try this

program:

        LET s$="m0,0:ba,20,b:*" [sic - this doesn't work]

        FOR a=0 TO 2*PI STEP 0.1

            LET b=COS(a)*80+80

            GO SUB tort

        NEXT a

        STOP

The designs are only limited by your imagination.



  Now for descriptions of each routine. First the b for Box

routine. For example:

        b3,5

This draws a box between the last plotted point and your

two parameters, 3 and 5 in the above example. The c for

Circle:

        c7

This draws a circle, whose radius is given as the parameter

and whose centre is the last plotted point.

  The e for Edge routine, for example:

        e6

This changes the colour of the border to that given by the

parameter, that is e6 changes it to yellow. The f for For-

ward routine, for example:

        f7

This moves the turtle forward a distance given by the para-

meter, so here the turtle would move seven spaces forward.

  The i for Ink routine, for example:

        i4

This changes the colour of the trail left by the turtle,

that is, i4 changes it to green. All colours are as normal

on the Spectrum. The m for Move routine, for example:

        m0,0

This moves the last plotted position to the specified co-

ordinate, in this example, the bottom left-hand corner.

  The p for Polygon routine, for example:

        p5,40,10

This draws a polygon, whose number of sides is given by the

first parameter. The first side of that polygon is a line

between the last plotted position and the last two para-

meters. In this example the polygon is a pentagon.

  The r for Rotate routine, for example:

        r90

This changes the routine in which the turtle is heading.

Note that the parameter specifies degrees, so here the

turtle turns at a right angle to its old direction.

  The s for Screen routine, for example:

        s6,0

This changes both the ink and the paper colours, but leaves

the actual picture untouched. The first parameter is ink,

and the second one paper. So in this example we have yellow

ink on black paper.

  All that information may be summarised into table 1. All

X,Y co-ordinates are absolute, also colours are as normal

on a Spectrum, for example: 0 is black, 7 is white and so

on.



Now you have seen how to use the program, let us look at

the program itself.

  Here is a list of the routines used:

 200 Interaction. This allows the user to use turtle

     graphics without using Basic.

6000 Decode. This takes each instruction from s$ and breaks

     it doesn into separate parameters. These are then

     stored in v(), v(1) holds the number of parameters,

     the first parameter being held in v(2).

7500 Box       7900 Forward    8200 Polygon

7600 Edge      8000 Ink        8300 Rotate

7570 Circle    8100 Move       8400 Screen

9000 Tortoise. This breaks the program into instructions,

     and then uses Decode to obtain parameters. It then

     calls the relevant routine.

9200 Initialisation. This sets up all the variables to

     their starting values.

  Here is a list of all the variables used:

v()         Holds all the parameters of current instruction

s$          Holds the Tortoise program

tort        Address of Tortoise routine (9000)

x,y         Last plotted position

xi,yi       x and y increment, altered by Rotate

oldxi,oldyi

rad,oldrad  Direction in radians

length      Length of side of polygon

angle       Angle between sides of polygon

i,a         Loop counts

x1,x2,x3    From, to, step in For-Next loop

pt          Pointer for s$

vi          Index for v()

l$          Segment of s$

c$          Command letter



  Here are some programs to be run in the interaction

routine. The three numbers above each line represent the

start, end and step for each loop.

        (1)  1,72,1

             "m128,88:f72:r-5:*"

        (2)  1,109,1

             "m200-a:f55:r-5:*"

        (3)  1,43,1

             "fa*2:r90:ca:*"

        (4)  3,100,1

             "fa:r70:*"

        (5)  3,76,1

             "fa*2:r123:*"

        (6)  1,201,1

             "fa:r177:*"

        (7)  3,11,1

             "m100,0:pa,150,0:*"

        (8)  1,112,1

             "fa:c4:r80:*"

Note that you will have to re-centre the last plotted

position each time you run one of the above.



 Table 1.|      |  Para- |  Para- |  Para- 

 Name    |Letter| meter 1| meter 2| meter 3

 --------+------+--------+--------+--------

 Box     |  b   |X co-ord|Y co-ord|

 Circle  |  c   | Radius |        |

 Edge    |  e   | Colour |        |

 Forward |  f   |Distance|        |

 Ink     |  i   | Colour |        |

 Move    |  m   |X co-ord|Y co-ord|

 Polygon |  p   | No. of |X co-ord|Y co-ord

         |      | sides  |        |

 Rotate  |  r   |Degrees |        |

 Screen  |  s   |  Ink   | Paper  |