;;-*- Mode:LISP; Package:LAMBDA; Base:8; Readtable:ZL -*-
;;
;; (C) COPYRIGHT 1984,1985,1986 LISP MACHINE, INC
;;
;; MICRO-CODED tests of the LAMBDA processor, PART 1.
;; Only DEF-UTEST forms can be in this file, since it is translated into
;; "C" by the SDU-TRANSLATE-FILE function.
;; 1/11/84 10:07:43 -George Carrette.
;; The Lisp->C translation was generalized by MWT and myself to include
;; defun's of fixed numbers of arguments manipulating simple integer numeric
;; quantities and passing constant strings to functions such as FORMAT and FERROR.
;; 8/29/84 10:18:13 -GJC

(DEF-UTEST FLD-STRAIGHT-CAM "FAST LOAD STRAIGHT CRAM ADDRESS MAP"
  :constants  ((m-cam-adr 1)
	       (m-cam-data 7)
	       (m-temp 8.)
	       (m-last-loc 2)
	       (m-zero 3)
	       (m-parity-count 9.)
	       (m-shift 10.)
	       (m-sum 11.)
	       (m-data-width 12.)
	       (a-one  4)
	       (m-first-loc 5)
	       (M-CAM-READBACK 6)
	       )
  
  :INPUT-VALUES (((M-MEM m-cam-adr) 7777)  ;location to clobber
		 ((M-MEM m-last-loc) 0)	   ;last locn to clobber.
		 ((M-MEM m-zero) 0)        ;constant for DPBing into
		 ((m-mem a-one) 1)	   ;convenient 1 for increment and decrement
		 ((m-mem m-first-loc) 7777);first location to clobber, last to check
		 ((m-mem m-data-width) 10.))
  :error-stops  ((fc "failed check in readback loop"))
  :START write-loop
  :GOOD-STOP gs
  :TIME-OUT 30.
  :CODE (

    write-loop

         (lam-ir-op lam-op-jump
	  lam-ir-jump-cond lam-jump-cond-unc
	  lam-ir-jump-addr compute-parity
	  lam-ir-n 1
	  lam-ir-p 1)

	 (LAM-IR-OP LAM-OP-BYTE	      ;((oa-reg-low) dpb m-cam-adr oal-cram-page-number a-3)
	  LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-DPB
	  LAM-IR-M-SRC m-cam-adr
	  LAM-IR-BYTL-1 11.
	  LAM-IR-MROT 18.
	  LAM-IR-A-SRC m-zero
	  LAM-IR-FUNC-DEST LAM-FUNC-DEST-IMOD-LOW)

         (LAM-IR-OP LAM-OP-JUMP	      ;(call-xct-next 17)
	  LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	  LAM-IR-JUMP-ADDR 17
	  LAM-IR-P 1
	  LAM-IR-N 0)

	 (LAM-IR-POPJ-AFTER-NEXT 1	;(popj-after-next (cram-adr-map) setm m-cam-adr)
	  LAM-IR-OP LAM-OP-ALU
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-ALUF LAM-ALU-SETM
	  LAM-IR-M-SRC m-cam-data
	  LAM-IR-FUNC-DEST LAM-FUNC-DEST-CRAM-MAP
	  LAM-IR-SLOW-DEST 1)

	 (LAM-IR-OP LAM-OP-JUMP			;3 - we popj to here and check if we are done
	  LAM-IR-JUMP-COND LAM-JUMP-COND-M>A
	  LAM-IR-M-SRC m-cam-adr
	  LAM-IR-A-SRC m-last-loc
	  LAM-IR-JUMP-ADDR write-loop
	  LAM-IR-N 0)

	 (LAM-IR-OP LAM-OP-ALU			;4 - decrement the count
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-ALUF LAM-ALU-SUB
	  LAM-IR-M-SRC m-cam-adr
	  LAM-IR-A-SRC a-one
	  LAM-IR-M-MEM-DEST m-cam-adr)

	 ;;now run through from the bottom up to the top, checking the contents
	 ;;of the map

    check-loop

         (lam-ir-op lam-op-jump
	  lam-ir-jump-cond lam-jump-cond-unc
	  lam-ir-jump-addr compute-parity
	  lam-ir-n 1
	  lam-ir-p 1)

	 (LAM-IR-OP LAM-OP-BYTE	      ;((oa-reg-low) dpb m-cam-adr oal-cram-page-number a-3)
	  LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-DPB
	  LAM-IR-M-SRC m-cam-adr
	  LAM-IR-BYTL-1 11.
	  LAM-IR-MROT 18.
	  LAM-IR-A-SRC m-zero
	  LAM-IR-FUNC-DEST LAM-FUNC-DEST-IMOD-LOW)
	 
         (LAM-IR-OP LAM-OP-JUMP	      ;(call-xct-next 17)
	  LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	  LAM-IR-JUMP-ADDR 17
	  LAM-IR-P 1
	  LAM-IR-N 0)
	 
	 (LAM-IR-POPJ-AFTER-NEXT 1	        ;(pop-j-after-next)
	  LAM-IR-OP LAM-OP-byte			;
	  lam-ir-byte-func lam-byte-func-ldb		;READ BACK CONTENTS OF CAM
	  LAM-IR-bytl-1 11.
	  lam-ir-mrot 0.
	  lam-ir-a-src m-zero
	  LAM-IR-M-SRC LAM-M-SRC-CRAM-ADR-MAP
	  LAM-IR-M-MEM-DEST M-CAM-READBACK)


	 (LAM-IR-OP LAM-OP-JUMP			;jump to fails-check if contents of CAM 
						;expected data (address with parity)
	  LAM-IR-JUMP-COND LAM-JUMP-COND-m-neq-A
	  LAM-IR-M-SRC m-cam-readback
	  LAM-IR-JUMP-ADDR FAILS-CHECK
	  LAM-IR-A-SRC m-cam-data
	  lam-ir-n 1)

	 (LAM-IR-OP LAM-OP-JUMP			; check if we are done
	  LAM-IR-JUMP-COND LAM-JUMP-COND-M<A
	  LAM-IR-M-SRC m-cam-adr
	  LAM-IR-A-SRC m-first-loc
	  LAM-IR-JUMP-ADDR check-loop
	  LAM-IR-N 0)

	 
	 (LAM-IR-OP LAM-OP-ALU			;increment the count
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-ALUF LAM-ALU-ADD
	  LAM-IR-M-SRC m-cam-adr
	  LAM-IR-A-SRC a-one
	  LAM-IR-M-MEM-DEST m-cam-adr)

 good-stop			;halt if you fall through the end test
	 (lam-ir-halt 1)

 gs
	 (lam-ir-halt 1)
	 
 fails-check
	 (lam-ir-halt 1)
 fc
	 (lam-ir-halt 1)

 compute-parity
         (lam-ir-op lam-op-alu			;zero the variable which will be eventually
	  lam-ir-ob lam-ob-alu			;the data to write into the cam
	  lam-ir-aluf lam-alu-setz
	  lam-ir-m-mem-dest m-cam-data)

	 (lam-ir-op lam-op-alu			;zero the loop counter for the parity loop
	  lam-ir-ob lam-ob-alu
	  lam-ir-aluf lam-alu-setz
	  lam-ir-m-mem-dest m-parity-count)

	 (lam-ir-op lam-op-alu			;start the parity bit at one...eventually
	  lam-ir-ob lam-ob-alu			;we write 1 if we add an even number of ones
	  lam-ir-aluf lam-alu-seta		;to it or 0 if vice versa
	  lam-ir-a-src a-one
	  lam-ir-m-mem-dest m-sum)

	 (LAM-IR-OP LAM-OP-BYTE	                	;start a temporary variable at the 
	  LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-ldb     	;the current address, to be used 
	  LAM-IR-M-SRC m-cam-adr        	;as a source of bits as we shift and extract
	  LAM-IR-BYTL-1 9.
	  LAM-IR-MROT 0.
	  LAM-IR-A-SRC m-zero
	  LAM-IR-m-mem-DEST m-shift)

    parity-loop

         (LAM-IR-OP LAM-OP-BYTE	      
	  LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-LDB
	  LAM-IR-M-SRC m-shift
	  LAM-IR-BYTL-1 0.
	  LAM-IR-MROT 0.
	  LAM-IR-A-SRC m-zero
	  LAM-IR-m-mem-DEST m-temp)

	 (lam-ir-op lam-op-alu
	  lam-ir-ob lam-ob-alu
	  lam-ir-m-src m-temp
	  lam-ir-a-src m-sum
	  lam-ir-m-mem-dest m-sum
	  lam-ir-aluf lam-alu-xor)

	 (lam-ir-op lam-op-alu
	  lam-ir-ob lam-ob-alu
	  lam-ir-m-src m-parity-count
	  lam-ir-m-mem-dest m-parity-count
	  lam-ir-aluf lam-alu-m+1)

	 (LAM-IR-OP LAM-OP-BYTE	      
	  LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-LDB
	  LAM-IR-M-SRC m-shift
	  LAM-IR-BYTL-1 9.
	  LAM-IR-MROT 31.
	  LAM-IR-A-SRC m-zero
	  LAM-IR-m-mem-DEST m-shift)


	 (LAM-IR-OP LAM-OP-JUMP
	  LAM-IR-JUMP-COND LAM-JUMP-COND-M>A
	  LAM-IR-M-SRC m-data-width
	  LAM-IR-A-SRC m-parity-count
	  LAM-IR-JUMP-ADDR parity-loop
	  LAM-IR-N 1)

	 (LAM-IR-OP LAM-OP-BYTE	      
	  LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-ldb
	  LAM-IR-M-SRC m-cam-adr
	  LAM-IR-BYTL-1 9.
	  LAM-IR-MROT 0.
	  LAM-IR-A-SRC m-zero
	  LAM-IR-m-mem-DEST m-cam-data)

	 (LAM-IR-OP LAM-OP-BYTE	      
	  LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-dpb
	  LAM-IR-M-SRC m-sum
	  LAM-IR-BYTL-1 0
	  LAM-IR-MROT 10.
	  LAM-IR-A-SRC m-cam-data
	  LAM-IR-m-mem-DEST m-cam-data)

	 (lam-ir-op lam-op-jump
	  lam-ir-jump-cond lam-jump-cond-unc
	  lam-ir-r 1
	  lam-ir-n 1)

	 (lam-ir-halt 1)
	 ))

