;;; -*-mode:lisp;package:lambda;base:8 -*-


;; this file will have the diagnostic for the multiplier chip


(defun write-multiplier-2-complement (data)
  (write-spy-reg-and-check data)
  (lam-execute (write)
    lam-ir-op lam-op-alu
    lam-ir-ob lam-ob-alu
    lam-ir-m-src lam-m-src-spy-reg
    lam-ir-func-dest lam-func-dest-multiplier
    lam-ir-aluf lam-alu-setm
    lam-ir-slow-dest 1
    lam-ir-mf 3))

(defun write-multiplier (data)
  (write-spy-reg-and-check data)
  (lam-execute (write)
    lam-ir-op lam-op-alu
    lam-ir-ob lam-ob-alu
    lam-ir-m-src lam-m-src-spy-reg
    lam-ir-func-dest lam-func-dest-multiplier
    lam-ir-aluf lam-alu-setm
    lam-ir-slow-dest 1
    lam-ir-mf 0))

(defun read-multiplier-ft ()
  (lam-execute (read)
    lam-ir-op lam-op-alu
    lam-ir-ob lam-ob-alu
    lam-ir-m-src lam-m-src-multiplier-ft
    lam-ir-aluf lam-alu-setm)
  (read-mfo))

(defun read-multiplier ()
  (lam-execute (read)
    lam-ir-op lam-op-alu
    lam-ir-ob lam-ob-alu
    lam-ir-m-src lam-m-src-multiplier
    lam-ir-aluf lam-alu-setm)
  (read-mfo))

(defun write-multiplier-stepping (data)
  (write-spy-reg-and-check data)
  (lam-execute (executor lam-execute-noclocks)
    lam-ir-op lam-op-alu
    lam-ir-ob lam-ob-alu
    lam-ir-m-src lam-m-src-spy-reg
    lam-ir-func-dest lam-func-dest-multiplier
    lam-ir-aluf lam-alu-setm
    lam-ir-slow-dest 1)
  (sm-step-loop))

(defun read-multiplier-stepping ()
  (lam-execute (executor lam-execute-noclocks)
    lam-ir-op lam-op-alu
    lam-ir-ob lam-ob-alu
    lam-ir-m-src lam-m-src-multiplier-ft
    lam-ir-aluf lam-alu-setm)
  (sm-step-loop))


(defun multiply-16-bit-unsigned-number (data1 data2)
  (let* ((low-half 177777)
	 (data (+ (logand low-half data1)
		  (dpb (ldb 020 data2) 2020 0))))
    (write-multiplier data)
    (read-multiplier-ft)))

