See all articles from ZXir QLive Alive! v11 n1
The following HiSoft Pascal source code augments and provides some alternative methods to the graphic functions and procedures provided in the Turtle Graphics package that is supplied with HiSoft’s Pascal Version 1.7M compiler for the ZX Spectrum.
CIRCLE(X,Y,R) draws a circle, center X,Y and radius
R.
DISK(X,Y,R) draws a series of circles at center
X,Y in an attempt to fill a disk of radius R.
PLOT(X,Y) is a relative draw like the ZX
Spectrums DRAW function but no third
parameter is allowed so curves cannot be drawn.
LINE(X1,Y1,X2,Y2)draws a straight line between X1,Y1
and X2,Y2.
FILL(X1,Y1,X2,Y2) shades a rectangle. X1,Y1 specifies
the bottom left hand corner and X2,Y2 is the top
right corner.
COPY is identical to the BASIC COPY function.
Most of the procedures work by calling the appropriate ZX Spectrum ROM subroutines. Others use a procedure which has already been defined.
PROCEDURE CIRCLE(X, Y, R : INTEGER);
BEGIN
POKE(23681, ORD(R));
POKE(23728, ORD(X));
POKE(23729, ORD(Y));
INLINE(
#D9, {EXX }
#E5, {PUSH HL }
#D9, {EXX }
#3A,#B0,#5C, {LD A,(5C81)}
#CD,#28,#2D, {CALL 2D28 }
#3A,#B1,#5C, {LD A,(5CB1)}
#CD,#28,#2D, {CALL 2D28 }
#3A,#81,#5C); {LD A,(5C81)}
INLINE(
#CD,#28,#2D, {CALL 2D28 }
#CD,#2D,#23, {CALL 232D }
#D9, {EXX }
#E1 {POP HL }
#D9); {EXX }
END;
PROCEDURE DISK(X, Y, R : INTEGER);
VAR I : INTEGER;
BEGIN
FOR I := R DOWNTO 1 DO
CIRCLE(X, Y, I);
END;
PROCEDURE PLOT(X, Y : INTEGER);
BEGIN
POKE(23728, ORD(X);
POKE(23729, ORD(Y);
INLINE(#ED, #4B, #B0, #5C, {LD BC,(5CB0)}
#CD, #E5, #22); {CALL 22E5 }
END;
PROCEDURE DRAWBY(X, Y : INTEGER);
BEGIN
IF X < 0 THEN POKE(23296, ORD(#FF));
IF X >= 0 THEN POKE(23296, ORD(1));
IF Y < 0 THEN POKE(23297, ORD(#FF));
IF Y >= 0 THEN POKE(23297, ORD(1));
POKE(23728, ORD(ABS(X)));
POKE(23729, ORD(ABS(Y)));
INLINE(#D9, {EXX }
#E5, {PUSH HL }
#D9, {EXX }
#ED, #4B, #B0, #5C, {LD BC,(5CB0)}
#ED, #5B, #00, #5B, {LD DE,(5B00)}
#CD, #BA, #24, {CALL 24BA }
#D9, {EXX }
#E1, {POP HL }
#D9); {EXX }
END;
PROCEDURE LINE(X1, Y1, X2, Y2 : INTEGER);
BEGIN
POKE(23677, ORD(X1));
POKE(23678, ORD(Y1));
DRAWBY(X2-X1, Y2-Y1);
END;
PROCEDURE FILL(X1, Y1, X2, Y2, INK : INTEGER);
VAR I : INTEGER;
BEGIN
WRITELN(CHR(16), CHR(INK));
FOR I := 1 TO X2 DO
BEGIN
PLOT(I, Y1);
DRAWBY(0, Y2-Y1);
END;
END;
PROCEDURE COPY;
BEGIN
USER(#0EAC);
END;
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.