 ;;; -*- Mode:LISP; Package:LAMBDA; Base:8; Readtable:ZL -*-
;;;
;;; (c) Copyright 1984,1985,1986 - Lisp Machine, Inc.
;;;


;;this file contains the diagnostics for the pdl index, pdl pointer, and the m memory
;;as addressed by them

(DEFUN WRITE-INTERRUPT-CONTROL (NUM)		;write miscellaneous
  (WRITE-SPY-REG-AND-CHECK NUM)  				;register called the
  (LAM-EXECUTE (WRITE)				;interrupt control register which contains
	       LAM-IR-OP LAM-OP-ALU		;the bit controlling the high pdl address
	       LAM-IR-OB LAM-OB-ALU		;(bit 2)
	       LAM-IR-M-SRC LAM-M-SRC-SPY-REG
	       LAM-IR-ALUF LAM-ALU-SETM
	       LAM-IR-FUNC-DEST LAM-FUNC-DEST-INT-CONTROL))


(DEFUN READ-PI ()				;read pdl index register
  (LAM-EXECUTE (READ)
	       LAM-IR-OP LAM-OP-ALU
	       LAM-IR-OB LAM-OB-ALU
	       LAM-IR-M-SRC LAM-M-SRC-PI
	       LAM-IR-ALUF LAM-ALU-SETM)
  (READ-MFO))

(DEFUN WRITE-PI (NUM &OPTIONAL MAKE-SURE &AUX TEMP)		;write pdl index register
  (WRITE-SPY-REG-AND-CHECK NUM)
  (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-ALUF LAM-ALU-SETM
	       LAM-IR-FUNC-DEST LAM-FUNC-DEST-PI)
  (COND ((AND MAKE-SURE (NOT (= (SETQ TEMP (READ-PI)) num)))
	 (FORMAT T "~%write-pi: Wrote ~O, Read back ~O, trying again " num TEMP))))

(DEFUN WRITE-PI-STEPPING (NUM)
  (WRITE-SPY-REG-AND-CHECK NUM)
  (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-ALUF LAM-ALU-SETM
		      LAM-IR-FUNC-DEST LAM-FUNC-DEST-PI)
  (SM-STEP-LOOP))

(DEFUN WRITE-C-PP-STEPPING (NUM)
  (WRITE-SPY-REG-AND-CHECK NUM)
  (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-ALUF LAM-ALU-SETM
		      LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PP)
  (SM-STEP-LOOP))

(DEFUN SEARCH-PDL-BUFFER (QUAN)
  (DOTIMES (ADR 4000)
    (COND ((= (WRITE-PI-AND-READ-C-PI ADR) QUAN)
	   (FORMAT T "~%ADR ~S" ADR)))))

(DEFUN SEARCH-PDL-BUFFER-DOWN (QUAN &OPTIONAL (ADR 3777))
  (DO ()
      ((< ADR 0))
    (COND ((= (WRITE-PI-AND-READ-C-PI ADR) QUAN)
	   (FORMAT T "~%ADR ~S" ADR)))
    (SETQ ADR (1- ADR))))

(DEFUN WRITE-AND-INCREMENT-PI (NUM)		;write and increment pdl index register
  (WRITE-SPY-REG-AND-CHECK NUM)
  (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-ALUF LAM-ALU-SETM
		      LAM-IR-FUNC-DEST LAM-FUNC-DEST-PI)
  (LAM-EXECUTE (WRITE)
	       LAM-IR-OP LAM-OP-ALU
	       LAM-IR-M-SRC LAM-M-SRC-C-PI
	       LAM-IR-OB LAM-OB-ALU
	       LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PDL-INDEX-INC
	       LAM-IR-ALUF LAM-ALU-SETM))


