;; TURTLE.L for PC-LISP.EXE V2.13 ;; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;; A set of rough turtle graphics primitives to demonstrate PC-LISP's BIOS ;; graphics routines. These routines are pretty self explanitory. The first ;; 5 defun's define the primitives, next are a set of routines to draw things ;; like squares, triangles etc. Try the function (GraphicsDemo). It will ;; draw Squirals, Trianglerals, etc. Note that the BIOS line drawing is really ;; slow. This is because the BIOS 'set dot/pixel' routine is used for every ;; point in a line. Using the BIOS has the advantage however of portability, ;; these routines work on virtually every MS-DOS machine. The global variable ;; !Mode controls the graphics resolution that will be used. It is set by ;; default to 6, I set it to 8 or 9 for my Tandy 2000. You can adjust the code ;; to support your machines higher resolution modes. More 640x400 modes can be ;; supported by (= !Mode NN) at ### PATCH POINT 1 ### where NN is the value ;; to pass to (#srcmde#) Ie the value to pass in AH when INT 10H is generated ;; with AL=0 (the BIOS Set CRT Mode call). If your machines has high resolution ;; modes besides the 640x400 say X * Y resolution associated with mode NN then ;; add the following code at ### PATCH POINT 2 ### (where AA is X/2, BB is Y/2 ;; CC is the ratio X/Y and DD is the number of pixels that should correspond ;; to one Turtle movement Unit): ;; ;; ((= !Mode NN) ;; (setq CenterX AA CenterY BB Scale CC Lfactor DD) ;; (TurtleCenter)) ;; ;; Peter Ashwood-Smith ;; August 22nd, 1986 ;; (setq !Mode 6) ; default setting (defun TurtleGraphicsUp() (#scrmde# !Mode)(#scrsap# 0) (cond ((= !Mode 6) ; 640x200 B&W mode (setq CenterX 100 CenterY 100 Scale 3.2 Lfactor 1) (TurtleCenter)) ; ((= !Mode 7) (patom '|mode 7 not allowed|)) ; ((or (= !Mode 8) (= !Mode 9) ; Tandy 2000 640x400 (= !Mode 64) ; AT&T 6300 640x400? ; ### PATCH POINT 1 ### ) (setq CenterX 266 CenterY 200 Scale 1.2 Lfactor 2) (TurtleCenter)) ; ; ### PATCH POINT 2 ; (t (patom '|unsupported mode|)) ) ) (defun TurtleGraphicsDown() (#scrmde# 2)) (defun TurtleCenter() (setq Lastx CenterX Lasty CenterY Heading 1.570796372)) (defun TurtleRight(n) (setq Heading (plus Heading (times n 0.01745329)))) (defun TurtleLeft(n) (setq Heading (diff Heading (times n 0.01745329)))) (defun TurtleGoTo(x y) (setq Lastx (quotient x Scale) Lasty (times y Lfactor) )) (defun TurtleForward(n) (setq n (times n Lfactor) Newx (plus Lastx(times(cos Heading)n)) Newy (plus Lasty(times(sin Heading)n))) (#scrline# (times Lastx Scale) Lasty (times Newx Scale) Newy 1) (setq Lastx Newx Lasty Newy) ) ; ; end of Turtle Graphics primitives, start of Graphics demonstration code ; you can cut this out if you like and leave the Turtle primitives intact. ; (defun Line_T(n) (TurtleForward n) (TurtleRight 180) (TurtleForward (quotient n 4)) ) (defun Square(n) (TurtleForward n) (TurtleRight 90) (TurtleForward n) (TurtleRight 90) (TurtleForward n) (TurtleRight 90) (TurtleForward n) ) (defun Triangle(n) (TurtleForward n) (TurtleRight 120) (TurtleForward n) (TurtleRight 120) (TurtleForward n) ) (defun Make(ObjectFunc Size times skew) (prog() TOP:(cond ((zerop times) (return))) (ObjectFunc Size) (TurtleRight skew) (setq times (1- times)) (go TOP:) ) ) (defun GraphicsDemo() (TurtleGraphicsUp) (Make Square 40 18 5) (Make Square 60 18 5) (gc) ; idle work (TurtleGraphicsUp) (Make Triangle 40 18 5) (Make Triangle 60 18 5) (gc) ; idle work (TurtleGraphicsUp) (Make Line_T 80 50 10) (gc) ; idle work (TurtleGraphicsDown) )