(DEF-UTEST HALT? "EXECUTE SOME NULL INSTUCTIONS AND THEN HALT"
  :START 0
  :GOOD-STOP 6
  :TIME-OUT 2
  :CODE (0
	 (LAM-IR-OP LAM-OP-ALU)			;0
	 (LAM-IR-OP LAM-OP-ALU)			;1
	 (LAM-IR-OP LAM-OP-ALU)			;2
	 (LAM-IR-OP LAM-OP-ALU)			;3
	 (LAM-IR-OP LAM-OP-ALU)			;4
 	 (lam-ir-halt 1) )		;5 PC will be at 6 when we stop
  )


;; jump to 20 with next instruction nooped, put a halt after that to catch fall-throughs
;; at  20, put a jump to 40 where the previous instuction is a halt to catch randomness
;; and the subsequent instruction is  not nooped.  40 is a good
;; stop.  the test instructions modify locations in m-memory, so one should change and the
;; other should remain constant

(DEF-UTEST JUMP-NOOP? "UNCONDITIONAL JUMPS, BOTH XCT-NEXT AND DONT-XCT-NEXT"
  :INPUT-VALUES (((M-MEM 1) 37777777777)  ;EXPECT THIS TO STAY -1
		 ((M-MEM 2) 37777777777)  ;EXPECT THIS TO BE ZEROED
		 )
  :OUTPUT-VALUES (((M-MEM 1) 37777777777 ("m-mem 1 altered, presumably zeroed by instruction"
					  "which should have been nooped"))
		  ((M-MEM 2) 0 ("m-mem 2 not set to 0 : many possibilities, but"
		                "test is looking for jump failures or noop stuck on.")))
  
  :START 0
  :GOOD-STOP 41
  :error-stops ((4 "probably fell through first jump")
		(20 "at second jump by randomness")
		(23 "probably fell through second jump")
		(40 "randomly in front of good stop location"))
  :TIME-OUT 2
  :CODE (0
	 (LAM-IR-OP LAM-OP-JUMP	    	        ;(JUMP 20)
	  LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	  LAM-IR-JUMP-ADDR 20
	  LAM-IR-N 1)

	 (LAM-IR-OP LAM-OP-ALU			;ZERO M LOC 1 (ERROR IF THIS HAPPPENS)
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-ALUF LAM-ALU-SETZ
	  LAM-IR-M-MEM-DEST 1)

	 (LAM-IR-HALT 1)			;ERROR STOP FOR FALL THROUGHS

	 17
	 (LAM-IR-HALT 1)			;ERROR STOP TO PREVENT RANDOM JUMPS
						;FROM WINNING BY ACCIDIENT

	 (LAM-IR-OP LAM-OP-JUMP	     		;(JUMP 40)
	  LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	  LAM-IR-JUMP-ADDR 40
	  LAM-IR-N 0)

	 (LAM-IR-OP LAM-OP-ALU			;ZERO M LOC 2 (ERROR UNLESS THIS HAPPENS)
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-ALUF LAM-ALU-SETZ
	  LAM-IR-M-MEM-DEST 2)

	 (LAM-IR-HALT 1)			;ANOTHER ERROR STOP FOR FALL THROUGHS

	 37
	 (LAM-IR-HALT 1)			;ANOTHER RANDOM JUMP ERROR STOP

	 40
	 (LAM-IR-HALT 1)				;GOOD STOP PC = 41
	 )
  )

