Google
 

Trailing-Edge - PDP-10 Archives - BB-BL69D-SB_1986 - basic.mic
There are 5 other files named basic.mic in the archive. Click here to see a list.
.TOC	"THE INSTRUCTION LOOP"

.NOBIN
;	Comments updated [302][344][410]
;
;INSTRUCTION DECODE, EA COMPUTATION, AND OPERAND FETCH
;
;	IN GENERAL, AN INSTRUCTION IS STARTED AT XCTGO.
; AT THIS TIME THE INSTRUCTION IS IN ARX AND IR, AND PC HAS ITS ADDRESS.
; THE DRAM OUTPUTS AND "AC" BITS WILL SETTLE DURING THIS
; MICROINSTRUCTION, AND WILL BE LATCHED BY THE CLOCK WHICH ENDS
; THE CYCLE.  XCTGO DISPATCHES ON THE STATE OF THE
; INDIRECT AND INDEX BITS OF THE ARX (EA MOD DISP) TO COMPEA OR
; ONE OF THE THREE LOCATIONS FOLLOWING IT.
;	IF INDIRECT IS SPECIFIED, THE INDIRECT POINTER IS FETCHED (AT
; COMPEA+2 OR +3 (DEPENDING ON WHETHER INDEXING IS ALSO SPECIFIED).
; WE WAIT FOR IT AT INDRCT, AND THEN LOOP BACK TO EFIW, WHERE GLOBAL
; INDEXING AND INDIRECTION, AS WELL AS BAD DATA, WILL BE CHECKED.  ALL
; OF THIS WAS ADDED FOR THE MODEL B.  WHEN THIS IS DONE, OR IF NO
; INDIRECT IS CALLED FOR, WE COMPUTE THE INSTRUCTION'S EFFECTIVE ADDRESS
; (EA) AT COMPEA OR COMPEA+1 (DEPENDING ON WHETHER INDEXING IS CALLED
; FOR), OR AT EFIW+4, 5, 6, OR 7 IF THE LAST WORD IN THE INDIRECTION CHAIN
; WAS GLOBAL AND PERFORM THE FUNCTION "A READ", WHOSE OPERATION DEPENDS
; ON THE DRAM A FIELD, AS FOLLOWS:
;
; MACRO	 A-FLD	MEM FUNCTION	VMA	DISPATCH
;  I	  0	NONE		AD(=EA)  DRAM J
; I-PF	  1	FETCH		PC+1	 DRAM J
; EA	  2	30 BIT EA CALC	AD	 DRAM J
;  W	  3	WR TST		AD	   3	(The model A dispatch
;  R	  4	READ		AD	   4	 addresses were all 40
; R-PF	  5	READ		AD	   5	 greater than these)
; RW	  6	READ/WR TST	AD	   6
; RPW	  7	RD-PSE/WR TST	AD	   7
;
;	A FIELD VALUES 0 AND 1 ARE USED FOR INSTRUCTIONS WHICH NEITHER
; READ NOR WRITE THE CONTENTS OF EA (IMMEDIATE-MODE INSTRUCTIONS,
; JUMPS, ETC).  THESE DISPATCH FROM "A READ" DIRECTLY TO THE MICROCODE
; WHICH HANDLES THE INSTRUCTION.  IF THE A FIELD CONTAINS 1, "A READ"
; CAUSES A PREFETCH (FROM PC+1), SO THAT THE MBOX CAN WORK ON GETTING
; THE NEXT INSTRUCTION INTO ARX WHILE THE EBOX PERFORMS THIS ONE.
;	IF THE A FIELD CONTAINS A 2, THE EA CALCULATION WILL PROVIDE
; A FULL 30 BIT EFFECTIVE ADDRESS TO THE AD AT THE END.  THIS WAS
; INTRODUCED WITH EXTENDED ADDRESSING, TO ALLOW SUCH INSTRUCTIONS AS
; XMOVEI AND XHLLI TO COMPUTE A COMPLETE ADDRESS WITHOUT ACTUALLY
; REFERENCING IT.  OTHERWISE, THIS IS SIMILAR TO AN A FIELD OF 0.  NOTE
; THAT AN A FIELD OF 0 WILL STILL PROVIDE A 30 BIT ADDRESS TO THE VMA;
; ONLY THE RESULT IN THE AD WILL BE DIFFERENT.
;	IF THE A FIELD CONTAINS 3, THE MBOX PERFORMS A PAGING CHECK ON
; EA, AND CAUSES A PAGE FAIL IF THAT LOCATION IS NOT WRITABLE.
; THE MICROCODE GOES TO 3 TO WAIT FOR COMPLETION OF THE PAGE CHECK,
; AND AT THAT LOCATION LOADS AC INTO AR.  THE WRITABILITY OF EA IS
; VERIFIED AT THIS TIME TO PREVENT INCORRECTLY SETTING FLAGS OR
; THE PROCESSOR STATE IF THE INSTRUCTION WILL BE ABORTED BY PAGE
; FAILURE.  LOCATION 3 THEN DISPATCHES TO THE HANDLER FOR THE
; CURRENT INSTRUCTION.
;	A FIELD VALUES 4 TO 7 PERFORM READS FROM EA.  6 AND 7 ALSO TEST
; THE WRITABILITY OF THE LOCATION, AND 7 PERFORMS THE FIRST HALF OF
; A READ-PAUSE-WRITE CYCLE IF EA IS AN UN-CACHED ADDRESS.  THE DISPATCH
; IS TO A, WHERE WE WAIT FOR MEMORY DATA TO ARRIVE IN AR.  IF THE A
; FIELD WAS 5, WE PREFETCH FROM PC+1 AS SOON AS THE DATA ARRIVES.
; IN ANY CASE, WE DISPATCH ACCORDING TO THE DRAM J FIELD TO THE
; HANDLER FOR THE INSTRUCTION.
;	IF A PAGE FAIL OCCURS AT ANY TIME (EITHER IN THIS CODE OR DURING
; INSTRUCTION EXECUTION) THE MICROPROCESSOR TRAPS TO CRAM LOCATION
; 1777 OR 3777, WHERE IT CAUSES A PAGE FAIL TRAP.
;
;	MOST INSTRUCTIONS (THE MOVE, HALFWORD, AND BOOLEAN GROUPS,
; PLUS ADD AND SUB) ARE PERFORMED BY HANDLERS CONSISTING OF ONE OR
; TWO MICROINSTRUCTIONS WHICH LEAVE THE RESULT IN AR, AND COMPLETE
; BY INVOKING THE "EXIT" MACRO.  EXIT USES THE MEM/B WRITE FUNCTION
; TO BEGIN A STORE TO MEMORY FOR THOSE MODES IN WHICH THE RESULT
; GOES TO MEMORY, AND DISP/DRAM B TO GET TO ONE OF THE MICROINSTRUCTIONS
; FOLLOWING ST0.  THIS CODE DEPENDS ON A CERTAIN AMOUNT OF CORRELATION
; BETWEEN THE DRAM A AND B FIELDS.  IN PARTICULAR, STAC (STORE AC)
; ASSUMES THAT A PREFETCH HAS OCCURRED, WHILE THE OTHERS ASSUME THAT
; NO PREFETCH HAS OCCURED.  THUS NORMAL AND IMMEDIATE MODES, WHOSE
; RESULTS GO ONLY TO AC, MUST PREFETCH IN THE DRAM A FIELD, WHILE
; MEM, BOTH, AND SELF MODES, WHOSE RESULTS GO TO MEMORY, MUST NOT.
; (THIS RESTRICTION IS AVOIDED FOR THOSE INSTRUCTIONS WHICH NEVER
; PREFETCH -- IN MUL, DIV, AND IDIV BY USE OF THE EXIT TO ST2AC,
; AND IN IMUL AND THE SINGLE PRECISION FLOATING POINT
; INSTRUCTIONS BY A RESTRICTED EXIT TO ST6.)
;	ANOTHER LARGE SET OF INSTRUCTIONS (SKIP, AOS, SOS, JUMP, AOJ,
; SOJ, AOBJ, CAI, CAM, AND THE TEST GROUP) KNOWS WHERE TO PUT THE
; RESULTS WITHOUT MODE INFORMATION, AND THEY USE THE DRAM B FIELD TO
; DETERMINE WHETHER TO SKIP OR JUMP, AS A FUNCTION OF THEIR OPERANDS.
; SKIP, AOS, AND SOS ARE CONSIDERED SELF-MODE INSTRUCTIONS,
; AND AFTER MAKING THE FETCH DECISION (AND RE-WRITING MEMORY, IN
; THE CASE OF AOS OR SOS), JUMP TO STSELF TO DECIDE WHETHER OR NOT
; TO PUT THE RESULT ALSO IN AC.  THE OTHER INSTRUCTIONS OF THIS SET
; JUMP TO STORAC OR NOP AFTER MAKING THE FETCH DECISION, DEPENDING
; ON WHETHER OR NOT THE OPCODE DEFINITION REQUIRES MODIFICATION OF AC.
; (NOTE THE DIFFERENCE BETWEEN STAC AND FINI ON THE ONE HAND,
; AND STORAC AND NOP ON THE OTHER -- STORAC AND NOP MUST BE USED WHEN
; THE NEXT INSTRUCTION FETCH OCCURS ON THE PRECEDING EBOX CYCLE, BECAUSE
; NICOND MUST NOT IMMEDIATELY FOLLOW A FETCH (ONE CYCLE REQUIRED FOR
; VMA AC REF TO MAKE IT THROUGH THE NICOND LOGIC), STAC AND FINI ARE
; USED WHEN THERE HAS BEEN AN INTERVENING CYCLE.)
;
.TOC	"NEXT INSTRUCTION DISPATCH"

;
; [321] DISP/NICOND (THE "NXT INSTR" MACRO) BRINGS US TO ONE OF THE
; LOCATIONS FOLLOWING "NEXT".  PC HAS BEEN UPDATED TO ADDRESS THE NEXT
; INSTRUCTION IN THE NORMAL FLOW, AND IF IT IS FROM MEMORY
; (AS OPPOSED TO AC'S), THE INSTRUCTION IS IN ARX AND IR.
;	THE NICOND DISPATCH IS PRIORITY ENCODED, AS FOLLOWS: (see CON2)
;(1)	IF PI CYCLE IS TRUE, GO TO NEXT FOR SECOND HALF
; OF STANDARD OR VECTOR INTERRUPT.
;(2)	IF THE RUN FLOP (CON RUN) IS OFF, GO TO NEXT+2, FROM WHICH THE
; MICROCODE WILL ENTER THE HALT LOOP TO WAIT FOR THE CONSOLE TO RESTART
; INSTRUCTION PROCESSING.
;(3)	IF THE METER HAS A REQUEST, GO TO NEXT+4 (MTRINT) TO SERVE IT.
;(4)	IF THE PI SYSTEM HAS A REQUEST READY, GO TO NEXT+6 (INTRPT)
; TO START A PI CYCLE.
;(5)	IF CON UCODE STATE 05 (TRACK EN) IS SET, GO TO NEXT+10 OR 11.
; Normally NEXT+10 will be used; if a trap flag was set by the previous
; instruction, however, NEXT+11 will be reached.  This is the only
; way the trap will ever be detected, so be cautious of ignoring it.
; THIS FLOP IS ENTIRELY UNDER CONTROL OF THE MICROCODE, AND IS ONLY
; USED FOR THE SPECIAL STATISTICS-GATHERING MICROCODE.
;(6)	IF THE LAST INSTRUCTION SET A TRAP FLAG, GO TO NEXT+13 OR +17,
; IT DOESN'T MATTER WHICH.  (NEXT+17 will be reached if VMA contains
; an AC address, probably irrelevant when a trap flag was set.)
;(7)	IF VMA CONTAINS AN AC ADDRESS, IMPLYING THAT THE NEXT
; INSTRUCTION IS TO COME OUT OF FAST MEMORY, GO TO NEXT+16 TO GET IT.
;(10)	--NORMAL CASE-- THE INSTRUCTION IS IN ARX, READY TO GO, GO
; TO NEXT+12 (XCTGO).
;
;	The NICOND dispatch yields the following:
;
;	+0	CON PI CYCLE
;	+2	-CON RUN (i.e. halt)
;	+4	CON MTR INT REQ (meter interrupt)
;	+6	CON INT REQ (interrupt)
;	+10	CON UCODE STATE 05 (tracks enable)
;	+11	CON UCODE STATE 05+TRAP REQ (tracks enable+trap)
;	+12	-VM AC REF (normal instruction)
;	+13	-VM AC REF+TRAP REQ (normal instruction+trap)
;	+16	-CON PI CYCLE (AC ref)
;	+17	-CON PI CYCLE+TRAP REQ (AC ref+trap)
;
;	Other offsets are never reached.
;
.BIN
;NICOND (NXT INSTR) DISPATCH BLOCK

=11*0000				;USE LOC'NS INACCESSIBLE TO DRAM
NEXT:	AR_MQ+1,VMA/AD,			;2ND PART OF INTERRUPT
		SET PI CYCLE,J/PICYC2	;CONTINUE WITH 41+2N
=0010	CLR AR,ARX_1S,SC_#,#/23.,	;HERE IF RUN FLOP OFF
		CALL,J/ROTS		;BUILD ADDR MASK
.IFNOT/EXTEXP				;[230]
.IFNOT/OWGBP				;[344]
	ADMSK,FM_AR,AR_AR+1,J/CHALT	;SAVE MASK, GO HALT
.IF/OWGBP				;[344]
	FM[ADMSK]_AR,AR_AR*2,J/EXMSK	;[230] AR HAS 77,,777776
.ENDIF/OWGBP				;[344]
.IF/EXTEXP				;[230]
	FM[ADMSK]_AR,AR_AR*2,J/EXMSK	;[230] AR HAS 77,,777776
.ENDIF/EXTEXP				;[230]
=0100
MTRINT:	CLR ACCOUNT EN,J/MTRREQ		;HERE IF METER REQUEST UP
	AR_EBUS,SC_#,#/2,J/PICYC1	;HERE IF TAKE INTRPT DOESNT FIND
=0110					; A METER REQUEST
INTRPT:	AR_EBUS,SC_#,#/2,J/PICYC1	;HERE IF INTERRUPT PENDING
;
;	[321] Even if statistics are enabled, traps should not be lost,
;	so override TRACKS and friends when TRAP is set.
;
.IF/TRACKS
=1000	AR_TRX+1,GEN CRY18,SKP CRY0,J/TRK1;STORE PC BEFORE EXECUTING INSTR
	VMA_420+TRAP,J/TRAPX		;[321] Don't lose traps!
.ENDIF/TRACKS
.IF/OP.CNT
=1000	SC_#,#/9.,SKP USER,J/OPCT1	;COUNT THIS INSTR
	VMA_420+TRAP,J/TRAPX		;[321] Don't lose traps!
.ENDIF/OP.CNT
.IF/OP.TIME
=1000	AR_2,CLR TRK+PA EN,J/OPTM0	;TIME THIS INSTR
	VMA_420+TRAP,J/TRAPX		;[321] Don't lose traps!
.ENDIF/OP.TIME
.IF/SO.CNT
=1000
TRK0:	ARX_TRB,BRX/ARX,SKP AC REF,J/TRK1;GET PREV INSTR HOLD THIS INSTR
	VMA_420+TRAP,J/TRAPX		;[321] Don't lose traps!
.ENDIF/SO.CNT
.IF/SO2.CNT
=1000
TRK0:	ARX_TRB,BRX/ARX,SKP AC REF,J/TRK1;GET PREV INSTR HOLD THIS INSTR
	VMA_420+TRAP,J/TRAPX		;[321] Don't lose traps!
.ENDIF/SO2.CNT
=1010
XCTGO:	BRX/ARX,AR_ARX,SET ACCOUNT EN,	;SAVE INSTR, SIGN EXTEND Y,
	    CLR SC,XR,EA MOD DISP,J/COMPEA;[414] GO CALCULATE EA
TRAP:	VMA_420+TRAP,J/TRAPX		;HERE IF TRAP BITS SET
=1110	ARX_FM(VMA),TIME/3T,LOAD IR,J/XCTGO	;HERE IF INSTR IS IN FM
	VMA_420+TRAP,J/TRAPX		;HERE IF TRAP BITS SET

;HERE ON TRAPS, VMA SETUP WITH 420+TRAP CODE
=11****
TRAPX:	LOAD ARX,PT REF			;GET AND XCT TRAP INSTR
=11****	ARX_1S,SET PC+1 INH		;[412] DON'T INCREMENT PC

;HERE AFTER FETCHING INSTR TO BE EXECUTED

=11****
XCTW:	ARX_MEM,LOAD IR,J/XCTGO		;GET INSTR TO XCT
;
;	Start of everything.  PC word is in AR.
;
0:
START:	SET FLAGS_AR,J/SETPC		;LOAD FLAGS, USE REST AS ADDR
1:					;MUST BE AT START+1
CONT:	VMA/PC,FETCH,J/XCTW		;CONTINUE FROM PC
.IF/EXTEXP				;[230]
EXMSK:	AR_AR+1				;[230] GIVES 77,,777777
	FM[EXPMSK]_AR,J/CHALT		;[230] MASK FOR FORTRAN EXT EXP
.IFNOT/EXTEXP				;[344]
.IF/OWGBP				;[344]
EXMSK:	AR_AR+1				;[230] GIVES 77,,777777
	FM[EXPMSK]_AR,J/CHALT		;[230] MASK FOR FORTRAN EXT EXP
.ENDIF/OWGBP				;[344]
.ENDIF/EXTEXP				;[230]
;
;	Rotate subroutine.
;
ROTS:	AR_SHIFT,ARX_SHIFT,SC_#-SC,#/36.,RETURN3
.TOC	"EFFECTIVE ADDRESS COMPUTATION AND OPERAND FETCH"

=11*0000
EFIW:	AR_ARX (AD),GLOBAL,A INDRCT,	;LONG EXTENDED ADDR
		SKP INTRPT,J/INDRCT	;WITH INDIRECT SET
	AR_ARX+XR,GLOBAL,A INDRCT,
		SKP INTRPT,J/INDRCT
	AR_ARX (AD),GLOBAL,A INDRCT,
		SKP INTRPT,J/INDRCT
	AR_ARX+XR,GLOBAL,A INDRCT,
		SKP INTRPT,J/INDRCT

	AR_ARX (AD),GLOBAL,A READ	;LONG EXTENDED ADDR
	AR_ARX+XR,GLOBAL,A READ		; WITH INDEXING IN 2-5
	AR_ARX (AD),GLOBAL,A READ
	AR_ARX+XR,GLOBAL,A READ

PF24:	GET ECL EBUS,J/PFPAR		;[414] ARX BITS 0,1 = 11
	GET ECL EBUS,J/PFPAR		;Illegal indirection
	GET ECL EBUS,J/PFPAR
	GET ECL EBUS,J/PFPAR

=11*1100
COMPEA:	GEN AR,A READ			;LOCAL
	GEN AR+XR,INDEXED,A READ	;LOCAL UNLESS XR>0
	GEN AR,A INDRCT,
		SKP INTRPT,J/INDRCT
	GEN AR+XR,INDEXED,A INDRCT,
		SKP INTRPT
=11***0
INDRCT:	ARX_MEM,LONG EN,J/INDR1
TAKINT:	ARX_MEM,TAKE INTRPT
;
=11****
INDR1:	AR_ARX,XR,EA MOD DISP,
		FE_#,#/24,TIME/3T,J/EFIW
.TOC	"WAIT FOR (E)"

;THE EXECUTE CODE FOR EACH INSTRUCTION IS ENTERED WITH
; THE OPCODE AND AC # IN BRX AND IR, THE LAST INDIRECT WORD
; IN ARX, AND AR AND VMA SETUP AS A FUNCTION OF THE A
; FIELD OF THE DISPATCH RAM. A PREFETCH IS IN PROGRESS IF THE
; DRAM A FIELD WAS 1 OR 5 (OR IF IR CONTAINS "JRST 0,").

;ON "A READ", THE HARDWARE DISPATCHES TO THE EXECUTE CODE FOR
; THE INSTRUCTION IF THE DRAM A FIELD IS 0-2.  IF THE A FIELD
; CONTAINS 3-7, THE HARDWARE DISPATCHES TO A (MODEL B), OR 40+A
; (MODEL A), BELOW:

;COME HERE ON "A READ" FUNCTION IF DRAM A FIELD IS 3 (W macro)
; A "WRITE TST" IS IN PROGRESS

3:	BR/AR,AR_AC0,MB WAIT,		;WAIT FOR PERMISSION TO WRITE
		TIME/3T,IR DISP,J/0	;AND GO TO EXECUTE CODE

;HERE ON "A READ" FUNCTION IF DRAM A FIELD IS 4 (R macro)
; A "LOAD AR" IS IN PROGRESS.  We load FE with 2 for LDB and DPB. [337]

4:	BR/AR,AR_MEM,TIME/3T,FE_#,#/2,	;GET OPERAND, set up FE for byte
		IR DISP,J/0		; instructions [337], and go

;HERE ON "A READ" IF A FIELD IS 5 (R-PF macro)
; A "LOAD AR" IS IN PROGRESS, AND WE MUST PREFETCH WHEN IT COMPLETES

5:	BR/AR,FIN XFER,I FETCH,		;GET OPERAND, PREFETCH,
		TIME/3T,IR DISP,J/0	; & START EXECUTE

;HERE ON "A READ" IF A FIELD IS 6 (RW macro)
; A "LOAD AR" IS IN PROGRESS, PAGING IS TESTING WRITABILITY
; We load FE with 2 for ILDB and IDPB. [337]

6:	BR/AR,AR_MEM,TIME/3T,FE_#,#/2,	;GET OPERAND, load FE for byte
		IR DISP,J/0		; instructions [337], and go

;HERE ON "A READ" IF A FIELD IS 7 (RPW macro)
; A "READ-PAUSE-WRITE" IS IN PROGRESS

7:	BR/AR,AR_MEM,TIME/3T,		;GET OPERAND
		IR DISP,J/0		; START EXECUTE
.TOC	"TERMINATION"

;DISPATCH HERE WITH THE "EXIT" MACRO,
; OR JUMP DIRECTLY TO ONE OF THESE LOCATIONS.

=0****00*000				;[430]
ST0:					;BASE FOR B DISP IN EXIT MACRO
=001
ST2AC:	MQ_AR,AR_SIGN,I FETCH,J/DSHIFT	;[430] HERE TO STORE AC0 & AC1
	FIN STORE,MQ_AR,AR_SIGN,	;[430] MULB, DIVB, etc. Wait for
	    I FETCH,J/DSHIFT		; mem, gen low sign bit, and store
SLFEND:	FIN STORE,I FETCH,		;[440] SELF MODE
		SKP AC#0,J/STSELF	; RESULT TO AC TOO?
SHFLOD:	AR_SHIFT			;[337] Shift byte load result
STAC:	AC0_AR,NXT INSTR		;NORMAL AND IMMEDIATE MODES
ST6:
IFNOP:
STMEM:	FIN STORE,I FETCH,J/NOP		;MEM MODE
IFSTAC:
STBOTH:	FIN STORE,I FETCH,J/STORAC	;BOTH mode
=
;
;HERE TO FINISH, AFTER FETCHING NEXT INSTRUCTION.
; WE MUST GUARANTEE AT LEAST ONE EBOX CYCLE BETWEEN FETCH AND NICOND,
; TO ALLOW VMA AC REF TO MAKE IT THROUGH THE NICOND LOGIC.
; Most noops come here directly. [412]
216:					;[440]
STSELF:					;SKIP, AOS, SOS COME HERE
STORAC:	SR_0,J/STAC			;STORE AC, TOO
217:					;[440] TRN, CAI, etc. get here  
NOP:	SR_0				;Must be near CAIx instructions
FINI:	NXT INSTR			;Load IR and PC, test PI cycle, RUN,
					; PI READY, TRAPS
;
;	Store AC1 and finish up.
;
STD1:	AR_SHIFT,SR_0			;BRING IN LOW PART
;
;	[356] The next two locations are fixed at 136 and 137.  We don't
;	really care where they are, but the front end looks at the # field
;	of these to get the microcode major version (# bits 0-5 of 136),
;	minor version (# bits 6-8 of 136), and edit number (# bits 0-8 of
;	137).
;
136:					;[357]
STAC1:	AC1_AR,FINISH,			;GO DO NEXT INSTRUCTION
		MAJVER/MAJOR,MINVER/MINOR;[356]
;
;HERE TO GET MICRO-CODE VERSION #.  FIXED LOC'N SO SOFTWARE CAN FIND IT
;
137:
UVERS:	BR/AR,AR0-8_#,#/EDIT,J/GTAR08	;COPY VERSION TO AR
.TOC	"MOVE GROUP, EXCH, XMOVEI, XHLLI"

	.DCODE
200:	R-PF,	AC,	J/MOVE		;MOVE
	I-PF,	AC,	J/MOVE		;MOVEI
	I,	B/1,	J/MOVEM		;MOVEM--no write test needed
	RW,		J/MOVES		;MOVES [440]

204:	R-PF,	AC,	J/MOVS		;MOVS
	I-PF,	AC,	J/MOVS		;MOVSI
	W,	M,	J/MOVS		;MOVSM
	RPW,	S,	J/MOVS		;MOVSS

210:	R-PF,	AC,	J/MOVN		;MOVN
	I-PF,	AC,	J/MOVN		;MOVNI
	W,	M,	J/MOVN		;MOVNM
	RPW,	S,	J/MOVN		;MOVNS

214:	R-PF,	AC,	J/MOVM		;MOVM
	I-PF,	AC,	J/HRRZ		;MOVMI <==> HRRZI <==> MOVEI
	W,	M,	J/MOVM		;MOVMM
	RPW,	S,	J/MOVM		;MOVMS

250:	RPW,	B/0,	J/EXCH		;EXCH--adjoins BLT
	.UCODE

=0****00****
MOVS:	AR_AR SWAP,EXIT			;ALSO USED BY HALFWORD GROUP
=
202:					;Must be near HRRZ
MOVM:	BR/AR,SKP AR0,J/MOVE		;FORCE POSITIVE
;
=0****00****
MOVN:	BR/AR,J/MOVNEG			;GET NEGATIVE
=
100:
MOVE:	EXIT				;STORE AS IS FROM AR
101:
MOVNEG:	AR_-BR,AD FLAGS,EXIT		;[412] Negate before storing
313:					;[440] Near SKIP, MOVEM
MOVES:	I FETCH,SKP AC#0,J/STSELF	;Like MOVE if AC not 0
314:					;[440] Near BLT, SKIP, MOVES
MOVEM:					;LIKE EXCH, EXCEPT NO STORE AC
EXCH:	ARX_AR,AR_AC0,STORE,J/STMAC	;PUT AC AT E, THEN STORE AC
;
102:					;Near SETM (MOVE)
XMOVEI:	SKP -LOCAL AC ADDR,I FETCH	;30 bit version of MOVEI
=0
XMOVEI1:ARL_1.M,ARR_ARR,J/STAC		;AC IN NON-ZERO SECTION
	CLR P,J/STAC			;RETURN 30-BIT ADDRESS
317:					;[440] Near HLL
XHLLI:	SKP -LOCAL AC ADDR,I FETCH,
		ARR_AC0.S,ARL_ARL.S,J/XMOVEI1
.TOC	"Physical MOVE Instructions--PMOVE, PMOVEM"
;
;	PMOVE and PMOVEM were added to the architecture as something of an
;	afterthought (as their opcodes may suggest) primarily to improve
;	the monitor performance of certain I/O devices which require
;	manipulation of data structures in physical memory.  Note that
;	the effective address of the instruction CONTAINS the physical
;	address to move from or to, somewhat akin to XJRST.  This extra
;	level of indirection is necessary to make section zero physical
;	addresses easily accessible from a non zero section and vice versa.
;	(Without this mechanism, the EA calculation logic would consider
;	addresses in section zero to be local, and would insert the current
;	section into the VMA.)
;

	.DCODE
052:	R,	B/0,	J/PMOVE		;PMOVE (Was reserved to DEC)
	R,	B/2,	J/PMOVEM	;PMOVEM (Ditto)
	.UCODE

=0****00****
PMOVE:					;Share the code with PMOVEM
PMOVEM:	VMA_AR,SKP IO LEGAL,B DISP	;Set VMA for PMOVEM. OK to do?
=
=00	AR_BR,J/UUO			;Illegal to do a PMOVE
	VMA_AR,LOAD AR,PHYS REF,J/STBOTH;PMOVE OK. Do a physical load
	AR_BR,J/UUO			;Illegal to do a PMOVEM
	AR_AC0,STORE,PHYS REF,J/STMEM	;PMOVEM OK. Do the physical store
.TOC	"DMOVE, DMOVN, DMOVEM, DMOVNM"

;	Double word moves to ACs.

	.DCODE
120:	I,	B/0,	J/DMOVE		;DMOVE [413]
	I,	B/1,	J/DMOVN		;DMOVN [413]
	.UCODE

=0****00****
DMOVN:
DMOVE:	VMA_VMA+1,LOAD AR		;PICK UP (E+1)
=
TWJUNK:	FIN LOAD,VMA_VMA-1,LOAD ARX,	;And (E)--redundant if from ADJBP
	    B DISP			;Split DMOVE from DMOVN
=100	FIN LOAD,I FETCH,J/DLOAD	;DMOVE. Start I FETCH and load
	ARX_MEM,MQ_0.S,CALL [DNSUB]	;DMOVN. Do the negation
=111	AR_SHIFT,ARX/MQ,GEN -BR LONG,	;Force 0 into AC1 high bit
	    AD FLAGS,I FETCH		; and set carry/overflow flags
DLOAD:	AC1_AR,AR_ARX,J/STAC		;Now load AC1, then AC0
;
;	DNSUB--Subroutine to swallow the high bit of the low order word of
;	a double pair, copy both words to BR/BRX, negate the pair and store
;	the high order word (if DMOVNM), and set up to zero the high bit of
;	the low order word.  Return 2.
;
DNSUB:	ARX_AR*2,AR_ARX,SC_#,#/35.	;Eat low order bit 0, set count
	BR_AR LONG,AR_-AR LONG,B STORE	;Negate, store if DMOVNM
	MEM_AR,MQ_AR,AR_0S,RETURN [2]	;Set up for shift, keep AC0

;	DOUBLE MOVES TO MEMORY

	.DCODE
124:	I,		J/DMOVEM	;DMOVEM [413]
	W,	B/2,	J/DMOVNM	;DMOVNM
	.UCODE

=0****00**00
DMOVEM:	AR_AC0,STORE,SC_#,#/36.,J/GETAC1;Store AC0 and set for later grab
;
DMOVNM:	MQ_0.S,AR_AC1,ARL/AD,ARX_AR,	;[421] Get second word, do
	    CALL [DNSUB]		; negation, and store high word
=11	GEN -BR LONG,AD FLAGS,J/STLOW	;Set carry/overflow flags
=
;
GETAC1:	ARX_AC1				;For DMOVEM, ready second word
STLOW:	FIN STORE,VMA_VMA+1,AR_SHIFT,	;Store, then done
	    STORE,J/STMEM
;
;	Come in here from meter code (DMVM1) and floating point (DBLST).
;	These are hacks which should be killed, if possible.
;
DMVM1:	MEM_AR,AR_0S,J/STLOW		;Set up to zero AC1 high bit
;
DBLST:	AC0_AR,AR_0S,I FETCH,J/STD1	;Store high word, ready low
.TOC	"HALFWORD GROUP"
;	DESTINATION LEFT HALF

	.DCODE
500:	R-PF,	AC,	J/HLL		;HLL
	EA,	AC,	J/XHLLI		;XHLLI--Use 30 bit address
	RPW,	M,	J/HRR		;HLLM = HRR EXCEPT FOR STORE
	RW,		J/MOVES		;HLLS <==> MOVES [440]

	R-PF,	AC,	J/HRL		;HRL
	I-PF,	AC,	J/HRL		;HRLI
	RPW,	M,	J/HRLM		;HRLM
	RPW,	S,	J/HRLS		;HRLS

510:	R-PF,	AC,	J/HLLZ		;HLLZ
	I-PF,	AC,	J/HLLZ		;HLLZI <==> SETZ
	W,	M,	J/HLLZ		;HLLZM
	RPW,	S,	J/HLLZ		;HLLZS

	R-PF,	AC,	J/HRLZ		;HRLZ
	I-PF,	AC,	J/HRLZ		;HRLZI <==> MOVSI
	W,	M,	J/HRLZ		;HRLZM
	RPW,	S,	J/HRLZ		;HRLZS

520:	R-PF,	AC,	J/HLLO		;HLLO
	I-PF,	AC,	J/HLLO		;HLLOI
	W,	M,	J/HLLO		;HLLOM
	RPW,	S,	J/HLLO		;HLLOS

	R-PF,	AC,	J/HRLO		;HRLO
	I-PF,	AC,	J/HRLO		;HRLOI
	W,	M,	J/HRLO		;HRLOM
	RPW,	S,	J/HRLO		;HRLOS

530:	R-PF,	AC,	J/HLLE		;HLLE
	I-PF,	AC,	J/SETZ		;HLLEI <==> SETZ [412]
	W,	M,	J/HLLE		;HLLEM
	RPW,	S,	J/HLLE		;HLLES

	R-PF,	AC,	J/HRLE		;HRLE
	I-PF,	AC,	J/HRLE		;HRLEI
	W,	M,	J/HRLE		;HRLEM
	RPW,	S,	J/HRLE		;HRLES
;	DESTINATION RIGHT HALF

540:	R-PF,	AC,	J/HRR		;HRR
	I-PF,	AC,	J/HRR		;HRRI
	RPW,	M,	J/HLL		;HRRM = HLL EXCEPT FOR STORE
	RW,		J/MOVES		;HRRS <==> MOVES [440]

	R-PF,	AC,	J/HLR		;HLR
	I-PF,	AC,	J/HLR		;HLRI
	RPW,	M,	J/HLRM		;HLRM
	RPW,	S,	J/HLRS		;HLRS

550:	R-PF,	AC,	J/HRRZ		;HRRZ
	I-PF,	AC,	J/HRRZ		;HRRZI <==> MOVEI
	I,		J/HRRZM		;HRRZM [442]
	RPW,	S,	J/HRRZ		;HRRZS

	R-PF,	AC,	J/HLRZ		;HLRZ
	I-PF,	AC,	J/HLRZ		;HLRZI <==> SETZ
	W,	M,	J/HLRZ		;HLRZM
	RPW,	S,	J/HLRZ		;HLRZS

560:	R-PF,	AC,	J/HRRO		;HRRO
	I-PF,	AC,	J/HRRO		;HRROI
	W,	M,	J/HRRO		;HRROM
	RPW,	S,	J/HRRO		;HRROS

	R-PF,	AC,	J/HLRO		;HLRO
	I-PF,	AC,	J/HLRO		;HLROI
	W,	M,	J/HLRO		;HLROM
	RPW,	S,	J/HLRO		;HLROS

570:	R-PF,	AC,	J/HRRE		;HRRE
	I-PF,	AC,	J/HRRE		;HRREI
	W,	M,	J/HRRE		;HRREM
	RPW,	S,	J/HRRE		;HRRES

	R-PF,	AC,	J/HLRE		;HLRE
	I-PF,	AC,	J/SETZ		;HLREI <==> SETZ [412]
	W,	M,	J/HLRE		;HLREM
	RPW,	S,	J/HLRE		;HLRES

	.UCODE
;FIRST, THE 16 OPS WHICH DO NOT AFFECT THE "OTHER" HALF.
;THESE MUST BE TREATED SEPARATELY, BECAUSE THEY COMBINE MEMORY DATA
;IN AR WITH DATA FROM THE FM.  ENTER WITH 0,E OR (E) IN AR.

315:					;[440] Near MOVES (for HLLS)
HRR:	ARL_AC0,ARR_ARR,EXIT		;HRR, HRRI, HLLM
316:					;[440] Near XHLLI, MOVES (for HRRS)
HLL:	ARR_AC0,ARL_ARL,EXIT		;HLL, HRRM
			;HRRS, HLLS ARE BOTH EQUIVALENT TO MOVES
=0****00****
HRL:	ARL_ARR,ARR_AC0,EXIT		;HRL, HRLI
=
=0****00****
HLR:	ARR_ARL,ARL_AC0,EXIT		;HLR, HLRI
=
=0****00***0
HRLM:	ARL_ARR,ARR_AC0,J/MOVS		;HRLM
HRLS:	ARL_ARR,ARR_ARR,EXIT		;HRLS
=
=0****00***0
HLRM:	ARR_ARL,ARL_AC0,J/MOVS		;HLRM
HLRS:	ARR_ARL,ARL_ARL,EXIT		;HLRS
=
;NOW THE HALFWORD OPS WHICH CONTROL THE "OTHER" HALF
; ENTER WITH 0,E, (E), OR (AC) IN AR

=0****00****
HRRE:	SKP AR18			;SELECT HRRZ OR HRRO ON SIGN
=
200:					;Must be near MOVMI, HRRZM
HRRZ:	ARL_0S,ARR_ARR,EXIT
201:
HRRO:	ARL_1S,ARR_ARR,EXIT
203:					;[442] Near HRRZ
HRRZM:	ARL_0S,ARR_AC0,STORE,J/STMEM	;[442] No need for write test
;
=0****00****
HRLE:	SKP AR18
=
=0****00***0
HRLZ:	ARL_ARR,ARR_0S,EXIT
HRLO:	ARL_ARR,ARR_1S,EXIT
=
702:					;Must be near SETZ
HLRE:	SKP AR0
=0****00***0
HLRZ:	ARR_ARL,ARL_0S,EXIT
HLRO:	ARR_ARL,ARL_1S,EXIT
=
703:					;Must be near SETZ
HLLE:	SKP AR0
704:					;Must be near HLRE and HLLE
SETZ:					;[421] ARL already 0 for SETZ
HLLZ:	ARR_0S,ARL_ARL,EXIT
705:					;Must follow HLLZ
HLLO:	ARR_1S,ARL_ARL,EXIT
.TOC	"BOOLEAN GROUP"
	.DCODE
400:	I-PF,	AC,	J/SETZ		;SETZ <==> HLLZI--use that code
	I-PF,	AC,	J/SETZ		;SETZI <==> SETZ
	I,	M,	J/SETZ		;SETZM [421]
	I,	B,	J/SETZ		;SETZB [421]

404:	R-PF,	AC,	J/AND		;AND
	I-PF,	AC,	J/AND		;ANDI
	RPW,	M,	J/AND		;ANDM
	RPW,	B,	J/AND		;ANDB
	.UCODE

=0****00****
AND:	AR_AR*AC0,AD/AND,EXIT
=
	.DCODE
410:	R-PF,	AC,	J/ANDCA		;ANDCA
	I-PF,	AC,	J/ANDCA		;ANDCAI
	RPW,	M,	J/ANDCA		;ANDCAM
	RPW,	B,	J/ANDCA		;ANDCAB
	.UCODE

=0****00****
ANDCA:	AR_AR*AC0,AD/ANDCB,EXIT
=
	.DCODE
414:	R-PF,	AC,	J/MOVE		;SETM <==> MOVE
	EA,	AC,	J/XMOVEI	;XMOVEI (SETMI)--Use 30 bit EA
	W,		J/IFNOP		;[430] SETMM = NOP+memory write
	RW,		J/IFSTAC	;[430] SETMB = MOVE+memory write

420:	R-PF,	AC,	J/ANDCM		;ANDCM
	I-PF,	AC,	J/ANDCM		;ANDCMI
	RPW,	M,	J/ANDCM		;ANDCMM
	RPW,	B,	J/ANDCM		;ANDCMB
	.UCODE

110:					;Must be near TLX
ANDCM:	AR_AR*AC0,AD/ANDCA,EXIT

	.DCODE
424:	I-PF,		J/NOP		;SETA <==> TRN (NOP) [413]
	I-PF,		J/NOP		;SETAI <==> TRN
	I,	B/1,	J/MOVEM		;SETAM <==> MOVEM [412]
	I,	B/1,	J/MOVEM		;SETAB <==> MOVEM [412]

430:	R-PF,	AC,	J/XOR		;XOR
	I-PF,	AC,	J/XOR		;XORI
	RPW,	M,	J/XOR		;XORM
	RPW,	B,	J/XOR		;XORB
	.UCODE

111:					;Must be near TLX
XOR:	AR_AR*AC0,AD/XOR,EXIT
	.DCODE
434:	R-PF,	AC,	J/IOR		;OR
	I-PF,	AC,	J/IOR		;ORI
	RPW,	M,	J/IOR		;ORM
	RPW,	B,	J/IOR		;ORB
	.UCODE

112:					;Must be near TLX
IOR:	AR_AR*AC0,AD/OR,EXIT

	.DCODE
440:	R-PF,	AC,	J/ANDCB		;ANDCB
	I-PF,	AC,	J/ANDCB		;ANDCBI
	RPW,	M,	J/ANDCB		;ANDCBM
	RPW,	B,	J/ANDCB		;ANDCBB
	.UCODE

=0****00****
ANDCB:	AR_AR*AC0,AD/ANDC,EXIT		;NOR function
=
	.DCODE
444:	R-PF,	AC,	J/EQV		;EQV
	I-PF,	AC,	J/EQV		;EQVI
	RPW,	M,	J/EQV		;EQVM
	RPW,	B,	J/EQV		;EQVB
	.UCODE

=0****00****
EQV:	AR_AR*AC0,AD/EQV,EXIT
=
	.DCODE
450:	I-PF,	AC,	J/SETCA		;SETCA
	I-PF,	AC,	J/SETCA		;SETCAI <==> SETCA
	I,	M,	J/SETCA		;SETCAM
	I,	B,	J/SETCA		;SETCAB
	.UCODE

=0****00****
SETCA:	AR_AC0 COMP,EXIT		;[442]
=
	.DCODE
454:	R-PF,	AC,	J/ORCA		;ORCA
	I-PF,	AC,	J/ORCA		;ORCAI
	RPW,	M,	J/ORCA		;ORCAM
	RPW,	B,	J/ORCA		;ORCAB
	.UCODE

=0****00****
ORCA:	AR_AR*AC0,AD/ORCB,EXIT
=
	.DCODE
460:	R-PF,	AC,	J/SETCM		;SETCM
	I-PF,	AC,	J/SETCM		;SETCMI
	RPW,	M,	J/SETCM		;SETCMM
	RPW,	B,	J/SETCM		;SETCMB
	.UCODE

=0****00****
SETCM:	ADA/AR,AD/SETCA,AR/AD,EXIT
=
	.DCODE
464:	R-PF,	AC,	J/ORCM		;ORCM
	I-PF,	AC,	J/ORCM		;ORCMI
	RPW,	M,	J/ORCM		;ORCMM
	RPW,	B,	J/ORCM		;ORCMB
	.UCODE

=0****00****
ORCM:	AR_AR*AC0,AD/ORCA,EXIT
=
	.DCODE
470:	R-PF,	AC,	J/ORCB		;ORCB
	I-PF,	AC,	J/ORCB		;ORCBI
	RPW,	M,	J/ORCB		;ORCBM
	RPW,	B,	J/ORCB		;ORCBB
	.UCODE

=0****00****
ORCB:	AR_AR*AC0,AD/ORC,EXIT		;NAND function
=
	.DCODE
474:	I-PF,	AC,	J/SETO		;SETO
	I-PF,	AC,	J/SETO		;SETOI <==> SETO
	I,	M,	J/SETO		;SETOM
	I,	B,	J/SETO		;SETOB
	.UCODE

=0****00****
SETO:	AR_1S,EXIT
=