pcs/newpcs/kldscope.s

150 lines
4.5 KiB
ArmAsm
Raw Permalink Normal View History

2023-05-20 05:57:05 -04:00
;;; Sample graphics routines using the %GRAPHICS primitive.
;;; Note that %GRAPHICS may change in meaning in future versions of the system,
;;; as it has between versions 2.0 and 3.0.
;;; Using macros or define-integrables to protect your code
;;; from explicit uses of %GRAPHICS is highly recommended.
;;; Determine what type of video adapter we have.
(define video-type
(lambda ()
(if (= pcs-machine-type 1)
;; it's TI
'ti
;; it's IBM
(let ((mode (%graphics 5 0 0 0 0 0 0))) ;; get video mode
(case mode
(3 'cga)
((14 16) 'ega)
(else 'cga))))))
;;; Initialize Graphics (sets palette registers; clears graphics planes)
(define grinit
(lambda ()
(case (video-type)
(ti (%graphics 0 0 0 0 0 0 0) ;; clear graphics
(window-clear (make-window "" '())))
(cga (%graphics 0 4 0 0 0 0 0) ;; 4-color graphics mode
(%graphics 2 0 0 0 0 0 0) ;; set background to black
(%graphics 2 1 0 0 0 0 0)) ;; use black,red,green,brown
(ega (%graphics 0 16 0 0 0 0 0) ;; 16-color graphics mode
(%graphics 2 0 0 0 0 0 0) ;; not necessary here
(%graphics 2 1 0 0 0 0 0))
)))
; Set point
(define-integrable setp
(lambda (x y color) (%graphics 1 x y color 0 0 0)))
; Reset point (turns it off)
(define-integrable resetp
(lambda (x y) (%graphics 2 x y 0 0 0 0)))
; Draw Line
(define-integrable line
(lambda (x1 y1 x2 y2 color)
(%graphics 3 x1 y1 x2 y2 color 0)))
; Read Point (returns its color)
(define-integrable point
(lambda (x y) (%graphics 4 x y 0 0 0 0)))
; %graphics 5 is identical to get-video-mode
; Draw box
(define-integrable draw-box
(lambda (x1 y1 x2 y2 color)
(%graphics 6 x1 y1 x2 y2 color 0)))
; Draw Filled Box
(define-integrable draw-filled-box
(lambda (x1 y1 x2 y2 color)
(%graphics 7 x1 y1 x2 y2 color 0)))
; Kaleidoscope Program [Translated from Basic]
; Note: To stop this program, press the "q" key. To start a new pattern
; going, press any other key.
(alias kldscope kald)
(alias kaleidosope kald)
(define kald
(lambda ()
(let* ((old-video-mode (%graphics 5 0 0 0 0 0 0))
(vmode (video-type))
(accel-range (case vmode (ti 12) (cga 6) (ega 12)))
(accel-adj (case vmode (ti 5) (cga 3) (ega 5)))
(usable-colors (case vmode (ti 7) (cga 3) (ega 15)))
(wh (case vmode (ti 360) (cga 160) (ega 320)))
(mi (case vmode (ti 145) (cga 75) (ega 150)))
(ycenter-offset (case vmode (ti 5) (cga 25) (ega 25)))
;; Add 5/25/25 (TI/CGA/EGA) to y-coordinates 'cause we said that the
;; screens are only 290/150/300-pixels high when, in actuality,
;; they're 300/200/350.
(m1 (+ mi 1))
(xv1 nil)
(xv2 nil)
(yv1 nil)
(yv2 nil)
)
(letrec
(
(quit-kald
(lambda ()
(grinit)
(%graphics 0 old-video-mode 0 0 0 0 0)
(window-set-cursor! 'console 0 0)
(gc)
*the-non-printing-object*
))
(loop
(lambda (a n color x1 y1 x2 y2)
(cond ((positive? a)
(let ((2x1 (+ x1 x1))
(2y1 (+ y1 y1))
(2x2 (+ x2 x2))
(2y2 (+ y2 y2))
(w wh)
(m (+ mi ycenter-offset)))
(line (+ w 2x1) (- m y1) (+ w 2x2) (- m y2) color) ; 1
(line (- w 2y1) (+ m x1) (- w 2y2) (+ m x2) color) ; 2
(line (- w 2x1) (- m y1) (- w 2x2) (- m y2) color) ; 3
(line (- w 2y1) (- m x1) (- w 2y2) (- m x2) color) ; 4
(line (- w 2x1) (+ m y1) (- w 2x2) (+ m y2) color) ; 5
(line (+ w 2y1) (- m x1) (+ w 2y2) (- m x2) color) ; 6
(line (+ w 2x1) (+ m y1) (+ w 2x2) (+ m y2) color) ; 7
(line (+ w 2y1) (+ m x1) (+ w 2y2) (+ m x2) color) ; 8
(if (positive? n)
(loop (- a 1)
(- n 1)
color
(remainder (+ x1 xv1) m1)
(remainder (+ y1 yv1) m1)
(remainder (+ x2 xv2) m1)
(remainder (+ y2 yv2) m1))
(restart))))
((not (char-ready?))
(set! xv1 (- (random accel-range) accel-adj))
(set! yv1 (- (random accel-range) accel-adj))
(set! xv2 (- (random accel-range) accel-adj))
(set! yv2 (- (random accel-range) accel-adj))
(loop (random 10) n (+ (random usable-colors) 1) x1 y1 x2 y2))
((eq? (char-upcase (read-char)) '#\Q)
(quit-kald))
(else
(restart)))))
(restart
(lambda ()
(grinit)
(randomize 0)
(loop 0 (+ 50 (random 200)) 0
(+ (random mi) 1)
(+ (random mi) 1)
(+ (random mi) 1)
(+ (random mi) 1)))))
(begin
(flush-input)
(restart))))))