; -*- Mode:LISP; Base:8; Readtable:T -*-

;	** (c) Copyright 1980 Massachusetts Institute of Technology **

;;; Elements in Q-CORRESPONDING-VARIABLE-LIST are symbols whose values in maclisp are lists
;;;   all of whose members are symbols with meaningful values.  These symbols
;;;   are made to have the identical values in lisp machine lisp.  This does not have
;;;   anything to do with whether those symbols eventually get SYSTEM-CONSTANT properties
;;;   or SPECIAL properties (or none)
(DEFCONST Q-CORRESPONDING-VARIABLE-LISTS '(
  INITIAL-AREA-LIST
  Q-CDR-CODES
  Q-DATA-TYPES
  Q-HEADER-TYPES
  Q-LISP-CONSTANTS
  q-lisp-variables
  ;RTB-RTB-BITS
  ;RTB-RTS-BITS
  ;RTB-RTO-OPS 
  ;RTB-MISC
  ;RTM-OPS
  ;READTABLE-%%-BITS 
  ARRAY-TYPES
  HEADER-FIELDS
  ARG-DESC-FIELDS
  NUMERIC-ARG-DESC-FIELDS
  FEF-NAME-PRESENT
  FEF-SPECIALNESS
  FEF-ARG-SYNTAX
  FEF-INIT-OPTION
  FEFHI-FIELDS
  FEF-QUOTE-STATUS 
  FEF-FUNCTIONAL
  ARRAY-FIELDS
  ARRAY-LEADER-FIELDS
  ARRAY-MISCS
  Q-REGION-BITS
  Q-VIRTUAL-PAGE-DATA-FIELDS
  SELF-REF-POINTER-FIELDS
  SYSTEM-CONSTANT-LISTS
  SYSTEM-VARIABLE-LISTS
  SCRATCH-PAD-VARIABLES
  FASL-GROUP-FIELDS
  FASL-OPS 
  FASL-TABLE-PARAMETERS
  FASL-CONSTANTS
  FASL-CONSTANT-LISTS
  FEFH-CONSTANTS 
  FAST-FEFH-CONSTANTS
  FEFHI-INDEXES
  STACK-GROUP-HEAD-LEADER-QS
  SG-STATES
  SPECIAL-PDL-LEADER-QS
  REG-PDL-LEADER-QS 
  SG-STATE-FIELDS
  SG-INST-DISPATCHES
  SYSTEM-COMMUNICATION-AREA-QS
  PAGE-HASH-TABLE-FIELDS 
  Q-FIELDS MICRO-STACK-FIELDS
  M-FLAGS-FIELDS
  M-ERROR-SUBSTATUS-FIELDS 
  SPECPDL-FIELDS
  LINEAR-PDL-FIELDS
  LINEAR-PDL-QS
  HARDWARE-MEMORY-SIZES 
  DISK-RQ-LEADER-QS
  DISK-RQ-HWDS
  nupi-disk-rq-halfwords
  DISK-HARDWARE-SYMBOLS
  UNIBUS-CHANNEL-QS
  UNIBUS-CSR-BITS
  CHAOS-BUFFER-LEADER-QS
  CHAOS-HARDWARE-SYMBOLS
  INSTANCE-DESCRIPTOR-OFFSETS
  METER-EVENTS
  METER-ENABLES
  ADI-KINDS
  ADI-STORING-OPTIONS
  ADI-FIELDS
  ))