;; tests of push and pop.

;; the first contains part of the sequence used to write the cram and the
;; cram adr map where we call-xct-next to a location, but the subsequent instruction
;; is a popj-after-next.  so we execute the called instruction and then resume at
;; at the third instruction.  In the case of actually writing the CAM or CRAM, we
;; magically force noop-next, so that the bogus instruction fetched from the target
;; location nooped.  For this diagnostic, lets have that instruction smash a m-mem
;; location, just to show that we were there

(DEF-UTEST CALL-POPJAN? "CALL-XCT-NEXT FOLLOWED BY POPJ AFTER NEXT"
   :INPUT-VALUES (((M-MEM 1) 37777777777)  ;EXPECT THIS TO BE ZEROED
			 )

  :OUTPUT-VALUES (((M-MEM 1) 0 ("m-mem 1 not set to 0 : many possibilities, but"
				"suspect failure to call to location 17 properly.")))
  
  :START 0
  :GOOD-STOP 41
  :error-stops ((5 "probably fell through final location")
		(17 "arrived at call location by randomness")
		(21 "probably failed to popj")
		(40 "randomly in front of good stop location"))
  :TIME-OUT 2
  :CODE (0
         (LAM-IR-OP LAM-OP-JUMP	      ;(call-xct-next 17)
	  LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	  LAM-IR-JUMP-ADDR 17
	  LAM-IR-P 1
	  LAM-IR-N 0)

	 (LAM-IR-POPJ-AFTER-NEXT 1      	;(popj-after-next )
	  LAM-IR-OP LAM-OP-ALU)

	 (LAM-IR-OP LAM-OP-JUMP	     		;(JUMP 40) jump to good location
	  LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	  LAM-IR-JUMP-ADDR 40
	  LAM-IR-N 1)

	 (LAM-IR-OP LAM-OP-ALU)			;dummy instruction,nooped

	 (LAM-IR-HALT 1)			;ANOTHER ERROR STOP FOR FALL THROUGHS

	 16
	 (lam-ir-halt 1)			;ERROR STOP - PREVENTS RANDOMNESS

	 (LAM-IR-OP LAM-OP-ALU			;ZERO M LOC 1 
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-ALUF LAM-ALU-SETZ
	  LAM-IR-M-MEM-DEST 1)

	 (LAM-IR-HALT 1)			;ERROR STOP - PROBABLY FAILED TO POPJ

	 37
	 (LAM-IR-HALT 1)			;ANOTHER RANDOM JUMP ERROR STOP

	 40
	 (LAM-IR-HALT 1)				;GOOD STOP PC = 41
	 )
  )



(DEFUN FLD-STRAIGHT-MAP (&KEY &OPTIONAL
			 (N-L2-PAGES 4096.)
			 (L2-PAGE-OFFSET 0)
			 (L2C-CONTENTS 1400)
			 (REFLECTION-PHYSICAL-PAGE 0)
			 (INDEX (SEND *PROC* :MEM-SLOT)))
  (LET* ((quad-slot (configuration-index-to-quad-slot index))
	 (BASE-PHYSICAL-PAGE (ash quad-slot 14.)))   ;+24. to nubus-address, -10. to page.
    (FLD-STRAIGHT-L1-AND-CHECK)
    (FLD-SML2 0 N-L2-PAGES L2C-CONTENTS
	      (+ BASE-PHYSICAL-PAGE L2-PAGE-OFFSET)
	      REFLECTION-PHYSICAL-PAGE)))



