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 |