;;; Elements in SYSTEM-CONSTANT-LISTS are symbols whose maclisp and lisp machine
;;; values are lists of symbols which should get system-constant property for the compiler.
;;; (LISP-REINITIALIZE puts on the SYSTEM-CONSTANT of the first boot.)
;;; Normally should be very close to Q-CORRESPONDING-VARIABLES-LISTS
(DEFCONST SYSTEM-CONSTANT-LISTS '(
  INITIAL-AREA-LIST
  Q-CDR-CODES
  Q-HEADER-TYPES
  Q-LISP-CONSTANTS
  ;RTB-RTB-BITS
  ;RTB-RTS-BITS
  ;RTB-RTO-OPS
  ;RTB-MISC
  ;RTM-OPS
  ;READTABLE-%%-BITS
  ARRAY-TYPES
  HEADER-FIELDS	;Not HEADER-TYPES
  ARG-DESC-FIELDS
  NUMERIC-ARG-DESC-FIELDS
  FEF-NAME-PRESENT
  FEF-SPECIALNESS
  FEF-ARG-SYNTAX
  FEF-INIT-OPTION
  FEFHI-FIELDS
  FEF-DES-DT
  FEF-QUOTE-STATUS 
  FEF-FUNCTIONAL
  ARRAY-FIELDS
  ARRAY-LEADER-FIELDS
  ARRAY-MISCS			    ;ARRAY-MISCS should be flushed someday
  Q-REGION-BITS
  Q-VIRTUAL-PAGE-DATA-FIELDS
  SELF-REF-POINTER-FIELDS
  ;SYSTEM-CONSTANT-LISTS	    ;Some things look at sublists of these
  ;SYSTEM-VARIABLE-LISTS	    ; two
  ;SCRATCH-PAD-VARIABLES
  ;SCRATCH-PAD-POINTERS
  ;SCRATCH-PAD-PARAMETERS
  ;SCRATCH-PAD-TEMPS 
  FASL-GROUP-FIELDS
  FASL-OPS
  FASL-TABLE-PARAMETERS
  FASL-CONSTANTS
  FASL-CONSTANT-LISTS
  FEFH-CONSTANTS
  FAST-FEFH-CONSTANTS
  FEFHI-INDEXES
  STACK-GROUP-HEAD-LEADER-QS
  SG-STATES
  SPECIAL-PDL-LEADER-QS
  REG-PDL-LEADER-QS 
  SG-STATE-FIELDS
  SG-INST-DISPATCHES
  SYSTEM-COMMUNICATION-AREA-QS
  PAGE-HASH-TABLE-FIELDS
  Q-FIELDS MICRO-STACK-FIELDS
  M-FLAGS-FIELDS
  M-ERROR-SUBSTATUS-FIELDS 
  SPECPDL-FIELDS
  LINEAR-PDL-FIELDS
  LINEAR-PDL-QS
  HARDWARE-MEMORY-SIZES 
  DISK-RQ-LEADER-QS
  DISK-RQ-HWDS
  nupi-disk-rq-halfwords
  DISK-HARDWARE-SYMBOLS
  UNIBUS-CHANNEL-QS
  UNIBUS-CSR-BITS
  CHAOS-BUFFER-LEADER-QS
  CHAOS-HARDWARE-SYMBOLS
  INSTANCE-DESCRIPTOR-OFFSETS
  METER-EVENTS
  METER-ENABLES
;  A-MEMORY-ARRAY-SYMBOLS
  ADI-KINDS
  ADI-STORING-OPTIONS
  ADI-FIELDS
  ))

;;; Like above but get declared SPECIAL rather than SYSTEM-CONSTANT
;;;Also done by LISP-REINITIALIZE.
(DEFCONST SYSTEM-VARIABLE-LISTS '(
  Q-DATA-TYPES
  A-MEMORY-LOCATION-NAMES
  A-MEMORY-COUNTER-BLOCK-NAMES
  M-MEMORY-LOCATION-NAMES
  SYSTEM-CONSTANT-LISTS	;Some things look at sublists of these
  SYSTEM-VARIABLE-LISTS	; two
  Q-LISP-VARIABLES
  ))

;;; These get declared SYSTEM-CONSTANT and get their Maclisp values shipped over.
(DEFCONST Q-LISP-CONSTANTS '(
  PAGE-SIZE
 ;SIZE-OF-AREA-ARRAYS
  %ADDRESS-SPACE-QUANTUM-SIZE
  A-MEMORY-VIRTUAL-ADDRESS
  IO-SPACE-VIRTUAL-ADDRESS
  UNIBUS-VIRTUAL-ADDRESS
  MULTIBUS-VIRTUAL-ADDRESS
  MULTIBUS-IO-VIRTUAL-ADDRESS
  ))