(DEF-UTEST FLD-STRAIGHT-L1-AND-CHECK "LOAD THE L1 MAP WITH A STRAIGHT MAP AND VERIFY IT"
  :initializers  (SET-25-BIT-VIRTUAL-ADDRESS-MODE)
  :postializers  (CLEAR-25-BIT-VIRTUAL-ADDRESS-MODE)		;FOR NOW.
  :CONSTANTS ((M-MAP-DATA 2)
	      (M-NUMBER-OF-LOC-USED 3)
	      (M-INCREMENT 4)
	      (M-FILLER 5)
	      (NUMBER-OF-LOC-IN-L1-MAP 6)
	      (M-ONE 7))
  
  :INPUT-VALUES (((M-MEM M-MAP-DATA) 0)  		;MAP DATA
		 ((M-MEM M-NUMBER-OF-LOC-USED) 128.)		;NUMBER OF LOCATIONS USED
		 ((M-MEM M-INCREMENT) 20000)		;INCREMENT MD BY THIS TO ADDRESS
						;L1-MAP NEXT LOCATION
		 ((M-MEM M-FILLER) 177)		;FILL UNUSED LOCATIONS WITH THIS
		 ((M-MEM NUMBER-OF-LOC-IN-L1-MAP) 4096.)	;NUMBER OF LOCATIONS IN L1-MAP
		 ((M-MEM M-ONE) 1)
		 (md 0))

  :START WRITE-LEVEL-1-MAP-USED-LOCATIONS
  :GOOD-STOP GOOD-STOP
  :error-stops  ((F-TO-C "failed check in readback loop"))
  :TIME-OUT 10
  :CODE (0
     WRITE-LEVEL-1-MAP-USED-LOCATIONS 		;((level-1-map) 2@M)
	(LAM-IR-M-SRC M-MAP-DATA
	 lam-ir-op lam-op-alu
	 LAM-IR-ALUF LAM-ALU-SETM
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-L1-MAP
	 LAM-IR-SLOW-DEST 1)
	
	(LAM-IR-OB LAM-OB-ALU		   ;((2@M) M+1 2@M) INCREMENT THE DATA
	 lam-ir-op lam-op-alu
	 LAM-IR-M-MEM-DEST M-MAP-DATA
	 LAM-IR-M-SRC M-MAP-DATA
	 LAM-IR-ALUF LAM-ALU-M+1)

	(LAM-IR-OP LAM-OP-JUMP		;(JUMP-LESS-THAN-XCT-NEXT 2@M 3@A LOC)
	 LAM-IR-M-SRC M-MAP-DATA	;LOOP UNTIL ALL USED LOCATIONS ARE WRITTEN 
	 LAM-IR-A-SRC M-NUMBER-OF-LOC-USED
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M<A
	 LAM-IR-JUMP-ADDR WRITE-LEVEL-1-MAP-USED-LOCATIONS 
	 LAM-IR-N 0)
	
	(LAM-IR-OB LAM-OB-ALU		;((MD) ADD MD 4@A) INCREMENT THE ADDRESS
         lam-ir-op lam-op-alu 
	 LAM-IR-M-SRC LAM-M-SRC-MD		;BY ONE L1-MAP LOCATION 
	 LAM-IR-A-SRC M-INCREMENT
	 LAM-IR-ALUF LAM-ALU-ADD
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-MD)

	;;NOW FILL IN THE UNUSED LOCATIONS
	
     WRITE-LEVEL-1-MAP-UNUSED-LOCATIONS      ;((LEVEL-1-MAP) 5@M)	
	(LAM-IR-M-SRC M-FILLER
	 lam-ir-op lam-op-alu
	 LAM-IR-ALUF LAM-ALU-SETM
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-L1-MAP
	 LAM-IR-SLOW-DEST 1)
	
	(LAM-IR-OB LAM-OB-ALU		;((2@M) M+1 2@M) INCREMENT THE DATA
	 lam-ir-op lam-op-alu
	 LAM-IR-M-MEM-DEST M-MAP-DATA
	 LAM-IR-M-SRC M-MAP-DATA
	 LAM-IR-ALUF LAM-ALU-M+1)
	
	(LAM-IR-OP LAM-OP-JUMP		;(JUMP-LESS-THAN-XCT-NEXT 2@M 6@A 11)
	 LAM-IR-M-SRC M-MAP-DATA
	 LAM-IR-A-SRC NUMBER-OF-LOC-IN-L1-MAP
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M<A
	 LAM-IR-JUMP-ADDR WRITE-LEVEL-1-MAP-UNUSED-LOCATIONS
	 LAM-IR-N 0)
	
	(LAM-IR-OB LAM-OB-ALU		;((MD) ADD MD 4@A) INCREMENT THE ADDRESS
	 lam-ir-op lam-op-alu
	 LAM-IR-M-SRC LAM-M-SRC-MD		;BY ONE L1 MAP LOCATION
	 LAM-IR-A-SRC M-INCREMENT
	 LAM-IR-ALUF LAM-ALU-ADD
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-MD)

	;;THE MD AND M-MAP-DATA SHOULD BE DECREMENTED TO POINT TO THE LAST WRITTEN
	;;LOCATIONS.

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-MAP-DATA
	 LAM-IR-A-SRC M-ONE
	 LAM-IR-ALUF LAM-ALU-sub
	 LAM-IR-M-MEM-DEST M-MAP-DATA)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC LAM-M-SRC-MD
	 lam-ir-a-src m-increment
	 LAM-IR-ALUF LAM-ALU-SUB
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-MD)
	
	
	;;now we retrace our steps, decrementing from the top.  It would seem that
	;;using a different alu function is a slightly better double-check

     READ-BACK-FILLER-TILL-USED-LOCATIONS
	(LAM-IR-OP LAM-OP-ALU)		;ALLOW TIME AFTER MD CHANGED.

	(LAM-IR-M-SRC LAM-M-SRC-L1-MAP
	 LAM-IR-A-SRC M-FILLER
	 LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	 LAM-IR-JUMP-ADDR FAILED-TO-CHECK
	 LAM-IR-N 1)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-MAP-DATA
	 LAM-IR-A-SRC M-ONE
	 LAM-IR-ALUF LAM-ALU-sub
	 LAM-IR-M-MEM-DEST M-MAP-DATA)

	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-M-SRC M-MAP-DATA
	 LAM-IR-A-SRC M-NUMBER-OF-LOC-USED
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M>=A
	 LAM-IR-JUMP-ADDR READ-BACK-FILLER-TILL-USED-LOCATIONS
	 LAM-IR-N 0)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC LAM-M-SRC-MD
	 lam-ir-a-src m-increment
	 LAM-IR-ALUF LAM-ALU-SUB
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-MD)

	;;now we should see that the contents of the m-map-data is the same as the
	;;contents of the level 1 map

    READ-BACK-M-MAP-DATA-FROM-LEVEL-1-MAP

	(LAM-IR-OP LAM-OP-ALU)		;ALLOW MAP TO SETTLE AFTER MD CHANGED.

        (LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-M-SRC LAM-M-SRC-L1-MAP
	 LAM-IR-A-SRC M-MAP-DATA
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	 LAM-IR-JUMP-ADDR FAILED-TO-CHECK
	 LAM-IR-N 1)
	
 	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-MAP-DATA
	 LAM-IR-A-SRC M-ONE
	 LAM-IR-ALUF LAM-ALU-sub
	 LAM-IR-M-MEM-DEST M-MAP-DATA)

	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-M-SRC M-MAP-DATA
	 LAM-IR-A-SRC M-ONE
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M>=A
	 LAM-IR-JUMP-ADDR READ-BACK-M-MAP-DATA-FROM-LEVEL-1-MAP
	 LAM-IR-N 0)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC LAM-M-SRC-MD
	 lam-ir-a-src m-increment
	 LAM-IR-ALUF LAM-ALU-SUB
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-MD)

	(LAM-IR-HALT 1)

     GOOD-STOP					;stop here if we win
	( LAM-IR-HALT 1)

     FAILED-TO-CHECK

        (LAM-IR-HALT 1)

     F-TO-C

        (LAM-IR-HALT 1)
	))




