Graphics Procedures for HiSoft Pascal

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.