;;; These get declared SPECIAL and get the "Maclisp" values shipped over.
(defconst q-lisp-variables '(
  NUMBER-OF-AREAS
  NUMBER-OF-REGIONS
  %ADDRESS-SPACE-MAP-BYTE-SIZE
  INITIAL-AREA-LIST
  Q-DATA-TYPES
  LENGTH-OF-ATOM-HEAD 
  ARRAY-ELEMENTS-PER-Q
  ARRAY-BITS-PER-ELEMENT
  %FEF-HEADER-LENGTH
  %LP-CALL-BLOCK-LENGTH 
  %LP-INITIAL-LOCAL-BLOCK-OFFSET
  A-MEMORY-COUNTER-BLOCK-NAMES
  SYSTEM-CONSTANT-LISTS
  SYSTEM-VARIABLE-LISTS
))
			     
(DEFCONST HARDWARE-MEMORY-SIZES '(
  SIZE-OF-HARDWARE-CONTROL-MEMORY
  SIZE-OF-HARDWARE-DISPATCH-MEMORY 
  SIZE-OF-HARDWARE-A-MEMORY
  SIZE-OF-HARDWARE-M-MEMORY 
  SIZE-OF-HARDWARE-PDL-BUFFER
  SIZE-OF-HARDWARE-MICRO-STACK 
  SIZE-OF-HARDWARE-LEVEL-1-MAP
  SIZE-OF-HARDWARE-LEVEL-2-MAP 
  SIZE-OF-HARDWARE-UNIBUS-MAP
  ))

;;;; Data on how to set up the initial areas in the cold load.

;;; See also INITIAL-AREA-LIST, which is in QCOM because microassembly refers to it.

;;; These areas are encached in the pdl buffer.
(DEFCONST PDL-BUFFER-AREA-LIST '(
; LINEAR-PDL-AREA				;Main pdl
  PDL-AREA					;Pdls for misc stack groups
  ))

;;; Note that at present all areas up through address-space-map must be wired.
;;; The reason is that when the microcode starts up it straight-maps that
;;; amount of virtual memory, without checking separately for each page.
;;; It would lose big if one of those straight-mapped pages got swapped out.
;;; Exceptions: unused portions of page-table-area and physical-page-data get unwired
(DEFCONST WIRED-AREA-LIST '(
  RESIDENT-SYMBOL-AREA				;No good reason
  SYSTEM-COMMUNICATION-AREA			;For console, micro interrupt, etc.
  SCRATCH-PAD-INIT-AREA				;Load micro code variables upon startup
  MICRO-CODE-SYMBOL-AREA			;No good reason, actually
  REGION-ORIGIN					;Used by page fault handler
  REGION-LENGTH					;Used by page fault handler
  REGION-BITS					;Used by page fault handler
  REGION-FREE-POINTER				;Used by DISK-SAVE, etc.
  WIRED-DISK-BUFFER				; Not likely to be swapped out!
  QUANTUM-MAP
  PAGE-TABLE-AREA				;Used by page fault handler
  PHYSICAL-PAGE-DATA				;Used by page fault handler
  ADDRESS-SPACE-MAP				;Used by page fault handler
  virtual-page-volatility
  ))

;;; Areas to be set up read only by cold load
(DEFCONST READ-ONLY-AREA-LIST '(
  SCRATCH-PAD-INIT-AREA
  MICRO-CODE-SYMBOL-AREA
  SUPPORT-ENTRY-VECTOR
  CONSTANTS-AREA
  INIT-LIST-AREA
  P-N-STRING
  MICRO-CODE-SYMBOL-NAME-AREA
  MACRO-COMPILED-PROGRAM
  ))

;;; COLD-LOAD-AREA-SIZES is in QCOM, since writing out a microassembly refers to it.

;;; Default region size is 16K
(DEFCONST COLD-LOAD-REGION-SIZES '(
  WORKING-STORAGE-AREA		#o1000000	;#o10000000 is too big.
  MACRO-COMPILED-PROGRAM	#o1000000
  P-N-STRING 			#o1000000
  NR-SYM			#o200000
  PDL-AREA			#o400000
  SPECIAL-PDL-AREA		#o100000
  PROPERTY-LIST-AREA		#o200000
  PERMANENT-STORAGE-AREA	#o1000000
  ))