;;;(DEFUN TEST-PI-DATA-PATH NIL (TEST-DATA-PATH "PDL INDEX" 'PI-ACTOR 11.))
;;;  Replaced by TEST-PDL-INDEX


(DEFUN write-and-decrement-pi (num)
  (write-spy-reg-and-check num)
  (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-pi
	       lam-ir-aluf lam-alu-setm)
  (lam-execute (write)
	       lam-ir-op lam-op-alu
	       lam-ir-ob lam-ob-alu
	       lam-ir-m-src lam-m-src-pi
	       lam-ir-func-dest lam-func-dest-c-pdl-index-dec
	       lam-ir-aluf lam-alu-setm))


(DEFSELECT (PI-ACTOR)
  (READ (ADDRESS) ADDRESS
   (READ-PI))
  (WRITE (ADDRESS DATA) ADDRESS
   (WRITE-PI DATA)))

(DEFUN READ-PP ()				;read pdl pointer register
  (LAM-EXECUTE (READ)
	       LAM-IR-OP LAM-OP-ALU
	       LAM-IR-M-SRC LAM-M-SRC-PP
	       LAM-IR-OB LAM-OB-ALU
	       LAM-IR-ALUF LAM-ALU-SETM)
  (READ-MFO))

(DEFUN WRITE-PP (NUM &OPTIONAL MAKE-SURE &AUX TEMP)	;write pdl pointer register
  (WRITE-SPY-REG-AND-CHECK NUM)
  (PROG NIL
     TOP (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-ALUF LAM-ALU-SETM
		      LAM-IR-FUNC-DEST LAM-FUNC-DEST-PP)
	(COND ((AND MAKE-SURE (NOT (= (SETQ TEMP (READ-PP)) num)))
	       (FORMAT T "~%Wrote ~O, Read back ~O, trying again " num TEMP)
	       (GO TOP)))))

(DEFUN WRITE-AND-INCREMENT-PP (NUM)		;write and increment pdl index register
  (WRITE-SPY-REG-AND-CHECK NUM)
  (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-ALUF LAM-ALU-SETM
		      LAM-IR-FUNC-DEST LAM-FUNC-DEST-PP)
  (LAM-EXECUTE (WRITE)
	       LAM-IR-OP LAM-OP-ALU
	       LAM-IR-M-SRC LAM-M-SRC-C-PP
	       LAM-IR-OB LAM-OB-ALU
	       LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PP-PUSH
	       LAM-IR-ALUF LAM-ALU-SETM))

;;;(DEFUN TEST-PP-DATA-PATH NIL (TEST-DATA-PATH "PDL POINTER" 'PP-ACTOR 11.))
;;;  Replaced by TEST-PDL-POINTER



(defun write-and-decrement-pp (num)
  (write-spy-reg-and-check num)
  (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-pp
	       lam-ir-aluf lam-alu-setm)
  (lam-execute (write)
	       lam-ir-op lam-op-alu
	       lam-ir-ob lam-ob-alu
	       lam-ir-m-src lam-m-src-c-pp-pop
	       lam-ir-m-mem-dest 1
	       lam-ir-aluf lam-alu-setm))

(DEFSELECT (PP-ACTOR)
  (READ (ADDRESS) ADDRESS
   (READ-PP))
  (WRITE (ADDRESS DATA) ADDRESS
   (WRITE-PP DATA)))

(DEFUN READ-C-PI ()			;read pdl addressed by index register
  (LAM-EXECUTE (READ)
	       LAM-IR-OP LAM-OP-ALU
	       LAM-IR-OB LAM-OB-ALU
	       LAM-IR-M-SRC LAM-M-SRC-C-PI
	       LAM-IR-ALUF LAM-ALU-SETM)
  (READ-MFO))

(DEFUN READ-C-PP ()				;read pdl addressed by pointer register
  (LAM-EXECUTE (READ)
	       LAM-IR-OP LAM-OP-ALU
	       LAM-IR-M-SRC LAM-M-SRC-C-PP
	       LAM-IR-OB LAM-OB-ALU
	       LAM-IR-ALUF LAM-ALU-SETM)
  (READ-MFO))

(DEFUN WRITE-C-PI (NUM)				;write pdl addressed by index register
  (WRITE-SPY-REG-AND-CHECK NUM)
  (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-ALUF LAM-ALU-SETM
	       LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PI))

(DEFUN WRITE-C-PP (NUM)				;write pdl addressed by pointer register
  (WRITE-SPY-REG-AND-CHECK NUM)
  (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-ALUF LAM-ALU-SETM
	       LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PP))


(DEFUN WRITE-PI-AND-READ-C-PI (ADR)		;write pdl index register and read
  (write-pi adr 'make-sure)		;the contents of the PDL memory at
  (read-c-pi))					;the address indexed by the new pdl
		  				;index register

(DEFUN WRITE-PI-AND-WRITE-C-PI (ADR NUM)		;write pdl index register and writes
  (write-pi adr 'make-sure)			;the contents of the PDL memory at
  (write-c-pi num))					;the address indexed by the new pdl
							;index register

(defun test-pdl-buffer-data-path nil
  (test-data-path "PDL BUFFER" 'pdl-buffer-actor 32.))

(defselect (pdl-buffer-actor)
  (:read (address)
    (write-pi-and-read-c-pi address))
  (:write (address data)
    (write-pi-and-write-c-pi address data)))


(DEFUN TEST-WRITE-VIA-M-READ-VIA-PDL NIL
  (TEST-DATA-PATH "WRITE-VIA-M-READ-VIA-PI" 'WRITE-VIA-M-READ-VIA-PI-ACTOR 32.))

(DEFSELECT (WRITE-VIA-M-READ-VIA-PI-ACTOR)
  (:WRITE (ADDRESS DATA) 
    (WRITE-M-MEM ADDRESS DATA))
  (:READ (ADDRESS) 
    (LET ((OLD-MODE (READ-DP-MODE)))
      (WRITE-DP-MODE 0)
      (PROG1 (WRITE-PI-AND-READ-C-PI ADDRESS)
	     (WRITE-DP-MODE OLD-MODE)))))

;THIS WILL WRITE ANYWHERE IN THE 4K M/PDL-BUFFER MEMORY.
(DEFUN WRITE-M-MEM-VIA-PDL-POINTER (ADDRESS DATA)
  (LET ((OLD-MODE (READ-DP-MODE)))
    (WRITE-DP-MODE (LDB 1301 ADDRESS))
    (WRITE-PP-AND-WRITE-C-PP (LDB 0013 ADDRESS) DATA)
    (WRITE-DP-MODE OLD-MODE)))

;NOTE M-MEM LOCN 0 DOESNT "WORK" SO WE CAN ONLY DO COMPLEMENTED PHASES
(DEFUN FAST-ADDRESS-TEST-PDL-C-PI NIL
  (NOOP-UINST-CLOCKS)			;MAKE SURE NO CARRYOVER WRITES TO SCREW UP
  (write-dp-mode 0)			;Test out the low bits of the PDL
  (LET ((OFFSET 0)
	(N-DATA-BITS 32.)	
	(READ-FCTN 'WRITE-PI-AND-READ-C-PI)
	(WRITE-FCTN 'WRITE-PI-AND-WRITE-C-PI)
	(N-ADDRESS-BITS 11.))
    (FAST-ADDRESS-TEST-KERNAL WRITE-FCTN READ-FCTN
			      OFFSET N-DATA-BITS N-ADDRESS-BITS
			      "FAST-ADDRESS-TEST of PDL addressed by PDL index; low bits" 2)
    (write-dp-mode 1.)		;Test out the high bits of the PDL
    (FAST-ADDRESS-TEST-KERNAL WRITE-FCTN READ-FCTN
			      OFFSET N-DATA-BITS N-ADDRESS-BITS
			      "FAST-ADDRESS-TEST of PDL addressed by PDL index; hi bits" 0)))


(DEFUN WRITE-PP-AND-READ-C-PP (adr)		;write pdl index register and read
  (write-pp adr 'make-sure)	         	;the contents of the PDL memory at
  (read-c-pp))					;the address indexed by the new pdl
						;index register

(DEFUN WRITE-PP-AND-WRITE-C-PP (ADR NUM)	;write pdl index register and writes
  (write-pp adr 'make-sure)		        ;the contents of the PDL memory at
  (write-c-pp num))				;the address indexed by the new pdl
	       					;index 

;NOTE M-MEM LOCN 0 DOESNT "WORK" SO WE CAN ONLY DO COMPLEMENTED PHASES
(DEFUN FAST-ADDRESS-TEST-PDL-C-PP NIL
  (NOOP-UINST-CLOCKS)			;MAKE SURE NO CARRYOVER WRITES TO SCREW UP
  (write-dp-mode 0)			;Test out the low bits of the PDL
  (LET ((OFFSET 0)
	(N-DATA-BITS 32.)	
	(READ-FCTN 'WRITE-PP-AND-READ-C-PP)
	(WRITE-FCTN 'WRITE-PP-AND-WRITE-C-PP)
	(N-ADDRESS-BITS 11.))
    (FAST-ADDRESS-TEST-KERNAL WRITE-FCTN READ-FCTN
			      OFFSET N-DATA-BITS N-ADDRESS-BITS
			      "FAST-ADDRESS-TEST of PDL addressed by PDL Pointer; low bits" 2)
    (write-dp-mode 1.)		;Test out the high bits of the PDL
    (FAST-ADDRESS-TEST-KERNAL WRITE-FCTN READ-FCTN
			      OFFSET N-DATA-BITS N-ADDRESS-BITS
			      "FAST-ADDRESS-TEST of PDL addressed by PDL Pointer; hi bites"
			      0)))

