Google
 

Trailing-Edge - PDP-10 Archives - BB-AS80B-SM_1985 - sources/shift.mic
There are 5 other files named shift.mic in the archive. Click here to see a list.
.TOC	"ROTATES AND LOGICAL SHIFTS -- ROT, LSH, JFFO"

	.DCODE
240:	I,	B/0,	J/ASH
	I,	B/0,	J/ROT
	I,	B/2,	J/LSH
	I,		J/JFFO
	I,	B/1,	J/ASHC
	I,		J/ROTC
	I,		J/LSHC
	EA,		J/UUO
	.UCODE

;ENTER WITH 0,E IN AR
; NOTE THAT VALUES OF SC GREATER THAN 36
; CAUSE THE SHIFTER TO SELECT ARX.

=0****00***0
LSH:	AR_AC0,ARL/AD,ARX_0.M,SC_EA,
		SKP AR18,J/SHR1

JFFO:	AR_AC0,SKP AD NE,SC_#,#/6
=
=0	AC1_AR,I FETCH,J/NOP		;AC WAS ZERO, NO JUMP
	ARX+MQ_0.M,FE_P,SKP SCAD NE,	;TEST FIRST 6 BITS
		AR_SHIFT,ARL/SH		;DISCARD THEM
=0
JFFO1:	AR_SHIFT,FE_P,SKP SCAD NE,	;TEST NEXT 6 BITS
		ARX_ARX-1,J/JFFO1	;LOOP, COUNTING, TILL NE
	P_FE,ARR_0.S,			;RESTORE 6 NON-ZERO BITS
		ARX_ARX*-6		;GET POS GROUP COUNT*6
=0
JFFO2:	SKP AR0,AR_2(AR+1),		;LOOP TO FIND A 1
		ARX_ARX+1,J/JFFO2	;COUNTING AS WE GO
	AR_ARX-1,FETCH,J/STRAC1

=0****00***0
ASH:	SC_EA,SKP AR18,			;GET SHIFT AMOUNT
		AR_0S,J/ASHL		;SET LOW PART = 0
ROT:	AR_AC0,ARX_AC0,SC_EA,SKP AR18
=
;SINGLE-WORD LSH/ROT
; FOR ROT, B=0, AR AND ARX BOTH CONTAIN AC
; FOR LSH, B=2, AR HAS AC, ARX IS ZERO

=00
SHR1:	AR_SHIFT,SC_#+SC,#/-36.,	;DO POS (LEFT) SHIFT, CHK RANGE
		SKP SCAD0,J/SHR2
	ARX_AR (AD),AR_ARX (ADX),
		SC_#+SC,#/36.,
		B DISP,SKP SCAD0,J/SHR1	;MAKE NEG SHIFT TO EQUIV POS
SHR2:	AR_SHIFT,SC_#+SC,#/-36.,
		SKP SCAD0,J/SHR2	;BRING SC INTO RANGE
	AC0_AR,I FETCH,J/NOP		;DONE
.TOC	"ROTATE AND LOGICAL SHIFT COMBINED -- ROTC, LSHC"

=0****00***0
ASHC:	SC_EA,SKP AR18,			;SETUP SHIFT COUNT
		AR_AC1*2,J/ASHL		;GET LOW WORD
ROTC:	ARX_AC1
=	AR_AC0,SC_EA,SKP AR18		;SETUP BOTH AC'S
=0
ROT3:	MQ_SHIFT,ARX_AR (AD),
		AR_ARX (ADX),J/ROT4
	ARX_AR (AD),AR_ARX (ADX),
		SC_#+SC,#/36.,SKP SCAD0,J/ROT3

ROT4:	AR_MQ,ARX_SHIFT,
		SC_#+SC,#/-36.,SKP SCAD0
=0	MQ_SHIFT,ARX_AR (AD),
		AR_ARX (ADX),J/ROT4
STDAC:	AC0_AR,AR_ARX,I FETCH,J/STRAC1