;;; In the cold-load, areas have only one region, so you can only use one
;;; representation type per area.  These are the list areas, the rest are structure areas.
;;; *** Ignored now ***
(DEFCONST LIST-STRUCTURED-AREAS '(
  SYSTEM-COMMUNICATION-AREA
  SCRATCH-PAD-INIT-AREA
  MICRO-CODE-SYMBOL-AREA
  PAGE-TABLE-AREA
  PHYSICAL-PAGE-DATA
  REGION-ORIGIN
  REGION-LENGTH
  REGION-BITS
  REGION-FREE-POINTER
  REGION-GC-POINTER
  REGION-LIST-THREAD
  region-moby-bits-array
  region-namespace-origin
  region-spare
  AREA-NAME
  AREA-REGION-LIST
  AREA-REGION-SIZE
  AREA-REGION-BITS
  REGION-AREA-MAP
  SUPPORT-ENTRY-VECTOR
  CONSTANTS-AREA
  MICRO-CODE-ENTRY-AREA
  MICRO-CODE-ENTRY-NAME-AREA
  MICRO-CODE-ENTRY-ARGS-INFO-AREA
  MICRO-CODE-ENTRY-MAX-PDL-USAGE
  MICRO-CODE-ENTRY-ARGLIST-AREA
  MICRO-CODE-SYMBOL-NAME-AREA
  INIT-LIST-AREA
  PROPERTY-LIST-AREA
  ))

;;; Areas in this list contain either unstructured data that is dangerous to
;;; look at, or contain only immediate data so they're not worth scavenging.
;;; Regions in them are given %REPRESENTATION-TYPE-UNSTRUCTURED, and regions of all
;;; other areas are given %REPRESENTATION-TYPE-LISP.

(defconst unstructured-areas '(
; These areas contain unstructured data dangerous to look at.
  micro-code-symbol-area
  wired-disk-buffer
  quantum-map
  page-table-area
  physical-page-data
  address-space-map
  virtual-page-volatility
  region-allocation-status
;No ... this can have symbols
;  micro-code-entry-area
  micro-code-entry-max-pdl-usage
  micro-code-paging-area
  virtual-page-data
; This area contains both lisp and unstructured data.  The scavenger knows about it explicitly.
  system-communication-area
; These areas contain valid lisp structure, but no pointers, so they don't require scavenging.
  region-origin
  region-length
  region-bits
  region-free-pointer
  region-gc-pointer
  region-list-thread
  area-region-list
  area-region-bits
  area-region-size
  region-area-map
  constants-area
  micro-code-entry-args-info-area
  scavenger-queue
  extra-pdl-area))

;;; Areas defined in cold-load have volatility 0 unless specified otherwise here.
(defconst cold-load-area-volatilities '(
  working-storage-area 3
  permanent-storage-area 2
  property-list-area 2
  p-n-string 0
  n-r-sym 0
  macro-compiled-program 1
  fasl-table-area 2
  fasl-temp-area 2))

;;; not including fixed areas
(DEFCONST STATIC-AREAS '(
  CONTROL-TABLES
  PDL-AREA
  SPECIAL-PDL-AREA
; INIT-LIST-AREA
; PERMANENT-STORAGE-AREA
; P-N-STRING
; NR-SYM
; MACRO-COMPILED-PROGRAM 
  ))

;;; Don't put FUNCTION around the symbols in here -- that means if you
;;; redefine the function the microcode does not get the new definition,
;;; which is not what you normally want.  Saying FUNCTION makes it a couple
;;; microseconds faster to call it.  Not all of these data are actually
;;; used; check the microcode if you want to know.
(DEFCONST SUPPORT-VECTOR-CONTENTS '(
  'PRINT
  'CALL-NAMED-STRUCTURE
  'DEFSTRUCT-DESCRIPTION
  'APPLY-LAMBDA
  'EQUAL
  'PACKAGE
  'EXPT-HARD
  'NUMERIC-ONE-ARGUMENT
  'NUMERIC-TWO-ARGUMENTS
  '"unbound"
  'INSTANCE-HASH-FAILURE
  'INSTANCE-INVOKE-VECTOR
  'EQUALP
  'EQUALP-ARRAY
  'resolve-unreconciled-data
  'allocate-new-region-to-moby-area
  ))

