;;; -*- Mode:LISP; Package:SIMULATOR; Base:10; Readtable:CL -*-

;;; Stuff for defining the instruction set opcode fields.
;;; See the file "HACK-OPCODE-DEFS" to find out what's done with these.

;;; fields which are invariant across instruction type:
;(def-inst-fields (ALU ALU-16-BIT-IMMEDIATE ALU-24-BIT-IMMEDIATE LOAD-32-BIT-IMMEDIATE
;		       FLOATING-POINT-ALU FLOATING-POINT-MULTIPLIER CONDITIONAL-BRANCH
;		       CALLZ JUMP CALL CALL-DISPATCH)

(def-inst-fields (COMMON)
		 stat-bit 		(byte 1 63.)
		 spare1			(byte 1 62.)
		 op-code		(byte 3 58.)
		 sub-op-code            (byte 2 58.)
		 next-pc		(byte 2 56.)
		 boxed-result		(byte 2 54.)
		 data-type-check	(byte 3 51.)
		 call-hardware-op	(byte 3 48.)
		 destination		(byte 7 41.)
		 global-frame-number	(byte 4 37.))

;;; bit 61:
(def-inst-fields (ALU ALU-16-BIT-IMMEDIATE ALU-24-BIT-IMMEDIATE LOAD-32-BIT-IMMEDIATE
		       FLOATING-POINT-ALU FLOATING-POINT-MULTIPLIER)
		 dispatch-to-16-inst-block	(byte 1 61.))

(def-inst-fields (CONDITIONAL-BRANCH JUMP)
		 unconditional		(byte 1 61.))

;;; bits 32-36
(def-inst-fields (ALU ALU-16-BIT-IMMEDIATE ALU-24-BIT-IMMEDIATE CONDITIONAL-BRANCH JUMP)
		 jump-condition-select	(byte 3 34.))

(def-inst-fields (ALU ALU-16-BIT-IMMEDIATE ALU-24-BIT-IMMEDIATE CONDITIONAL-BRANCH JUMP CALLZ CALL-DISPATCH)
		 byte-width		(byte 2 32.))

(def-inst-fields (LOAD-32-BIT-IMMEDIATE FLOATING-POINT-ALU FLOATING-POINT-MULTIPLIER)
		 jump-condition-select	(byte 3 34.)
		 spare2			(byte 2 32.))

;;; right source
(def-inst-fields (ALU FLOATING-POINT-ALU FLOATING-POINT-MULTIPLIER CONDITIONAL-BRANCH
		       CALLZ JUMP CALL CALL-DISPATCH)
		 right-source		(byte 7 25.))

;;; things with left sources
(def-inst-fields (ALU ALU-16-BIT-IMMEDIATE FLOATING-POINT-ALU FLOATING-POINT-MULTIPLIER
		      CONDITIONAL-BRANCH CALLZ  CALL-DISPATCH)
		 left-source		(byte 6 19.))
		 
;;; alu op for 29-332
(def-inst-fields (ALU-16-BIT-IMMEDIATE ALU-24-BIT-IMMEDIATE)
		 alu-operation		(byte 7 25.))

(def-inst-fields (ALU CONDITIONAL-BRANCH CALLZ CALL-DISPATCH)
		 alu-operation		(byte 7 12.))

;;; ALU shift and mask
(def-inst-fields (ALU)
		 spare3			(byte 1 11.)
		 alu-shift		(byte 6  5.)
		 alu-mask		(byte 5  0.))

;;; immediate data fields
(def-inst-fields (ALU-16-BIT-IMMEDIATE)
		 spare4			(byte 3 16.)
		 immediate-16		(byte 16. 0))

(def-inst-fields (ALU-24-BIT-IMMEDIATE)
		 immediate-24		(byte 24. 0))

(def-inst-fields (JUMP CALL)
		 target-address		(byte 24. 0))

(def-inst-fields (ALU-24-BIT-IMMEDIATE JUMP)
		 spare5			(byte 1 24.))

(def-inst-fields (LOAD-32-BIT-IMMEDIATE)
		 immediate-32		(byte 32. 0))

;;; floating point
(def-inst-fields (FLOATING-POINT-ALU FLOATING-POINT-MULTIPLIER)
		 fpu-trap-status	(byte 2 17.)
		 fpu-load		(byte 6 3)
		 fpu-unload		(byte 3 0))

;;; floating point alu
(def-inst-fields (FLOATING-POINT-ALU)
		 fpu-op			(byte 8  9.))	;WTL-2265

;;; floating point multiplier
(def-inst-fields (FLOATING-POINT-MULTIPLIER)
		 mpu-op			(byte 8 9.))

;;; the poor unloved destination-return field
(def-inst-fields (CALL)
		 destination-return-bit-6	(byte 1 61.)
		 destination-return-bit-5-1	(byte 5 32.)
		 destination-return-bit-0	(byte 1 24.))

(def-inst-fields (CALLZ CALL-DISPATCH)
		 destination-return-bit-6	(byte 1 61.)
		 destination-return-bit-5-3	(byte 3 34.)
		 destination-return-bit-2-0	(byte 3  0.))

;;; random branch fields
(def-inst-fields (CONDITIONAL-BRANCH)
		 branch-address		(byte 12. 0))

(def-inst-fields (CALLZ)
		 callz-address		(byte 8 4)
		 spare6			(byte 1 3))

(def-inst-fields (CALL-DISPATCH)
		 spare7				(byte 8 4)
		 dispatch-to-16-inst-block	(byte 1 3))