1004:					;NEXT TO UUO
LSHC:	ARX_AC1,MQ_0.M
LSH1:	AR_AC0,SC_EA,FE_#,#/36.,SKP AR18
=0
LSH2:	MQ_SHIFT,AR_ARX (ADX),
		ARX/MQ,FE_#,#/-36.,J/LSH3
	ARX_AR (AD),AR_0.M,MQ_ARX,
		SC_FE+SC,SKP SCAD0,J/LSH2

LSH3:	AR_MQ,ARL/AD,ARX_SHIFT,MQ_0.M,
		SC_FE+SC,SKP SCAD0
=0	MQ_SHIFT,AR_ARX (ADX),ARX/MQ,J/LSH3
	AC0_AR,AR_ARX,I FETCH,J/STRAC1
.TOC	"ARITHMETIC SHIFTS -- ASH, ASHC"

;COMMON CODE FOR ARITHMETIC SHIFTS

=0
ASHL:	ARX_AR,AR_AC0,			;INPUT NOW IN AR LONG
		SKP SC NE,J/ASHL1	;CHECK FOR NULL SHIFT
	ARX_AR,AR_AC0,			;HERE IF RIGHT SHIFT
		SC_#+SC,#/36.,SKP SCAD0	;CHECK FOR LONG ONE
=0
ASHR1:	BR/AR,ARX_SHIFT,AR_SIGN,J/ASHR2	;LOW OUTPUT TO ARX
	ARX_AR,AR_SIGN,			;HERE IF SHIFT COUNT .GT. 36
		SC_#+SC,#/36.,		;BRING COUNT UP BY 36
		SKP SCAD0,J/ASHR1	;LOOP TILL COUNT REASONABLE

ASHR2:	BRX/ARX,ARX_BR,			;HIGH INPUT TO ARX
		B DISP,J/ASHX

;HERE FOR LEFT ARITHMETIC SHIFT

=0
ASHL1:	I FETCH,J/NOP			;SHIFT 0 IS A NOP
	BR_AR LONG,AR_SIGN		;SAVE INPUT, GEN SIGN WORD
	BR/AR,AR_BR*2 LONG		;SAVE SIGN, GET MAGNITUDE BITS
=0*
ASHL2:	BRX/ARX,ARX_AR,AR_BR,		;HI IN TO ARX, LOW TO BRX
		CALL,J/SHIFT		;CALL SHIFTER TO GET BITS LOST
	SKP AR NE BR			;ANY BITS DIFFERENT FROM SIGN?
=0
ASHL3:	AR_ARX,ARX_BRX,			;RESTORE HI TO AR, LOW TO ARX
		GEN #+SC,#/-36.,SKP SCAD0,J/ASHL4
	SET AROV,J/ASHL3		;BITS SHIFTED OUT NE SIGN
=0
ASHL4:	AR_ARX,ARX_0S,			;HERE IF E .GT. 36
		SC_#+SC,#/-36.,J/ASHL2	;SHIFT 36 PLACES, TRY AGAIN
	MQ_SHIFT,AR_BRX,CLR ARX,	;HIGH OUTPUT TO MQ,
		SC_#+SC,#/-1,B DISP	;COMPENSATE FOR EXTRA SHIFT
=0
ASHL5:	AR_BR,BRX/ARX,ARX/MQ,		;SIGN TO AR, HIGH OUT TO ARX
		SC_#,#/35.,		;READY TO COMBINE THEM
		B DISP,J/ASHX		;STORE AS APPROPRIATE
	ARX_SHIFT,J/ASHL5		;LOW OUTPUT TO ARX

;HERE TO GET FINAL RESULTS.

=0
ASHX:	AR_SHIFT,I FETCH,J/STORAC	;HERE AFTER ASH
	AR_SHIFT,ARX_BRX,		;HERE AFTER ASHC
		SC_#,#/35.,J/ST2AC