;;; Contents of constants page -- non-pointer types only, excepting T and NIL.
(DEFCONST CONSTANTS-PAGE '(NIL T 0 1 2 3 4 5 6 7 8 9 10. -1 -2 -3 -4 -5 -6 -7 -8 -9 -10.
			       #/~ #/: #/, #/. #/( #/) #/' #/# #// #/;
			       #/~ #/: #/, #/. #/( #/) #/' #/# #// #/;
			       #/tab #/newline #/tab #/newline #/space #/space
			       100 200 400 1000 2000 4000
			       1010 0010 2020 0020 3105 0031 0s0 1s0))
			       

(DEFCONST SCRATCH-PAD-VARIABLES '(
  SCRATCH-PAD-POINTERS
  SCRATCH-PAD-PARAMETER-OFFSET 
  SCRATCH-PAD-PARAMETERS
  SCRATCH-PAD-TEMP-OFFSET
  SCRATCH-PAD-TEMPS
  ))

(DEFCONST SCRATCH-PAD-POINTERS '(
  INITIAL-TOP-LEVEL-FUNCTION
  ERROR-HANDLER-STACK-GROUP 
  CURRENT-STACK-GROUP
  INITIAL-STACK-GROUP
  LAST-ARRAY-ELEMENT-ACCESSED
  ))