;assumes first level map set up.
(def-utest FLD-SML2 "FAST-LOAD-STRAIGHT-MAP-LEVEL-2 and verify it"
  :arguments (FIRST-PAGE N-PAGES DATA-CONTROL DATA-PHYSICAL-PAGE REFLECTION-PHYSICAL-PAGE)
  :constants ((M-A 5) (M-B 6) (M-C 7) (M-D 10) (M-E 11) (M-F 12) (M-ONE 13) (M-TEM 14)
	      (M-ZERO 15))
  :input-values (((m-mem m-a) 'DATA-CONTROL) ; 
		 ((m-mem m-b) 'DATA-PHYSICAL-PAGE) ;  incremented each time around loop 
		 ((m-mem m-c) (ash 1 8.)) ; map address increment
		 ((m-mem m-d) 0) ; COUNT
		 ((m-mem m-e) 'N-PAGES) ;
		 ((M-MEM M-F) 'REFLECTION-PHYSICAL-PAGE)    ;XORed each time
		 ((M-MEM M-ONE) 1)
		 ((M-MEM M-TEM) 0)
		 ((M-MEM M-ZERO) 0)
		 (md '(ash first-page 8.)) 
		 )
  :time-out 10
  :good-stop GOOD-STOP
  :error-stops  ((L2C-F-C "L2C failed check in readback loop")
		 (L2P-F-C "L2P failed check in readback loop"))
  :start loc
  :code (0
     LOC  			
	(LAM-IR-OP LAM-OP-ALU)		;GIVE IT EXTRA TIME TO SETTLE.
	(LAM-IR-M-SRC M-A		;((LEVEL-2-MAP-CONTROL) M-a)
	 LAM-IR-ALUF LAM-ALU-SETM
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-L2-MAP-CONTROL
	 LAM-IR-SLOW-DEST 1)
	(LAM-IR-M-SRC M-B		;((LEVEL-2-MAP-PHYSICAL-PAGE) XOR M-B A-F)
	 LAM-IR-A-SRC M-F
	 LAM-IR-ALUF LAM-ALU-XOR
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-L2-MAP-PHYSICAL-PAGE
	 LAM-IR-SLOW-DEST 1)
	(LAM-IR-OB LAM-OB-ALU		;((M-B) M+1 M-B)  -data
	 LAM-IR-M-MEM-DEST M-B
	 LAM-IR-M-SRC M-B
	 LAM-IR-ALUF LAM-ALU-M+1)
	(LAM-IR-OB LAM-OB-ALU		;((M-D) M+1 M-D)  -count
	 LAM-IR-M-MEM-DEST M-D
	 LAM-IR-M-SRC M-D
	 LAM-IR-ALUF LAM-ALU-M+1)
	(LAM-IR-OP LAM-OP-JUMP		;(JUMP-LESS-THAN-XCT-NEXT M-D A-E LOC)
	 LAM-IR-M-SRC M-D
	 LAM-IR-A-SRC M-E
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M<A
	 LAM-IR-JUMP-ADDR LOC
	 LAM-IR-N 0)
	(LAM-IR-OB LAM-OB-ALU		;((MD) ADD MD A-C)
	 LAM-IR-M-SRC LAM-M-SRC-MD
	 LAM-IR-A-SRC M-C
	 LAM-IR-ALUF LAM-ALU-ADD
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-MD)

  ;decrement frobs to refer to last thing written.  also loop back here.
   CHECK-LOOP
	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-B
	 LAM-IR-A-SRC M-ONE
	 LAM-IR-ALUF LAM-ALU-SUB
	 LAM-IR-M-MEM-DEST M-B)
	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-D
	 LAM-IR-A-SRC M-ONE
	 LAM-IR-ALUF LAM-ALU-SUB
	 LAM-IR-M-MEM-DEST M-D)
	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC LAM-M-SRC-MD
	 LAM-IR-A-SRC M-C
	 LAM-IR-ALUF LAM-ALU-SUB
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-MD)


	(LAM-IR-OP LAM-OP-ALU)		;TIMING.
	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-M-SRC LAM-M-SRC-L2-MAP-CONTROL
	 LAM-IR-A-SRC M-A
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	 LAM-IR-JUMP-ADDR L2C-FAILED-TO-CHECK
	 LAM-IR-N 1)
	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC LAM-M-SRC-L2-MAP-PHYSICAL-PAGE
	 LAM-IR-A-SRC M-B
	 LAM-IR-ALUF LAM-ALU-XOR
	 LAM-IR-M-MEM-DEST M-TEM)
	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-M-SRC M-TEM
	 LAM-IR-A-SRC M-F
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	 LAM-IR-JUMP-ADDR L2P-FAILED-TO-CHECK
	 LAM-IR-N 1)
	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-M-SRC M-D
	 LAM-IR-A-SRC M-ZERO
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M>A
	 LAM-IR-JUMP-ADDR CHECK-LOOP
	 LAM-IR-N 1)

        (LAM-IR-HALT 1)
  GOOD-STOP  ;note tag comes after instruction to which it refers.

  L2C-FAILED-TO-CHECK
	(LAM-IR-HALT 1)
  L2C-F-C

  L2P-FAILED-TO-CHECK
	(LAM-IR-HALT 1)
  L2P-F-C
        (LAM-IR-OP LAM-OP-ALU)
	))


;;
;; the following function is to make sure that the stack is set to zero
;;

(DEF-UTEST clear-micro-stack "CLEAR MICRO STACK"
  :constants  ((m-count 1)
	       (a-zero 2)
	       (a-last 4)
	       )
  
  :INPUT-VALUES (((M-MEM m-count) 0)  ;location to clobber
		 ((M-MEM a-zero) 0)		;value to push in the stack
		 ((M-MEM a-last) 256.) ;number of pushes to do

		 )
  :START init-stack-pointer
  :GOOD-STOP gs
  :TIME-OUT 2
  :CODE (

    init-stack-pointer
    
	 (lam-ir-op lam-op-alu
	  lam-ir-ob lam-ob-alu
	  lam-ir-a-src a-zero
	  lam-ir-m-src lam-m-src-micro-stack-pop
	  lam-ir-func-dest lam-func-dest-micro-stack-pointer-if-pop
	  lam-ir-aluf lam-alu-seta)

     zero-loop
     
	 (lam-ir-op lam-op-alu
	  lam-ir-ob lam-ob-alu
	  lam-ir-a-src a-zero
	  lam-ir-func-dest lam-func-dest-micro-stack-push
	  lam-ir-aluf lam-alu-seta)


	 (lam-ir-op lam-op-alu
	  lam-ir-ob lam-ob-alu
	  lam-ir-m-src m-count
	  lam-ir-m-mem-dest m-count
	  lam-ir-aluf lam-alu-m+1)

	 (LAM-IR-OP LAM-OP-JUMP		
	  LAM-IR-JUMP-COND LAM-JUMP-COND-M-neq-A
	  LAM-IR-M-SRC m-count
	  LAM-IR-A-SRC a-last
	  LAM-IR-JUMP-ADDR zero-loop
	  LAM-IR-N 1)

       	 (lam-ir-halt 1)
     gs
	 (lam-ir-halt 1)))

(DEF-UTEST FAST-CLEAR-MID "CLEAR MID MEMORY"
  :CONSTANTS ((M-MID-ADDRESS 1)
	      (M-DATA 2)
	      (M-MID-SIZE 3)
	      (M-ZERO 4)
	      (m-increment 5)
	      (m-count 6))

  :INPUT-VALUES (((M-MEM M-MID-ADDRESS) 0)
		 ((M-MEM M-ZERO) 0)
		 ((M-MEM M-MID-SIZE) 4096.)
		 ((m-mem m-increment) 100)
		 ((m-mem m-count) 0))

  :START ZERO-MID-RAM
  :GOOD-STOP GC
  :TIME-OUT 2
  :CODE (0

    ZERO-MID-RAM

	 ;((MD) DPB M-MID-ADDRESS (BYTE-FIELD 20 20) A-MID-ADDRESS)
	 (LAM-IR-OP LAM-OP-BYTE
	  LAM-IR-BYTL-1 17
	  LAM-IR-MROT 20
	  LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-DPB
	  LAM-IR-A-SRC M-mid-address
	  LAM-IR-M-SRC M-MID-ADDRESS
	  LAM-IR-FUNC-DEST LAM-FUNC-DEST-MD
	  LAM-IR-SLOW-DEST 1)

	 ;((M-DATA) 0)
	 (LAM-IR-OP LAM-OP-ALU
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-A-SRC M-ZERO
	  LAM-IR-ALUF LAM-ALU-SETA
	  LAM-IR-M-MEM-DEST M-DATA)

	 ;(SOURCE-TO-MACRO-IR SETM MD)
	 (LAM-IR-OP LAM-OP-ALU
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-ALUF LAM-ALU-SETM
	  LAM-IR-M-SRC LAM-M-SRC-MD
	  LAM-IR-SOURCE-TO-MACRO-IR 1
	  LAM-IR-SLOW-DEST 1)

         ;((MACRO-IR-DECODE) M-DATA)
	 (LAM-IR-OP LAM-OP-ALU
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-ALUF LAM-ALU-SETM
	  LAM-IR-M-SRC M-DATA
	  LAM-IR-FUNC-DEST LAM-FUNC-DEST-MID
	  LAM-IR-SLOW-DEST 1)

	 (LAM-IR-OP LAM-OP-ALU
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-M-SRC M-MID-ADDRESS
	  lam-ir-a-src m-increment
	  LAM-IR-M-MEM-DEST M-MID-ADDRESS
	  LAM-IR-ALUF LAM-ALU-add)

	 (LAM-IR-OP LAM-OP-ALU
	  LAM-IR-OB LAM-OB-ALU
	  LAM-IR-M-SRC M-count
	  LAM-IR-M-MEM-DEST M-count
	  LAM-IR-ALUF LAM-ALU-m+1)

	 (LAM-IR-OP LAM-OP-JUMP
	  LAM-IR-JUMP-COND LAM-JUMP-COND-M<A
	  LAM-IR-A-SRC M-MID-SIZE
	  LAM-IR-M-SRC M-count
	  LAM-IR-JUMP-ADDR ZERO-MID-RAM
	  LAM-IR-N 1)

         (LAM-IR-HALT 1)
     GC
	 (LAM-IR-HALT 1)))


