Add README.md
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rkb / paroff / hpshft.ra
1 / -+-+-+-+-+ \ e H P S H F T . R A \ e -+-+-+-+-+
2 /
3 / F4 INTEGER FUNCTION SHIFT (CNT,VAR)
4 /
5 / PERFORMS A LOGICAL LEFT OR RIGHT SHIFT WITH THE SECOND PARAMETER VAR.
6 / THE INTEGER CNT WITH -37<CNT<37 SPECIFIES THE NUMBER AND DIRECTION OF
7 / THE SHIFTS TO PERFORM.
8 / IF CNT IS LESS THAN 0 THEN SHIFT PERFORMS A LEFT SHIFT, ELSE A RIGHT ONE
9 / THE PARAMETERS CNT AND VAR REMAIN UNCHANGED.
10 /
11 / HARDWARE: LAB8/E, KE8-E, HARD/SOFT FPP12
12 /
13 / VER 0.0 20-AUG-80 HA *
14 /
15
16 / SHIFT ROUTINE
17 / I=SHIFT (CNT,VAR)
18 / IF CNT > 0 THEN DO A LOGICAL RIGHT SHIFT ELSE
19 / LOGICAL LEFT SHIFT
20 / VAR IS THE VARIABLE TO BE SHIFTED
21 /
22 SECT #SHIFT
23 ENTRY SHIFT
24 BASE 0
25 TWO, 0
26 2
27 TMPX, ORG .+2
28 /
29 /
30 SHIFT, STARTD
31 FLDA 10*3 / GET RETURN ADR AND
32 FSTA GOBAK / STORE INTO GOBAK
33 FLDA 0
34 FADD TWO
35 FSTA TMPX
36 FSTA 3
37 FLDA% 3
38 FSTA 3
39 STARTF
40 FLDA% 3 / FIRST PARAM. --> FAC
41 SETX X0
42 ATX X1 / CONVERT INTO INTEGER AND STORE INTO CNT
43 STARTD
44 FLDA TMPX
45 FADD TWO
46 FSTA 3
47 FLDA% 3
48 FSTA 3
49 STARTF
50 FLDA% 3
51 FSTA VAR
52 TRAP4 SHIFT8 / KE8-E DOES THE WORK
53 FLDA VAR
54 GOBAK, JA .-.
55 /
56 /
57 SECT8 #SHIF8
58 X0, ORG .+2 / DEFINE THE X REG. BASE
59 X1= 1
60 CNT= X0+X1
61 REMAIN, ORG .+1 / NUMBER OF SHIFTS LESS THAN 12 (REMAINDER OF CNT/12 )
62 REP, ORG .+1 / NUMBER OF 12 BIT SHIFTS
63 VAR, ORG .+3
64 TMP1, ORG .+1
65 TMP2, ORG .+1
66 C1, 014 / 12
67 /
68 / KE8-E INSTRUCTIONS
69 SHL= 07413
70 CIA= 07041
71 SWAB= 07431
72 SWBA= 07447
73 DST= 07445
74 LSR= 07417
75 CAM= 07621
76 SWP= 07521
77 DVI= 07407
78 MQL= 07421
79 MQA= 07501
80 ACL= 07701
81 CDI= 06203
82 /
83 SHIFT8, .-.
84 SWAB / KE8-E --> MODE B, CLEAR AC!
85 TAD CNT
86 SMA CLA / IF CNT > 0 THEN GO TO RIGHTSHIFT ELSE
87 JMP RSHIFT
88 TAD CNT
89 CIA
90 DCA CNT / CONVERT TO POSITIVE NUMBER
91 JMS SHIFT0 / SET UP REPEAT COUNTERS
92 JMP LOOP1 / THERE ARE SOME 12 BIT SHIFTS TO DO
93 JMP LOOP2 / THERE ARE NO 12 BIT SHIFTS
94 LOOP1, TAD C1
95 DCA I1 / INSERT 12 BIT SHIFT INSTRUCTION
96 JMS SHIFT2
97 ISZ REP
98 JMP LOOP1
99 LOOP2, TAD REMAIN / SHIFT THE REMAINING BITS
100 SNA / IF THERE ARE NO SHIFT'S LEFT THEN WE GO HOME
101 JMP HOME
102 DCA I1
103 JMS SHIFT2
104 CDI
105 JMP% SHIFT8
106 /
107 /
108 RSHIFT, JMS SHIFT0 / SET UP REPEAT COUNTERS
109 JMP ROOP1
110 JMP ROOP2
111 ROOP1, TAD C1
112 DCA I3
113 JMS SHIFT4
114 ISZ REP
115 JMP ROOP1
116 ROOP2, TAD REMAIN
117 SNA / TEST IF THERE ARE REMAINING BITS TO SHIFT
118 JMP HOME
119 DCA I3
120 JMS SHIFT4
121 HOME,
122 CDI
123 JMP% SHIFT8 / HOME TO MAMA
124 /
125 /
126 SHIFT0, .-. / SET UP REPEAT COUNTERS
127 TAD CNT
128 SWBA / KE8E --> A, AC --> MQ
129 MQL
130 DVI
131 014
132 DCA REMAIN
133 ACL
134 DCA REP
135 SWAB / RESET KE8-E
136 TAD REP
137 SNA
138 ISZ SHIFT0 / SECOND POINT OF RETURN
139 CIA
140 DCA REP
141 JMP% SHIFT0
142 /
143 /
144 SHIFT1, .-. / LOGICAL LEFT SHIFT FOR I1 POSITIONS AC & MQ
145 MQL
146 SHL
147 I1, .-.
148 JMP% SHIFT1
149 /
150 /
151 SHIFT2, .-. / SHIFT VAR BY I1 POSITIONS TO THE LEFT
152 TAD VAR+2
153 JMS SHIFT1
154 DCA TMP1 / SAVE OVERFLOW
155 MQA
156 DCA VAR+2 / STORE THIRD WORD OF RESULT
157 /
158 TAD VAR+1
159 JMS SHIFT1
160 DCA TMP2 / SAVE OVERFLOW
161 TAD TMP1
162 MQA / INSERT OVERFLOW OF WORD # 3
163 DCA VAR+1 / STORE SECOND WORD OF RESULT
164 /
165 TAD VAR / SHIFT FIRST WORD
166 JMS SHIFT1
167 CLA
168 TAD TMP2
169 MQA
170 DCA VAR
171 JMP% SHIFT2
172 /
173 /
174 SHIFT3, .-. / LOGICAL SHIFT RIGHT BY I3 BITS
175 SWP / CLEAR MQ
176 CLA SWP
177 LSR
178 I3, .-.
179 JMP% SHIFT3
180 /
181 /
182 SHIFT4, .-. / LOGICAL SHIFT RIGHT VAR BY I3 BITS AC & MQ
183 CAM
184 TAD VAR
185 JMS SHIFT3
186 DCA VAR
187 ACL
188 DCA TMP1
189 /
190 TAD VAR+1
191 JMS SHIFT3
192 SWP
193 DCA TMP2
194 TAD TMP1
195 MQA
196 DCA VAR+1
197 /
198 TAD VAR+2
199 JMS SHIFT3
200 MQL
201 TAD TMP2
202 MQA
203 DCA VAR+2
204 JMP% SHIFT4
205 END
206 \1a