mirror of
https://github.com/PDP-10/its.git
synced 2026-01-17 08:43:21 +00:00
209 lines
5.2 KiB
Groff
Executable File
209 lines
5.2 KiB
Groff
Executable File
.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
|
||
.IFNOT/CIRC
|
||
I, J/UUO
|
||
.IF/CIRC
|
||
I, J/CIRC
|
||
.ENDIF/CIRC
|
||
.UCODE
|
||
|
||
;ENTER WITH 0,E IN AR
|
||
; NOTE THAT VALUES OF SC GREATER THAN 36
|
||
; CAUSE THE SHIFTER TO SELECT ARX.
|
||
|
||
=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
|
||
=1****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
|
||
=*1***0
|
||
JFFO2: SKP AR0,AR_2(AR+1), ;LOOP TO FIND A 1
|
||
ARX_ARX+1,J/JFFO2 ;COUNTING AS WE GO
|
||
.IFNOT/JPC
|
||
AR_ARX-1,FETCH,J/STRAC1
|
||
.IF/JPC
|
||
AR_ARX-1,FETCH,SKP USER
|
||
=0 AC1_AR,AR_PC,SC_#,#/32.,J/JPCEX
|
||
AC1_AR,AR_PC,SC_#,#/32.,J/JPCUSR
|
||
.ENDIF/JPC
|
||
|
||
=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"
|
||
|
||
=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
|
||
=1****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
|
||
|
||
|
||
.IFNOT/CIRC
|
||
1004: ;NEXT TO UUO
|
||
.IF/CIRC
|
||
=00**00
|
||
.ENDIF/CIRC
|
||
LSHC: ARX_AC1,MQ_0.M,J/LSHC1
|
||
.IF/CIRC
|
||
=01
|
||
CIRC: MQ_AR,AR_AC1,FE_#,SC_#,#/35.,CLR ARX,CALL,J/WDREV
|
||
=11 SC_EA,AR_AC0,SKP AR18,J/CIRC3
|
||
.ENDIF/CIRC
|
||
=
|
||
LSHC1: AR_AC0,SC_EA,FE_#,#/36.,SKP AR18
|
||
=*1***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 "CIRC INSTRUCTION"
|
||
|
||
.IF/CIRC
|
||
=1****0
|
||
CIRC3: MQ_SHIFT,ARX_AR (AD),AR_ARX (ADX),J/CIRC4
|
||
ARX_AR (AD),AR_ARX (ADX),SC_#+SC,#/36.,SKP SCAD0,J/CIRC3
|
||
|
||
CIRC4: AR_MQ,ARX_SHIFT,SC_#+SC,#/-36.,SKP SCAD0
|
||
=1***00
|
||
MQ_SHIFT,ARX_AR (AD),AR_ARX (ADX),J/CIRC4
|
||
AC0_AR,AR_ARX,FE_#,SC_#,#/35.,ARX_0S,CALL,J/WDREV
|
||
=11 AR_ARX,CLR SC,I FETCH,J/STD1
|
||
|
||
|
||
;SUBROUTINE TO REVERSE A WORD IN AR, RETURNING IT IN ARX.
|
||
;ON ENTRY, ARX MUST BE CLEAR, AND SC AND FE MUST BOTH CONTAIN 35.
|
||
;ON EXIT, MQ IS COPIED INTO AR.
|
||
|
||
.IFNOT/CIRC.BIG.OPT
|
||
=*1***0
|
||
WDREV: BRX/ARX,SH DISP,J/WDREV1
|
||
AR_MQ,RETURN2
|
||
=1*0111
|
||
WDREV1: FE_FE-1,SC/SCAD,SKP SCAD0,ARX_BRX*2,J/WDREV
|
||
FE_FE-1,SC/SCAD,SKP SCAD0,ARX_BRX*2+1,J/WDREV
|
||
.IF/CIRC.BIG.OPT
|
||
=1****0
|
||
WDREV: SH DISP,BR/AR,AR_ARX (ADX),SC_#,#/32.,J/WDREV1
|
||
AR_MQ,RETURN2
|
||
|
||
=1*0000
|
||
WDREV1: AR_BR,ARX_SHIFT,FE_FE-#,#/4,SC/SCAD,SKP SCAD0,J/WDREV
|
||
AR_SHIFT,SC_#,#/10,J/WDREV2
|
||
AR_SHIFT,SC_#,#/4,J/WDREV2
|
||
AR_SHIFT,SC_#,#/14,J/WDREV2
|
||
AR_SHIFT,SC_#,#/2,J/WDREV2
|
||
AR_SHIFT,SC_#,#/12,J/WDREV2
|
||
AR_SHIFT,SC_#,#/6,J/WDREV2
|
||
AR_SHIFT,SC_#,#/16,J/WDREV2
|
||
AR_SHIFT,SC_#,#/1,J/WDREV2
|
||
AR_SHIFT,SC_#,#/11,J/WDREV2
|
||
AR_SHIFT,SC_#,#/5,J/WDREV2
|
||
AR_SHIFT,SC_#,#/15,J/WDREV2
|
||
AR_SHIFT,SC_#,#/3,J/WDREV2
|
||
AR_SHIFT,SC_#,#/13,J/WDREV2
|
||
AR_SHIFT,SC_#,#/7,J/WDREV2
|
||
AR_SHIFT,SC_#,#/17,J/WDREV2
|
||
|
||
WDREV2: AR0-5_AR0-5 OR SC
|
||
AR_BR,ARX_AR,FE_FE-#,#/4,SC/SCAD,SKP SCAD0,J/WDREV
|
||
.ENDIF/CIRC.BIG.OPT
|
||
.ENDIF/CIRC
|
||
.TOC "ARITHMETIC SHIFTS -- ASH, ASHC"
|
||
|
||
;COMMON CODE FOR ARITHMETIC SHIFTS
|
||
|
||
=*1***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
|
||
=1****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
|
||
|
||
=*1***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 SIG ;ANY SIGNIFICANT BITS?
|
||
=1****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
|
||
=*1***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
|
||
=1****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.
|
||
|
||
=*1***0
|
||
ASHX: AR_SHIFT,I FETCH,J/STORAC ;HERE AFTER ASH
|
||
AR_SHIFT,ARX_BRX, ;HERE AFTER ASHC
|
||
SC_#,#/35.,J/ST2AC
|
||
|