Turtle Ian Collier with a Logo graphics program for the Spectrum. This is an implementation of the turtle graphics part of Logo, adapted into about 15 commands. To set up the machine code the listing of data must be entered and run. The data will be read and Poked in by the Basic program. After creating the graphics code it should be ready for use at 30000. It may, however, need to be moved, for example to a higher address in a 48K Spectrum. Having saved the code with SAVE "logo"CODE 30000,1600 the relocate program will move the code, first by loading it in at the new address, if this has not already be done, then changing the absolute addresses. A copy of the code at 30000 should be retained for the demonstration program. Program 1 [which also expects the code to be at 30000] allows you to use the turtle graphics without writing a prgoram. It incorporates one loop using the control varia- ble a, which can be set up. Commands are as follows: DIR x - Points turtle in a direction x degrees anticlockwise from horizontal right. CIR x - Draws a circle around the turtle, radius x pixels. BOX x,y - Draws a box with two diagonally opposite corners at the turtle and (x,y). FOR x - Moves the turtle forward, leaving a trail. BOR x - =BORDER x FIL x,y,z - Fills in any enclosed area in ink z, starting at (x,y). If filling starts at the edge of the area, then it is possible that only half will be filled, so aim for the middle. POL x,y,z - Draws a polygon with x sides, moving first to (x,y) and going anticlockwise. INK x - Any further drawing will be in ink x; this only lasts to the end of the line of instructions. JUM x - Moves the turtle forward x pixels without changing the screen (Jump). ROT x - Rotates the turtle x degrees anticlockwise. MOV x,y - Moves the turtle to (x,y). PLO x,y - Moves the turtle to (x,y) and plots a pixel. SCR x,y - Changes the screen colours to paper x and ink y without erasing the patterns. REP x - Marks the start of a set of instructions to be repeated x times. Also sets up the Basic variable Rep which is equal to the counter of the innermost loop. Note Rep starts at x and goes down to 1. END - Marks the end of the repeated instructions. The instructions can be in upper or lower case. The prompt Instructions will appear and the instructions must be typed in (I have printed out some examples [which seem to have gone missing somewhere between author and printer]). Then the prompt For a= will appear and you must set up the loop as in Basic by typing three numbers fol- lowed by Enter, e.g. FOR a=1 TO 50 STEP 1 If a loop is not required, three 1s can be entered. If a mistake has been entered in the instructions, the program will stop with a report. Otherwise, the instruc- tions will be carried out and you may then enter some more. Each time a set of instructions is entered, the screen is cleared and the turtle is moved to the centre of the screen and pointed horizontally right. To use the commands in a program they must be initia- lised. If the code is still in its original position, this is done by: RANDOMIZE USR 30000 The syntax checker will now accept the new commands, but to use the commands, they must be re-initialised if the pro- gram has been altered. This is so that the new position of the variables is recognised, and the new defined procedures are found. The commands need to be initialised after Clear and Run, as these reset the machine stack. If Interface 1 is connected, this adds complications. [He's not joking; with the Interface 1 attached, the Demo won't even work when loaded normally. One solution I've found is to _first_ use a Microdrive command, such as CAT 1 - there does not have to be a Microdrive loaded, getting the error message is OK - and only then to load the program.] The new commands are regarded by the program as syntax errors unless followed by a turtle graphics command, but they work within a program. Also, when one of the new error reports - e.g. Microdrive not present - is caused, this resets the machine stack and the graphics commands need to be re-initialised. To enter the new commands, they must be placed inside quotes, but at the end of a line, the final quotes may be omitted. For use in a program, there is one more command - Cal. It calls instructions at the address given. If these in- structions are in a string, the address of the instructions needs to be found and the string needs to be prepared by inserting the hidden floating point forms after the numbers - these will not be hidden in a string and will appear as question marks and other characters. This is done by the routine at 31500 and is demonstrated in program one in lines 145,9510. New commands are like definable procedures. For an exam- ple see the command .sta in the demo program. To define a procedure, open quotes as usual and type a full stop fol- lowed by the three-letter name, then a colon. The commands following this will be executed every time the new command is encountered. The end of the defined command is at the first close quotes encountered in the definition, or at the end of the line. [ And now a bit about the TZX. This starts with the machine code loader, followed by the code relocator. A note about this last one: it does not check for overlaps, so you can't relocate the code to anywhere between 30001 and 31599. This should not be a major limitation. After these come first the Demo program, and then the one which the article only ever refers to as "Program 1". I've decided to call it "Shell", as it is, in essence, a command shell for this system. These both auto-run to load the machine code at 30000, which follows them on the TZX, at that address. All these programs, by the way, will run on the 16K Spectrum as well. Finally, let's repair a lacuna in the article. The author promised some samples for the shell program, but they got lost along the way. Therefore, here are a few I've adapted (i.e., nicked) from some other Logo implementa- tions for the Spectrum. Where the values for FOR a are relevant, I've given them; otherwise, just enter 1,1,1. The basic (NPI) Logo demonstration: a square. rep4:for40:rot90:end mov80,60:rep8:for40:rot45:end:rot45:rep8:for96:rot135:end This one demonstrates that loops can be nested. Even if the value of the variable "rep" for the outer loop is not available within the inner loop, the system does remember correctly where it left off. rep12:rot30:rep8:rot45:for20:end:end A few spirals, using the loop facility: fora:rot70 for a=3 to 100 step 1 An odd one, but still a spiral: fora:rot177 for a=1 to 177 step 1 Another spiral, demonstrating that you can use expres- sions as well as plain variables: fora*2:rot123 for a=3 to 76 step 1 Note that these could just as well have been written to use rep, in which case the loop is inside the string rather than outside it. This does require a bit of adaptation. For example: rep177:for178-rep:rot177:end mov100,0:pola,150,0 for a=3 to 11 step 1 Don't forget that it is also instructive to check how the Demo program uses the various commands. Richard Bos, april 2012 ]