;;    	old style Multiplication in LAMBDA is a simple, 1 bit at a time, shift-and-add affair.
;;The hardware provides a conditional-ALU operation, MULTIPLY-STEP, which is ADD
;;if Q<0>=1, and SETM otherwise.  This is used in combination with
;;SHIFT-Q-RIGHT and OUTPUT-SELECTOR-RIGHTSHIFT-1.  Initially the multiplicand
;;is placed in an A-scratchpad location and the multiplier is placed in Q.
;;32 MULTIPLY-STEP operations are executed; as Q shifts to the right each of
;;the bits of the multiplier appear in Q<0>.  If the bit is 1, the multiplicand
;;gets added in.  The results of each operation go into an M-scratchpad location,
;;which is fed back into the next step.  The low bit of each result is shifted
;;into Q.  Thus, when the 32 steps have been completed, the Q contains the low
;;32 bits of the product, and the M-scratchpad location contains the high 32 bits.
;;	This algorithm needs a slight modification to deal with 2's complement
;;numbers.  The sign bit of a 2's complement number has negative weight, so
;;in the last step if Q<0>=1, i.e. the multiplier is negative, a subtraction
;;should be done instead of an addition.  The hardware does not provide this,
;;so instead we do a subtraction after the last step, which is
;;adding and then subtracting twice as much, which has the effect of subtracting.
;;Note that this correction only affects the high 32 bits of the product,
;;and can be omitted if we are only looking for a single-precision result.
;;Consider the following code. 
;;
;;
;;
;;
;;
;;; Multiply Subroutine.  A-MPYR times Q-R, low product to Q-R, high to M-AC.
;;
;;MPY	((M-AC) MULTIPLY-STEP M-ZERO A-MPYR)	;Partial result = 0 in first step
;;(REPEAT 30. ((M-AC) MULTIPLY-STEP M-AC A-MPYR))	;Do 30 steps
;;	(POPJ-IF-BIT-CLEAR-XCT-NEXT		;Return after next if A-MPYR positive
;;		(BYTE-FIELD 1 0) Q-R)
;;       ((M-AC) MULTIPLY-STEP M-AC A-MPYR)	;The final step
;;
;;
;;       (NO-OP)					;Jump delay
;;
;;
;;	To multiply numbers of less than 32 bits is also possible.  With
;;the same initial conditions, after n steps the high n bits of the Q
;;contain the low n bits of the product, and the remaining bits of the
;;product are in the low bits of the M-scratchpad location.  Two BYTE
;;instructions can be used to extract and combine these bits to produce
;;a right-adjusted product, if the numbers are unsigned.
;;

;; this test multiplies 16 bit unsigned numbers, a floating ones times floating ones.
;; it multiplies both in the old style, shift and add, and new style, using the
;; matrix multiplier.  because we don't care how fast the old style runs in this
;; case, we do it as a loop, making the code compact and faster to load
  
