;;; -*- Mode: Lisp; Package: Lambda; Base: 8 -*-
;;;
;;; (c) Copyright 1984,85 - Lisp Machine, Inc.
;;;

;this file used by both diagnostics and lambda ucode assembler
;NOTE!!!
;  symbols with exactly the same names (and different values!)
;are defined in EXPSYM.  It is very important that the two files correspond
;exactly variable for variable!!

;MAKE SYMBOLS AVAILABLE AT BOTH COMPILE TIME & RUN TIME
;AND DECLARE THEM SPECIAL

;(DEFUN DEFINE-SYMBOL MACRO (X)
;  (SETQ X
;        (DO ((LIST (CADR X) (CDDR LIST))
;             (SYM-LIST NIL))
;            ((NULL LIST)
;             `(PROGN 'COMPILE
;                     (SETQ . ,(CADR X))
;                     (SPECIAL . ,SYM-LIST)
;                     (MAPC (FUNCTION (LAMBDA (X) (PUTPROP X T 'CONSTANT)))
;                           ',SYM-LIST)) )
;          (PUSH (CAR LIST) SYM-LIST)))
;  (EVAL X)
;  X)

(defun setup-ucode-symbols (sym-list)
  (do ((tail sym-list (cddr tail)))
      ((null tail))
    (putprop (car tail) t 'special)
    (putprop (car tail) t 'constant)
    (export (car tail))
    (set (car tail) (eval (cadr tail)))))

(defconst lambda-symbols 
 '(
   ;IR FIELDS
   LAM-IR-OP (byte 2 30.)
     LAM-OP-ALU 0 ;ASSUMED 0 AND OMITTED IN MANY PLACES FOR BREVITY
     LAM-OP-BYTE 1
     LAM-OP-JUMP 2
     LAM-OP-DISPATCH 3
   LAM-IR-POPJ-AFTER-NEXT (byte 1 51.)
   LAM-IR-MACRO-IR-DISPATCH (BYTE 1 52.)
   LAM-IR-SOURCE-TO-MACRO-IR (BYTE 1 53.)
   LAM-IR-MACRO-STREAM-ADVANCE (BYTE 1 54.)
   LAM-IR-SLOW-DEST (BYTE 1 55.)
   LAM-IR-ILONG (byte 1 56.)
   LAM-IR-STAT-BIT (byte 1 57.)
   LAM-IR-CLOBBERS-MEM-SUBR-BIT (byte 1 58.)  ;Formerly spare, see below.
   LAM-IR-SPARE-BIT (byte 1 58.)  ;For compatibility with old ucode, not spare now.
   LAM-IR-HALT (BYTE 1. 59.) 
   LAM-IR-HIGH-INDIVIDUAL-BITS (BYTE 9 51.)  ;assembler combines these with IOR not +.
   LAM-IR-PARITY-FIELD (BYTE 4. 60.)
   LAM-IR-A-SRC (byte 12. 39.)
   LAM-IR-M-SRC (byte 7 32.)
    LAM-FUNC-SRC-INDICATOR 100 ;ADD IN FOR FUNCTIONAL SOURCES
    LAM-IR-FUNC-SRC-FLAG (BYTE 1 38.)
    LAM-IR-FUNC-SRC-AUX (BYTE 1 37.)		;(Notice most of these sources don't
    LAM-IR-M-SRC-ADR (BYTE 6 32.)		; care if SRC-AUX is on or not...)
     LAM-M-SRC-INTERRUPT-POINTER 100
     LAM-M-SRC-MACRO.IR.DISPLACEMENT 101
     LAM-M-SRC-STAT-COUNTER 102
     LAM-M-SRC-STAT-COUNTER-AUX 142
     LAM-M-SRC-MACRO.IR 103
     LAM-M-SRC-MACRO.IR.DECODE.RAM 104
     LAM-M-SRC-MID 104	     ;if enable-misc-mid is set, this will ref the MISC decode
			     ; portion only if MACRO-IR has a MISC and its destination field
			     ; (bits 14,15) is 0.
     LAM-M-SRC-MID-MISC 144  ;always ref MISC-decode portion of MID if macro-ir has a MISC
			     ; inst (if enable-misc-mid is set).
     LAM-M-SRC-SPY-REG 105
     LAM-M-SRC-MULTIPLIER 146
     LAM-M-SRC-MULTIPLIER-FT 106
     LAM-M-SRC-RG-MODE 107

     LAM-M-SRC-DISP-CONST 110
     LAM-M-SRC-MICRO-STACK 111 		;USP BITS 31-24, US BITS 18-0
     LAM-M-SRC-MICRO-STACK-POP 112 	;SAME AS MICRO-STACK, BUT ALSO POPS USP
     LAM-M-SRC-CRAM-ADR-MAP 113

     LAM-M-SRC-CACHE-ADDRESS 120	;flush??
     LAM-M-SRC-MD-NO-HOLD 121
     LAM-M-SRC-MD 161
     LAM-M-SRC-VMA 122
     LAM-M-SRC-L1-MAP 123
     LAM-M-SRC-L2-MAP-CONTROL 124
     LAM-M-SRC-L2-MAP-PHYSICAL-PAGE 125
     LAM-M-SRC-LC 126

     LAM-M-SRC-PDL-BUFFER-INDEX 130	;prefer spelled out names for PI, etc
     LAM-M-SRC-PI 130
     LAM-M-SRC-Q 131
     LAM-M-SRC-PDL-BUFFER-POINTER 132
     LAM-M-SRC-PP 132
     LAM-M-SRC-DP-MODE 135
     LAM-M-SRC-C-PDL-BUFFER-POINTER 176		;NOTE THAT C-PP AND C-PP-POP ARE ON AT
     LAM-M-SRC-C-PP 176				;THE SAME TIME IF WE WANT A C-PP-POP
     LAM-M-SRC-C-PDL-BUFFER-POINTER-POP 136
     LAM-M-SRC-C-PP-POP 136
     LAM-M-SRC-C-PDL-BUFFER-INDEX 137
     LAM-M-SRC-C-PI 137


;      LAM-MAP-PFR-BIT 1_30.
;      LAM-MAP-PFW-BIT 1_31.

   LAM-US-POINTER-BYTE (BYTE 8 24.)
   LAM-US-DATA-BYTE  (BYTE 21. 0)
    LAM-US-PC	(BYTE 16. 0)
    LAM-US-ADI   (BYTE 2 16.)
    LAM-US-TOP-LEVEL-FLAG (BYTE 1 18.)
   LAM-IR-DEST (BYTE 13. 14.)
   LAM-IR-A-MEM-DEST-FLAG (BYTE 1 26.)
   LAM-IR-A-MEM-DEST (BYTE 12. 14.)
     LAM-A-MEM-DEST-INDICATOR 10000  ;ADD THIS TO A MEM ADDRESS
   LAM-IR-M-MEM-DEST (BYTE 6 14.)
   LAM-IR-FUNC-DEST  (BYTE 6 20.)
   LAM-IR-FUNC-DEST-AUX-FLAG (BYTE 1 25.)
   LAM-FUNC-DEST-LC 1
   LAM-FUNC-DEST-RG-MODE 42
   LAM-FUNC-DEST-INT-CONTROL 42			;for compatibility
   LAM-FUNC-DEST-DP-MODE 2
   LAM-FUNC-DEST-INTERRUPT-CLEAR 41
   LAM-FUNC-DEST-STAT-COUNTER 44		;silly, but DEST AUX selects the main stat
   LAM-FUNC-DEST-STAT-COUNTER-AUX 4		;counter, but SRC AUX selects the aux
   LAM-FUNC-DEST-MID 5			;REMEMBER, SLOW-DEST MUST BE SET FOR THIS TO WORK
   LAM-FUNC-DEST-MACRO.IR.DECODE.RAM 5
   LAM-FUNC-DEST-CRAM-HIGH 6		;REMEMBER, SLOW-DEST MUST BE SET FOR THIS TO WORK
   LAM-FUNC-DEST-CRAM-LOW 7		;REMEMBER, SLOW-DEST MUST BE SET FOR THIS TO WORK
   LAM-FUNC-DEST-C-PDL-BUFFER-POINTER 10	;prefer spelled out names
   LAM-FUNC-DEST-C-PP 10
   LAM-FUNC-DEST-C-PDL-BUFFER-POINTER-PUSH 11
   LAM-FUNC-DEST-C-PP-PUSH 11			;Push, PDL pointer, push!
   LAM-FUNC-DEST-C-PDL-BUFFER-INDEX 12
   LAM-FUNC-DEST-C-PI 12
   LAM-FUNC-DEST-PDL-BUFFER-INDEX 53
   LAM-FUNC-DEST-PI 53
   LAM-FUNC-DEST-PDL-BUFFER-POINTER 13
   LAM-FUNC-DEST-PP 13
   LAM-FUNC-DEST-MICRO-STACK-PUSH 15
   LAM-FUNC-DEST-IMOD-LOW 16
   LAM-FUNC-DEST-IMOD-HIGH 17
   LAM-FUNC-DEST-VMA 20
   LAM-FUNC-DEST-VMA-START-READ 21
   LAM-FUNC-DEST-VMA-START-READ-FORCE 61
   LAM-FUNC-DEST-VMA-START-WRITE 22
   LAM-FUNC-DEST-VMA-START-WRITE-FORCE 62
   LAM-FUNC-DEST-L1-MAP 23		;REMEMBER, SLOW-DEST MUST BE SET FOR THIS TO WORK
   LAM-FUNC-DEST-L2-MAP-CONTROL 24	;REMEMBER, SLOW-DEST MUST BE SET FOR THIS TO WORK
   LAM-FUNC-DEST-L2-MAP-PHYSICAL-PAGE 64;REMEMBER, SLOW-DEST MUST BE SET FOR THIS TO WORK
   LAM-FUNC-DEST-CRAM-MAP 26		;WWII. SLOW-DEST MUST BE SET FOR THIS TO WORK
   LAM-FUNC-DEST-MD 30
   LAM-FUNC-DEST-MD-START-READ 31
   LAM-FUNC-DEST-MD-START-READ-FORCE 71
   LAM-FUNC-DEST-MD-START-WRITE 32
   LAM-FUNC-DEST-MD-START-WRITE-FORCE 72
   LAM-FUNC-DEST-C-PDL-INDEX-INC 33
   LAM-FUNC-DEST-MICRO-STACK-DATA 34
   LAM-FUNC-DEST-MICRO-STACK-POINTER-IF-POP 35		;COMPLICATED. "Works" only on POP
   LAM-FUNC-DEST-C-PDL-INDEX-DEC 36
   LAM-FUNC-DEST-MULTIPLIER 37
   LAM-IR-OB (BYTE 3 9.)  ;note bit 2 of this field conditions sel.0 of the output selector
    LAM-OB-MSK 0 ;DEPENDS ON THIS =0 FOR BREVITY
    LAM-OB-ALU 1	  ;2 on selector
    LAM-OB-ALU-RIGHT-1 2  ;4 on selector
    LAM-OB-ALU-LEFT-1  6  ;5 on selector
    LAM-OB-ALU-EXTEND-25 3 ;6 on selector
    LAM-OB-ALU-MIRROR 7    ;7 on selector
  lam-ir-ob-control-2 (byte 1 11.)  ;this bit goes to masker prom on alu's, allowing access
		;to masked add hacks, etc.
  lam-ir-ob-control-bussed (byte 2 9.) ;these bits are always bussed to all output selectors.
  LAM-IR-MF (BYTE 2 12.) ;MISCELLANEOUS FUNCTION
;   LAM-MF-HALT 1
  LAM-IR-ALUF-ONLY (BYTE 6 3)
  LAM-IR-ALUF (BYTE 7 2)  	;INCLUDING CARRY
    LAM-ALU-SETZ 0_1
    LAM-ALU-AND 1_1
    lam-alu-andca 2_1
    LAM-ALU-AND-25 41_1
    LAM-ALU-SETM 3_1
    LAM-ALU-SETA 5_1
    LAM-ALU-XOR 6_1
    LAM-ALU-XOR-25 46_1
    LAM-ALU-IOR 7_1
    LAM-ALU-IOR-25 47_1
    LAM-ALU-SETO 17_1
    LAM-ALU-SUB 55	      ;includes ALU-CARRY-IN-ONE
    LAM-ALU-SUB-25 155
    LAM-ALU-ADD 31_1
    LAM-ALU-ADD-25 71_1
    LAM-ALU-M+A+1 63
    LAM-ALU-M+M 37_1
    LAM-ALU-M+M+1 77	      ;includes ALU-CARRY-IN-ONE
    LAM-ALU-M+1 71	      ;includes ALU-CARRY-IN-ONE
    LAM-ALU-M-A-1 26_1
    LAM-ALU-MSTEP 20_1
    LAM-ALU-MSTEP-LAST 21_1
    LAM-ALU-DFSTEP 22_1		;** slow destination required to allow divisor sign to load.
    LAM-ALU-DSTEP 23_1
    LAM-ALU-RSTEP 24_1
    ;100 bit, (bit 8 in uinst.) feeds MASKER proms on ALU inst, which, if set, selects:
    ;  alu.output.bus.control.2 =0, bits 31-25 ->1, 24-0-> 0.  ie, if alu.output.bus.control.1
    ;   =0 and alu.output.bus.control.0=1 (normal case), then data type bits come from 
    ;   A source, pointer bits from ALU.
    ;  alu.output.bus.control.2 =1,
  lam-ir-alu-control-5 (byte 1 8)  ;participates in masked-add selection
  lam-ir-real-aluf (byte 6 2)	   ;rest of alu-control
  LAM-IR-CARRY (BYTE 1 2)
  LAM-IR-Q (BYTE 2 0)
    LAM-Q-LEFT 1
    LAM-Q-RIGHT 2
    LAM-Q-LOAD 3

  LAM-IR-DISP-ENABLE-META (BYTE 2 28.)		;enable bits from map.
   lam-ir-disp-enable-gc-write-test-meta (byte 1 28.)
   lam-ir-disp-enable-oldspace-meta (byte 1 29.)
  LAM-IR-DISP-WRITE-VMA (BYTE 1 27.)
  LAM-IR-DISP-LPC (BYTE 1 26.)			;"decrement" return address on call
  lam-ir-push-own-address (byte 1 26.)   	;more modern name for above.
;  LAM-IR-DISP-ADVANCE-INSTRUCTION-STREAM 3001
;  LAM-IR-DISP-LAMT 4012
  LAM-IR-DISP-DISPATCH-CONSTANT (BYTE 12. 14.)
  LAM-IR-DISP-ADDR     (BYTE 12. 39.)
  LAM-IR-DISPATCH-ADDR (BYTE 12. 39.)
  LAM-IR-BYTL-1 (BYTE 6 6)
  LAM-IR-DISP-BYTL (BYTE 5 6)
  LAM-IR-MROT (BYTE 6 0)
  LAM-IR-JUMP-ADDR (BYTE 16. 14.)
  LAM-IR-JUMP-PAGE-NUMBER-IN-ADR (BYTE 12. 18.)
  LAM-IR-JUMP-COND (BYTE 8. 0)
   LAM-IR-JUMP-INVERT-CONDITION (BYTE 1 7)
   LAM-IR-JUMP-TEST-CONDITION (BYTE 1 6)
   LAM-IR-JUMP-COND-LOW (BYTE 4 0)
    LAM-JUMP-COND-BIT-SET 100
    LAM-JUMP-COND-BIT-CLEAR 300
    LAM-JUMP-COND-M<A 101
    LAM-JUMP-COND-M<=A 102
    LAM-JUMP-COND-M=A 303			;inverted sense of a=m used
    LAM-JUMP-COND-PAGE-FAULT 304		;inverted sense of page fault used
    LAM-JUMP-COND-PAGE-FAULT-OR-INTERRUPT 105
    LAM-JUMP-COND-PAGE-FAULT-OR-INTERRUPT-OR-SEQUENCE-BREAK 106
    LAM-JUMP-COND-UNC 107
    LAM-JUMP-COND-M>=A 301
    LAM-JUMP-COND-M>A 302
    LAM-JUMP-COND-M-NEQ-A 103			;inverted from cadr
    LAM-JUMP-COND-NO-PAGE-FAULT 104		;inverted from cadr

    LAM-JUMP-COND-DATA-TYPE-NOT-EQUAL 111
    LAM-JUMP-COND-DATA-TYPE-EQUAL 311

  lam-ir-bit-test (byte 1 7)
    lam-jump-if-bit-set 0
    lam-jump-if-bit-clear 1

  LAM-IR-JUMP-LC-INCREMENT (BYTE 1 11.)
  LAM-IR-R (BYTE 1 10.)
  LAM-IR-P (BYTE 1 9.)
  LAM-IR-JUMP-CALL-RETURN (BYTE 2 9.)
  LAM-IR-JUMP-COND-BITS (BYTE 9. 0)	;ALL JUMP CONDITIONAL BITS INCLUDING N BIT.
  LAM-IR-N (BYTE 1 8.)
  LAM-IR-RPN (BYTE 3 8.)
  LAM-IR-BYTE-FUNC (BYTE 2 28.)
    LAM-BYTE-FUNC-LDB 1			;rotate source
    LAM-BYTE-FUNC-SELECTIVE-DEPOSIT 2	;rotate mask
    LAM-BYTE-FUNC-DPB 3			;rotate both
   LAM-IR-BYTE-SR (BYTE 1 28.)
   LAM-IR-BYTE-MR (BYTE 1 29.)
   lam-ir-uinst-29 (byte 1 29.)	;in alu inst, this same bit allows q-control bits
			;to reach masker proms, allowing access to masked-add hacks.
  LAM-BYTE-SPEC (BYTE 12. 0)
  LAM-IR-BYTE-LENGTH-SPEC (BYTE 6 6)	;ACTUAL BYTE LENGTH IS THIS +1.
  LAM-IR-M-ROTATE (BYTE 6 0)

  ;DISPATCH MEMORY BITS
  LAM-DISP-START-MEM-READ-BIT (byte 1 19.)
  LAM-DISP-R-BIT (BYTE 1 18.)
  LAM-DISP-P-BIT (BYTE 1 17.)
  LAM-DISP-N-BIT (BYTE 1 16.)
  LAM-DISP-RPN-BITS (BYTE 3 16.)
  lam-disp-pc-bits (byte 16. 0)

;half half
  lam-ir-pred-write (byte 1 63.)
  lam-ir-tag-control (byte 3 60.)
))

;these can appear in the source or destination and are directly substituted into the INST.
(DEFUN LAM-IR-DIRECT-BITS ()
  (DPB 1 LAM-IR-SLOW-DEST (DPB 1 LAM-IR-ILONG (DPB 1 LAM-IR-CLOBBERS-MEM-SUBR-BIT 0))))

(setup-ucode-symbols lambda-symbols)
