;;-*- Mode:LISP; Package:LAMBDA; Base:8 -*-

(DEFUN FLX-STRAIGHT-MAP (&KEY &OPTIONAL
			 (N-L2-PAGES 4096.)
			 (L2-PAGE-OFFSET 0)
			 (L2C-CONTENTS 1400)
			 (REFLECTION-PHYSICAL-PAGE 0))
  (LET* ((BASE-PHYSICAL-ADDRESS (ND-SLOT-PHYSICAL-NUBUS-ADDRESS MEM-SLOT 0))
	 (BASE-PHYSICAL-PAGE (// BASE-PHYSICAL-ADDRESS 1024.)))	;address is in bytes.
    (FLX-STRAIGHT-L1-AND-CHECK)
    (FLX-SML2 0 N-L2-PAGES L2C-CONTENTS
	      (+ BASE-PHYSICAL-PAGE L2-PAGE-OFFSET)
	      REFLECTION-PHYSICAL-PAGE)))



(DEF-UTEST FLX-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 FLX-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-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-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-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)
	))