bee8efdc74db0af780e745282210902cc3e67e93
[pdp8.git] / sw / rescue / lab8e_goettingen / disk2_11 / rkb / paroff / pgtty.ra
1 / \ e PGTTY.RA\ e
2 /
3 /
4 / UNFORMATTED TTY INPUT & OUTPUT FOR FRTS
5 /
6 / SUBROUTINE PUTTY (BYTECNT,FRACTIONAL INTEGER VECTOR) FOR OUTPUT
7 / INT FUNC GETTY (BYTECNT,FRACTIONAL INTEGER VECTOR) FOR INPUT
8 /
9 / DESIGNED FOR USE WITH OS/8 F4 RUNNING UNDER FRTS VERSION V 5 A
10 /
11 / REQUIRED HARDWARE:
12 / PDP 8 WITH MQ REGISTER, HARD/SOFT FPP 12, 8K MEMORY AT LEAST
13 /
14 / RESTRICTIONS FOR USE:
15 / BYTECNT MAY BE ZERO BUT BYTECNT MUST BE LESS THAN 4096.
16 / A NEGATIVE BYTECNT CAUSES #ARGER ABORT.
17 / THE INPUT AND OUTPUT BYTES ARE FORTRAN 4 INTEGER NUMBERS AND TRANSLATED
18 / BY PGTTY INTO THE CORRECT CODE.
19 / ON INPUT CNTRL B OR CNTRL C CAUSE NORMAL FRTS ACTION (ABORT).
20 /
21 / IF THE ROUTINES ARE WAITING FOR I/O THEY ACTIVATE THE FRTS
22 / BACKGROUND JOB.
23 /
24 / ORIGINAL RELEASE VER 1.0 14-NOV-80 J.J. ANDRES UNIVERSITY OF GOETTINGEN
25 /
26 /
27 SECT #PGTTY
28 ENTRY PUTTY
29 EXTERN #ARGER
30 /
31 /
32 THREE, 0;3 / A CONSTANT 3
33 TWO, 0;2 / A LOT OF CONSTANTS!
34 CJAD, JA 0
35 WBW, TEXT 'WALKBK' / WALK BACK WORD
36 TOME, SETX XR
37 SETB BAS
38 BAS, ORG .+3 / RETURN ADR. FOR INTERNAL JSR
39 T0, ORG .+3 / POINTER TO PARAMETER LIST
40 T1, ORG .+3 / FIRST PARAMETER (WORD COUNT)
41 T2, ORG .+3 / ADR. OF THE SECOND PARAMETER (STRING)
42 ORG 10*3+BAS
43 FNOP
44 JA TOME
45 ORG .+1 / FORCE THREE WORD INSTRUCTION
46 RETURN, JA . / RETURN ADR.
47 /
48 /
49 WB0, TEXT 'PUTTY '
50 PUTTY,
51 FLDA# WB0
52 FSTA WBW
53 STARTD
54 BASE 0
55 FLDA 3*10 / SAVE RETURN ADR.
56 FSTA RETURN
57 FLDA 0 / SAVE ARGUMENT POINTER
58 SETX XR
59 SETB BAS
60 BASE BAS
61 FSTA T0
62 LDX 0,X0
63 LDX 1,X1 / LOAD THE ADDRESSES OF THE ARGUMENTS
64 FLDA% T0,X1
65 FSTA T1 / ADR. OF WORD COUNT --> T1
66 FLDA% T0,X1+
67 FSUB THREE
68 FSTA T2 / ADR. OF STRING --> T2
69 STARTF
70 FLDA% T1 / WORD COUNT --> FAC
71 FSTA T1 / WORD COUNT --> T1
72 FNEG / MAKE A COUNTER TO ZERO
73 ATX X6 / SET THE REPEAT COUNT REGISTER
74 LDX 0,X3 / SET UP THE POINTER TO T2
75 FNEG
76 JGT NXTPUT / IF NO WORDS TO TYPE THEN RETURN
77 JEQ RETURN / ELSE TYPE THE FIRST CHARACTER
78 TRAP4 #ARGER
79 /
80 /
81 NXTPUT,
82 FLDA% T2,X3+ / X6 IS THE REPEAT COUNTER
83 ATX X4 / X3 INDEX INTO STRING
84 ATX X0 / TO MAKE A PRETTY OUTPUT AT ^B ABORTS.
85 TRAP4 PUT8 / X4 CONTAINS THE CHARACTER TO TYPE
86 JXN NXTPUT,X6+ / TYPE THE NEXT CHARACTER
87 JA RETURN
88 /
89 /
90 ENTRY GETTY
91 WB1, TEXT 'GETTY '
92 GETTY,
93 FLDA# WB1
94 FSTA WBW
95 STARTD
96 BASE 0
97 FLDA 3*10
98 FSTA RETURN
99 FLDA 0
100 SETX XR
101 SETB BAS
102 BASE BAS
103 FSTA T0
104 LDX 0,X0
105 LDX 1,X1
106 FLDA% T0,X1
107 FSTA T1 / ADR OF BYTE COUNT --> T1
108 FLDA% T0,X1+
109 FSTA T2 / ADR. OF INPUT BUFFER --> T2
110 FADD TWO / MAKE A PDP POINTER: POINTING TO THE LAST WORD OF 36 BITS
111 FSUB CJAD / STRIP OF SOME BITS TO MASK OUT THE DATA FIELD
112 FSTA X2+XR / DF --> X2; ADR --> X3
113 XTA X2
114 LDX -3,X2 / SHIFT 3 BITS TO THE LEFT
115 ALN X2 / TO PREP THE DATA FIELD
116 ATX X2 / CORRECT DF --> X2
117 STARTF
118 FLDA% T1 / BYTE COUNT --> FAC
119 JEQ RETURN / NO INPUT DESIRED, RETURN
120 JGT LB0 /
121 TRAP4 #ARGER
122 LB0,
123 FSTA T1
124 FNEG / MAKE A COUNTER
125 ATX X6 / BYTE COUNTER --> X6
126 FLDA BIAS / CLEAR THE FIRST WORD OF THE BUFFER TO 27;0;0
127 FSTA% T2 / TO MAKE CONVERSION EASY
128 LDX 0,X5 / CLEAR THE INPUT BYTE COUNTER
129 TRAP4 GET8 / READ THE BYTES
130 XTA X5 / AND COMPUTE
131 FSTA T1 / THE NUMBER OF BYTES READ --> T1
132 FNEG / AND MAKE A COUNTER FOR THE CONVERSION
133 ATX X5
134 LDX 7777,X3 / SET THE INDEX INTO THE INPUT BUFFER
135 JXN NORM,X5 / IF THERE IS NO INPUT THEN RETURN
136 JA RETURN
137 NORM,
138 FLDA% T2,X3+ / GET THE CHARACTER
139 FNORM / CONVERT TO FRACTIONAL
140 FSTA% T2,X3 / AND STORE BACK INTO THE BUFFER
141 JXN NORM,X5+
142 FLDA T1 / RETURN THE INPUT BYTE COUNT
143 JA RETURN / WORK DONE
144 /
145 /
146 \f SECT8 #8PGTT
147 MQL= 7421 / MQ MICROINSTRUCTIONS REQUIRED
148 SWP= 7521
149 PTTY= 075 / FRTS PAGE 0 PTTY
150 XR, ORG .+7 / FPP --> PDP COMMUNICATION AREA
151 X0= 0
152 X1= X0+1 / INDEX TO ARGUMENT POINTER
153 X2= X1+1 / DATA FIELD OF INPUT STRING (GETTY)
154 X3= X2+1 / INDEX TO THE STRING
155 X4= X3+1 / CHARACTER TO TYPE OR READ FROM TTY
156 X5= X4+1 / GETTY INPUT BYTE COUNTER
157 X6= X5+1 / REPEAT COUNTER (PUTTY)
158 TEN, 010 / NICE CONSTANT ISN'T IT?
159 CRTN, -15 / NEGATIVE CR
160 CCDF, CDF 0 / INSERTED INTO GETDF
161 /
162 BIAS, 27;0;0 / TO NORMALIZE FIX NUMBER INTO FRACTIONAL
163 C120, 0120 / HERE WE CHANGE FIELD 0 PAGE 0 !
164 C177, 0177
165 C200, 0200
166 IF0P0, JMSZ% PTTY / CODE TRANSFERED INTO FIELD 0 PAGE 0 LOC 120
167 CIF 10
168 JMP% 120
169 TRANS, 07777 / TRANS MAY NOT BE LOCATED INTO AN AUTO INDEX LOCATION!
170 TEMP, ORG .+4 / HERE WE SAVE PAGE 0 ENTRIES
171 /
172 / PREPARE FIELD 0 PAGE 0 LOC 120 - 123
173 /
174 MAKZRO, ORG .+1
175 CLA
176 TAD C120
177 DCA TRANS
178 CDF 0
179 TAD% TRANS
180 DCA TEMP
181 ISZ TRANS
182 TAD% TRANS
183 DCA TEMP+1
184 TAD IF0P0
185 DCA% TRANS
186 ISZ TRANS
187 TAD% TRANS
188 DCA TEMP+2
189 TAD IF0P0+1
190 DCA% TRANS
191 ISZ TRANS
192 TAD% TRANS
193 DCA TEMP+3
194 TAD IF0P0+2
195 DCA% TRANS
196 CDF 10
197 JMP% MAKZRO
198 /
199 /
200 RESZRO, ORG .+1 / RESTORE PAGE ZERO
201 CLA
202 TAD C120
203 DCA TRANS
204 CDF 0
205 TAD TEMP
206 DCA% TRANS
207 ISZ TRANS
208 TAD TEMP+1
209 DCA% TRANS
210 ISZ TRANS
211 TAD TEMP+2
212 DCA% TRANS
213 ISZ TRANS
214 TAD TEMP+3
215 DCA% TRANS
216 CDF 10
217 JMP% RESZRO
218 /
219 /
220 SWIDF, ORG .+1 / SWITCHES TO DF OF INPUT STRING
221 GETDF, ORG .+1 / HERE WE INSERT THE CDF N
222 JMP% SWIDF
223 /
224 /
225 PUT8, ORG .+1 / TYPE CHARACTER FROM X4 ONTO THE TTY
226 JMS MAKZRO / PREPARE FIELD 0 PAGE 0 AND CLEAR AC
227 TAD XR+X4 / CHARACTER TO PRINT --> AC
228 AND C177 / TRUNCATE TO SEVEN BIT BYTE
229 TAD C200 / OR THE PARITY BIT TO INHIBIT ZERO AC CAUSING TTY INPUT
230 CDF CIF 00 / TRY IN GOD & CARTER
231 JMSZ 120 / FRTS PAGE ZERO
232 JMS RESZRO / RESTORE PAGE ZERO
233 CDF CIF / HOME TO TYPE THE NEXT CHARACTER
234 JMP% PUT8
235 /
236 /
237 GET8, ORG .+1
238 JMS MAKZRO / PREP PAGE ZERO AND CLEAR AC
239 TAD CCDF / SET UP DATA FIELD FOR INPUT STRING
240 TAD X2+XR
241 DCA GETDF
242 NXTONE,
243 CLA
244 CDF CIF 00
245 JMSZ 120 / TRY IN DEC & REAGAN
246 CDF CIF 10
247 ISZ X5+XR / INCREMENT INPUT BYTE COUNTER
248 NOP
249 AND C177 / STRIP OFF PARITY BIT
250 DCA X4+XR / SAVE CHARACTER INTO X4
251 TAD X4+XR
252 DCA X0+XR / SAVE CHARACTER INTO X0 FOR ^B ABORT
253 TAD X0+XR
254 JMS SWIDF / SET UP CORRECT DATA FIELD
255 DCA% X3+XR / AND STORE CHARACTER INTO OUTPUT
256 CDF 10 / HOME TO MY DATA FIELD
257 ISZ X6+XR / IF WE REACHED THE END OF THE BUFFER THEN
258 JMP .+2
259 JMP GETRTN / WE RETURN
260 /
261 / CLEAR THE NEXT FPP WORD TO 27;0;0 FOR NORMALIZATION. INCREMENT POINTER X3
262 /
263 CLA CLL CMA RTL / -3 --> AC
264 DCA TRANS / MAKE A COUNTER TO STEP 3 WORDS
265 TAD BIAS / INSERT 27 INTO THE EXPONENT AND CLEAR MANTISSA
266 GL0,
267 ISZ X3+XR / INCREMENT STRING POINTER
268 JMP DFOK / WE DID NOT PASS A FIELD
269 MQL / SAVE AC --> MQ
270 TAD GETDF / POINTER PASSED A FIELD, SO GET NEW CDF
271 TAD TEN / ADD NEXT DATA FIELD
272 DCA GETDF
273 SWP / RESTORE AC
274 DFOK,
275 JMS SWIDF / SET UP CORRECT DATA FIELD
276 DCA% X3+XR / CLEAR THE NEXT 36 BIT FPP WORD
277 CDF 10
278 ISZ TRANS
279 JMP GL0
280 /
281 TAD X4+XR / CHARACTER --> AC AND TEST FOR A CR
282 TAD CRTN / SUBTRACT CR
283 SZA / IF INPUT WAS A CR THEN WE GO TO GETRTN
284 JMP NXTONE / ELSE READ THE NEXT BYTE
285 GETRTN,
286 JMS RESZRO / RESTORE PAGE ZERO
287 CDF CIF
288 JMP% GET8 / HOME TO TCS
289 /
290 END
291 \1a