(def-utest multiply-16-test "multiplying 16 bits unsigned numbers"

  :CONSTANTS ((M-MULTIPLICAND 2)
	      (M-MULTIPLIER 3)
	      (M-RESULT 4)
	      (M-ZERO 5)
	      (M-ONES 6)
	      (M-FACTOR 7)
	      (M-BITS-OVER 8)
	      (M-OTHER-FACTOR 9)
	      (M-ZEROS-OR-ONES 10.)
	      (M-OTHER-RESULT 11.)
	      (M-16-TIMES 12.)
	      (M-COUNT 13.)
	      (M-MASK 14.)
	      (M-MULT 15.)
	      (M-ONE 16.)
	      (M-BITS-OVER-FOR-OTHER-FACTOR 17.)
	      (M-32-TIMES 18.))

  :INPUT-VALUES (((M-MEM M-ZERO) 0)
		 ((M-MEM M-ONES) -1)
		 ((M-MEM M-OTHER-FACTOR) 1)
		 ((M-MEM M-16-TIMES) 16.)
		 ((M-MEM M-MASK) 177777)
		 ((M-MEM M-ONE) 1)
		 ((M-MEM M-32-TIMES) 32.))

  :ERROR-STOPS ((NT-EQ-WI-OLD-STY-MULT "FAILED TO CHECK WITH OLD STYLE MULTIPLY")
		(NT-EQ-WN-SWA "FAILED TO CHECK FOR COMMUTIVITY OF MULTIPLICATION"))
  :START MULTIPLY
  :GOOD-STOP GS
  :TIME-OUT 10.

  :CODE (0

    MULTIPLY

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-OTHER-FACTOR
	   LAM-IR-M-SRC M-ONE
	   LAM-IR-ALUF LAM-ALU-SETM)
          
          ;THIS PART WILL DO FLOATING ONES BY 1.

          (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-ONES
	   LAM-IR-N 1
	   LAM-IR-P 1)
	  
          (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-BITS
	   LAM-IR-N 1
	   LAM-IR-P 1)

          ;THIS PART WILL DO FLOATTING ZEROS BY 1.

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-ZEROS
	   LAM-IR-N 1
	   LAM-IR-P 1)

          (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-BITS
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  ;;FLOATING-ZEROS BY FLOATING-ZEROS

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-ALUF LAM-ALU-SETZ)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-ZEROS
	   LAM-IR-N 1
	   LAM-IR-P 1)

    FLOATING-ZEROS-BY-FLOATING-ZEROS

          (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR BUILD-OTHER-FACTOR
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-BITS
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-ADDR FLOATING-ZEROS-BY-FLOATING-ZEROS
	   LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	   LAM-IR-M-SRC M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-A-SRC M-16-TIMES
	   LAM-IR-N 1)

	  ;FLOATING-ONES BY FLOATING-ONES

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-ALUF LAM-ALU-SETZ)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-ONES
	   LAM-IR-N 1
	   LAM-IR-P 1)

    FLOATING-ONES-BY-FLOATING-ONES

          (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR BUILD-OTHER-FACTOR
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-BITS
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-ADDR FLOATING-ONES-BY-FLOATING-ONES
	   LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	   LAM-IR-M-SRC M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-A-SRC M-16-TIMES
	   LAM-IR-N 1)

	  ;; this part now will do floating-zeros by floating-ones and vice versa

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-ALUF LAM-ALU-SETZ)

    FLOATING-ONES-BY-FLOATING-ZEROS

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-ONES
	   LAM-IR-N 1
	   LAM-IR-P 1)

          (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR BUILD-OTHER-FACTOR
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-ZEROS
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR FLOATING-BITS
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-ADDR FLOATING-ONES-BY-FLOATING-ZEROS
	   LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	   LAM-IR-M-SRC M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-A-SRC M-16-TIMES
	   LAM-IR-N 1)

          (LAM-IR-HALT 1)
    GS
          (LAM-IR-HALT 1)



    BUILD-OTHER-FACTOR

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-BITS-OVER
	   LAM-IR-M-SRC M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-ALUF LAM-ALU-SETM)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR BUILD-FACTOR
	   LAM-IR-N 0
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-M-MEM-DEST M-BITS-OVER-FOR-OTHER-FACTOR
	   LAM-IR-ALUF LAM-ALU-M+1)

	  (LAM-IR-OP LAM-OP-ALU
           LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC M-MULTIPLICAND
	   LAM-IR-M-MEM-DEST M-OTHER-FACTOR
	   LAM-IR-ALUF LAM-ALU-SETM)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-R 1
	   LAM-IR-N 1)

	  (LAM-IR-HALT 1)

    FLOATING-ZEROS

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-ALUF LAM-ALU-SETM
	   LAM-IR-M-SRC M-ONES
	   LAM-IR-M-MEM-DEST M-FACTOR)

	  (LAM-IR-OP LAM-OP-ALU
           LAM-IR-OB LAM-OB-ALU
	   LAM-IR-ALUF LAM-ALU-SETM
	   LAM-IR-M-SRC M-ZERO
	   LAM-IR-M-MEM-DEST M-ZEROS-OR-ONES)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-R 1
	   LAM-IR-N 1)

	  (LAM-IR-HALT 1)

    FLOATING-ONES
    
	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-ALUF LAM-ALU-SETM
	   LAM-IR-M-SRC M-ZERO
	   LAM-IR-M-MEM-DEST M-FACTOR)

	  (LAM-IR-OP LAM-OP-ALU
           LAM-IR-OB LAM-OB-ALU
	   LAM-IR-ALUF LAM-ALU-SETM
	   LAM-IR-M-SRC M-ONES
	   LAM-IR-M-MEM-DEST M-ZEROS-OR-ONES)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-R 1
	   LAM-IR-N 1)

	  (LAM-IR-HALT 1)

    FLOATING-BITS

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-BITS-OVER
	   LAM-IR-ALUF LAM-ALU-SETZ)

    FLOATING-BITS-LOOP

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-MULTIPLIER
	   LAM-IR-M-SRC M-OTHER-FACTOR
	   LAM-IR-ALUF LAM-ALU-SETM)

          (LAM-IR-OP LAM-OP-JUMP
           LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR BUILD-FACTOR	;GETS THE NEXT MULTIPLICAND
	   LAM-IR-N 1
	   LAM-IR-P 1)

          (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR MULTIPLY-FUNCTION 
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC M-RESULT
	   LAM-IR-M-MEM-DEST M-OTHER-RESULT
	   LAM-IR-ALUF LAM-ALU-SETM)

	  (LAM-IR-OP LAM-OP-ALU
           LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-MULTIPLIER
	   LAM-IR-M-SRC M-MULTIPLICAND
	   LAM-IR-ALUF LAM-ALU-SETM)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-MULTIPLICAND
	   LAM-IR-M-SRC M-OTHER-FACTOR
	   LAM-IR-ALUF LAM-ALU-SETM)

          (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR MULTIPLY-FUNCTION 
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	   LAM-IR-JUMP-ADDR NOT-EQUAL-WHEN-SWAPPED
	   LAM-IR-M-SRC M-RESULT
	   LAM-IR-A-SRC M-OTHER-RESULT
	   LAM-IR-N 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR OLD-STYLE-MULTIPLY
	   LAM-IR-N 1
	   LAM-IR-P 1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	   LAM-IR-JUMP-ADDR NOT-EQUAL-WITH-OLD-STYLE-MULTIPLY
	   LAM-IR-M-SRC M-RESULT
	   LAM-IR-A-SRC M-OTHER-RESULT
	   LAM-IR-N 1)

          (LAM-IR-OP LAM-OP-JUMP
           LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	   LAM-IR-JUMP-ADDR FLOATING-BITS-LOOP
	   LAM-IR-M-SRC M-BITS-OVER
	   LAM-IR-A-SRC M-16-TIMES
	   LAM-IR-N 0)

	  (LAM-IR-OP LAM-OP-ALU
           LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-BITS-OVER
	   LAM-IR-M-SRC M-BITS-OVER
	   LAM-IR-ALUF LAM-ALU-M+1)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-R 1
	   LAM-IR-N 1)

	  (LAM-IR-HALT 1)

    NOT-EQUAL-WHEN-SWAPPED

	  (LAM-IR-HALT 1)

    NT-EQ-WN-SWA

	  (LAM-IR-HALT 1)

    NOT-EQUAL-WITH-OLD-STYLE-MULTIPLY

	  (LAM-IR-HALT 1)

    NT-EQ-WI-OLD-STY-MULT

	  (LAM-IR-HALT 1)

    BUILD-FACTOR

	  (LAM-IR-OP LAM-OP-BYTE	      
	   LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-DPB
	   LAM-IR-M-SRC M-BITS-OVER
	   LAM-IR-BYTL-1 5.
	   LAM-IR-MROT 0.
	   LAM-IR-A-SRC M-ZERO
	   LAM-IR-FUNC-DEST LAM-FUNC-DEST-IMOD-LOW)

	  (LAM-IR-OP LAM-OP-BYTE
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-A-SRC M-FACTOR
	   LAM-IR-M-SRC M-ZEROS-OR-ONES
	   LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-DPB
	   LAM-IR-BYTL-1 0
	   LAM-IR-M-MEM-DEST M-MULTIPLICAND)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-R 1
	   LAM-IR-N 1)

	  (LAM-IR-HALT 1)

    MULTIPLY-FUNCTION

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-MULT
	   LAM-IR-ALUF LAM-ALU-SETZ)

	  (LAM-IR-OP LAM-OP-BYTE
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-A-SRC M-MULT
	   LAM-IR-M-SRC M-MULTIPLICAND
	   LAM-IR-OB LAM-OB-MSK
	   LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-DPB
	   LAM-IR-BYTL-1 15.
	   LAM-IR-MROT 0
	   LAM-IR-M-MEM-DEST M-MULT)		;variable to use in the new multiplier.

	  (LAM-IR-OP LAM-OP-BYTE
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-A-SRC M-MULT
	   LAM-IR-M-SRC M-MULTIPLIER
	   LAM-IR-OB LAM-OB-MSK
	   LAM-IR-BYTE-FUNC LAM-BYTE-FUNC-DPB
	   LAM-IR-BYTL-1 15.
	   LAM-IR-MROT 16.
	   LAM-IR-M-MEM-dest M-MULT)

	  (LAM-IR-OP LAM-OP-ALU
           LAM-IR-OB LAM-OB-ALU
           LAM-IR-FUNC-DEST LAM-FUNC-DEST-MULTIPLIER
	   LAM-IR-ALUF LAM-ALU-SETM
	   LAM-IR-M-SRC M-MULT)			;THIS LOADS THE MULTIPLIER

	  (LAM-IR-OP LAM-OP-ALU			;THIS INSTRUCTION IS ADDED BECAUSE
           LAM-IR-OB LAM-OB-ALU			;THE MULTIPLICATION NEEDS
           LAM-IR-FUNC-DEST LAM-FUNC-DEST-MULTIPLIER
	   					;ANOTHER CLOCK TO CLOCK THE DATA
	   					;TO THE OUTPUT REGISTER
	   LAM-IR-ALUF LAM-ALU-SETM		;SOMETHING IS SCREWY WITH
	   LAM-IR-M-SRC M-MULT)			;SOURCE-FT, SO WE DONT USE IT

	  (lam-ir-op lam-op-alu)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC LAM-M-SRC-MULTIPLIER
	   LAM-IR-M-MEM-DEST M-RESULT
	   LAM-IR-ALUF LAM-ALU-SETM)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-R 1
	   LAM-IR-N 1)

	  (LAM-IR-HALT 1)

    OLD-STYLE-MULTIPLY

          ;this is only for 16 bit numbers.

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC M-MULTIPLIER
	   LAM-IR-A-SRC M-MASK
	   LAM-IR-ALUF LAM-ALU-AND		;put the multiplier in q-reg
	   LAM-IR-Q LAM-Q-LOAD)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-MULT
	   LAM-IR-M-SRC M-MULTIPLICAND		;makes sure that the high byte is 0
	   LAM-IR-A-SRC M-MASK
	   LAM-IR-ALUF LAM-ALU-AND)

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-MEM-DEST M-COUNT
	   LAM-IR-ALUF LAM-ALU-SETM
	   LAM-IR-M-SRC M-ONE)
	  
          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU-RIGHT-1
	   LAM-IR-Q LAM-Q-RIGHT
	   LAM-IR-M-SRC M-ZERO
	   LAM-IR-A-SRC M-MULT
	   LAM-IR-M-MEM-DEST M-RESULT		;first time around the variable used as
	   LAM-IR-ALUF LAM-ALU-MSTEP)		; partial result should be equal to 0

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC M-COUNT
	   LAM-IR-M-MEM-DEST M-COUNT
	   LAM-IR-ALUF LAM-ALU-M+1)


    OLD-STYLE-MULTIPLY-LOOP

          (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU-RIGHT-1
	   LAM-IR-Q LAM-Q-RIGHT
	   LAM-IR-M-SRC M-RESULT
	   LAM-IR-A-SRC M-MULT
	   LAM-IR-M-MEM-DEST M-RESULT
	   LAM-IR-ALUF LAM-ALU-MSTEP)

	  (LAM-IR-OP LAM-OP-JUMP
           LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	   LAM-IR-JUMP-ADDR OLD-STYLE-MULTIPLY-LOOP
	   LAM-IR-M-SRC M-COUNT
	   LAM-IR-A-SRC M-32-TIMES
	   LAM-IR-N 0)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC M-COUNT
	   LAM-IR-M-MEM-DEST M-COUNT
	   LAM-IR-ALUF LAM-ALU-M+1)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC LAM-M-SRC-Q
	   LAM-IR-ALUF LAM-ALU-SETM
	   LAM-IR-M-MEM-DEST M-RESULT)
	  
	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-R 1
	   LAM-IR-N 1)

	  (LAM-IR-HALT 1)))




