; Signals.Lisp
; Assemble List of proc-mem signals and their schematic page references
; See file "signals.help" for usage.


(defvar *signal-labels* ())


(defun find-position-in-list-equal (item-name list-name)
  (do ((i 0 (1+ i)))
      ((= i (length list-name)))
    (if (equal (elt list-name i) item-name)
	(return-from find-position-in-list-equal i)))
  nil)


(defun build-signal-list ()
  (let ((label-name ())
	(label-position 0)
	(page-number 0)
	(page-number-list ())
	)
    (viewf "signals.help")
    (format t "~%~%Ready...~%~%")
    (do-forever
      (cond
        ((null (setq label-name (read)))              ; no more, go print lists.
	 (return))
	((null (setq label-position (find-position-in-list-equal label-name *signal-labels*)))
	 (setq label-position 0
	       *signal-labels* (append (list label-name () ) *signal-labels*)
	       )))
      (setq page-number-list (elt *signal-labels* (1+ label-position)))
      (do ((i 0 (1+ i)))
	  ((= i (length page-number-list)))
	(format t "~D " (elt page-number-list i)))
      (loop while (not (zerop (setq page-number (read))))
	(cond
	  ((minusp page-number)
	   (setq page-number (* -1 page-number))
	   (if (not (member page-number page-number-list))
	       (princ "? ")
	     (setq page-number-list (remove page-number page-number-list)))
	   (setf (elt *signal-labels* (1+ label-position)) page-number-list)
	   (when (null page-number-list)
	     (setq *signal-labels* (remove () *signal-labels*))
	     (setq *signal-labels* (remove label-name *signal-labels*))
	     (format t " ~A deleted..." label-name)
	     (return)))
	  (t
	   (setq page-number-list (cons page-number page-number-list))
	   (setf (elt *signal-labels* (1+ label-position)) page-number-list))))
      (format t "~%"))
    (do ((i 0 (1+ i)))
	((= i (length *signal-labels*)))
      (print (elt *signal-labels* i)))
    ))