(DEFCONST SCRATCH-PAD-PARAMETER-OFFSET #o20)

(GLOBAL:WHEN (GLOBAL:> (GLOBAL:LENGTH SCRATCH-PAD-POINTERS) SCRATCH-PAD-PARAMETER-OFFSET) 
  (BARF 'BARF 'SCRATCH-PAD-PARAMETER-OFFSET 'BARF))

(DEFCONST SCRATCH-PAD-PARAMETERS '(
  ERROR-TRAP-IN-PROGRESS
  DEFAULT-CONS-AREA 
  BIND-CONS-AREA
  LAST-ARRAY-ACCESSED-TYPE
  LAST-ARRAY-ACCESSED-INDEX 
  INVOKE-MODE
  INVISIBLE-MODE 
  CDR-ATOM-MODE
  CAR-ATOM-MODE
  ACTIVE-MICRO-CODE-ENTRIES
  ))

(DEFCONST SCRATCH-PAD-TEMP-OFFSET #o20)

(GLOBAL:WHEN (GLOBAL:> (GLOBAL:LENGTH SCRATCH-PAD-PARAMETERS) SCRATCH-PAD-TEMP-OFFSET)
  (BARF 'BARF 'SCRATCH-PAD-TEMP-OFFSET 'BARF))

(DEFCONST SCRATCH-PAD-TEMPS '(
  LAST-INSTRUCTION
  TEMP-TRAP-CODE
  LOCAL-BLOCK-OFFSET 
  SCRATCH-/#-ARGS-LOADED
  TEMP-PC
  SPECIALS-IN-LAST-BLOCK-SLOW-ENTERED
  ))

;;; The documentation that used to be here has been moved to LMDOC;FASLD >

(GLOBAL:PROCLAIM '(GLOBAL:SPECIAL FASL-TABLE FASL-GROUP-LENGTH FASL-GROUP-FLAG FASL-RETURN-FLAG))

(DEFCONST FASL-GROUP-FIELD-VALUES '(
  %FASL-GROUP-CHECK		#o100000 
  %FASL-GROUP-FLAG		#o40000
  %FASL-GROUP-LENGTH		#o37700
  FASL-GROUP-LENGTH-SHIFT	-6
  %FASL-GROUP-TYPE		#o77
  %%FASL-GROUP-CHECK		#o2001
  %%FASL-GROUP-FLAG		#o1701
  %%FASL-GROUP-LENGTH		#o0610
  %%FASL-GROUP-TYPE		#o0006
  ))

(DEFCONST FASL-GROUP-FIELDS (GET-ALTERNATE FASL-GROUP-FIELD-VALUES))
(ASSIGN-ALTERNATE FASL-GROUP-FIELD-VALUES)

(DEFCONST FASL-OPS '(
  FASL-OP-ERR
  FASL-OP-NOOP
  FASL-OP-INDEX
  FASL-OP-SYMBOL
  FASL-OP-LIST
  FASL-OP-TEMP-LIST
  FASL-OP-FIXED
  FASL-OP-FLOAT
  FASL-OP-ARRAY
  FASL-OP-EVAL
  FASL-OP-MOVE 
  FASL-OP-FRAME
  FASL-OP-LIST-COMPONENT
  FASL-OP-ARRAY-PUSH
  FASL-OP-STOREIN-SYMBOL-VALUE 
  FASL-OP-STOREIN-FUNCTION-CELL
  FASL-OP-STOREIN-PROPERTY-CELL 
  FASL-OP-FETCH-SYMBOL-VALUE
  FASL-OP-FETCH-FUNCTION-CELL 
  FASL-OP-FETCH-PROPERTY-CELL
  FASL-OP-APPLY
  FASL-OP-END-OF-WHACK 
  FASL-OP-END-OF-FILE
  FASL-OP-SOAK
  FASL-OP-FUNCTION-HEADER
  FASL-OP-FUNCTION-END 
  FASL-OP-NULL-ARRAY-ELEMENT
  FASL-OP-NEW-FLOAT
  FASL-OP-UNUSED10 
  FASL-OP-UNUSED11
  FASL-OP-UNUSED12
  FASL-OP-QUOTE-POINTER
  FASL-OP-S-V-CELL 
  FASL-OP-FUNCELL
  FASL-OP-CONST-PAGE
  FASL-OP-SET-PARAMETER
  FASL-OP-INITIALIZE-ARRAY 
  FASL-OP-CHARACTER
  FASL-OP-UNUSED1
  FASL-OP-UNUSED2 
  FASL-OP-UNUSED3
  FASL-OP-UNUSED4
  FASL-OP-UNUSED5  
  FASL-OP-UNUSED6
  FASL-OP-STRING
  FASL-OP-STOREIN-ARRAY-LEADER 
  FASL-OP-INITIALIZE-NUMERIC-ARRAY
  FASL-OP-REMOTE-VARIABLE
  FASL-OP-PACKAGE-SYMBOL
  FASL-OP-EVAL1
  FASL-OP-FILE-PROPERTY-LIST
  FASL-OP-REL-FILE
  FASL-OP-RATIONAL
  FASL-OP-COMPLEX
  FASL-OP-LARGE-INDEX
  FASL-OP-STOREIN-SYMBOL-CELL
  ))
(ASSIGN-VALUES FASL-OPS 0)

(DEFCONST FASL-TABLE-PARAMETERS '(
  FASL-NIL
  FASL-EVALED-VALUE
  FASL-TEM1
  FASL-TEM2
  FASL-TEM3 
  FASL-SYMBOL-HEAD-AREA 
  FASL-SYMBOL-STRING-AREA 
  FASL-OBARRAY-POINTER
  FASL-ARRAY-AREA 
  FASL-FRAME-AREA
  FASL-LIST-AREA
  FASL-TEMP-LIST-AREA 
  FASL-UNUSED
  FASL-UNUSED2
  FASL-UNUSED3 
  FASL-UNUSED6
  FASL-UNUSED4
  FASL-UNUSED5
  ))
(ASSIGN-VALUES FASL-TABLE-PARAMETERS 0)

(DEFCONST FASL-CONSTANTS '(
  LENGTH-OF-FASL-TABLE
  FASL-TABLE-WORKING-OFFSET
  ))

(DEFCONST FASL-CONSTANT-LISTS '(
  FASL-GROUP-FIELDS
  FASL-OPS
  FASL-TABLE-PARAMETERS
  FASL-CONSTANTS
  ))

(DEFCONST FASL-TABLE-WORKING-OFFSET #o40)

(GLOBAL:COND ((GLOBAL:> (GLOBAL:LENGTH FASL-TABLE-PARAMETERS) FASL-TABLE-WORKING-OFFSET)
	      (IOC V)
	      (GLOBAL:PRINT 'FASL-TABLE-PARAMETER-OVERFLOW)))

;;; People call this you know, don't go randomly deleting it!
(DEFUN FASL-ASSIGN-VARIABLE-VALUES ()
  ())  ;I guess what this used to do is done at top level in this file