(DEFUN MULTIPLY-16-LOOP (&optional (DATA1 0)(data2 377777))
  (DISABLE-LAMBDA)
  (WIPE-M-MEM)
  (WRITE-M-MEM 2 DATA1)
  (write-m-mem 5 data2)
  (ULOAD ()
       0
	 (LAM-IR-OP LAM-OP-ALU
           LAM-IR-OB LAM-OB-ALU
           LAM-IR-FUNC-DEST LAM-FUNC-DEST-MULTIPLIER
	   LAM-IR-ALUF LAM-ALU-SETM
	   LAM-IR-M-SRC 2)	;THIS LOADS THE MULTIPLIER

	  (LAM-IR-OP LAM-OP-ALU			;THIS INSTRUCTION IS ADDED BECAUSE
           LAM-IR-OB LAM-OB-ALU			;THE MULTIPLICATION NEEDS
           LAM-IR-FUNC-DEST LAM-FUNC-DEST-MULTIPLIER
	   					;ANOTHER CLOCK TO CLOCK THE DATA
	   					;TO THE OUTPUT REGISTER
	   LAM-IR-ALUF LAM-ALU-SETM		;SOMETHING IS SCREWY WITH
	   LAM-IR-M-SRC 5)			;SOURCE-FT, SO WE DONT USE IT

;	  (lam-ir-op lam-op-alu)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
           LAM-IR-FUNC-DEST LAM-FUNC-DEST-MULTIPLIER
	   LAM-IR-M-SRC LAM-M-SRC-MULTIPLIER
	   LAM-IR-M-MEM-DEST 3
	   LAM-IR-ALUF LAM-ALU-SETM)

	;  (lam-ir-op lam-op-alu)

	  (LAM-IR-OP LAM-OP-ALU
	   LAM-IR-OB LAM-OB-ALU
	   LAM-IR-M-SRC LAM-M-SRC-MULTIPLIER
	   LAM-IR-M-MEM-DEST 1
	   LAM-IR-ALUF LAM-ALU-SETM)

	  (LAM-IR-OP LAM-OP-JUMP
	   LAM-IR-JUMP-COND LAM-JUMP-COND-UNC
	   LAM-IR-JUMP-ADDR 0
	   LAM-IR-N 1)

	  (LAM-IR-HALT 1)
	  )
  (SETUP-MACHINE-TO-START-AT 0))
