diff options
Diffstat (limited to 'tek40.scm')
-rw-r--r-- | tek40.scm | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/tek40.scm b/tek40.scm new file mode 100644 index 0000000..f45a1fa --- /dev/null +++ b/tek40.scm @@ -0,0 +1,92 @@ +;"tek40.scm", Tektronix 4000 series graphics support in Scheme. +;Copyright (C) 1992, 1994 Aubrey Jaffer +; +;Permission to copy this software, to redistribute it, and to use it +;for any purpose is granted, subject to the following restrictions and +;understandings. +; +;1. Any copy made of this software must include this copyright notice +;in full. +; +;2. I have made no warrantee or representation that the operation of +;this software will be error-free, and I am under no obligation to +;provide any services, by way of maintenance, update, or otherwise. +; +;3. In conjunction with products arising from the use of this +;material, there shall be no use of my name in any advertising, +;promotional, or sales literature without prior written consent in +;each case. + +;THIS FILE NEEDS MORE WORK. + +;The Tektronix 4000 series graphics protocol gives the user a 1024 by +;1024 square drawing area. The origin is in the lower left corner of +;the screen. Increasing y is up and increasing x is to the right. + +;The graphics control codes are sent over the current-output-port and +;can be mixed with regular text and ANSI or other terminal control +;sequences. + +; (tek40:init) procedure + +(define (tek40:init) 'noop) + +(define esc-string (string (integer->char #o33))) + +(define tek40:graphics-str + (string-append + (string slib:form-feed) + esc-string (string (integer->char #o14)) + ;; clear the screen + )) + +(define (tek40:graphics) (display tek40:graphics-str) (force-output)) + +(define (tek40:text) + (tek40:move 0 12) + (write-char (integer->char #o37))) + +(define (tek40:linetype linetype) + (cond ((or (negative? linetype) (> linetype 15)) + (slib:error "bad linetype" linetype)) + (else + (display esc-string) + (write-char (integer->char (+ (char->integer #\`) linetype)))))) + +(define (tek40:move x y) + (write-char (integer->char #o35)) + (tek40:draw x y)) + +(define (tek40:draw x y) + (display (string + (integer->char (+ #x20 (quotient y 32))) + (integer->char (+ #x60 (remainder y 32))) + (integer->char (+ #x20 (quotient x 32))) + (integer->char (+ #x40 (remainder x 32)))))) + +(define (tek40:put-text x y str) + (tek40:move x (+ y -11)) + (write-char (integer->char #o37)) + (display str)) + +(define (tek40:reset) (display tek40:graphics-str) (force-output)) + +(define (tek40:test) + (tek40:init) +; (tek40:reset) + (tek40:graphics) + (tek40:linetype 0) + (tek40:move 100 100) + (tek40:draw 200 100) + (tek40:draw 200 200) + (tek40:draw 100 200) + (tek40:draw 100 100) + (do ((i 0 (+ 1 i))) + ((> i 15)) + (tek40:linetype i) + (tek40:move (+ (* 50 i) 100) 100) + (tek40:put-text (+ (* 50 i) 100) 100 (number->string i)) + (tek40:move (+ (* 50 i) 100) 100) + (tek40:draw (+ (* 50 i) 200) 200)) + (tek40:linetype 0) + (tek40:text)) |