LET turtle x limit = 100.0; LET turtle y limit = 100.0; enter turtle graphics: INT VAR x base, y base; REAL VAR x scale, y scale, x range, y range, x pos, y pos, dx, dy, angle; enter graphics mode; INT CONST size :: min (trunc (real (graphics x limit - 1)/aspect), graphics y limit - 1), xmin :: 1 + (graphics x limit - trunc (real (size) * aspect) - 1) DIV 2, ymin :: 1 + (graphics y limit - size - 1) DIV 2; turtle window (xmin, xmin + size, ymin, ymin + size, turtle x limit, turtle y limit). PROC turtle window (INT CONST xmin, xmax, ymin, ymax, REAL CONST x rng, y rng): x range := x rng + 1.0; y range := y rng + 1.0; x base := max (1, xmin); y base := min (graphics y limit, ymax); INT CONST x top :: min (graphics x limit, xmax); INT CONST y bottom :: max (1, ymin); x scale := real (x top - x base + 1) * aspect / x range; y scale := real (y base - y bottom + 1) / y range; angle := pi / 2.0; dx := cos (angle); dy := sin (angle); x pos := 0.0; y pos := 0.0; move (x base, y base) ENDPROC turtle window; leave turtle graphics: leave graphics mode. PROC move (REAL CONST l): move (x pos + dx * l, y pos + dy * l) ENDPROC move; PROC draw (REAL CONST l): draw (x pos + dx * l, y pos + dy * l) ENDPROC draw; PROC new coord (REAL CONST x, y): x pos := x; y pos := y; IF x < 0.0 THEN x pos := 0.0 ELIF x > x range THEN x pos := x range FI; IF y < 0.0 THEN y pos := 0.0 ELIF y > y range THEN y pos := y range FI ENDPROC new coord; PROC move (REAL CONST x, y): new coord (x, y); move (trunc (x pos * x scale) + x base, y base - trunc (y pos * y scale)) ENDPROC move; PROC draw (REAL CONST x, y): move (trunc (x pos * x scale) + x base, y base - trunc (y pos * y scale)); new coord (x, y); draw (trunc (x pos * x scale) + x base, y base - trunc (y pos * y scale)) ENDPROC draw; PROC turn (REAL CONST a): angle INCR a; dx := cos (angle); dy := sin (angle) ENDPROC turn; PROC turn (INT CONST angle): turn (pi * real (angle) / 180.0) ENDPROC turn; PROC turn right: angle DECR pi / 2.0; REAL CONST h :: dy; dy := - dx; dx := h ENDPROC turn right; PROC turn left: angle INCR pi / 2.0; REAL CONST h :: dy; dy := dx; dx := - h ENDPROC turn left; INT PROC ask int (TEXT CONST message): INT VAR x; put (message); get (x); x ENDPROC ask int; REAL PROC ask real (TEXT CONST message): REAL VAR x; put (message); get (x); x ENDPROC ask real; TEXT PROC ask text (TEXT CONST message): TEXT VAR t; put (message); get (t); t ENDPROC ask text; REAL PROC sin (INT CONST a): sin (pi * real (a) / 180.0) ENDPROC sin; REAL PROC cos (INT CONST a): cos (pi * real (a) / 180.0) ENDPROC cos; PROC wait for confirmation (INT CONST x, y): move (x, y); put ("Hit space!"); TEXT CONST t :: inchar ENDPROC wait for confirmation; PROC leave graphics mode: page; enter text mode ENDPROC leave graphics mode;