Consolidate license copies
[its.git] / system / ts3tty.400
1 ;-*-MIDAS-*-
2 ;;; Copyright (c) 1999 Massachusetts Institute of Technology
3 ;;;
4 ;;; This program is free software; you can redistribute it and/or
5 ;;; modify it under the terms of the GNU General Public License as
6 ;;; published by the Free Software Foundation; either version 3 of the
7 ;;; License, or (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ;;; General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program; if not, write to the Free Software
16 ;;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18
19 TTYVRS==.IFNM2
20
21 OVHMTR TTY      ;MISC TTY CODE
22
23 SUBTTL SPY DEVICE
24
25 ;FIRST FILE NAME MUST BE TTY NUMBER (NOT CHARACTERS)
26
27 SPYO:   JUMPN D,OPNL12          ;ONLY UNIT ASCII INPUT ALLOWED
28         JUMPL A,OPNL11
29         CAIL A,NCT
30          JRST OPNL11
31         MOVE E,TIIP(A)
32         MOVEM E,IOCHST-IOCHNM(R)
33         MOVEI C,ISPY
34         HRL C,A
35         MOVEM C,(R)
36         JRST POPJ1
37
38 ;A HAS LH OF IOCHNM =TTY #
39
40 SPYI:   MOVE T,IOCHST-IOCHNM(R) ;POINTER TO INPUT BUFFER
41         HRRZ B,TIBEP(A)
42         CAIL B,(T)
43          CAILE B,TIBL(T)
44           JRST SPYIL
45 SPYILL: CAMN T,TIIP(A)
46          PUSHJ P,UFLS
47         CAMN T,TIBEP(A)
48          SUBI T,TIBL
49         HRRM T,IOCHST-IOCHNM(R)
50         ILDB W,IOCHST-IOCHNM(R)
51         POPJ P,
52
53 SPYIL:  MOVE T,TIIP(A)
54         MOVEM T,IOCHST-IOCHNM(R)
55         JRST SPYILL
56
57 ;.CALL RFNAME on a SPY channel.  A contains LH(IOCHNM) = TTY #
58 SPYRCH: MOVEI B,(A)             ;FN1 is TTY #
59         POPJ P,                 ;easy!
60 \f
61 SUBTTL STY DEVICE
62
63 ;STY OPEN
64
65 ;MODE BITS (LH)
66 ;3.1=0 => INPUT   =1 => OUTPUT  (FROM PROGRAM POINT OF VIEW)
67 ;3.2=0 => UNIT    =1 => BLOCK
68 ;INPUT
69 ;3.3=0 => FULL DUPLEX   =1 => HALF DUPLEX
70 ;3.4=1 => DON'T HANG ON INPUT IOTS, INPUT -1 INSTEAD (IGNORED ON OUTPUT OPEN)
71 ;3.5=1 => WANT TO GET %TDORS ON OUTPUT RESET.
72         ;BIT 3.5 NOTICED ON OUTPUT, TOO, BUT THAT'S NO FEATURE?
73
74 STTYO:  HRRZ I,USTYN(U)
75         JUMPN I,STTYO3  ;JUMP IF STY ALREADY OPEN
76         PUSHJ P,SWTL    ;LOCK STY OPEN SWITCH
77             STYOSW
78         MOVE I,[-NSTTYS,,NFSTTY]
79         MOVSI TT,%SSUSE
80 STTYO1: TDNE TT,STYSTS-NFSTTY(I)        ;SKIP ON FREE SLOT
81 STTYO5:  AOBJN I,STTYO1
82         JUMPGE I,OPNL6          ;NO SLOTS.  GIVE DEVICE FULL
83         SKIPGE TTYSTA(I)        ;SKIP IF CONSOLE FREE MSG NOT TYPED.
84          SKIPE TTNTO(I)         ;SKIP IF NOT OPEN.
85           JRST STTYO5
86         MOVEI I,(I)             ;We want to compare left half
87         CAMLE I,STYMAX          ;If we're limiting STY's, is this over our
88          JRST OPNL6             ;  limit?  If so, give DEVICE FULL
89         HRRM I,USTYN(U)         ;STORE TTY NUMBER OF STY
90 STTYO4: ANDI I,-1
91         SETZM STYNTO-NFSTTY(I)
92         SETZM STYMSK-NFSTTY(I)
93         MOVSI TT,%SSUSE
94         MOVEM TT,STYSTS-NFSTTY(I)       ;SET IN USE BIT
95         MOVSI TT,(<.BM ($TTISP)>+<.BM ($TTOSP)>)
96         ANDCAM TT,TTYTYP(I)     ;RESET SPEEDS TO ZERO
97         PUSH P,C
98         PUSHJ P,NCNSSP  ;MAKE THE TTY A PRINTING TTY.
99         PUSHJ P,TTYIN1  ;INIT THE TTYOPT AND TTYCOM USER OPTION BITS.
100         PUSHJ P,STYIR1  ;FLUSH TTY'S OUTPUT BUFFER.
101         PUSHJ P,STYOR1  ;AND ITS INPUT BUFFER.
102         PUSHJ P,LSWPOP  ;UNLOCK STY OPEN SWITCH
103         POP P,C
104         HRRM U,STYSTS-NFSTTY(I)
105         MOVE T,UTMPTR(U)        ;Check out this tree
106         CAIE T,SYSRCE-1         ;Is this a top-level non-console tree,
107          CAIN T,SYSRCE          ;or a system demon?
108           JRST STTYO3           ;  Yes, don't print on console.
109                                 ;  since TELSER, etc., logs in
110         MOVEI T,(I)             ;Get TTY number
111         HRLI T,[ASCIZ / STYOPN /]
112         PUSHJ P,SGWAIT          ;Ask SYSJOB to print the info
113         MOVE T,JNAME(U)         ;Add the JNAME to the info
114         MOVEM T,SLGIV+2         ;to be printed
115
116 STTYO3: JUMPL D,[MOVSI TT,%SSOHG        ;JUMP IF OPENING FOR OUTPUT
117                  JRST STTYO2]
118         LDB TT,[240100,,C]
119         DPB TT,[400100,,STYSTS-NFSTTY(I)] .SEE %SSHDX
120         DPB TT,[$TOHDX,,TTYOPT(I)]
121         MOVSI TT,%SSHNG
122 STTYO2: TLNE C,10
123          IORM TT,STYSTS-NFSTTY(I)
124         MOVSI TT,%SSORS
125         TLNE C,20
126          IORM TT,STYSTS-NFSTTY(I)
127         MOVE J,R
128         SUBI J,IOCHNM(U)        ;CHANNEL BEING OPENED FOR INPUT ON
129         MOVE J,CHNBIT(J)
130         SKIPL D ;SKIP IF OUTPUT
131          IORM J,STYMSK-NFSTTY(I)
132         SKIPGE D        ;SKIP IF INPUT
133          IORM J,STYOMS-NFSTTY(I)
134         AOS STYNTO-NFSTTY(I)
135         HRLZ A,I        ;LH OF IOCHNM GETS STY NUMBER
136         MOVSS C
137         JSP Q,OPSLC3
138             STYDUI,,STYDUO
139             STYDBI,,STYDBO
140
141
142 ;ENTRY FOR OPEN OF PSEUDO-TTY AS SNM OR STN
143 STTYOA: JUMPL I,OPNL1
144         CAIL I,NSTTYS
145          JRST OPNL1
146         ADDI I,NFSTTY
147         PUSHJ P,SWTL
148             STYOSW
149         MOVE TT,STYSTS-NFSTTY(I)        ;SKIP IF IN USE
150         TLNN TT,%SSUSE
151          JRST STTYO4    ;OK TO OPEN IF FREE
152         CAIE U,(TT)
153          JRST OPNL10    ;DIFFERENT USER HAS IT OPEN
154         PUSHJ P,LSWPOP
155         JRST STTYO3
156 \f
157         JRST STTS               ;STY INPUT SIOT ROUTINE.
158 ;PSEUDO-TTY INPUT ROUTINE.  RETURNS CHAR WITHOUT PARITY BIT
159 STTYI:  MOVE I,A
160 STTYIA: SKIPGE TTYOAC(I)        ;SKIP IF ANY CHARS AVAIL (MAYBE)
161          JRST STTYI1
162 STTYI4: PUSH P,C
163         PUSH P,E
164         CONO PI,TTYOFF
165         PUSHJ P,TYPSC
166         POP P,E
167         POP P,C
168         MOVE U,USER
169         MOVE W,STYICH
170         SKIPGE DBBBP
171          JRST STTYI2    ;REALLY NO CHARS AVAIL
172         CONO PI,TTYON
173         MOVSI R,%SSONT  ;FOR TTYO INT TO STYI
174         JRST STTYIC     ;INT CLEAR
175
176 STTYI2: CONO PI,TTYON
177 STTYI1: SKIPGE STYSTS-NFSTTY(I)
178          JRST STTYI3    ;DON'T HANG
179         SKIPGE TTYOAC(I)
180          PUSHJ P,UFLS
181         JRST STTYIA
182
183 STTYI3: MOVNI W,1
184         TLO E,100000    .SEE INBTCH ;UNHANG BLOCK MD IOT IMMEDIATELY.
185         JRST POPJ1      ;UNHANG SIOT IMMEDIATELY.
186
187 ;STY INPUT SIOT; GOES 1 WORD AT A TIME, WHATEVER THE USER'S BYTE SIZE.
188 STTS:   XCTR XRW,[SKIPG E,(C)]
189          JRST POPJ1     ;RETURN AT ONCE IF NO CHARS WANTED BY USER.
190         PUSH P,B        ;SAVE ADDRS OF USER'S B.P. AND COUNT.
191         PUSH P,C
192 STTSA:  SKIPGE TTYOAC(I)
193          JRST STTS4     ;NO INPUT AVAILABLE.
194 STTS2:  UMOVE B,@-1(P)
195 STTS1:  XCTR XRW,[MOVES D,(B)]
196 ;IT IS ASSUMED THAT E HAS THE # OF CHARS THE USER WANTS.
197         CONO PI,TTYOFF
198         MOVEM D,STYICH  ;STORE THE WORD THE USER'S B.P. POINTS AT.
199         LDB C,[360600,,B]
200         LDB D,[300600,,B]
201         IDIV C,D        ;HOW MANY MORE CHARS GO IN THIS WORD?
202         JUMPE C,STTS7
203         PUSH P,B        ;SAVE STARTING B.P. AND # CHARS FITTING IN WORD.
204         HRRI B,STYICH   ;SET UP TO STORE CHARS AT APPRO. PLACE IN STYICH.
205         MOVEM B,DBBBP
206         CAML C,E
207          MOVE C,E       ;GET MIN OF # CAHRS FITTING IN WORD AND # CHARS USER WANTS.
208         MOVEM C,DBBCC   ;THAT'S HOW MANY CHARS WE CAN ACCEPT THIS TIME.
209         MOVEM C,DBBCC1
210         PUSHJ P,TYP     ;FILL UP STYICH WITH CHARS, VIA DBBBP.
211         POP P,B         ;NOTE E HAS -<# CHARS GOBBLED>
212         MOVE D,STYICH   ;GET USER'S WORD, WITH CHARS STUCK IN IT.
213         UMOVEM D,(B)    ;STORE IT WHERE IT CAME FROM.
214         XCTR XRW,[ADDB E,@(P)]  ;UPDATE COUNT BY -<# CHARS OBTAINED>.
215         HLL B,DBBBP     ;UPDATE B.P. TO THE L.H. CORRESP. TO CHARS STORED IN STYICH.
216         UMOVEM B,@-1(P)
217         SKIPE DBBCC     ;DID WE GET AS MANY CHARS AS WE WANTED?
218          JRST STTS3     ;NO, SO EITHER RETURN OR HANG UP.
219         CONO PI,TTYON
220         JUMPG E,STTS7   ;USER WANTS MORE CHARS => TRANSFER ANOTHER WORD.
221 STTS5:  MOVE U,USER
222         MOVSI R,%SSONT
223         SUB P,[2,,2]
224         AOS (P)
225         JRST STTYIC
226
227 ;COME HERE DURING STY INPUT SIOT IF USER WANTS CHARS BUT THERE ARE NONE.
228 STTS3:  CONO PI,TTYON
229 STTS4:  SKIPGE STYSTS-NFSTTY(I)
230          JRST STTS5     ;DON'T HANG MODE.
231         SKIPGE TTYOAC(I)
232          PUSHJ P,UFLS
233         JRST STTSA
234
235 STTS7:  AOS B
236 STTS6:  TLZ B,770000
237         TLO B,440000
238         JRST STTS1
239 \f
240 ;PSEUDO-TTY OUTPUT
241 STTYW:  MOVE I,A
242         SKIPGE C
243          SKIPA A,(C)
244           UMOVE A,(C)
245 BSTTYW: MOVSI T,%SSOHG  ;BIT ON SAYS DONT HANG
246         TDNE T,STYSTS-NFSTTY(I)
247          JRST BSTTYX    ;J TO NOT HANG. CHARS MAY BE LOST
248         MOVEI T,TIBS
249         CAMG T,TICC(I)
250          PUSHJ P,UFLS   ;HANG UNTIL ROOM IN INPUT BUFFER
251 BSTTYX: CONO PI,TTYOFF
252         PUSH P,I
253         PUSHJ P,NTYI5
254         POP P,I
255         MOVE U,USER
256         MOVSI R,%SSINT
257 STTYIC: ANDCAM R,STYSTS-NFSTTY(I)       ;CALLED BY STTYI ABOVE ALSO
258         HRRZ R,UUAC(U)
259         MOVE R,CHNBIT(R)
260         ANDCAM R,IFPIR(U)       ;FLUSH ANY OUTPUT INTERRUPT
261         CONO PI,TTYON
262         POPJ P,
263
264 STTBI:  JSP E,INBTCH
265         JRST STTYI
266
267 STTBO:  JSP E,NBTOCH
268         CAIN A,EOFCH
269          POPJ P,
270         HLRZ I,(R)
271         PUSH P,R
272         PUSH P,D
273         PUSH P,TT
274         PUSH P,E
275         PUSH P,C
276         PUSHJ P,BSTTYW
277         POP P,C
278         POP P,E
279         POP P,TT
280         POP P,D
281         POP P,R
282         POPJ P,
283 \f
284 ;STY OUTPUT CLOSE.
285 STYOCL: SUBI R,IOCHNM(U)
286         MOVE B,CHNBIT(R)
287         ANDCAM B,STYOMS-NFSTTY(A)
288         JRST STYCL
289
290 ;STY INPUT CLOSE
291 STYICL: SUBI R,IOCHNM(U)
292         MOVE B,CHNBIT(R)
293         ANDCAM B,STYMSK-NFSTTY(A)
294 STYCL:  SOSE STYNTO-NFSTTY(A)
295          POPJ P,
296 STYCL1: PUSHJ P,TTYLFC  ;LEAVE COM. MODE, PUT TTY # IN I.
297 IFN NETP,[
298         PUSHJ P,NSTYN0  ;DISCONNECT ANY NET SOCKETS FROM THE STY
299          JFCL
300 ]
301         CONO PI,TTYON#200_<-APRCHN> ;LEAVE CLOCK OFF.
302         SKIPGE C,TTYSTS(I)
303          JRST STYOC8    ;TTY NOT IN USE.
304         TLNN C,%TSCNS
305          JRST STYOC9    ;OPEN AS DEVICE, NOT AS CONSOLE.
306         PUSH P,U
307 STYOC3: HRRZ U,C
308         SKIPL C,SUPPRO(U)
309          JRST STYOC3    ;NOT TOP LEVEL
310         MOVE C,USER
311 STYC4A: HRRZ TT,C
312         SKIPL C,SUPPRO(TT)
313          JRST STYC4A
314         AOS STYNTO-NFSTTY(I)    ;IN CASE WE PCLSR, PREVENT JRST 4,.
315         PUSH P,I
316         CAME U,USER     ;DON'T GET INTO LOOP AT ALOGO1
317          PUSHJ P,ALOGOUT        ;TELL SYS JOB TO FLUSH THE TREE UNDER THE STY.
318         POP P,I
319         POP P,U
320         SOS STYNTO-NFSTTY(I)
321 STYOC5: PUSHJ P,STYIR1  ;FLUSH TTY OUTPUT BUFFER.
322 STYOC9: SETZM STYSTS-NFSTTY(I)
323         CAIN I,@USTYN(U)        ;IF HE'S CLOSING HIS STY:, SAY HE HAS NONE.
324          HLLZS USTYN(U)
325         JRST CLKONJ
326
327 STYOC8: SKIPGE TTYSTA(I) ;IN TRANSIENT STATE BETWEEN USAGE AND NOT?
328          JRST STYOC5    ;NO, REALLY FREE, SIMPLE.
329         CONO PI,CLKON
330         AOS STYNTO-NFSTTY(I)
331         MOVE T,I
332         PUSHJ P,STYOCF
333         PUSHJ P,UFLS
334         MOVE A,I
335         JRST STYCL
336
337 STYOCF: SKIPGE TTYSTS(T)        ;IF NOW IN USE
338          SKIPGE TTYSTA(T)       ;OR COMPLETELY FREE,
339           AOS (P)               ;THEN NO LONGER IN TRANSIENT STATE.
340         POPJ P,
341
342 ;STY OUTPUT .CALL FINISH
343 STYFIN: SKIPE TICC(A)           ;WAIT UNTIL CORRESPONDING INPUT BUFFER IS EMPTY
344          PUSHJ P,UFLS
345         JRST POPJ1
346
347 ;STY OUTPUT .CALL WHYINT
348 STOWHY: MOVEI A,%WYSTO          ;NULL ROUTINE FOR NOW
349         JRST POPJ1
350
351 ;STY INPUT .CALL WHYINT
352 STIWHY: MOVEI A,%WYSTI          ;NULL ROUTINE FOR NOW
353         JRST POPJ1
354 \f
355 ;STY INPUT RESET. DOES TTY OUTPUT RESET, WITH THE TTY'S OWNER STOPPED.
356 STYIRS: HLRZ I,(R)
357 STYIR1: CONO PI,TTYOFF
358         SKIPGE B,TTYSTS(I)
359          JRST STYIR2    ;TTY IS FREE => NO PROBLEM.
360         HRRZ A,B
361         PUSHJ P,RPCLSR  ;ELSE MUST MAKE SURE ITS OWNER ISN'T TYPING OUT.
362         CONO PI,TTYOFF
363         XOR B,TTYSTS(I) ;WE MIGHT HAVE BEEN DELAYED - HAS TTY MOVED AROUND?
364         TRNN B,-1
365          JRST STYIR4    ;NO; THE GUY WAS STOPPED WHILE STILL ITS OWNER.
366         PUSHJ P,UPCLSR  ;YES; UNSTOP GUY WE STOPPED,
367         JRST STYIR1     ;THEN GO STOP THE NEW OWNER.
368
369 STYIR4: PUSH P,A        ;SAVE JOB STOPPED
370         PUSHJ P,STYIR2  ;ACTUALLY DO THE RESET OF TTY OUTPUT
371         POP P,A
372         JRST UPCLSR     ;THEN UNSTOP THE TTY'S OWNER
373
374 STYIR2: SETOM TTYOAC(I) ;WE WILL NO LONGER BE LOOKING FOR TTY'S OUTPUT.
375         JRST TYORS1     ;DO THE TTY OUTPUT RESET AND TURN ON PI CHANNELS.
376
377 ;STY OUTPUT RESET.
378 STYORS: HLRZ I,(R)
379 STYOR1: CONO PI,TTYOFF
380         PUSHJ P,TYIRS1  ;TURNS INTO TTY INPUT RESET.
381         JRST TTYONJ
382
383 ;STY OUTPUT STATUS - BIT 2.1 => BUFFER FULL, 2.2 => EMPTY.
384 STASTO: ANDI A,77
385         SKIPN B,TICC(A)
386          IORI D,1_<9+1> ;BUFFER EMPTY.
387         CAIL B,TIBS-10.
388          IORI D,1_9     ;ALMOST FULL.
389         POPJ P,
390
391 ;STY INPUT STATUS - THE SAME 2 BITS.
392 STASTI: ANDI A,77
393         SKIPG B,TORM(A)
394          IORI D,1_9     ;FULL.
395         CAIN B,TOBS
396          IORI D,1_<9+1> ;EMPTY.
397         POPJ P,
398 \f
399 ;"STYGET" SYSTEM CALL. 1 ARG, A TTY SPECIFYER.
400 ;1ST VALUE IS STYSTS WORD (RH IS JOB NUMBER OF OWNER OF STY). 0 FOR FREE STY.
401 ;       %SSHNG AND %SSOHG BITS MAY BE INTERESTING.
402 ;2ND VALUE IS JOB THAT OWNS CORRESP. TTY (OR -1 IF TTY FREE).
403 ;3RD VALUE IS -1 IF TTY NOT CONSOLE; ELSE JOB NUMBER OF TOP OF TREE IN RH
404 ;                               AND BIT 4.8 SET IFF IT IS LOGGING OUT.
405 ;                               AND BIT 4.7 SET IF IT IS LOGGED IN.
406 ;4TH VALUE BITS ARE:
407 ;       1 IF TTY OWNER IS IN TYO WAIT
408 ;       SIGN IF HE'S IN TYI WAIT.
409 ;5TH VALUE BITS ARE:
410 ;       4.9 => TTY INPUT AVAILABLE
411 ;       4.8 => TTY OUTPUT BUFFER HAS ROOM
412 ;6TH VALUE IS TTYSTA WORD
413
414 NSTYGT: JSP J,ATTYCI    ;DECODE A TTY-SPECIFYER IN A.
415         CONO PI,CLKOFF
416         SETZ A,
417         MOVE TT,TTYTYP(I)
418         TRNN TT,%TYSTY  ;IF SPEC'D TTY ISN'T ASSOCIATED WITH A STY, IT HAS NO STYSTS WORD.
419          JRST NSTYG3
420         HRRZ A,STYSTS-NFSTTY(I)
421         IDIVI A,LUBLK           ;NUMBER OF JOB USING THE STY.
422         HLL A,STYSTS-NFSTTY(I)  ;AND SOME RANDOM BITS.
423 NSTYG3: SETOB B,C       ;B GETS # OF JOB THAT HAS TTY, OR -1.
424                         ;C GETS (IF TTY IS CONSOLE, JOB # OF TOP OF TRREE, ELSE -1).
425         SETZB D,E               ;D, E SHOULD GET 0 IF NO JOB HAS TTY.
426         HRRE B,TTYSTS(I)
427         JUMPL B,NSTYG1  ;JUMP IF CONSOLE NOT IN USE.
428         IDIVI B,LUBLK   ;ELSE GET JOB NUMBER OF JOB USING IT.
429         MOVE D,TTYSTS(I)
430         TLNN D,%TSCNS   ;TTY NOT CONSOLE => DON'T REPLACE THE -1 IN C WITH ANYTHING.
431          JRST NSTYG2
432         HRRZ C,TTYSTS(I)
433         SKIPL D,SUPPRO(C)       ;ELSE TRACE SUPPRO'S TO TOP OF TREE.
434          JRST [ HRRZ C,D
435                 JRST .-1]
436         MOVE TT,APRC(C)
437         HLRE W,UNAME(C)
438         IDIVI C,LUBLK   ;GET JOB # OF TOP OF TREE.
439         TLNE TT,BULGOS
440          TLO C,200000
441         AOSE W
442          TLO C,100000
443 NSTYG2: SETZ D,
444         MOVE TT,TTYSTS(I)
445         HRRZ TT,FLSINS(TT) ;WHAT VARIABLE IS FLSINS OF JOB OWNING TTY WAITING ON?
446         CAIE TT,TICC(I) ;RETURN IN D SETZ IFF JOB IS IN TYI WAIT,
447          CAIN TT,TACC(I)
448           MOVSI D,(SETZ)
449         CAIN TT,TORM(I)
450          MOVEI D,1      ;OR 1 IF JOB IS IN TYO WAIT; ELSE 0.
451 NSTYG1: SKIPE TICC(I)
452          TLO E,400000
453         MOVE TT,TORM(I)
454         CAIL TT,TYOWNC
455          TLO E,200000
456         MOVE TT,TTYSTA(I)
457         CONO PI,CLKON
458         JRST POPJ1
459
460 ;.CALL STLGET - GET INFO FROM SERVER TELNET
461
462 ; Arg 1:  a TTY
463 ; Val 1:  XJNAME of server telnet
464 ; Val 2:  TRMNAM of server telnet (has sixbit name of host)
465 ; Val 3:  SNAME of server telnet
466 ; Val 4:  STY control bits,,STY owner idx
467
468 NSTLGT: JSP J,ATTYCI
469         SETZB A,B
470         SETZB C,D
471         MOVE TT,TTYTYP(I)
472         TRNN TT,%TYSTY
473          JRST OPNL34
474         SKIPN T,STYSTS-NFSTTY(I)        ;Get STY status bits,,STY user.
475          JRST POPJ1
476         MOVE A,XJNAME(T)
477         MOVE B,TRMNAM(T)
478         MOVE C,USYSNM(T)        
479         HRRZ D,T
480         IDIVI D,LUBLK           ;Make it into user index.
481         HLL D,T                 ;Stuff STY status bits in LH.
482         JRST POPJ1
483
484 \f
485 SUBTTL .ATTY, .DTTY - PASS CONTROL OF TTY
486
487 NATTY:  MOVE J,A                ;.CALL ATTY
488         JSP T,NCRUI2            ;DECODE JOBSPEC BUT DON'T SET DIELOK
489          JFCL
490 IFN PDP6P,[
491         CAIN J,-1
492          JRST OPNL34            ;SORRY, I/O BUS MPXR IS NOT THAT HAIRY
493 ]
494         HRRZ B,SUPPRO(J)
495         CAME B,U
496          JRST OPNL31            ;NOT DIRECT INFERIOR (CAN'T MODIFY JOB)
497         MOVE A,J
498         JRST NATTY1
499
500 ;       .ATTY USR,              OPER 11
501
502 AATTY:  HLRZ A,(R)      ;A HAS INFERIOR'S USER INDEX
503         HRRZ B,(R)
504         SKIPL CLSTB(B) .SEE %CLSU ;SKIP IF USER OPEN ON CHANNEL
505          JRST OPNL34
506 NATTY1: MOVE TT,APRC(A)
507         TLNE TT,BULGOS  ;REFUSE TO GIVE TTY TO A DYING JOB.
508          JRST OPNL42    ;JOB GOING AWAY
509         CONO PI,CLKOFF
510         MOVE I,TTYTBL(U)
511         JUMPL I,AATT1   ;DOESNT HAVE TTY NOW
512         HLLZS TTYTBL(U)
513         HRLI A,%TBNOT
514         IORM A,TTYTBL(U)        ;NO LONGER HAS TTY.  STORE USER INDEX GIVEN TO
515         PUSHJ P,AATT6   ;A _ IDX OF USER TO RECEIVE TTY,
516                         ;ALSO CHANGE ALL TTYTBL VARS THAT NEED IT.
517         EXCH A,U
518         PUSHJ P,AGBLT6  ;TAKE TTY FROM USER IN A (ME),
519                         ;GIVE TO USER IN U (HIM)
520                         ;CHANGES TTY VARS AND TTSTSV VARS.
521                         ;ALSO SETS CHANNELS-OPEN MASKS.
522                         ;TURNS ON ALL PI CHNLS.
523         EXCH A,U
524         JRST POPJ1
525
526 AATT1:  TLZN I,%TBDTY   ;SAY OUR INFERIOR HAD IT WHEN TAKEN
527          JRST OPNL10    ;DEVICE NOT AVAILABLE, ALREADY GAVE TTY AWAY
528         HRRI I,(A)
529         MOVEM I,TTYTBL(U)
530         PUSHJ P,AATT6   ;SET UP HIS VARS
531         JRST CLKOJ1
532
533 ;CHANGE TTYTBL VARS OF ALL JOBS DOWN TO THE ONE GETTING THE TTY.
534 ;RETURN IN A, T, TT THE TTYSTS, TTYST1, TTYST2 SETTINGS FOR THAT JOB.
535 ;IF THAT JOB NEVER HAD THE TTY, INIT HIS TTSTSV VARS.
536 ;I HAS TTY #, U HAS RUNNING JOB.
537 AATT6:  MOVE E,TTYTBL(A)
538         MOVSI T,%TSATY  ;TELL THIS GUY TTY WAS TAKEN FROM HIM & RETURNED.
539         IORM T,TTSTSV+2(A)
540         TLNE E,%TBDTY   ;SKIP IF NOT TAKEN FROM ME
541          JRST AATT3     ;GUY IT WAS TAKEN FROM (I.E. HE HADN'T GIVEN IT TO SOMEONE ELSE)
542         HRRZ A,TTYTBL(A)
543         JRST AATT6
544
545 AATT3:  HRRZS I         ;TTY NUMBER
546         HLL A,TTSTSV+2(A)
547         TLZ A,%TSFRE+%TSLCZ     ;CLEAR TTY NOT OPEN AND ^Z BITS
548         MOVEM A,TTSTSV+2(A)     ;UPDATE SAVED TTY STATUS
549         POPJ P,
550
551 ;SET UP TYIMSK AND TYOMSK. ARGS: TTY # IN I,
552 ;D -> 1ST IOCHNM WORD OF USER TO SET UP FOR.
553 ;MAKE LAST CHAR IN INPUT BFR AN ACTIVATION CHAR. TURN ON TTYCHN.
554 AATT8:  SETZM TYOMSK(I)
555         SETZM TYIMSK(I)
556         CONO PI,TTYOFF
557         HRLI D,A        ;INDIRECTION POINTER TO INFERIOR'S IO CHANNELS
558         MOVSI A,-20     ;AOBJN POINTER
559 AATT9:  MOVE B,@D       ;GET IOCHNM IN B
560         JUMPGE B,AATT10 ;IF CHANNEL HAS CONSOLE BIT SET,
561         ANDI B,-1
562         MOVE C,CHNBIT(A)        ;GET THE BIT WE MIGHT WANT TO SET.
563         CAIE B,TYODN
564         CAIN B,TYOBN    ;IF TTY OUTPUT CHNL,
565          IORM C,TYOMSK(I)       ;SET BIT IN OUTPUT MASK.
566         CAIE B,TYIDN
567         CAIN B,TYIBN    ;IF INPUT, SET IN INPUT MASK.
568          IORM C,TYIMSK(I)
569 AATT10: AOBJN A,AATT9   ;TRY NEXT CHANNEL OR CONTINUE IF DONE
570         JRST ATTYS1     ;ALL CHRS SO FAR ARE ACTIVATION CHRS
571 \f
572 ADTTY:                  ;DON'T CLOBBER R (SEE AUCL2)
573 SDTTY:  CONO PI,CLKOFF
574         MOVE A,TTYTBL(U)
575         JUMPGE A,CLKOJ1 ;I ALREADY HAVE IT
576         TLNE A,%TBDTY
577         JRST CLKOJ1     ;I ALREADY DID A .DTTY AND SO DID MY SUPERIOR
578
579 ;LOOK FOR SUBJOB THAT HAS TTY, OR DOESN'T WANT TO GIVE TTY
580 ;AWAY IF IT GETS THE TTY.
581 AGBLT3: MOVE I,TTYTBL(A)
582         TLNE I,%TBDTY   ;REACHED A JOB THAT DIDN'T GIVE TTY AWAY
583          JRST AGBLT1    ;THIS IMPLIES OUR SUPERIOR TOOK TTY AWAY.
584         JUMPL I,AGBLT2  ;IF THIS GUY GAVE IT AWAY THEN TRY THE ONE HE GAVE IT TO
585         HRRZS A         ;A HAS IDX OF TTY OWNER; TAKE TTY FROM HIM.
586         PUSHJ P,RPCLSR  ;TURNS CLOCK ON!
587         CONO PI,CLKOFF
588         SKIPGE TTYTBL(A)        ;DID TTY MOVE WHILE CLOCK WAS ON?
589          JRST [PUSHJ P,UPCLSR   ;IF SO, START OVER
590                 JRST SDTTY]
591         HLLZ D,TTYTBL(A)
592         TLZ D,%TBCLR            ;DON'T ALTER USER-SETTABLE BITS, BUT
593         TLO D,%TBNOT+%TBDTY     ;TELL HIM HE HASN'T GOT TTY.
594         MOVEM D,TTYTBL(A)
595         AOS (P)         ;THE .DTTY SHOULD SKIP.
596         PUSH P,[UPCLSR] ;AFTER RESTARTING THE SUBJOB.
597 AGBLT6: ANDI I,-1       ;LH(TTYTBL) MAY BE NONZERO EVEN IF JOB HAS TTY!
598         MOVSI D,%TCLED
599         TDNE D,TTYCOM(I)        ;IF OLD JOB WAS WANTING LOCAL EDITING,
600          PUSHJ P,AGBLT5         ;TELL TERMINAL TO STOP IMMEDIATELY.
601         ANDCAM D,TTYCOM(I)      ;ASSUME NEW JOB DOES NOT WANT LOCAL EDITING
602                                 ;AND SHOULD NOT SEE RESYNCHS (TOP-S).
603         MOVEI D,TTSTSV-1(A)     ;SAVE CURRENT TTY STATUS IN
604         PUSH D,TTYST1(I)        ;USER VARS OF USER GIVING AWAY THE TTY.
605         PUSH D,TTYST2(I)
606         PUSH D,TTYSTS(I)
607         MOVE TT,I
608         IMULI TT,TPLEN*2
609         MOVE D,TPVB+TPLEN(TT)
610         SUB D,TCMXV(I)
611         MOVNS D
612         DPB D,[$TBECL,,TTYTBL(A)]
613 IFN N11TYS,[
614         EXCH U,A        ;GET USER GIVING AWAY TTY IN U
615         MOVE D,TVVBN(U) ;SAVE THIS
616         PUSHJ P,TVBNCL  ;CLEAR OUT CURRENT GUY (MAYBE CLEARING RUN GLITCH ON SCREEN)
617         MOVEM D,TVVBN(A);PASS THE BALL TO HIM
618         EXCH U,A
619 ]
620 ;ENTRY FROM "ATTACH". GIVE TTY TO JOB W/ IDX IN U, WITHOUT
621 ;"TAKING" IT FROM ANY JOB. USED WHEN TTY HAD BEEN FREE; JOB, DISOWNED.
622 AGBLT4: HRROI D,TTSTSV+2(U)
623         POP D,TTYSTS(I) ;RESTORE THE TTY STATUS OF JOB GIVING TTY TO.
624         POP D,TTYST2(I)
625         POP D,TTYST1(I)
626         HRRM I,TTYTBL(U)        ;INDICATE THAT IT HAS THE TTY
627         LDB H,[$TBECL,,TTYTBL(U)]
628         HRLOI D,#%TBCLR
629         ANDM D,TTYTBL(U)
630         PUSHJ P,ASCML1  ;SET # COMMAND LINES FROM H
631         MOVSI D,%PJATY
632         AND D,MSKST(U)
633         IORM D,PIRQC(U)
634         MOVEI D,IOCHNM(U)
635         PUSH P,A        ;GENERATE CHNLS-OPEN MASKS, CREATE AN
636         PUSHJ P,AATT8   ;ACTIVATION CHAR IF NEC, TURN ON PI.
637         JRST POPAJ
638
639 AGBLT2: HRRZ A,TTYTBL(A)
640         JRST AGBLT3
641
642 AGBLT1: MOVSI A,%TBDTY  ;TTY WAS TAKEN AWAY FROM US,
643         IORM A,TTYTBL(U)        ;WHEN GIVEN BACK WILL STOP WITH THIS JOB.
644         JRST CLKOJ1
645
646 ;TELL TERMINAL TO STOP DOING LOCAL EDITING IMMEDIATELY.
647 AGBLT5: MOVE H,TTYOPT(I)
648         TRNE H,%TP11T
649          POPJ P,        ;DON'T EVEN TRY ON A TV -- TORM DOESN'T MEAN ANYTHING.
650         SKIPG TORM(I)   ;WAIT FOR ROOM IN OUTPUT BUFFER.
651          PUSHJ P,UFLS
652         PUSH P,A
653         MOVE Q,TOIP(I)
654         MOVEI A,%TDNLE
655         PUSHJ P,TYOOU1  ;PUT CMD IN OUTPUT BFR,
656         MOVEM Q,TOIP(I)
657         AOSN TTYOAC(I)
658          XCT TTYST(I)   ;AND TELL INT. LVL. ABOUT IT.
659         JRST POPAJ
660 \f
661 SUBTTL CNSSET, TTYSET, ETC.  .CALLS FOR TTYS
662
663 ;DECODING TTY SPECIFIERS.  CALL WITH JSP,J.  MAY RETURN TO (J),
664 ;OR POPJ AND REPORT AN ERROR.
665
666 ;DECODE A TTY SPECIFIER, BUT DON'T CHECK FOR PERMISSION TO
667 ;USE THE TTY.  ALWAYS RETURN IMMEDIATELY WITH LEGAL TTY SPECIFIER.
668 ATTYCI: MOVEI Q,CPOPJ
669         JRST ATTYC8
670
671 ;DECODE A TTY SPECIFIER.
672 ;IF W IS GREATER THAN ONE, DO NOT ALLOW RANDOM TTY NUMBERS.
673 ;ALWAYS WAIT FOR PERMISSION TO OUTPUT.
674 ;IF THE SPECIFIED TTY IS OUR CONSOLE AND OUTPUT IS BEING IGNORED,
675 ;CLOBBER W TO ONE, SO THAT ITS PARAMETERS WILL NOT BE CHANGED (FOR SCPOS).
676 ATTYCW: JSP Q,[ CAIGE W,2
677                  JRST ATTYC8
678                 JRST ATTYC7 ]
679         PUSHJ P,TTYWO2
680          MOVEI W,1
681         POPJ P,
682
683 ;DECODE A TTY SPEC.
684 ;IF THERE ARE TWO OR MORE ARGS, AND IT IS OUR CONSOLE,
685 ;WAIT UNTIL WE OWN IT, OR MAYBE INTERRUPT.
686 ATTYC:  CAIGE W,2
687          JRST ATTYCI
688 ;DECODE A TTY SPEC.
689 ;IF IT IS OUR CONSOLE, WAIT TILL WE OWN IT, OR MAYBE INTERRUPT.
690 ATTYC2: MOVEI Q,TTYWC2
691         JRST ATTYC7
692
693 ;DECODE A TTY SPEC.
694 ;IF IT IS OUR CONSOLE, WAIT TILL WE CAN DO INPUT,
695 ;OR INTERRUPT IF DOING INPUT WOULD.
696 ATTYCR: MOVEI Q,TTYWI2
697         JRST ATTYC7
698
699 ;DECODE A TTY SPEC.  SKIP IF IT REFERS TO OUR CONSOLE.
700 ;DO NOT ALLOW RANDOM TTY NUMBERS.
701 ATTYCM: MOVEI Q,[AOJA J,CPOPJ]
702         JRST ATTYC7
703
704 ;DECODE A TTY SPEC.  SKIP IF IT REFERS TO OUR CONSOLE.
705 ATTYC9: MOVEI Q,[AOJA J,CPOPJ]
706 ;DECODE CHNL # (IF < 400000) OR TTY # (OTHERWISE) IN A.  -1 MEANS TREE'S CONSOLE.
707 ;IF CHNL # BAD, POPJ WITH OPNL. IF NOT STY OR TTY, POPJ WITH OPNL.
708 ;IF OUR CONSOLE, CALL THE ROUTINE Q POINTS TO.
709 ;THEN RETURN WITH TTY # IN I.
710 ATTYC8: TDZE A,[-400000]        ;IS IT A TTY NUMBER?
711          JRST ATTYC3    ;YES, DECODE THAT.
712 ;DECODE CHNL #, TTY # NOT ALLOWED.
713 ATTYC7: HRRE T,A
714         AOJE T,ATTYC6
715         HRLI J,ATTYC5   ;RETURN THERE IF NORMAL, OPEN CHANNEL
716         MOVEI T,AIOCAL  ;USE JOB DEVICE CHECKER
717         JRST CHNDCD     ;DECODE CHANNEL AND HANDLE JOB DEVICE SPECIALLY.
718
719 ;CHNDCD RETURNS HERE WITH IOCHNM WORD CONTENTS IN H.
720 ATTYC5: HRRZ T,H
721         LDB I,[$TIIDX,,H] ;FOR EITHER TTY CHNL OR STY CHNL, GET TTY #.
722         CAIN I,%TINON   ;TREE HAS NO TTY => RETURN "DEVICE NOT AVAILABLE".
723          JRST OPNL10
724         CAIG T,4        ;TTY CHNL => GOOD.
725          JUMPG T,ATTYC4
726         CAIL T,STYDUI
727         CAILE T,STYDBO
728          JRST OPNL34    ;NOT STY => BAD.
729         JRST (J)        ;STY => GOOD.
730
731 ATTYC4: LDB T,[.BP <%TICNS,,>,H]        ;GET DEVICE/CONSOLE BIT
732         JUMPE T,ATTYC1                  ;JUMP IF IT'S A DEVICE.
733         PUSHJ P,(Q)     ;AWAIT TTY OR INTERRUPT
734         LDB I,[$TIIDX,,(R)]
735         SKIPGE T,TTYTBL(U)
736          JRST (J)       ;USER DOESN'T HAVE THE TTY (\e\e^P), ERROR CHECKS DON'T APPLY
737         CAIE I,(T)
738          BUG            ;USER HAS TWO DIFFERENT CONSOLE TTYS
739 ATTYC1: HRRZ T,TTYSTS(I)        ;USER INDEX THAT HAS THIS TTY
740         CAME T,U
741          BUG            ;USER HAS TTY BUT TTY DOESN'T HAVE THAT USER
742         JRST (J)
743
744 ATTYC3: MOVEI I,(A)
745         CAIGE I,NCT     ;IS THE ARG THE # OF A REAL TTY?
746          JRST (J)       ;YES, OK.
747         CAIE I,377777   ;SKIP IF ARG WAS -1
748          JRST OPNL1     ;"NO SUCH DEVICE" ERROR.
749 ATTYC6: PUSHJ P,(Q)     ;"MY OWN CONSOLE" SPECIFIED; WAIT OR INTERRUPT.
750         HRRZ I,TTYTBL(U);NOW GET TTY NUMBER
751         CAIN I,%TINON   ;TREE HAS NO TTY => RETURN "DEVICE NOT AVAILABLE".
752          JRST OPNL10
753         JRST ATTYC1
754 \f
755 ;TTYSET SYSTEM CALL
756 ;SETS TTYST1, TTYST2, TTYSTS, WHEN THE USER HAS THE TTY
757 ;HANGS UNTIL HE GETS IT
758 ATTYST: JSP J,ATTYCM    ;GET TTY NUMBER IN I; SKIP IF IT'S OUR CONSOLE.
759          JRST ATTYS6
760         SKIPGE TTYTBL(U)
761          JRST ATTYS5    ;JUMP IF OUR CONSOLE AND WE DON'T OWN IT.
762 ATTYS6: CONO PI,TTYOFF
763         MOVEM B,TTYST1(I)
764         MOVEM C,TTYST2(I)
765         CAIGE W,4
766          JRST ATTYS0    ;NO 4TH ARG => DON'T SET TTYSTS.
767         TLNE D,%TSINT   ;SETTING "INT ON NEXT CHAR REGARDLESS"?
768          PUSHJ P,ATTYS3 ;MAYBE THE "NEXT CHAR" HAS ALREADY BEEN READ.
769         HRLOI B,%TSFRE+%TSCNS+%TSLCZ+%TSHDX     ;DON'T CHANGE THESE.
770         TLZ D,%TSFRE+%TSCNS+%TSLCZ+%TSHDX
771         ANDCMI D,-1
772         ANDM B,TTYSTS(I)
773         IORM D,TTYSTS(I)
774 ATTYS0: AOS (P) ;MAKE ALL CHRS IN BUFFER ACTIVATION CHARS
775 ATTYS1: SKIPG TICC(I)
776          JRST TTYONJ
777         LDB E,TIIP(I)   ;MAKE LAST CHAR AN ACTIVATION CHAR
778         TRON E,%TXACT
779          AOS TACC(I)    ;IF IT WASN'T ONE, IS ONE MORE ACT CHAR NOW
780         DPB E,TIIP(I)
781         JRST TTYONJ
782
783 ATTYS3: SKIPE B,TINTP(I)
784 ATTYS4:  CAMN B,TIIP(I) ;ANY MORE CHARS TO CHECK?
785           POPJ P,
786         CAMN B,TIBEP(I)
787          SUBI B,TIBL
788         ILDB E,B        ;YES, CHECK THE NEXT ONE.
789         TRNE E,%TXIGN   ;IF IT ISN'T REALLY THERE, IT SHOULDN'T
790          JRST ATTYS4    ;INTERRUPT.
791         TLZ D,%TSINT    ;ELSE THIS CHAR IS THE "NEXT CHAR" THAT
792         TROE E,%TXINT   ;SHOULD INTERRUPT REGARDLESS.
793          POPJ P,
794         AOS TINTC(I)    ;SO MAKE IT AN INT. CHAR IF IT ISN'T.
795         DPB E,B
796         MOVE B,TYIMSK(I)
797         AND B,MSKST2(U)
798         MOVN C,B
799         AND B,C
800         IORM B,IFPIR(U)
801         MOVEI A,%PITYI
802         TDNE A,MSKST(U)
803          IORM A,PIRQC(U)
804         POPJ P,
805
806 ;TTYSET WHEN WE DON'T OWN OUR CONSOLE.
807 ATTYS5: MOVEM B,TTSTSV(U)
808         MOVEM C,TTSTSV+1(U)
809         CAIGE W,4
810          JRST POPJ1
811         HRLOI B,%TSFRE+%TSCNS+%TSLCZ+%TSHDX     ;DON'T CHANGE THESE.
812         TLZ D,%TSFRE+%TSCNS+%TSLCZ+%TSHDX       ;CHANGE ONLY CERTAIN LH BITS.
813         ANDCMI D,-1
814         ANDM B,TTSTSV+2(U)
815         IORM D,TTSTSV+2(U)
816         JRST POPJ1
817
818 ;TTYGET SYSTEM CALL
819 ;GETS TTYST1, TTYST2 AND TTYSTS WHEN THE USER HAS THE TTY
820 ;HANGS UNTIL HE GETS IT, IF IT'S HIS CONSOLE.
821 ;ALSO RETURNS HIS TTYTYP, TCTYP.
822 ;THE RH OF TTYSTS AS RETURNED IS PRE-DIVIDED BY LUBLK
823 ATTYGT: JSP J,ATTYC9    ;GET TTY NUMBER NOW IN I; SKIP IF IT'S OUR CONSOLE.
824          CAIA
825           SKIPL TTYTBL(U)
826            JRST ATTYG1
827 ;OUR CONSOLE AND WE DON'T CURRENTLY OWN IT.
828         MOVE A,TTSTSV(U)
829         MOVE B,TTSTSV+1(U)
830         MOVE C,TTSTSV+2(U)
831         JRST ATTYG2
832
833 ;EITHER NOT OUR CONSOLE OR WE OWN IT.
834 ATTYG1: MOVE A,TTYST1(I)
835         MOVE B,TTYST2(I)
836         HLLZ C,TTYSTS(I)
837 ATTYG2: HRRZ D,TTYSTS(I) ;GET IDX OF TTY'S OWNER
838         CAIE D,-1       ;(BUT MAY BE NO OWNER IF WE SPECIFIED RANDOM TTY)
839          IDIVI D,LUBLK  ;RETURN IN EASY-TO-DIGEST FORM.
840         HRR C,D
841         MOVE D,TTYOPT(I)
842         TLNE D,%TOHDX   ;THE %TSHDX BIT REFLECTS THE %TOHDX BIT.
843          TLO C,%TSHDX
844         MOVE D,TTYTYP(I)
845         MOVE E,TCTYP(I)
846         JRST POPJ1
847 \f
848 ;SCML SYSTEM CALL. 1ST ARG TTY OR STY CHNL,
849 ;2ND ARG IS DESIRED # COMMAND LINES(FOR ECHOING AT BOTTOM OF SCREEN)
850 ;2ND ARG 0 => NO ECHO REGION.
851 ASCML:  JSP J,ATTYCM
852          JRST ASCML3
853         SKIPL TTYTBL(U)
854          JRST ASCML3
855         DPB B,[$TBECL,,TTYTBL(U)]       ;IT'S OUR CONSOLE AND WE DON'T OWN IT.
856         JRST POPJ1
857
858 ASCML3: PUSH P,[TTYOJ1]
859         CONO PI,TTYOFF
860         MOVEI H,(B)
861 ;I HAS TTY #, H HAS # CMD LINES, TTY CHANNEL OFF (TURNED BACK ON).
862 ASCML1: MOVE TT,TCMXV(I)
863         CAMN TT,[MOVE]
864          JRST [ MOVE H,TT       ;PRINTING TERMINALS (INFINITE SCREEN) ARE A SPECIAL CASE
865                 JRST ASCML2 ]
866         CAML H,TT
867          SOS H,TT
868         SUB H,TCMXV(I)
869         MOVMS H         ;VPOS OF START OF ECHO AREA.
870         CAIL H,117.
871          MOVEI H,117.   ;IF TCMXV GARBAGE, AVOID GETTING GARBAGE INTO TPVP
872 ASCML2: MOVE TT,I
873         IMULI TT,TPLEN*2
874         ADDI TT,TPLEN
875         CAMN TT,TTYLPP(I) ;MAKE SURE TTY ISN'T ASSOCIATED WITH PC OF PPR
876          PUSHJ P,TYOMVC ;WHILE THE LATTER'S SIZE IS CHANGING.
877         SUBI TT,TPLEN
878         MOVEM H,TPVB+TPLEN(TT)
879         MOVEM H,TPVP+TPLEN(TT)
880         HRLM H,TPSP+TPLEN(TT)
881         JRST NCNSSG
882 \f
883 ;RCPOS SYSTEM CALL. (READ CURSOR POSITION)
884 ;1 ARG - TTY OR STY CHNL.
885 ;1ST VALUE <ECHO VERT POS>,,<ECHO HORIZ POS>
886 ;2ND VALUE <MAIN PRGM VERT POS>,,<MAIN PRGM HORIZ POS>
887 ;1ST VALUE IRRELEVANT IF NO ECHO LINES.
888 ARCPOS: JSP J,ATTYCW
889         HRRZ B,H
890         CAILE B,4
891          JRST NRCPO1
892         SKIPL TTOALC(I)
893          PUSHJ P,UFLS
894 NRCPO1: MOVE TT,I
895         IMULI TT,TPLEN*2
896         HRRZ B,TPVP+TPLEN(TT)
897         SUB B,TPVB+TPLEN(TT)
898         HRLZS B
899         HRR B,TPHP+TPLEN(TT)
900         HRLZ A,TPVP(TT)
901         HRR A,TPHP(TT)
902         JRST POPJ1
903
904 ;SCPOS SYSTEM CALL GETS OR SETS THE SYSTEM'S IDEA OF WHERE THE TTY'S
905 ;CURSOR IS REALLY LOCATED (AT THE M.P. SIDE OF THE OUTPUT BUFFER).
906 ;TO BE USED AFTER OUTPUTTING IN SUPERIMAGE MODE, TO TELL THE SYSTEM
907 ;WHAT THE CHARS ALREADY OUTPUT WILL DO TO THE TTY. MAY ALSO BE USED
908 ;BY A STY PROGRAM LOOKING AT A SOFTWARE TTY, TO TELL THE SYSTEM HOW
909 ;IT HAS INTERPRETED THE CURSOR-MOVING DISPLAY CODES, PROVIDED THE
910 ;OUTPUT BUFFER IS EMPTY (AS IT WILL BE AFTER AN OUTPUT RESET).
911 ;FOR THAT APPLICATION, A WAY TO SET TTOALC IS PROVIDED.
912 ;3 VALUES - VPOS, HPOS AND TTOALC.
913 ;1 ARG (TTY SPEC) => JUST READ THEM.
914 ;2 MORE ARGS => THEY ARE NEW VPOS AND HPOS.
915 ;A FOURTH ARG WILL SET TTOALC.
916 NSCPOS: JSP J,ATTYCW
917         HRRZ T,H
918         CAILE T,4       ;IF WE'RE HACKING A TTY CHANNEL
919          JRST NSCPO4
920         SKIPL TTOALC(I) ;THEN MAYBE THE TTY WANTS TO HACK IT FIRST.
921          PUSHJ P,UFLS
922 NSCPO4: SOJE W,NSCPO2
923         JUMPL B,OPNL33
924         JUMPL C,OPNL33
925         CAIG B,118.     ;DON'T ALLOW GARBAGE TO GET INTO TPVP
926          CAIGE W,2
927           JRST OPNL33   ;NOT 3 ARGS??
928         CAMGE B,TCMXV(I)
929          ;CAML C,TCMXH(I) 
930          CAIL C,400     ;PREVIOUS LINE MESSES UP ON !-CONTINUED LINES
931           JRST OPNL33
932 NSCPO2: MOVSI TT,%TCLED ;CONTROL BIT SET => SET %TCLED, ALLOWING THIS JOB TO
933         SKIPE CTLBTS(U) ;READ TOP-E AND TOP-S CHARS.  NORMALLY, ITS DISCARDS THEM.
934          IORM TT,TTYCOM(I)
935         CONO PI,TTYOFF
936         SKIPL TT,TTYLPP(I)
937          JRST NSCPO1    ;WHERE POS LIVES DEPENDS ON WHETHER TTY IS ASSOCIATED.
938         HRRZ T,C
939         HRL T,B         ;FOR DISSOCIATED TTYS, TTYLPS HAS POS, MUST BE SET.
940         CAIE W,
941          MOVEM T,TTYLPS(I)
942         SETCA TT,       ;MAKE SURE TT HAS THE PC PPR #, UNCOMPLEMENTED.
943 NSCPO1: MOVE A,TPVP(TT) ;FOR ASSOCIATED TTY, POS LIVES IN TPVP AND TPHP OF PC PPR.
944         CAIE W,
945          MOVEM B,TPVP(TT)
946         MOVE B,TPHP(TT)
947         CAIE W,
948          MOVEM C,TPHP(TT)
949 NSCPO3: MOVE C,TTOALC(I) ;NOW GET OLD TTOALC, AND SET IT IF THERE WERE 4 ARGS.
950         CAIGE W,3
951          JRST TTYOJ1
952         MOVEM D,TTOALC(I)
953         CONO PI,TTYON
954         AOSN TTYOAC(I)  ;MAY BE RESTARTING FROM ZERO ALLOCATION
955          XCT TTYST(I)
956         JRST POPJ1
957 \f
958 ;CNSGET OR RSSIZE SYSTEM CALL. 1 ARG - TTY OR STY CHNL.
959 ;RETURNS THE SAME VARS THAT CNSSET SETS, IN THE SAME ORDER.
960 NCNSGET:        ;RETURN PERMANENT AND SEMIPERMANENT TTY INFO.
961 ARSSIZ: JSP J,ATTYCI
962         MOVE TT,TTYTYP(I)
963         MOVE E,TTYOPT(I)
964         MOVE D,TTYCOM(I)
965         MOVE C,TCTYP(I)
966         MOVE B,TCMXH(I) ;NOTE TCMXH IS LINEL INCLUDING THE CONTIN. COLUMN,
967         MOVE A,TCMXV(I)
968         MOVE I,TTYSMT(I)
969         SOJA B,POPJ1
970
971 ;CNSSET SYSTEM CALL.
972 ;1ST ARG TTY OR STY CHNL. NEXT ARGS SET
973 ;VERT SIZE, HORIZ SIZE, TCTYP, TTYCOM, TTYOPT VARS RESPECTIVELY.
974 ;TCTYP CAN'T BE SET TO A NONSENSE VALUE, SOME TTYCOM BITS CAN'T BE SET.
975 ;IF 2ND, 3RD OR 4TH ARG IS NEGATIVE, ITS VALUE ISNT CHANGED
976 NCNSSET:
977         JSP J,ATTYC
978         MOVE H,TT
979 ;.CALL TTYVAR ENTERS HERE WITH B/TCMXV, C/TCMXH-1, D/TCTYP, E/TTYCOM, H/TTYOPT
980 ;AND I/TTY#, W/6
981 NCNSS0: SKIPL D         ;MAKE SURE D HAS NEW VALUE OF TCTYP,
982          CAIG W,3       ;WHETHER WE'RE CHANGING IT NOW OR NOT.
983           MOVE D,TCTYP(I)
984         CAIL D,%TNMAX   ;DON'T LET TCTYP BE SET TO ILLEGAL VALUE.
985          JRST OPNL33
986         CONO PI,TTYOFF
987         MOVE T,TTYTYP(I) ;DON'T LET %TPORS BE SET FOR PDP11 TV.
988         TRNE T,%TY11T
989          TRZA H,%TPORS+7*%TPPCR+%TPCBS
990         TRZA H,%TP11T   ;%TP11T MUST REFLECT %TY11T.
991          IORI H,%TP11T
992         TRNE T,%TY11T
993          JRST [ MOVEI B,37.     ;DON'T ALLOW A TV TO BE CALLED ANYTHING BUT.
994                 MOVEI C,95.
995                 MOVEI D,%TNTV
996                 JRST NCNSS3]
997         CAIN D,%TNTV    ;NOT A PDP11 LINE => DON'T LET IT BE TREATED AS ONE.
998          MOVEI D,%TNDP
999 NCNSS3: CAIGE W,6
1000          MOVE H,TTYOPT(I)
1001         SKIPE D
1002          TLZ H,%TORAW   ;"RAW" MODE EXISTS ONLY ON PRINTING TTYS.
1003         SKIPGE TYMDTB(D)
1004          TLZ H,%TOMVU+%TOERS ;DON'T CLAIM TO DO SOMETHING WE DON'T KNOW HOW TO DO
1005         MOVEI T,1
1006         TLNN H,%TOMVU
1007          MOVEM T,TTYROL(I)      ;ON PRINTING TTYS TTYROL MUST BE 1
1008         TRNN H,%TPCBS   ;IF ^\ ISN'T TO BE HANDLED SPECIALLY, MAKE SURE ALL OF
1009          SETOM TTOALC(I) ;THE FEATURES IT PROVIDES ARE IN THEIR NORMAL STATES.
1010         MOVEI TT,TYBN
1011         TRNN H,%TPCBS+%TPTEL
1012          MOVEM TT,TYBPC(I)
1013         MOVE TT,I
1014         IMULI TT,TPLEN*2        ;TT HAS IDX OF MAIN PC PPR OF TTY.
1015         XORI W,-1       ;EACH OF THE INSNS AFTER THE JRST SETS ONE PARAMETER.
1016         CAIL W,#6       ;>6 ARGS SAME AS 6 ARGS.
1017          JRST NCNSS1+2(W) ;ELSE DON'T SET VARS WE DIDN'T GET ARGS FOR.
1018         MOVEM H,TTYOPT(I)
1019         PUSHJ P,NCNSSC          ;SET TTYCOM
1020         MOVEM D,TCTYP(I)        ;SET TCTYP.
1021         PUSHJ P,[CAIL C,3               ;DON'T ALLOW SCREEN WIDTH LESS THAN 3.
1022                   CAIL C,377777         ;DON'T ALLOW AN HPOS THAT WON'T FIT IN HALFWORD.
1023                    POPJ P,              ;SPEC NO GOOD, IGNORE
1024                  JRST NCNSSH ]          ;SET TCMXH.
1025         PUSHJ P,[CAMN B,[200000,,]      ;200000,, IS SPECIAL (PRINTING TTY).
1026                   JRST NCNSSV
1027                  CAIL B,3               ;DON'T ALLOW SCREEN HEIGHT LESS THAN 3.
1028                   CAIL B,120.           ;VPOS MUST FIT IN ASCII CHARACTER, USUALLY.
1029                    POPJ P,              ;NO GOOD, IGNORE
1030                  JRST NCNSSV ]          ;SET TCMXV
1031 NCNSS1: PUSHJ P,NCNSSG  ;COMPUTE TTYEPP FROM NEW SETTINGS OF TTY VARS.
1032         JRST TTYOJ1
1033 \f
1034 ;SET TTY WIDTH (NOT INCLUDING THE SPACE FOR THE "!") TO ARG IN C.
1035 ;TTY # IN I, MAIN PC PPR IDX IN TT.
1036 NCNSSH: ADDI C,1
1037         MOVEM C,TCMXH(I)
1038         CAMG C,TTYIHP(I) ;DON'T ALLOW TTYIHP TO HAVE ILLEGAL VALUE.
1039          SETZM TTYIHP(I)
1040 .SEE TPHE       ;       MOVEM C,TPHE(TT)
1041 .SEE TPHE       ;       MOVEM C,TPHE+TPLEN(TT)
1042         CAMG C,TPHP(TT)
1043          MOVEM C,TPHP(TT)
1044         CAMG C,TPHP+TPLEN(TT)
1045          MOVEM C,TPHP+TPLEN(TT)
1046         POPJ P,
1047
1048 ;SET TTY SCREEN HEIGHT FROM VALUE IN B.
1049 NCNSSV: MOVEM B,TCMXV(I)
1050         CAMG B,TTYIVP(I) ;DON'T ALLOW TTYIVP TO GET ILLEGAL VALUE.
1051          SETZM TTYIVP(I)
1052 .SEE TPVE       ;       MOVEM B,TPVE(TT)
1053 .SEE TPVE       ;       MOVEM B,TPVE+TPLEN(TT)
1054         HRLM B,TPSP+TPLEN(TT)   ;CLOBBER THE 2ND PC PPR TO NULL STATE.
1055         MOVEM B,TPVP+TPLEN(TT)
1056         MOVEM B,TPVB+TPLEN(TT)
1057         CAMG B,TPVP(TT)
1058          SETZM TPVP(TT)
1059         HRRZS TPSP(TT)
1060         POPJ P,
1061
1062 ;MAKE A TTY INTO AN ORDINARY PRINTING TTY.
1063 ;TTY # IN I; CLOBBERS TT,B,C.
1064 NCNSSP: SETZM TCTYP(I)
1065         MOVE TT,[%TOMVB+%TOOVR+%TOLWR,,%TPORS]
1066         MOVE B,TTYTYP(I)
1067         TRNN B,%TYSTY
1068          IORI TT,%TPPCR
1069         LDB B,[$TTOSP,,B]
1070         CAIN B,2
1071          TLC TT,%TOALT+%TOMVB+%TOLWR    ;10CPS => ASSUME TELETYPE.
1072 IFN 0,[         ;THIS WOULD TURN THE MOTOR OF A CRTSTY DISPLAY ON AND OFF.
1073         CAIN B,5                ;120CPS => ASSUME TERMINET.
1074          JRST [ TRC TT,%TPPCR+5*%TPPLF
1075                 MOVEI C,%TNTRM
1076                 MOVEM C,TCTYP(I)
1077                 JRST .+1 ]
1078 ];IFN 0
1079         MOVEM TT,TTYOPT(I)
1080         SETZM TTYSMT(I)         ;NO GRAPHICS, NO LOCAL EDITING.
1081         SETOM TTOALC(I)         ;%TPCBS TURNED OFF
1082         MOVEI TT,1              ;SCROLLS A LINE AT A TIME (THIS IS
1083         MOVEM TT,TTYROL(I)      ; MAINLY FOR THE BENEFIT OF TYIFLS)
1084         HRRZ TT,I
1085         IMULI TT,TPLEN*2
1086         MOVEM TT,TTYEPP(I)
1087         MOVEI C,71.
1088         CAIE B,2                ;10 CPS => TELETYPE
1089          MOVEI C,79.            ;ANYTHING ELSE IS AT LEAST 80 WIDE
1090 IFN 0,[
1091         CAIN B,5
1092          MOVEI C,119.
1093 ]
1094         MOVSI B,(MOVE)
1095         PUSHJ P,NCNSSH
1096         JRST NCNSSV
1097 \f
1098 ;SET TTYEPP OF TTY # IN I, MAIN PC PPR # IN TT. CLOBBER H,TT.
1099 ;HAD BETTER ALWAYS BE CONO PI,CLKOFF HERE, OR SYSTEM MAY CRASH IN ECHOING CODE.
1100 NCNSSG: MOVE H,TTYOPT(I)
1101         TLNE H,%TOMVU   ;NOT DISPLAY OR
1102         TLNN H,%TOERS   ;ARDS-LIKE (CAN'T ERASE)
1103          JRST NCNSSF    ; => CAN'T HAVE ECHO AREA.
1104         MOVE H,TPLEN+TPVB(TT)
1105         CAMGE H,TCMXV(I)        ;NO ECHO LINES => CAN'T USE ECHO AREA.
1106          ADDI TT,TPLEN  ;ELSE USE IT.
1107 NCNSSF: MOVEM TT,TTYEPP(I)
1108         POPJ P,
1109
1110 IFN N11TYS,[
1111 ;RE-INIT THE PARAMETERS OF A T.V. WHEN IT BECOMES FREE.
1112 NCNSST: HRRZ TT,I
1113         IMULI TT,TPLEN*2
1114         MOVEI B,%TNTV
1115         MOVEM B,TCTYP(I)
1116         MOVE B,[%TOMVB+%TOMVU+%TOERS+%TOSAI+%TOLWR+%TOOVR+%TOFCI+%TOLID+%TOCID,,%TP11T+%TPRSC]
1117         MOVEM B,TTYOPT(I)
1118         MOVEI B,4               ;TV'S SCROLL BY 4 LINES PER GLITCH
1119         MOVEM B,TTYROL(I)
1120         MOVEI B,37.
1121         MOVEI C,95.
1122         PUSHJ P,NCNSSH
1123         JRST NCNSSV
1124 ];N11TYS
1125
1126 NCNSSC: XOR E,TTYCOM(I) ;DON'T CHANGE TTYCOM BITS EXCEPT THESE.
1127         AND E,[%TCQRY+%TCRFS+%TCICO+%TCOCO,,]
1128         XORM E,TTYCOM(I)
1129         POPJ P,
1130
1131 TYVSRO: JUMPL A,OPNL33  ;CAN'T BE NEGATIVE
1132         ;CAME D,%TNTV   ;CAN'T SET NON-ZERO ON TVS
1133          CAML A,TCMXV(I);CAN'T BE BIGGER THAN SCREEN SIZE
1134           JUMPN A,OPNL33
1135         TLNN H,%TOMVU   ;ON PRINTING TTYS, TTYROL MUST BE 1 OR GET INTO
1136          CAIN A,1       ; INFINITE RECURSION AT TYOLF3/TYOCLR/TYOCRL
1137           CAIA
1138            JRST OPNL33
1139         MOVEM A,TTYROL(I)
1140         JRST TTYOJ1
1141 \f
1142 ;TTYVAR SYSTEM CALL - READ AND WRITE VARIOUS TTY VARIABLES
1143
1144 ;TABLES OF TTY VARIABLES.
1145 ;THE NEXT 3 TABLES ARE PARALLEL, IF YOU CHANGE ONE CHANGE THEM ALL.
1146
1147 ;TTY VARIABLE NAMES.  MUST BE SORTED IN SIXBIT ORDER.
1148
1149 TYVTAB: SIXBIT/HEIGHT/
1150         SIXBIT/IDLTIM/
1151         SIXBIT/ISPEED/          ;IN BITS PER SECOND
1152         SIXBIT/OSPEED/          ;IN BITS PER SECOND
1153         SIXBIT/SMARTS/
1154         SIXBIT/TCTYP/
1155         SIXBIT/TTYCOM/
1156         SIXBIT/TTYOPT/
1157         SIXBIT/TTYROL/
1158         SIXBIT/TTYSMT/
1159         SIXBIT/TTYTYP/
1160         SIXBIT/WIDTH/
1161 LTYVTA==:.-TYVTAB
1162 TYVTL2==.RADIX 2,CONC [.LENGTH/]\.-TYVTAB-1,/   ;BASE 2 LOG-1 OF TABLE SIZE
1163 REPEAT 1_<TYVTL2>-<.-TYVTAB-1>-1, <SETZ>-1      ;PAD OUT TO POWER OF 2 SIZE
1164
1165 ;INSTRUCTIONS TO GET VARIABLE INTO A
1166
1167 TYVGET: MOVE A,TCMXV(I)
1168         PUSHJ P,[MOVE A,TIME ? SUB A,TTITM(I) ? POPJ P,]
1169         PUSHJ P,[LDB A,[$TTISP,,TTYTYP(I)] ? MOVE A,BAUDRT(A) ? POPJ P,]
1170         PUSHJ P,[LDB A,[$TTOSP,,TTYTYP(I)] ? MOVE A,BAUDRT(A) ? POPJ P,]
1171         MOVE A,TTYSMT(I)
1172         MOVE A,TCTYP(I)
1173         MOVE A,TTYCOM(I)
1174         MOVE A,TTYOPT(I)
1175         MOVE A,TTYROL(I)
1176         MOVE A,TTYSMT(I)
1177         MOVE A,TTYTYP(I)
1178         PUSHJ P,[MOVE A,TCMXH(I) ? SOJA A,CPOPJ]
1179
1180 ;INSTRUCTIONS TO SET VARIABLE FROM A.  OPNL33 IF VALUE BAD.  OPNL26 IF CAN'T WRITE.
1181 ;OTHERWISE, IF GOES VIA .CALL CNSSET, MOVE A INTO APPROPRIATE AC (SEE COMMENT AT NCNSS0).
1182 ;FOR OTHER VARIABLES, JRST TO ROUTINE TO STORE A INTO VARIABLE.
1183
1184 TYVSET: MOVE B,A        ;HEIGHT
1185         JRST [SUB A,TIME ? MOVNM A,TTITM(I) ? JRST TTYOJ1] ;IDLTIM
1186         JRST TYSISP     ;ISPEED
1187         JRST TYSOSP     ;OSPEED
1188         JRST TYVSSM     ;SMARTS
1189         MOVE D,A        ;TCTYP
1190         MOVE E,A        ;TTYCOM
1191         MOVE H,A        ;TTYOPT
1192         JRST TYVSRO     ;TTYROL
1193         JRST TYVSSM     ;TTYSMT
1194         JRST OPNL26     ;TTYTYP
1195         MOVE C,A        ;WIDTH
1196
1197 TYVSSM: MOVEM A,TTYSMT(I)
1198         JRST TTYOJ1
1199
1200 ;SET SPEED.  MAYBE THIS SHOULD CHANGE IT IN HARDWARE ALSO?
1201 TYSISP: SKIPA B,[$TTISP,,TTYTYP(I)]
1202 TYSOSP:  MOVE B,[$TTOSP,,TTYTYP(I)]
1203         MOVEI C,17      ;FIND CODE
1204         CAME A,BAUDRT(C)
1205          SOJGE C,.-1
1206         JUMPL C,OPNL33  ;NON-EXISTENT
1207         DPB C,B
1208         JRST TTYOJ1
1209
1210 ;TRANSLATION FROM INTERNAL SPEED CODES TO BAUDS
1211 BAUDRT: 0 ? 600. ? 110. ? 150.
1212         300. ? 1200. ? 1800. ? 2400.
1213         4800. ? 9600. ? 25000. ? 40000.
1214         50000. ? 80000. ? -1 ? -2
1215 \f
1216 ;CODE FOR TTYVAR SYS CALL BEGINS HERE
1217
1218 NTTYVA: HRRE E,A
1219         JSP J,ATTYC9    ;I TTY NUMBER
1220          SKIPA J,[1]
1221           SETO J,       ;J GETS -1 IF IT'S OUR CONSOLE, 1 IF OTHER TTY CHNL.
1222         AOSGE E         ;SKIP IF ARG WAS -1 (OWN CNSL) OR CHANNEL NUMBER
1223          MOVEI J,0      ;J ZERO IF TTY SPECIFIED BY NUMBER.
1224         PUSHJ P,VARCAL  ;RETURN WITH SUITABLE STUFF IN E,D,W
1225         JUMPE W,NTTYV1
1226         JUMPE J,OPNL26  ;ERR OUT IF WRITE LOCKED (SOMEONE ELSE'S TTY)
1227         JUMPG J,NTTYV1  ;IF IT'S OUR CONSOLE, WAIT TILL WE OWN IT, OR INTERRUPT.
1228         PUSHJ P,TTYWC2
1229 NTTYV1: TLNN E,-1       ;DEFAULT LH OF SIXBIT VARIABLE NAME TO 'TTY'
1230          HRLI E,'TTY    ;SO CALLER CAN USE IMMEDIATE ARGUMENT -- PRETTY RANDOM
1231         MOVEI B,0       ;LOOK UP IN TABLE OF TTY VARIABLES (TYVTAB)
1232         REPEAT TYVTL2,[CAML E,TYVTAB+1_<TYVTL2-.RPCNT-1>(B)
1233          ADDI B,1_<TYVTL2-.RPCNT-1>
1234         ]
1235         CAME E,[<SETZ>-1]
1236          CAME E,TYVTAB(B)
1237           JRST OPNL11   ;IILEGAL TTY VARIABLE NAME
1238         CONO PI,TTYOFF
1239         XCT TYVGET(B)   ;GET VALUE OF VARIABLE INTO A
1240         JUMPE W,TTYOJ1  ;RETURN IF READING
1241         HRRI W,A
1242         XCT W           ;PUT NEW VALUE INTO A
1243         MOVE W,TYVSET(B) ;GET INSTRUCTION TO PUT A IN PROPER PLACE
1244         MOVE B,TCMXV(I) ;SET UP OLD VARIABLES FOR NCNSS0
1245         MOVE C,TCMXH(I)
1246         SUBI C,1
1247         MOVE D,TCTYP(I)
1248         MOVE E,TTYCOM(I)
1249         MOVE H,TTYOPT(I)
1250         XCT W           ;CHANGE THE AC CONTAINING THE VARIABLE TO BE CHANGED
1251         MOVEI W,6       ;TELL CNSSET TO CHANGE EVERYTHING
1252         JRST NCNSS0     ;MAKE THE CHANGES, THEN TTYOJ1.
1253
1254 ;.CALL TTYFLS
1255 ;  ARG 1 - <TTY>
1256 ;WITH CONTROL BITS 0, MARKS LAST INTERRUPT CHARACTER ITYIC'ED
1257 ; TO BE IGNORED AT MAIN PROGRAM LEVEL.
1258 ;WITH CONTROL BIT 1, DISCARDS ALL INPUT THROUGH LAST CHARACTER ITYIC'ED.
1259 NTTYFLS:JSP J,TTYNGT
1260         MOVE A,CTLBTS(U)
1261         TRNN A,1
1262          JRST NTTYF2
1263         CONO PI,TTYOFF
1264 NTTYF1: MOVE C,TIOP(I)
1265         CAMN C,TINTP(I)
1266          JRST TTYOJ1
1267         PUSHJ P,TYIREM
1268         JRST NTTYF1
1269
1270 NTTYF2: LDB A,TINTP(I)
1271         TRO A,%TXIGN
1272         DPB A,TINTP(I)
1273         JRST POPJ1
1274
1275 NTTYESC:                        ;SIMULATES TYPING OF ^_
1276         JSP J,ATTYC2            ;DECODE TTY SPEC.  IF OUR CONSOLE, WAIT TILL WE CAN INPUT.
1277         CONO PI,TTYOFF
1278         HRRZ A,TTYIPC(I)
1279         CAIE A,TTYI
1280          JRST OPNL7             ;DEVICE NOT READY
1281         MOVEI A,TYCI
1282         MOVEM A,TTYIPC(I)
1283         JRST TTYOJ1
1284 \f
1285 ;WHOLINE SYSTEM CALL.
1286 ;TAKES A MANDATORY 1ST ARGUMENT SPECIFYING A TTY.
1287 ;RETURNS TWO VALUES - THE OLD SETTINGS OF WHMODE AND WHJOB
1288 ;FOR THAT TTY.
1289 ;OPTIONAL 2ND AND 3RD ARGUMENTS SET WHMODE AND WHJOB. IF THEY
1290 ;ARE PRESENT, THE RETURNED VALUES ARE THE OLD SETTINGS.
1291 ;THE CALL FAILS FOR TTY'S OTHER THAN TV'S.
1292
1293 NWHOLI: JSP J,ATTYC             ;DECODE THE TTY SPEC.
1294         MOVE H,TTYOPT(I)
1295 IFN N11TYS,TRNN H,%TP11T        ;FAIL IF NOT PDP11 TV.
1296          JRST OPNL34
1297 IFN N11TYS,[
1298         SKIPL TT11P             ;TV PDP11 DOWN => DON'T USE IT.
1299          JRST OPNL10
1300         CAIGE W,2               ;IF THERE ARE OPTIONAL ARGS, DECODE THEM.
1301          JRST NWHOL2
1302         CAIE B,1                ;DECODE 3RD ARG ONLY IF RELEVANT.
1303          JRST NWHOL2
1304         MOVE J,C                ;IT SHOULD BE A JOB SPEC.
1305         CAIGE W,3
1306          SETO J,                ;USE -1 (SELF) AS THE DEFAULT.
1307         JSP T,NCRUI2
1308          JFCL
1309         JUMPL J,OPNL34          ;PDP6 IS NO GOOD.
1310         MOVE C,J
1311         IDIVI C,LUBLK           ;CONVERT USER IDX TO JOB #.
1312 NWHOL2: ADD I,TT11HD
1313         ADD I,TT1111
1314         ADD I,TT1111
1315         LDB TT,[$11AD0,,1-NF11TY(I)]
1316         ADDI TT,TT11LO          ;TT HAS PDP10 ADDR OF TTY'S WHOLINE VARS.
1317         CONO PI,TTYOFF
1318         MOVE T,WHMODE(TT)       ;FIRST, GET THE CURRENT SETTINGS.
1319         LDB Q,[$11WD0,,WHJOB(TT)]
1320         CAIGE W,2
1321          JRST NWHOL3
1322         DPB B,[$11WD0,,WHMODE(TT)] ;THEN, SET TO NEW VALUES IF REQUIRED.
1323         DPB C,[$11WD0,,WHJOB(TT)]
1324 NWHOL3: CONO PI,TTYON
1325         MOVE A,T                ;PUT RETURN VALUES IN APPRO. ACS
1326         ASH A,-24
1327         MOVE B,Q
1328         JRST POPJ1
1329 ]
1330
1331 ;TVWHER SYSTEM CALL.
1332 ;TAKES 1 ARG SPECIFYING A TTY, WHICH MUST BE A TV TTY.
1333 ;RETURNS 2 VALUES.
1334 ;1ST VALUE: THE KEYBOARD NUMBER OF THE PHYSICAL TERMINAL IN USE.
1335 ;2ND VALUE: THE NUMBER OF THE DISPLAY BUFFER IN USE ON THIS TTY.
1336
1337 NTVWHE: JSP J,ATTYCI
1338         MOVE H,TTYOPT(I)
1339 IFN N11TYS,     TRNN H,%TP11T
1340         JRST OPNL34
1341 IFN N11TYS,[
1342 NTVWH1: LDB A,[$11AD0,,TT11HA]
1343         ADDI A,TT11LO(I)
1344         LDB B,[$11BY3,,1-NF11TY(A)]
1345         LDB A,[$11BY2,,1-NF11TY(A)]
1346         JRST POPJ1
1347 ]
1348 \f
1349 SUBTTL .ITYIC, .LISTEN, TTY WHYINT
1350
1351 ;.CALL ITYIC. 1 ARG, A TTY INPUT CHANNEL; 1 VALUE, THE INTERRUPT CHAR.
1352 ;FAILS IF THERE ARE NO INTERRUPT CHARACTERS.
1353 NITYIC: JSP J,TTYNGT
1354 AITYI1: SKIPG D,TINTC(I)
1355          POPJ P,
1356         MOVE A,TINTP(I) ;SAVE SOME INFO FOR DEBUGGING
1357         MOVE J,TICC(I)
1358         MOVE C,TIIP(I)  ;GET THE END OF FILLED PART OF BUFFER
1359 AITYI2: CAMN C,TINTP(I) ;IF OUR MOVING POINTER PASSES THERE, THERE ARE REALLY
1360          BUG            ;NO INT CHARS IN THE BUFFER.  BUT TINTC NON-ZERO??
1361         MOVE B,TINTP(I)
1362         CAMN B,TIBEP(I) ;WRAP AROUND AT END OF BUFFER
1363          SUBI B,TIBL
1364         HRRM B,TINTP(I) ;ADVANCE TINTP TO NEXT CHARACTER.
1365         ILDB B,TINTP(I)
1366         TRZN B,%TXINT   ;KEEP LOOKING TILL FIND NEXT INT. CHAR.
1367          JRST AITYI2
1368         DPB B,TINTP(I)
1369         SOS TINTC(I)
1370         HLRZ R,H        ;GET IOCHNM BITS IN R. UNLESS %TIFUL IS SET,
1371         MOVE A,B
1372         AOS (P)
1373         JRST TYINRM     ;NORMALIZE PDP-11 12-BIT CHARACTERS TO 7-BIT.
1374
1375 ;.CALL WHYINT ON TTY INPUT CHANNEL IS SIMILAR TO ITYIC
1376 TYIWHY: JSP J,TTYNG1
1377         PUSHJ P,AITYI1
1378          SOS (P)        ;DON'T SKIP-RETURN IF NO INTERRUPT CHARS
1379         MOVE B,A        ;SECOND RESULT IS INTERRUPT CHARACTER
1380         MOVEI A,%WYTYI  ;FIRST RESULT IS DEVICE CODE
1381         JRST POPJ1
1382
1383 AITYI:  SETO A,         ;.ITYI   OBSOLETE.
1384         TDZA H,H
1385 AITYIC:  UMOVE A,(J)            ;.ITYIC
1386         PUSH P,J                ;TURN INTO NEW SYSTEM CALL ITYIC
1387         MOVE B,[SIXBIT /ITYIC/]
1388         MOVEM B,LSCALL(U)       ;FOR JOB DEVICES' SAKE.
1389         MOVEI W,1
1390         PUSHJ P,NITYIC
1391          JRST POP1J
1392         UMOVEM A,@(P)
1393         JRST POP1J1
1394 \f
1395 ALISTEN:SKIPGE I,TTYTBL(U)      ;.LISTEN
1396          JRST ALIS1
1397         PUSHJ P,TYOWC
1398         SKIPA B,TICC(I)
1399 ALIS1:   SETZ B,
1400         MOVE A,PIRQC(U)
1401         TRNE A,%PIC.Z
1402          JRST UDELAY
1403         UMOVEM B,(J)
1404         POPJ P,
1405
1406 TTYFIN: JSP J,TTYNG1    ;HERE FOR .CALL FINISH ON TTY OUTPUT CHANNEL
1407         PUSHJ P,TYOWC
1408         JRST POPJ1
1409
1410 NLISTE: JSP J,TTYNGT    ;HERE FOR .CALL LISTEN
1411         PUSHJ P,TYOWC
1412         MOVE A,TICC(I)
1413         JRST POPJ1
1414
1415 TTYNGT: TRC A,-1        ;RH(A)=-1 => TREE'S CONSOLE
1416         TRCN A,-1
1417          JRST TTYNG2
1418         MOVEI T,AIOCAL  ;OTHERWISE MUST BE CHANNEL NUMBER
1419         HRLI J,.+2
1420         JRST CHNDCD
1421         TLNN R,%CLSTI   ;CHNDCD RETURNS CLSTB BITS IN R, IOCHNM WD CONTENTS IN H
1422          JRST OPNL34
1423 TTYNG1: HLRZ I,H
1424         TRZ I,377700
1425         TRZE I,400000   ;SKIP IF DEVICE (RATHER THAN CONSOLE)
1426 TTYNG2:  SKIPL I,TTYTBL(U)
1427           JRST (J)
1428         JRST OPNL10
1429
1430 TYOWHY: MOVEI A,%WYTYO  ;.CALL WHYINT ON TTY OUTPUT CHANNEL
1431         MOVSI B,(SETZ)  ;FOR NOW, JUST ASSUME REASON IS **MORE**
1432         JRST POPJ1
1433 \f
1434 SUBTTL TTY OPEN
1435
1436 ;LH TTY OPEN
1437 ;3.1 0 -> IN 1 -> OUT
1438 ;3.2 0 -> UNIT 1 -> BLOCK
1439
1440 ;OUTPUT
1441 ;3.3 => IMAGE MODE (SET ALL %TGIMG BITS IN TTYST1 AND TTYST2)
1442 ;3.4 0 -> NORMAL 1 -> ECHO MODE OUTPUT (SET %TJECH, %TJPP2, %TJMOR).
1443 ;3.5 0 -> NORMAL 1 -> DISPLAYMODE, LOOK FOR ^P (SET %TJDIS).
1444 ;3.6 0 -> NORMAL 1 -> SUPER-IMAGE OUTPUT (SET %TJSIO).
1445
1446 ;INPUT
1447 ;3.3 => IMAGE MODE (CLEAR ALL ECHO BITS IN TTYST1, TTYST2).
1448 ;3.4 => "DDT" (DON'T ECHO CR, LF, TAB)
1449 ;3.5 => CONVERT LOWER TO UPPER CASE
1450 ;3.6 => WANT 3 LINES IN ECHO AREA.
1451
1452 ;BITS 3.4 AND 3.6 ON INPUT, AND BIT 3.3, HAVE EFFECT
1453 ;ONLY ON THE FIRST OPEN IN EITHER DIRECTION.
1454 ;(THEY ARE OBSOLETED BY THE TTYSET SYSTEM CALL)
1455
1456 ;LH OF IOCHNM WD
1457 ;(SHOWS UP IN RH OF A ON .IOT, .CLOSE, ETC)
1458
1459 %TICNS==400000  ;4.9 1-> CONSOLE 0 -> DEVICE. THIS BIT EXIST IN INPUT AND OUTPUT CHNLS.
1460 %TJCNS==400000  ;4.9 1-> CONSOLE 0 -> DEVICE
1461
1462 ;OUTPUT:
1463 %TJCP1==200000  ;^P-CODE ANTICIPATION STATE.
1464 %TJCP2==100000  ; ".  0=>NORMAL, 1=> CHAR AFTER ^P, 2=> ^PH, 3=>^PV.
1465 %TJECH==40000   ;SET => ECHO MODE OUTPUT.-MODE OUTPUT (ALL CHARS OUTPUT THE
1466                 ;WAY THEY WOULD BE ECHOED)
1467 %TJCTN==20000   ;SET => DON'T DO LINE-CONTINUATION.
1468 %TJSTP==10000   ;SET => THIS CHANNEL IS HUNG IN **MORE**.
1469 %TJDIS==4000    ;SET => LOOK FOR ^P CODES.
1470 %TJSIO==2000    ;SET => SUPERIMAGE OUTPUT, NO PADDING OR CURSOR CTL.
1471 %TJMOR==1000    ;SET => DON'T DO **MORE** PROCESSING.
1472 %TJPP2==400     ;SET => USE ALTERNATE PC PPR (THE ECHO AREA)
1473 %TJINK==200     ;SET => NEXT CHAR ASSUMED TO BE 1-POSITION PRINTING.
1474 %TJHDE==100     ;SET => ACCOUTING FOR CURSOR MOTION DUE TO
1475                 ;CHAR ECHOED ON A HALF-DUPLEX TTY.
1476
1477 ;INPUT
1478 ;3.3 => NO ECHO.
1479 %TIECH==40000   ;CAN READ EVEN IF CHAR NEEDS PI ECHOING.
1480 %TIPEK==20000   ;DON'T REMOVE CHAR FROM BUFFER.
1481 %TIACT==4000    ;SET => DON'T WAIT FOR ACTIVATION CHARACTER.
1482 %TIINT==2000    ;SET => CAN READ A CHAR EVEN IF IT IS SUPPOSED TO INTERRUPT & HASN'T YET.
1483 %TINWT==1000    ;SET => IF NO INPUT AVAILABLE, DON'T WAIT, JUST RETURN -1.
1484 %TIFUL==400     ;SET => GIVE FULL CHARACTER (SIGNIFICANT ON IMLAX, TVS)
1485
1486 $TIIDX==220600  ;3.6-3.1 CONSOLE #, OR 77 FOR A "DISOWNED" CONSOLE TTY CHNL
1487 ;IE, ONE THAT CORRESPONDS TO NO REAL TTY. THEY EXIST ONLY IN
1488 ;TREES WITH NO TTY, IN JOBS THAT CAM FROM TREES WITH TTYS.
1489 %TINON==77      ;"TTY #" FOR A CHANNEL WITH NO REAL TTY.
1490 \f
1491 ;ENTRY FOR OPEN OF TTY AS DEVICE TYN OR TNM
1492
1493
1494 IFN TTLPTP,[
1495 LPTO:   MOVE J,TIME
1496         SUB J,LPTTIME   ;"LPT" INPUTS EVERY ONCE IN A WHILE IF IT IS UP
1497         CAIL J,60.      ;2 SECONDS
1498         JRST OPNL7
1499         SKIPA I,LPTTTY
1500 ]
1501 TTYO:   PUSHJ P,TTYFD   ;TEST FOR FILE NAME OF .FILE. (DIR)
1502         CAIL I,NCT
1503          JRST OPNL1     ;TTY NUM TOO LARGE
1504 TTYO3C:
1505 IFN NNVTTS,[
1506         .ERR Shouldn't this be using NFNVTY instead?
1507         CAIGE I,NOTYS+NNTYS+NNVTTS
1508          CAIGE I,NOTYS+NNTYS    ;SKIP ON NOVA TTY
1509           JRST TTYO3A
1510         SKIPGE NOVATT
1511          JRST OPNL10    ;NOVA LINK NOT ACTIVE
1512 TTYO3A: CAMN I,NOVATT
1513          JRST OPNL10    ;CANT OPEN TTY USED AS CNHL TO NOVA
1514 ]
1515         MOVEI A,0       ;MARK AS A DEVICE
1516         CONO PI,TTYOFF  ;INTERLOCK WITH OTHER TTY OPENS, AND ^Z'S.
1517         SKIPGE TT,TTYSTS(I)     ;SKIP IF TTY OPEN
1518          JRST TTYO3B    ;OK IF TTY NOT OPEN
1519         CAIE U,(TT)     ;SAME USER THAT HAS IT?
1520          JRST OPNL10    ;TTY ALREADY OPEN AS DEVICE BY SOMEONE ELSE.
1521         TLNN TT,%TSCNS  ;OPEN AS CONSOLE?
1522          JRST TTYO8     ;NO, AS DEVICE
1523         CONO PI,TTYON
1524         JRST TTYO7      ;OPEN, THIS TIME AS CONSOLE.
1525
1526 TTYO3B: SKIPGE TTYSTA(I) ;TTY IS FREE: IS IT IN TRANSITION TO OR FROM BEING IN USE?
1527          JRST TTYO8     ;OK IF NOT;
1528         MOVE T,I        ;STYOCF TAKES TTY # IN T.
1529         PUSHJ P,STYOCF  ;AND WAIT TILL TTY IS NO LONGER IN TRANSITION
1530          PUSHJ P,UFLS
1531         JRST TTYO3C     ;THEN TRY AGAIN TO OPEN IT.
1532
1533 ;TTY IS AVAIL. TO OPEN AS A DEVICE.
1534 TTYO8:  SKIPN TTNTO(I)  ;IF TTY USED TO BE FREE, INIT. IT.
1535          PUSHJ P,TTYINI
1536         MOVSI TT,%TSFRE
1537         ANDCAM TT,TTYSTS(I)
1538         JRST TTYO3
1539 \f
1540 TTYFD:  PUSHJ P,FLDRCK  ;SKIP IF FILE DIR BEING OPENED
1541         JRST TTYFD1     ;FILE NAMES NOT SPECIAL
1542         SUB P,[1,,1]
1543         MOVEI J,6
1544         JRST LISTF7     ;GO GET DIRCTORY
1545
1546 TTYFD1: JUMPE W,CPOPJ   ;0 IS THE ONLY DEFINED MODE FOR ANY TTY OPEN
1547         SUB P,[1,,1]
1548         JRST OPNL12
1549
1550 FLDRCK: CAMN A,[SIXBIT /.FILE./]
1551         CAME B,[SIXBIT /(DIR)/]
1552         POPJ P,
1553         JRST POPJ1
1554
1555 ;INIT A TTY WHEN IT CEASES TO BE FREE. (ZFLAG7 FOR TTY, TTYO8 FOR TNM)
1556 ;CHNL 3 (TTYCHN) MUST BE OFF OR IN PROGRESS.
1557 TTYINI: SETZM TTYST1(I)
1558         SETZM TTYST2(I)
1559         MOVSI J,%TACFM  ;TTY NEEDS A CONSOLE FREE MESSAGE.
1560         ANDCAM J,TTYSTA(I)
1561         MOVE J,TTYTYP(I)
1562         TRNN J,%TYSTY   ;EXCEPT ON STY TTYS,
1563          PUSHJ P,TTYIN1 ;INIT THE USER OPTIONS IN TTYOPT, TTYCOM.
1564         MOVE J,TTYOPT(I)
1565         HRLOI H,%TSFRE  ;INITIALIZE TTYSTS FROM TTYOPT
1566         TLNE J,%TOROL
1567          TLO H,%TSROL
1568         TLNN J,%TOMOR   ;NOTE %TOMOR SAYS DO **MORE** PROC,
1569          TLO H,%TSMOR   ;%TSMOR SAYS INHIBIT **MORE** PROC.
1570         TLNE J,%TOSA1
1571          TLO H,%TSSAI
1572         MOVEM H,TTYSTS(I)
1573         HRRZ TT,I
1574         IMULI TT,TPLEN*2
1575         SETZM TPFLAG(TT)
1576         SETZM TPFLAG+TPLEN(TT)
1577         SETZ H,         ;START OUT WITH NO ECHO LINES.
1578         JRST ASCML1
1579
1580 ;INIT A FEW BITS IN TTYOPT, TTYCOM THAT ARE CONSIDERED USER OPTIONS.
1581 ;NORMALLY DONE WHENEVER A TTY BECOMES IN USE, BUT ON STY TTY'S
1582 ;DONE ONLY WHEN THE STY IS INITIALIZED (SO STY-USER CAN SET THESE OPTIONS).
1583 TTYIN1: MOVE J,TTYCOM(I)
1584         TLZ J,%TCRFS+%TCQRY+%TCOCO+%TCICO
1585         MOVEM J,TTYCOM(I)
1586         MOVE J,TTYOPT(I)        ;INIT SOME TTYOPT BITS.
1587         TLZ J,%TOUSR
1588         TRZ J,%TPUSR
1589         TLO J,%TOMOR            ;DO **MORE**
1590         HLLM J,TTYOPT(I)
1591         POPJ P,
1592 \f
1593 ;TELETYPE OPEN ROUTINES
1594
1595 ;ENTRY FOR OPEN OF "TTY" AS A CONSOLE
1596
1597 TTYO1:  PUSHJ P,TTYFD   ;TEST FOR FILE NAME OF .FILE. (DIR)
1598 TTYO7:  MOVE I,TTYTBL(U)
1599         JUMPGE I,TTYO2  ;JUMP IF HAS TTY NOW
1600         TLNE I,%TBWAT
1601          JRST TTYO2A
1602         TLNN I,%TBNVR   ;IF I SHOULD FAIL IF TRY TO OPEN TTY WHEN DON'T HAVE IT,
1603          TLNN I,%TBDTY  ;OR IF I HAVE DONE A .ATTY,
1604           JRST OPNL10   ;THE OPEN SHOULD FAIL.
1605 TTYO2A: PCLT
1606         SKIPGE TTYTBL(U)
1607          PUSHJ P,UFLS   ;HANG UNTIL HAS TTY
1608         MOVE I,TTYTBL(U)
1609 TTYO2:  HRRZS I ;TTY NUMBER
1610         CAIL I,NCT
1611          JRST 4,OPNL1   ;TTY NUM TOO LARGE
1612         MOVSI A,%TICNS  ;SAY TTY CHNL WILL BE OPEN AS CONSOLE.
1613         CONO PI,TTYOFF
1614 TTYO3:  HRLZI J,(D)     ;SET IOCHNM BITS (IN A) FROM OPEN MODE.
1615         LSH J,1
1616         TLZ J,700077    ;BUT DON'T USE PARTS OF OPEN WD USED FOR OTHER THINGS.
1617         IOR A,J
1618 IFN TTLPTP,[
1619         CAMN I,LPTTTY   ;SKIP IF OT TTY
1620         HRRZM U,LPTUSR
1621 ]
1622         DPB I,[$TIIDX,,A]       ;LH OF A WILL BE STORED IN LH OF IOCHNM WORD
1623         HRRZ TT,UUAC(U) ;TT HAS CHNL # BEING OPENED.
1624         JUMPGE D,TTYO4  ;J IF INPUT OPEN.
1625         TRNE D,20
1626          TLO A,%TJSIO   ;SUPER IMAGE OUT.
1627         TRNE D,4
1628          TLO A,%TJECH+%TJPP2+%TJMOR     ;ECHO OUTPUT
1629         TRNE D,10
1630          TLO A,%TJDIS   ;DISPLAY OUTPUT MODE.
1631         MOVE J,TYOMSK(I)
1632         IOR J,CHNBIT(TT)        ;UPDATE CHANNELS-OPEN MASK
1633         EXCH J,TYOMSK(I)        ;FOR THE NEW OUTPUT CHANNEL.
1634         JUMPN J,TTYO5   ;FOR 1ST OUTPUT OPEN, INIT TTYST1,2.
1635         MOVE J,[101010,,101010]
1636         IORM J,TTYST1(I)
1637         IORM J,TTYST2(I)        ;SET ALL THE OUTPUT-IN-IMAGE-MODE BITS.
1638         TRNN D,2
1639          ANDCAM J,TTYST1(I)     ;IF NOT IMAGE, CLEAR THEM.
1640         TRNN D,2
1641          ANDCAM J,TTYST2(I)
1642         JRST TTYO5
1643
1644 TTYO4:  MOVE J,TYIMSK(I)
1645         IOR J,CHNBIT(TT)        ;UPDATE INPUT-CHNLS-OPEN MASK
1646         EXCH J,TYIMSK(I)        ;FOR NEWLY OPENED INPUT CHANNEL.
1647         JUMPN J,TTYO5   ;THE 1ST INPUT CHNL OPEN, INIT ECHO BITS...
1648         MOVEI H,0       ;INPUT
1649         TRNE D,20
1650          MOVEI H,3      ;# COMMAND LINES
1651         PUSHJ P,ASCML1
1652         MOVE J,TTYST1(I)
1653         AND J,[101010,,101010]  ;SAVE IMAGE MODE OUTPUT BITS
1654         TRNN D,2        ;SKIP ON IMAGE MODE INPUT
1655          IOR J,[202020,,202020] ;ASCII MODE INPUT
1656         IOR J,[030303,,030303]  ;ENABLE INTERRUPT AND ACTIVATE ON ANY CHARACTER
1657         MOVEM J,TTYST1(I)       ;STORE BACK
1658         MOVE J,TTYST2(I)
1659         AND J,[101010,,101010]  ;SAVE IMAGE MODE OUTPUT BITS
1660         TRNN D,2        ;SKIP ON IMAGE MODE INPUT
1661          IOR J,[202020,,200020] ;SAY ALL CHARS EXCEPT RUBOUT SHOULD ECHO.
1662         TRNE D,4        ;SKIP ON NOT DDT MODE
1663          ANDCM J,[006000,,606000]       ;DDT MODE
1664         IOR J,[030303,,030303]  ;ENABLE INTERRUPT AND ACTIVATE ON ANY CHARACTER
1665         MOVEM J,TTYST2(I)       ;STORE BACK
1666 TTYO5:  HRRM U,TTYSTS(I)
1667         AOS TTNTO(I)    ;INCREMENT NUMBER OF CHNLS THIS TTY OPEN ON.
1668         CONO PI,TTYON
1669         MOVSS C
1670         JSP Q,OPSLC3    ;SET UP IO CHNM WORD AND RETURN
1671         TYIDN,,TYODN
1672         TYIBN,,TYOBN
1673 \f
1674 SUBTTL WAITING FOR ACCESS TO TTY
1675
1676 ;HERE WHEN WANT TO DO TTY INPUT, TO CHECK FOR PERMISSION.
1677 TTYWI:  HLRZ I,(R)
1678         ANDI I,%TICNS+(.BM $TIIDX)
1679         TRZN I,%TICNS   ;CLEAR AND CHECK CONSOLE/DEVICE BIT
1680          POPJ P,        ;RETURN RIGHT AWAY IF DEVICE
1681 ;CALL FROM ATTYCR.
1682 TTYWI2: MOVE T,TTYTBL(U)
1683         TLNN T,%TBNOT   ;RETURN RIGHT AWAY IF WE OWN THE TTY.
1684          POPJ P,
1685         TLNE T,%TBIIN   ;ELSE INTERRUPT IF %TBIIN IS SET.
1686          JRST TTYLOS
1687 TTYWC3: TLC T,%TBINT    ;ELSE INTERRUPT IF %TBINT IS SET AND NOT %TBWAT.
1688         TLNN T,%TBINT+%TBWAT
1689          JRST TTYLOS
1690         PCLT
1691         SKIPGE TTYTBL(U)
1692          PUSHJ P,UFLS   ;WAIT TILL HAS TTY (CANT HAVE TTY IF DISOWNED)
1693         POPJ P,
1694
1695 ;CALL FROM ATTYC, ATTYC2.  WAIT TILL WE OWN THE TTY.
1696 TTYWC2: MOVE T,TTYTBL(U)
1697         TLNN T,%TBNOT   ;RETURN RIGHT AWAY IF WE OWN THE TTY.
1698          POPJ P,
1699         JRST TTYWC3
1700
1701 ;HERE WHEN WANT TO DO A TTY RESET.
1702 ;SKIP IF THE RESET SHOULD REALLY BE DONE.
1703 TTYWR:  HLRZ I,(R)
1704         ANDI I,%TICNS+(.BM $TIIDX)
1705         TRZN I,%TICNS   ;CLEAR AND CHECK CONSOLE/DEVICE BIT
1706          JRST POPJ1     ;RETURN YES IF DEVICE
1707         MOVE T,TTYTBL(U)
1708         TLNN T,%TBNOT   ;RETURN YES IF WE OWN THE TTY.
1709          JRST POPJ1
1710         POPJ P,         ;OTHERWISE IGNORE THE RESET.
1711
1712 ;HERE TO WAIT FOR OUTPUT PERMISSION FOR TTY
1713 ;RETURN WITHOUT SKIP IF THE OUTPUT SHOULD BE THROWN AWAY
1714 ;AND REPORTED TO THE USER AS DONE.
1715 TTYWO:  HLRZ I,(R)
1716         ANDI I,%TICNS+(.BM $TIIDX)
1717         TRZN I,%TICNS
1718          JRST POPJ1     ;ALWAYS HAVE PERMISSION IF TTY IS A DEVICE.
1719 ;CALL FROM ATTYC, ETC.
1720 TTYWO2: MOVE A,U
1721         HRRZ T,I
1722         CAIN T,%TINON   ;NEVER HAVE PERMISSION FOR CONSOLE IF WE'RE DISOWNED.
1723          JRST TTYWO1
1724         MOVE T,TTYTBL(U)        ;WE HAVE OUTPUT PERMISSION IFF ALL OUR SUPERIORS
1725                                 ;HAVE PERMISSION AND WE HAVE %TBOUT
1726                                 ;AND THE TREE HAS A TTY.
1727 ;THE NEXT INSN IS TEMPORARY, UNTIL DDT ETC. ARE CHANGED TO WIN FULLY.
1728 TTYWO3: JUMPGE T,TTYWO4         ;IF WE HAVE THE TTY, WE CAN TYPE ON IT.
1729         SKIPGE SUPPRO(A)        ;ALL OK TO TOP OF TREE => SEE IF TREE HAS A TTY.
1730          JRST TTYWO4
1731         TLNN T,%TBOUT           ;NOT AT TREE TOP => DOES THIS JOB HAVE PERMISSION
1732          JRST TTYWO1            ;FROM ITS SUPERIOR?
1733         MOVE A,SUPPRO(A)        ;AND IS THE SUPERIOR ALLOWING ANY INFERIORS PERMISSION?
1734         MOVE T,TTYTBL(A)
1735         TLNE T,%TBINF           ;SUPERIOR SAYS WE'RE OK => SEE IF SUPERIOR HAS PERMISSION.
1736          JRST TTYWO3
1737 TTYWO1: MOVE T,TTYTBL(U)        ;HERE IF WE DON'T HAVE PERMISSION.
1738         TLNE T,%TBOIG           ;IF OUTPUT IS TO BE IGNORED,
1739          POPJ P,                ;TELL OUR CALLER TO THROW IT AWAY, RIGHT NOW.
1740         TLNE T,%TBWAT+%TBOUT
1741          JRST TTYWO6
1742         TLNE T,%TBINT
1743          JRST TTYLOS
1744         TLNE T,%TBNVR+%TBDTY
1745          JUMPL I,[ SUB P,[1,,1] ? JRST OPNL10 ]
1746 TTYWO6: MOVE T,TTYTBL(A)        ;ELSE MUST WAIT.  WAIT FOR A CHANGE IN THE
1747         CAMN T,TTYTBL(A)        ;TTYTBL OF THE SUPERIOR DENYING US PERMISSION.
1748          PUSHJ P,UFLS
1749         JRST TTYWO              ;NOW RE-CHECK EVERYTHING.
1750
1751 ;WE HAVE PERMISSION, BUT MAYBE WAIT ANYWAY TO AVOID MIXING JOBS' OUTPUT.
1752 TTYWO4: SKIPGE TTYTBL(U)        ;NO NEED TO WAIT IF WE OWN THE TTY
1753          CAMN U,TTYLJB(I)       ;OR WE WERE LAST JOB TO USE IT.
1754           JRST TTYWO5
1755         MOVEI T,TOBS            ;ELSE WAIT FOR BUFFER TO BE EMPTY
1756         CAMN T,TORM(I)
1757          JRST TTYWO5
1758         CAME T,TORM(I)
1759          PUSHJ P,UFLS
1760         JRST TTYWO              ;RECHECK EVERYTHING, SINCE WE MAY HAVE LOST PERMISSION.
1761
1762 ;WE ARE ALLOWED TO OUTPUT RIGHT AWAY.
1763 TTYWO5: MOVEM U,TTYLJB(I)       ;MAKE SURE WE DON'T HAVE TO WAIT AGAIN.
1764         JRST POPJ1
1765
1766 ;TURN TTY OFF, THEN WAIT UNTIL EITHER TTY ISN'T IN COM MODE OR
1767 ;ONE OF THE BITS IN T IS SET IN TTYCOM(I).
1768 TTYCMW: CONO PI,TTYOFF
1769         TDNN T,TTYCOM(I)
1770          SKIPL TTYCOM(I)
1771           POPJ P,
1772         SKIPN USER
1773          POPJ P,        ;SYS JOB TRYING TO HACK
1774         HRR T,I         ;WAIT UNTIL NOT COM MODE OR IN COM MODE BUT ONE OR MORE BITS IN LH OF T
1775         PUSHJ P,LWAIT1  ;COME ON.  WAIT UNTIL OUT OF COM MODE WITH UTCOFF
1776             PUSHJ P,TTYSCM
1777         POPJ P,
1778
1779 TTYSCM: SKIPL TTYCOM(T)
1780          JRST POPJ1     ;NOT COM MODE
1781         PUSH P,A
1782         HLLZ A,TTYCOM(T)
1783         TDNE A,T
1784          AOS -1(P)      ;MASKED BIT(S) ON
1785         POP P,A
1786         POPJ P,
1787
1788 \f
1789 ;ECHOIN SYSTEM CALL.  ASK FOR ECHOING OF CERTAIN CHARACTERS
1790 ;UNTIL A BREAK CONDITION OCCURS.
1791 ;A BREAK CONDITION IS WHEN EITHER A NON-ECHOED CHARACTER IS TYPED IN
1792 ;OR A CERTAIN NUMBER OF CHARACTERS HAVE BEEN TYPED IN.
1793 ;CHARACTERS ECHOED BY THE ECHOIN ARE STORED INTO THE USER'S
1794 ;MEMORY BY THE INTERRUPT LEVEL.  IF THE NECESSARY AREAS OF MEMORY
1795 ;ARE SWAPPED OUT, THAT CONSTITUTES A BREAK CONDITION.
1796
1797 ;THE BREAK TABLE IS 128 BITS (DIVIDED INTO 4 WORDS THE LOW 4 BITS OF EACH UNUSED)
1798 ;ONE BIT FOR EACH ASCII CHARACTER.  A 1 INDICATES A CHARACTER THAT
1799 ;IS A BREAK CONDITION.  A 0 INDICATES A CHARACTER THAT CAN BE ECHOED.
1800 ;A CHARACTER WITH THE CONTROL OR META BIT IS ALWAYS A BREAK.
1801
1802 ;ARG 1  TTY INPUT CHANNEL
1803 ;ARG 2  B.P. TO WHERE IN USER'S MEMORY TO STORE CHARACTERS.
1804 ;ARG 3  NUMBER OF CHARACTERS TO ALLOW
1805 ;ARG 4  ADDRESS OF BREAK TABLE.
1806 ;ARG 5  ADDRESS OF BLOCK OF COUNTERS TO BE INCREMENTED OR DECREMENTED FOR EACH CHARACTER.
1807 ;       IF THE ADDRESS IS ZERO, ALL THIS IS OMITTED.
1808 ;       THE BLOCK HAS SEVEN WORDS.
1809 ;         THE FIRST TWO WORDS ARE LEFT ALONE.
1810 ;         THE NEXT FOUR ARE INCREMENTED.
1811 ;         THE SEVENTH IS DECREMENTED.
1812
1813 ;THE WORDS OF THE BREAK TABLE RESIDE IN ACS Q, J, R AND W.
1814 ;SIMILARLY, THE ADDRESS OF THE COUNT RESIDES IN AC C,
1815 ;THE ADDRESS OF THE BYTE POINTER IN B,
1816 ;AND THE ADDRESS OF THE BLOCK OF COUNTERS IN E.
1817 ;THEY ARE LOOKED AT BY THE INTERRUPT LEVEL,
1818 ;WHICH KNOWS THAT THE PROGRAM IS EXECUTING AN ECHOIN
1819 ;BY THE FACT THAT THE PC IS NECHO1.  IT IS IMPORTANT THAT WE
1820 ;NOT LOCK ANY SWITCHES SO THAT SWAPPING OUT A PAGE WON'T PCLSR
1821 ;US UNTIL WE ARE AWAKENED BY THE INTERRUPT LEVEL WHEN IT SEES
1822 ;THAT THE PAGES IT NEEDS ARE NOT IN CORE.
1823
1824 NECHOIN:
1825         JSP J,ATTYCR            ;DECODE CHANNEL.  GET TTY NUMBER IN I.
1826         XCTR XRW,[MOVES A,(C)]  ;MAKE SURE COUNT IS IN CORE AND WRITABLE.
1827         JUMPLE A,POPJ1          ;IF WANT ZERO OR FEWER CHARACTERS, RETURN IMMEDIATELY.
1828         XCTR XRW,[MOVES A,(B)]  ;MAKE SURE BYTE POINTER IS IN CORE AND WRITABLE.
1829         IBP A                   ;MAKE SURE BYTE BUFFER IS IN CORE AND WRITABLE.
1830         XCTR XRW,[MOVES (A)]    ; (NO LOSSAGE IF IT ISN'T, BUT MIGHT AS WELL SWAP IT IN NOW.)
1831         XCTR XRW,[MOVES (E)]    ;MAKE SURE BLOCK OF COUNTERS IS IN CORE AND WRITABLE.
1832         XCTR XRW,[MOVES 6(E)]
1833         UMOVE Q,(D)             ;LOAD BREAK TABLE WORDS INTO Q, J, R, W.
1834         UMOVE J,1(D)
1835         UMOVE R,2(D)
1836         UMOVE W,3(D)
1837         SKIPE TICC(I)           ;IF TYPE-AHEAD AVAILABLE, WE CAN'T DO ANYTHING.
1838          JRST POPJ1
1839         SKIPG TACC(I)           ;WAIT FOR AN ACTIVATION (PROBABLY NON-ECHOED) CHARACTER.
1840          PUSHJ P,TYIFL2         ;CALL TYIFL2 INSTEAD OF UFLS TO PREVENT IMPENDING **MORE**.
1841 NECHO1: JRST POPJ1              ;THE JOB IS INSIDE AN ECHOIN IF ITS PC IS HERE.
1842 \f
1843 SUBTTL TTY INPUT IOT
1844
1845 ;BLOCK MODE INPUT IOT.
1846 TTYBI:  JSP E,INBTCH
1847
1848 ;UNIT MODE INPUT IOT.
1849 ;R HAS THE ADDRESS OF THE IOCHNM WORD.
1850 ;VALUE RETURNED IN W.
1851 TYI:    PUSHJ P,TTYWI   ;WAIT FOR THE TTY IF ITS A CONSOLE.  TTY NUMBER IN I
1852         HLRZ R,(R)      ;GET IOCHNM WORD FLAGS, MODIFIED BY CTL BITS
1853         XOR R,CTLBTS(U) ;R HAS CHANNEL FLAGS
1854         PUSH P,E
1855         PUSHJ P,TYI0    ;GET THE CHAR IN D.
1856         POP P,E
1857         JUMPL D,UNIEOF  ;TYI0 RETURN -1 => DON'T FLUSH THE SIGN BIT, AND TERMINATE BLOCK IOT.
1858         ANDI D,%TXPIE+%TXMPE+%TXECI+%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
1859         CAIN A,^C
1860          AOS (P)        ;EOF, SKIP RETURN
1861         MOVE W,D
1862         POPJ P,
1863
1864 ;ASSUMING I HAS TTY NUMBER AND R HAS IOCHNM BITS.
1865 ;READ A CHARACTER FROM THE TERMINAL AND RETURN IT IN D.
1866 TYI0:   MOVE D,TTYTYP(I)
1867         TRNN D,%TYSTY   ;SKIP IF TTY IS ALTER EGO OF STY.
1868          JRST TYI1B1
1869         MOVSI D,%SSINT
1870         TDNE D,STYSTS-NFSTTY(I)
1871          JRST TYI1B1    ;HAVE ALREADY GIVEN INT
1872         SKIPE TICC(I)
1873          JRST TYI1B1
1874         IORB D,STYSTS-NFSTTY(I)
1875         MOVE TT,STYOMS-NFSTTY(I)        ;CHANNELS OPEN FOR OUTPUT ON
1876         AND TT,MSKST2(D)
1877         MOVN B,TT
1878         AND TT,B
1879         IORM TT,IFPIR(D)        ;GIVE INT ON LOWEST-NUMBERED CHANNEL.
1880         JRST TYI1B1
1881 \f
1882 TYI1B1: TRNE R,%TIACT
1883          JRST TYI1B     ;GOBBLE NEXT CHR REGARDLESS OF ACTIVATION
1884         MOVE TT,TTYSTS(I)
1885         TLNE TT,%TSACT
1886          JRST TYI1B
1887         PCLT
1888         SKIPG TACC(I)
1889          PUSHJ P,TYIFLS
1890 TYI1B:  PCLT    ;WAIT TILL THERE'S A CHAR TO READ.
1891         SKIPG TICC(I)
1892          PUSHJ P,TYIFLS
1893         CONO PI,CLKOFF  ;PREVENT ECHOING WHILE WE'RE MESSING WITH POINTERS.
1894         MOVE B,TIOP(I)
1895         MOVE T,B
1896         CAMN B,TIBEP(I)
1897         SUBI B,TIBL
1898         ILDB D,B
1899         SKIPN TT,TICC(I)        ;CHECK FOR CHAR FLUSHED BY ECHO BEFORE WE TURNED OFF CLOCK.
1900          JRST TYI1A
1901         TRNN D,%TXIGN
1902          JRST TYI1
1903         TRNN R,%TIECH
1904          TRNN D,%TXPIE
1905           JRST [ PUSHJ P,TYIREM
1906                  JRST TYI1A ]
1907         PCLT
1908         CAMN T,TIOP(I)  ;WAIT FOR ECHOING TO FLUSH THIS CHAR FROM BUFFER,
1909          PUSHJ P,UFLS
1910 TYI1A:  CONO PI,CLKON   ;ALLOW ECHOING.
1911         JRST TYI1B1     ;THEN TRY AGAIN TO READ CHAR.
1912
1913 TYI1:   CONO PI,CLKON   ;ALLOW ECHOING.
1914         MOVE T,TTYSTS(I)
1915         TLNN T,%TSNOE   ;ECHOING BEING DEFERRED OR
1916         TRNE R,%TIECH   ;THIS CHANNEL NEEDN'T WAIT FOR ECHO
1917          ANDCMI D,%TXPIE ;=> DON'T.
1918         SKIPE PICLR(U)  ;AT INT LVL IN USER PRGM OR
1919         TRNE R,%TIINT   ;THIS CHNL NEEDN'T WAIT FOR CHAR TO INTERRUPT
1920          ANDCMI D,%TXINT ;=> DON'T WAIT FOR THAT.
1921         MOVEI T,(D)
1922         ANDI T,%TXINT+%TXPIE ;WAIT FOR THESE BITS TO CLEAR.
1923         TRNE T,%TXINT   ;IF ABOUT TO WAIT FOR %TXINT TO CLEAR,
1924          PUSHJ P,TYIIWT ;TAKE CARE OF SEVERAL POSSIBLE SCREWS - MAY SET T.
1925         LDB D,[360600,,B]
1926         LSH T,(D)
1927         PCLT
1928         TDNE T,@B
1929          PUSHJ P,UFLS   ;HANG UNTIL PI ECHO BIT FOR THIS CHAR IS TURNED OFF
1930         LDB D,B         ;GET CHARACTER
1931         TRNN R,%TIECH   ;IF WE AREN'T SUPPRESSING ECHOING,
1932         TRNN D,%TXMPE   ;AND M.P. ECHOING NEEDED BUT NOT YET DONE,
1933          JRST TYI2
1934         MOVE T,TTYSTS(I)
1935         TLNE T,%TSNOE
1936          JRST TYI2
1937         JRST TYIMP1     ;GO DO IT.
1938 \f
1939 TYIMP1: PUSH P,R        ;DO MAIN-PRGM ECHO IF NECESSARY.
1940         PUSH P,C
1941         PUSHJ P,[MOVEI J,1(P)
1942                 ADD P,[3,,3]
1943                 HRRZM P,(P)
1944                 MOVE TT,TTYEPP(I)
1945                 PUSHJ P,NULSET  ;NO LOSSET OF IOCHNM
1946                 JSP E,TYOSE1
1947                 MOVEI R,%TJECH+%TJMOR
1948                 MOVE A,D
1949                 ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
1950                 JRST TYO6]
1951         POP P,C
1952         POP P,R
1953         CONO PI,TTYOFF
1954         MOVE B,TIOP(I)
1955         CAMN B,TIBEP(I)
1956          SUBI B,TIBL
1957         ILDB D,B
1958         TRZ D,%TXMPE    ;M.P. ECHOING NO LONGER PENDING FOR THIS CHAR.
1959         DPB D,B
1960         CONO PI,TTYON
1961 TYI2:   TRNN R,%TIPEK   ;DON'T REMOVE IF CHNL SAYS DON'T.
1962          PUSHJ P,TYIREM ;FINALLY REMOVE CHAR FROM BUFFER.
1963         MOVE TT,TTYCOM(I)
1964         TLNE TT,%TCLED          ;DOES THIS JOB WANT TO SEE LOCAL EDITING PROTOCOL
1965          JRST TYI2Z             ;REPLIES, ETC.?
1966         MOVE TT,D
1967         ANDI TT,%TXTOP+%TXASC   ;NO.  DISCARD THEM.
1968         CAIE TT,%TXTOP+"S       ;TOP-S AND TOP-E ARE SPECIAL COMMANDS SENT
1969          CAIN TT,%TXTOP+"E      ;BY LOCAL EDITING TTYS.
1970           JRST [SKIPG TICC(I)   ;IGNORE THE TOP-E OR TOP-S,
1971                  PUSHJ P,UFLS   ;AND THE CHARACTER AFTER IT AS WELL.
1972                 PUSHJ P,TYIREM
1973                 JRST TYI1B1]
1974         CAIN TT,%TXTOP+"T       ;TOP-T MEANS "LABEL FAILURE" IN LINE SAVING PROTOCOL.
1975          JRST [ MOVEI T,3       ;IGNORE COMMAND AND THREE ARGS.
1976                 CAMLE T,TICC(I)
1977                  PUSHJ P,UFLS
1978                 PUSHJ P,TYIREM
1979                 PUSHJ P,TYIREM
1980                 PUSHJ P,TYIREM
1981                 JRST TYI1B1]
1982 TYI2Z:  MOVE T,TTYSTS(I)
1983         TLNE T,%TSCNS
1984          SKIPGE SUPPRO(U)
1985           JRST TYI3             ;DEFERRED CALL IGNORED IF TOP-LEVEL, OR NOT A CONSOLE
1986         CAIN TT,%TXTOP+"Z
1987          JRST [ TRNE R,%TIPEK   ;DEFERRED CALL
1988                  PUSHJ P,TYIREM ;REMOVE IT IF DIDN'T ALREADY
1989                 MOVSI T,(%PIDCL)
1990                 JRST UUOER1 ]
1991 TYI3:   MOVSI TT,%TSACT
1992         ANDCAM TT,TTYSTS(I)
1993 ;TYIFLS CAN COME HERE AFTER THROWING AWAY 1 WORD FROM STACK, FOR NO CHARS AVAIL WITH %TINWT.
1994 TYI4:   MOVSI TT,%SSINT ;IF TTY IS STY'S, MAKE SURE NEXT TTY IOT GIVES STY OUTPUT INT.
1995         MOVE B,TTYTYP(I)
1996         TRNE B,%TYSTY
1997          ANDCAM TT,STYSTS-NFSTTY(I)
1998         SKIPGE A,D              ;CHAR IN A FOR TYINRM
1999          POPJ P,                ;DON'T CANONICALIZE A -1 (NO CHARS AVAILABLE) TO A RUBOUT!
2000         PUSHJ P,TYINRM          ;CANONICALIZE TO ASCII UNLESS %TIFUL IS SET.
2001         ANDI D,%TXPIE\%TXMPE\%TXECI     ;BUT PRESERVE THE EXTRA INFO BITS
2002         IOR D,A                 ;WHICH ARE NOT REALLY PART OF THE CHARACTER.
2003         ANDI A,%TXASC
2004         POPJ P,
2005 \f
2006 ;ASSUME R HAS IOCHNM BITS (OR AT LEAST THE %TIFUL BIT).
2007 ;TURN CHAR. IN A TO 7-BIT ASCII CHAR IF %TIFUL IS OFF.
2008 TYINRM: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
2009         TRNE R,%TIFUL
2010          POPJ P,
2011         MOVE TT,A               ;LEAVE THE HELP CHARACTER ALONE
2012         ANDI TT,%TXTOP+%TXASC   ;(THIS USED TO FLUSH THE SUPER ("SHIFT") BIT
2013         CAIN TT,%TXTOP+"H       ; PERHAPS IT SHOULD FLUSH ALL OF CTL/MTA/SUP?)
2014          POPJ P,
2015 TYINR2: ANDI A,%TXCTL+%TXASC    ;FLUSH THE EXTRA BITS.
2016         TRZE A,%TXCTL   ;DON'T WANT FULL CHAR SET: TURN CTL+X INTO ASCII CTL-X
2017          CAIN A,177     ;BUT LEAVE CTL-RUBOUT AS RUBOUT, FOR TECO'S SAKE.
2018           POPJ P,
2019         CAIGE A,77              ;CTL-? => RUBOUT
2020          JRST [ CAIN A,40       ;CTL-SPACE => CTL-@
2021                  MOVEI A,^@     ;41-76 STAY THE SAME
2022                 POPJ P, ]       ;LETTERS TURN INTO ASCII CONTROLS
2023         CAIL A,140      ;TO CONTROLIFY, FIRST TURN LOWER CASE TO UPPER,
2024          SUBI A,40
2025         XORI A,100      ;THEN TOGGLE 100 BIT, TURNING A INTO ^A AND ? INTO RUBOUT.
2026         POPJ P,
2027
2028 ;REMOVE THE FIRST CHAR. FROM THE INPUT BUFFER, AND RETURN IT IN D.
2029 ;UPDATES ALL COUNTS AND POINTERS. HALTS IF BUFFER EMPTY.
2030 ;CLOBBERS B,TT.
2031 TYIREM: CONO PI,TTYOFF
2032         PUSHJ P,TYIRE1
2033         JRST TTYONJ
2034
2035 TYIRE1: SOSGE TICC(I)   ;ENTRY WHEN TTYCHN IS OFF.
2036          BUG PAUSE,[TTY: BUFFER EMPTY AT TYIREM]
2037         MOVE B,TIOP(I)  ;SAVE COPY OF BUFFER-EMPTYING POINTER IN TT.
2038         MOVE TT,B
2039         CAMN B,TIBEP(I) ;ADVANCE THE POINTER, FETCHING THE CHARACTER.
2040          SUBI B,TIBL
2041         ILDB D,B
2042         MOVEM B,TIOP(I)
2043         TRNE D,%TXACT   ;IF CHAR SAYS IT WAS AN ACTIVATION CHAR, UPDATE # OF ACTIVATION
2044          SOS TACC(I)    ;CHARS STILL INB THE BUFFER.
2045         TRNE D,%TXPIE   ;IF IT NEEDED PI ECHO,
2046          SOS ECHOC(I)   ;ONE FEWER CHAR AWAITS PI ECHO.
2047         TRNE D,%TXINT
2048          SOS TINTC(I)   ;SIMILAR FOR INT. TO PROGM.
2049         SKIPL TINTC(I)
2050          SKIPGE ECHOC(I)
2051           BUG PAUSE,[TTY: TINTC OR ECHOC OVER-DECREMENTED]
2052         CAMN TT,ECHOP(I) ;IF ECHOP POINTED AT THIS CHAR,
2053          MOVEM B,ECHOP(I) ;ADVANCE IT.
2054         CAMN TT,TINTP(I) ;SIMILAR FOR TINTP
2055          MOVEM B,TINTP(I)
2056         POPJ P,
2057 \f
2058 ;COME HERE WHEN ABOUT TO WAIT FOR A CHAR'S %TXINT TO CLEAR OUT.
2059 ;CLOBBERS D, TT; MAY ZERO %TXINT IN T, IN WHICH CASE CALLER SHOULD
2060 ;NOT BOTHER TO WAIT FOR %TXINT TO CLEAR.
2061 TYIIWT: MOVE D,MSKST2(U)
2062         AND D,TYIMSK(I) ;D GETS ENABLED TTY INPUT CHANNELS.
2063         MOVE TT,D
2064         ANDCM TT,IDF2(U) ;TT GETS ENABLED, UNDEFERRED TTY INPUT CHANNELS.
2065         TDNE TT,IFPIR(U) ;IF AN INTERRUPT IS PENDING ON ONE OF THEM, %TXINT
2066          POPJ P,        ;WILL CLEAR IF WE LET THE INT. HAPPEN.
2067         MOVN TT,D       ;ELSE GET LOWEST NUMBERED ENABLED INPUT CHANNEL'S BIT
2068         AND D,TT
2069         AND D,IDF2(U)   ;IF THAT CHANNEL ISN'T DEFFERED,
2070         IORM D,IFPIR(U) ;REQUEST AN INTERRUPT ON IT, AND WE CAN STILL WIN.
2071         JUMPN D,CPOPJ
2072         ANDCMI T,%TXINT ;CAN'T RQ AN INT, SO BIT WON'T BE CLEARED, IT IS CERTAIN,
2073         POPJ P,         ;SO GIVE UP ON WAIITING FOR IT TO CLEAR.
2074
2075 ;COME HERE TO HANG UP FOR INPUT. LIKE UFLS BUT PREVENTS
2076 ;A **MORE** THIS TIME AROUND THE SCREEN, ON GROUNDS THAT USER
2077 ;HAS COMMANDED THE OUTPUT FOR 1 MORE PAGE AT LEAST.
2078 ;IF %TINWT IS SET, INSTEAD OF HANGING, THROW AWAY RETURN ADDRESS
2079 ;AND JUMP TO TYI4, TO RETURN -1 FROM THE IOT.
2080 ;CLOBBERS A,D,H.
2081 TYIFLS: TRNE R,%TINWT
2082          JRST [ SUB P,[1,,1]
2083                 SETO D,
2084                 JRST TYI4]
2085 ;ENTER HERE FROM ECHOIN - R IS NOT MEANINGFUL.
2086 TYIFL2: MOVE H,TTYOPT(I)
2087         TLNE H,%TOMVU   ;THIS DOESNT APPLY TO ARDS-LIKE DISPLAYS
2088          TLNE H,%TOERS
2089           SKIPA D,I
2090            JRST UFLS
2091         IMULI D,TPLEN*2
2092         MOVEI A,%TFEOP
2093         ANDCAM A,TPFLAG(D)      ;CLEAR PENDING MORE
2094         HLL D,TTYSTS(I)
2095         MOVE A,TCMXV(I) .SEE TPVE;(D)
2096         TLNE H,%TOMVU           ;PRINTING TTY'S AND DISPLAYS IN SCROLL MODE
2097          TLNE D,%TSROL          ;DO ONE THING.
2098           JRST TYIFL1
2099         CAME A,TPVB+TPLEN(D)    ;FOR WRAP-AROUND DISPLAYS,
2100          JRST UFLS              ;IF NOT USING AN ECHO AREA,
2101         MOVEI A,6               ;PREVENT MORES FOR THE NEXT 6 LINES.
2102         MOVEM A,TPVM(D)
2103         JRST UFLS
2104
2105 TYIFL1: SUB A,TTYROL(I) ;IN SCROLL MODE, **MORE** WHEN THIS LINE GOES OFF THE SCREEN.
2106         MOVEM A,TPVM(D)
2107         JRST UFLS
2108 \f
2109 SUBTTL TTY OUTPUT IOT
2110
2111 ;THESE PUSHED BY TYOSET, REFERENCED INDEX OF J.
2112 TYOPV0==0       ;COUNT OF NUMBER OF CHARACTERS THAT WE CAN TAKE A SHORTCUT FOR,
2113                  ;IN SUPERIMAGE MODE SIOT.
2114 ;TYOPV1 UNUSED, BUT SPACE ALLOCATED.
2115 TYOPV2==2       ;-> IOCHNM WORD OF CHANNEL IOT IS ON.
2116 TYOPV3==3       ;PC PPR IDX,,TTY #.
2117
2118
2119 ;TO OUTPUT TO A TTY (R -> IOCHNM WD OF TTY CHNL)
2120 ;       JSP E,TYOSET    ;WAIT TILL JOB HAS TTY AND OUT OF COM MODE,
2121 ;                       ;INIT FOR PCLSRING, PUSH VARS ON STACK.
2122 ;        JRST IGNORE    ;TYOSET RETURNS HERE IF THIS OUTPUT SHOULD BE DISCARDED.
2123 ;        ...            ;OUTPUT 1 OR MORE CHARS TO TTY
2124 ;                       ;MEANWHILE, J -> BLOCK OF 4 STACK VARS.
2125 ;       POPJ P,         ;RETURNS TO TYOUNS TO FLUSH STACK, ETC.
2126
2127 TYOSET: PUSHJ P,TTYWO   ;WAIT TILL THIS JOB HAS OUTPUT PERMISSION.
2128          JRST (E)       ;RETURN IF OUTPUT BEING IGNORED.
2129         AOS E           ;SKIP THAT RETURN IF WE ARE GOING TO DO THE OUTPUT.
2130         JUMPN U,TYOSE3
2131         MOVEI T,TYOWNC  ;FOR SYSTEM JOB, CHECK TTOALC WITH A TIMEOUT IN CASE
2132         SKIPL TTOALC(I) ;THE TTY IS FORGETTING TO TURN TYPEOUT BACK ON.
2133          PUSHJ P,TYOW2
2134         JRST TYOSE4     ;NOTE THAT TYOW2 CAN POP1J.
2135
2136 TYOSE3: SKIPL TTOALC(I) ;^\ CAN DELAY TYPEOUT AT M.P. LEVEL THROUGH SIGN OF TTOALC.
2137          PUSHJ P,UFLS   ;ALSO USED BY OUTPUT RESET ON SOFTWARE TTY.
2138 TYOSE4: MOVEI J,1(P)    ;PROVIDE SPACE FOR TEMPS, WHERE FINSET CAN FIND THEM.
2139         ADD P,[2,,2]
2140         PUSH P,R        .SEE TYOPV2
2141         MOVE H,TTYOPT(I)
2142         MOVSI T,%TCLFT+%TCOCO+%TCICO
2143         SKIPGE TTYCOM(I)
2144          PUSHJ P,TTYCMW ;WAIT TILL TTY IS NOT IN COM MODE, OR OVER-RIDDEN.
2145         CONO PI,TTYON
2146         MOVEI A,%TJCNS+77+%TJCP1+%TJCP2+%TJSTP+%TJINK ;DON'T LET THESE IOCHNM BITS BE CHANGED
2147         ANDCAB A,CTLBTS(U) ;EVEN TEMPORARILY.
2148         HRLZS A         ;ELSE, IF A BIT IS SET IN THE CTL BITS,
2149         XORB A,(R)      ;CHANGE IT (TEMPORARILY) IN IOCHNM WORD.
2150         PUSHJ P,LOSSET  ;SET UP ROUTINE TO UNDO THAT TEMPORARY CHANGE
2151          [MOVE A,AC0S+J(U)      ;IF WE SHOULD PCLSR OUT
2152           HLRZ T,@TYOPV2(A)
2153           XOR T,CTLBTS(U)
2154           HRLM T,@TYOPV2(A)
2155           POPJ P,]
2156         HLRZS A
2157         TRNE A,%TJSTP   ;IF WE ARE HUNG IN A **MORE**, WAIT TILL THERE'S A CHARACTER
2158          PUSHJ P,TYOSMR ;IT'S IMPORTANT WE WAIT WITOUT TYOSW SET - ELSE NO ECHOING!
2159         MOVE TT,I       ;NOW MAKE TT -> APPRO. PC PPR FOR THIS CHNL.
2160         IMULI TT,TPLEN*2
2161         TRNE A,%TJPP2
2162          MOVE TT,TTYEPP(I)
2163 TYOSE1: PCLT            ;ENTER HERE FROM INPUT IOT WHEN DOING M.P. ECHOING
2164         AOSE TYOSW(I)   ;SEIZE THIS TTY FOR MP LEVEL.
2165          JRST [SKIPL TYOSW(I)
2166                 PUSHJ P,UFLS
2167                 JRST .-1]
2168         PUSHJ P,LSWDEL  ;THEN SET UP LOSSET ROUTINE FOR BOTH TYOSW AND 
2169         PUSHJ P,LOSSET  ;PREVIOUSLY-LOSSET'ED CHANGE TO IOCHNM BITS.
2170          [MOVE A,AC0S+J(U)
2171           HLRZ T,@TYOPV2(A)
2172           XOR T,CTLBTS(U)
2173           HRLM T,@TYOPV2(A)
2174           MOVE A,TYOPV3(A)
2175           SETOM TYOSW(A)
2176           POPJ P,]
2177         CAMN TT,TTYLPP(I) ;IF TTY IS ASSOCIATED W/ ANOTHER PC PPR,
2178          JRST TYOSE2
2179         PUSH P,TT
2180         SKIPL TT,TTYLPP(I)
2181          PUSHJ P,TYOMVC ;DISASSOCIATE THEM.
2182         POP P,TT
2183         SETCAM TT,TTYLPP(I)
2184 TYOSE2: PUSH P,I        .SEE TYOPV3
2185         HRLM TT,(P)
2186         MOVE Q,TTYCOM(I)
2187         TLNE Q,%TCECH   ;IF THERE'S ECHOING OUTPUT IN OUTPUT BUFFER,
2188          JRST [ PCLT    ;WAIT FOR IT TO GET PRINTED. MUSTN'T HAVE ECHO AND
2189                 PUSHJ P,TYOWC   ;OUTPUT IN THE OUTPUT BUFFER AT ONE TIME.
2190                 MOVSI Q,%TCECH
2191                 ANDCAB Q,TTYCOM(I)
2192                 JRST .+1]
2193         TLNE Q,%TCMTR   ;IF THIS TTY IS A TERMINET & ITS MOTOR IS OFF,
2194          PUSHJ P,TTTMTO ;TURN THE MOTOR ON BEFORE OUTPUT.
2195         PUSHJ P,(E)
2196
2197 TYOUNS: CAIA            ;IF WE ARE SKIPPED INTO, PROPAGATE THE SKIP.
2198          AOS -4(P)
2199         SUB P,[4,,4]
2200
2201 TYOUN1: HRLZ R,CTLBTS(U) ;UNDO TEMPORARY CHANGES IN IOCHNM WD.
2202         XORM R,@TYOPV2(J)
2203         PUSHJ P,LSWDEL
2204         SKIPGE TTYERQ(I) ;IF ECHOING ISN'T ALREADY REQUESTED,
2205         SKIPL TTYLPP(I) ;AND THERE IS BUFFERED CURSOR POSITIONING,
2206          JRST TYOUN3
2207         CONO PI,TTYOFF
2208         MOVEI J,TTEDMY  ;SO TYOFNR WON'T CLOBBER RANDOMNESS.
2209         SETCM TT,TTYLPP(I) ;TT -> PC PPR TTY WAS DISSOCIATED FROM.
2210         MOVE H,TTYOPT(I)
2211         MOVE A,TORM(I)
2212         CAIN A,TOBS     ;AND IT CAN BE DONE NOW,
2213          PUSHJ P,TYOFRC ;FORCE OUT BUFFERED CURSOR MOTION.
2214         SETOM TYOSW(I)
2215         JRST TTYONJ
2216
2217 TYOUN3: SETOM TYOSW(I)  ;RELEASE TTY.
2218         POPJ P,
2219
2220 ;WAIT TILL THERE'S A TTY INPUT CHARACTER.
2221 TYOSMR: PUSH P,A
2222         PUSH P,R
2223         MOVEI R,%TIACT+%TIECH+%TIPEK
2224         PUSHJ P,TYI0
2225         POP P,R
2226         JRST POPAJ
2227 \f
2228 ;OUTPUT IOT
2229
2230 ;BLOCK MODE.
2231 TTYBO:  JSP E,TYOSET
2232          JRST TTYBOI
2233         JSP E,NBTOCH
2234 TTYBO3: CAIN A,EOFCH
2235          POPJ P,
2236         PUSH P,TT
2237         PUSHJ P,TTYBO1
2238         POP P,TT
2239         MOVEI E,TTYBO3
2240         POPJ P,
2241
2242 ;IGNORE SOME BLOCK MODE OUTPUT.
2243 TTYBOI: XCTR XRW,[MOVES D,(C)]
2244         TLO D,700000
2245         HLRE A,D
2246         MOVNS A
2247         HRLS A
2248         ADD D,A         ;COUNT THE AOBJN POINTER ALL THE WAY OUT.
2249         XCTR XRW,[MOVEM D,(C)]
2250         POPJ P,
2251
2252         JRST TYOBP      ;SIOT DISPATCH IS -1 + ADDR. OF UNIT MODE ROUTINE.
2253 ;UNIT MODE TTY OUTPUT.
2254 TYO:    JSP E,TYOSET
2255          POPJ P,        ;JUST RETURN IF WE ARE SUPPOSED TO DISCARD THE OUTPUT.
2256         SKIPGE C
2257          SKIPA A,(C)
2258           UMOVE A,(C)
2259 ;MUSTN'T CLOBBER C OR D.
2260 TTYBO1: HLRZ R,@TYOPV2(J) ;RH(R) GETS LH(IOCHNM WD)
2261         HRRZ I,TYOPV3(J)
2262         HLRZ TT,TYOPV3(J)
2263 TYOBP2: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
2264         SKIPGE E,TTYCOM(I);IN COM MODE W/ LOCAL FEED THRU,
2265         TLNN E,%TCLFT
2266          JRST TYO6
2267         PUSH P,C
2268         PUSH P,D
2269         PUSH P,U
2270         PUSH P,TT       ;ECHO CHAR ON ALL TTYS IN LOOP
2271         PUSH P,R        ;THAT HAVE REMOTE-FEED-THRU.
2272         PUSHJ P,TYCREP  ;DO FOLLOWING INSN FOR EACH TTY IN LOOP.
2273             PUSHJ P,TYO7 ;(# OF TTY DOING IT FOR PUT IN I)
2274          JFCL            ;(TYCREP WILL SKIP IF THAT INSN ALWAYS DOES)
2275         POP P,R
2276         POP P,TT
2277         POP P,U
2278         POP P,D
2279         POP P,C
2280         JRST TYO6
2281
2282 TYO7:   MOVE D,TTYCOM(I) ;IF THIS TTY WANTS MY TYPEOUT.
2283         TLNE D,%TCRFT
2284         CAMN I,-2(P)    ;AND IF IT ISN'T ME,
2285          JRST POPJ1
2286         PUSHJ P,TYCSET  ;SET UP ACS Q,R,U FOR TTY TO ECHO ON.
2287         CONO PI,TTYOFF
2288         PUSH P,A
2289         PUSHJ P,TTYI13  ;ECHO CHAR ON THIS TTY.
2290         CONO PI,TTYON
2291         JRST POPAJ1
2292
2293 ;SIOT ROUTINE FOR TTY OUTPUT - JUST LIKE REPEATED UNIT MODE,
2294 ;BUT MOVES THE TYOSET OUTSIDE THE LOOP TO SAVE TIME.
2295 TYOBP:  MOVEM B,SRN3(U) ;SAVE B, C; CAN'T USE STACK SINCE TYOSET PUSHES.
2296         MOVEM C,SRN4(U)
2297         JSP E,TYOSET    ;SET UP FOR DOING TTY OUTPUT.
2298          JRST TYOBPI    ;RETURN HERE IF WE SHOULD DISCARD THE OUTPUT
2299         HLRZ R,@TYOPV2(J)       ;FOR TYOFRC
2300         CAME TT,TTYLPP(I)
2301          TRNN R,%TJSIO  ;ONLY IN SUPER-IMAGE MODE,
2302           CAIA
2303            PUSHJ P,TYOFRC       ;FORCE OUT ALL PREVIOUS MAIN PROGRAM CURSOR MOTION
2304         MOVE B,SRN3(U)  ;BE JUST LIKE ORDINARY REPEATED-UNIT-MODE SIOT,
2305         MOVE C,SRN4(U)  ;EXCEPT THAT THE TYOSET IS OUTSIDE THE LOOP.
2306         SETOM TYOPV0(J) ;CAN'T TAKE SHORTCUT AT FIRST.
2307         MOVE D,[%IOTOT,,.+2]
2308         JRST NSIOT1     ;SIOT ROUTINE WILL COME BACK FOR EACH CHAR, PRESERVING I,J,TT
2309         HLRZ R,@TYOPV2(J)
2310         MOVE A,D        ;PUSHJ HERE FOR EACH CHARACTER.
2311         SOSG TYOPV0(J)  ;PERHAPS THE PREVIOUS CHARACTER DISCOVERED WE CAN
2312                          ;START TAKING THE SHORTCUT.
2313          JRST TYOBP2    ;IF NOT, DO THE WHOLE PILE OF WORK.
2314         ANDI A,%TXDIS+%TXASC
2315         SKIPGE E,TTYCOM(I)
2316          TLNN E,%TCLFT  ;SHORT CUT IS TO PUT THE CHARACTER RIGHT IN THE OUTPUT BUFFER.
2317           JRST TYONCC   ;MAY BE USED ONLY FOR SUPERIMAGE OUTPUT.
2318         JRST TYOBP2     ;AND BETTER NOT BE IN COM MODE WITH LOCAL FEED THRU.
2319
2320 ;IGNORE THIS STRING OF OUTPUT; TELL THE USER WE OUTPUT IT.
2321 TYOBPI: MOVE B,SRN3(U)
2322         MOVE C,SRN3(U)
2323         UMOVE T,(B)
2324         UMOVE TT,(C)
2325         JUMPE C,POPJ1
2326         IBP T
2327         SOJG TT,.-1
2328         XCTR XRW,[MOVEM T,(B)]
2329         XCTR XRW,[MOVEM TT,(C)]
2330         JRST POPJ1
2331 \f
2332
2333 ;A USUALLY HOLDS THE CHAR BEING IOTTED, OR THE CHAR TO BE PUT IN BUFFER.
2334 ;B IS A TEMP.
2335 ;C IS USUALLY UNUSED, AND MUSTN'T BE CLOBBER BY IOT RTN.
2336 ;D "
2337 ;E IS A TEMP.
2338 ;TT HOLDS THE INDEX OF THE PC PPR BEING USED.
2339 ;I HOLDS THE TTY NUMBER.
2340 ;H HOLDS THE TTY'S TTYOPT WORD.
2341 ;J HOLDS THE INDEX OF A 4-WORD BLOCK USUALLY ON THE STACK
2342 ;       INDEX USING TYOPV0, TYOPV1, TYOPV2, TYOPV3.
2343 ;T IS A TEMP.
2344 ;R'S RH HOLDS THE IOCHNM WORD'S LH.
2345 ;Q HOLDS THE BP FOR STORING IN OUTPUT BUFFER.
2346 ;       INITTED FROM TOIP, AND STORED BACK IN TOIP WHEN FINALIZED.
2347
2348 TYO6:   PCLT
2349         MOVEI T,TYOWNC ;MAKE SURE AT LEAST TYOWNC
2350         CAML T,TORM(I)  ;CHARS OF SPACE LEFT IN OUTPUT BUFFER.
2351          PUSHJ P,TYOW2  ;NOTE THIS CAN POP1J. SO CAN TYOWN.
2352         MOVE H,TTYOPT(I)
2353 IFN N11TYS,[
2354         TRNN H,%TP11T   ;FOR A PDP11 TV TTY,
2355          JRST TYO8
2356         SKIPL TT11P     ;IGNORE IT IF PDP11 ISN'T UP.
2357          POPJ P,
2358         PUSHJ P,TYOWN   ;WAIT TILL AT LEAST TYOWNC CHARS SPACE.
2359 ]                       ;(TORM HAS NO INFO ON TV TTYS).
2360 ;A,R,I,TT,H,J SET UP AT THIS POINT.
2361 ;ENTER HERE FROM PI LEVEL TO ECHO CHARS
2362 TYO8:   MOVE Q,TOIP(I)  ;GET COPY OF BP TO STORE WITH.
2363                 ;WHEN OUTPUTTING CHARS, WILL UPDATE Q INSTEAD TOIP.
2364                 ;THEN, WHEN CAN NO LONGER PCLSR, DO TOIP(I)_Q.
2365         MOVE B,TPFLAG(TT)
2366 TYOIG1: TRNE B,%TFEOP+%TFIGL    ;ANY EXCEPTIONAL CONDITION FOR THIS PC PPR?
2367          JRST TYOIGL    ;IF SO, HANDLE IT.
2368 TYOEO9: TRNE R,%TJCP1+%TJCP2+%TJSTP+%TJSIO+%TJINK
2369          JRST TYOCP1    ;HANDLE ANY EXCEPTIONAL CONDITION FOR CHANNEL.
2370         TRNE A,%TXCTL+%TXMTA+%TXSUP+%TXTOP
2371          JRST TYOMTA    ;TAKE CARE OF FUNNY BITS IN CHARACTER.
2372 TYOMT9: CAILE A,40
2373          JRST TYONRM    ;PRINTING CHARS AND RUBOUT.
2374         CAIN A,40
2375          JRST TYOSPC    ;SPACE MAY BE EITHER PRINTING OR CURSOR MOTION.
2376         CAIL A,^G       ;< ^G OR > ^S => NORMAL CTL CHAR,
2377 IFE 0,  CAIL A,^Q       ;RIGHT NOW, ^S USES %TGIMG OF GROUP 0.
2378 IFN 0,  CAIL A,^T       ;BUT FOR INPUT, IT USES GROUP 6. THIS INSN MAKES IT USE GROUP 6 FOR OUTPUT TOO.
2379          JRST TYOCTL
2380         JRST @.+1-^G(A) ;ELSE DO WHAT THIS PARTICULAR ONE WANTS.
2381
2382         TYOBEL          ;^G DOESN'T MOVE CURSOR.
2383         TYOBS           ;^H MOVES BACKWARDS.
2384         TYOTAB          ;^I MOVES TO TAB STOP.
2385         TYOLF           ;^J IS LINEFEED.
2386         TYOCTL          ;^K IS NORMAL.
2387         TYOFF           ;^L MAY CAUSE A **MORE**
2388         TYOCR           ;^M IS A CARRET
2389         TYOCTL          ;^N IS NORMAL
2390         TYOCTL          ;^O IS NORMAL
2391         TYOCTP          ;^P MAY SIGNIFY A CURSOR CTL CODE.
2392         TYOCTL          ;^Q IS NORMAL
2393         TYOCTL          ;^R IS NORMAL
2394         TYOCTS          ;^S IS NORMAL EXCEPT USES A DIFFERENT GROUP'S %TGIMG.
2395 \f
2396 ;OUTPUT CHARACTER IN SUPERIMAGE MODE.
2397 TYOSIO: ANDI A,377
2398         MOVEI B,TYOWNC  ;IF WE'VE GOT THIS FAR, THEN THERE'S AT LEAST TYOWNC CHARS OF SPACE,
2399         CAME TT,TTYLPP(I)       ;IF DISSOCIATED,
2400          PUSHJ P,[
2401                 PUSH P,Q
2402                 PUSHJ P,TYOASS  ;ASSOCIATE,
2403                 POP P,T
2404                 CAME T,Q        ;AND IF THAT REQUIRED OUTPUT,
2405                  SUBI B,5       ;THAT'S SO MANY FEWER CHARS BEFORE TIME TO CHECK TORM AGAIN.
2406                 POPJ P,]
2407         MOVEM B,TYOPV0(J) ;AND NO UNUSUAL CONDITIONS, SO SIOT CAN GO FAST FOR A WHILE.
2408 ;OUTPUT A CHAR WITH NO CURSOR CONTROL.
2409 ;ASSUMES ITS POSITION DOESN'T MATTER.
2410 TYONCC: PUSHJ P,TYOOUT
2411         JRST TYOFN2
2412
2413 ;COME HERE WHEN ^P IS OUTPUT.
2414 TYOCTP: TRNN R,%TJDIS   ;IS THIS OUTPUT CHNL TREATING ^P SPECIALLY?
2415          JRST TYOCTL    ;NO, TREAT ^P AS NORMAL CTL CHAR.
2416         TRO R,%TJCP1    ;YES, SAY TREAT NEXT CHAR AS CURSOR CODE.
2417         JRST TYOFNR
2418
2419 ;COME HERE TO OUTPUT A ^S.
2420 TYOCTS: CAME TT,TTYLPP(I)
2421          PUSHJ P,TYOASS ;PREPARE TO OUTPUT PRINTING CHARACTERS.
2422         HLLZ T,TTYST2(I) ;GET THE RELEVANT %TGIMG BIT.
2423         TLZ T,#<%TGIMG_12.>
2424         JRST TYORU2
2425
2426 ;HERE TO OUTPUT ^G
2427 TYOBEL: MOVEI A,%TDBEL
2428         JRST TYONCC
2429
2430 ;COME HERE FOR ^PP - OUTPUT A ^P.
2431 TYOCPP: SKIPA A,[^P]
2432
2433 ;COME HERE FOR ^PQ TO OUTPUT A ^C.
2434 TYOCPQ:  MOVEI A,^C
2435
2436 ;COME HERE FOR NORMAL (NON-FORMATTING) CONTROLS.
2437 TYOCTL: CAME TT,TTYLPP(I)
2438          PUSHJ P,TYOASS ;PREPARE TO OUTPUT PRINTING CHARACTERS.
2439         CAIN A,33
2440          JRST TYOALT    ;CHECK FOR ALTMODE.
2441         HLLZ T,TTYST1(I) ;GET THE "OUTPUT IN IMAGE MODE" BIT THAT'S RELEVANT.
2442         TLZ T,#<%TGIMG_12.>
2443 TYORU2: TRNE R,%TJECH   ;ECHO-MODE OUT => PRINT IN ASCII MODE.
2444          JRST TYOCT1
2445         MOVE B,TTYSTS(I)
2446         TLNE B,%TSSAI   ;SHOULD USE SAIL CHAR SET FOR OUTPUT => DO SO.
2447          JRST TYONR0
2448         JUMPN T,TYOAL1  ;IF "OUTPUT IN IMAGE" IS SET, GO DO SO.
2449 TYOCT1: HRLM A,(P)      ;ELSE OUTPUT CTL CHAR IN ASCII MODE,
2450         MOVEI A,"^      ;AS "^" FOLLOWED BY UN-CTL'ED CHAR.
2451         TLNE H,%TOSAI
2452          MOVEI A,13     ;IF TTY HAS SAIL MODE, USE A SAIL UPARROW.
2453         PUSHJ P,TYONR1
2454         HLRZ A,(P)
2455         XORI A,100
2456         JRST TYONR0
2457
2458 TYOAL1: TLNN H,%TOSAI
2459          JRST TYORU1
2460         JRST TYONR0
2461 \f
2462 ;HANDLE CHARACTERS WHICH HAVE %TXCTL, %TXMTA, %TXSUP OR %TXTOP SET.
2463 TYOMTA: MOVE B,TTYSTS(I)
2464         TLNN B,%TSFCO           ;IF USER DOESN'T WANT FULL CHAR SET OUTPUT,
2465          JRST TYOMT4            ;IGNORE THE META BITS (USUALLY).
2466         TRNE A,%TXCTL
2467          PUSHJ P,TYOMT1         ;ECHO AN ALPHA FOR %TXCTL.
2468         TRZE A,%TXMTA
2469          PUSHJ P,TYOMT2         ;TYPE A BETA FOR %TXMTA
2470         TRZE A,%TXSUP
2471          PUSHJ P,TYOMT5
2472         TRZN A,%TXCTL+%TXTOP    ;IF CTL OR TOP IS SET, THE CHARACTER
2473          JRST TYOMT9
2474         CAIN A,40               ;ISN'T AN ASCII CONTROL CHAR EVEN IF < 40
2475          JRST TYOSPC            ;(BTW, SPACE IS STILL SPACE)
2476         CAIE A,177
2477          CAIG A,40
2478 TYOMT3:   TLNE H,%TOSAI
2479            JRST TYONRM
2480         CAME TT,TTYLPP(I)       ;WE HAVE WHAT WOULD OTHERWISE BE AN ASCII CTL CHAR.
2481          PUSHJ P,TYOASS
2482         CAIN A,33
2483          JRST TYOAL3
2484         JRST TYOCT1
2485
2486 TYOMT5: MOVEI B,6               ; EPSILON
2487         JRST TYOMT6
2488
2489 TYOMT1: SKIPA B,[2]             ; ALPHA
2490 TYOMT2:  MOVEI B,3              ; BETA
2491 TYOMT6: CAME TT,TTYLPP(I)
2492          PUSHJ P,TYOASS
2493         PUSH P,A
2494         MOVE A,B
2495         PUSHJ P,TYONR1
2496         JRST POPAJ
2497
2498 TYOMT4: TRNN R,%TJECH   ;FOR OUTPUT, IGNORE THE META BITS.  FOR ECHO,
2499          ANDI A,%TXASC  ; TRY TO ECHO WHAT THE GUY TYPED.
2500         TRNE A,%TXTOP   ;IF TOP IS ON,
2501          TLNN H,%TOSAI  ;AND THE TTY HAS THE SAIL CHAR SET,
2502           TRZA A,%TXMTA+%TXSUP+%TXTOP
2503            JRST TYONR3  ;ECHO THE CHAR USING SAIL CHAR SET.
2504         PUSHJ P,TYINR2  ;ECHO AS WHAT PROGRAM SEES
2505         JRST TYOMT9     ;ALSO HACKS SUCH AS ^L MAY CLEAR THE SCREEN
2506 \f
2507 ;HANDLE SPACE: ON OVERPRINTING TERMINALS, SPACE = ^PF.
2508 ;ON IMLACS, SPACE = SPACE BECAUSE THE IMLAC PROGRAM LOSES FOR ^PF AT END OF LINE.
2509 ;ON RAW TERMINALS, SPACE OF COURSE GOES OUT AS SPACE.
2510 ;ON OTHER TERMINALS, SPACE = SPACE.  THIS IS A CROCK, BUT IT IS NECESSARY
2511 ;BECAUSE ^PF TAKES 6 TIMES AS LONG ON DATAPOINTS BECAUSE OF PADDING,
2512 ;AND TWICE AS LONG ON VT52S BECAUSE IT TAKES TWO CHARACTERS.
2513
2514 TYOSPC: TLNN H,%TOOVR           ;NON-OVERPRINTING => OUTPUT A REAL SPACE.
2515          JRST [ TLNE H,%TOMVU
2516                  JRST TYONRM
2517                 HLRE B,TTYLPS(I) ;BUT ON GLASS TTY'S (NON-OVERPRINTING, NO UPWARD MOTION)
2518                 CAMGE B,TPVP(TT)
2519                  JUMPGE B,.+1   ;IT IS SAFE TO TREAT SPACES AS CURSOR MOTION
2520                 JRST TYONRM]    ;IF THEY ARE GOING TO FOLLOW DOWNWARD MOTION ANYWAY.
2521         TLNE H,%TORAW+%TOIML    ;IMLAC, OR NO OPTIMIZATION => OUTPUT A REAL SPACE.
2522          JRST TYONRM    ;NORMAL CHARACTER.
2523         CAMN TT,TTYLPP(I)
2524          PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
2525         AOS B,TPHP(TT)  ;MOVE FORWARD 1 POS.
2526         CAML B,TCMXH(I) .SEE TPHE;(TT)
2527         TRNE R,%TJCTN
2528          JRST TYOFNR
2529         SOS TPHP(TT)    ;IF NECESSARY, CONTINUE TO NEXT LINE AND RETRY.
2530         PUSHJ P,TYOCTN
2531         JRST TYOSPC
2532
2533 TYONR3: ANDI A,%TXASC
2534 ;OUTPUT A NORMAL CHARACTER, AND FINALIZE. COME HERE FOR
2535 ;NORMAL CHAR ACTUALLY IOTTED.
2536 TYONRM: CAME TT,TTYLPP(I) ;ABOUT TO OUTPUT PRINTING CHARS SO
2537          PUSHJ P,TYOASS ;FORCE ANY CURSOR MOTION INTO OUTPUT BFR
2538         CAIN A,177
2539          JRST TYORUB
2540
2541 ;CALL HERE TO OUTPUT NORMAL CHAR, IF CURSOR POSITIONING KNOWN
2542 ;NOT TO BE NECESSARY.
2543 TYONR0: PUSH P,[TYOFNA] ;CAUSE FINALIZATION WHEN FINISHED.
2544
2545 ;CALL HERE TO OUTPUT NORMAL CHAR AS PART OF TASK OF OUTPUTTING
2546 ;SOME LARGER GROUP. DOESN'T FINALIZE, IN CASE WE PCLSR LATER.
2547 TYONR1: AOS B,TPHP(TT)  ;ADVANCE CURSOR OF PC PPR 1 SPACE.
2548         CAML B,TCMXH(I) .SEE TPHE;(TT)  ;NOT YET AT END OF LINE => OUTPUT CHAR.
2549         TRNE R,%TJCTN   ;AT END: NO CONTIN => OUTPUT,
2550          JRST TYOOUT
2551         PUSHJ P,TYONR2  ;CONTINUE THE LINE (NOTE CURSOR POS FOR
2552         CAME TT,TTYLPP(I)       ;THE "!" WAS ALREADY DONE)
2553          PUSHJ P,TYOASS ;TYONR2 DISSOCIATED THE TTY
2554         JRST TYONR1     ;BUT TYONR1 NEEDS IT ASSOCIATED.
2555
2556 ;TYPE "!<CR><LF>" TO CONTINUE A LINE.
2557 ;THIS FINALIZES THE !CRLF BUT ALSO REMOVES THE CONDITIONS WHICH
2558 ;CAUSED IT TO BE CALLED; SO PCLSRING IS NO PROBLEM.
2559 ;LEAVES TTY DISSOCIATED FROM PC PPR.
2560 TYOCTN: CAME TT,TTYLPP(I)
2561          PUSHJ P,TYOASS
2562         AOS TPHP(TT)    ;ACCOUNT FOR THE "!".
2563 TYONR2: PUSH P,A
2564         MOVEI A,"!      ;PUT "!" IN OUTPUT BUFFER,
2565         PUSHJ P,TYOOUT
2566         PUSHJ P,TYORCR  ;AND GO TO NEXT LINE.
2567         PUSHJ P,TYOLF
2568         MOVE B,TPFLAG(TT) ;IF THAT LF TOOK US TO LAST LINE,
2569         TRNE B,%TFEOP
2570          JRST TYOEO5    ;DO **MORE** PROCESSING IF NEC.
2571         JRST POPAJ      ;AND RETRY WHATEVER CAUSED CONTINUATION.
2572
2573 ;COME HERE TO OUTPUT A RUBOUT.
2574 TYORUB: TRNN R,%TJECH
2575          JRST TYORU3
2576         TLNN H,%TOERS   ;RUBOUT ON A DISPLAY CONSOLE ECHOES AS DELETE BACKWARDS.
2577          TLNN H,%TOOVR  ;LIKEWISE ON A GLASS TTY
2578           JRST TYODLB
2579 TYORU3: MOVE T,TTYST2(I)
2580         ANDI T,%TGIMG_6 ;GET RUBOUT'S "OUTPUT IN IMAGE MODE" BIT.
2581         JRST TYORU2
2582 \f
2583 ;COME HERE TO OUTPUT A LF. FINALIZES. LEAVES TTY DISSOCIATED.
2584 TYOLF:  CAMN TT,TTYLPP(I) ;BEFORE MUNGING PC PPR'S CURSOR POS,
2585          PUSHJ P,TYOMVC ;MUST DISASSOCIATE TTY'S POS FROM PC PPR.
2586         SOS TPVM(TT)    ;COUNT DOWN # LINES TILL NEXT **MORE**.
2587         AOS B,TPVP(TT)  ;MOVE PC PPR'S CURSOR 1 LINE DOWN.
2588         CAIG B,118.     ;DON'T LET VPOS ON PRINTING TTY GET TOO BIG.
2589         CAML B,TCMXV(I) .SEE TPVE;(TT)  ;END OF RANGE => GO TO TOP OR SCROLL.
2590          JRST TYOLFE
2591 TYOLF0: MOVE A,TTYSTS(I)
2592         TLNE A,%TSMOR   ;IF **MORE** DESIRED,
2593          JRST TYOLF1
2594         ADDI B,1        ;THEN IF ENTERING LAST LINE OF RANGE,
2595         CAME B,TCMXV(I) .SEE TPVE;(TT)
2596          JRST TYOLF1
2597         SKIPGE TPVM(TT) ;UNLESS NOT TIME YET,
2598          SKIPA B,[%TFEOP] ;TELL NEXT OUTPUT ATTEMPT TO CAUSE **MORE**.
2599 TYOLF1:   SETZ B,
2600         PUSH P,B
2601         TLNE H,%TORAW
2602          JRST [ MOVEI A,%TDLF   ;NO OPTIMIZATION =>
2603                 PUSHJ P,TYOOUT  ;OUTPUT A REAL LF (PLUS PADDING)
2604                 PUSHJ P,TYOMVC
2605                 JRST TYOLF5]
2606         TLNN H,%TOERS   ;IF TTY HAS SELECTIVE ERASE,
2607          JRST TYOLF5
2608         PUSH P,TPHP(TT)
2609         PUSHJ P,TYORCR  ;GO TO BEGINNING OF LINE
2610         HLRZ B,TTYLPS(I) ;IF CR AND LF AND CLR-EOL ARE EXACTLY
2611         ADDI B,1        ;WHAT WE NEED,
2612         CAMN B,TPVP(TT)
2613          SKIPN TTYROL(I)        ;AND TTY CAN DO IT, DO THEM ALL AT ONCE.
2614           SKIPA A,[%TDEOL]      ;OTHERWISE, OUTPUT MOVE-CURSOR AND %TDEOL.
2615            SKIPA A,[%TDCRL]     ;OUTPUT %TDCRL = %TDMOV AND %TDEOL TOGETHER.
2616              PUSHJ P,TYOASS
2617         PUSHJ P,TYOOUT
2618         PUSHJ P,TYOMVC
2619         POP P,TPHP(TT)
2620 TYOLF5: POP P,B
2621         IORM B,TPFLAG(TT)
2622         JRST TYOFND
2623 \f
2624 ;LINEFEED THAT WRAPS AROUND.
2625 TYOLFE: MOVE A,TTYSTS(I)
2626         TLNN H,%TOMVU           ;END OF SCREEN ON PRINTING TTY => SCROLL BY 1.
2627          JRST TYOLF2
2628         TLNE A,%TSROL           ;DISPLAY IN SCROLL MODE?
2629         SKIPE TPVB(TT)          ;CAN'T SCROLL UNLESS PC PPR IS WHOLE SCREEN.
2630          JRST TYOLF3
2631 TYOLF2: MOVN A,TTYROL(I)        ;A GETS - # LINES TO SCROLL AT ONCE.
2632         JUMPE A,TYOLF3          ;JUMP IF THIS TTY CAN'T SCROLL
2633         SOS TPVP(TT)
2634         PUSH P,TPHP(TT)
2635         HRRZ B,TTYLPS(I)
2636         MOVEM B,TPHP(TT)
2637         PUSHJ P,TYOASS          ;MOVE CURSOR DOWN TO LAST LINE ON SCREEN, PREPARING FOR SCROLL
2638         PUSHJ P,TYOMVC
2639         POP P,TPHP(TT)
2640         AOS TPVP(TT)
2641 ;SCROLL: A HAS -<# LINES TO ADJUST ALL VPOS'S BY>.
2642 TYOLF6: HLRZ B,TTYLPS(I) ;COMPUTE NEW TTYLPS LH.
2643         ADD B,A
2644         JUMPGE B,TYOLF7 ;IF IT WOULD BE NEGATIVE,
2645         TLNN H,%TORAW           ;ON DISPLAY WRAP AROUND INSTEAD (LOSSAGE HAPPENING).
2646          JRST TYOLF3
2647         SETZ B,                 ;IN RAW MODE, DON'T WORRY ABOUT IT.
2648 TYOLF7: HRLM B,TTYLPS(I) ;STORE UPDATED M.P. VPOS.
2649         ADDM A,TPVP(TT) ;CHANGE OTHER MAIN PRGM VPOS'S.
2650         MOVE B,TPVP(TT) ;IF SCROLLING 1 LINE AT A TIME,
2651         JRST TYOLF0     ;MAY NEED TO SET %TFEOP.
2652                 ;IN ANY CASE, CLEAR NEXT LINE & FINALIZE.
2653
2654 ;HERE TO WRAP AROUND TO TOP OF SCREEN.
2655 TYOLF3: SETZM TPVM(TT)  ;TURN OFF ANY SUPPRESSION OF MORES BY INPUT
2656         TLNN H,%TOERS   ;ON DISPLAYS WITHOUT SELECTIVE ERASE,
2657          JRST [ PUSHJ P,TYOCLR  ;MUST CLEAR SCREEN WHEN WRAP AROUND.
2658                 JRST TYOMVC]    ;MUST LEAVE TTY DISSOCIATED.
2659 TYOLF4: MOVE B,TPVB(TT) ;ELSE JUST MOVE TO TOP OF PC PPR
2660         MOVEM B,TPVP(TT)
2661         JRST TYOLF1     ;AND CLEAR THE TOP LINE.
2662 \f
2663 ;HANDLE BACKSPACE.
2664 TYOBS:  TLNN H,%TOIML   ;BACKSPACE ON IMLAC ISN'T SAME AS MOVE BACK.
2665          JRST TYOBS1
2666         MOVE B,TPHP(TT) ;ON IMLAC, FIRST, IF AT LEFT MARGIN,
2667         SKIPG B .SEE TPHB;(TT)  ;DO NOTHING.
2668          JRST TYOFN2
2669 TYOBS2: CAME TT,TTYLPP(I)
2670          PUSHJ P,TYOASS ;IF WE SHOULD BACKSPACE,
2671         SOSGE TPHP(TT)
2672          SETZM TPHP(TT)
2673         JRST TYORU1     ;DO IT BY SENDING A ^H.
2674
2675 TYOBS1: TLNE H,%TOMVB   ;ARE WE ECHOING ^H ON TTY THAT CAN'T BS?
2676          JRST TYOBS4
2677         TRNN R,%TJECH
2678          JRST TYOBS3
2679         JRST TYOCTL     ;ECHO "^H" RATHER THAN CR AND SPACE FWD.
2680
2681 TYOBS4: TLNE H,%TORAW   ;IN RAW MODE ON TTY THAT CAN BS?
2682          JRST [ MOVEI A,%TDBS   ;IF NO OPTIMIZATION,
2683                 JRST TYOBS2 ]   ;ARRANGE TO OUTPUT REAL BS.
2684 TYOBS3: CAMN TT,TTYLPP(I) ;BS ON TTY THAT ISN'T AN IMLAC.
2685          PUSHJ P,TYOMVC ;PREPARE TO DO CURSOR MOTION.
2686         SOS B,TPHP(TT)  ;MOVE BACK 1 POS.
2687         SKIPGE B        .SEE TPHB;(TT)
2688          AOS TPHP(TT)   ;AT LEFT MARGIN, DO NOTHING.
2689         JRST TYOFNX
2690
2691 ;COME HERE WHEN TAB OUTPUT (AT TOP LEVEL ONLY)
2692 TYOTAB: TRNE R,%TJECH
2693          JRST TYOTA1
2694         MOVE B,TTYST2(I)        ;MAYBE TABS SHOULD BE OUTPUT IN IMAGE MODE.
2695         TLNE B,%TGIMG_6
2696          JRST TYONMV
2697 TYOTA1: MOVE A,TPHP(TT)
2698         ADDI A,10
2699         TRZ A,7         ;HPOS OF NEXT TAB STOP.
2700         MOVE B,TCMXH(I) .SEE TPHE;(TT)
2701         TRNN R,%TJCTN
2702          SUBI B,1       ;B HAS EFFECTIVE LINEL.
2703         CAML A,B
2704          MOVE A,B       ;A HAS PLACE TAB MOVES TO.
2705         SUB A,TPHP(TT)  ;HOW FAR TO MOVE RIGHT?
2706         TRNN R,%TJCTN
2707          JUMPE A,[PUSHJ P,TYOCTN
2708                   JRST TYOTAB]
2709         CAMN TT,TTYLPP(I)
2710          PUSHJ P,TYOMVC ;PREPARE FOR CURSOR CTL.
2711         ADDM A,TPHP(TT) ;MOVE CURSOR TO TAB STOP.
2712         JRST TYOFNX
2713 \f
2714 ;HANDLE ^L.
2715 TYOFF:  TRNN R,%TJECH   ;ECHOING?
2716          JRST TYOCTL
2717         MOVE B,TTYSTS(I) ;YES; ^L ECHOES AS UPARROW-L
2718         TLNE H,%TOMVU   ;EXCEPT ON DISPLAYS, UNLESS PRGM HAS DISABLED.
2719          TLNE B,%TSCLE
2720           JRST TYOCTL   ;ECHO AS UPARROW L
2721         JRST TYOCLR     ;ECHO AS CLEAR SCREEN.
2722
2723 ;^M IOTTED - MAYBE DO CR AND LF.
2724 TYOCR:  TRNE R,%TJECH   ;IF ECHO MODE OUT, CR DOES CRLF.
2725          JRST TYOCRL
2726         MOVE B,TTYST2(I)
2727         TRNE B,%TGIMG_12. ;ELSE OUTPUT-CR-IN-IMAGE PREVENTS LF.
2728          JRST TYOCR1
2729         PUSHJ P,TYOCRL  ;DO CR AND LF,
2730         MOVEI B,%TFIGL  ;THEN SAY IGNORE NEXT CHAR IF IT'S A LF.
2731         IORM B,TPFLAG(TT)
2732         POPJ P,
2733
2734 TYOCRL: PUSHJ P,TYORCR
2735         PUSHJ P,TYOLF
2736         JRST TYOFND
2737
2738 TYOCR1: PUSHJ P,TYORCR
2739         JRST TYOFND
2740
2741 ;ALTMODE IOTTED - SHOULD WE OUTPUT DOLLARSIGN?
2742 TYOALT: MOVE B,TTYST2(I)
2743         TRNN R,%TJECH   ;ECHO MODE => YES.
2744          TLNN B,%TGIMG  ;OUTPUT ALT IN ASCII MODE SAYS YES.
2745           JRST TYOAL4
2746         JRST TYOAL1     ;NO, OUTPUT AN ALTMODE, WHETHER IT PRINTS OR NOT.
2747
2748 TYOAL4: TLNN H,%TOSAI   ;IF ALTMODE IS A GRAPHIC, USE IT;
2749 TYOAL3:  MOVEI A,"$     ;ELSE USE DOLLARSIGN.
2750         JRST TYONR0     ;EITHER WAY IT'S A NORMAL PRINTING CHAR.
2751 \f
2752 ;IF ABOUT TO CHANGE PC PPR'S CURSOR POS WITHOUT PUTTING
2753 ;ANYTHING IN THE OUTPUT BUFFER THAT WILL CHANGE THE TTY'S
2754 ;REAL CURSOR POS THE SAME WAY, MUST DISASSOCIATE TTY'S
2755 ;CURSOR POS FROM THIS PC PPR. TTYLPS WILL THEN
2756 ;SAY WHERE THE TTY'S CURSOR WILL BE AFTER CHARS IN OUTPUT
2757 ;BUFFER ARE ALL OUTPUT.
2758 TYOMVC: HRLZ B,TPVP(TT)
2759         HRR B,TPHP(TT)
2760         MOVEM B,TTYLPS(I)
2761         SETCAM TT,TTYLPP(I) ;TTY NO LONGER ASSOCIATED.
2762         POPJ P,
2763
2764 ;BEFORE PUTTING ANYTHING IN OUTPUT BUFFER USING A PC PPR,
2765 ;TTY'S CURSOR MUST BE ASSOCIATED WITH PC PPR (THAT IS,
2766 ;THE TTY'S CURSOR MUST BE WHERE THE PC PPR'S CURSOR IS)
2767 ;WHEN A TTY IS ASSOCIATED WITH A PC PPR, TTYLPS
2768 ;IS NONSENSE, AND IT IS NECESSARY FOR OUPUT RTNS
2769 ;TO UPDATE PC PPR'S CURSOR IN ACCORDANCE WITH WHAT
2770 ;IS PUT IN THE OUTPUT BUFFER.
2771 ;THIS ROUTINE ASSOCIATES TTY IN I WITH PC PPR IN TT.
2772 TYOASS: TRNE R,%TJHDE
2773          POPJ P,
2774         PUSH P,A
2775         HLRZ T,TTYLPS(I) ;CURRENT VERTICAL POS
2776         HRRZ A,TTYLPS(I) ;CURRENT HORIZONTAL POS
2777         CAMN T,TPVP(TT) ;IF CURSOR IS WHERE WE WANT IT,
2778          CAME A,TPHP(TT)
2779           AOSA A
2780            JRST TYOAS3  ;JUST SAY WE'RE ASSOCIATED.
2781         SKIPGE TTYLPS(I)
2782          BUG            ;TTY ALREADY ASSOCIATED WITH A PC PPR?
2783         CAMN T,TPVP(TT) ;SEE IF JUST MOVING ONE SPACE TO THE RIGHT
2784          CAME A,TPHP(TT)
2785           JRST TYOAS6   ;NO, NEED FULLY GENERAL CURSOR MOTION
2786         MOVEI A,%TDFS   ;SAVE BUFFER SPACE IN THIS COMMON CASE
2787         TLNE H,%TOOVR
2788          MOVEI A,40     ;IF SPACE OVERPRINTS, IT IS BETTER THAN %TDFS SINCE FEWER CHARS 
2789         PUSHJ P,TYOOUT  ;IF SENT TO A SOFTWARE TTY OVER HARDWARE LINE.
2790         JRST TYOAS3
2791
2792 TYOAS6: MOVEI A,%TDMV0  ;TELL THE TTY TO PUT ITS CURSOR
2793         TLNE H,%TOMVU
2794          JRST TYOAS7
2795         MOVEI A,%TDMOV
2796         PUSHJ P,TYOOUT  ;WHERE THIS PC PPR WANTS IT.
2797         HLRZ A,TTYLPS(I)
2798         PUSHJ P,TYOOUT
2799         HRRZ A,TTYLPS(I)
2800 TYOAS7: PUSHJ P,TYOOUT
2801         MOVE A,TPVP(TT)
2802         CAML A,TCMXV(I) ;ATTEMPT TO GO BELOW SCREEN BOTTOM?
2803          BUG
2804         PUSHJ P,TYOOUT  ;AND THE NEW POSITION.
2805         MOVE A,TPHP(TT)
2806         PUSHJ P,TYOOUT
2807 TYOAS3: MOVEM TT,TTYLPP(I) ;TELL TTY IT IS ASSOCIATED.
2808         SETOM TTYLPS(I)
2809         JRST POPAJ
2810
2811 TYOAS5: PUSH P,A        ;REGARD TTY AS ASSOCIATED WITHOUT ACTUALLY
2812         JRST TYOAS3     ;MOVING ITS CURSOR.
2813
2814 ;FORCE OUT BUFFERED CURSOR MOTION.
2815 ;CALL ONLY IF TTY DISSOCIATED, FROM M.P. OR CLOCK LEVEL.
2816 ;H MUST BE SET UP ALREADY
2817 TYOFRC: MOVE Q,TOIP(I)
2818         PUSHJ P,TYOASS
2819         JRST TYOFN2
2820 \f
2821 ;PUT CHAR IN OUTPUT BFR (BUT IT DOESN'T BECOME VISIBLE
2822 ;TO INT. LEVEL UNTIL WE FINALIZE - IN CASE WE PCLSR)
2823 TYOOUT: TRNE R,%TJHDE
2824          POPJ P,
2825 TYOOU1: CAMN Q,TOBEP(I)         ;Going to deposit past end of buffer?
2826          MOVE Q,TOBBP(I)        ; Yes, make wrap around instead.
2827         HRRZI T,(Q)             ;Get addr part of the buffer pointer.
2828         CAILE T,@TOBEP(I)       ;Reasonable buffer pointer?
2829                                 ;  CANT HAVE BEEN DUE TO 11 DOWN
2830          BUG HALT,[TTY: OUTPUT BUFFER POINTER PAST END OF BUFFER]
2831         IDPB A,Q                ;Stuff char into output buffer.
2832 IFN N11TYS, TRNN H,%TP11T       ;TV-11 ttys dont have TORM.
2833          SOSL TORM(I)           ; One less space available in buffer.
2834           POPJ P,
2835         BUG HALT,[TTY: OUTPUT BUFFER OVERFLOWED, TYOWNC IS TOO SMALL]
2836
2837 ;FINALIZE, UPDATING TOIP, TORM AND FLAGS.
2838 ;ALSO RESET Q FOR ANOTHER BUNCH OF OUTPUT.
2839 TYOFNX: ;FINALIZE WHEN TTY DISSOCIATED AND NOTHING PUT IN BFR.
2840 TYOFND: ;SIMILAR, WHEN SOMETHING MIGHT HAVE BEEN PUT IN BFR.
2841 TYOFNA: ;FINALIZE WHEN TTY ASSOCIATED W/ PC PPR.
2842 TYOFN2: MOVEM Q,TOIP(I)
2843         AOSN TTYOAC(I)  ;START THE TTY.
2844          XCT TTYST(I)
2845         JRST TYOFNR
2846 \f
2847 ;ON ORDINARY TTY, CALL WHEN BUFFER FULL.
2848 ;WAIT TILL AT LEAST 3/4 EMPTY. T HAS MINIMUM # CHARS NEEDED.
2849 ;IF RUNNING SYS JOB, POP1J IF TTY SEEMS TO BE HUNG.
2850 TYOW1:  CAIGE T,TOBS*3/4        ;DON'T UNBLOCK TILL BUFFER AT LEAST 3/4 EMPTY.
2851          MOVEI T,TOBS*3/4
2852 TYOW2:  MOVEM I,EPDL3(U)        ;MAY TRAP OUT ON SYSTEM JOB
2853         CAME U,USER
2854          BUG
2855         JUMPN U,TYOW4
2856         JRST TYOW5      ;HANG UP SYS JOB FOR MAX OF 5 SEC
2857
2858         PUSHJ P,TYOW6
2859 TYOW5:   PUSHJ P,UFLS
2860         MOVE T,TTYCOM(I)
2861         TLNE T,%TCHNG
2862          SUB P,[1,,1]   ;TIMED OUT
2863         POPJ P,
2864
2865         CAMLE T,TORM(I)
2866 TYOW4:   PUSHJ P,UFLS
2867         POPJ P,
2868
2869 TYOW6:  MOVE A,AC0S+U(U)        ;(IN CASE U DIDN'T EQUAL USER AT TYOW1)
2870         MOVE A,EPDL3(A)         ;IF SYS JOB, FLUSH IF NO CHR PROCESSED FOR 15 SEC
2871         MOVE Q,TTYTYP(A)
2872         SKIPL TTOALC(A)         ;TIME OUT ON SOFTWARE TTY'S WITHOUT ALLOCATION.
2873          JRST TYOW6A            ;IF THIS IS A PDP-11 TV,
2874         TRNE Q,%TY11T           ;TEST FOR ROOM IN BUFFER IS DIFFERENT ON TV'S
2875          JRST TYOW7
2876         CAMG T,TORM(A)          ;FOR NON-TV'S, TORM IS VALID.
2877          JRST TYOW6B            ;THERES ROOM NOW
2878 TYOW6A: MOVSI T,%TCHNG
2879         MOVE Q,TIME
2880         SUB Q,TTLTM(A)
2881         CAIG Q,5.*30.
2882          JRST TYOW6C            ;NO NEW TIMEOUT YET
2883         IORM T,TTYCOM(A)        ;MARK THIS TTY AS HUNG FOR SYS JOB
2884         JRST POPJ1
2885
2886 TYOW6C: CAILE Q,3
2887          TDNN T,TTYCOM(A)       ;SKIP ON CONSOLE WAS LOSING RECENTLY
2888           POPJ P,
2889         JRST POPJ1              ;TIME OUT MUCH SHORTER IF CONSOLE DETERMINED TO BE A LOSER
2890
2891 TYOW7:  LDB Q,T
2892         CAIE Q,1_TT11BY-1
2893          JRST TYOW6A
2894 TYOW6B: MOVSI T,%TCHNG          ;GET HERE WHEN ROOM EXISTS IN BUFFER
2895         ANDCAM T,TTYCOM(A)      ;ITS NOT HUNG NOW
2896         JRST POPJ1
2897
2898 IFN N11TYS,[
2899 ;ON A PDP-11 TV, CALL HERE TO WAIT UNTIL THERE ARE AT LEAST
2900 ;TYOWNC CHARS OF SPACE IN THE OUTPUT BUFFER.
2901 ;CAN POP1J FOR THE SYS JOB.
2902 TYOWN:  PUSHJ P,TYOWN1
2903         LDB B,T         ;IS THE POS. 20. CHARS UP VACANT?
2904         CAIN B,1_TT11BY-1
2905          POPJ P,        ;YES, NO NEED TO WAIT.
2906         JUMPN U,TYOWN2  ;IF SYS JOB, TIME OUT BEFORE TOO LONG.
2907         MOVEM I,EPDL3(U)
2908         MOVE B,TIME
2909         MOVEM B,TTLTM(I)
2910         JRST TYOW5
2911
2912 TYOWN2: PUSH P,A        ;SEEMS TO BE NO SPACE, CHECK AGAIN
2913         MOVE B,(T)      ;DOING THINGS IN THE RIGHT ORDER THIS TIME
2914         LDB A,T         ;TO AVOID GETTING HUNG BY A TIMING ERROR
2915         CAIN A,1_TT11BY-1
2916          JRST POPAJ     ;SOME SPACE APPEARED IN THE MEANTIME
2917         POP P,A
2918         EXCH B,T
2919         CAMN T,(B)      ;WAIT FOR THIS WORD TO CHANGE
2920          PUSHJ P,UFLS
2921         JRST TYOWN      ;THEN CHECK IT AGAIN
2922
2923 TYOWN1: MOVE T,TOIP(I)
2924         ADDI T,TYOWNC/<36./TT11BY>
2925         HRRZ B,TOBEP(I)
2926         CAIGE B,(T)
2927          SUB T,TT11OL
2928         HRLI T,040000+TT11BY_6  ;BP TO WHOLE OF RIGHTMOST BYTE IN WORD
2929         POPJ P,
2930 ]
2931 \f
2932 ;COME HERE WHEN DETECT THAT %TFEOP OR %TFIGL IS SET.
2933 TYOIGL: TRZN B,%TFIGL   ;%TFIGL TAKES PRIORITY.
2934          JRST TYOEOP
2935         MOVEM B,TPFLAG(TT) ;CLEAR IT, AND IGNORE THIS CHAR
2936         CAIE A,^J
2937          JRST TYOIG1
2938         POPJ P,
2939
2940 ;%TFEOP IS SET AND OUTPUT IS DONE: DO **MORE** PROC.
2941 TYOEOP: PUSH P,[TYOEO9]
2942         PUSH P,A
2943 TYOEO5: SKIPE USER      ;DON'T DO MORES IF SYSTEM JOB IS TYPING
2944          TRNE R,%TJMOR+%TJECH   ;OR THIS CHANNEL DOESN'T WANT TO
2945           JRST TYOEO7
2946         MOVSI B,%TSMOR
2947         TDNE B,TTYSTS(I)        ;OR THIS JOB DOESN'T WANT TO
2948          JRST TYOEO7
2949         HRRZ B,TTYSTS(I)        ;DON'T **MORE** AN $$^P'ED JOB'S OUTPUT
2950         CAME B,U
2951          JRST POPAJ
2952         MOVE B,TCMXV(I) .SEE TPVE;(TT)
2953         MOVEM B,TPVM(TT)
2954         HRRZ B,UUAC(U)  ;GET INTERRUPT BIT FOR CHANNEL THIS IOT IS ON
2955         MOVE B,CHNBIT(B)
2956         AND B,MSKST2(U) ;HAS USER ENABLED OUTPUT INTERRUPT?
2957         JUMPE B,TYOEO1  ;NO, SYSTEM DOES **MORE** PROC.
2958         IORM B,IFPIR(U) ;YES, JUST GIVE USER INT
2959         MOVEI B,%TFEOP  ;HE CAN TYPE **MORE** IF HE WANTS TO.
2960         ANDCAM B,TPFLAG(TT) ;INT. HAS BEEN GIVEN.
2961         PUSHJ P,TYOUN1  ;LSWPOP THE FINSET, ETC.
2962         SKIPA
2963          SKIPA
2964          PUSHJ P,UFLS   ;MAKE HIM TAKE THE INT. RIGHT NOW.
2965 TYOEO6: PUSHJ P,LSWCLR
2966         SOS UUOH        ;HIS PICLR IS SET? RETRY THE UUO.
2967         JRST URET
2968
2969 TYOEO7: MOVEI B,%TFEOP  ;MORE SUPPRESSED, TURN OFF THE FLAG
2970         ANDCAM B,TPFLAG(TT)
2971         JRST POPAJ
2972 \f
2973 ;COME HERE AT END OF PAGE IF PROGRAM ISN'T SMART.
2974 TYOEO1: PUSH P,TPHP(TT)
2975         MOVE A,TPHP(TT)
2976         ADDI A,10
2977         CAML A,TCMXH(I)
2978          PUSHJ P,TYORCR
2979         CAME TT,TTYLPP(I)
2980          PUSHJ P,TYOASS
2981         IRPC X,,**MORE**
2982         MOVEI A,"X
2983         PUSHJ P,TYONR1
2984         TERMIN          ;OUTPUT THE STRING "**MORE**"
2985         IORI R,%TJSTP   ;MAKE ALL OUTPUT ON THIS CHNL HANG.
2986         MOVEI B,%TFEOP  ;NO LONGER WANT NEXT CHAR TO DO **MORE**
2987         ANDCAM B,TPFLAG(TT)
2988         POP P,A         ;REMEMBER VALUE TO RESET HPOS TO LATER.
2989         HRLM A,TPFLAG(TT)
2990         PUSHJ P,TYOFNA  ;FINALIZE SO "**MORE**" WILL TYPE OUT;
2991          ;PCLSRING NO PROBLEM; SINCE %TJSTP IS SET THE IOT
2992          ;WILL COME TO TYOEO3.
2993 TYOEO3:
2994 IFN N11TYS,[
2995         TRNE H,%TP11T   ;WAIT FOR BUFFER SPACE ON TV.
2996          PUSHJ P,TYOWN  ;NOTE THIS CAN POP1J
2997 ]
2998         PCLT
2999         MOVEI T,TOBS    ;WAIT FOR ALL OF "**MORE**" TO GET OUT.
3000         CAME T,TORM(I)
3001          PUSHJ P,TYOW1
3002         PUSH P,C
3003         PUSH P,D
3004         PUSH P,R
3005         PUSH P,TT
3006         MOVEI R,%TIPEK+%TIACT+%TIECH+%TINWT
3007         PUSHJ P,TYI0    ;LOOK AHEAD AT NEXT INPUT CHAR.
3008         JUMPL D,TYOEO6  ;IS NONE => RETRY UUO AND WAIT IN TYOSET.
3009         EXCH TT,(P)
3010         EXCH R,-1(P)
3011         MOVE Q,TOIP(I)
3012         MOVE C,TTYSTS(I)
3013         TLNE C,%TSROL   ;IN SCROLL MODE, MAKE NEXT LINE OF OUTPUT OVERWRITE **MORE**.
3014          JRST [ PUSHJ P,TYORCR
3015                 PUSHJ P,TYOCEL
3016                 SOS TPVM(TT)    ;MORE AGAIN BEFORE THIS LINE GOES OFF SCREEN
3017                 JRST TYOEO4]
3018         TRZN R,%TJCP1   ;UNLESS THIS IS ^PN
3019          PUSHJ P,TYOHD1 ;HOME UP (BY HOMING DOWN AND LF'ING)
3020         PUSHJ P,TYOLF   ;OTHERWISE (FOR ^PN) JUST LF.
3021 TYOEO4: CAMN TT,TTYLPP(I)
3022          PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
3023         HLRZ A,TPFLAG(TT) ;SET HPOS TO WHAT IT WAS BEFORE THE **MORE**.
3024         MOVEM A,TPHP(TT)
3025         HRRZS TPFLAG(TT)
3026         EXCH TT,(P)
3027         EXCH R,-1(P)
3028         ANDI D,177
3029         CAIE D,177
3030          CAIN D,40      ;IF A SPACE, FLUSH IT FROM INPUT BFR
3031           PUSHJ P,TYIREM
3032         POP P,TT
3033         POP P,R
3034         POP P,D
3035         POP P,C
3036         ANDCMI R,%TJSTP ;RETURN CHANNEL TO NORMAL.
3037         MOVE Q,TOIP(I)
3038         PUSHJ P,TYOFNR
3039         POP P,A         ;RESTORE THE CHAR BEING IOTTED
3040         POPJ P,         ;AND TRY AGAIN TO IOT IT.
3041
3042 TYOEO2: PUSH P,[TYOEO9]
3043         PUSH P,A        ;COME HERE IF PCLSR OUT OF TYOEO3, ETC.
3044         JRST TYOEO3     ;WHEN THE IOT IS RETRIED.
3045 \f
3046 TYOCP1: TRZE R,%TJINK   ;IF THIS IS THE CHAR AFTER A ^PI, TREAT IT AS
3047          JRST TYONR3    ;NORMAL PRINTING CHARACTER.
3048         TRNE R,%TJSTP
3049          JRST TYOEO2    ;CHANNEL HUNG IN **MORE**.
3050 ;HANDLE CURSOR CONTROL CODES. COME HERE WITH IOTTED CHAR IN A.
3051 ;IF WE ARE IN THE MIDDLE OF A ^P CODE.
3052 ;OR IF THE CHANNEL IS A SUPERIMAGE OUTPUT CHANNEL.
3053         TRZE R,%TJCP2   ;AFTER A ^PV OR ^PH ?
3054          JRST TYOCP2
3055         TRZN R,%TJCP1   ;NO, NEXT CHAR ISN'T IN THE ^P CODE.
3056          JRST TYOSIO    ;MUST BE %TJSIO THAT WAS SET.
3057 TYOCP4: CAIL A,"A       ;IF ^P CODE IS A LETTER,
3058         CAILE A,"_
3059          JRST TYOCP3
3060         MOVE B,TYOCPT-"A(A) ;GET THE DISPATCH ENTRY FOR IT,
3061         TLNN H,%TOMVU
3062          JUMPL B,TYOCPA     ;TURN SOME CURSOR OPERATIONS INTO CRLF ON PRINTING TTY
3063         TLNE B,200000
3064          PUSH P,[TYOCPR]    ;SOME OPERATIONS RETURN HERE FOR FINALIZATION
3065         JRST (B)        ;FINALLY, DISPATCH
3066
3067 TYOCPR: MOVEI B,%TFEOP
3068         ANDCAM B,TPFLAG(TT)
3069         JRST TYOFNX
3070
3071 TYOCP3: CAIL A,140      ;LOWERCASE LETTERS ACT LIKE UPPERCASE
3072          JRST [ SUBI A,40
3073                 JRST TYOCP4]
3074         HRLM R,@TYOPV2(J)
3075         PUSHJ P,TYOUN1  ;OR IT'S ILLEGAL.
3076         JRST IOCR11     ;IOC ERROR.
3077
3078 TYOCPV: IORI R,%TJCP1   ;HERE FOR ^PV
3079 TYOCPH: IORI R,%TJCP2   ;SAME FOR ^PH. SAY NEXT CHAR IS THE CURSOR POS.
3080 TYOFNR: HRLM R,@TYOPV2(J)
3081         POPJ P,
3082
3083 TYOCP2: CAMN TT,TTYLPP(I) ;INTERPRET THE CHAR AFTER ^PH OR ^PV.
3084          PUSHJ P,TYOMVC
3085         ANDI A,177
3086         TRZN R,%TJCP1   ;WHICH OF THOSE 2 WAS IT?
3087          JRST TYOCH1    ;IT WAS ^PH
3088         ADD A,TPVB(TT)
3089         SUBI A,10
3090         CAML A,TCMXV(I) .SEE TPVE;(TT)  ;DON'T PUT CURSOR PAST END.
3091          JRST [ MOVE A,TCMXV(I) .SEE TPVE;(TT)
3092                 SOJA A,.+1]
3093         CAMGE A,TPVB(TT)        ;OR BEFORE BEGINNING.
3094          MOVE A,TPVB(TT)
3095         MOVEM A,TPVP(TT)
3096         JRST TYOCPR
3097
3098 TYOCH1: .SEE ADD A,TPHB;(TT)
3099         SUBI A,10
3100         CAML A,TCMXH(I) .SEE TPHE;(TT)  ;DON'T PUT CURSOR PAST END.
3101          JRST [ MOVE A,TCMXH(I) .SEE TPHE;(TT)
3102                 SOJA A,.+1]
3103         SKIPGE A        .SEE TPHB;(TT)  ;OR BEFORE BEGINNING.
3104          SETZ A,        .SEE TPHB;(TT)
3105         MOVEM A,TPHP(TT)
3106         JRST TYOCPR
3107 \f
3108 ;DISPATCH TABLE FOR ^P CODES.
3109 ;SIGN => TURN INTO ^PA ON PRINTING TTY.
3110 ;4.8 => PUSHJ, ELSE JRST
3111 TYOCPT:         TYOCPA  ;A - ADVANCE TO FRESH LINE.
3112         200000,,TYOMVB  ;B - MOVE BACK.
3113                 TYOCLR  ;C - CLEAR SCREEN.
3114         200000,,TYOMVD  ;D - MOVE DOWN.
3115                 TYOCEF  ;E - CLEAR TO END OF SCREEN.
3116         200000,,TYOMVF  ;F - MOVE FORWARD.
3117                 TYOCP3  ;G - ILLEGAL.
3118                 TYOCPH  ;H - NEXT CHAR IS DESIRED HPOS.
3119                 TYOCPI  ;I - NEXT CHARACTER TREATED AS NORMAL PRINTING.
3120                 TYOCP3  ;J - ILLEGAL.
3121         200000,,TYODLF  ;K - DELETE FORWARD.
3122                 TYOCEL  ;L - CLEAR REST OF LINE.
3123                 TYOMOR  ;M - DO **MORE**.
3124                 TYOMO1  ;N - SIMILAR BUT DON'T HOME UP.
3125                 TYOCP3  ;O - ILLEGAL.
3126                 TYOCPP  ;P - TYPE "^P".
3127                 TYOCPQ  ;Q - TYPE "^C".
3128         600000,,TYORPS  ;R - RESTORE SAVED POS.
3129         200000,,TYOSPS  ;S - SAVE POSITION (FOR A ^PR).
3130         600000,,TYOHMU  ;T - HOME UP.
3131         200000,,TYOMVU  ;U - MOVE UP.
3132                 TYOCPV  ;V - NEXT CHAR IS DESIRED VPOS.
3133                 TYOCP3  ;W - ILLEGAL.
3134         200000,,TYODLB  ;X - DELETE BACKWARDS.
3135                 TYOCP3  ;Y - ILLEGAL.
3136         600000,,TYOHMD  ;Z - HOME DOWN.
3137         200000,,TYOILP  ;[ - INSERT LINE POSITION
3138         200000,,TYODLP  ;\ - DELETE LINE POSITION
3139                 TYOCEL  ;] - CLEAR TO END OF LINE (USE ^PL IT'S BETTER)
3140         200000,,TYOICP  ;^ - INSERT CHARACTER POSITION
3141         200000,,TYODCP  ;_ - DELETE CHARACTER POSITION
3142 IFN .-31.-TYOCPT,.ERR WRONG LENGTH TABLE.
3143
3144 ;^PM AND ^PN DON'T WORK IN PROGRAMS THAT TAKE **MORE**
3145 ;INTERRUPTS - OR, PRECISELY, THEY ALWAYS ENTER
3146 ;THE STATE OF A CHANNEL THAT HAS JUST TYPED OUT "**MORE**".
3147 TYOMO1: IORI R,%TJCP1   .SEE TYOEO3     ;^PN - ENTER **MORE** STATE.
3148 TYOMOR: IORI R,%TJSTP                   ;^PM.
3149         HRRZS TPFLAG(TT)
3150         JRST TYOFNR
3151
3152 TYOCPI: IORI R,%TJINK
3153         JRST TYOFNR
3154
3155 ;INSERT AND DELETE CHARACTERS AND LINES
3156 TYOILP: SKIPA A,[%TDILP]
3157 TYODLP:  MOVEI A,%TDDLP
3158         TLNN H,%TOLID
3159          POPJ P,
3160         PUSH P,A                ;SUPPOSED TO BE AT LEFT MARGIN
3161         PUSHJ P,TYORCR          ;MAKE SURE
3162         POP P,A
3163         JRST TYOIL1
3164
3165 TYOICP: SKIPA A,[%TDICP]
3166 TYODCP:  MOVEI A,%TDDCP
3167         TLNN H,%TOCID
3168          POPJ P,
3169 TYOIL1: CAME TT,TTYLPP(I)
3170          PUSHJ P,TYOASS
3171         PUSHJ P,TYOOUT
3172         MOVEI A,1       ;SUPPLY PARAMETER OF 1
3173         JRST TYORU1     ;IF YOU WANT TO OPTIMIZE CONSECUTIVE ONES
3174                         ; USE SUPER-IMAGE OUTPUT, AT LEAST FOR NOW
3175 \f
3176 ;RTNS FOR VARIOUS ^P CODES.
3177 ;THE FIRST FOUR DON'T FINALIZE ANYTHING.
3178 TYOMVF: CAMN TT,TTYLPP(I) ;^PF
3179          PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
3180         AOS B,TPHP(TT)
3181         CAMGE B,TCMXH(I) .SEE TPHE;(TT)
3182          POPJ P,
3183         ;SETZ A,        .SEE TPHB;(TT)  ;WRAP AROUND FROM LAST POS. TO FIRST.
3184         SETZM TPHP(TT)
3185 TYOMVD: CAMN TT,TTYLPP(I) ;^PD
3186          PUSHJ P,TYOMVC ;PREPARE FOR CURSOR MOTION.
3187         AOS B,TPVP(TT)
3188         MOVE A,TPVB(TT)
3189         CAIGE B,119.
3190         CAML B,TCMXV(I) .SEE TPVE;(TT)  ;WRAP AROUND FROM LAST POS. TO FIRST.
3191          MOVEM A,TPVP(TT)
3192         POPJ P,
3193
3194 TYOMVB: CAMN TT,TTYLPP(I)       ;^PB - MOVE BACK.
3195          PUSHJ P,TYOMVC
3196         SOSL B,TPHP(TT) .SEE TPHB;(TT)
3197          POPJ P,
3198         MOVE A,TCMXH(I) .SEE TPHE;(TT)  ;WRAP AROUND FROM FIRST TO LAST.
3199         SUBI A,2
3200         MOVMM A,TPHP(TT)
3201 TYOMVU: CAMN TT,TTYLPP(I)       ;^PU - MOVE UP.
3202          PUSHJ P,TYOMVC
3203         SOS B,TPVP(TT)
3204         MOVE A,TCMXV(I) .SEE TPVE;(TT)  ;WRAP AROUND FROM FIRST TO LAST.
3205         SUBI A,1
3206         CAIL A,119.
3207          MOVEI A,118.
3208         CAMGE B,TPVB(TT)
3209          MOVEM A,TPVP(TT)
3210         POPJ P,
3211
3212 TYOSPS: MOVE B,TPHP(TT) ;^PS - SAVE CURSOR POS.
3213         HRL B,TPVP(TT)
3214         MOVEM B,TPSP(TT)
3215         POPJ P,
3216
3217 TYORPS: CAMN TT,TTYLPP(I) ;^PR - RESTORE CURSOR POS FROM SAVED.
3218          PUSHJ P,TYOMVC
3219         MOVE B,TPSP(TT)
3220         HRRZM B,TPHP(TT)
3221         HLRZM B,TPVP(TT)
3222         POPJ P,
3223
3224 TYOCPA: CAMN TT,TTYLPP(I) ;ADVANCE TO FRESH LINE, IN ANY CASE CLEAR REST OF LINE
3225          PUSHJ P,TYOMVC
3226         SKIPE TPHP(TT)  ;IF NOT AT THE BEGINNING OF A LINE,
3227          JRST TYOCRL    ;CRLF.  MAYBE SOMEDAY THIS WILL CHECK
3228         JRST TYOCEL     ;WHETHER ANYTHING HAS YET BEEN TYPED ON THIS LINE.
3229 \f
3230 TYOCLR: TLNN H,%TOMVU   ;^PC - CLEAR SCREEN.
3231          JRST [ MOVE A,TCMXV(I) ;ON PRINTING TTYS, JUST CRLF.
3232                 SUB A,TTYROL(I) ;BUT DON'T --MORE-- UNTIL THIS LINE
3233                 MOVEM A,TPVM(TT);GOES OFF THE SCREEN
3234                 JRST TYOCRL ]
3235         SKIPN TPVB(TT)  ;USE FAST METHOD IF REALLY CLEARING WHOLE SCREEN
3236          JRST TYOCIM
3237 TYOCI1: PUSHJ P,TYOHMU
3238 TYOCEF: SKIPA A,[%TDEOF] ;^PE CLEAR EOF
3239 TYOCEL:  MOVEI A,%TDEOL ;[  ^P] - CLEAR EOL.
3240         TLNN H,%TOERS
3241          JRST TYOFNR
3242 TYONMV: CAME TT,TTYLPP(I) ;HERE FOR CHARS THAT DON'T MOVE THE CURSOR
3243          PUSHJ P,TYOASS ;BUT DO DEPEND ON BEING PRINTED AT THE RIGHT PLACE ON THE SCREEN
3244 TYORU1: PUSHJ P,TYOOUT
3245         JRST TYOFNA
3246
3247 TYOCIM: PUSHJ P,TYOHMU  ;CLEAR WHOLE SCREEN
3248         MOVEM TT,TTYLPP(I)
3249         SETOM TTYLPS(I)
3250         MOVEI A,%TDCLR
3251         JRST TYONMV
3252
3253 TYOHMU: SETZM TPVM(TT)  ;^PT - HOME UP
3254         CAMN TT,TTYLPP(I)
3255          PUSHJ P,TYOMVC ;GO TO COLUMN 0,
3256         MOVE B,TPVB(TT) ;LINE 0.
3257         MOVEM B,TPVP(TT)
3258
3259 TYORCR: TLNE H,%TORAW   ;GO TO COLUMN 0 -  CR IN IMAGE MODE.
3260          JRST [ CAME TT,TTYLPP(I)
3261                  PUSHJ P,TYOASS ;NO OPTIMIZATION =>
3262                 SETZM TPHP(TT)
3263                 MOVEI A,%TDRCR  ;ARRANGE TO SEND REAL CR.
3264                 PUSHJ P,TYONCC
3265                 JRST TYOMVC]
3266         CAMN TT,TTYLPP(I)
3267          PUSHJ P,TYOMVC         ;ELSE DO CURSOR-MOTION.
3268         SETZ B, .SEE TPHB;(TT)
3269         MOVEM B,TPHP(TT)
3270         POPJ P,
3271
3272 TYOHMD: PUSHJ P,TYORCR  ;^PZ - HOME DOWN.
3273 TYOHD1: MOVE B,TCMXV(I) .SEE TPVE;(TT)
3274         SUBI B,1
3275         CAIGE B,119.
3276          MOVEM B,TPVP(TT)
3277         POPJ P,
3278
3279 TYODLB: SKIPN TPHP(TT)  ;^PX - DELETE BACKWARD.
3280          PUSHJ P,.+1    ;IN COLUMN 0, DO IT TWICE SO AS TO ERASE THE "!" AND CHAR BEFORE IT
3281         PUSH P,TPHP(TT)
3282         PUSHJ P,TYOMVB
3283         POP P,B
3284         SKIPN B
3285          AOS TPHP(TT)   ;IF WRAPPED AROUND, SET TO TCMXH-1
3286 TYODLF: MOVE B,TPHP(TT) ;^PK - ERASE 1 CHARACTER.
3287         CAML B,TCMXH(I) .SEE TPHE;(TT)  ;DO NOTHING AT END OF LINE.
3288          POPJ P,
3289         TLNE H,%TOOVR   ;IF CAN'T OVERPRINT, USE SPACE TO ERASE
3290          JRST [ TLNN H,%TOERS
3291                  POPJ P,        ;OTHERWISE, USE SPECIAL CONTROL SEQUENCE IF KNOWN
3292                 MOVEI A,%TDDLF
3293                 JRST TYONMV ]
3294         CAME TT,TTYLPP(I)
3295          PUSHJ P,TYOASS
3296         AOS TPHP(TT)
3297         MOVEI A,40              ;USE REALLY SPACE, NOT CURSOR MOTION!
3298         PUSHJ P,TYOOUT
3299         PUSHJ P,TYOMVB          ;THEN BACKSPACE OVER IT
3300         JRST TYOFNX
3301 \f
3302 SUBTTL .STATUS AND IOPDL FOR TTY
3303
3304 ;2.4 HAS "TTY"
3305 ;2.3 DDT MODE ON INPUT
3306 ;(STATYI);2.5 CHRS HAVE BEEN ITYI'ED BUT NOT .IOT'ED (STATYI)
3307         ;2.8 TELETYPE NEXT TO 340 OR 340 SLAVE
3308         ;2.9  TELETYPE IS LOCAL, NOT DIAL IN
3309
3310 STATYO: ANDI A,77
3311         CAIN A,%TINON   ;IF CHANNEL HAS NO REAL TTY,
3312          POPJ P,        ;THERE ARE NO SPECIFICS WE CAN SAY.
3313         SKIPN B,TORM(A)
3314         TRO D,1_9.      ;BUF CAP FULL
3315         CAIN B,TOBS
3316         TRO D,1_<9.+1>  ;BUFFER CAP EMPTY
3317 STATY1: SKIPL TTYTBL(U)
3318         TRO D,1_<9.+3>  ;HAS TTY
3319         IORI D,SNTTY
3320         MOVE H,TTYOPT(A)
3321         TLNE H,%TOERS
3322          TRC D,SNTTY#SNTDS
3323         POPJ P,
3324
3325 STATYI: ANDI A,77
3326         CAIN A,%TINON   ;CATCH "DISOWNED" TTY CHNLS.
3327          POPJ P,
3328         TRO D,1_<9+1>   ;ASSUME BUF CAP EMPTY
3329         SKIPN B,TICC(A) ;SEE IF THERE ARE ANY INPUT CHARACTERS
3330          JRST STATY2    ;NOT INCLUDING COM MODE ECHO
3331         MOVE E,TIOP(A)
3332 STATY3: CAMN E,TIBEP(A)
3333          SUBI E,TIBL
3334         ILDB TT,E
3335         TLNN TT,%TXIGN
3336          TRZA D,1_<9+1> ;INPUT SEEN, BUF CAP NOT EMPTY
3337           SOJG B,STATY3
3338 STATY2: CAIL B,TIBS-10.
3339          TRO D,1_9.     ;BUF CAP NEARLY FULL
3340         LDB B,[400400,,TTYTYP(A)]       ;GET LOCAL AND 340 MDS
3341         DPB B,[160400,,D]       ;DEPOSIT IN STATUS WORD
3342         CONO PI,TTYOFF
3343         MOVE TT,TICC(A)
3344         CAMLE TT,TINTC(A)
3345          TRO D,20000    ;MORE CHRS HAVE BEEN ITYI'ED THAN .IOT'ED
3346         CONO PI,TTYON
3347         JRST STATY1
3348
3349 ;TELETYPE IO PUSHDOWN ROUTINES
3350
3351 TYOIOP: TDZA A,A                ;OUUTPUT CHNL.
3352 TYIIOP:  MOVEI A,TYIMSK-TYOMSK  ;INPUT CHNL, SET TYIMSK INSTEAD TYOMSK.
3353         CONO PI,CLKOFF  ;TO PREVENT TELETYPE (IF CONSOLE) FROM MOVING AROUND
3354         JUMPGE B,TYIOP1 ;JUMP IF OPEN AS DEVICE
3355         SKIPGE TTYTBL(U)        ;IF PROCEDURE DOESN'T HAVE CONSOLE,
3356          JRST CLKONJ    ;THEN THAT'S ALL
3357 TYIOP1: LDB E,[$TIIDX,,B]       ;GET TTY NUMBER IN E
3358         ADDI E,(A)              ;IF INPUT, TYOMSK(E) WILL BE TYIMSK VAR.
3359         HRRZ R,UUAC(U)  ;GET "AC FIELD" (IO PUSHDOWN ROUTINES RESTORE R)
3360         MOVE A,CHNBIT(R)        ;GET RELEVANT CHANNEL INTERRUPT BIT
3361         XCT TYIOPT(I)   ;IORM OR ANDCAM A TO TYOMSK(E)
3362         JRST CLKONJ     ;RETURN
3363
3364 TYIOPT: ANDCAM A,TYOMSK(E)      ;IOPUSH (PSEUDO-CLOSE)
3365         IORM A,TYOMSK(E)        ;IOPOP (PSEUDO-OPEN)
3366
3367 ;STY IO PDL ROUTINES
3368
3369 STYOIP: TDZA A,A
3370 STYIIP:  MOVEI A,STYMSK-STYOMS
3371         ADDI A,STYOMS-NFSTTY-TYOMSK
3372         JRST TYIOP1
3373 \f
3374 SUBTTL TTY CLOSE ROUTINES
3375
3376 ;INPUT CLOSE
3377
3378 TYICLS: JSP E,TYCLOS    ;IGNORE FOR DISOWNED CONSOLE
3379         ANDCAM B,TYIMSK(A)      ;INDICATE CHANNEL CLOSURE
3380         JRST TYICL2
3381
3382 TYCLOS: LDB I,[210100,,A]
3383         ANDI A,77       ;THROW AWAY TOP BITS OF IOCHNM WD, GET TTY #.
3384         CAIN A,%TINON   ;FOR A CHNL IN A TTYLESS TREE,
3385          POPJ P,        ;DON'T SOS ANYONE'S TTNTO.
3386         SKIPGE APRC(U)  ;SKIP UNLESS DISOWNED
3387          JUMPN I,[JRST 4,.] ;DISOWNED JOB HAS REAL CONSOLE TTY?
3388         SKIPGE TTYTBL(U);IF IT'S A CONSOLE AND THIS JOB DOESN'T
3389          JUMPN I,TYICL2 ;HAVE TTY, DON'T CHANGE TYIMSK OR TYOMSK.
3390         HRRZ R,UUAC(U)
3391         MOVE B,CHNBIT(R) ;GET THE BIT TO CLEAR IN TYIMSK OR TYOMSK.
3392         JRST (E)        ;RETURN & CLEAR IT.
3393
3394 ;OUTPUT CLOSE
3395
3396 TYOCLS: JSP E,TYCLOS    ;IGNORE FOR DISOWNED CONSOLE
3397         MOVE I,A
3398         SKIPE USER
3399          PUSHJ P,TYOWC  ;WAIT A WHILE FOR OUTPUT TO FINISH
3400         ANDCAM B,TYOMSK(A)      ;SET OF OUTPUT CHNLS OPEN.
3401 TYICL2: SOSLE TTNTO(A)
3402          POPJ P,                ;MORE OPENS ON TTY
3403         SKIPE TTNTO(A)
3404          BUG
3405         MOVE B,TTYSTS(A)
3406         TLNE B,%TSCNS
3407          POPJ P,                ;OPEN AS CONSOLE
3408         JRST TTYLO1
3409
3410 ;WAIT FOR TTY OUTPUT BUFFER TO BE EMPTY,
3411 ;BUT TIME OUT IF TTY DOESN'T TYPE OUT FOR 5 SEC.
3412 TYOWC:  MOVEM I,EPDL3(U) ;SAVE TTY # FOR TYOW5.
3413 IFN N11TYS,[
3414         MOVE T,TTYTYP(I)
3415         TRNE T,%TY11T
3416          POPJ P,
3417 ]
3418         MOVEI T,TOBS    ;WAIT TILL OUTPUT BUFFER EMPTY
3419         PUSHJ P,TYOW5   ;BUT DON'T WAIT TOO LONG.
3420         POPJ P,         ;TYOW5 MAY POP1J.
3421 \f
3422 ;TTY # IN A - MAKE THE TTY FREE.
3423 TTYLO1: SETZM TTNTO(A)
3424         SETZM TYIMSK(A)
3425         SETZM TYOMSK(A)
3426         HRLOI B,%TSFRE
3427         IORB B,TTYSTS(A) ;SAY TTY FREE (BUT TTYSTA OFF SO CAN'T ^Z)
3428         PUSHJ P,TTYLFC  ;REMOVE TTY FROM COM MODE AND
3429         PUSHJ P,TYIRS0  ;RESET INPUT BUFFER
3430 IFN TTLPTP,[
3431         CAMN I,LPTTTY   ;IF TTY'S THE LPT, IT'S NOT IN USE.
3432          SETOM LPTUSR
3433 ]
3434         MOVE T,TTYTYP(I)
3435         TRNN T,%TYSTY
3436          PUSHJ P,TTYIN1 ;RE-INIT USER OPTIONS
3437         TRNE T,%TYDIL\%TYRLM    ;DIALUP LINE => MAKE IT PRINTING.
3438          TRNE T,%TYMDM  ;UNLESS WE CAN DETECT DISCONNECTS, IN WHICH CASE DO IT THEN.
3439           CAIA
3440            PUSHJ P,NCNSSP
3441 IFN N11TYS,[
3442         TRNE T,%TY11T
3443          PUSHJ P,NCNSST
3444 ]
3445         MOVEI B,SCRCFM
3446         SKIPL TTYSTA(I)
3447          IORM B,SUPCOR  ;REQUEST A CONSOLE-FREE MESSAGE.
3448         MOVE A,I        ;IN CASE OUR CALLER WANTS TTY # IN A.
3449         POPJ P,
3450
3451 IFN N11TYS,[
3452 TTYLO2: MOVE B,TTYTYP(A) ;TTY BEING CLOSED & CNSL FREE MSG NOT NEEDED,
3453         SKIPGE TT11P    ;IF IT'S A PDP11-TV TTY
3454          TRNN B,%TY11T
3455           POPJ P,
3456         MOVE I,A        ;MAKE ALL JOBS CEASE TO HACK THIS SCREEN
3457         PUSHJ P,NTVWH1  ;B := VIDEO BUFFER NUMBER
3458          BUG
3459         SETZ A,
3460 TTYLO3: LDB C,[$11BY0,,TVCREG(A)] ;VIDEO BUFFER HACKED BY THIS JOB OR 377
3461         CAMN C,B
3462          SETOM TVCREG(A) ;IF JOB HACKING THIS VIDEO BUFFER, MAKE IT STOP.
3463         ADDI A,LUBLK
3464         CAMGE A,USRHI
3465          JRST TTYLO3
3466         MOVE B,TT11HD   ;TELL THE 11 THE TTY IS FREE.
3467         ADDI B,1-NF11TY(I)
3468         ADD B,TT1111
3469         HRROI T,-1_4+10 ;SET TTY'S PHYSLC WORD TO -1.
3470         MOVEM T,(B)
3471         MOVE T,TOBBP(I) ;RESET OUTPUT BUFFER POINTER TO BEGINNING OF
3472         MOVEM T,TOIP(I) ; BUFFER.  THE 11 DOES ALSO.
3473         POPJ P,
3474 ]
3475
3476 ;REMOVE A TTY FROM COM MODE IF IT IS COM MODE.
3477 ;CALLED WHEN TTY BECOMES FREE, ETC.
3478 ;TAKES TTY # IN A; LEAVES IT IN A AND I.
3479 TTYLFC: HRRZ I,A
3480         CONO PI,TTYOFF
3481         SKIPL Q,TTYCOM(I)
3482          JRST TTLFC1
3483         PUSH P,I
3484         PUSH P,U
3485         PUSHJ P,TYCSET
3486         TLZ Q,%TCCBK+%TCTPN+%TCCBS
3487         MOVEM Q,TTYCOM(I)       ;FLUSH COM MODE TEMP FLAGS.
3488         PUSHJ P,TYCGTM          ;REMOVE THE TTY FROM COM LINKS.
3489         POP P,U
3490         POP P,I
3491 TTLFC1: MOVE A,I
3492         MOVEI B,TTYI
3493         MOVEM B,TTYIPC(A)
3494         POPJ P,
3495 \f
3496 SUBTTL TTY RESET ROUTINES
3497
3498 ;TTY INPUT RESET
3499
3500 TYIRS:  PUSHJ P,TTYWR
3501          POPJ P,                ;IGNORE IF WE DON'T OWN THE TTY.
3502 TYIRS0: MOVSI T,%TCLFT+%TCICO
3503         PUSHJ P,TTYCMW          ;MAYBE WAIT FOR COM LINK TO FINISH.  RETURN WITH TTYCHN OFF.
3504         PUSHJ P,TYIRS1          ;DISCARD THE INPUT.
3505         JRST TTYONJ
3506
3507 ;; DISCARD THE CONTENTS OF THE TTY INPUT BUFFER.  TTY NUMBER IN I.
3508 TYIRS1: MOVE B,TIIP(I)          ;Get input pointer.
3509         MOVEM B,TIOP(I)         ;Bash output ptr to it.
3510         MOVEM B,TINTP(I)        ;Bash interrupt-peeked ptr to it.
3511         MOVEM B,ECHOP(I)        ;Bash echo ptr to it.
3512         SETZM ECHOC(I)          ;Nothing to echo.
3513         CLEARM TICC(I)          ;Nothing has been input.
3514         CLEARM TACC(I)          ;No activation chars either.
3515         CLEARM TINTC(I)         ;Nothing to ITYIC either.
3516         POPJ P,
3517
3518 ;OUTPUT RESET
3519
3520 TYORS:  PUSHJ P,TTYWR   ;CHECK FOR OWNING TTY.  TTY NUMBER IN I.
3521          POPJ P,        ;NON-SKIP MEANS NO; IGNORE THE .RESET.
3522         SKIPL TTOALC(I)
3523          PUSHJ P,UFLS
3524         MOVSI T,%TCLFT+%TCOCO+%TCICO+%TCFPD     ;ALSO WAIT FOR OUTPUT SEQ TO FINISH.
3525         PUSHJ P,TTYCMW  ;HANG UNTIL OUT OF COM MODE, OR OVER-RIDDEN. MAY UTCOFF.
3526         MOVSI B,%TJCP1+%TJCP2+%TJSTP    ;IF LAST CHAR THIS CHNL WAS ^P,
3527         ANDCAM B,(R)    ;FORGET IT. ALSO UNHANG CHANNEL FROM **MORE**.
3528         MOVE TT,I
3529         IMULI TT,TPLEN*2
3530         MOVEI B,%TFEOP+%TFIGL ;RESTORE BOTH PCS OF PPR TO NORMAL STATE.
3531         ANDCAM B,TPFLAG(TT)
3532         ANDCAM B,TPFLAG+TPLEN(TT)
3533         MOVE B,TTYOPT(I) ;IS OUTPUT RESET SUPPOSED TO DO SOMETHING?
3534         TRNN B,%TPORS   ;(ON FAST TTYSS IT DOESN'T)
3535          JRST UTCONJ
3536         MOVE B,TTYCOM(I)
3537         TLNE B,%TCECH
3538          JRST UTCONJ
3539 TYORS1: MOVE B,TOOP(I)  ;SCAN BACKWARD 4 CHARS FROM TOOP TO SEE IF A %TDMOV
3540         MOVEM B,TOIP(I)
3541         MOVEI TT,TOBS-4 ;HAS BEEN PARTIALLY REMOVED FROM THE BUFFER.
3542         MOVEM TT,TORM(I) ;TORM HAS THE RIGHT VALUE ASSUMING A %TDMOV APPEARS
3543                         ;JUST BEFORE TOOP - THE FIRST PLACE WE WILL LOOK FOR ONE.
3544 TYORS4: LDB T,B
3545         CAIE T,%TDMV0
3546         CAIN T,%TDMV1
3547          JRST TYORS8
3548         CAIN T,%TDMOV   ;IF ONE IS FOUND IN THOSE 4 CHARS, IT MUST EXTEND PAST TOOP,
3549          JRST TYORS5    ;SO TAKE TOOP AND INCREMENT IT TO GET NEW TOIP.
3550         IBP B           ;DBP B - KNOWING THAT THERE ARE 4 BYTES/WORD.
3551         IBP B
3552         IBP B
3553         SUBI B,1
3554         CAMN B,TOBBP(I)
3555          MOVE B,TOBEP(I)
3556         AOS TT,TORM(I)  ;AS THE %TDMOV GETS FARTHER BACK, ITS REMNANT OCCUPIES LESS SPACE.
3557         CAIE TT,TOBS    ;IF ITS REMNANT TAKES NO SPACE, FORGET ABOUT IT.
3558          JRST TYORS4
3559         JRST TYORS6
3560
3561 TYORS8: ADDI TT,2       ;THIS REMNANT IS TWO CHARS LONG
3562         CAIL TT,TOBS
3563          JRST [ MOVEI TT,TOBS
3564                 MOVEM TT,TORM(I)
3565                 JRST TYORS6 ]
3566         MOVEM TT,TORM(I)
3567 TYORS5: SUBI TT,TOBS    ;TT GETS -<LENGTH OF REMNANT>
3568         MOVE B,TOOP(I)
3569 TYORS7: CAMN B,TOBEP(I) ;SCAN FORWARD FROM TOOP TO FIND END OF REMNANT
3570          MOVE B,TOBBP(I)
3571         IBP B
3572         AOJL TT,TYORS7
3573         MOVEM B,TOIP(I) ;AND FLUSH FROM BUFFER ALL BUT THAT REMNANT.
3574 ;DROPS THROUGH
3575 \f;DROPS IN
3576 TYORS6: MOVE B,TCTYP(I) ;IF A "SOFTWARE" TTY, SEND A %TDORS.
3577         CAIE B,%TNSFW
3578          JRST [ MOVE B,TTYTYP(I)
3579                 TRNN B,%TYSTY   ;ELSE, ON A STY, IF %SSORS
3580                  JRST TYORS2
3581                 MOVE B,STYSTS-NFSTTY(I)
3582                 TLNN B,%SSORS
3583                  JRST TYORS2
3584                 JRST .+1]       ;THEN SEND %TDORS
3585         SOS TORM(I)
3586         MOVE B,TOIP(I)
3587         CAMN B,TOBEP(I)
3588          MOVE B,TOBBP(I)
3589         MOVEM B,TOIP(I) ;CHECK FOR WRAP
3590         MOVEI B,%TDORS  ;RESET CODE
3591         IDPB B,TOIP(I)
3592         PUSHJ P,TYORS2  ;FINISH RESETTING, TURN TTYCHN BACK ON,
3593         AOSN TTYOAC(I)  ;AND ACTIVATE INT. LEVEL, SO %TDORS WILL BE SENT.
3594          XCT TTYST(I)   ;(THIS MAY TURN TTYCHN OFF AND ON AGAIN).
3595         MOVE B,TTYOPT(I)
3596         TRNN B,%TPCBS   ;ON SOFTWARE TTY WITH ^\ TURNED ON, STOP TYPEOUT AT M.P.
3597          POPJ P,        ;LEVEL UNTIL THE TTY SAYS WHAT ITS CURSOR POSITION IS NOW,
3598         HRRZS TTOALC(I) ;USING ^\^P... OR SCPOS
3599         POPJ P,
3600
3601 TYORS2: SKIPGE TT,TTYLPP(I)
3602          SETCMB TT,TTYLPP(I)
3603         SKIPL B,TTYIHP(I)       ;AND UNDO MAIN PRGM CURSOR POS MVT
3604         CAMGE B,TCMXH(I)
3605          JRST TYORS3
3606         MOVE B,TCMXH(I)
3607         SUBI B,1
3608         MOVEM B,TTYIHP(I)
3609 TYORS3: MOVEM B,TPHP(TT)
3610         MOVE B,TTYIVP(I)
3611         CAML B,TCMXV(I)
3612          BUG
3613         MOVEM B,TPVP(TT)
3614         SETOM TTYLPS(I)
3615         JRST UTCONJ
3616
3617 ;SEND A %TDINI TO ALL TTYS.  CALLED AT SYSTEM STARTUP.
3618 TTRSAL: MOVSI I,-NCT
3619 TTRSA1: MOVE T,TCTYP(I)
3620         MOVE H,TTYOPT(I)
3621         MOVE Q,TOIP(I)
3622         CONO PI,TTYOFF
3623         MOVEI A,%TDINI
3624         PUSHJ P,TYOOU1  ;YES, SEND IT A REINIT CHARACTER
3625         MOVEM Q,TOIP(I)
3626         CONO PI,TTYON
3627         AOSN TTYOAC(I)
3628          XCT TTYST(I)   ;AND MAKE SURE IT GETS SENT TO THE TTY
3629 TTRSA2: AOBJN I,TTRSA1
3630         POPJ P,
3631 \f
3632 SUBTTL TV-11 INPUT PROCESSOR
3633
3634 IFN N11TYS,[
3635 ;CALL HERE FROM CLOCK LEVEL WHEN THERE IS INPUT FROM THE PDP-11.
3636 ;TAKE CHARACTERS FROM THE PDP11 AND CALL THE TTY INPUT INT. LVL.
3637 ;ROUTINES WITH THEM ONE AT A TIME. MAY CLOBBER ANY ACS.
3638 TT11IN: SKIPL TT11P     ;IF 11 DOWN, DON'T LOOK FOR INPUT FROM IT.
3639          JRST TT11D1
3640         LDB TT,[$11WD0,,@TT11HD]
3641         SETZM @TT11HD   ;GET AND RESET CHAIN OF INPUT BUFFERS.
3642 ;HANDLE THE NEXT INPUT BUFFERFULL. PDP11 ADDRESS IN TT.
3643 TT11I1: LSH TT,-2       ;CONVERT PDP11 ADDRESS TO PDP10 ADDR.
3644         ADDI TT,TT11LO
3645         MOVE A,(TT) ;GET -<# CHARS IN BUFFER>
3646         ASH A,-24
3647         LDB I,[$11WD0,,2(TT)] ;GET # OF TTY THE CHARS ARE FOR.
3648         CAML A,[-400]   ;IF A OR I IS RIDICULOUS,
3649          CAML I,TT1111
3650           JRST TT11LS   ;ASSUME 11 HAS CRASHED.
3651         JUMPG A,TT11LS
3652         ADDI I,NF11TY
3653         MOVEI B,3(TT)   ;SET UP BP TO DATA AREA OF BUFFER.
3654         HRLI B,$11WD1   ;EACH CHAR IS 16. BITS - A PDP11 WORD.
3655         PUSH P,TT       ;SAVE BUFFER ADDR SO CAN FIND NEXT BFR.
3656         CAIL I,NF11TY+N11TYS
3657          JRST [ MOVE A,I        ;IF 11 KNOWS MORE TV'S THAN 10, IGNORE THOSE 10 ISN'T USING.
3658                 PUSHJ P,TTYLO2  ;AND IF THE 11 STARTS USING ONE, FREE IT SO USER ISN'T CONFUSED.
3659                 JRST TT11I3]
3660         CONO PI,TTYOFF-1
3661         JUMPE A,TT11I4
3662         PUSH P,I
3663         PUSH P,A
3664         PUSH P,B
3665 TT11I2: ILDB A,(P)      ;GET NEXT CHAR FROM BFR,
3666         MOVE I,-2(P)
3667         PUSHJ P,NTYI5   ;PRETEND IT CAME FROM A TTY CONTROLLER INT.,
3668         AOSE -1(P)
3669          JRST TT11I2    ;MORE CHARS => HANDLE THEM.
3670         SUB P,[3,,3]
3671 TT11I3: CONO PI,TTYON-1
3672         POP P,A         ;ADDR. OF BUFFER JUST EMPTIED.
3673         LDB TT,[$11WD1,,1(A)] ;GET ADDR OF NEXT BUFFER.
3674         SETZB B,(A)     ;THIS BUFFER NOW FREE.
3675         DPB B,[$11WD1,,1(A)]
3676         JUMPN TT,TT11I1 ;LOOK AT NEXT ONE, IF ANY.
3677         POPJ P,
3678
3679 TT11I4: PUSHJ P,TYPEND  ;INPUT BUFFER WITH 0 CHARS SAYS OUTPUT BUFFER
3680         JRST TT11I3     ;IS EMPTY, SO MAYBE REQUEST ECHOING.
3681
3682 TT11LS: MOVEM A,TT11ER  ;LEAVE DIAGNOSTIC INFO BEHIND
3683         MOVEM I,TT11ER+1
3684         MOVEM TT,TT11ER+2
3685         MOVE A,(TT)
3686         MOVEM A,TT11ER+3
3687         MOVE A,1(TT)
3688         MOVEM A,TT11ER+4
3689         MOVE A,2(TT)
3690         MOVEM A,TT11ER+5
3691 TT1LS1: SETZM TT11P     ;MARK 11 DOWN AND DONT TRY TO COME BACK UP FOR NOW
3692         MOVEI A,SCR11D  ;MAKE SYS JOB PRINT "11 WENT DOWN" MESSAGE.
3693         IORM A,SUPCOR
3694 TT11D1: MOVEI A,TT11HD+1 ;MAKE SURE CLOCK LEVEL DOESN'T THINK
3695         MOVEM A,TT11HD  ;THAT THE 11 IS SENDING INPUT.
3696         POPJ P,
3697 ]
3698 \f
3699 SUBTTL TERMINET MOTOR CONTROL
3700
3701 ;COME HERE FROM VERY SLOW CLOCK (2 MIN.), RUNNING IN SYS JOB.
3702 ;TURN OFF MOTORS OF ALL TERMINETS THAT HAVE BEEN IDLE 30. SEC.
3703 ;MAY CLOBBER ANY ACS.
3704 TTTMNT: MOVE TT,TIME
3705         SUBI TT,900.    ;TT=30. SECONDS AGO.
3706         CAIA
3707 TTTMN2:  MOVE TT,TIME   ;TURN OFF ALL TERMINETS AT SYSTEM STARTUP.
3708         MOVSI I,-NCT
3709 TTTMN0: MOVE T,TCTYP(I)
3710         CONO PI,TTYOFF
3711         SKIPL SHUTDN
3712         CAML TT,TTLTM(I) ;IF TTY HAS OUTPUT RECENTLY
3713         CAIE T,%TNTRM   ;OR ISN'T A TERMINET,
3714          JRST TTTMN1    ;NOTHING TO DO.
3715         MOVSI T,%TCMTR
3716         TDNE T,TTYCOM(I) ;DITTO IF MOTOR ALREADY OFF.
3717          JRST TTTMN1
3718         IORM T,TTYCOM(I)
3719         MOVE H,TTYOPT(I)
3720         MOVE Q,TOIP(I)
3721         MOVEI A,%TDMTF  ;PUT A MOTOR-OFF COMMAND IN OUTPUT BFR
3722         PUSHJ P,TYOOU1
3723         MOVEM Q,TOIP(I)
3724         CONO PI,TTYON
3725         AOSN TTYOAC(I)
3726          XCT TTYST(I)   ;AND TELL INT. LVL. ABOUT IT.
3727 TTTMN1: CONO PI,TTYON
3728         AOBJN I,TTTMN0
3729         POPJ P,
3730
3731 ;CALL HERE WHEN ABOUT TO OUTPUT TO A TERMINET WHOSE MOTOR IS OFF
3732 ;TTY # IN I. LEAVES TTY'S TTYCOM IN Q.
3733 TTTMTO: MOVE Q,TOIP(I)
3734         MOVEI A,%TDMTN
3735         MOVE H,TTYOPT(I)
3736         PUSHJ P,TYOOU1  ;PUT MOTOR-ON CMD IN OUTPUT BFR,
3737         MOVEM Q,TOIP(I)
3738         MOVSI Q,%TCMTR  ;MOTOR NOW ON AS FAR AS MAIN PRGM
3739         ANDCAB Q,TTYCOM(I) ;IS CONCERNED.
3740         POPJ P,
3741 \f
3742 SUBTTL PI-LEVEL ECHOING
3743
3744 ;ECHOING - CALLED AT CLOCK LEVEL. MAY CLOBBER ANY AC.
3745 ;ECHOES CHARS BY COPYING THEM FROM INPUT BFR TO OUTPUT BFR.
3746 TTECH:  MOVSI I,200000  ;GET LIST OF TTYS NEEDING ECHO, AND REINIT IT.
3747         EXCH I,TTERQS
3748 TTELUP: AOS NTTELU      ;TAKE STATISTICS.
3749         CAIL I,-1
3750          POPJ P,        ;NO MORE TTYS NEED ECHOING.
3751                 ;I HAS IDX OF A TTY NEEDING ECHOING.
3752 IFN N11TYS,[
3753         MOVE T,TTYTYP(I)
3754         TRNE T,%TY11T
3755          JRST TTELU3
3756 TTELU4: ]
3757         MOVEI A,TOBS
3758         MOVSI T,%TCECH
3759         TDNE T,TTYCOM(I);CAN'T ECHO UNLESS OUTPUT BUFFER HAS ENOUGH ROOM,
3760          MOVEI A,TYOWNC+1
3761         CAMG A,TORM(I)  ;NO MAIN PROGRAM OUTPUT IN IT,
3762          SKIPL TTOALC(I);OUTPUT NOT BLOCKED AT M.P. LEVEL,
3763           JRST TTEDU4
3764         SKIPL TYOSW(I)  ;AND NO MORE OUTPUT COMING SOON.
3765          JRST TTEWAT    ;PUT TTY BACK ON LIST.
3766         MOVE H,TTYOPT(I)
3767         MOVE Q,TTYCOM(I)
3768         TLNE Q,%TCMTR   ;IF TTY'S MOTOR IS OFF, TURN IT ON.
3769          PUSHJ P,TTTMTO
3770         MOVEI J,TTEDMY  ;PROVIDE IOT RTNS WITH VARIABLE-BLOCK.
3771         SKIPGE TT,TTYLPP(I) ;TT HAS IDX OF MOST RECENTLY USED PC PPR
3772          SETCM TT,TTYLPP(I) ;WHETHER NOW ASSOCIATED OR NOT.
3773         MOVE A,TPVB(TT) ;PERHAPS MOST RECENT PC PPR IS ECHO AREA,
3774         CAMN A,TCMXV(I) ;BUT THERE'S NO ECHO AREA NOW. IN THAT CASE,
3775          SUBI TT,TPLEN  ;MAKE SURE DON'T TRY TO FORCE OUT BUFFERED CURSOR POS IN THAT PC PPR.
3776 TTEDU2: TLZE Q,%TCDNG   ;SHOULD BELL BE TYPED BECAUSE INPUT BFR FULL?
3777          PUSHJ P,[MOVEM Q,TTYCOM(I)
3778                 MOVEI R,%TJECH+%TJMOR
3779                 MOVEI A,^G      ;DING ON TTY IF DESIRED.
3780                 JRST TYO8]
3781 TTELP1: SKIPN T,ECHOC(I)        ;ANY CHARS TO BE ECHOED NOW IN INPUT BFR?
3782          JRST TTEDUN    ;NO, FINISHED ECHOING.
3783         SKIPG T
3784          BUG                    ;ECHOED MORE CHARS THAN THERE WERE?
3785         AOS NTTEL1
3786 ;NOW FIND NEXT CHARACTER NEEDING PI ECHO,
3787 ;AND MARK IT AS NO LONGER NEEDING IT.
3788 ;CAN EXIT TO TTEDU5 IF MUST STOP ECHOING BECAUSE ECHOING IS DEFERRED.
3789         CONO PI,TTYOFF-1        ;PREVENT INTERACTION WITH INPUT INTERRUPTS.
3790         MOVE B,ECHOP(I)
3791 TTELP2: MOVE C,TICC(I)
3792         CAMN B,TIIP(I)
3793          JRST TTELBG
3794         MOVE C,B
3795         CAMN B,TIBEP(I) ;LOOK FOR 1ST CHAR NEEDING PI ECHO.
3796          SUBI B,TIBL
3797         ILDB A,B
3798         TRZN A,%TXPIE
3799          JRST TTELP2
3800         TRNN A,%TXIGN   ;DON'T ECHO NON-COM-MODE CHARS
3801          JRST [ MOVE T,TTYSTS(I)        ;IF ECHOING BEING DEFERRED.
3802                 TLNE T,%TSNOE
3803                 TLNE H,%TOHDX   ;BUT IF HALF-DUPLEX, IT ECHOES IN ANY CASE.
3804                  JRST .+1
3805                 JRST TTEDU5]
3806         SOSGE ECHOC(I)  ;FOUND ONE; NOW ECHO IT.
3807          BUG
3808         MOVEM B,ECHOP(I)
3809         DPB A,B         ;MARK IT AS ECHOED.
3810         LDB A,B         ;CHECK FOR HARDWARE LOSSAGE.
3811         TRNE A,%TXPIE
3812          BUG            ;DPB OR TRZN LOST??
3813         TRNN A,%TXIGN   ;IF CHAR IS IN BFR ONLY TO BE ECHOED,
3814          JRST TTELP5
3815         CAMN C,TIOP(I)  ;IF IT'S 1ST CHAR IN CUFFER,
3816          JRST [ PUSHJ P,TYIRE1  ;REMOVE IT THE NORMAL WAY.
3817                 JRST TTELP5]
3818         CAMN B,TIIP(I)  ;IF CHAR IS LAST CHAR IN BFR,
3819          PUSHJ P,TTEBAK ;DELETE IT, & MAYBE OTHERS BEFORE IT.
3820 TTELP5: CONO PI,TTYON-1
3821 ;DECIDE WHICH PC PPR TO USE.
3822         MOVE T,I
3823         IMULI T,2*TPLEN         ;COMPUTE INDEX OF M.P. PC-PPR.
3824         SKIPGE Q,TTYCOM(I)      ;COM MODE, UNLESS %TCICO OR %TCLFT, MEANS USE M.P. AREA.
3825          TDNE Q,[%TCICO+%TCLFT,,400000]
3826           MOVE T,TTYEPP(I)      ;OTHERWISE USE THE ECHO AREA IF ANY.
3827         MOVE B,TTYSTS(I)
3828         TRNN A,%TXECI
3829          TRNN A,%TXIGN          ; FOR ^_ COMMANDS, DON'T OBEY %TSNEA.
3830           TLNN B,%TSNEA         ; %TSNEA SAYS USE M.P. AREA.
3831            JRST TTELP4
3832         MOVE T,I
3833         IMULI T,2*TPLEN
3834 TTELP4: SKIPGE TT,TTYLPP(I)     ;TT GETS LAST PC PPR HACKED WITH THIS TTY.
3835          SETCA TT,
3836         CAMN TT,T       ;IF WE ARE SWITCHING TO A DIFFERENT PC PPR,
3837          JRST TTELU1
3838         SKIPL TTYLPP(I) ;DISASSOCIATE THE OLD ONE IF NEC.
3839          PUSHJ P,TYOMVC
3840 TTELU1: MOVE TT,T       ;MOST RECENT PC PPR NOW ECHOING PC PPR.
3841         MOVSI Q,%TCECH  ;NOW DEFINITELY GOING TO PUT CHARS IN OUTPUT BUFFER
3842         IORB Q,TTYCOM(I)
3843         MOVEI R,%TJECH+%TJMOR
3844         TLNN H,%TOHDX   ;ON HALF-DUPLEX TTYS, EXCEPT FOR
3845          JRST TTELP3
3846         TRNN A,%TXCOM   ;CHARS PRODUCED BY COM LINKS,
3847          PUSHJ P,[IORI R,%TJHDE
3848                 JRST TYOAS5]    ;MOVE CURSOR BUT DON'T REALLY OUTPUT.
3849                 ;THUS, CURSOR MOTION DUE TO ECHOING BY TTY
3850                 ;IS ACCOUNTED FOR.
3851 TTELP3: LDB B,[.BP %TXASC,A]
3852         TRNE A,%TXECI
3853          JRST TTELP6
3854         TRZE A,%TXIGN
3855          CAIE B,^L      ;^L ECHOED IN COM MODE SHOULD CLEAR SCREEN.
3856           TRZA R,%TJCP1
3857            JRST [ MOVEI A,"C    ;(BY SIMULATING A ^PC).
3858                   IORI R,%TJCP1
3859                   JRST .+1]
3860 TTELP6: ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC
3861         PUSHJ P,TYO8
3862         TRZE R,%TJHDE
3863          PUSHJ P,TYOMVC
3864         SKIPN ECHOC(I)
3865          JRST TTEDUN
3866 IFN N11TYS,[
3867         TRNE H,%TP11T
3868          JRST [ PUSHJ P,TYOWN1
3869                 LDB B,T
3870                 CAIE B,1_TT11BY-1
3871                  JRST TTEDU6 ;LESS THAN 20. FREE SPACES IN BFR => GIVE UP.
3872                 JRST TTELP1]
3873 ]
3874         MOVE A,TORM(I)
3875         CAIGE A,TYOWNC  ;IS THERE A CHANCE OUTPUT WOULD HANG UP?
3876          JRST TTEDU4    ;YES, WAIT UNTIL LATER TO ECHO THE REST.
3877         JRST TTELP1     ;NO, ECHO MORE
3878
3879 TTELBG: BUG PAUSE,[ECHOC is ],OCT,T,[ but ECHOP equals TIIP.  TICC=],OCT,C,[.  TTY ],OCT,I
3880         SETZM ECHOC(I)
3881 ;COME HERE WHEN ALL ECHOING DESIRED ON THIS TTY WAS DONE.
3882 TTEDUN: CONO PI,TTYOFF-1
3883         SKIPE ECHOC(I)
3884          JRST TTEDU1
3885 TTEDU5: MOVE Q,TTYCOM(I)
3886         TLNE Q,%TCDNG   ;HAS ANOTHER REASON TO ECHO ARISEN AFTER WE CHECKED?
3887          JRST TTEDU1    ;YES, GO PROCESS IT.
3888         PUSH P,TTYERQ(I);SAVE NEXT TTY TO ECHO ON
3889         SETOM TTYERQ(I) ;AND TURN OFF THIS ONE'S ECHO REQUEST
3890         CONO PI,TTYON-1
3891         SETZ R,
3892         CAME TT,TTYLPP(I)
3893          PUSHJ P,TYOFRC ;FORCE OUT BUFFERED CURSOR MOTION.
3894         POP P,I
3895         JRST TTELUP
3896
3897 TTEDU4:
3898 TTEDU3: SETO A,         ;NO, MOVE TO NEXT TTY ON LIST.
3899         EXCH A,TTYERQ(I)
3900         MOVE I,A
3901         JRST TTELUP
3902
3903 TTEDU1: CONO PI,TTYON-1
3904         JRST TTEDU2
3905
3906 ;COME HERE WHEN CAN'T ECHO BECAUSE TYOSW IS LOCKED.
3907 TTEWAT: AOS NTTEWA
3908         MOVE A,I        ;IF WE CAN'T DO ANY.
3909         CONO PI,TTYOFF-1
3910         EXCH A,TTERQS   ;PUT THIS TTY BACK ON LIST,
3911         EXCH A,TTYERQ(I) ;SO IT WIL BE REEXAMINED NEXT TICK.
3912         CONO PI,TTYON-1
3913         MOVE I,A        ;MOVE TO NEXT TTY ON OLD LIST.
3914         JRST TTELUP
3915
3916 IFN N11TYS,[
3917 TTELU3: SKIPL TT11P
3918          JRST TTEDU4    ;DON'T ECHO ON PDP11 TTYS IF PDP11 DOWN.
3919         LDB A,TOIP(I)   ;DEFER ECHOING UNLESS OUTPUT BFR EMPTY.
3920         CAIN A,1_TT11BY-1
3921          JRST TTELU4    ;JUMP IF BUFFER EMPTY (LAST CHAR OUTPUT CHANGED TO -1)
3922 TTEDU6: JRST TTEWAT     ;TEMPORARY PATCH
3923 .ERR IS THIS PATCH TEMPORARY OR PERMANENT?
3924         MOVE A,TT11HD   ;BFR NOT EMPTY: TELL 11
3925         ADDI A,1-NF11TY(I) ;(BY SETTING ECOFLG)
3926         ADD A,TT1111
3927         MOVSI B,400000  ;TO SIGNAL TEN WHEN THE BUFFER BECOMES EMPTY.
3928         IORM B,(A)      .SEE TT11I4
3929         JRST TTEDU4
3930 ]
3931 ;COME HERE WHEN ARE JUST ABOUT TO ECHO THE LAST CHAR
3932 ;IN THE INPUT BUFFER, AND ITS %TXIGN IS SET.
3933 ;TRY TO FLUSH THE CHARACTER FROM THE INPUT BFR,
3934 ;AND ALSO THE CHARS BEFORE IT, IF THEY TOO HAVE %TXIGN.
3935 TTEBAK: SKIPE C,ECHOC(I)
3936          BUG PAUSE,[ECHOING LAST CHAR BUT ECHOC IS ],OCT,C,[.  TTY ],OCT,I
3937         SETZM ECHOC(I)
3938         IBP B           ;THIS DEPENDS ON 18-BIT BYTES IN INPUT BUFFER.
3939         SUBI B,1
3940         CAMN B,TIBEP-1(I)
3941          ADDI B,TIBL
3942         SOSN TICC(I)
3943          JRST TTEBA1
3944         LDB C,B
3945         TRNE C,%TXIGN
3946          JRST TTEBAK
3947 TTEBA1: MOVE C,TIIP(I)
3948         CAMN C,TINTP(I)
3949          MOVEM B,TINTP(I)
3950         CAME C,ECHOP(I)
3951          BUG
3952         MOVEM B,ECHOP(I)
3953         MOVEM B,TIIP(I)
3954         POPJ P,
3955 \f
3956 SUBTTL TTY INTERRUPT HANDLING
3957
3958 ;MACRO TO SAVE ACS AND CONI APR ON ENTERING A TTYCHN INTERRUPT ROUTINE.
3959 ;PCLOC SHOULD BE THE ADDRESS OF THE STORED PC, WHICH IS MOVED TO TTYBRK.
3960 DEFINE TTYSAV PCLOC=TTYBRK
3961 IFN KL10P,[
3962         CONSO PI,1_<7-TTYCHN>
3963          JRST 4,.               ;HARDWARE BUG ALLEGEDLY FIXED
3964 ]
3965 IFN KA10P, CONI TTYAPC
3966         MOVEM A,TTYA
3967         MOVE A,[B,,TTYACS]
3968         BLT A,TTYACS+17-B+1-1   ;SAVE ALL ACS BUT 0
3969 IFSN PCLOC,TTYBRK,[
3970         MOVE A,PCLOC
3971         MOVEM A,TTYBRK
3972 ]
3973         MOVE P,TTYPDP
3974         PUSH P,[TTYRET]
3975 TERMIN
3976
3977 EBLK
3978
3979 TTYBRK: 0
3980
3981 BBLK
3982         TTYSAV          ;SAVE ACS AND SET UP P.
3983 IFN KL10P,[
3984         CONSZ DTE,%DBL10+560
3985          JRST TTDTE1    ;DTE20 INTERRUPTED (DOORBELL OR BYTE TRANSFER ERROR OR DONE)
3986 ] ;KL10P
3987 IFN DL10P,[
3988         CONSZ DLC,10
3989          JRST TTDLB0    ;DL10 INTERRUPTED
3990 ]
3991 IFN TK10P,[
3992         CONSZ NTY,200000
3993          JRST NTY1      ;NEW TELETYPE KLUDGE
3994 ]
3995 IFN MTYP,[
3996         CONSZ MTY,50
3997          JRST MTY1      ;MORTON BOX
3998 ]
3999 IFN DPKPP,[
4000         CONSZ DPK,60
4001          JRST DPKPE     ;PARITY ERROR OR NXM
4002         CONSZ DPK,10
4003          JRST DPTI1     ;CHAR AVAIL DPK
4004         CONSZ DPK,400
4005         JRST DPTO1      ;OUTPUT BUFFER FIN DPK
4006 ]
4007 IFN NOTYS,[
4008         MOVEI I,0
4009         CONSZ TTY,50
4010          JRST GOTTY
4011 ]
4012 IFN NDZTYS,[            
4013 ;DZ-11 Code The only place that emulates an interrupt on the TTY interrupt
4014 ; channel is the DTE code, handled above, so there should never be a
4015 ; need for a DZ11 entry here.
4016 ]
4017 ;       MOVEI J,TTYCHN  ;KNIGHT TTY KLUDGE GENERATES SPUR INTS
4018 ;       JSP E,SPUR      ;SPURIOUS INT
4019 TTYRET:
4020 TTYRT3:
4021 IFN KA10P,[
4022         CONI A
4023         ANDCM A,TTYAPC
4024         TRNE A,220000   ;DID MPV OR PDL OV COME ON DURING THIS INT?
4025          BUG PAUSE,[MPV OR PDL OV IN TTY INT HANDLER, APR CONI=],OCT,A
4026 ] ;KA10P
4027         MOVS A,[B,,TTYACS]
4028         BLT A,17
4029         MOVE A,TTYA
4030         JRST 12,@TTYBRK
4031
4032 IFN DPKPP,[
4033 DPKPE:  AOS NDPKPE
4034         CONO DPK,60+TTYCHN      ;PARITY ERROR OR NXM
4035         JRST TTYRT3
4036 ]
4037 \f
4038 IFN DZ11P,[                     ;DZ-11 Code
4039
4040 IFE KS10P, .ERR DZ11 code only works on a KS-10.
4041
4042 $INSRT DZ11
4043
4044 REPEAT DZ11NB,[
4045
4046 EBLK
4047 CONC DZ,\.RPCNT,RB: 0
4048 BBLK
4049         MOVEM U,TTYACS-B+U
4050         JSP U,DZRBK
4051         ;; <first line>,,<bus address>:
4052         NFDZTY+<DZNLN*.RPCNT>,,CONC DZ,\.RPCNT,BA
4053
4054 EBLK
4055 CONC DZ,\.RPCNT,XB: 0
4056 BBLK
4057         MOVEM U,TTYACS-B+U
4058         JSP U,DZXBK
4059         ;; <first line>,,<bus address>:
4060         NFDZTY+<DZNLN*.RPCNT>,,CONC DZ,\.RPCNT,BA
4061
4062 ];DZ11NB
4063
4064 DEFINE DZSAV
4065         MOVEM A,TTYA
4066         MOVE A,[B,,TTYACS]
4067         BLT A,TTYACS-B+<U-1>    ;SAVE ALL ACS BUT 0, A AND U...
4068         MOVE A,-3(U)            ;Get return address
4069         MOVEM A,TTYBRK          ;Save it in TTYBRK
4070         MOVE P,TTYPDP           ;Stack
4071         PUSH P,[TTYRET]         ;Set up return address
4072         HRRZ C,(U)              ;Get Unibus address
4073         HLRZ I,(U)              ;Get ITS TTY # of first DZtty on this board
4074 TERMIN
4075
4076 ; DZ11 receiver interrupts (actually silo overflow)
4077 DZRBK:  DZSAV                   ;Save ACs and setup parameters
4078         IORDI A,%DZRCS(C)
4079         TRNN A,%DZCRD           ;Character ready?
4080          JRST [ AOS DZRSPR      ;Count spurious interrupts
4081                 POPJ P, ]
4082 DZRBK1: IORDI A,%DZRDR(C)
4083         TRNN A,%DZDDV           ;Data valid?
4084          POPJ P,                ;Nope, got it all
4085         ; If parity must be hacked, it should be done here
4086         LDB D,[.BP %DZLM,A]     ;Get line number
4087         ANDI A,%DZTCM           ;Get character
4088         ADD I,D                 ;Get TTY number
4089         CAIL I,NFDZTY+NDZTYS
4090          BUG
4091         JRST NTYI1
4092
4093 ; The following code can't work because I found the place where NTYI1
4094 ; clobbers U (Alan 3/26/86):
4095
4096 ;       PUSHJ P,NTYI1           ;Process the input
4097 ;       HRRZ C,(U)              ;Get Unibus address
4098 ;       HLRZ I,(U)              ;Get ITS TTY # of first DZtty on this board
4099 ;       JRST DZRBK1
4100
4101 ; DZ11 transmitter interrupts
4102 DZXBK:  DZSAV                   ;Save ACs and setup
4103         AOS DZXINC              ;Count interrupts
4104 DZXBK1: IORDI A,%DZRCS(C)
4105         TRNN A,%DZCTR           ;Transmitter ready?
4106          POPJ P,
4107         LDB D,[.BP %DZLM,A]     ;Get line number
4108         ADD I,D                 ;ITS terminal number of this line
4109         CAIL I,NFDZTY+NDZTYS
4110          BUG
4111         AOS DZXCHC              ;Count characters sent
4112         PUSHJ P,TYPSC           ;Merge with the rest of the world
4113         HRRZ C,(U)              ;Get UB address of board again
4114         HLRZ I,(U)              ;Get ITS TTY # of first DZtty on this board
4115         JRST DZXBK1             ;Try to send another, maybe we'll get lucky
4116
4117 ];DZ11P
4118 \f
4119 IFN KL10P,[
4120 ;HANDLE INTERRUPTS FROM THE CONSOLE PDP11 VIA THE DTE20
4121 ;CODE FOR HANDLING MULTIPLE CONSOLES, BLOCK TTY OUTPUT, ETC.
4122 ;IN THE FUTURE ETHERNET STUFF WILL GET ADDED HERE.
4123
4124 TTDTE1: CONI DTE,DTECNI         ;SAVE FOR DEBUGGING
4125         CONSZ DTE,460           ;TO11 ERROR OR TO10 DONE OR TO10 ERROR
4126          BUG PAUSE,[DTE20 ERROR, CONI=],OCT,DTECNI
4127         CONSZ DTE,100           ;TO11 TRANSFER COMPLETE
4128          JRST [ CONO DTE,100    ;CLEAR TO11 TRANSFER COMPLETE
4129                 SETZM DTEBBY    ;BUFFER NO LONGER BUSY
4130                 JRST .+1 ]
4131         CONO DTE,%DBL10+40      ;CLEAR DTE20 INTERRUPTING STATE
4132         SKIPGE A,DTETYI         ;CHECK FOR TTY INPUT AVAILABLE
4133          JRST TTDTE2
4134         SETOM DTETYI            ;AVAILABLE.  INDICATE HAS BEEN GOTTEN.
4135         CONO DTE,%DBL11         ;SIGNAL 11 THAT WE'RE READY FOR MORE.
4136         HLRZ I,A                ;GET LINE NUMBER
4137         CAIL I,NFETY            ;CHECK IT
4138          CAIL I,NFETY+NETYS
4139           BUG PAUSE,[BAD TTY NUMBER ],OCT,I,[FROM PDP-11]
4140         PUSHJ P,NTYI1           ;PROCESS THE INPUT
4141         JRST TTDTE1             ;CHECK FOR MORE
4142
4143 TTDTE2: MOVEI A,SCRHNG          ;IF HANGUP/DIALIN, SIGNAL SYSTEM JOB TO HANDLE IT
4144         SKIPL DTEHNG
4145          IORM A,SUPCOR
4146         SKIPN DTEBBY            ;DON'T CHECK FOR OUTPUT DONE IF BUFFER BUSY
4147          SKIPGE A,DTEODN        ;CHECK FOR TTY OUTPUT DONE
4148           POPJ P,               ;NOTHING, DISMISS INTERRUPT
4149         SETOM DTEODN            ;INDICATE SIGNAL HAS BEEN RECEIVED
4150         HLRZ I,A                ;GET LINE NUMBER
4151         CAIL I,NFETY            ;CHECK IT
4152          CAIL I,NFETY+NETYS
4153           BUG PAUSE,[BAD TTY NUMBER ],OCT,I,[FROM PDP-11]
4154         HRRZS A                 ;SET UP MULTI-CHARACTER TRANSFER,
4155         HRRZ B,TTOALC(I)        ;SETTING MAX# CHARACTERS FROM ELEVEN'S BUFFER SIZE
4156         CAIGE B,(A)             ;DON'T SEND MORE CHARACTERS THAN ALLOCATED
4157          MOVE A,B
4158         CAILE A,DTEOBL          ;DON'T EXCEED SIZE OF OUR BUFFER
4159          MOVEI A,DTEOBL
4160         MOVEM A,DBBCC
4161         MOVEM A,DBBCC1
4162         MOVE A,[441000,,DTEOBF]
4163         MOVEM A,DBBBP
4164         JRST TYP                ;GO FILL OUTPUT BUFFER
4165 ];KL10P
4166
4167 IFN DL10P,[
4168 ;HANDLE THE DL-10 (A PDP-11 FRONT END FOR THE KL-10).
4169 ;ALL INTERRUPTS FROM DL-10 COME HERE.
4170
4171 TTDLB0: CONO DLC,10+TTYCHN ;CLEAR INTERRUPT FLAG
4172         SKIPN DL10F     ;IGNORE DL10 IF IT IS MARKED OUT OF SERVICE.
4173          POPJ P,
4174 IFN CHAOSP, IFN DLCP,   PUSHJ P,DLCWAK  ;SEE IF INTR IS FOR CHAOS NET
4175 IFN T300P,[             ;CHECK FOR T-300 INTERRUPT, PASS TO DISK LEVEL IF SO
4176         SKIPE DSCDON
4177          CONO PI,DSKRQ
4178 ];T300P
4179         SKIPE I,DL10IL  ;IS INPUT AVAIL? IF SO, READ WHICH LINE
4180          PUSHJ P,TTDLIN ;AND PROCESS THE CHARACTER.
4181         MOVEI A,SCRHNG  ;DOES THE 11 SAY A MODEM WAS DISCONNECTED?
4182         SKIPE DL10CL
4183          IORM A,SUPCOR  ;IF SO, TELL SYS JOB TO TAKE APPROPRIATE ACTION.
4184         SKIPN DL10LN    ;DON'T CHECK OUTPUT-DONE IF OUTPUT BUFFER IS BUSY
4185          SKIPN I,DL10OD ;OUTPUT DONE ON SOME TTY?
4186           POPJ P,
4187         MOVE A,DL10BS   ;YES, GET 11'S BUFFER SIZE AND
4188         SETZM DL10OD    ;MAKE COMMUNICATION CHANNEL FREE FOR -11 AGAIN
4189         HRRZ B,TTOALC(I)
4190         CAMLE A,B
4191          MOVE A,B       ;DON'T SEND MORE CHARACTERS THAN TERMINAL HAS ALLOCATION FOR
4192         MOVEM A,DBBCC   ;INIT CHARACTER COUNTERS TO SIZE OF BUFFER IN 11
4193         MOVEM A,DBBCC1
4194         MOVE A,[441000,,DL10BF]
4195         MOVEM A,DBBBP   ;INIT B.P. USED BY 10 TO STORE INTO BUFFER.
4196         JRST TYP        ;GO FILL UP THE OUTPUT BUFFER
4197
4198 TTDLIN: MOVE A,DL10IC   ;GET THE CHARACTER TYPED IN
4199         SETZM DL10IL    ;FREE THE INPUT CHANNEL SO 11 CAN USE IT AGAIN.
4200         CONO DLC,100040+TTYCHN  ;INTERRUPT 11
4201         JRST NTYI1      ;AND PROCESS THE INPUT.
4202 ]
4203 \f
4204 IFN DPKPP,[
4205 DPTO1:  CONI DPK,A
4206         LDB I,[220400,,A]
4207         ADDI I,NFDPTY
4208         SKIPL @DPKC-NFDPTY(I)
4209         SETOM @DPKC-NFDPTY(I)
4210         LDB J,[$TTOSP,,TTYTYP(I)] ;GET OUTPUT SPEED CODE.
4211         CAIL J,LDPSPT
4212          MOVEI J,LDPSPT-1
4213         HRRZ A,TTOALC(I)
4214         CAMLE A,DPSPT(J)
4215          MOVE A,DPSPT(J)        ;# CHARS BUFFER SPACE FOR THAT SPEED.
4216         MOVEM A,DBBCC
4217         MOVEM A,DBBCC1
4218         MOVE A,DBBFP-NFDPTY(I)
4219         MOVEM A,DBBBP   ;BP FOR STORING CHARS.
4220         MOVSM A,@DPKP-NFDPTY(I)
4221         JRST TYP0
4222
4223 DPTI1:  DATAI DPK,A
4224         LDB I,[220400,,A]
4225         ADDI I,NFDPTY
4226         JRST NTYI1
4227 ]
4228 IFN TK10P,[
4229 NTY1:   CONSZ NTY,400000
4230          POPJ P,        ;SCANNER NOT STOPPED
4231         CONI NTY,I      ;READ IN TTY #
4232 IFE NNTYS-10,LDB I,[110300,,I]
4233 IFE NNTYS-20,LDB I,[100400,,I]
4234 IFN <NNTYS-10>*<NNTYS-20>,.ERR
4235         CAIL I,NNTYS
4236          BUG
4237         ADDI I,NFNTY    ;CALCULATE CONSOLE #
4238         CONO NTY,@TTYLT(I)      ;SELECT APPROPRIATE TTY
4239         CONSZ NTY,20
4240          JRST TYPSC     ;DONE FLAG ON TYPEOUT
4241         CONSO NTY,40
4242          JRST TTYRT2    ;THIS TTY NOT REALLY UNHAPPY
4243         DATAI NTY,A
4244         JRST NTYI1
4245
4246 TTYRT2: CONO NTY,200000+TTYCHN
4247         JRST TTYRET
4248 ]
4249 \f
4250 IFN MTYP,[
4251 MTY1:   CONI MTY,I
4252         LDB I,[140500,,I]       ;GET SUBDEVICE
4253         CAIL I,NMTYS
4254          JRST MTY2      ;NOT A VALID #
4255         ADDI I,NFMTY
4256         CONO MTY,@TTYLT(I)
4257         CONSO MTY,40    ;INPUT DONE
4258          JRST MTY6
4259         DATAI MTY,A
4260         JRST NTYI1
4261
4262 MTY6:   CONSO MTY,10    ;OUTPUT DONE
4263          POPJ P,
4264         HRRZ A,TTOALC(I)
4265         CAILE A,MTYNC
4266          MOVEI A,MTYNC
4267         MOVEM A,DBBCC   ;# CHARS CAN GIVE AT ONCE.
4268         MOVEM A,DBBCC1
4269         SETZM MTYOW     ;SET UP WORD TO FILL WITH OUTPUT CHARS.
4270         MOVE A,[440700,,MTYOW]
4271         MOVEM A,DBBBP   ;SET UP BP FOR STUFFING THAT WORD.
4272         JRST TYP
4273
4274 MTY2:   CONSZ MTY,10
4275          JRST MTY3      ;OUTPUT
4276         CONSZ MTY,40
4277         DATAI MTY,A     ;INPUT
4278         POPJ P,         ;AND IGNORE
4279
4280 MTY3:   LSH I,12.
4281         CONO MTY,200+TTYCHN(I)  ;CLEAR OUTPUT DONE FLAG
4282         POPJ P,
4283 ]
4284
4285 IFN NOTYS,[
4286 GOTTY:  CONSZ TTY,10
4287          JRST TYPSC     ;TTO DONE
4288         CONSO TTY,40
4289          POPJ P,        ;NONE
4290         DATAI TTY,A     ;TTI DONE, READ CHR
4291         JRST NTYI1
4292 ]
4293 \f
4294 ;PROCESS INPUT INTERRUPT WITH CHARACTER IN A, TTY # IN I
4295
4296 OVHMTR TTI      ;TTY INPUT INTERRUPT LEVEL
4297
4298 ;ENTER HERE FOR "HARDWARE" TTYS, LOW 8 BITS OF A ARE THE INPUT, OTHER BITS ARE GARBAGE
4299 NTYI1:
4300 IFN NNVTTS,[
4301         CAME I,NOVATT   ;SKIP IF THIS TTY IS NOVA
4302          JRST NTYI3
4303         TRZE A,200      ;SKIP IF DATA  AND NOT TTY #
4304          JRST NTYI2     ;SET TTY #
4305         SKIPGE I,NVIPTT ;CURRENTLY SELECTED  CONSOLE ON INPUT
4306          POPJ P,        ;NONE SELECTED
4307 NTYI3:]
4308 IFN TTLPTP,[
4309         CAMN I,LPTTTY
4310          JRST INLPT
4311 ]
4312         ANDI A,377      ;FLUSH EXTRANEOUS BITS, KEEP LOW 7
4313         MOVE H,TTYOPT(I)
4314         TRNN H,%TPMTA   ; OR KEEP LOW 8 IF 8TH IS HARDWARE META KEY
4315          ANDI A,177
4316 ;ENTER HERE FOR TTYS WHICH MAY INPUT IN FULL-CHARACTER-SET
4317 NTYI5:  MOVEM I,LOCTTY  ;TTY CHAR ACTUALLY TYPED ON
4318         MOVSI U,%TSLCZ
4319         ANDCAB U,TTYSTS(I)      ;CLEAR LAST CHR ^Z BIT
4320         MOVE Q,TTYCOM(I)
4321         MOVE R,TTYTYP(I)
4322         MOVE H,TTYOPT(I)
4323         TRNE H,%TPMTA   ;PROCESS HARDWARE META KEY IF PRESENT
4324          TRZN A,200
4325           CAIA
4326            IORI A,%TXMTA
4327         ANDI A,%TXCTL+%TXMTA+%TXSUP+%TXTOP+%TXASC ;FLUSH MEANINGLESS BITS.
4328         TLNE H,%TOALT   ;IF THIS TTY WANTS IT, MAYBE STANDARDIZE ALTMODES
4329          PUSHJ P,TTYSAM
4330         HRRZ D,TTYIPC(I)
4331         MOVEM D,LTTYIPC ;REMEMBER INPUT RTN FOR DEBUGGING
4332         MOVE D,TYBPC(I)
4333         MOVEM D,LTYBPC
4334         JRST (D)        ;PROCESS THE CHARACTER AND RETURN.
4335
4336 IFN NNVTTS,[
4337 NTYI2:  JUMPE A,CPOPJ
4338         ADDI A,NFNVTY
4339         CAIGE A,NFNVTY+NNVTTS
4340         MOVEM A,NVIPTT  ;SELECT CONSOLE
4341         POPJ P,
4342 ]
4343
4344 IFN TTLPTP,[INLPT:      MOVE A,TIME
4345         MOVEM A,LPTTIME
4346         POPJ P,
4347 ]
4348 \f
4349 SUBTTL HANDLE ^\ CODES
4350 ;OR PASS CHARACTERS ON TO NEXT LEVEL OF INPUT
4351 ;PROCESSING IF NO ^\ CODE IS IN PROGRESS.
4352
4353 ;THIS IS THE NORMAL VALUE OF TYBPC FOR ALL TTY'S; IT IS THE ONLY POSSIBLE VALUE
4354 ;FOR A TTY WHOSE %TPCBS AND %TPTEL ARE 0.
4355 TYBN:   TRNE H,%TPPRN
4356          PUSHJ P,TYBPRN
4357         TRNN H,%TPCBS+%TPTEL
4358          JRST TYBRT2    ;IF NOT ENABLED, JUST PASS CHAR TO NORMAL INPUT LEVEL.
4359 ; USED TO CLEAR %TXSFT (NOW %TXSUP) BEFORE CHECKING FOR ^\
4360 ;       MOVEI E,(A)
4361 ;       ANDCMI E,%TXSUP
4362         CAIN A,^\
4363          TRNN H,%TPCBS
4364           JRST TYBCR1   ;IF NOT AN ENABLED ^\, GO CHECK FOR SPECIAL CR HANDLING
4365         JSP D,TYBRED    ;READ THE CHARACTER AFTER THE ^\
4366         CAIGE A,100     ;^\ FOLLOWED BY @ THROUGH _ IS THE HIGH BITS FOR THE NEXT CHARACTER.
4367          JRST TYBCTL    ;^\ FOLLOWED BY A CONTROL CHAR, ETC. IS A SPECIAL HACK.
4368         ANDI A,<%TXCTL+%TXMTA+%TXSUP+%TXTOP>_-7
4369         LSH A,7+18.     ;GET THE EXCESS OVER 100 AND SHIFT BY 7,
4370         HRRI A,TYBPFX   ;AND STORE IN LH OF TYBPC
4371         MOVEM A,TYBPC(I)
4372         POPJ P,         ;RETURN. NEXT CHAR COMES TO TYBPFX
4373
4374 TYBPFX: HLRZ D,TYBPC(I) ;GET THE HIGH BITS READ IN LAST TIME
4375         IOR A,D         ;AND MERGE INTO THE CHAR JUST READ IN
4376 TYBRET: MOVEI D,TYBN    ;RESET ^\ STATUS TO NORMAL
4377 TYBRT1: MOVEM D,TYBPC(I)
4378 TYBRT2: MOVE E,TIME
4379         MOVEM E,TTITM(I) ;UPDATE TIME OF LAST INPUT ON THIS TTY.
4380 ;NOW DETECT SPECIAL TOP-CHARS THAT SHOULD NOT ECHO
4381 ;AND SHOULD BE IGNORED IN COM MODE OR IN ^_ COMMANDS.
4382         SETZ E,                 ;WE SET E TO -1 BELOW FOR THOSE CHARACTERS.
4383         MOVE D,TTYSTA(I)
4384         TLNE D,%TANEC           ;IF COUNT OF DON'T-ECHO CHARS IS >0,
4385          JRST [ SUB D,[<.DPB 1,.BP %TANEC>,,]   ;DECREMENT IT
4386                 SETO E,         ;AND DON'T ECHO THIS ONE.
4387                 JRST TYBRT3]
4388         MOVE E,A        ;IS THIS INPUT REALLY FOR LOCAL EDITING PROTOCOL?
4389         ANDI E,%TXTOP+%TXASC    ;THAT IS, TOP-E OR TOP-S, OR THE CHARACTER FOLLOWING ONE?
4390         CAIE E,%TXTOP+"E
4391          CAIN E,%TXTOP+"S       ;DON'T ECHO OR INTERRUPT FOR TOP-S OR TOP-E,
4392           TLO D,<.DPB 1,.BP %TANEC>     ;OR THE CHAR THAT FOLLOWS IT.
4393         CAIN E,%TXTOP+"T        ;DON'T ECHO OR INT FOR TOP-T, OR FOLLOWING 3 CHARS.
4394          TLO D,<.DPB 3,.BP %TANEC>
4395         CAIE E,%TXTOP+"Y        ;GRAPHICS INPUT CMDS TAKE 5 ARG CHARS.
4396          CAIN E,%TXTOP+"X
4397           TLO D,<.DPB 5,.BP %TANEC>
4398         SETZ E,
4399         TLNE D,%TANEC
4400          SETO E,
4401 TYBRT3: MOVEM D,TTYSTA(I)
4402         MOVEM E,LEPCHR          ;LEPCHR IS -1 FOR SPECIAL CHARS THAT SHOULD USUALLY BE IGNORED.
4403         HRRZ D,TTYIPC(I)
4404         JUMPE E,(D)             ;IN WHICH CASE, DROP THIS CHAR ENTIRELY
4405         CAIN D,TTYI             ;IF IT IS NOT THE NORMAL SORT OF INPUT.
4406          JRST (D)
4407         POPJ P,
4408
4409 ;COME HERE FOR ^\ FOLLOWED BY A CHARACTER < 100.
4410 TYBCTL: CAIN A,^A       ;^\^A => ALLOCATE OUTPUT CHARS.
4411          JRST TYBA
4412         CAIN A,^Z       ;^\^Z => ZERO ALLOCATION
4413          JRST TYBZ
4414         CAIN A,^I       ;^\^I => INFINITY ALLOCATION
4415          JRST TYBI
4416         CAIN A,^R       ;^\^R => RESTART OUTPUT AT M.P. LEVEL.
4417          JRST TYBR
4418         CAIN A,^P       ;^\^P => SET CURSOR POSITION AND RESTART OUTPUT AT M.P. LEVEL.
4419          JRST TYBP
4420         CAIN A,^\       ;^\^\ => INPUT A ^\.
4421          JRST TYBRET
4422         CAIN A,^C       ;^\^C => SCREEN HAS BEEN SURREPTITIOUSLY CHANGED
4423          PUSHJ P,TYBC
4424 ;RETURN TO NORMAL ^\ STATUS BUT DON'T PASS ANY INPUT UP TO NORMAL INPUT LEVEL.
4425 TYBXIT: MOVEI D,TYBN
4426 TYBRED: MOVEM D,TYBPC(I)        ;JSP D,TYBRED TO WAIT FOR NEXT CHARACTER
4427         POPJ P,
4428
4429 TYBC:   MOVSI D,%TSATY
4430         IORB D,TTYSTS(I)
4431         JUMPL D,CPOPJ
4432         HLLZ E,MSKST(D)
4433         TLZ E,#%PJATY
4434         TLNE D,%TSCNS
4435          IORM E,PIRQC(D)
4436         POPJ P,
4437
4438 TYBCR1: CAIN A,15               ;SEE IF ENABLED CR
4439          TRNN H,%TPTEL
4440           JRST TYBRT2           ;NO, JUST PASS CHAR TO NORMAL INPUT LEVEL
4441         JSP D,TYBRT1            ;PASS CHAR TO NORMAL INPUT LEVEL BUT HACK NEXT CHAR
4442         CAIE A,12               ;IF IT IS LF OR NULL IGNORE IT
4443          JUMPN A,TYBRET         ;BUT OTHERWISE PASS IT TO NORMAL INPUT LEVEL
4444         JRST TYBXIT             ;IN ANY CASE RESET TYBPC TO NORMAL
4445
4446 TYBPRN: LDB E,[.BP %TXASC,A]
4447         CAIE E,"(
4448          CAIN E,"[
4449           XORI A,"(#"[
4450         CAIE E,")
4451          CAIN E,"]
4452           XORI A,")#"]
4453         POPJ P,
4454 \f
4455 ;^\^P<VPOS><HPOS> - SET CURSOR POS, THEN RESTART OUTPUT AT M.P. LEVEL.
4456 ;THIS IS THE WAY TO RESPOND TO A %TDORS CHARACTER ON A SOFTWARE TTY,
4457 ;SINCE OUTPUT RESET WILL STOP OUTPUT AT M.P. LEVEL ON SOFTWARE TTY'S
4458 ;WHICH HAVE ^\ TURNED ON.
4459 TYBP:   JSP D,TYBRED    ;WAIT FOR VPOS TO COME IN
4460         CAML A,TCMXV(I)
4461          SETZ A,
4462         MOVEM A,TTYIVP(I)
4463         SKIPGE TT,TTYLPP(I)
4464          SETCA TT,
4465         MOVEM A,TPVP(TT)
4466         SKIPGE TTYLPP(I)
4467          HRLM A,TTYLPS(I)
4468         JSP D,TYBRED    ;NOW WAIT FOR HPOS TO COME IN
4469         CAML A,TCMXH(I)
4470          SETZ A,
4471         MOVEM A,TTYIHP(I)
4472         SKIPGE TT,TTYLPP(I)
4473          SETCA TT,
4474         MOVEM A,TPHP(TT)
4475         SKIPGE TTYLPP(I)
4476          HRRM A,TTYLPS(I)
4477 TYBR:   HRROS TTOALC(I) ;RESTART AT M.P. LEVEL.
4478         PUSHJ P,TYPEN2  ;REQUEUE ECHOING IF NECESSARY
4479         JRST TYBXIT
4480
4481 TYBZ:   HLLZS TTOALC(I) ;SET ALLOCATION TO 0.
4482         JRST TYBXIT
4483
4484 TYBI:   HLLOS TTOALC(I) ;SET ALLOCATION TO INFINITY.
4485         JRST TYBST      ;NOW MUST START THE TTY IN CASE IT WAS STOPPED DUE TO NO ALLOC.
4486
4487 TYBA:   JSP D,TYBRED    ;^\^A<NUM> => INCREMENT ALLOCATION BY <NUM>
4488         MOVE D,TTOALC(I)
4489         TRNN D,400000   ;SKIP IF ALLOCATION = INFINITY
4490          ADD D,A
4491         HRRM D,TTOALC(I)
4492 TYBST:  AOSN TTYOAC(I)
4493          XCT TTYST(I)
4494         JRST TYBXIT
4495 \f
4496 SUBTTL NORMAL TTY INPUT HANDLER
4497 ;CLOBBERS A - E, EXPECTS R, U,  I SET UP.
4498 ;R HAS TTYTYP, U HAS TTYSTS, I HAS # OF TTY.
4499 ;Also seems to expect Q/ TTYCOM and perhaps H/ TTYOPT  -Alan 12/18/85
4500
4501 TTYI:   CAIN A,^_
4502          JRST TTYICB    ;CHAR IS ^_, MAYBE ENTER COM MODE.
4503 TTYI2:  CAIN A,^Z       ;TEST FOR ^Z
4504          JRST ZFLAG     ;^Z TYPED
4505 TTYI2A: JUMPL U,CPOPJ   ;IGNORE CHAR IF NO USER.
4506         TLNE U,%TSSII   ;If in superimage input mode,
4507          JRST TTYI2B    ; don't check for magic chars.
4508         CAIN A,%TXCTL+^Z        ;Control-CALL is Deferred-Call
4509          JRST [ MOVEI A,%TXACT+%TXPIE+%TXCTL+%TXTOP+"Z  ;DEFERRED CALL
4510                 JRST TTYI19 ]
4511         CAIN A,%TXTOP+"C        ; CLEAR-INPUT does like TYCFLS, flushes
4512                                 ; input buffer of TTY in I.
4513          JRST TYIRS1            ; TYIRS1 does a POPJ P, for us:  Hear no
4514                                 ; evil, see no evil, echo no evil...
4515 TTYI2B: TLZ A,-1        ;IF WE WERE CALLED FROM ^_-QUOTING RTN,  BIT 3.1 WAS
4516                         ;SET TO FAKE OUT ABOVE JUNK. FLUSH FAKEOUT BIT.
4517         MOVE E,TIME
4518         MOVEM E,TTITM(I) ;REMEMBER TIME OF LAST TYPE-IN ON TTY.
4519 TTYI11: MOVE E,TICC(I)
4520         CAIL E,TIBS     ;SKIP IF ANY ROOM LEFT IN INPUT BUFFER
4521          JRST DING1
4522         MOVE C,A
4523         ANDI C,%TXTOP+%TXASC
4524         CAIL C,141      ;IF A LOWER CASE CHAR,
4525          CAILE C,172
4526           JRST TTYI15
4527         MOVE C,TTYOPT(I)
4528         TLNE C,%TOCLC   ;CONVERT TO UPPER CASE IF WANTED
4529          XORI A,40
4530 TTYI15: MOVE E,UPC(U)
4531         TLZ E,#%PCUSR
4532         CAIN E,NECHO1   ;IS THE JOB EXECUTING AN ECHOIN RIGHT NOW?
4533          SKIPE E,TACC(I)  ;IF SO, AND IF IT HASN'T HAD A BREAK CONDITION YET,
4534           JRST TTYI12
4535         PUSHJ P,TTECIN  ;MAYBE STORE CHAR IN USER MEMORY, AND JUST ECHO IT.
4536         MOVEI E,0       ;E 0 IF CALLED TTECIN, NON-0 IF DIDN'T
4537 TTYI12: TRNN A,%TXACT   ;IF TTECIN DIDN'T ACTIVATE IT, THEN IGNORE TTYSET BITS
4538          JUMPE E,TTYI19 ;AND DON'T ACTIVATE OR INTERRUPT NO MATTER WHAT.
4539         MOVE C,LEPCHR
4540         JUMPL C,TTYI19  ;JUMP IF LOCAL EDITING PROTOCOL COMMAND CHAR.
4541         PUSHJ P,GETGRP  ;GET 6 BIT BYTE FOR GROUP THIS CHARACTER IS IN
4542         TLZE U,%TSINT   ;IF WANT THIS CHAR TO INT. WHATEVER IT IS,
4543          IORI B,%TGINT  ;PRETEND IT'S AN INT. CHAR.
4544         MOVEM U,TTYSTS(I)
4545         LSH B,14        ;PUT %TXACT, %TXPIE, AND %TXMPE IN.
4546         TRNN A,%TXECI
4547          IORI A,(B)
4548         ANDCMI A,%TXIGN+%TXINT+%TXCOM
4549         TRNN B,%TXINT   ;TEST INTERRUPT BIT FOR THIS GROUP
4550          JRST TTYI19    ;OFF.  DON'T INTERRUPT
4551         HRRE B,U        ;RH OF B IS USER INDEX
4552         JUMPL B,[JRST 4,.]      ;SHOULDN'T BE NO USER
4553         HRL B,MSKST(B)  ;LH OF B IS USER'S INTERRUPT MASK
4554         TLNN B,%PITYI   ;SKIP IF INTERRUPTS ON TYPE IN ENABLED
4555          JRST TTYI5     ;DISABLED
4556         MOVEI C,%PITYI
4557         IORM C,PIRQC(B) ;GENERATE TYPE IN INTERRUPT REQUEST
4558         TRO A,%TXINT            ;INDICATE INTERRUPT
4559 TTYI5:  MOVE C,TYIMSK(I)        ;GET TTY CHANNELS OPEN MASK
4560         AND C,MSKST2(B) ;MASK OFF CHANNELS NOT ENABLED
4561         JUMPE C,TTYI19  ;JUMP IF NO OPEN CHANNELS HAVE INTERRUPTS ENABLED
4562         MOVN D,C
4563         AND C,D         ;ISOLATE LEAST SIGNIFICANT BIT
4564         IORM C,IFPIR(B) ;GENERATE SECOND WORD INTERRUPT REQUEST
4565         IORI A,%TXINT   ;INDICATE INTERRUPT
4566         JRST TTYI19
4567 \f
4568 ;LIKE TTYI18 BUT FOR A CHAR THAT WASN'T REALLY TYPED IN.
4569 TTYI13: IORI A,%TXCOM
4570
4571 ;ECHO BUT DON'T USE AS INPUT THE CHAR IN A,
4572 ;ASSUMING IT WAS ACTUALLY TYPED IN BY USER. MUST NOT CLOBBER H, TT.
4573 TTYI18: IORI A,%TXPIE+%TXIGN    ;THIS CHAR WILL ECHO & BE IGNORED.
4574
4575 ;PUT CHARACTER IN A IN INPUT BUFFER, ADJUSTING ALL COUNTS AND POINTERS.
4576 TTYI19: MOVE C,TICC(I)
4577         CAIL C,TIBS
4578          JRST DING1     ;NO ROOM IN INPUT BFR => COMPLAIN.
4579         TRNE A,%TXACT   ;IF ACTIVATION CHAR, COUNT IT.
4580          AOS TACC(I)
4581         TRNE A,%TXPIE   ;IF PI ECHO CHAR, COUNT IT.
4582          AOS ECHOC(I)
4583         TRNE A,%TXINT   ;SIMILAR FOR TINTC, TINTP IF INT. CHAR.
4584          AOS TINTC(I)
4585         MOVE E,TICC(I)
4586         CAIL E,MICBAA
4587          SKIPLE TACC(I) ;BUFFER FULL+ NO ACTV CHRS, GEN ONE
4588           JRST TTYIS5
4589         AOS TACC(I)
4590         IORI A,%TXACT
4591 TTYIS5: MOVE E,TIIP(I)
4592         CAMN E,TIBEP(I) ;SKIP IF NOT OFF THE END OF THE CIRCULAR BUFFER
4593          SUBI E,TIBL    ;RESET TIIP
4594         HRRM E,TIIP(I)  ;STORE BACK IN RH
4595         IDPB A,TIIP(I)  ;STORE CHARACTER IN INPUT BUFFER
4596         AOS TICC(I)
4597         TRNN A,%TXPIE   ;IF PI ECHO NEEDED,
4598          POPJ P,
4599 TTYI7:  MOVE C,TORM(I)
4600         CAIL C,TOBS
4601          SKIPL TTYERQ(I);PUT THIS TTY ON LIST OF THOSE NEEDING ECHO
4602           POPJ P,       ;UNLESS IT'S ALREADY ON.
4603         TLNE I,-1
4604          BUG
4605         MOVE C,TTERQS
4606         MOVEM I,TTERQS
4607         MOVEM C,TTYERQ(I)
4608         POPJ P,
4609
4610 DING1:  TLNE R,%TTDDI   ;SKIP IF WANT TO DING ON EXCESS INPUT
4611          POPJ P,
4612         MOVSI C,%TCDNG
4613         IORM C,TTYCOM(I)
4614         JRST TTYI7      ;TELL CLOCK LEVEL TO LOOK AT THIS TTY.
4615 \f
4616 TYCLWR: PUSHJ P,TCNRM
4617         CAIL E,141      ;CONVERT LOWER CASE LTRS TO UPPER
4618         CAILE E,172
4619          POPJ P,
4620         SUBI E,40
4621         POPJ P,
4622
4623 TTYSAM:                 ;STANDARDIZE ALT MODE (IF APPRO)
4624         TLNE U,%TSALT+%TSSII    ;SKIP IF ALT MODE NOT TO BE STANDARDIZED
4625         POPJ P,         ;DON'T STANDARDIZE ALT MODE
4626         CAIE A,176      ;ALT MODE CAN BE 176 OR
4627         CAIN A,175      ;175
4628         MOVEI A,33      ;CHANGE EITHER TO 33
4629         POPJ P,
4630 \f
4631 ;GETS BYTE IN B, GROUP NUMBER IN C, BYTE POINTER IN D
4632 GETGRP: PUSH P,A
4633         PUSHJ P,TYINR2  ;NORMALIZE CHARACTER TO FIND CORRECT GROUP.
4634         MOVE B,A
4635         IDIVI B,5
4636         POP P,A
4637         LDB C,GRPBPT(C) ;GET GROUP BITS
4638         MOVEI D,TTYST1(I)
4639         CAIL C,6
4640          JRST GETGR2
4641         LDB E,[301400,,SBTBL(C)]        ;LOAD LH OF BYTE PTR
4642 GETGR1: DPB E,[301400,,D]       ;MAKE TTYST1 OR TTYST2 APPROPRIATE BYTE POINTER
4643         LDB B,D
4644         POPJ P,
4645
4646 GETGR2: LDB E,[301400,,SBTBL-6(C)]
4647         MOVEI D,TTYST2(I)
4648         JRST GETGR1
4649
4650 DEFINE  GGRPTB A,B,C,D,E
4651 A_29.+B_22.+C_15.+D_8+E_1
4652 TERMIN
4653
4654 GRPTBL: GGRPTB 0,0,0,0,0
4655         GGRPTB 0,0,6,13,7
4656         GGRPTB 7,0,0,11,0
4657         GGRPTB 0,0,0,0,6
4658         GGRPTB 0,0,0,0,0
4659         GGRPTB 0,0,10,0,0
4660         GGRPTB 0,0,13,3,3
4661         GGRPTB 3,3,3,3,3
4662         GGRPTB 5,5,4,4,3
4663         GGRPTB 4,3,4,2,2
4664         GGRPTB 2,2,2,2,2
4665         GGRPTB 2,2,2,3,3
4666         GGRPTB 5,4,5,3,3
4667         REPEAT 5,GGRPTB 1,1,1,1,1
4668         GGRPTB 1,5,3,5,4
4669         GGRPTB 4,3,1,1,1
4670         REPEAT 4,GGRPTB 1,1,1,1,1
4671         GGRPTB 1,1,1,5,3
4672         GGRPTB 5,3,12,0,0
4673
4674 GRPBPT: 350700,,GRPTBL(B)
4675         260700,,GRPTBL(B)
4676         170700,,GRPTBL(B)
4677         100700,,GRPTBL(B)
4678         010700,,GRPTBL(B)
4679 \f
4680 ;HANDLE A CHARACTER TYPED WHILE THE TTY OWNER IS DOING AN ECHOIN.
4681 ;A HOLDS THE CHARACTER, U HOLDS THE JOB INDEX.  CLOBBERS B, C, E.
4682 ;IF THE CHARACTER IS A BREAK, ACTIVATE ON IT.
4683 ;OTHERWISE, STORE IT IN THE USER'S BUFFER AND JUST ECHO IT AND DISCARD IT;
4684 ;BUT IF THAT IS IMPOSSIBLE BECAUSE PAGES HAVE BEEN SWAPPED OUT,
4685 ;JUST ACTIVATE INSTEAD.
4686 TTECIN: HRRZ B,U                ;PREVENT TIMING ERRORS BY NOT CONSIDERING
4687                                 ; HIM INSIDE THE ECHOIN IF HE HAS THE
4688                                 ; PROCESSOR, SINCE UPC NOT VALID.
4689 IFE KA10P,[                     ;IF HIS USER-MODE ACS ARE IN AC BLOCK 1, WE
4690                                 ; HAVE TO GIVE UP SINCE THEY MIGHT BE SAVED
4691                                 ; IN TTYACS OR SOME PLACE.
4692         MOVEI C,UUOACS(U)
4693         CAME C,AC1PTR
4694 ] ;IFE KA10P
4695 IFN KA10P,[                     ;ON KA10, DON'T DO THIS IF MPV IS SET
4696         CONSO 20000             ;INTERRUPT OUT OF XCTR WITH PI TRAP SET
4697 ] ;KA10P                        ;GETS THE MACHINE VERY CONFUSED, I SUSPECT
4698          CAMN B,USER
4699           JRST TTECI9
4700         TRNN A,%TXCTL+%TXMTA+%TXSUP     ;DECIDE WHETHER THIS CHAR ECHOES OR
4701                                         ; BREAKS.
4702          CAIGE A,40             ;CONTROL CHARS, EITHER 9-BIT OR ASCII, BREAK.
4703           JRST TTECI9           ;NOTE THAT SAIL CHARS WILL HAVE %TXTOP.
4704         CAIN A,%TXTOP+"H        ;DON'T ECHO HELP CHAR.
4705          JRST TTECI9
4706         LDB B,[050200,,A]       ;WHICH WORD OF BREAK TABLE IS THIS CHARACTER IN?
4707         ADD B,U                 ;JOB OWNING TTY
4708         MOVE B,AC0S+Q(B) .SEE NECHOIN  ;GET THAT WORD.
4709         LDB E,[0500,,A]
4710         LSH B,(E)               ;GET THE BIT FOR THIS CHARACTER INTO THE SIGN BIT.
4711         JUMPL B,TTECI9          ;IF BIT IS SET, THIS IS A BREAK CHARACTER.
4712         SPM TTECIM              ;SAVE PAGE MAP AND LOAD UP TTY-OWNING JOB'S MAP.
4713         LPMR UPGML(U)
4714 IFE KA10P,[
4715         JRST 2,@[%PSPCU,,.+1]   ;XCTR DOESN'T WORK IF THIS BIT NOT SET
4716         DATAI PAG,TTECIX        ;SAVE ACS CONTEXT ALSO, SET PREVIOUS AC
4717                                 ; CONTEXT TO AC BLOCK 2, BUT DON'T CHANGE
4718                                 ; CURRENT CONTEXT WHICH MAY BE 0 OR 1.
4719         MOVE B,[600200,,400000] .SEE SPCCTX ;THIS DATAO PAG, IS SAME AS IN
4720                                             ; AC2CTX.  (ALTHOUGH THERE ARE
4721                                             ; A FEW SPURIOUS BITS SET ON
4722                                             ; THE KS-10.)
4723         LDB C,[330300,,TTECIX]  ;BUT TRANSFER CURRENT AC BLOCK INTO IT
4724         DPB C,[330300,,B]
4725         DATAO PAG,B
4726         MOVSI B,UUOACS(U)       ;COPY THE JOB'S USER MODE ACS INTO THAT BLOCK.
4727         XCTR XBW,[BLT B,17]
4728 ] ;IFE KA10P
4729         MOVE C,AC0S+C(U)
4730         XCTRI XRW,[MOVES E,(C)] ;MAKE SURE THE COUNT IS STILL IN CORE AND > 0.
4731          CAIG E,0
4732           JRST TTECIL
4733         MOVE B,AC0S+B(U)
4734         XCTRI XRW,[MOVES E,(B)] ;MAKE SURE BYTE POINTER STILL IN CORE,
4735          CAIA
4736           JRST TTECIL
4737         IBP E
4738         XCTRI XRW,[MOVES (E)]   ;AND THAT THE WORD THE CHARACTER WILL GO IN IS IN CORE
4739          SKIPA E,AC0S+E(U)      ; AND WRITABLE
4740           JRST TTECIL
4741         XCTRI XRW,[MOVES (E)]   ;MAKE SURE THE BLOCK OF COUNTERS IS STILL IN CORE.
4742          CAIA
4743           JRST TTECIL
4744         XCTRI XRW,[MOVES 6(E)]
4745          CAIA
4746           JRST TTECIL
4747         XCTRI XBYTE,[IDPB A,(B)]        ;STORE THE CHARACTER.
4748          CAIA
4749           BUG
4750         XCTRI XRW,[SOS (C)]     ;DECREMENT THE COUNT OF CHARS TO ECHO.
4751          CAIA
4752           BUG
4753         JUMPE E,TTECI2          ;UPDATE THE BLOCK OF COUNTERS, IF THERE IS ONE.
4754         ADDI E,2                ;THE FIRST TWO ARE IGNORED.
4755         HRLI E,-4               ;THE NEXT FOUR ARE INCREMENTED.
4756 TTECI1: XCTRI XRW,[AOS (E)]
4757          CAIA
4758           BUG
4759         AOBJN E,TTECI1
4760         XCTRI XRW,[SOS (E)]     ;THE SEVENTH IS DECREMENTED.
4761          CAIA
4762           BUG
4763 ;GOOD.  CHARACTER HAS BEEN STORED IN THE USER'S MEMORY.
4764 TTECI2: TRO A,%TXIGN\%TXPIE\%TXECI      ;NOW MAKE IT ECHO.
4765         PUSHJ P,TTECIR
4766         POPJ P,
4767
4768 ;WE CAN'T HANDLE A CHARACTER, SO MAKE IT ACTIVATE SO THE ECHOIN WILL RETURN.
4769 ;TTECIL IS FOR AFTER THE MAP HAS BEEN SWITCHED.  TTECI9 IS FOR BEFORE THEN.
4770 TTECIL: PUSHJ P,TTECIR
4771 TTECI9: IORI A,%TXACT
4772         POPJ P,
4773
4774 ;RESTORE THE PAGE MAP THAT WE SAVED.
4775 TTECIR:
4776 IFE KA10P,[
4777         MOVEI B,UUOACS(U)       ;COPY POSSIBLY ALTERED USER ACS BACK INTO
4778                                 ; THE JOB.
4779         XCTR XBR,[BLT B,UUOACS+17(U)]
4780         DATAO PAG,TTECIX
4781 ] ;IFE KA10P
4782         LPMR TTECIM
4783         POPJ P,
4784
4785 EBLK
4786
4787 TTECIM: BLOCK 10                ;OUTER LEVEL MAP SAVED HERE AND RESTORED AT EXIT.
4788 IF2 IFG UPGMLE-UPGML-10,.ERR TTECIM too short.
4789 IFE KA10P,[
4790 TTECIX: 0                       ;SAVED DATAI PAG VALUE.
4791 ]
4792
4793 BBLK
4794 \f
4795 SUBTTL HANDLE ^Z
4796
4797 ZFLAG:  MOVSI U,%TSLCZ  ;EVEN IF THIS BIT IN TTYSTS IS OFF, TTY MAY BE FREE
4798         IORB U,TTYSTS(I)        ;GET TTYSTS
4799         JUMPGE U,ZFLAG2         ;(TTY IS IN USE)
4800         SKIPGE TTYSTA(I)        ;CONSOLE FREE MSG COMING OUT OR ALREADY TRYING TO ^Z
4801          SKIPGE DEDTIM          ;OR SYSTEM IS DOWN.  DON'T CREATE A NEW JOB TREE.
4802           POPJ P,
4803         MOVN B,SYSDBG
4804         SKIPGE SYSDBG   ;IF NOT ALLOWING USERS,
4805          CAMN I,B       ;ALLOW ONLY THE SPEC'D TTY (= -C(SYSDBG) )
4806           JRST ZFLAG7
4807         MOVE B,TTYTYP(I) ;AND STY TTY'S, AS WELL AS TTY 0.
4808         TRNN B,%TYSTY   ;NOTE STELNT WILL REFUSE NETWORK LOGINS WHEN SYS BEING DEBUGGED.
4809          JUMPN I,CPOPJ
4810 ZFLAG7: CONO PI,PICOFF\<200_-UTCCHN>    .SEE NUJBST
4811         MOVE A,UTTYCT   ;SET UP NEW USER
4812         CAIL A,MXCZS    ;BUT DON'T OVERFILL BUFFER
4813          JRST [ CONO PI,PICON\<200_-UTCCHN> ? POPJ P,]
4814         AOS UTTYCT
4815         HRRZM I,@UTTYI
4816         AOS A,UTTYI
4817         CAIL A,UTTYS+MXCZS
4818          MOVEI A,UTTYS
4819         MOVEM A,UTTYI
4820         CONO PI,PICON\<200_-UTCCHN>
4821         MOVSI A,%TACTZ ;SAY TTY BEING ^Z'D - ELSE SYS JOB MIGHT TYPE CONSOLE-FREE MSG,
4822         IORM A,TTYSTA(I) ;SINCE TTY IS FREE AND %TACFM IS OFF (OR WILL BE AFTER TTYINI)
4823         JRST TTYINI
4824
4825 ZFLAG4: HRR U,SUPPRO(U)
4826 ZFLAG2: SKIPL SUPPRO(U)
4827          TLNE U,%TSSII
4828           JRST ZFLAG3   ;SUPER IMAGE INPUT MODE OR TOP LEVEL JOB
4829         TLNN U,%TSCNS   ;OR IN USE AS A DEVICE => DON'T TREAT ^Z SPECIALLY
4830          JRST ZFLAG3
4831         MOVEI E,%PIC.Z
4832         TDNE E,PIRQC(U) ;IF IMMEDIATE SUPERIOR DOESN'T RESPOND TO ^Z BY TAKING
4833          JRST ZFLAG4    ;THE TTY FROM THE ^Z'ED JOB, TRY FOR HIS SUPERIOR.
4834         IORM E,PIRQC(U) ;OTHERWISE GIVE ^Z INTERRUPT TO JOB
4835         PUSHJ P,TYIRS1  ;DISCARD ALL PENDING INPUT BEFORE THE ^Z.
4836         MOVEI A,^Z+%TXPIE+%TXIGN
4837         JRST TTYI19     ;ARRANGE FOR THE ^Z TO BE ECHOED.
4838
4839 ZFLAG3: MOVSI U,%TSLCZ  ;CLEAR <LAST CH WAS ^Z> BIT
4840         ANDCAB U,TTYSTS(I)
4841         JRST TTYI2A     ;TREAT ^Z AS ANY OTHER CHAR.
4842 \f
4843 SUBTTL HANDLE ^_
4844
4845 TTYICB: TLNE U,%TSSII   ;^_ NOT SPECIAL IF TTY IS IN USE, IN SUPERIMAGE INPUT.
4846          JUMPGE U,TTYI2
4847         SKIPGE DEDTIM   ;DON'T ALLOW ^_ IF ITS IS DOWN
4848          POPJ P,
4849         JUMPGE U,TYCGTN ;DO ALLOW THEM ON ANY TTY THAT'S IN USE
4850         SKIPGE SYSDBG   ;IF ITS BEING DEBUGGED, ALLOW ^_ IN SAME CASES ^Z IS ALLOWED.
4851          TRNE R,%TYSTY
4852           JRST TYCGTN
4853         MOVN B,SYSDBG
4854         CAME B,I
4855          JUMPN I,CPOPJ
4856 TYCGTN: JSP D,TYCRDE    ;ECHO IT, RETURN WITH NEXT CHAR TYPED.
4857 TYCI:   SETOM COMT1(I)  ;CHR AFTER ^_
4858         PUSHJ P,TCNRM
4859         CAIE E,^_
4860          CAIN E,^Z
4861           JRST TYCI3A   ;GIVE EITHER CHARACTER TO MAIN PROGRAM
4862         CAIL E,^B
4863          CAILE E,^D     ;^B, ^C, ^D, ^F SIGNIFY META BITS BEING SPEC'D.
4864           CAIN E,^F
4865            JRST TYCMB
4866         CAIL E,"0       ;DIGIT => CHARATER BEING TYPED IN BY ITS ASCII CODE.
4867          CAILE E,"9
4868           JRST TYCI7    ;JUMP IF NOT A DIGIT.
4869         MOVEI B,-"0(E)
4870         MOVEM B,COMT1(I)        ;STORE FIRST DIGIT
4871         JSP D,TYCRDE    ;ECHO DIGIT, READ ANOTHR. (TTYIPC LEFT -> TYCI4)
4872 TYCI4:  PUSHJ P,TYCI22  ;READ NUM AFTER FIRST DIGIT
4873          JRST TYCI6     ;CHARACTER IS NON-NUMERIC
4874         JRST TTYI18     ;ECHO THE DIGIT - IT'S ALREADY HANDLED.
4875
4876 TYCI3A: TRNN H,%TP11T           ;ON NON-TV TERMINALS,
4877          MOVEI A,%TXCTL+100(E)  ;MAKE QUOTED ^Z LOOK LIKE "CONTROL" AND "Z" IN FULL
4878 TYCI3:  PUSHJ P,TYCI17  ;RESTORE TTYIPC TO NORMAL,
4879         HRLI A,1        ;PREVENT CHAR FROM BEING TAKEN AS ^Z OR ^_.
4880         JRST @TTYIPC(I) ;HANDLE CHAR (BUT QUOTE ^_ AND ^Z)
4881
4882 \f
4883 TYCI22: LDB E,[700,,A]
4884         CAIL E,"0
4885          CAILE E,"9
4886           POPJ P,       ;RETURN WITHOUT SKIPPING IF NON-NUMERIC
4887         MOVE B,COMT1(I)
4888         LSH B,3
4889         ADDI B,-"0(E)
4890         MOVEM B,COMT1(I)        ;UPDATE VALUE SO FAR
4891         JRST POPJ1      ;SKIP RETURN
4892
4893 TYCMB:  SETZM COMT1(I)  ;^A THRU ^F SEEN - INITIALIZE, AND DECODE THE CHARACTER.
4894         JRST TYCMB2
4895
4896 TYCMB1: IORM D,COMT1(I) ;SET THE SPEC'D META-BIT AND READ ANOTHER CHAR.
4897         JSP D,TYCRDE    ;WHICH WE THEN DECODE ...
4898 TYCMB2: SETZ D,
4899         PUSHJ P,TCNRM
4900         CAIN E,^B
4901          IORI D,%TXCTL
4902         CAIN E,^C
4903          IORI D,%TXMTA
4904         CAIN E,^D
4905          IORI D,%TXTOP
4906         CAIN E,^F
4907          IORI D,%TXSUP
4908         JUMPN D,TYCMB1  ;IF CHAR WAS ^B THRU ^F, SET APPRO META-BIT AND LOOP.
4909         CAIN E,^Q
4910          JSP D,TYCRDE   ;OTHERWISE, ^Q QUOTES,
4911         IOR A,COMT1(I)  ;JUST READ THE CHARACTER, WITH SPEC'D META-BITS MERGED IN.
4912         JRST TYCI3
4913
4914 TYCI2:  PUSHJ P,TTYI18  ;ECHO CHAR, RESET TTYIPC TO NORMAL.
4915 TYCI17: MOVEI B,TYCG
4916         SKIPL Q
4917          MOVEI B,TTYI
4918         MOVEM B,TTYIPC(I)
4919         TLZ Q,%TCCBS+%TCCBK     ;ALSO FLUSH TEMPORARY STATUS INFO.
4920         MOVEM Q,TTYCOM(I)
4921         POPJ P,
4922
4923 TYCI6:  EXCH A,COMT1(I) ;A NOW HAS CHAR REPRESENTED BY DIGITS; COMT1 HAS THE NON-DIGIT JUST TYPED IN.
4924         ANDI A,7777
4925         PUSH P,I        ;IF IN COME MODE, TYCI3 CALLS TYCG AND SMASHES I
4926         PUSHJ P,TYCI3   ;SIMULATE ITS TYPE IN
4927         POP P,I
4928         MOVE A,COMT1(I) ;GET LAST CHARACTER TYPED
4929         CAIN A,40       ;A SPACE GETS FLUSHED FOLLOWING DIGITS
4930          POPJ P,
4931         MOVE Q,TTYCOM(I) ;RESTORE ACS BASHED BY TYCG
4932         MOVE R,TTYTYP(I)
4933         MOVE H,TTYOPT(I) ;THIS ONE MAY BE SUPERFLUOUS
4934         MOVE U,TTYSTS(I)
4935         JRST @TTYIPC(I) ;PROCESS IT NORMALLY
4936
4937 TCNRM:  MOVE E,A
4938         PUSHJ P,TYINR2
4939         EXCH E,A
4940         POPJ P,
4941 \f
4942 TYCI7:  PUSHJ P,TYCLWR  ;NON-DIGIT, NON-^Z, NON-^_ AFTER ^_.
4943         CAIN E,^U       ;^U is CLEAR INPUT.
4944          JRST TYCFLS
4945         CAIL E,"A       ;IF IT'S A LETTER,
4946         CAILE E,"Z
4947          JRST TYCI7A
4948         XCT TYIQT-"A(E) ;JUST DISPATCH ON IT.
4949         MOVEM H,TTYOPT(I)
4950 TYCI7D: MOVEM U,TTYSTS(I)
4951         JRST TYCI2
4952
4953 TYCI7A: CAIE E,""       ;ASIDE FROM LETTERS, " AND ^ ARE OK.
4954         CAIN E,"^
4955          JRST TYCI7B
4956 TYCI7F: MOVEI A,"?      ;OTHER CHARS ARE ERRORS.
4957 TYCI2A: PUSHJ P,TTYI13  ;ECHO A CHARACTER THAT WASN'T INPUT, AND RESET TTYCOM AND TTYIPC.
4958         JRST TYCI17
4959
4960 TYCI7B: CAIE E,""
4961          TLCA U,%TSROL  ;^_^ COMPLEMENTS SCROLL MODE.
4962           TLC U,%TSSAI  ;^_" COMPLEMENTS SAIL CHAR SET USAGE.
4963         JRST TYCI7D
4964
4965 TYIQT:  JRST TYCA       ;A => ACCEPT COM LINKS.
4966         JRST TYCB       ;B => TRIGGER A **MORE** (BLOCK TYPEOUT).
4967         JRST TYCC       ;C => CREATE COM LINK.
4968         JRST TYCD       ;D => DEFERRED CALL
4969         JRST TYCRFT     ;E => ENTER REMOTE FEED-THRU.
4970         JRST TYCI7F     ;F => ERROR.
4971         TLC U,%TSMOR    ;G => COMPLEMENT MORE-PROCESSING.
4972         JRST TYCH       ;H => HELP KEY.
4973         TLC Q,%TCICO    ;I => COMPLEMENT INPUT OVERRIDE.
4974         JRST TYCJ       ;J => Cause %PIJST interrupt.
4975         JRST TYCK       ;K => FLUSH SPEC'D TTY FROM COM LINK.
4976         MOVEI A,^L+%TXIGN+%TXCOM        ;L => CLEAR SCREEN.
4977         TLC U,%TSMOR    ;M => COMPLEMENT MORE-PROCESSING.
4978         JRST TYCN       ;N => BREAK COM LINK.
4979         TLC Q,%TCOCO    ;O => COMPLEMENT OUTPUT COM OVERRIDE.
4980         JRST TYCI7F     ;P => ERROR.
4981         JRST TYCQ       ;Q => ENTER QUERY MODE.
4982         JRST TYCR       ;R => ENTER REFUSE MODE.
4983         JRST TYCS       ;S => SLAVE ANOTHER TTY.
4984         JRST TYCI7F     ;T => ERROR.
4985         TLC H,%TOCLC    ;U => COMPLEMENT CASE-CONVERSION.
4986         JRST TYCI7F     ;V => ERROR.
4987         JRST TYCI7F     ;W => ERROR.
4988         JRST TYCI7F     ;X => ERROR.
4989         JRST TYCQA      ;Y => ACCEPT PENDING QUERIES FOR COM LINKS
4990         JRST TYCQR      ;Z => REJECT PENDING QUERIES.
4991
4992 IFN .-TYIQT-26.,.ERR WRONG LENGTH TABLE.
4993
4994 ;PUT IN A DEFERRED CALL
4995 TYCD:   PUSHJ P,TTYI18  ;ECHO THE D
4996         MOVEI A,%TXACT+%TXCTL+%TXTOP+"Z
4997         PUSHJ P,TTYI19  ;PUT A DEFERRED CALL IN THE BUFFER
4998         JRST TYCI17     ;RESET ^_ STATE
4999
5000 ;HELP KEY
5001 TYCH:   PUSHJ P,TTYI18  ;ECHO THE H
5002         MOVEI A,%TXACT+%TXTOP+"H
5003         PUSHJ P,TTYI19  ;PUT A [HELP] IN THE BUFFER
5004         JRST TYCI17     ;RESET ^_ STATE
5005
5006 ;Cause %PIJST interrupt.
5007 TYCJ:   SKIPA B,[%PIJST]
5008 TYCJ1:   MOVE U,SUPPRO(U)
5009         JUMPL U,TYCI7F          ; Error if tty not in use or nobody enabled
5010                                 ; for it.
5011         TDNN B,MSKST(U)
5012          JRST TYCJ1
5013         IORM B,PIRQC(U)
5014         JRST TYCI2              ; Echo the J and reset ^_ state.
5015
5016 ;CLEAR INPUT
5017 TYCFLS: CONO PI,TTYOFF  ;No touching buffer while I'm frobbing it.
5018         PUSHJ P,TYIRS1  ;Completely flush input buffer of TTY in I.
5019         CONO PI,TTYON
5020         MOVEI A,^U
5021         PUSHJ P,TTYI13  ;Can echo the ^U now.
5022         JRST TYCI17     ;Reset ^_ state.
5023
5024 \f
5025 TYCB:   HRRZ B,I        ;COME HERE FOR ^_B.
5026         IMULI B,TPLEN*2
5027         MOVEI C,%TFEOP
5028         IORM C,TPFLAG(B)
5029         JRST TYCI2
5030
5031 TYCRFT: PUSH P,A        ;COME HERE FOR ^_E.
5032         MOVE A,TTYTYP(I)      ;ARE WE A LOCAL TTY?
5033         TRNN A,%TYDIL\%TYRLM\%TYSTY
5034           JRST TYCRF0   ;LOCAL TTYS ARE ALLOWED TO SLAVE W/O LOGIN
5035         TRNN A,%TYSTY   ;Is it a STY?
5036           JRST TYCRFA   ;  Nope
5037         HRRZ A,STYSTS-NFSTTY(I)    ;Special Check for TARAKA demons linking
5038         MOVE A,UNAME(A)            ;Is the UNAME of the owner of this STY
5039         CAMN A,[SIXBIT /TARAKA/]   ;TARAKA?
5040           JRST TYCRF0              ;Yes, let it hack all it wants.
5041 TYCRFA: HRRE A,TTYSTS(I)       ;GET OWNER OF THIS TTY
5042         AOJE A,TYCRF2          ;IF THIS IS A FREE TTY, DON'T LET HIM
5043         HLRE A,UNAME-1(A)      ;IS HE LOGGED IN?
5044         AOJE A,TYCRF2   ;  IF NOT, FAIL
5045 TYCRF0: SETZ B,         ;COMPLEMENT OUR %TCRFT BIT.
5046         PUSHJ P,TYCREP  ;1ST, COUNT # TTYS IN LOOP.
5047             PUSHJ P,[
5048                 MOVE A,TTYCOM(I)
5049                 TLNE A,%TCLFT   ;IF ANY TTY IN LOOP HAS %TCLFT SET
5050                  POPJ P,        ;THEN IT'S OK FOR OUR %TCRFT TO BE.
5051                 AOJA B,POPJ1]
5052          JRST TYCRF1    ;SOME TTY IN LOOP HAS %TCLFT => OK TO SET %TCRFT.
5053         CAIE B,2        ;ONLY 1 OTHER TTY => SET ITS %TCLFT, THEN OUR %TCRFT.
5054          JRST TYCRF2    ;FAIL TO SET %TCRFT IF CAN'T FIND OTHER WITH %TCLFT.
5055         MOVE A,TTYCOM(I)
5056         MOVSI B,%TCLFT
5057         IORM B,TTYCOM(A)
5058 TYCRF1: TLC Q,%TCRFT
5059         POP P,A
5060         JRST TYCI7D
5061
5062 TYCRF2: SUB P,[1,,1]
5063         JRST TYCI7F
5064
5065 ;COME HERE AFTER READING UNAME FOR ^_S. B HAS IDX OF SPEC'D TTY.
5066 ;SET THAT TTY'S %TCLFT, ENSLAVING IT. CLEAR %TCLFT OF ALL OTHER TTYS
5067 ;IN THE SAME LOOP AS SPEC'D TTY.
5068 TYCS1:  PUSHJ P,TYCREP
5069             CAIN B,(I)  ;IF SPEC'D TTY NOT IN COM WITH US
5070          CAIA
5071           JRST TYCI7F   ;THEN IT'S AN ERROR.
5072         MOVSI A,%TCLFT
5073         PUSHJ P,TYCREP  ;CLEAR %TCLFT OF ALL TTY'S LINKED TO US,
5074             ANDCAM A,TTYCOM(I)
5075          JFCL
5076         IORM A,TTYCOM(B) ;THEN SET IT FOR HIM.
5077         POPJ P,
5078 \f
5079 ;CALL WITH JSP D,  ECHO CHAR IN A, RETURN WITH NEXT CHAR.
5080 TYCRDE: HRRZM D,TTYIPC(I)
5081         JRST TTYI18
5082
5083 ;LIKE TYCRDE BUT DON'T ECHO THE CHARACTER IN A.
5084 TYCRED: HRRZM D,TTYIPC(I)
5085         POPJ P,
5086
5087 ;T -> ASCIZ STRING, ECHO ON TTY # IN I (MUST HAVE DONE TYCSET)
5088 TYCI40: HRLI T,440700
5089 TYCI39: ILDB A,T
5090         JUMPE A,CPOPJ
5091         PUSHJ P,TTYI13  ;ECHO CHARACTER ON TTY
5092         JRST TYCI39
5093
5094 ;SET UP ACS FOR ECHOING ON TTY # IN I.
5095 TYCSET: MOVE R,TTYTYP(I)
5096         MOVE Q,TTYCOM(I)
5097         MOVE U,TTYSTS(I)
5098         POPJ P,
5099
5100 ;PUT TTY IN COM MODE IF IT ISN'T. TTY # IN I.
5101 TYCI63: TLON Q,400000
5102          TLZ Q,%TCLFT+%TCRFT
5103         MOVEM Q,TTYCOM(I)
5104         JRST TYBC
5105
5106 ;TTY # IN I, REPEAT OVER THAT TTY AND ALL LINKED TO IT.
5107 ;INSN TO BE REPEATED FOLLOWS CALL.
5108 ;IF THE INSN DOESN'T SKIP, IMMEDIATELY RERURNS
5109 ;SKIPPING ONLY THAT INSN. ELSE RETURNS SKIPPING 2 WHEN ALL TTYS DONE.
5110 TYCREP: PUSH P,I        ;PUSH TTY STARTING WITH.
5111         PUSH P,I        ;PUSH TTY DOING NEXT.
5112 TYCRE0: XCT @-2(P)      ;(THE INSN AFTER THE PUSHJ)
5113          JRST TYCRE1     ;IT DIDN'T SKIP, GIVE UP RIGHT AWAY.
5114         MOVE I,(P)      ;ELSE KEEP GOING,
5115         SKIPL I,TTYCOM(I)
5116          JRST TYCRE2    ;LAST TTY DONE NOT LINKED, THRU.
5117         ANDI I,-1
5118         CAIE I,-1       ;IN COM MD BUT NOT LINKED OR
5119         CAMN I,-1(P)    ;HAVE GONE ALL AROUND CIRCULAR LIST
5120          JRST TYCRE2     ;=> DONE.
5121         MOVEM I,(P)     ;ELSE DO THE NEXT ONE.
5122         JRST TYCRE0
5123
5124 TYCRE2: AOS -2(P)       ;RETURN SKIPPING 2.
5125 TYCRE1: SUB P,[1,,1]
5126         POP P,I
5127         JRST POPJ1
5128 \f
5129 ;^_A - ACCEPT ALL PENDING AND FUTURE REQUESTS FOR COM LINKS.
5130 TYCA:   TLZ Q,%TCRFS+%TCQRY
5131
5132 ;^_Y - ACCEPT ALL PENDING REQUESTS FOR COM LINKS.
5133 TYCQA:  PUSHJ P,TYCI2           ;ECHO THE A OR Y.
5134         PUSHJ P,TYCQRP          ;FIND ALL PENDING QUERIES
5135             PUSHJ P,TYCQAC      ;ACCEPT EACH ONE.
5136         POPJ P,
5137
5138 TYCQAC: PUSHJ P,TYCREP          ;DON'T ACCEPT A RQ FROM SOMEONE ALREADY LINKED TO US.
5139             CAIN B,(I)
5140          POPJ P,
5141         MOVE H,B                ;HIS TTY # IN H FOR TYCI43
5142         PUSHJ P,TYCSET
5143         PUSHJ P,TYCI43          ;LINK HIM AND ME; ECHANGE I AND H.
5144         MOVE B,I
5145         MOVE I,H                ;GET HIS # BACK IN B AND MINE IN I.
5146         POPJ P,
5147
5148 ;^_R - REFUSE ALL PENDING AND FUTURE REQUESTS FOR COM LINKS.
5149 TYCR:   TLO Q,%TCRFS
5150         TLZ Q,%TCQRY
5151
5152 ;^_Z - REFUSE ALL PENDING REQUESTS FOR COM LINKS.
5153 TYCQR:  PUSHJ P,TYCI2           ;ECHO THE R OR Z.
5154         PUSHJ P,TYCQRP          ;FIND ALL PENDING QUERIES
5155             PUSHJ P,TYCQRF      ;AND REFUSE EACH ONE.
5156         POPJ P,
5157
5158 TYCQRF: EXCH B,I
5159         PUSHJ P,TYCSET          ;TYPE ON REQUESTING TTY
5160         PUSHJ P,TYCI36          ;THAT IT IS BEING REJECTED
5161         EXCH B,I                ;AND REMOVE IT FROM A QUERYING STATE.
5162         POPJ P,
5163
5164 ;^_Q - ALL REQUESTS FOR COM LINKS SHOULD REMAIN PENDING UNTIL ANSWERED
5165 ;WITH ^_Y, ^_Z OR AN INVERSE ^_C.
5166 ;ALSO, LIST ALL REQUESTS THAT ARE NOW PENDING.
5167 TYCQ:   TLZ Q,%TCRFS
5168         TLO Q,%TCQRY
5169         PUSHJ P,TYCI2           ;ECHO THE "Q" AND RESET ALL STATUS INFO.
5170         PUSHJ P,TYCSET
5171         SETZ T,                 ;INDICATE NOTHING HAS BEEN TYPED YET.
5172         PUSHJ P,TYCQRP          ;FIND THE PENDING REQUESTS
5173             PUSHJ P,TYCQLS      ;SAY WHO EACH IS FROM.
5174         POPJ P,
5175
5176 TYCQLS: JUMPE T,TYCQL1          ;IF THIS ISN'T THE FIRST NAME MENTIONED,
5177         MOVEI T,[ASCIZ/, /]     ;SEPARATE FROM THE PREVIOUS NAME.
5178         PUSHJ P,TYCI40
5179 TYCQL1: MOVE C,B                ;THIS IS TTY NUMBER QUERYING US
5180         PUSH P,C        .SEE TYCI92
5181         PUSH P,[POPCJ-1]        ;TYCI67 ALWAYS SKIP-RETURNS.
5182         JRST TYCI67             ;TYPE THE USER'S NAME OR THE TTY NUMBER.
5183
5184 ;       PUSHJ P,TYCQRP
5185 ;           INSN
5186 ;EXECUTES INSN ONCE FOR EACH TTY QHICH IS QUERYING THE TTY IN I.
5187 ;THE QUERYING TTY'S NUMBER IS IN B. INSN MUST PRESERVE B AND I.
5188 ;A IS CLOBBERED BY TYCQRP. OTHER ACS ARE UNTOUCHED.
5189
5190 TYCQRP: SETZ B,
5191 TYCQR1: MOVE A,TTYIPC(B)
5192         CAIE A,TYCRW
5193          CAIN A,TYCRW2
5194           CAME I,COMT1(B)
5195            JRST TYCQR2  ;TTY IN B ISN'T QUERYING TTY IN I.
5196         XCT @(P)        ;EXECUTE INSN.
5197 TYCQR2: CAIE B,NCT-1
5198          AOJA B,TYCQR1
5199         JRST POPJ1      ;SKIP OVER INSN WHEN RETURN.
5200 \f
5201 SUBTTL HANDLE COM-LINKS
5202
5203 TYCC:   TLOA Q,%TCTPN   ;^_C - WHEN LEAVE COM MODE MUST TYPE ^_N.
5204 TYCK:    TLO Q,%TCCBK   ;SAY WE'RE DOING ^_K.
5205         JRST TYCI19
5206
5207 TYCS:   TLO Q,%TCCBS    ;^_S - ENSLAVE SPEC'D TTY.
5208 TYCI19: MOVEM Q,TTYCOM(I)
5209         JSP D,TYCRDE    ;ECHO, RETURN, COME BACK WITH NEXT CHAR.
5210         PUSHJ P,TCNRM
5211         CAIE E,15       ;SPACE OR CR IS 1ST CHAR, IGNORE.
5212          CAIN E,40
5213           JRST TTYI18
5214         MOVEI B,TYCI27
5215         MOVEM B,TTYIPC(I)
5216         SETZM COMT3(I)  ;INIT. ACCUMULATED #.
5217         SETZM COMT1(I)  ;AND ACCUM UNAME.
5218
5219 ;READING CHARS AFTER ^_C (AFTER A NON-SPACE HAS BEEN SEEN)
5220 ;COMT1 ACCUMULATES SIXBIT, COMT3 OCTAL NUMBER.
5221 ;SIGN OF COMT3 SET => NONDIGIT WAS SEEN, USE THE SIXBIT.
5222 TYCI27: PUSHJ P,TYCLWR  ;CONVERT TO UPPER CASE.
5223         CAIN E,^_
5224          JRST TYCI7F    ;ANOTHER ^_ IS NO GOOD.
5225         CAIE E,15
5226          CAIN E,40
5227           JRST TYCI28   ;SPACE DELIMITS UNAME OR NUMBER
5228         CAIN E,^^
5229          JRST TYCI28
5230         CAIN E,177
5231          JRST TYCI7F    ;RUBOUT => TYPE ? AND GIVE UP.
5232         MOVE B,COMT3(I) ;ACCUM NUMBER IN RH OF COMT3.
5233         LSH B,3
5234         ADDI B,-"0(E)
5235         HRRM B,COMT3(I)
5236         CAIL E,"0
5237         CAILE E,"9      ;NON-DIGIT SEEN => SET SIGN OF COMT3 SAYING
5238          SETOM COMT3(I) ;CERTAINLY NOT NUMBER.
5239         MOVE B,COMT1(I)
5240         LSH B,6
5241         IORI B,-40(E)
5242         MOVEM B,COMT1(I)        ;ADD NEW CHARACTER ONTO THE END OF THE NAME
5243         JRST TTYI18     ;EXIT TO ECHO THE CHARACTER
5244 \f
5245 TYCI28: MOVE H,Q        ;SAVE SETTINGS OF %TCCBS, %TCCBK, SINCE TYCI2 WILL CLEAR THEM.
5246         PUSH P,E
5247         PUSHJ P,TYCI2   ;ECHO TERMINATING CHAR IN A, AND RESET ALL TO NORMAL.
5248         POP P,E
5249         SKIPGE B,COMT3(I)
5250          JRST TYCI52    ;TYPEIN WASN'T NUMBER.
5251         CAIGE B,NCT     ;IS NUMBER THAT OF A TTY THAT EXISTS?
5252          JRST TYCI53
5253 TYCI52: MOVE D,COMT1(I)
5254 TYCI29: TLNE D,770000   ;LEFT ADJUST THE UNAME
5255          JRST TYCI30
5256         LSH D,6
5257         JRST TYCI29
5258
5259 TYCI30: MOVEI U,LUBLK   ;START LOOKING AT USER NUMBER 2
5260         MOVSI A,%TCRFS
5261         SETO B,         ;NO REFUSE-MODE TTY FOUND YET
5262 TYCI31: ADDI U,LUBLK
5263         CAML U,USRHI
5264          JRST [ JUMPGE B,TYCI36 ;REFUSED
5265                 JRST TYCI7F ]   ;OUT OF USERS SO GIVE ? AND RETURN
5266         CAMN D,UNAME(U) ;SKIP IF UNAME DOESN'T MATCH
5267          SKIPGE C,TTYTBL(U)     ;SKIP IF PROCEDURE HAS THE TTY
5268           JRST TYCI31   ;TRY NEXT PROCEDURE
5269         HRRZ B,C        ;TTY NUMBER
5270         TDNE A,TTYCOM(B)        ;IN REFUSE MODE?
5271          JRST TYCI31    ;YES, MAY BE CRTSTY, TRY TO FIND A BETTER TTY WITH THIS UNAME
5272 TYCI53: MOVEM B,COMT1(I) ;# OF TTY TRYING TO HACK
5273         SETZM COMT3(I)  ;IEC FLAG FOR QUERY MODE
5274         CAIN E,^^
5275          SETOM COMT3(I)
5276         TLZE H,%TCCBK   ;JUMP IF DOING ^_K.
5277          JRST TYCK1
5278 IFG APL,[
5279         CAIN B,APL      ;DON'T SEND MESSAGE TO A.P. LINE
5280          JRST TYCI7F    ;(OK NOW TO SEND TO SYSTEM CONSOLE, HAS O.C.O. ANYWAY)
5281 ]
5282         TLZE H,%TCCBS
5283          JRST TYCS1     ;ALSO CHECK FOR ^_S.
5284         PUSHJ P,TYCREP  ;NO, IT'S ^_C.
5285             CAIN B,(I)  ;DON'T LET LINK TO SELF OR SOMEONE ALREADY LINKED TO.
5286          JRST TYCI7F
5287         HRRE C,TTYSTS(B)
5288         AOJN C,TYCI34   ;TTY HAS A USER
5289         MOVEI A,"F      ;TTY IS FREE
5290         PUSHJ P,TTYI13  ;TYPE AN F
5291         MOVEI A,40
5292         PUSHJ P,TTYI13  ;FOLLOWED BY A SPACE
5293         MOVE B,COMT1(I) ;RESTORE THAT TTY'S NUMBER.
5294         JRST TYCI32
5295 \f
5296 TYCI34: MOVE C,TTYSTS(B) ;TTY IN USE: AS A DEVICE?
5297         TLNN C,%TSCNS
5298          JRST TYCI7F    ;^_C NOT ALLOWED TO TTY OPEN AS DEVICE.
5299 TYCI32: MOVE A,TTYIPC(B)
5300         CAIE A,TYCRW2
5301          CAIN A,TYCRW   ;IF HE'S QUERYING ME, THEN HE AUTOMATICALLY ACCEPTS
5302           JRST [CAME I,COMT1(B) ;REGARDLESS OF HIS %TCRFS AND %TCQRY.
5303                  JRST TYCI37    ;IF HE'S QUERYING SOMEONE ELSE, HE'S BUSY.
5304                 JRST TYCI33]
5305         MOVE C,TTYCOM(B)
5306         TLNE C,%TCRFS   ;GIVE UP IF HE IS REFUSING ^_C'S.
5307          JRST TYCI36
5308         CAIN A,TTYI     ;MUNGING IPC WHILE NOT NORMAL WOULD LEAVE
5309          JRST TYCI44    ;WHAT HE'S DOING UNFINISHED - CAUSING BUGS.
5310         CAIE A,TYCG
5311          JRST TYCI37    ;IPC NOT NORMAL.
5312         MOVEM B,COMT1(I) ;IPC NORMAL BUT HE'S IN A COM LINK.
5313         MOVE TT,I
5314         MOVE H,B        ;MY TTY # IN TT AND I, HIS IN H.
5315         MOVEI T,[ASCIZ/ IN COM: /]
5316         PUSHJ P,TYCI71  ;LIST ALL TTYS IN COM WITH HIM.
5317          JFCL
5318         MOVEI T,[ASCIZ/
5319 BREAK IN? /]
5320         PUSHJ P,TYCI40  ;PRINT STRING ON MY TTY.
5321         JSP D,TYCRED    ;READ THE ANSWER
5322         PUSHJ P,TTYI18  ;AND ECHO IT.
5323         PUSHJ P,TYCLWR  ;NORMALIZE IT AND CONVERT TO UPPER CASE IN E.
5324         CAIE E,"Y
5325          JRST TYCI17    ;NO => RESET US TO NORMAL AND GIVE UP.
5326         MOVE B,COMT1(I) ;ANSWER IS YES, GO AHEAD.
5327         MOVE A,TTYIPC(B)
5328         CAIE A,TTYI
5329         CAIN A,TYCG
5330         CAIA
5331          JRST TYCI37    ;CAN'T MUNG HIM IF IPC NOT NORMAL.
5332         MOVE C,TTYCOM(B)
5333         TLNE C,%TCRFS
5334          JRST TYCI36    ;HE'S REFUSING.
5335 TYCI33: PUSHJ P,TYCREP
5336             CAIN B,(I)  ;MAYBE HE ENTERED OUR LOOP WHILE WE WAITED.
5337          JRST TYCI7F    ;LINKING TO SOMEONE ALREADY LINKED TO CAUSES BUGS.
5338         JRST TYCI44     ;GO AHEAD AND LINK UP.
5339
5340 TYCI37: SKIPA T,[[ASCIZ/BUSY /]]        ;TARGET IS BUSY.
5341 TYCI36:  MOVEI T,[ASCIZ/REFUSED /]      ;TARGET IS REFUSING.
5342         PUSHJ P,TYCI40
5343         JRST TYCI17
5344 \f
5345 ;NOW WE KNOW IT'S OK TO TRY TO ^_C HIM. HIS TTY # IN B, MINE IN I.
5346 TYCI44: MOVE H,I        ;PUT MY TTY # IN H, HIS IN I.
5347         MOVE I,B
5348         SETO TT,
5349         PUSHJ P,TYCSET  ;GET HIS TTYCOM IN Q FOR TYCI63
5350         PUSHJ P,TYCI64  ;TYPE MSG FROM ME ON HIM.
5351          JFCL
5352         MOVE A,TTYIPC(I)
5353         CAIE A,TYCRW2   ;IF HE'S QUERYING US, NO NEED TO QUERY HIM;
5354          CAIN A,TYCRW   ;JUST PRETEND HE'S IN ACCEPT MODE.
5355           JRST TYCI43
5356         MOVSI A,%TCQRY
5357         TDNN A,TTYCOM(I)                ;SKIP IF HE MUST BE ASKED
5358          JRST TYCI43                    ;HE'S IN ACCEPT MODE.
5359         MOVEI T,[ASCIZ /- QUERYING/]    ;ELSE JUST MENTION TO HIM THAT WE'RE QUERYING
5360         SKIPL COMT3(H)
5361          PUSHJ P,TYCI40
5362         MOVEM I,COMT1(H)                ;AND SETTLE DOWN FOR HIM TO DO SOMETHING ABOUT IT.
5363         MOVEI A,TYCRW
5364         MOVEM A,TTYIPC(H)
5365         MOVE I,H
5366         PUSHJ P,TYCSET
5367         MOVEI T,[ASCIZ /QUERYING /]     ;TELL OUR USER THAT WE'RE WAITING FOR ANSWER.
5368         JRST TYCI40
5369
5370 TYCI68: CAIN TT,(I)     ;ENTRY TO DO FOR ALL LINKED TO HIM BUT NOT HIM.
5371          JRST POPJ1
5372 TYCI64: MOVEI T,[ASCIZ /\a\a
5373 MESSAGE FROM \a\a/]
5374         MOVE R,LOCTTY
5375         MOVE R,TTYTYP(R)
5376         TRNN R,%TYSTY
5377          JRST TYCI62
5378         MOVE R,LOCTTY
5379         MOVE R,STYSTS-NFSTTY(R)
5380         MOVE R,JNAME(R)
5381         CAME R,[SIXBIT /PEEK/]  ;THIS SEEMS TO BE A CROCK --RG
5382 TYCI62:  MOVEI T,[ASCIZ /\a\a
5383 LINK FROM \a\a/]
5384 TYCI71: PUSHJ P,TYCSET  ;SET UP Q,R,U,W FOR HIS TTY (# IN I)
5385         PUSHJ P,TYCI40  ;PRINT MSG <- T ON IT.
5386         PUSH P,I        ;SAVE HIS TTY #,
5387         MOVE I,H        ;GET MINE (ARG TO TYCREP)
5388         PUSHJ P,TYCREP  ;LOOP OVER ME AND ALL ALREADY LINKED TO ME.
5389             PUSHJ P,TYCI66
5390          JFCL
5391 TYCI41: POP P,I
5392         MOVEI A,40
5393         PUSHJ P,TTYI13
5394         JRST POPJ1
5395 \f
5396 ;TYPE UNAME OF 1 OF MY TTYS ON 1 OF HIS.
5397 TYCI66: HRRZ C,TTYCOM(H)
5398         CAIE C,-1
5399          JRST TYCI72
5400         CAIN H,(I)      ;BUT DON'T TYPE MY NAME ON HIM.
5401          CAME TT,-4(P)
5402           CAIA
5403            JRST POPJ1
5404 TYCI72: MOVEI C,(I)     ;PUT THIS TTY # IN C,
5405         MOVE I,-4(P)    ;GET HIS BACK IN I SINCE STILL TYPING ON HIM.
5406         CAMN C,-2(P)    ;IF THIS ISN'T MY TTY,
5407          JRST TYCI67
5408         MOVEI T,[ASCIZ/ AND /] ;THEN IT'S SOMEONE LINKED TO ME
5409         PUSHJ P,TYCI40  ;AND MY NAME WAS ALREADY TYPED
5410         MOVE C,-1(P)
5411 TYCI67: HRRE C,TTYSTS(C)        ;MY USER INDEX
5412         JUMPL C,TYCI92
5413         MOVE C,UNAME(C)
5414         HLRE A,C
5415         AOJE A,TYCI92
5416 TYCI91: PUSH P,C
5417         MOVSI T,(440600,,(P))
5418 TYCI42: ILDB A,T
5419         JUMPE A,POP1J1
5420         ADDI A,40       ;CONVERT MY UNAME FROM SIXBIT TO ASCII
5421         PUSHJ P,TTYI13  ;ECHO CHARACTER ON HIS TTY
5422         TLNE T,770000
5423         JRST TYCI42
5424         JRST POP1J1
5425
5426
5427 TYCI92: MOVSI C,(SIXBIT /T/)
5428         LDB T,[030300,,-1(P)]
5429         ADDI T,20
5430         DPB T,[300600,,C]
5431         LDB T,[000300,,-1(P)]
5432         ADDI T,20
5433         DPB T,[220600,,C]
5434         JRST TYCI91
5435 \f
5436 ;ACTUALLY JOIN MY TTY AND HIS IN COM LINK.
5437 ;ENTER WITH HIS TTY # IN I AND MINE IN H.
5438 ;LEAVE WITH MINE IN I AND HIS IN H, TT.
5439 TYCI43: TLO Q,%TCTPN    ;WHEN HE LEAVES COM MODE TYPE ^_N AT HIM.
5440         PUSHJ P,TYCI63  ;PUT HIM IN COM MODE IF HE ISN'T ALREADY.
5441         MOVE TT,I       ;HIS TTY # IN TT, MINE IN H.
5442         PUSHJ P,TYCREP  ;LOOP OVER TTYS LINKED TO HIM.
5443             PUSHJ P,TYCI68      ;PRINT OUT MSG FROM ON ALL LINKED TO HIM, NOT HIM.
5444          JFCL
5445         EXCH TT,H       ;INTERCHANGE HIS AND MINE.
5446         MOVE I,TT       ;LOOK AT ALL LINKED TO ME.
5447         PUSHJ P,TYCSET  ;WHEN I CHANGES, RELATED ACS SHOULD ALSO CHANGE.
5448         TLO Q,%TCTPN    ;WHEN HE LEAVES COM MODE TYPE ^_N AT HIM.
5449         PUSHJ P,TYCI63  ;PUT HIM IN COM MODE IF HE ISN'T ALREADY.
5450         PUSHJ P,TYCREP  ;ON EACH OF MINE, GIVE NAMES OF HIS.
5451             PUSHJ P,TYCI69
5452          JFCL
5453         MOVE TT,H
5454         MOVE A,TTYCOM(TT)       ;SET UP LINK
5455         MOVE B,TTYCOM(I)        ;LINK TTYCOM WORDS
5456         HRRE E,A
5457         AOJN E,TYCI45
5458         HRRM TT,A
5459 TYCI45: HRRE E,B
5460         AOJN E,TYCI46
5461         HRRM I,B
5462 TYCI46: HRRZ D,A
5463         HRRZ E,B
5464         HRRM E,A
5465         HRRM D,B
5466         MOVEM A,TTYCOM(TT)
5467         MOVEM B,TTYCOM(I)
5468         MOVEI A,TYCG
5469         MOVEM A,TTYIPC(I)
5470         MOVEM A,TTYIPC(TT)
5471         POPJ P,
5472
5473 TYCI69: CAIE I,(TT)     ;PRINT MSG ON ONE OF MY TTYS.
5474          JRST TYCI70
5475         SKIPA T,[[ASCIZ/OK /]]  ;MY TTY, SAY "G".
5476 TYCI70:  MOVEI T,[ASCIZ/
5477 LINK TO /]
5478         JRST TYCI71     ;DUE TO EXCH'S IN TYCI43,
5479                         ;EXCHANGE "ME" AND "HIM" IN COMMENTS IN TYCI71.
5480 \f
5481 ;TTYIPC FOR A ^_C'ER WHO IS QUERYING IS EITHER TYCRW OR TYCRW2.
5482 ;THAT IS DEPENDED ON.
5483 TYCRW:  PUSHJ P,TCNRM
5484         CAIE E,^G       ;^_C'ER MAY USE ^G TO GET ATTENTION.
5485          SKIPGE COMT3(I);IN IEC MODE CAN ALSO SAY THE NAME
5486           JRST TYCRW4
5487         CAIE E,^_       ;IGNORE ALL TYPEIN EXCEPT ^G AND ^_N.
5488          POPJ P,
5489         JSP D,TYCRDE    ;^_, ECHO IT AND GET NEXT CHAR.
5490 TYCRW2: PUSHJ P,TYCLWR
5491         CAIN E,"N
5492          JRST TYCI2
5493         MOVEI A,"?      ;^_ FOLLOWED BY OTHER THAN N.
5494         MOVEI B,TYCRW
5495         MOVEM B,TTYIPC(I)
5496         JRST TTYI13     ;ECHO ? AND GO BACK TO TYCRW
5497
5498 TYCRW4: PUSHJ P,TTYI18  ;^_C'ER TYPED ^G - ECHO ON HIS TTY
5499         MOVE I,COMT1(I) ;AND ^_C'D TTY.
5500         PUSHJ P,TYCSET
5501         JRST TTYI13
5502
5503 ;THE TTYIPC FOR A TTY IN A COM LINK NORMALLY POINTS HERE.
5504 ;ECHO OR INPUT THE CHAR ON ALL TTYS IN THE LOOP ACCORDING TO SETTINGS
5505 ;OF THE RELEVANT %TCICO, %TCLFT AND %TCRFT BITS.
5506 TYCG:   MOVE E,A
5507         ANDCMI E,#177   .SEE TYCI3
5508         CAIN E,^_       ;REC CHRS IN COM MODE
5509          JRST TYCGTN
5510 TYCG21: PUSH P,TTYCOM(I)        ;SAVE COMMUNICATE WORD.
5511         PUSH P,I        ;SAVE MY CONSOLE NUMBER
5512         PUSH P,A        ;SAVE THE CHARACTER
5513         TLNE Q,%TCICO   ;SKIP IF INPUT COM OVERRIDE OFF
5514          PUSHJ P,TTYI2  ;PROCESS INPUT OVERRIDE
5515         TLNN Q,%TCICO
5516          PUSHJ P,TTYI18 ;ECHO CHR ON MY TTY IF %TCICO NOT SET, OTHERWISE GIVE TO PROGRAM
5517         MOVE A,(P)      ;RESTORE CHARACTER
5518 TYCG5:  HRRE B,TTYCOM(I)        ;FIRST TTY IN CHAIN
5519         JUMPL B,[JRST 4,.]      ;I'M NOT COMMUNICATING WITH ANYONE
5520         CAME B,-1(P)    ;SKIP IF I'M COMMUNICATING WITH MYSELF
5521 TYCG3:   SKIPL C,TTYCOM(B)      ;SKIP IF HE IS IN COMMUNICATE MODE (THIS POINT IS "COM IN")
5522           BUG           ;LOSSAGE
5523         MOVE I,B        ;GET HIS TTY NUMBER IN I
5524         MOVE R,TTYTYP(I)
5525         MOVE B,-2(P)
5526         TLNE B,%TCRFT   ;IF MY %TCRFT AND HIS %TCLFT SET,
5527         TLNN C,%TCLFT
5528          JRST TYCG1
5529         MOVSI U,%TSLCZ  ;GIVE CHAR TO HIS PROGM.
5530         ANDCAB U,TTYSTS(I)
5531         PUSHJ P,TTYI2   ;TREAT CHAR AS INPUT FROM HIS TTY.
5532         JRST TYCG2      ;PROCESS NEXT TTY IN CHAIN
5533
5534 TYCG1:  PUSHJ P,TTYI13  ;OUTPUT CHAR ON HIS CONSOLE
5535 TYCG2:  MOVE A,(P)      ;RESTORE CHARACTER
5536         HRRE B,TTYCOM(I)        ;NEXT TTY IN CHAIN
5537         JUMPL B,[JRST 4,.]      ;CHAIN ENDS STRANGELY
5538         CAME B,-1(P)    ;SKIP IF DONE
5539         JRST TYCG3      ;PROCESS NEXT TTY
5540         SUB P,[3,,3]
5541         POPJ P,
5542 \f
5543 ;COME AFTER READING UNAME AFTER ^_K, HIS TTY # IN B.
5544 TYCK1:  PUSHJ P,TYCREP  ;NO GOOD IF THAT TTY ISN'T LINKED TO ME.
5545             CAIN B,(I)
5546          CAIN B,(I)     ;BUT NO GOOD IF IT IS ME.
5547           JRST TYCK2    ;NO GOOD, COMPLAIN.
5548         MOVE I,B
5549         PUSHJ P,TYCSET  ;GET HIS TTYCOM IN Q.
5550         JRST TYCGTM     ;NOW PRETEND HE DID ^_N (READ "HIM" FOR "ME")
5551
5552 TYCK2:  MOVE A,TTYIPC(B)
5553         CAIE A,TYCRW
5554          CAIN A,TYCRW2
5555           CAME I,COMT1(B)
5556            JRST TYCI7F  ;NOT LINKED TO THIS GUY, GIVE "?"
5557             JRST TYCQRF ;FLUSH GUY WHO WAS QUERYING
5558
5559 ;^_N TYPED IN.
5560 TYCN:   TLZ Q,%TCTPN    ;I DON'T NEED ^_N SUPPLIED IF I JUST TYPED IT IN MYSELF.
5561         PUSHJ P,TYCI2   ;ECHO THE N AND STORE Q. ALSO RESTORE TTYIPC AND TTYCOM TO NORMAL.
5562         SKIPL TTYCOM(I)
5563          POPJ P,
5564
5565 ;ASSUMING THAT TTY IN I IS IN A COM LINK, UNLINK IT.
5566 ;IF ONLY ONE OTHER TTY IS IN THE LINK, REMOVE IT FROM COM MODE TOO.
5567 TYCGTM: HRRE B,TTYCOM(I)        .SEE TTYLFC
5568         JUMPL B,[JRST 4,.]      ;WASN'T COMMUNICATING WITH ANYONE
5569         CAMN B,I
5570          BUG            ;COMMUNICATING WITH SELF
5571 TYCGT3: HRRE C,TTYCOM(B)
5572         JUMPL C,[JRST 4,.]      ;LIST NOT CIRCULAR
5573         CAMN C,I
5574         JRST TYCGT4     ;B HAS TTY NUMBER OF GUY POINTING TO ME
5575         MOVE B,C
5576         JRST TYCGT3
5577
5578 TYCGT4: HRRZ C,TTYCOM(I)
5579         PUSH P,B
5580         PUSH P,C
5581         PUSHJ P,TYCGT2  ;TAKE ME OUT OF COM MODE.
5582         POP P,C
5583         POP P,B
5584         EXCH I,B
5585         PUSHJ P,TYCSET
5586         CAME C,I        ;SKIP IF ONLY 1 IN LOOP BESIDES ME. IF SO, HE'S UNLINKED TOO.
5587          JRST TYCGT5
5588 ;MARK TTY IN I AS UNLINKED AND NOT N COM MODE. TYPE ^_N ON IT IF NECESSARY.
5589 TYCGT2: HRRI Q,-1
5590         TLZ Q,400000+%TCLFT+%TCRFT
5591         TLZN Q,%TCTPN
5592          JRST TYCI17
5593         MOVEI T,[ASCIZ/\1fN/]
5594         PUSHJ P,TYCI40
5595         JRST TYCI17
5596
5597 TYCGT5: HRRM C,TTYCOM(I)        ;TAKE ME OUT OF THE CIRCULAR LIST
5598         MOVEI H,(B)
5599         SETO TT,        ;FOOL TEST AT TYCI66
5600         PUSHJ P,TYCREP  ;TELL ALL THE OTHERS THAT I'VE LEFT.
5601             PUSHJ P,TYCI73
5602          JFCL
5603         POPJ P,
5604
5605 TYCI73: JSP T,TYCI71    ;PRINT MSG AND MY UNAME ON TTY # IN I.
5606         ASCIZ/
5607 BYE FROM /
5608 \f
5609 SUBTTL TTY OUTPUT INTERRUPT LEVEL
5610
5611 OVHMTR TTO      ;TTY OUTPUT INTERRUPT LEVEL
5612
5613 ;HANDLE AN OUTPUT INTERRUPT FROM A CHAR-AT-A-TIME CONTROLLER.
5614 TYPSC:  MOVEI B,1
5615         MOVEM B,DBBCC
5616         MOVEM B,DBBCC1
5617         MOVE B,[444400,,STYICH]
5618         MOVEM B,DBBBP
5619 ;HANDLE AN OUTPUT INT. ON A MULTI-CHAR CONTROLLER, ASSUMING
5620 ;COUNT AND B.P. ARE ALREADY SET UP.
5621 TYP:    LDB J,[220300,,TTYTYP(I)] ;GET TTY OUTPUT SPEED.
5622 TYP0:                   ;COME HERE FOR DPK; J ALREADY SET UP.
5623 IFN NNVTTS,[
5624         CAMN I,NOVATT
5625          JRST TYP0N
5626 ]
5627         HRRZ W,TCTYP(I)
5628         MOVE T,TTYTYP(I)
5629         MOVE H,TTYOPT(I)
5630         HRRZ A,TTOALC(I)
5631         JUMPE A,[SETOM TTYOAC(I)
5632                  JRST TYP1C]    ;IF TTY HAS NO SPACE FOR ANY OUTPUT, STOP SENDING.
5633         MOVE A,TIME
5634         MOVEM A,TTLTM(I) ;UPDATE TIME OF LAST OUTPUT THIS TTY.
5635 TYP0F:  PUSHJ P,TYPLUP  ;OUTPUT AT LEAST 1 CHAR.
5636         SKIPGE TTYOAC(I)
5637          JRST TYP1C
5638         SKIPLE DBBCC    ;SKIP IF OUT OF ROOM
5639          JRST TYP0F     ;CONTINUE MESSAGE
5640 TYP1B:  SKIPGE A,DBBCC
5641          BUG            ;CONTROLLER'S BUFFER OVERFILLED?
5642         SUB A,DBBCC1    ;GET -<# CHARS WE ARE SENDING>
5643         SKIPL E,A
5644          BUG            ;SENDING NO CHARS OR NEGATIVELY MANY?
5645         ADD A,TTOALC(I) ;IF THE ALLOCATION ISN'T INFINITE,
5646         TRNN A,400000
5647          HRRM A,TTOALC(I) ;DECREMENT IT BY # CHARS JUST OUTPUT.
5648 IFN MTYP,[
5649         TRNN T,%TYMTY   ;IF MTY ISN'T THE ONLY CONTROLLER, CHECK FOR THE OTHERS
5650          JRST TYP1D
5651         CONO MTY,@TTYLT(I)
5652         DATAO MTY,MTYOW
5653         POPJ P,
5654
5655 TYP1D:  ]
5656 IFN DPKPP,[
5657         TRNN T,%TYDPK
5658          JRST TYP1E
5659         MOVN A,E                ;- - # CHARS OUTPUT
5660         ADDM A,@DPKC-NFDPTY(I)  ;GIVES # OF CHARS FOR CONTROLLER.
5661         XCT TTYST(I)            ;TELL THE DPK THEY'RE THERE.
5662         POPJ P,
5663
5664 TYP1E:]
5665 IFN DL10P,[
5666         TRNN T,%TYDL
5667          JRST TYP1G
5668         MOVNM E,DL10CC  ;STORE # CHARS BEING SENT.
5669         MOVE A,[340000,,DL10BF-1]
5670         MOVEM A,DL10BP  ;GIVE THE 11 ITS MAGIC POINTER TO SNARF THE BUFFER.
5671         MOVEM I,DL10LN  ;STORE LINE # OF TTY, THUS TELLING 11 TO GO AHEAD.
5672         CONO DLC,100040+TTYCHN  ;INTERRUPT 11
5673         POPJ P,
5674 TYP1G:]
5675 IFN KL10P,[
5676         TRNN T,%TYETY
5677          JRST TYP1I
5678         SKIPL DTEOUT
5679          BUG            ;OVER-RUNNING PREVIOUS TRANSFER
5680         MOVE A,[441000,,DTEOBF] ;SET UP BYTE POINTER FOR 10-11 CHANNEL
5681         MOVEM A,DTEBPO
5682         MOVN A,E        ;NUMBER OF CHARACTERS BEING SENT
5683         HRLI A,%DCTYO(I);SEND TYPE-OUT COMMAND, AND LINE NUMBER
5684         MOVEM A,DTEOUT  ;GIVE COMMAND TO 11
5685         MOVEM A,DTEBBY  ;FLAG BUFFER BUSY (AND REMEMBER WHICH COMMAND FOR DEBUGGING)
5686         MOVEI A,10.     ;5-SECOND TIMEOUT FOR LOST TO-11 XFER DONE INTERRUPT
5687         MOVEM A,DTEBBT  ;WHICH SEEMS TO HAPPEN NOW & THEN FOR SOME REASON
5688         CONO DTE,%DBL11 ;AND GIVE INTERRUPT
5689         POPJ P,
5690 TYP1I:];KL10P
5691         TRNN T,%TYSTY
5692          JRST TYP1H
5693         MOVEI A,TOBS
5694         CAML A,TORM(I)
5695          POPJ P,
5696         MOVE A,TTYBYP(I)
5697         ILDB B,A
5698         JUMPE B,TYPEND
5699         POPJ P,
5700
5701 TYP1H:  MOVE A,STYICH   ;HANDLE CHAR-AT-A-TIME CONTROLLERS.
5702         TLNN T,%TTPAR   ;GENERATE A PARITY BIT IF NECESSARY.
5703          JRST TYPDA1
5704         IMUL A,[2010040201]
5705         AND A,[21042104377]
5706         IDIVI A,17_7
5707         MOVE A,B
5708 TYPDA1: CAIL I,NFDPTY
5709          BUG
5710         XCT TTYDO(I)    ;DATAO XXX,A
5711         POPJ P,
5712
5713 TYP1C:  MOVE E,DBBCC
5714         CAME E,DBBCC1   ;SKIP IF NOTHING TO SEND
5715          JRST TYP1F     ;SEND WHAT THERE IS
5716         XCT TTYDFF(I)   ;CLEAR OUTPUT DONE
5717         POPJ P,
5718
5719 TYP1F:  AOS TTYOAC(I)
5720         JRST TYP1B
5721 \f
5722 IFN NNVTTS,[
5723 TYP0N:  AOSE NVTSIP     ;CHAR PENDING?
5724         JRST TYP0A      ;NO
5725         DATAO NTY,NVTSSC        ;SEND CHR AFTER SELECT
5726         POPJ P,
5727
5728 TYP0A:  SKIPN A,NVOPTT
5729         .ERR Shouldn't this be using NFNVTY Instead?
5730         MOVEI A,NOTYS+NNTYS+NNVTTS-1
5731         MOVEM A,NNVSEC  ;SET UP END CHECK
5732         SKIPN I,NVOPTT
5733         MOVEI I,NOTYS+NNTYS     ;INITIALIZE
5734         SETOM NNVSFL    ;SET FIRST TIME THRU FLAG
5735         MOVE A,NVTCC
5736         CAIGE A,10      ;SENT TOO MANY CHRS TO THIS CONSOLE W/O LOOKING AT OTHERS?
5737         JRST TYP        ;NO, LOOK AT CONSOLE
5738         SETZM NVOPTT
5739         SETZM NVTCC     ;YES LOOK AT OTHERS
5740 TYP0C:  AOS I
5741         CAIL I,NOTYS+NNTYS+NNVTTS
5742         SUBI I,NNVTTS
5743         AOS NNVSFL
5744         JRST TYP
5745 ]
5746 \f
5747 ;FEED SOME CHARACTERS FROM OUTPUT BUFFER TO THE TTY.
5748 TYPLUP: SKIPE TTYBYP(I)
5749          JRST TYPBP
5750         MOVE Q,TOOP(I)
5751         MOVE E,TORM(I)
5752 TYPLU1: CAIL E,TOBS
5753          JRST [ MOVEM E,TORM(I) ;OUTPUT BUFFER EMPTY
5754                 MOVEM Q,TOOP(I)
5755                 JRST TYPEND ]
5756         MOVE D,Q
5757         CAMN Q,TOBEP(I)
5758          MOVE Q,TOBBP(I)
5759         ILDB A,Q        ;GET NEXT CHARACTER FROM OUTPUT BUFFER
5760         CAIL A,%TXDIS-1 ;IF DISPLAY OR CURSOR MOTION, DISPATCH.
5761          JRST [ MOVEM E,TORM(I) ;LEAVING THE FAST LOOP
5762                 MOVEM D,TOOP(I) ;WITHOUT EATING THIS CHAR YET
5763                 CAIN W,%TNSFW   ;"SOFTWARE" TTY GETS THE CODES
5764                  JRST TYPSFW    ;AS THEY APPEAR IN THE BUFFER.
5765                 CAIL A,%TDMAX
5766                  JRST TYEEO1
5767                 JRST @TYPDTB-%TXDIS(A)]
5768         TLNN H,%TOSAI   ;CTL CHARS ARE SPACING IFF SAIL CHAR SET;
5769          CAIL A,40      ;NON-CONTROLS ARE SPACING.
5770           AOS TTYIHP(I)
5771 IFN MTYP,[
5772         JUMPE A,[ TRNE T,%TYMTY ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
5773                    PUSHJ P,MNULLO
5774                     JRST .+1    ;OUTPUT IT NOW
5775                    MOVE Q,D     ;BACKUP BYTE POINTER AND OUTPUT IT LATER
5776                    JRST TYPLU2]
5777 ];MTYP
5778         IDPB A,DBBBP    ;PUT INTO DEVICE BUFFER
5779         SOSLE DBBCC
5780          AOJA E,TYPLU1
5781         AOS E           ;MAXIMUM AMOUNT OF CRUFT GENERATED
5782 TYPLU2: MOVEM E,TORM(I)
5783         MOVEM Q,TOOP(I)
5784         POPJ P,
5785
5786 IFN MTYP,[
5787 MNULLO: MOVE A,DBBCC    ;SKIPS IF NULL MAY NOT BE OUTPUT TO MTY NOW
5788         SETZM DBBCC
5789         SUBM A,DBBCC1
5790         MOVNS DBBCC1
5791         CAIE A,MTYNC
5792          JRST POPJ1
5793         SETZB A,MTYOW
5794         AOS DBBCC
5795         AOS DBBCC1
5796         POPJ P,
5797 ];MTYP
5798
5799 ;HERE TO OUTPUT CHARACTER WHEN NOT IN FAST LOOP
5800 TYPSIO:
5801 IFN MTYP,[
5802         JUMPE A,[ TRNE T,%TYMTY ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
5803                    PUSHJ P,MNULLO
5804                     JRST .+1    ;OUTPUT IT NOW
5805                    POPJ P, ]    ;WAIT
5806 ];MTYP
5807         MOVEM Q,TOOP(I) ;REMOVE CHAR FROM OUTPUT BUFFER.
5808         AOS TORM(I)
5809
5810 ;OUTPUT CHAR IN A TO TTY, AND LOOP BACK TO TYPLUP IF THERE IS
5811 ;ROOM FOR MORE CHARS. (OTHERWISE POPJ OUT OF TYPLUP).
5812 TYPOU2: IDPB A,DBBBP    ;FOR FAST CONTROLLERS, STICK CHAR IN LOW LVL BUFFER.
5813         SOSLE DBBCC
5814           JRST TYPLUP   ;ROOM FOR MORE CHARS.
5815         POPJ P,
5816
5817 ;ACTUALLY OUTPUT A CHAR TO THE TTY (AND POPJ).
5818 TYPOUT:
5819 IFN MTYP,[
5820         TRNE T,%TYMTY
5821          JUMPE A,CPOPJ  ;MTY CAN'T HANDLE NULLS.
5822 ]
5823         IDPB A,DBBBP
5824         SOSGE DBBCC
5825          BUG
5826         POPJ P,
5827 \f
5828 TYPSFW: TRNE T,%TYSTY   ;STY TTY IN SOFTWARE MODE =>
5829          JRST TYPSFS    ;SEND THE 8-BIT FROB
5830         SUBI A,%TXDIS-2 ;ELSE SEND IT, ESCAPED BY A RUBOUT, WITH 176
5831         CAIE A,%TDMV0-%TXDIS+2  ;  SUBTRACTED FROM IT SO FITS IN 7 BITS
5832         CAIN A,%TDMV1-%TXDIS+2
5833          JRST [ MOVE E,TORM(I)  ;FOR %TDMV1, MUST INCREMENT THE 2 ARGS.
5834                 CAILE E,TOBS-3
5835                  JRST TYPEND
5836                 JRST TYPSF2]
5837         CAIE A,%TDMOV-%TXDIS+2
5838          JRST TYPSF0
5839         MOVE E,TORM(I)  ;AND FOR %TDMOV, MUST INCREMENT THE 4 ARGS SO THEY'RE NOT 0.
5840         CAILE E,TOBS-5  ;IF NOT ALL IN BUFFER, WAIT FOR THEM. TTY WILL BE STARTED AGAIN.
5841          JRST TYPEND
5842 IRPS TYPSF1,,TYPSF4:TYPSF3:TYPSF2:TYPSF1:               ;DIGIT MANY CHARS FOLLOW
5843 TYPSF1: DPB A,Q         ;STORE PREV. CHAR, FIXED UP.
5844         CAMN Q,TOBEP(I)
5845          MOVE Q,TOBBP(I)
5846         ILDB A,Q
5847         ADDI A,1        ;UPDATE %TDMOV ARGS BY ADDING 1.
5848 TERMIN
5849 TYPSF0: DPB A,Q         ;OK, THE COMMANDS ARE ALTERED, SO SEND THE 177.
5850         MOVEI A,%TXDIS-1
5851         JRST TYPOU2
5852
5853 IFE NETP,TYPSFS==<TYPORS==TYPSIO>
5854 IFN NETP,[
5855 ;HERE FOR OUTPUT OF 8-BIT FROB TO A SOFTWARE TTY THAT IS A STY
5856 TYPSFS: CAIN A,%TDORS           ;SKIPS INTO TYPORS
5857 ;HERE FOR %TDORS IN OUTPUT BUFFER
5858 TYPORS:  SKIPN TYPNTF
5859           JRST TYPSIO
5860 ;HERE FOR %TDORS OUTPUT BY STY DIRECTLY INTO A NET SOCKET
5861 IFN CHAOSP\TCPP, MOVE T,STYSTS-NFSTTY(I)        ; Get flags for STY
5862 IFN CHAOSP,[
5863         TLNE T,%SSCHA           ; If Chaosnet,
5864          JRST TYPOR1            ; don't send "INS"
5865 ];CHAOSP
5866 IFN TCPP,[
5867         TLNN T,%SSTCP           ; If TCP, send magic chars in URGENT mode.
5868          JRST TYPOR2
5869         HRRZ A,STYNTI-NFSTTY(I) ; Get TCB index
5870         SKIPL XBSTAT(A)         ; Verify that COS is locked down
5871          BUG HALT,[TCP: Buff not locked]
5872         HLRZ T,XBOCOS(A)        ; Find orig val of XBOBC
5873         SUB T,XBOBC(A)          ; Find # bytes already in buffer
5874         CAIGE T,
5875          BUG HALT               ; Just-in-case check
5876         MOVE H,STYORC-NFSTTY(I) ; Get magic 8-bit chars to send
5877         TLNE H,(377_<<8.*3>+4>) ; Check 1st char
5878          AOJA T,[TLNE H,(377_<<8.*2>+4>)        ; Check 2nd char
5879                   AOJA T,[      TDNE H,[377_<8.+4>]     ; Check 3rd char
5880                                  AOJA T,.+1
5881                                 JRST .+1]
5882                 JRST .+1]
5883         MOVEM T,XBSUP(A)        ; Store # chars up to # including magic chars
5884                                 ; as the TCP URGENT pointer.
5885         JRST TYPOR1
5886 TYPOR2:
5887 ];TCPP
5888 IFN NCPP,[
5889         HRRZ A,STYNTI-NFSTTY(I) ;GET NET INDEX
5890         PI2SAF
5891         MOVE T,IMFCQL           ;IF INSUFFICIENT SPACE IN
5892         CAIG T,2                ; THE CONTROL QUEUE,
5893          JRST [ MOVSI T,200000  ; DEFER SENDING THIS
5894                 IORM T,IMSOC5(A) ;AND REQUEST TTY WAKEUP LATER
5895                 AOS IMNAS       ;TELL 1/2 SECOND CLOCK
5896                 AOS IMNORH
5897                 MOVE T,TTYTYP(I)        ;NEEDED BY TTY ROUTINES
5898                 JRST TYPEN1 ]
5899         EXCH A,I                ;A TTY IDX, I NET IDX
5900         PUSH P,Q
5901         PUSH P,IMPCSH
5902         LDB T,IMSCFH
5903         MOVEM T,IMPCSH          ;SECRET ARGUMENT TO IMSTCM
5904         JSP T,IMSTCM
5905             2,,1
5906          BUG PAUSE,[TTY: NO IMP BUFFERS AVAILABLE FOR "INS" MSG]
5907         MOVSI B,8_10.           ;INS
5908         LDB C,IMSCLN            ;LINK #
5909         DPB C,[241000,,B]
5910         MOVEM B,10(Q)
5911         PUSHJ P,IMWCQ
5912         POP P,IMPCSH
5913         POP P,Q
5914         MOVE I,A
5915 ] ;IFN NCPP
5916 TYPOR1: MOVE H,TTYOPT(I)
5917         MOVE T,TTYTYP(I)
5918         MOVE W,TCTYP(I)
5919         MOVEI A,STYORC-NFSTTY(I)        ;TYPE OUT THE MAGIC CHARACTERS
5920         HRLI A,440800
5921         JRST TYEEO2
5922 ];NETP
5923 \f
5924 ;COME HERE FROM TYPLUP WHEN THERE'S NOTHING TO TYPE OUT.
5925 ;CALL ALSO FROM TT11I4 WHEN THE PDP11 SAYS THE OUTPUT BUFFER IS EMPTY.
5926 TYPEND: PUSHJ P,TYPEN2
5927 TYPEN1: SETOM TTYOAC(I)
5928         POPJ P,
5929
5930 ;SUBROUTINE TO ACTIVATE ANY ECHOING ETC. THAT MAY NEED TO BE DONE
5931 TYPEN2: SKIPGE TYOSW(I) ;IF ECHOING CAN BE DONE NOW,
5932          SKIPL TTOALC(I)
5933           POPJ P,
5934         MOVE Q,TTYCOM(I)
5935         TLNN Q,%TCDNG   ;IS THERE ECHOING NEEDING TO BE DONE?
5936          SKIPE ECHOC(I)
5937           PUSHJ P,TTYI7 ;IF SO, QUEUE IT.
5938         SKIPGE TTYLPP(I)
5939          PUSHJ P,TTYI7  ;ALSO FORCE OUT BUFFERED CURSOR MVT.
5940         POPJ P,
5941
5942 IFN NNVTTS,[
5943 TYP5:   CAMN I,NNVSEC   ;REACHED END
5944          AOSG NNVSFL    ;AND NOT FIRST TIME
5945           JRST TYP0C    ;LOOK AT OTHER NOVA CONSOLES
5946         MOVE I,NOVATT
5947         JRST TYP1C
5948 ]
5949
5950 ;IF TTYBYP ISN'T 0, IT IS B.P. TO ASCIZ STRING TO TYPE.
5951 ;COME HERE TO OUTPUT THE NEXT CHAR OF THE STRING OR CLEAR TTYBYP.
5952 TYPBP:  ILDB A,TTYBYP(I)
5953         TRZE A,400              ;KLUDGE FOR C-100 (and others) TO GET NULLS OUT
5954 IFE MTYP,JRST TYPOU2
5955 .ELSE [  JRST [ TRNE T,%TYMTY
5956                  PUSHJ P,MNULLO ;MTY CAN'T SEND NULLS EXCEPT AS FIRST CHAR IN WORD
5957                   JRST TYPOU2   ;OUTPUT THE NULL NOW
5958                 MOVSI A,100000  ;BACK UP BYTE POINTER
5959                 ADDM A,TTYBYP(I)
5960                 POPJ P, ]       ;OUTPUT PARTIAL WORD THEN SEND NULL NEXT TIME
5961 ];MTYP
5962         JUMPN A,TYPOU2          ;NOT END => OUTPUT THE CHAR.
5963         MOVE A,@TTYBYP(I)       ;AT END, CHECK FOR SPECIAL
5964         TRNE A,1                ; TEKTRONIX DELAY KLUDGE
5965          JRST TYPBP1
5966 TYPBP2: CLEARM TTYBYP(I)        ;END OF ASCIZ STRING.
5967         JRST TYPLUP
5968
5969 TYPBP1: MOVSI B,7700            ;CLEAR SIZE FIELD
5970         ANDCAB B,TTYBYP(I)
5971         LDB A,[$TTOSP,,TTYTYP(I)]
5972         MOVM A,BAUDRT(A)        ;GET BITS PER SECOND
5973         MOVE B,1(B)             ;GET SPECIFICATION WORD SAYING WHAT PADDING WE WANT.
5974         CAMN B,[SETZ]
5975          JRST TYPBP3            ;JUMP IF SPECIAL KLUDGE FOR TEKTRONIX
5976         JUMPG B,TYPBP4          ;JUMP IF PADDING INDEPENDENT OF VPOS.
5977 ; this is fixed elsewhere now.
5978 ;       MOVE Q,TCTYP(I)         ;IS THIS AN H19
5979 ;       CAIN Q,%TNH19           ;H19'S HAVE TO BE PADDED WITH NUL's
5980 ;        JRST TYPBP8            ;  SO HANDLE THEM SPECIALLY
5981         PUSHJ P,TYPBP6          ;CALCULATE NUMBER OF CHARACTERS OF PADDING NEEDED
5982         JRST TYPBP5
5983
5984 TYPBP4: IMUL B,A                ;1000. * NUMBER OF BITS PADDING
5985         IDIVI B,10000.          ;NUMBER OF CHARACTERS PADDING (NOTE ROUND-DOWN)
5986 TYPBP5: SETZM TTYBYP(I)         ;IN CASE NO PADDING REQUIRED
5987         PUSHJ P,TYMPAD          ;PUT THE PADDING BYTE POINTER INTO TTYBYP
5988         JRST TYPLUP
5989
5990 TYPBP3: IDIVI A,9               ;GET CHARACTERS PER 1.1 SECOND
5991         SKIPL TTYIHP(I)         ;KLUDGE KLUDGE
5992          MOVNM A,TTYIHP(I)      ;BUT IT'S GOTTA BE STORED SOMEPLACE
5993         AOSL TTYIHP(I)
5994          JRST TYPBP2            ;SIGH, DELAY COMPLETED
5995         MOVEI A,^V              ;NOT YET COMPLETED, SEND ANOTHER PAD
5996         JRST TYPOU2
5997
5998 TYPBP6: MOVMS B
5999         IMUL A,B                ;IF NEGATIVE, TAKE ABS VALUE
6000         MOVE B,TCMXV(I)         ;TIMES NUMBER OF LINES AT AND BELOW THE CURSOR.
6001         SUB B,TTYIVP(I)
6002         IMUL B,A                ; 1000.* NUMBER OF BITS OF PADDING
6003         IDIVI B,10000.*8.       ; DIVIDE BY 10000. TO GET NO. OF CHARS OF PADDING
6004                                 ; AND THEN BY 8 BECAUSE PER LINE TIMES ARE EXPRESSED
6005         POPJ P,                 ; IN TERMS OF 1/8 MS FOR BETTER RESOLUTION
6006
6007 ;once upon a time someone thought that this might cause padding with nulls to
6008 ;happen.  It didn't work.
6009 ;TYPBP8:        SKIPL TTYIHP(I)         ;TO EXPAND UPON A KLUDGE
6010 ;        JRST [ PUSHJ P,TYPBP6          ;CALCULATE THE # OF CHARS NEEDED
6011 ;               MOVNM B,TTYIHP(I)       ;AND SAVE THEM AWAY TO BE COUNTED
6012 ;               JRST .+1 ]
6013 ;       AOSL TTYIHP(I)          ;COUNT THIS CHARACTER
6014 ;        JRST TYPBP2            ;  DELAY COMPLETED, RESET WORLD
6015 ;       SETZ A,                 ;NUL!
6016 ;       JRST TYPOU2             ;STUFF IT IN THE BUFFER, AND FIND WAY BACK HERE
6017 \f
6018 ;COME HERE TO DO CURSOR MOTION ON PRINTING TTYS.
6019 ;TT HAS DESIRED HPOS; D HAS DESIRED VPOS.
6020 TYMPRR: MOVE B,TCMXH(I)
6021         SUBI B,1
6022         CAMGE B,TTYIHP(I)
6023          MOVEM B,TTYIHP(I)
6024 TYMPRT: CAIN W,%TNMEM
6025          JRST [ CAMLE D,TTYIVP(I) ;VERTICAL MOTION NEEDED, AND CURSOR NOT AT LEFT MARGIN?
6026                  SKIPN TTYIHP(I)
6027                   JRST .+1      ;(PREVENT INFINITE CR LOOP).
6028                 SETZ TT,        ;START WITH A CR.
6029                 JRST TYMPH1]    ;MEMOWRECK LOSES LF'ING IN MID-LINE.
6030         CAMGE TT,TTYIHP(I) ;BACKWARD MOTION TAKES PRIORITY.
6031          JRST TYMPH1
6032         CAMLE D,TTYIVP(I) ;THEN DOWNWARD MOTION.
6033          JRST TYMPV2
6034         CAMLE TT,TTYIHP(I) ;THEN FORWARD MOION.
6035          JRST TYMPHF
6036         MOVEM D,TTYIVP(I) ;MUST BE UPWARD MOTION
6037         JRST TYMOV8     ;WHICH IS A NO-OP ON PRINTING TTYS.
6038
6039 TYMPV2: AOS TTYIVP(I)   ;MOVING DOWN: DO ONE LF
6040         MOVEI A,^J
6041         PUSHJ P,TYPOUT
6042         PUSHJ P,TYMOVX  ;IF REACHED GOAL, SAY FINISHED.
6043         LDB B,[$TPPLF,,TTYOPT(I)]
6044         CAIN W,%TNTRM
6045          ADDI B,TYMTVT-TYMPVT
6046         CAIN W,%TNMEM
6047          ADDI B,TYMMVT-TYMPVT
6048         HRRZ B,TYMPVT(B) ;# PADDING AFTER LF.
6049         JUMPN B,TYMPAD
6050         POPJ P,
6051
6052 TYMPVT: 0       ;NORMAL
6053         2       ;2741, MEMOWRECK
6054 REPEAT 6,2+.RPCNT ;EXTRA
6055 TYMTVT: 0       ;UNPADDED TERMINET
6056         3       ;10CPS TERMINET
6057         4       ;15CPS TERMINET
6058         10      ;30CPS TERMINET
6059         17      ;60CPS TERMINET
6060         35      ;120CPS TERMINET (MAX SPEED)
6061         0
6062         0
6063 TYMMVT: 0       ;UNPADDED WRECK
6064         0
6065         0
6066         1       ;30CPS WRECK
6067         2       ;60CPS
6068 REPEAT 3,0
6069
6070 TYMPHF: LDB B,[$TPPTB,,TTYOPT(I)] ;FORWARD: CAN WE DO IT WITH TABS?
6071         JUMPE B,TYMPH6  ;TABS NOT ALLOWED ON THIS TTY.
6072         MOVE A,TTYIHP(I)
6073         ANDCMI A,7      ;SEE WHERE A TAB WOULD BRING US.
6074         ADDI A,10
6075         CAILE A,(TT)    ;BEYOND WHERE WE WANT TO GO?
6076          JRST TYMPH6
6077         SUBI A,(B)      ;A HAS TAB STOP - <# PADDING>-1
6078         CAMG A,TTYIHP(I) ;TAB FASTER THAN SPACES (INCLUDING PADDING)?
6079          JRST TYMPH6    ;NO, USE SPACES.
6080         ADDI A,(B)      ;A HAS TAB STOP.
6081         MOVEM A,TTYIHP(I)
6082         MOVEI A,^I
6083         SOJA B,TYMPT1   ;B HAS # PADDING AFTER TAB.
6084
6085 TYMPH6: MOVEI A,40      ;GO FORWARD WITH SPACES
6086         MOVE C,[AOS TTYIHP(I)]
6087         JRST TYMPH7
6088
6089 TYMPH2: MOVEI A,^H      ;GO BACKWARD WITH BACKSPACES
6090         MOVE C,[SOS TTYIHP(I)]
6091 TYMPH7: MOVE B,TT
6092         SUB B,TTYIHP(I)
6093         MOVMS B         ;HOW MANY TIMES TO PUT CHAR
6094 TYMPH8: XCT C
6095         IDPB A,DBBBP
6096         SOSG DBBCC
6097          JRST TYMOVY
6098         SOJG B,TYMPH8
6099         JRST TYMOVX
6100 \f
6101 ;COME HERE TO MOVE BACKWARDS.
6102 TYMPH1: MOVE A,TTYIHP(I)
6103         SUB A,TT        ;A HAS # CHARS IF WE BACKSPACE.
6104         LDB B,[$TPPCR,,TTYOPT(I)]
6105         JUMPE B,TYMPH9
6106         MOVE E,B        ;E HAS PADDING TYPE OF TTY,
6107         MOVE B,TTYIHP(I) ;B HAS CURRENT HPOS.
6108         CAIL E,<.BM $TPPCR,_-.TZ .BM $TPPCR>-TYMPHL+1   ;THIS ONE A SPECIAL $TPPCR CODE?
6109          JRST @TYMPHT-<.BM $TPPCR,_-.TZ .BM $TPPCR>-1(E)
6110         LDB C,[$TTOSP,,TTYTYP(I)]
6111         SUBI C,2        ;(THIS ONLY WORKS FOR SPEED CODES 2,3,4,5)
6112         ANDI C,3                ;(= 110, 150, 300, 1200 BAUD).
6113         MOVE C,(C)[33. ? 20. ? 10. ? 5]
6114         IDIV B,C        ;1 PAD CHAR FOR EACH (33./20./10./5) SPACES TO MOVE.
6115         ADDI B,1        ;I.E. MOVES AT 300/PADCODE COLUMNS PER SECOND
6116         IMULI B,(E)     ; OR 600/PADCODE COLUMNS PER SECOND AT 1200 BAUD
6117         ADDI B,-1(E)
6118 TYMPH9: MOVE C,D
6119         SUB C,TTYIVP(I) ;IF WE'RE MOVING DOWN AFTER THE CR, HOW MANY LF'S?
6120         JUMPLE C,TYMPH5
6121         SUB B,C         ;EACH LF REDUCES # PADDING NEEDED BY CR.
6122         CAIGE B,        ;BUT CAN'T NEED LESS THAN 0 PADDING.
6123          SETZ B,
6124 ;B HAS # CHARS PADDING NEEDED AFTER CR, IF WE DECIDE TO CR.
6125 TYMPH5: TLNN H,%TOMVB   ;HOW DO WE MOVE BACKWARD?
6126          JRST TYMPH3    ;CAN'T BS => MUST CR AND SPACE FWD.
6127         JUMPE TT,TYMPH3 ;GOING TO COLUMN 0 => ALWAYS CR
6128         TLNN H,%TOOVR   ;ON A GLASS TTY, IF STAYING ON THE SAME LINE, HAVE TO
6129          JUMPLE C,TYMPH2 ; USE BACKSPACES TO NOT OBLITERATE PREVIOUS OUTPUT
6130         LDB E,[$TPPTB,,TTYOPT(I)]
6131         JUMPE E,[MOVE C,TT ;CAN'T USE TABS: C _ TIME IF MOVE FWD.
6132                 JRST TYMPT2]
6133         PUSH P,B        ;CAN USE TABS: SEE HOW LONG TO GO FWD
6134         MOVE B,TT       ;USING TABS.
6135         IDIVI B,10      ;NEED C(B) TABS AND C(C) SPACES.
6136         IMULI B,(E)     ;B _ TIME NEEDED FOR TABS & PADDING.
6137         ADDI C,(B)      ;C _ TIME NEEDED TO GO FWD.
6138         POP P,B
6139 TYMPT2: ADDI C,1(B)     ;ADD IN TIME TO CR, + PADDING.
6140         CAMLE C,A
6141          JRST TYMPH2    ;FASTER TO BACKSPACE.
6142 TYMPH3: MOVEI A,^M      ;OUTPUT A CR (WILL SPACE FORWARD LATER)
6143         SETZM TTYIHP(I) ;WHEN WE COME BACK WE'LL SEE WE
6144 TYMPT1: PUSH P,B        ;NEED TO GO FORWARD.
6145         PUSHJ P,TYPOUT
6146         PUSHJ P,TYMOVX
6147         POP P,B
6148         JRST TYMPAD     ;PAD THE TTY (# CHARS PADDING IN B)
6149 \f
6150 ;DISPATCH TABLE FOR SPECIAL %TPPCR CODES.
6151 TYMPHZ: TYMPEX  ;EXECUPORT.
6152         TYMP27  ;2741.
6153         TYMPMW  ;MEMOWRECK.
6154         TYMPH5  ;CODE 7 NOT USED.
6155 TYMPHT: TYMPHL==.-TYMPHZ
6156
6157 TYMP27: IDIVI B,10.
6158         CAILE B,14.
6159         MOVEI B,14.
6160         AOJA B,TYMPH5
6161
6162 TYMPMW: LDB E,[$TPPLF,,TTYOPT(I)]
6163         JUMPE B,TYMPM1  ;NO CHRS
6164         MOVNS B
6165         ADD B,TYMPMT(E)
6166         CAMGE B,TYMMVT(E)
6167 TYMPM1:  MOVE B,TYMMVT(E)
6168         CAMLE D,TTYIVP(I)       ;BEFORE LF'ING, MEMOWRECK
6169          JRST TYMPH3    ;MUST CR RATHER THAN BS.
6170         JRST TYMPH5
6171
6172 TYMPMT: 0               ;MEMOWRECK MIMIMUM LINE SIZE, AS FUNCTION OF SPEED
6173         8               ;VIA THE $TPPLF CODE.
6174         11.
6175         22.
6176         43.
6177 REPEAT 3,0
6178
6179 TYMPEX: IDIVI B,10.     ;EXECUPORT: 1 PAD CHAR FOR EVERY 10 POSITIONS TO CR THRU.
6180         ADDI B,5
6181         JRST TYMPH9
6182
6183 ;COME HERE TO PAD A PRINTING TERMINAL: # CHARS OF PADDING IN B.
6184 TYMPAD: AOSG A,B        ;AOS COMPENSATES FOR ILDB
6185          POPJ P,
6186         MOVE Q,TCTYP(I) ;is this an H19?
6187         CAIN Q,%TNH19   ;H19's have to be nullified. I mean, padded with nulls.
6188          JRST TYMPNL
6189         CAILE A,199.    ;DON'T TRY TO PAD MORE THAN 199 TIMES, WOULD
6190          MOVEI A,199.   ; BLOW OUT AT TYPBP1
6191         IDIVI A,5
6192         MOVNS A
6193         ADD A,TYMPA1(B) ;CREATE A BP TO A STRING WITH THE RIGHT # OF RUBOUTS.
6194         MOVEM A,TTYBYP(I)
6195         POPJ P,
6196 TYMPNL: CAILE A,399.    ;we make an exception for H19's, which need a lot of
6197          MOVEI A,399.   ;padding.
6198         IDIVI A,4       ;This works same as with rubouts, but for 9 bits
6199         MOVNS A
6200         ADD A,TYPNL1(B)
6201         MOVEM A,TTYBYP(I)
6202         POPJ P,
6203
6204 ;THIS IS AN ASCIZ STRING OF 199. RUBOUTS.
6205 ;SOME FINAL SEGMENT OF IT WILL BE TYPED OUT.
6206 TYMPA0: REPEAT 199./5,  -2
6207 TYMPA2: -400
6208
6209 TYMPA1: 010700,,TYMPA2
6210         100700,,TYMPA2
6211         170700,,TYMPA2
6212         260700,,TYMPA2
6213         350700,,TYMPA2
6214
6215 ;This is a not-quite ASCIZ string of 399. pseudo-nulls.  They are 9 bits long so
6216 ;that the typeout loop will spot the high bit and see that we're not at the end.
6217 ;This is used by things that want to be padded with nulls, like h19s.
6218 TYPNL0: REPEAT 399./4,<.BYTE 9 ? 400 ? 400 ? 400 ? 400>
6219 TYPNL2: 400400400000
6220
6221 TYPNL1: 001100,,TYPNL2
6222         111100,,TYPNL2
6223         221100,,TYPNL2
6224         331100,,TYPNL2
6225 \f
6226 ;DISPATCH TABLE FOR CURSOR CONTROL CMDS AND RUBOUT
6227         TYPSIO  ;RUBOUT DISPATCHES HERE
6228 TYPDTB: OFFSET %TDMOV-.
6229 %TDMOV::TYMOV   ;MOVE CURSOR
6230 %TDMV1::TYMOV2  ;DUMMY COMMAND CREATED BY TYMOV.
6231                 ;MAKES IT POSSIBLE FOR TYMOV TO STOP WHEN BUFFER FULL
6232                 ;AND BE REENTERED NEXT INTERRUPT.
6233 %TDEOF::TYEEOF  ;CLEAR REST OF PAGE
6234 %TDEOL::TYEEOL  ;CLEAR REST OF LINE
6235 %TDDLF::TYEDLF  ;DELETE FORWARD (FOR ERASABLE OVERPRINTING TTYS)
6236 %TDMTF::TYEMTF  ;MOTOR OFF (FOR TERMINETS)
6237 %TDMTN::TYEMTN  ;MOTOR ON (FOR TERMINETS)
6238 %TDCRL::TYECRL  ;CRLF ON DATAPOINTS, IMLACS.
6239 %TDNOP::TYEEO1  ;NO-OP FOR SUPERDUPERIMAGE MODE.
6240 %TDBS:: TYEBS   ;BACKSPACE (FOR TTY'S WITH %TORAW SET).
6241 %TDLF:: TYELF   ;LINEFEED (").
6242 %TDRCR::TYERCR  ;CARRET (").
6243 %TDORS::TYPORS  ;"OUTPUT RESET" FOR SAKE OF SOFTWARE TTYS & STYS
6244 %TDQOT::TYEQOT  ;DEVICE-DEPENDENT DATA IN NEXT BYTE.
6245 %TDFS:: TYEFS   ;FORWARD ONE SPACE
6246 %TDMV0::TYMV0   ;REPLACEMENT FOR %TDMOV
6247 %TDCLR::TYECLR  ;CLEAR THE SCREEN
6248 %TDBEL::TYEBEL  ;DING THE BELL.
6249 %TDINI::TYEINI  ;REINITIALIZE INTELLIGENT TERMINAL
6250 %TDILP::TYEILP  ;INSERT LINE POSITION, FOLLOW BY COUNT
6251 %TDDLP::TYEDLP  ;DELETE LINE POSITION, FOLLOW BY COUNT
6252 %TDICP::TYEICP  ;INSERT CHARACTER POSITION, FOLLOW BY COUNT
6253 %TDDCP::TYEDCP  ;DELETE CHARACTER POSITION, FOLLOW BY COUNT
6254 %TDBOW::TYEBOW  ;ENTER INVERSE VIDEO MODE
6255 %TDRST::TYERST  ;CLEAR ALL SPECIAL MODES (SUCH AS INVERSE VIDEO).
6256 %TDGRF::TYEEO1  ;GRAPHICS, FLUSH IT
6257 %TDRSU::TYERSU  ;REGION SCROLL UP
6258 %TDRSD::TYERSD  ;REGION SCROLL DOWN
6259         TYEEO1  ;NEXT 4 CODES ARE USED FOR SOME WEIRD FORM OF GRAPHICS OUTPUT
6260         TYEEO1  ;THAT WILL EVENTUALLY BE FLUSHED.
6261         TYEEO1
6262         TYEEO1
6263 ;FOLLOWING CODES ARE FOR LOCAL EDITING TERMINALS
6264 ;NON-SOTFWARE TERMINALS DON'T HANDLE THEM, SO IGNORE THEM.
6265 %TDSYN::TYEIG1  ;RESYNCH REPLY TO LOCAL EDITING TERMINAL.  IGNORE 1 ARG.
6266 %TDECO::TYEEO1  ;ASK TERMINAL TO TRY LOCAL EDITING BY SENDING A RESYNCH.  IGNORE.
6267 %TDEDF::TYEIG2  ;SET LOCAL EDITING TERMINAL COMMAND DEFINITION.  IGNORE 2 ARGS.
6268 %TDNLE::TYEEO1  ;STOP DOING LOCAL EDITING.  IGNORE.
6269 %TDTSP::TYEEO1  ;DISPLAYS LIKE SPACE, BUT IS PART OF A TAB.  IGNORE.  SHOULDN'T HAPPEN.
6270 %TDCTB::TYEEO1  ;THIS LINE IS CONTINUED AT THE BEGINNING.
6271 %TDCTE::TYEEO1  ;THIS LINE IS CONTINUED AT THE END.
6272 %TDMLT::TYEIG2  ;DECLARE MULTI-POSITION CHAR FOR LOCAL EDITING.  IGNORE 2 ARGS.
6273 %TDSVL::TYEIG3  ;SAVE LINE CONTENTS.  IGNORE 3 ARGS.
6274 %TDRSL::TYEIG3  ;RESTORE LINE CONTENTS.  IGNORE 3 ARGS.
6275 %TDSSR::TYEIG2  ;SET RANGE OF COLUMNS TO SAVE.  IGNORE 2 ARGS.
6276 %TDSLL::TYEIG2  ;SET LABEL FOR LOCAL LINE SAVING.  IGNORE 2 ARGS.
6277 %TDMAX::OFFSET 0
6278
6279
6280 ;IGNORE THIS COMMAND AND 3 ARGS.
6281 TYEIG3: MOVE A,TORM(I)
6282         CAILE A,TOBS-4
6283          JRST TYPEND
6284         AOS A,TORM(I)
6285         IBP Q
6286 ;IGNORE THIS COMMAND AND 2 ARGS.
6287 TYEIG2: MOVE A,TORM(I)
6288         CAILE A,TOBS-3
6289          JRST TYPEND
6290         AOS A,TORM(I)
6291         IBP Q
6292 ;IGNORE THIS COMMAND AND 1 ARG.
6293 TYEIG1: MOVE A,TORM(I)
6294         CAILE A,TOBS-2
6295          JRST TYPEND
6296         AOS A,TORM(I)
6297         IBP Q
6298         JRST TYEEO1
6299
6300 TYEQOT: MOVE A,TORM(I)
6301         CAILE A,TOBS-2
6302          JRST TYPEND
6303         CAMN Q,TOBEP(I)
6304          MOVE Q,TOBBP(I)
6305         ILDB A,Q
6306         AOS TORM(I)
6307         JRST TYPSIO
6308
6309 TYEBEL: MOVEI A,7
6310         JRST TYPSIO
6311
6312 ;%TDMOV MOVE CURSOR COMMAND DISPATCHES HERE.
6313 TYMOV:  MOVE A,TORM(I)
6314         CAILE A,TOBS-5  ;IF THE 4 ARGUMENT CHARS AREN'T IN THE BUFFER YET,
6315          JRST TYPEND    ;GO AWAY; WILL COME BACK WHEN THEY ARE OUTPUT.
6316         CAMN Q,TOBEP(I) ;FETCH THE NEXT 2 CHARS WHICH
6317          MOVE Q,TOBBP(I)        ;HOLD THE "OLD" POSITION
6318         ILDB A,Q
6319         MOVEM Q,TOOP(I)         ;FLUSH FIRST TWO CHARS (AS IF WAS %TDMV0)
6320         MOVEI C,2
6321         ADDM C,TORM(I)
6322         CAMN Q,TOBEP(I)
6323          MOVE Q,TOBBP(I)
6324         ILDB B,Q
6325         CAMGE A,TCMXV(I)
6326          MOVEM A,TTYIVP(I)      ;SET INITIAL STARTING PLACE
6327         MOVEM B,TTYIHP(I)
6328         JRST TYMV0A
6329
6330 TYMV0:  MOVE A,TORM(I)  ;MAKE SURE THE TWO ARG CHARS ARE IN THE BUFFER
6331         CAILE A,TOBS-3
6332          JRST TYPEND    ;GO AWAY; WILL COME BACK WHEN THEY ARE OUTPUT.
6333 ;DROPS THROUGH
6334 \f;DROPS IN
6335 ;%TDMOV COMMAND ON ALL TERMINALS.
6336 TYMV0A: MOVSI C,%TCPAD+%TCFPD   ;FOR DATAPOINTS, PADDING WILL BE NECESSARY NOW.
6337         ANDCAM C,TTYCOM(I)      ; ALSO, CLEAR FPD IF IT GOT LEFT ON SOMEHOW
6338         MOVEI A,%TDMV1          ;PUT A NEW COMMAND IN OUTPUT BUFFER
6339         DPB A,Q                 ; IN CASE WE FILL UP BUFFER AND HAVE TO COME BACK.
6340                                 ; IN THAT CASE WILL RETURN TO TYMOV2.
6341 ;BUFFER NOW HOLDS:
6342 ; %TDMV1 ? NEW VPOS ? NEW HPOS
6343 TYMOV2: CAMN Q,TOBEP(I)
6344          MOVE Q,TOBBP(I)        ;FETCH DESIRED POS. FROM BUFFER.
6345         ILDB D,Q
6346         CAML D,TCMXV(I)
6347          SETZ D,
6348         CAMN Q,TOBEP(I)
6349          MOVE Q,TOBBP(I)
6350         ILDB TT,Q
6351         CAIGE W,%TNMAX          ;If pointer to routine is within range,
6352          JUMPGE W,@TYMDTB(W)    ;GO TO DEVICE-DEPENDENT CURSOR POSITIONING ROUTINE
6353         BUG
6354
6355 TYMDTB: OFFSET -.
6356 %TNPRT::SETZ TYMPRT             ;PRINTING
6357 %TNDP:: TYMDP           ;DATAPOINT
6358 %TNODP::TYMDP           ;LOSING DATAPOINT
6359 %TNIML::TYMIML          ;IMLAC
6360 %TNTEK::TYMDP           ;TEKTRONIX
6361 %TNTV:: [JRST 4,.+TYMDTB]
6362 %TNMEM::SETZ TYMPRT     ;MEMOWRECK
6363 %TNSFW::[JRST 4,.+TYMDTB]
6364 %TNTRM::SETZ TYMPRT     ;TERMINET
6365 %TNESC::TYMDP           ;ASCII ESCAPE SEQUENCES TTY
6366 %TNDTM::TYMIML          ;DATAMEDIA
6367 %TNRAY::TYMDP           ;TELERAY 1061
6368 %TNHDS::TYMDP           ;HDS CONCEPT-100
6369 %TNH19::TYMH19          ;H19
6370 %TNAAA::TYMAAA          ;Ann Arbor Ambassador
6371 %TNMAX::OFFSET 0
6372
6373 ;DISPLAY TERMINALS THAT HAVE RELATIVE CURSOR POSITIONING
6374 TYMDP:  MOVE A,TTYIVP(I)        ;CURRENT HARDWARE VERTICAL POSITION
6375         SUB A,D         ;SUBTRACT VERTICAL POSITION OF WHERE WE WANT TO BE
6376         MOVMS A         ;A IS HOW FAR WE HAVE TO GO UP OR DOWN
6377         CAML TT,TCMXH(I) ;IF TRYING TO MOVE OFF RIGHT MARGIN,
6378          JRST [ MOVE TT,TCMXH(I) ;CODE JUST BELOW CAUSES INFINITE LOOP
6379                 SOJA TT,.+1 ]    ;SO PRETEND MOVING TO MARGIN
6380         MOVE B,TTYIHP(I) ;COMPUTE NET CHRS TO POSITION
6381         CAML B,TCMXH(I) ;IF WE THINK WE MOVED OFF THE END OF THE LINE,
6382          JRST [ MOVE B,TCMXH(I) ;PRESUMABLY BY PRINTING IN THE LAST COLUMN,
6383                 SUBI B,1        ;THE CURSOR ACTUALLY STUCK IN THE LAST COLUMN
6384                 MOVEM B,TTYIHP(I)
6385                 JRST .+1 ]
6386         SUB B,TT
6387         MOVM C,B        ;C IS HOW FAR WE HAVE TO GO HORIZONTALLY
6388         TRNE H,%TPPTB   ;IF TERMINAL HAS TABS
6389          JRST TYMTB1    ;USE DIFFERENT CURSOR POSITIONING ROUTINE
6390         CAMLE B,TT      ;SKIP IF NOT SHORTER TO CR FIRST
6391          MOVEI C,1(TT)  ;# CHARS IF CR FIRST.
6392         ADD A,C         ;A NOW HAS TOTAL NUMBER OF CHARS TO SEND TO GET THERE
6393         JUMPE A,TYMOV8  ;WE'RE THERE
6394         MOVE C,D
6395         ADDI C,1(TT)    ;C HAS NUMBER OF CHARS IT WOULD TAKE IF WE HOMED UP FIRST
6396         MOVE E,TCMXV(I)
6397         SUBI E,1
6398         SUB E,D         ;E HAS NUMBER IF HOME DOWN FIRST
6399         JUMPL E,TYPCPG
6400         ADD E,TT
6401         CAMGE C,A
6402          JRST TYMHU     ;HOME UP SHORTER
6403         CAMGE E,A
6404          JSP A,TYMHD    ;HOME DOWN SHORTER
6405 TYPCPG: JUMPL B,TYMDP3  ;H POS TOO SMALL, MOVE FWD
6406         JUMPG B,TYMDP6  ;MOVE BACKWARD (EITHER BS OR CR).
6407 TYMDPL: MOVE B,TTYIVP(I)
6408         SUB B,D
6409         JUMPG B,TYMDP2  ;MOVE UP IF NECESSARY
6410         JUMPL B,TYMDP1  ;OR DOWN.
6411         JRST TYMOV8     ;OR WE'RE DONE.
6412 \f
6413 TYMDP3: JSP E,TYMDPP    ;PAD IF NEC.
6414         MOVE C,[AOS TTYIHP(I)]
6415         SKIPL A,CCFS(W) ;GET FORWARD SPACE CHARACTER
6416          JRST TYMDP7    ;IS ONE CHAR
6417         HRRZS A
6418         JRST TYMVT7     ;IS TWO CHARS
6419
6420 TYMDP6: CAMG B,TT
6421          JRST TYMDP8
6422 TYMTB6: MOVEI A,15      ;BETTER TO CR FIRST
6423         CAIE W,%TNODP
6424          CLEARM TTYIHP(I)
6425         MOVEI B,1
6426         MOVSI C,(JFCL)
6427         CAIE W,%TNODP
6428          JRST TYMDP5
6429         MOVE E,TCMXV(I)
6430         SUBI E,1
6431         CAMN E,TTYIVP(I) ;ON LOSERS, AFTER CR MUST GO LF TO TURN OFF SPOW MODE.
6432          JRST TYMDP2    ;IF ON BOTTOM LINE, GO UP BEFORE CR SO CAN GO DOWN AFTER.
6433         MOVE E,TTYCOM(I)
6434         TLCN E,%TCFPD
6435          MOVEM E,TTYCOM(I)
6436         TLNE E,%TCFPD
6437          JRST TYMDP5    ;JUMP IF HAVEN'T DONE CR YET
6438         JSP E,TYMDPP    ;AFTER CR, PAD
6439         JRST TYMHU3     ;THEN GO SETZM TTYIHP(I) AND TURN OFF SPOW LATCH
6440
6441 TYMDP8: JSP E,TYMDPP
6442         MOVE C,[SOS TTYIHP(I)]
6443         MOVEI A,%DPBS   ;DATAPOINT BACK-SPACE.
6444         JRST TYMDP7
6445
6446 TYMDP1: JSP E,TYMDPP
6447         MOVEI A,%DPDN   ;DATAPOINT LINEFEED.
6448         MOVE C,[AOS TTYIVP(I)]
6449         JRST TYMDP7
6450
6451 TYMDP2: JSP E,TYMDPP
6452         MOVE C,[SOS TTYIVP(I)]
6453         SKIPL A,CCUP(W) ;GET LINE-STARVE CHARACTER
6454          JRST TYMDP5
6455         HRRZS A
6456         JRST TYMVT7     ;IT'S TWO CHARS LONG
6457
6458 TYMHU:  SKIPN CCHUP(W)  ;SKIP IF TTY CAN HOME UP
6459          JRST TYPCPG
6460         CAMLE C,E       ;HOME UP IS BETTER THAN DIRECT ROUTE.
6461          JSP A,TYMHD    ;MAYBE HOME DOWN IS EVEN BETTER
6462         CAIN W,%TNODP
6463          JRST TYMHU1
6464         CLEARM TTYIVP(I) ;NO, HOME UP IS BEST.
6465         CLEARM TTYIHP(I)
6466 TYMHU2: MOVE A,CCHUP(W)
6467         MOVEM A,TTYBYP(I)
6468         JRST TYMOVX
6469
6470 TYMHU1: MOVE E,TTYCOM(I)        ;HERE FOR HOME UP ON DISAPPOINT
6471         TLCN E,%TCFPD
6472          MOVEM E,TTYCOM(I)
6473         TLNE E,%TCFPD
6474          JRST TYMHU2            ;JUMP IF HAVEN'T HOMED UP YET
6475         MOVSI E,%TCPAD          ;DON'T PAD AFTER HOME UP
6476         IORM E,TTYCOM(I)
6477         SETZM TTYIVP(I)         ;AND TURN OFF THE SPOW LATCH
6478 TYMHU3: MOVSI E,%TCFPD          ;FIRST PART WILL HAVE BEEN DONE WHEN
6479         ANDCAM E,TTYCOM(I)      ; WE PUT OUT THE ONE CHAR TO GO DOWN ONE LINE
6480         SETZM TTYIHP(I)
6481         MOVEI B,1               ;GO DOWN ONE LINE TO RESET SPOW
6482         JRST TYMDP1
6483 \f
6484 TYMDP7: MOVMS B
6485 TYMDP5: JUMPE A,[JRST 4,.]
6486 TYMDP4: XCT C
6487         IDPB A,DBBBP
6488         SOSG DBBCC
6489          JRST TYMOVY
6490         SOJG B,TYMDP4
6491         JRST TYMOVC
6492
6493 ;CAN'T OUTPUT ANY MORE: IF REACHED DESIRED POS, FLUSH THE
6494 ;%TDMV1; OTHERWISE RETURN LEAVING IT TO COME BACK HERE WHEN
6495 ;TTY CAN ACCEPT MORE OUTPUT.
6496 TYMOVY: SOJG B,TYMOVP
6497 TYMOVX: CAMN D,TTYIVP(I)
6498         CAME TT,TTYIHP(I)
6499          POPJ P,
6500 ;WE USED UP ALL THE SPACE BUT GOT WHERE WE'RE GOING.
6501 TYMOV9: MOVEM Q,TOOP(I) ;FLUSH THE %TDMV1 COMMAND.
6502         MOVEI B,3
6503         ADDM B,TORM(I)
6504         POPJ P,
6505
6506 ;WE FINISHED ONE SET OF OUTPUT CHARS, & HAVE ROOM FOR MORE.
6507 ;EITHER CONTINUE MOVING CURSOR, OR LOOK FOR NEXT THING TO DO.
6508 TYMOVC: CAME TT,TTYIHP(I)
6509          JRST TYMDP     ;HORIZ POS STILL NEEDS CHANGING.
6510         CAME D,TTYIVP(I)
6511          JRST TYMDPL    ;VERT POS STILL NEEDS CHANGING.
6512 TYMOV8: MOVEM Q,TOOP(I) ;FLUSH THE %TDMV1 COMMAND
6513         MOVEI B,3
6514         ADDM B,TORM(I)
6515         JRST TYPLUP     ;AND GO GET NEXT THING FROM BUFFER.
6516
6517 ;COME HERE TO PAD DATAPOINT IF NECESSARY.
6518 ;CALL WITH JSP E,. CLOBBERS A, C.
6519 ;MAY JUMP AWAY TO PAD, IN WHICH CASE TYMDP WILL BE RE-ENTERED LATER.
6520 TYMDPP: MOVSI C,%TCPAD
6521         TDNE C,TTYCOM(I) ;PADDING ALREADY DONE FOR THIS COMMAND => RETURN.
6522          JRST (E)
6523         LDB A,[$TPPCR,,TTYOPT(I)]
6524         JUMPE A,(E)     ;RETURN IF THIS TTY NOT PADDED.
6525         MOVE B,A
6526         IORM C,TTYCOM(I) ;AFTER WE PAD, PADDING WON'T BE NECESSARY.
6527         MOVEI A,177
6528         MOVSI C,(JFCL)
6529         JRST TYMDP5     ;GO OUTPUT THEM.
6530
6531 TYMOVP: CAIE A,177
6532          POPJ P,
6533         JRST TYMPAD
6534
6535 ;JSP A,TYMHD IF HOME-DOWN LOOKS BEST
6536 TYMHD:  CAIE W,%TNDP
6537          JRST (A)       ;BUT HOME-DOWN ONLY WORKS ON DATAPOINTS
6538         SETZM TTYIHP(I) ;HOME DOWN IS BEST.
6539         MOVE C,TCMXV(I)
6540         SUBI C,1
6541         MOVEM C,TTYIVP(I)
6542         MOVE A,CCHDP
6543         MOVEM A,TTYBYP(I)
6544         JRST TYPLUP
6545 \f
6546 ;HERE TO SEND ONE OR MORE COPIES OF AN ESCAPE SEQUENCE.
6547 ;ESCAPED CHAR IN A. # TIMES IN B. INSN TO ADJUST TTYIVP,TTYIHP IN C.
6548 TYMVT7: MOVMS B
6549 TYMVT5: MOVE E,TTYCOM(I)        ;STOPPED IN MIDDLE OF ESC SEQ?
6550         TLZN E,%TCFPD
6551          JRST TYMVT4
6552         MOVEM E,TTYCOM(I)       ;YES, SKIP INITIAL ESC
6553         JRST TYMVT6
6554
6555 TYMVT4: MOVEI E,33
6556         IDPB E,DBBBP
6557         SOSG DBBCC              ;NO MORE ROOM =>
6558          JRST TYMVT3            ;STOPPED WITHIN ESC SEQUENCE
6559 TYMVT6: XCT C                   ;ELSE SEND THE ESCAPED CHAR
6560         IDPB A,DBBBP
6561         SOSG DBBCC
6562          JRST TYMOVY            ;NO ROOM => DISMISS
6563         SOJG B,TYMVT4           ;ELSE SEND NEXT ESC SEQ
6564         JRST TYMOVC             ;FLUSH THE %TDMOV AND RETURN
6565
6566 TYMVT3: MOVSI E,%TCFPD
6567         IORM E,TTYCOM(I)
6568         POPJ P,
6569 \f
6570 ;CURSOR POSITIONING ON A DISPLAY TTY WITH TABS
6571 TYMTB1: MOVE R,TT
6572         IDIVI R,8
6573         ADD R,TYMTBC(W)         ;COST OF TABBING TO DEST FROM LEFT MARGIN
6574         MOVE W,TCTYP(I)         ;RESTORE W, CLOBBERED BY IDIVI
6575         JUMPG B,TYMTB2          ;JUMP IF MOVING BACKWARDS
6576         JUMPE B,TYMTB3          ;JUMP IF NOT MOVING HORIZONTALLY
6577         SKIPGE CCFS(W)
6578          ADD C,C                ;MOVING FORWARDS IS SLOW ON ESCAPE-C TYPE TERMINAL
6579         MOVE E,TTYIHP(I)
6580         LSH E,-3
6581         SUBM R,E                ;COST OF TABBING FROM WHERE WE ARE NOW
6582         CAMLE C,E
6583          MOVE C,E               ;FASTER IF TABS ARE USED
6584         JRST TYMTB3             ;MOVING FORWARD, SO CR CAN'T HELP
6585
6586 TYMTB2: CAILE C,1(R)
6587          MOVEI C,1(R)           ;BETTER TO CR FIRST
6588 TYMTB3: ADD A,C                 ;TOTAL # CHARS TO BE SENT IF RELATIVE POSITIONING USED
6589         JUMPE A,TYMOV8          ;WE'RE THERE
6590         MOVE E,D
6591         ADDI E,2(R)             ;COST IF HOME-UP FIRST (ASSUMING HOME-UP IS 2 CHARS)
6592         CAMG E,A
6593          MOVE A,E               ;RELATIVE POSITIONING SHOULD START WITH HOME-UP
6594         CAILE A,4               ;COMPARE RELATIVE AND ABSOLUTE POSITIONING
6595          TRNN H,2*%TPPTB
6596           JRST TYMTB8           ;RELATIVE POSITIONING BETTER OR ONLY CHOICE
6597 ;USE ABSOLUTE POSITIONING, DROP INTO STRAIGHT ABS POS CODE.
6598 ;HERE FOR DIRECT POSITIONING ON IMLAC AND DATA MEDIA.  SEND MAGIC CHARACTER
6599 ;FOLLOWED BY HORIZONTAL AND VERTICAL POSITION, OFFSET BY SUITABLE AMOUNT
6600 ;D FOR THE VERTICAL, TT FOR THE HORIZONTAL
6601 TYMIML: MOVE Q,TOOP(I)          ;CLOBBER OVER THE 3 CHARS IN OUTPUT BUFFER
6602         CAMN Q,TOBEP(I)
6603          MOVE Q,TOBBP(I)
6604         HLRZ A,CCDPSO(W)        ;GET ABS-POSITIONING CHARACTER, IT WILL
6605         IDPB A,Q                ; BE FOLLOWED WITH VERTICAL, HORIZONTAL COORDS
6606         MOVEM D,TTYIVP(I)       ;CURSOR WILL END UP HERE
6607         MOVEM TT,TTYIHP(I)
6608         TRNE A,200000
6609          EXCH D,TT              ;SEND HORIZONTAL THEN VERTICAL
6610         HRRZ E,CCDPSO(W)        ;GET TABLE INDEX
6611         MOVE B,D                ;FIRST COORD TO SEND
6612         XCT CCDPSM(E)           ;MUNG B APPROPRIATELY
6613         ANDI B,177              ;EXTRA BITS CAUSE TROUBLE LATER
6614         CAMN Q,TOBEP(I)
6615          MOVE Q,TOBBP(I)
6616         IDPB B,Q
6617         MOVE C,B                ;SAVE
6618         MOVE B,TT               ;SECOND COORD TO SEND
6619         XCT CCDPSM(E)           ;MUNG B APPROPRIATELY
6620         ANDI B,177              ;EXTRA BITS CAUSE TROUBLE LATER
6621         CAMN Q,TOBEP(I)
6622          MOVE Q,TOBBP(I)
6623         IDPB B,Q
6624         ANDI A,177              ;DON'T LET TYPLUP THINK THESE CHARACTERS PRINT
6625         TLNN H,%TOSAI
6626          CAIL A,40
6627           SOS TTYIHP(I)
6628         TLNN H,%TOSAI
6629          CAIL B,40
6630           SOS TTYIHP(I)
6631         TLNN H,%TOSAI
6632          CAIL C,40
6633           SOS TTYIHP(I)
6634         SKIPL A,CCDPSO(W)
6635          JRST TYPLUP
6636         MOVEI A,33              ;PUT AN ESC BEFORE IT
6637         JRST TYPOU2
6638
6639 TYMTB8: CAMN E,A
6640          JRST TYMHU             ;HOME-UP FIRST
6641         JUMPL B,TYMTB4          ;JUMP IF MOVING TO THE RIGHT
6642         JUMPE B,TYMDPL          ;JUMP IF NOT MOVING HORIZONTALLY
6643         CAIE C,1(R)             ;MOVING TO THE LEFT, SKIP IF SHOULD CR FIRST
6644          JRST TYMDP8            ;NO, JUST BS
6645         JRST TYMTB6             ;GO CR
6646
6647 TYMTB4: MOVE E,TT               ;DESTINATION COLUMN
6648         TRO E,7                 ;ENSURE NO BORROW
6649         MOVEI A,1(E)            ;COLUMN TO TAB TO THEN BACKSPACE BACK
6650         CAMGE A,TCMXH(I)        ;BE SURE NOT TO TAB OFF THE RIGHT MARGIN
6651          TRNN TT,4              ;SKIP IF FASTER TO TAB PAST AND BACKSPACE BACK
6652           JRST TYMTB5           ;JUMP IF BETTER TO TAB THEN FORWARD-SPACE
6653         CAMN B,[-1]
6654          JRST TYMDP3            ;MOVING A SHORT WAY, JUST SEND A FORWARD-SPACE
6655         MOVEI B,8(E)
6656         SUB B,TTYIHP(I)
6657         LSH B,-3                ;# TABS TO GET PAST DESTINATION
6658 TYMTB7: MOVEI A,^I
6659         MOVEI E,7
6660         ANDCAM E,TTYIHP(I)      ;ALIGN TTYIHP WITH TAB STOPS
6661         MOVE C,[ADDM E,TTYIHP(I)] ;EACH TAB ADVANCES TTYIHP BY 8
6662         AOJA E,TYMDP5           ;GO TAB
6663
6664 TYMTB5: SUB E,TTYIHP(I)         ;COMPUTE # TABS TO GET JUST TO
6665         LSH E,-3                ; THE LEFT OF THE DESTINATION
6666         JUMPE E,TYMDP3          ;WE'RE CLOSE, DO FORWARD SPACES
6667         MOVE B,E                ;TAB FIRST
6668         JRST TYMTB7
6669
6670 TYMTBC: 0 ? 2 ? 4 ? 6           ;COST OF MOVING RIGHT FROM A TAB STOP
6671         1+4 ? 1+3 ? 1+2 ? 1+1   ;COST OF TABBING ONE MORE AND BACKSPACING BACK
6672 \f
6673 ;setup routine for TYMH19, TYMAAA.  Gets magnitude of horizontal and vertical
6674 ;motion in B and A, destinations in TT and D respectively, sets TTYIHP and
6675 ;TTYIVP.
6676 TYMPOS: MOVE A,TTYIVP(I)        ;current hardware vertical position
6677         SUBM D,A                ;subtract from vertical destination
6678         CAML TT,TCMXH(I)        ;if trying to move off right margin,
6679          JRST [ MOVE TT,TCMXH(I)        ;pretend moving to margin
6680                 SOJA TT,.+1 ]
6681         MOVE B,TTYIHP(I)        ;compute net chrs to position
6682         CAML B,TCMXH(I) ;if we think we moved off the end of the line,
6683          JRST [ MOVE B,TCMXH(I) ;presumably by printing in the last column,
6684                 SUBI B,1        ;the cursor actually stuck in the last column
6685                 MOVEM B,TTYIHP(I)
6686                 JRST .+1 ]
6687         SUBM TT,B       ;now we have horizontal motion in B
6688         MOVEM D,TTYIVP(I)       ;put vertical, horizontal destination
6689         MOVEM TT,TTYIHP(I)      ;into registers (we'll be there soon).
6690         POPJ P,
6691
6692 ;cursor positioning on an H19.  TYMDP occasionally stuffs rubouts into the
6693 ;buffer to do its own padding, thereby resulting in ^S ^Q lossage on H19s.  I
6694 ;could patch TYMDP up, but it's too silly.  Generates HCUF, HCUB, HCUD, HCUU,
6695 ;or HDCA.
6696 TYMH19: PUSHJ P,TYMPOS          ;get horizontal and vertical destinations, etc.
6697         MOVEI C,2       ;now flush the first two chars of cursor
6698         ADDM C,TORM(I)  ;motion command (TYEEO2 will flush last)
6699         MOVE C,TOCMBF(I)        ;get byte pointer to tty command buffer in C
6700         MOVEI E,33
6701         IDPB E,C                ;send esc
6702         JUMPE A,TYMHOX          ;if vertical magnitude 0, only moving in X
6703         JUMPE B,TYMHOY          ;same for horizontal and Y
6704 TYMABS: MOVEI E,"Y              ;neither is 0, abs. positioning faster
6705         IDPB E,C
6706         ADDI D,40               ;convert line # to H19 coord system.
6707         IDPB D,C
6708         ADDI TT,40              ;convert column # to H19 coord system
6709         IDPB TT,C
6710 TYMHDN: MOVEI E,0               ;top it off with a null
6711         IDPB E,C
6712         MOVE A,TOCMBF(I)        ;TYEEO2 wants bp in A
6713         JRST TYEEO2             ;noone seems to think it's necessary to pad
6714
6715 TYMHOX: CAIN B,1                ;if 1 or -1, then relative positioning is
6716          JRST TYMHX2            ;plenty fast
6717         CAIN B,-1
6718          JRST TYMHX3
6719         JRST TYMABS             ;otherwise absolute positioning is faster
6720 TYMHX2: MOVEI E,"C              ;moving forward one space
6721         IDPB E,C
6722         JRST TYMHDN
6723 TYMHX3: MOVEI E,"D              ;moving backwards one space
6724         IDPB E,C
6725         JRST TYMHDN
6726
6727 TYMHOY: CAIN A,1                ;if 1 or -1, then relative positioning is
6728          JRST TYMHY2            ;plenty fast
6729         CAIN A,-1
6730          JRST TYMHY3
6731         JRST TYMABS             ;otherwise absolute positioning is faster
6732 TYMHY2: MOVEI E,"B              ;moving down one line
6733         IDPB E,C
6734         JRST TYMHDN
6735 TYMHY3: MOVEI E,"A              ;moving up one line
6736         IDPB E,C
6737         JRST TYMHDN
6738
6739 ;cursor positioning on an AAA.  Generates either CUP, HPA, or VPA,
6740 ;whichever involves fewest chars.
6741 TYMAAA: PUSHJ P,TYMPOS          ;get X-Y motion and set dests.
6742         MOVEI C,2       ;now flush the first two chars of cursor
6743         ADDM C,TORM(I)  ;motion command (TYEEO2 will flush last)
6744         MOVE C,TOCMBF(I)        ;get byte pointer to tty command buffer in C
6745         MOVEI E,33
6746         IDPB E,C        ;send esc
6747         MOVEI E,"[      ;[
6748         IDPB E,C
6749         JUMPE B,TYMAVT  ;going vertically only
6750         JUMPE A,TYMAHZ  ;horizontally only
6751         JUMPE D,TYMAP3  ;if going to top line, optimize out 1st coord
6752         MOVE E,D
6753         PUSHJ P,SNDNUM  ;send vertical coord
6754         JUMPE TT,TYMAP5 ;if moving to leftmost col no second coord
6755 TYMAP3: MOVEI A,73      ;or semicolon
6756         IDPB A,C
6757         MOVE E,TT
6758         PUSHJ P,SNDNUM  ;send horizontal coord
6759 TYMAP5: MOVEI A,"H      ;absolute positioning char
6760         JRST TYMADN
6761 ;going vertically only, use vertical absolute positioning
6762 TYMAVT: MOVE E,D
6763         PUSHJ P,SNDNUM
6764         MOVEI A,"d      ;vertical absolute positioning char
6765         JRST TYMADN
6766 ;going horizontally only, horizontal absolute positioning
6767 TYMAHZ: MOVE E,TT
6768         PUSHJ P,SNDNUM
6769         MOVEI A,"`      ;horizontal absolute positioning char
6770 ;fall through into done code
6771
6772 TYMADN: IDPB A,C            ;send that last char
6773         MOVEI A,4           ;padding is A*TT in ms
6774         MOVEI TT,1          ;4 ms of padding ought to be enough
6775         JRST TYDAPD         ;go set it up
6776
6777 ;Add one to the number in E, convert it to ASCII decimal, and idpb it
6778 ;in the location pointed to by the bp in C.  Assumes no more than 2
6779 ;digits in E.  Bashes A, B, E (B because of the IDIVI).
6780 SNDNUM: AOS E           ;bump
6781         MOVE A,E
6782         IDIVI A,10.     ;divide by 10 for high digit
6783         JUMPE A,SNDNM2  ;only one digit
6784         ADDI A,"0       ;make high digit ascii
6785         IDPB A,C        ;put in buffer
6786         SUBI A,"0       ;un-ascii high digit
6787         IMULI A,10.     ;find out what we printed
6788         SUB E,A         ;take it from what we had to get low digit
6789 SNDNM2: ADDI E,"0       ;make low digit ascii
6790         IDPB E,C        ;put in buffer
6791         POPJ P,
6792 \f
6793 TYEBS:  SOSGE TTYIHP(I) ;%TDBS: OUTPUT BS.
6794          SETZM TTYIHP(I)
6795         MOVEI A,^H
6796         JRST TYPSIO
6797
6798 TYERCR: MOVE D,TTYIVP(I)        ;%TDRCR: OUTPUT A CR (PLUS PADDING)
6799         SETZ TT,
6800         SKIPN TTYIHP(I)
6801          AOS TTYIHP(I)
6802 TYERC1: SOS TORM(I)     .SEE TYMOVX ;WHICH WILL ADD 3 TO TORM.
6803         SOS TORM(I)
6804         JRST TYMPRR
6805
6806 TYELF:  MOVE TT,TTYIHP(I)       ;%TDLF: OUTPUT LF (PLUS PADDING)
6807         MOVE D,TTYIVP(I)
6808         AOS D
6809         CAIG D,118.
6810          CAML D,TCMXV(I)
6811           JRST TYELFE           ;DETECT A LF THAT SCROLLS.
6812         JRST TYERC1
6813
6814 TYELFE: SKIPN TTYROL(I)         ;IF NOT A SCROLLING TTY, RESET VPOS TO 0
6815          TDZA D,D
6816           SUB D,TTYROL(I)       ;OTHERWISE, GLITCH UP
6817         MOVEM D,TTYIVP(I)       ;STORE VPOS AFTER SCROLLING.
6818         SOS TTYIVP(I)           ;MAKE SURE 1 LF IS OUTPUT.
6819         JRST TYERC1
6820
6821 TYEFS:  CAIN W,%TNAAA           ;AAA's use a different format
6822          JRST TYFSAA
6823         MOVSI E,%TCFPD          ;ON SOME TTYS, IS TWO PARTS
6824         TDNE E,TTYCOM(I)
6825          JRST TYEFS2            ;FIRST PART DONE, DO SECOND
6826         IORM E,TTYCOM(I)        ;ABOUT TO DO FIRST PART
6827         CAIE W,%TNDP            ;DATAPOINTS NEED PADDING
6828          CAIN W,%TNODP
6829           JRST TYEFSD           ;SO GO DO IT
6830         MOVEI A,33              ;VT52S ETC. NEED ALTMODE PREFIX
6831         SKIPGE CCFS(W)
6832          JRST TYPOU2            ;SO GO DO THAT
6833 TYEFS2: ANDCAM E,TTYCOM(I)      ;ABOUT TO DO SECOND PART
6834         HRRZ A,CCFS(W)          ;GET CHARACTER TO SEND
6835         AOS TTYIHP(I)           ;IT WILL MOVE THE CURSOR
6836         JRST TYPSIO             ;SEND IT, AND ABSORB THE %TDFS
6837
6838 TYEFSD: LDB B,[$TPPCR,,TTYOPT(I)]
6839         PUSHJ P,TYMPAD          ;SET UP TTYBYP TO PAD
6840         JRST TYPLUP             ;PAD THEN COME BACK HERE
6841
6842 ;handle forward-space on AAA's
6843 TYFSAA: MOVE A,CCFS(W)
6844         JRST TYEEO2
6845 \f
6846 ;HANDLE CLEAR-EOL:
6847 TYEEOL: SKIPA A,CCEOLP(W)
6848
6849 ;HANDLE CLEAR-EOF
6850 TYEEOF:  MOVE A,CCEOFP(W)
6851 TYEEO2: CAILE A,0
6852          PUSHJ P,TYEEO3         ;JUMP IF OUTPUT SEQ IS mn,,TABLE
6853 TYEEO4: MOVEM A,TTYBYP(I)       ;STORE BYTE POINTER OR ZERO
6854 TYEEO1: AOS TORM(I)             ;FLUSH THE CURSOR CTL CMD FROM OUTPUT BFR.
6855         MOVEM Q,TOOP(I)
6856         JRST TYPLUP
6857
6858 ;OUTPUT SEQUENCE SPECIFIED AS mn,,TABLE
6859 ;m=LOWEST PAD CODE IN TABLE, n=HIGHEST
6860 TYEEO3: LDB B,[$TPPCR,,TTYOPT(I)]
6861         LDB C,[220300,,A]       ;n
6862         CAMLE B,C
6863          MOVE B,C
6864         LDB C,[250300,,A]       ;m
6865         SUB B,C
6866         SKIPLE B
6867          ADD A,B
6868         MOVE A,(A)      ;PICK UP BYTE POINTER OUT OF TABLE
6869         POPJ P,
6870
6871 ;HANDLE CLEAR THE SCREEN
6872 TYECLR: SETZM TTYIHP(I) ;AFTER CLEARING, CURSOR WILL BE AT TOP LEFT
6873         SETZM TTYIVP(I)
6874         SKIPA A,CCCLRP(W)
6875 ;HANDLE DELETE FWD, ON OVERPRINTING ERASABLE DISPLAYS, AND IMLACS (ACC TO %TOIML).
6876 TYEDLF:  MOVE A,CCDLFP(W)
6877         JRST TYEEO2
6878
6879 ;HANDLE ENTER-INVERSE-VIDEO AND LEAVE-ALL-SUCH-MODES
6880 TYEBOW: SKIPA A,CCBOWP(W)
6881 TYERST:  MOVE A,CCRSTP(W)
6882         JRST TYEEO2
6883
6884 TYEINI: MOVE A,CCINIP(W)
6885         JRST TYEEO2
6886
6887 ;REGION-SCROLL UP AND REGION-SCROLL DOWN HANDLED ONLY ON DM2500
6888 ;FOR NOW.  REAL DM2500'S CAN'T DO IT, BUT CERTAIN FAKE ONES CAN.
6889 ;SOMEDAY HAIRY CODE COULD BE ADDED TO DO IT ON C100 AND VT100.
6890 TYERSU:
6891 TYERSD: SUBI A,%TDRSU-^U        ;SEND ^U OR ^V
6892 ;       CAIE W,%TNDTM
6893 ;        JRST TYEEO1
6894         MOVE B,TORM(I)          ;MAKE SURE ARGS IN BUFFER
6895         CAILE B,TOBS-3
6896          JRST TYPEND            ;NO, COME BACK LATER
6897         DPB A,Q
6898         CAMN Q,TOBEP(I)
6899          MOVE Q,TOBBP(I)
6900         ILDB A,Q                ;XOR 140 INTO ARGS
6901         XORI A,140
6902         DPB A,Q
6903         CAMN Q,TOBEP(I)
6904          MOVE Q,TOBBP(I)
6905         ILDB A,Q
6906         XORI A,140
6907         DPB A,Q
6908         MOVNI A,2               ;COMPENSATE FOR "PRINTING" CHARS
6909         ADDM A,TTYIHP(I)
6910         JRST TYPLUP
6911
6912 ;HANDLE DELETE AND INSERT CHARACTERS AND LINES
6913 ;DOESN'T TRY TO BE TOTALLY HAIRY ABOUT MULTIPLE INSERT/DELETES.
6914 TYEILP: SKIPA A,CCILPP(W)
6915 TYEDLP:  MOVE A,CCDLPP(W)
6916         JRST TYEIL1
6917
6918 ;if we're on an H19 we don't want to call TYDH19 from TYEICP, because
6919 ;no multiple insert char.
6920 TYEICP: MOVE A,CCICPP(W)
6921         CAIE W,%TNH19   ;if we're on an H19, no multiple insert char
6922          JRST TYEIL1    ;so hack locally, else go to main routine
6923         MOVE B,TORM(I)  ;MAKE SURE REPEAT-COUNT ARGUMENT IS IN THE BUFFER
6924         CAILE B,TOBS-2
6925          JRST TYPEND    ;if it's not, come back when it is
6926         CAMN Q,TOBEP(I)
6927          MOVE Q,TOBBP(I)
6928         ILDB B,Q        ;GET IT
6929         JRST TYEIL2
6930 TYEDCP: MOVE A,CCDCPP(W)
6931 TYEIL1: MOVE B,TORM(I)  ;MAKE SURE REPEAT-COUNT ARGUMENT IS IN THE BUFFER
6932         CAILE B,TOBS-2
6933          JRST TYPEND    ;IT'S NOT, COME BACK WHEN IT IS
6934         CAMN Q,TOBEP(I)
6935          MOVE Q,TOBBP(I)
6936         ILDB B,Q        ;GET IT
6937         CAIN W,%TNAAA   ;AAA's have a better way of doing this
6938          JRST TYIDAA
6939         CAIN W,%TNH19   ;so do H19's
6940          JRST TYDH19
6941 TYEIL2: SOJG B,[DPB B,Q ;NOT LAST TIME, LEAVE DECREMENTED REQUEST IN BUFFER
6942                 CAILE A,0
6943                  PUSHJ P,TYEEO3
6944                 MOVEM A,TTYBYP(I)       ;AND DO ONCE
6945                 JRST TYPLUP]
6946         AOS TORM(I)     ;OTHERWISE, REMOVE FROM BUFFER
6947         JRST TYEEO2     ;AND GO DO
6948
6949 ;Handle insert/delete line, delete char on an H19, without weenie
6950 ;weenie.  Actually enters ANSI mode for multiple insert/deletes.
6951 TYDH19: CAIG B,6                ;if we're doing < 6, non-hairy way is faster.
6952          JRST [ MOVE A,1(A)     ;format of table is
6953                 JRST TYEIL2 ]   ; [ansicommand ? zdscommand]
6954         MOVE A,@A               ;get the command char
6955         AOS TORM(I)             ;flush the arg
6956         MOVE C,TOCMBF(I)        ;pointer to comand buffer
6957         MOVEI E,33              ;send esc and
6958         IDPB E,C
6959         MOVEI E,"<              ;< to enter ANSI mode
6960         IDPB E,C
6961         PUSHJ P,TYIDA2          ;send the command and set TT to arg
6962         MOVEI A,19.             ;19 ms padding per operation.
6963         MOVE D,H19ZDS           ;copy command to enter ZDS mode
6964          ILDB E,D               ;into buffer
6965          JUMPE E,TYDAPD         ;when done, go do padding
6966          IDPB E,C
6967          JRST .-3
6968
6969 H19ZDS: 440700,,[ASCIZ /\e[?2h/] ;command to enter ZDS mode
6970
6971 ;Handle insert/delete chars/lines on an AAA. This code avoids the
6972 ;"weenie weenie" syndrome, where lines get deleted one at a time
6973 ;(weenie weenie), and then get inserted one at a time (weenie weenie).
6974 TYIDAA: AOS TORM(I)             ;flush arg from buffer
6975         MOVE C,TOCMBF(I)        ;get pointer to command buffer
6976         PUSHJ P,TYIDA2          ;send command and set TT to arg
6977         MOVEI A,4               ;4 ms padding per operation
6978         JRST TYDAPD             ;send the padding
6979
6980 TYIDA2: MOVEI E,33              ;send esc
6981         IDPB E,C
6982         MOVEI E,"[              ;send [
6983         IDPB E,C
6984         MOVE E,B                ;SNDNUM takes arg in E
6985         MOVE D,A                ;and bashes A
6986         MOVE TT,B               ;and B - so save 'em
6987         SOS E                   ;SNDNUM also adds 1 to its arg.
6988         PUSHJ P,SNDNUM          ;send arg
6989         IDPB D,C                ;send command char, which is now in D
6990         POPJ P,
6991
6992 ;TYDAPD sets up the end of TOCMBF to include a null and the amount of
6993 ;padding needed, and then jumps to TYEEO2.  TT contains a number that
6994 ;is multiplied by the contents of A to get the number of ms of padding
6995 ;desired.  TT usually has the number of inserts or deletes in it, and
6996 ;A usually has the pad factor.
6997 TYDAPD: MOVEI D,0               ;put a null at end
6998         IDPB D,C                ;now do padding - set up for TYEEO2
6999         HLRZ D,C                ;did we just deposit in the lowest
7000         CAIN D,010700           ;byte in this word?
7001          JRST [ HRRZ D,C        ;yes, put a 1 in the next
7002                 AOS D
7003                 MOVEI E,1
7004                 MOVEM E,@D
7005                 JRST .+2 ]
7006         JRST [ HRRZ D,C         ;turn on the low bit in this one
7007                MOVEI E,1
7008                IORM E,@D
7009                JRST .+1 ]
7010         AOS D
7011         IMUL TT,A               ;ms padding = TT * A
7012         MOVEM TT,@D             ;TT usually has arg to command
7013         MOVE A,TOCMBF(I)        ;pointer to beginning of buffer
7014         JRST TYEEO2             ;goes in A, where TYEEO2 wants it
7015 \f
7016 ;HANDLE TURN-ON-MOTOR COMMAND.
7017 TYEMTN: CAIE W,%TNTRM
7018          JRST TYEEO1    ;NO-OP EXCEPT ON TERMINETS
7019         LDB B,[$TPPLF,,TTYOPT(I)]
7020         JUMPE B,TYEEO1  ;PADDING CODE 0 => DON'T HACK THE MOTOR.
7021         HRRZ A,TYMTVT(B)
7022         LSH A,1
7023         IDIVI A,5
7024         MOVNS A
7025         ADD A,TYEMT1(B) ;CREATE A BP TO A STRING WITH THE RIGHT # OF RUBOUTS.
7026         JRST TYEEO4
7027
7028 ;THIS IS AN ASCIZ STRING OF 90. RUBOUTS.
7029 ;SOME FINAL SEGMENT OF IT WILL BE TYPED OUT.
7030 TYEMT0: REPEAT 90./5,  -2
7031 TYEMT2: ASCIZ /\eH/
7032
7033 TYEMT1: 010700,,TYEMT2-1
7034         100700,,TYEMT2-1
7035         170700,,TYEMT2-1
7036         260700,,TYEMT2-1
7037         350700,,TYEMT2-1
7038
7039 ;HANDLE TURN-MOTOR-OFF COMMAND.
7040 TYEMTF: CAIE W,%TNTRM
7041          JRST TYEEO1
7042         LDB B,[$TPPLF,,TTYOPT(I)]
7043         JUMPE B,TYEEO1
7044         MOVE A,[440700,,[ASCIZ/\eJ/]]
7045         JRST TYEEO2
7046
7047 ;CRLF AND CLEAR EOL.
7048 TYECRL: SETZM TTYIHP(I)
7049         AOS B,TTYIVP(I)
7050         MOVN A,TTYROL(I)
7051         CAML B,TCMXV(I)
7052          ADDM A,TTYIVP(I)
7053         MOVE A,CCROLP(W)        ;HOW TO SCROLL THIS KIND OF TTY?
7054         JRST TYEEO2
7055 \f
7056 SUBTTL TABLES OF CURSOR-CONTROL SEQUENCES
7057
7058 ;Note that a table entry can be (for those tables which are strings):
7059 ;       mn,,TABLE - m is lowest pad code in table, n is highest
7060 ;                   These pad codes from the $TPPCR.  The appropriate
7061 ;                   table entry is selected, indexed by pad code.
7062 ;                   The table entry should look like 440700,,string.
7063 ;       440700,,string - the string is output.  If the low-order
7064 ;                   bit of the last word in the string is set, the
7065 ;                   following word contains the number of milliseconds
7066 ;                   of padding required.  (max is 200 ms at 9600 baud,
7067 ;                   see TYMPAD), or if this word is SETZ, a special kludge
7068 ;                   for Tektronix screen-clear is invoked.
7069 ;                   A negative number is the number of 1/8 msec of padding
7070 ;                   per line below the cursor.  Note carefully that is in
7071 ;                   1/8 msec units!
7072 ;       0 - output nothing
7073 ;
7074 ; (for those tables which are characters):
7075 ;       "ch - output the character
7076 ;       SETZ "ch - output esc (033) followed by the character
7077
7078 ;DATAPOINT CURSOR CONTROL CHARACTERS
7079 %DPFS==30       ;30 => FORWARD SPACE
7080                 ;31 => (NON-EXISTANT)
7081 %DPUP==32       ;32 => MOVE UP
7082                 ;33 => (NON-EXISTANT)
7083 %DPHD==34       ;34 => HOME DOWN (DOESN'T WORK ON OLD DATAPOINTS ABOVE 300 BAUD)
7084 %DPHU==35       ;35 => HOME UP
7085                 ;36 => CLEAR EOL
7086                 ;37 => CLEAR EOF
7087 %DPBS==10       ;BACKSPACE
7088 %DPDN==12       ;LINEFEED.
7089
7090 CCDPSO: 0       ;PRT    ;LH DIRECT POSITIONING CHAR, RH INDEX INTO CCDPSM
7091         0       ;DPT    ;4.9 ESC BEFORE CHAR, 4.8 HORIZONTAL THEN VERTICAL
7092         0               ;LSR
7093         200016,,0       ;IMLAC
7094         0               ;TEK
7095         0               ;TV
7096         0               ;MEM
7097         0               ;SFW
7098         0               ;TRM
7099         400131,,2       ;ESC
7100         200014,,1       ;DTM
7101         400131,,2       ;RAY
7102         400141,,2       ;HDS
7103         0               ;H19's have their own routine
7104         0               ;AAA's have their own routine
7105 IFN .-CCDPSO-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCDPSO
7106
7107 ;INSTRUCTION TO MUNG B TO CONVERT TO TERMINAL'S COORDINATE SYSTEM
7108 CCDPSM: ADDI B,1        ;IMLAC
7109         XORI B,140      ;DATAMEDIA
7110         ADDI B,40       ;VT52, TELERAY, CONCEPT-100, ETC.
7111
7112 CCFS:   40      ;FORWARD-SPACE CHARACTER, 4.9 => IT NEEDS AN ESC IN FRONT OF IT
7113         %DPFS   ;DPT
7114         %DPFS   ;LSR
7115         ^Y      ;IMLAC
7116         40      ;TEK
7117         0       ;TV
7118         40      ;MEM
7119         0       ;SFW
7120         40      ;TRM
7121         SETZ "C ;ESC
7122         34      ;DTM
7123         SETZ "C ;RAY
7124         SETZ "= ;HDS
7125         SETZ "C ;H19
7126 ;the AAA entry looks strange here, but it's the right thing. TYEFS
7127 ;checks for AAA's specially, and AAA's don't use TYMDP.
7128         440700,,[.BYTE 7 ? 33 ? "[ ? "C ]       ;AAA
7129 IFN .-CCFS-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCFS
7130
7131 CCUP:   0       ;LINE-STARVE CHARACTER, - => IT NEEDS AN ESC IN FRONT OF IT
7132         %DPUP   ;DPT
7133         %DPUP   ;LSR
7134         0       ;IMLAC
7135         13      ;TEK
7136         0       ;TV
7137         0       ;MEM
7138         0       ;SFW
7139         0       ;TRM
7140         SETZ "A ;ESC
7141         32      ;DTM
7142         SETZ "A ;RAY
7143         SETZ "; ;HDS
7144         SETZ "A ;H19
7145         0       ;AAA
7146 ;this entry isn't here because this is a stupid word table instead
7147 ;of a winning string table.
7148 ;       440700,,[.BYTE 7 ? 33 ? "[ ? "A ]       ;AAA
7149 IFN .-CCUP-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCUP
7150
7151 CCHUP:  0       ;HOME-UP SEQUENCE POINTER
7152         440700,,[.BYTE 7 ? %DPHU]       ;DPT
7153         440700,,[.BYTE 7 ? %DPHU ? %DPHU ? %DPHU]       ;LSR
7154         0       ;IMLAC
7155         0       ;TEK
7156         0       ;TV
7157         0       ;MEM
7158         0       ;SFW
7159         0       ;TRM
7160         440700,,[.BYTE 7 ? 33 ? "H] ;ESC
7161         440700,,[.BYTE 7 ? 2]   ;DTM
7162         440700,,[.BYTE 7 ? 33 ? "H] ;RAY
7163         440700,,[.BYTE 7 ? 33 ? "?] ;HDS
7164         440700,,[.BYTE 7 ? 33 ? "H] ;H19
7165         440700,,[.BYTE 7 ? 33 ? "[ ? "H]        ;AAA
7166 IFN .-CCHUP-%TNMAX, .ERR SOME TCTYP SETTING LACKS CCHUP
7167
7168 CCHDP:  440700,,CCHD
7169 CCHD:   34_29.+177_22.+177_15.+177_8
7170 \f
7171 CCEOLP: 0       ;PRT
7172         440700,,[.BYTE 7 ? 36 ? 177 ? 177 ? 177]        ;DPT
7173         440700,,[.BYTE 7 ? 36 ? 36 ? 36 ? 36]   ;LSR
7174         440700,,[.BYTE 7 ? ^Q]  ;IMLAC
7175         0       ;TEK
7176         0       ;TV
7177         0       ;MEM
7178         0       ;SFW
7179         0       ;TRM
7180         440700,,[.BYTE 7 ? 33 ? "K]     ;ESC
7181         440700,,[.BYTE 7 ? 27]  ;DTM
7182         440700,,[.BYTE 7 ? 33 ? "K] ;RAY
7183         01,,[ 440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 8.]      ;HDS 300/1200
7184               440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 16.] ]   ;HDS 9600
7185         440700,,[.BYTE 7 ? 33 ? "K]     ;H19
7186         440700,,[.BYTE 7 ? 33 ? "[ ? "K]        ;AAA
7187 IFN .-CCEOLP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDEOL
7188
7189 CCEOFP: 0       ;PRT
7190         440700,,[.BYTE 7 ? 37 ? 177 ? 177 ? 177]        ;DPT
7191         440700,,[.BYTE 7 ? 37 ? 37 ? 37 ? 37 ? 37 ? 0]  ;LSR
7192         440700,,[.BYTE 7 ? ^P]  ;IMLAC
7193         0       ;TEK
7194         0       ;TV
7195         0       ;MEM
7196         0       ;SFW
7197         0       ;TRM
7198         440700,,[.BYTE 7 ? 33 ? "J]     ;ESC
7199         440700,,[.BYTE 7 ? 27]  ;DTM (CAN'T CLEAR TO EOF, SO CLEAR TO EOL)
7200         440700,,[<.BYTE 7 ? 33 ? "J>+1 ? 90.]   ;RAY
7201                 ;HDS PAD CODES ARE 0 1200 OR LESS, 1 9600 OR MORE
7202                 ; AT 9600 OR ABOVE, USE ERASE EOL INSTEAD OF ERASE EOS
7203         01,,[   ; DUE TO INABILITY TO SEND 340 (!!) MILLISECONDS OF PADDING
7204             440700,,[<.BYTE 7 ? 33 ? 3>+1 ? 170.] ;HDS 300/1200
7205             440700,,[<.BYTE 7 ? 33 ? 23>+1 ? 16.] ] ;HDS 9600
7206         440700,,[.BYTE 7 ? 33 ? "J]     ;H19
7207         440700,,[<.BYTE 7 ? 33 ? "[ ? "J>+1 ? 5.]       ;AAA 5 ms padding
7208 IFN .-CCEOFP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDEOF
7209
7210 CCDLFP: 0       ;PRT
7211         440700,,[.BYTE 7 ? 31]  ;(DPT) FOR BENEFIT OF GT40
7212         0       ;LSR
7213         440700,,[.BYTE 7 ? ^X]  ;IMLAC
7214         0       ;TEK
7215         0       ;TV
7216         0       ;MEM
7217         0       ;SFW
7218         0       ;TRM
7219         0       ;ESC
7220         0       ;DTM
7221         0       ;RAY
7222         0       ;HDS
7223         0       ;H19
7224         0       ;AAA
7225 IFN .-CCDLFP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDDLF
7226
7227 CCROLP: 0       ;PRT
7228         25,,CCCRLP      ;DPT
7229         25,,CCCRL1      ;LSR
7230         440700,,[.BYTE 7 ? ^M ? ^K ? ^Q]        ;IMLAC
7231         0       ;TEK
7232         0       ;TV
7233         0       ;MEM
7234         0       ;SFW
7235         0       ;TRM
7236         440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K]   ;ESC
7237         440700,,[.BYTE 7 ? ^M ? ^J ? 27]        ;DTM
7238                         ;NOTE: REAL DATAMEDIAS IGNORE THE ^J BUT IMITATION ONES MIGHT NOT
7239         440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K]   ;RAY
7240         440700,,[<.BYTE 7 ? ^M ? ^J ? 33 ? 23>+1 ? 16.] ;HDS
7241         440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "K]   ;H19
7242         440700,,[.BYTE 7 ? ^M ? ^J ? 33 ? "[ ? "K ? 0]  ;AAA
7243 IFN .-CCROLP-%TNMAX,.ERR SOME TCTYP SETTING LACKS %TDCRL
7244
7245 ;CRLF ON DATAPOINTS, DEPENDING ON LOSER-NESS AND SPEED.
7246 CCCRLP: 440700,,[.BYTE 7 ? ^M ? ^J ? 36]
7247         440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 36]
7248 REPEAT 2,440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 177 ? 36]
7249
7250 CCCRL1: 440700,,[.BYTE 7 ? ^M ? ^J ? 36 ? 36 ? 36 ? 36]
7251         440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 36 ? 36 ? 36 ? 36]
7252 REPEAT 2,440700,,[.BYTE 7 ? ^M ? ^J ? 177 ? 177 ? 177 ? 177 ? 36 ? 36 ? 36 ? 36 ? 0]
7253
7254 CCCLRP: 0               ;CLEAR THE SCREEN SEQUENCE POINTER
7255         440700,,[.BYTE 7 ? %DPHU ? 37 ? 177 ? 177 ? 177 ? 0]    ;DPT
7256         440700,,[.BYTE 7 ? %DPHU ? %DPHU ? %DPHU ? 37 ? 37 ? 37 ? 37 ? 37 ? 0]  ;LSR
7257         440700,,[.BYTE 7 ? ^L]  ;IMLAC
7258         440700,,[<.BYTE 7 ? 33 ? 14>+1 ? SETZ] .SEE TYPBP       ;TEKTRONIX
7259         0       ;TV
7260         0       ;MEM
7261         0       ;SFW
7262         0       ;TRM
7263         440700,,[.BYTE 7 ? 33 ? "H ? 33 ? "J ? 0]       ;ESC
7264         34,,[440700,,[.BYTE 7 ? 36]     ;DTM
7265              440700,,[.BYTE 7 ? 36 ? 36]]
7266         440700,,[<.BYTE 7 ? 33 ? "j>+1 ? 90.]   ;RAY
7267         440700,,[<.BYTE 7 ? 14>+1 ? 48.] ;HDS (RIGHT FOR 9600 BAUD, NEED HALF AS MUCH AT 300)
7268         440700,,[.BYTE 7 ? 33 ? "H ? 33 ? "J ? 0]       ;H19
7269         440700,,[<.BYTE 7 ? 33 ? "[ ? "H ? 33 ? "[ >
7270                  <.BYTE 7 ? "J>+1 ? 5.]         ;AAA needs 5 ms padding
7271
7272 IFN .-CCCLRP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDCLR
7273 \f
7274 CCILPP: 0       ;PRT
7275         0       ;DPT
7276         0       ;LSR
7277         0       ;IML
7278         0       ;TEK
7279         0       ;TV
7280         0       ;MEM
7281         0       ;SFW
7282         0       ;TRM
7283         01,,[   ;ESC padding mainly based on H19 - CBF
7284             440700,,[<.BYTE 7 ? 33 ? "L>]       ; no padding at all at 1200 baud
7285             440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -6.]]      ; .75 ms/line at higher
7286         04,,[440700,,[.BYTE 7 ? ^P ? ^J ? ^X ? 0]       ;DTM
7287              440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 3,[177 ? ] ^X ? 0]
7288              440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 5,[177 ? ] ? ^X ? 0]
7289              440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 10.,[177 ? ] ^X ? 0]
7290              440700,,[.BYTE 7 ? ^P ? ^J ? REPEAT 20.,[177 ? ] ^X ? 0]]
7291         440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -20.]  ;RAY (2.5ms/line)
7292         01,,[
7293             440700,,[<.BYTE 7 ? 33 ? ^R>+1 ? -14.]      ;HDS AT 300/1200 (1.75ms/line)
7294             440700,,[<.byte 7 ? 33 ? ^R>+1 ? -3.*8]]    ;HDS AT 9600 (3ms/line)
7295         ["L ? 01,,[                     ;H19's use this table differently
7296                     440700,,[<.BYTE 7 ? 33 ? "L>]       ; no padding at all at 1200 baud
7297                     440700,,[<.BYTE 7 ? 33 ? "L>+1 ? -6.]]]     ; .75 ms/line at higher
7298         "L                      ;AAA (AAA's use this table differently)
7299
7300 IFN .-CCILPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDILP
7301
7302 CCDLPP: 0       ;PRT
7303         0       ;DPT
7304         0       ;LSR
7305         0       ;IML
7306         0       ;TEK
7307         0       ;TV
7308         0       ;MEM
7309         0       ;SFW
7310         0       ;TRM
7311         01,,[   ;ESC padding mainly based on H19 - CBF
7312             440700,,[<.BYTE 7 ? 33 ? "M>]       ; no padding at all at 1200 baud
7313             440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -6.]]      ; .75 ms/line at higher
7314         34,,[440700,,[.BYTE 7 ? ^P ? ^Z ? ^X]   ;DTM
7315              440700,,[.BYTE 7 ? ^P ? ^Z ? 177 ? ^X]]
7316         440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -20.]  ;RAY (2.5ms/line)
7317         01,,[
7318             440700,,[<.BYTE 7 ? 33 ? ^B>+1 ? -14.]      ;HDS AT 300/1200 (1.75ms/line)
7319             440700,,[<.byte 7 ? 33 ? ^B>+1 ? -3.*8.]]   ;HDS AT 9600 (3ms/line)
7320         ["M ? 01,,[                     ;H19's use this table differently
7321                     440700,,[<.BYTE 7 ? 33 ? "M>]       ; no padding at all at 1200 baud
7322                     440700,,[<.BYTE 7 ? 33 ? "M>+1 ? -6.]]]     ; .75 ms/line at higher
7323         "M                      ;AAA (AAA's use this table differently)
7324 IFN .-CCDLPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDDLP
7325
7326 CCICPP: 0       ;PRT
7327         0       ;DPT
7328         0       ;LSR
7329         0       ;IML
7330         0       ;TEK
7331         0       ;TV
7332         0       ;MEM
7333         0       ;SFW
7334         0       ;TRM
7335         440700,,[.BYTE 7 ? 33 ? "Q ? 40 ? 10 ? 33 ? "R] ;ESC
7336         34,,[440700,,[.BYTE 7 ? ^P ? ^\ ? ^X]   ;DTM
7337              440700,,[.BYTE 7 ? ^P ? 40 ? 177 ? ^X ? ^H ? 40 ? ^H ? 0]]
7338         440700,,[.BYTE 7 ? 33 ? "P]     ;RAY
7339                 ; The HDS requires a null in its insert char sequence so we
7340                 ; resort to non 7 bit char so the typeout loop won't think its
7341                 ; the end of an ASCIZ string.
7342         01,,[   ;HDS
7343             441100,,[<.byte 9 ? 33 ? 20 ? 40 ? 10 > ?
7344                      <.byte 9 ? 33 ? 400 >]     ; no padding 1200 or under
7345             441100,,[<.byte 9 ? 33 ? 20 ? 40 ? 10 > ?
7346                      <.byte 9 ? 33 ? 400 >+1 ? 16.]]    ; 16 ms per insert >1200
7347         440700,,[.BYTE 7 ? 33 ? "@ ? 40 ? 10 ? 33 ? "O] ;H19
7348         "@                      ;AAA's use this table differently
7349 IFN .-CCICPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDICP
7350
7351 CCDCPP: 0       ;PRT
7352         0       ;DPT
7353         0       ;LSR
7354         0       ;IML
7355         0       ;TEK
7356         0       ;TV
7357         0       ;MEM
7358         0       ;SFW
7359         0       ;TRM
7360         440700,,[.BYTE 7 ? 33 ? "P]     ;ESC
7361         34,,[440700,,[.BYTE 7 ? ^P ? ^H ? ^X]   ;DTM
7362              440700,,[.BYTE 7 ? ^P ? ^H ? 177 ? ^X]]
7363         440700,,[.BYTE 7 ? 33 ? "Q]     ;RAY
7364         01,,[   ;HDS
7365             440700,,[.byte 7 ? 33 ? 21] ; no padding 1200 or under
7366             440700,,[<.byte 7 ? 33 ? 21>+1 ? 16.]]      ; 16 ms per del at >1200
7367         ["P ? 440700,,[.BYTE 7 ? 33 ? "N]]      ;H19's also use this table differently
7368         "P                      ;AAA's use this table differently
7369 IFN .-CCDCPP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDDCP
7370
7371 CCBOWP:
7372  REPEAT %TNDTM,0
7373         440700,,[.BYTE 7 ? 16]  ;DTM
7374         0       ;RAY
7375         440700,,[.BYTE 7 ? 33 ? "D]     ;HDS
7376         440700,,[.BYTE 7 ? 33 ? "p]     ;H19
7377         440700,,[.BYTE 7 ? 33 ? "[ ? "7 ? "m]   ;AAA
7378 IFN .-CCBOWP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDBOW
7379
7380 CCRSTP:
7381  REPEAT %TNESC,0
7382         440700,,[.BYTE 7 ? 33 ? "G]     ;VT52, ETC.
7383         440700,,[.BYTE 7 ? 30]          ;DTM
7384         0       ;RAY
7385         440700,,[.BYTE 7 ? 33 ? "d]     ;HDS
7386         440700,,[.BYTE 7 ? 33 ? "q]     ;H19
7387         440700,,[.BYTE 7 ? 33 ? "[ ? "m]        ;AAA - this is not RIS,
7388 ;which could screw you over if your default state were a bad one. It's
7389 ;just SGR 0.
7390 IFN .-CCRSTP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDRST
7391
7392 CCINIP:                     ;initialize an intelligent terminal
7393  REPEAT %TNESC,0
7394         440700,,[.BYTE 7 ? 33 ? "G]     ;VT52, ETC.
7395         440700,,[.BYTE 7 ? 30]          ;DTM
7396         0       ;RAY
7397         440700,,[.BYTE 7 ? 33 ? "d]     ;HDS
7398         440700,,[.BYTE 7 ? 33 ? "q]     ;H19
7399 ;all sorts of ways the AAA can be messed up. We fix just a few.
7400         440700,,[ASCII "\e[4;18;20l\e[6;12h\e[1Q\e[>27;29;30;33;34;35;37;40;46;51l\e[>52h\e[H\e["
7401                  <ASCIZ "J">+1 ? 5.]    ;First line must be multiple of 5 chars!
7402 ;does: turn off insert char, LF is LF, CR is CR, no destructive BS, no
7403 ;wrap forward, no wrap backward, no AUTO XON/XOFF, no half-duplex, no
7404 ;auto kbd disable(!), no alternate cursor mode. Let us clear entire
7405 ;screen, enable sending to host, turn off delete display, turn on META
7406 ;key. Finally, clears the screen, about 5 ms padding.
7407 IFN .-CCINIP-%TNMAX, .ERR SOME TCTYP SETTING LACKS %TDINI
7408
7409 \f
7410 SUBTTL TTY CONTROL TABLES
7411
7412 ;TOTAL NUMBER OF TTYS
7413 NCT==NOTYS+NKSTYS+NETYS+NNTYS+NNVTTS+NDZTYS+NDPTYS+NMTYS+NDLTYS+NSTTYS+N11TYS
7414
7415 IFGE NCT-%TINON, .ERR EXCESSIVE NUMBER OF TTYS
7416
7417 IFG NOTYS-1, .ERR MORE THAN ONE KA-10 CONSOLE TTY?
7418 IFG NKSTYS-1, .ERR MORE THAN ONE KS-10 CONSOLE TTY?
7419
7420 NFKSTY==NOTYS           ;# OF FIRST KS-10 (BETTER BE ONLY) 8080 CONSOLE TTY
7421 NFETY==NFKSTY+NKSTYS    ;# OF FIRST DTE20 TTY
7422 NFNTY==NFETY+NETYS      ;# OF FIRST TK-10 TTY
7423 NFNVTY==NFNTY+NNTYS     ;# OF FIRST NOVA TTY
7424 NFDZTY==NFNVTY+NNVTTS   ;# OF FIRST DZ11 TTY.
7425 ; Terminals above this line have slow (char at a time) controllers
7426 ; below they have fast controllers.  (Check TYPDA1: and TTYDO:)
7427 NFDPTY==NFDZTY+NDZTYS   ;# OF FIRST DATAPOINT LINE
7428 NFMTY==NFDPTY+NDPTYS    ;# OF FIRST MORTON TTY
7429 NFDLTY==NFMTY+NMTYS     ;# OF FIRST DL10 TTY.
7430 NFSTTY==NFDLTY+NDLTYS   ;# OF FIRST PSEUDO-TTY
7431 NF11TY==NFSTTY+NSTTYS   ;# OF FIRST PDP11-TV TTY.
7432
7433 IFG NKSTYS, IFN NFKSTY, .ERR KS-10 CONSOLE TTY NOT ZERO?
7434 IFG NETYS, IFN NFETY, .ERR FIRST DTE20 TTY NOT ZERO?
7435
7436 ;INSTRUCTION TO OUTPUT 1 CHAR TO A CHAR-AT-A-TIME CONTROLLER.
7437 ;INSNS NEED NOT EXIST FOR FAST CONTROLLERS.
7438 TTYDO:  REPEAT NOTYS,DATAO TTY,A
7439         REPEAT NKSTYS, PUSHJ P,TTKSDO
7440         REPEAT NETYS,JFCL
7441         REPEAT NNTYS,DATAO NTY,A
7442         REPEAT NNVTTS,PUSHJ P,TTNDO
7443         REPEAT NDZTYS,PUSHJ P,TTDZDO
7444
7445 IFN NKSTYS,[
7446 TTKSDO: ANDI A,177              ; Be sure it is ASCII
7447         TRO A,400               ; Tell 8080 there is something there.
7448         MOVEM A,8CTYOT          ; Here is where it looks.
7449         CONO 80INT\APRCHN       ; Wake up!
7450         POPJ P,
7451 ] ;NKSTYS
7452
7453 IFN NDZTYS,[                    ;DZ-11 Code
7454 TTDZDO: PUSH P,C
7455         ANDI A,177              ;Be sure it is ASCII, and no break bits set
7456         HRRZ C,TTYLT(I)         ;Unibus address
7457         IOWRBI A,%DZRTD(C)      ;Send it
7458         POP P,C
7459         POPJ P,
7460 ] ;NDZTYS
7461
7462 IFN NNVTTS,[
7463 TTNDO:  ANDI A,177
7464         CAME I,NVOPTT
7465         JRST TTNDO1
7466         AOS NVTCC
7467         DATAO NTY,A
7468         POPJ P,
7469
7470 TTNDO1: MOVEM I,NVOPTT  ;MUST SELECT NEW CONSOLE
7471         SETOM NVTSIP    ;SIGNAL
7472         MOVEM A,NVTSSC  ;SAVE CHR
7473         PUSH P,I
7474         SUBI I,NFNVTY-1
7475         TRO I,200
7476         DATAO NTY,I
7477         CLEARM NVTCC
7478         POP P,I
7479         POPJ P,
7480 ]
7481
7482 ;INSTRUCTION TO TELL A TTY'S CONTROLLER TO STOP INTERRUPTING FOR IT.
7483 ;(BECAUSE THERE IS NO OUTPUT TO BE SENT)
7484 TTYDFF: REPEAT NOTYS,CONO TTY,200+TTYCHN
7485         REPEAT NKSTYS, JFCL
7486         REPEAT NETYS,JFCL
7487         REPEAT NNTYS,CONO NTY,20+TTYCHN
7488         REPEAT NNVTTS,JRST TYP5
7489         REPEAT NDZTYS,PUSHJ P,DZTYDF
7490         REPEAT NDPTYS,CONO DPK,.RPCNT_12.+400+TTYCHN
7491         REPEAT NMTYS,CONO MTY,.RPCNT_12.+200+TTYCHN
7492         REPEAT NDLTYS,JFCL
7493         REPEAT NSTTYS,JFCL
7494
7495 ;LINE-SPECIFIC INFORMATION
7496 TTYLT:  REPEAT NOTYS,500000+TTYCHN
7497         REPEAT NKSTYS, 0
7498         REPEAT NETYS,0
7499         REPEAT NNTYS,.RPCNT_12.+400000+TTYCHN
7500         REPEAT NNVTTS,0
7501         REPEAT NDZTYS, <.RPCNT&DZLNM>,,<CONC DZ,\<.RPCNT_-DZLNLN>,BA>
7502         REPEAT NDPTYS,0
7503         REPEAT NMTYS,.RPCNT_12.+TTYCHN
7504 \f
7505 ;INSN TO EXECUTE TO SIGNAL THAT OUTPUT IS AVAILABLE ON A PREVIOUSLY
7506 ;IDLE TTY - TELLS THE CONTROLLER TO CAUSE AN "OUTPUT DONE" INTERRUPT.
7507 TTYST:  REPEAT NOTYS,CONO TTY,10+TTYCHN
7508         REPEAT NKSTYS, CONO 10020\APRCHN
7509         REPEAT NETYS,PUSHJ P,TTYSTE
7510         REPEAT NNTYS,PUSHJ P,NTYST
7511         REPEAT NNVTTS,PUSHJ P,NVTYST
7512         REPEAT NDZTYS,PUSHJ P,DZTYST
7513         REPEAT NDPTYS,CONO DPK,.RPCNT_12.+100+TTYCHN
7514         REPEAT NMTYS,CONO MTY,.RPCNT_12.+10+TTYCHN
7515         REPEAT NDLTYS,PUSHJ P,TTYSTD
7516         REPEAT NSTTYS,PUSHJ P,TTYPT
7517         REPEAT N11TYS,JFCL
7518
7519 IFN DZ11P,[                     ;DZ-11 Code
7520 ; Disable transmitter ready interrupts from this line
7521 DZTYDF: PUSH P,[ANDCM B,DZLBIT(A)]      ;Clear this line's bit
7522         JRST DZTYDS
7523
7524 ; Enable transmitter ready interrupts from this line
7525 DZTYST: PUSH P,[IOR B,DZLBIT(A)]        ;Set this line's bit
7526 DZTYDS: PUSH P,A
7527         PUSH P,B
7528         PUSH P,C
7529         HRRZ C,TTYLT(I)         ;Unibus address
7530         HLRZ A,TTYLT(I)         ;Line number
7531         IORDBI B,%DZRTC(C)
7532         XCT -3(P)               ;Frob bit
7533         IOWRBI B,%DZRTC(C)      ;Write new state
7534         POP P,C
7535         POP P,B
7536         POP P,A
7537         SUB P,[1,,1]
7538         POPJ P,
7539
7540 ; DZ11 initialization.
7541 ; No parity, character length = 8 bits, stop-code = 1 bit.
7542 DZINIT: MOVEI C,NDZTYS-1        ;Relative last DZ TTY
7543         SKIPGE C                ;Don't do anything if there aren't any
7544          POPJ P,
7545 DZINI1: LDB A,[$TTOSP,,NFDZTY+TTYTYP(C)] ;Ospeed (assume it is = Ispeed)
7546         HLRZ D,NFDZTY+TTYLT(C)  ; Line number on board.
7547         HRRZ B,NFDZTY+TTYLT(C)  ; Bus address of controller.
7548         SOSL A                  ;Is speed = 0?
7549          CAILE A,10             ;Is speed > 9600?
7550           BUG HALT,[BAD SPEED CODE FOR DZ-11. LINE],OCT,C
7551         LSH A,32.               ;Assemble byte pointer
7552         IOR A,[400,,[.BYTE 4 ? 16 ? 14 ? 12 ? 10 ? 7 ? 5 ? 4 ? 2 ? 6]]
7553         LDB A,A                 ;Obtain DZ11 speed code
7554         LSH A,%DZLSS            ;Assemble LPR code
7555         IORI A,%DZLRO+3*%DZLCL(D)       ;Line # to write and various bits
7556         XCTRI [IOWRI A,%DZRLP(B)]       ;Initialize this line
7557          CAIA
7558           BUG HALT,[DZ11 NOT RESPONDING (CHECK THE BREAKER ON THE UNIBUS). LINE],OCT,C
7559         SOJGE C,DZINI1          ;Loop over all DZ TTYs.
7560
7561 IFN <NDZTYS&DZLNM>,[
7562         MOVEI C,<NDZTYS&DZLNM>  ;First unused line on last used board
7563 DZINI2: IOWRI C,%DZRLP+<CONC DZ,\<NDZTYS_-DZLNLN>,BA>   ; Disable line
7564         CAIGE C,DZNLN-1         ;Only disable lines on last used board
7565           AOJA C,DZINI2         ;Loop
7566 ]
7567         MOVEI C,%DZCTE+%DZCRE+%DZCSE+%DZCMS     ;Turn board on
7568         MOVEI D,377_8           ; Set all DTR bits, clear enable bits
7569 REPEAT <<NDZTYS+DZNLN-1>_-DZLNLN>,[
7570         IOWRI C,%DZRCS+<CONC DZ,\.RPCNT,BA>
7571         IOWRI D,%DZRTC+<CONC DZ,\.RPCNT,BA>
7572 ]
7573         POPJ P,
7574
7575 ;CALLED AT CLOCK LEVEL TO EMPTY DZ INPUT SILOS TO TTY CODE
7576 ; What you really want to do is measure the average interrupt rate of
7577 ; each DZ and use this scanning approach only when the DZ is heavily
7578 ; active. What fun.
7579 DZSCAN: CONO PI,TTYOFF-1        ;No TTY or lower ints, leave clock on
7580         PUSH P,I                ;Just in case
7581 REPEAT <<NDZTYS+DZNLN-1>_-DZLNLN>,[
7582         IORDI A,%DZRCS+<CONC DZ,\.RPCNT,BA>
7583         TRNN A,%DZCRD           ;Character in silo?
7584          JRST CONC DZS,\.RPCNT,EN
7585 CONC DZS,\.RPCNT,LP:
7586         IORDI A,%DZRDR+<CONC DZ,\.RPCNT,BA>     ;Get character from silo
7587         TRNN A,%DZDDV           ;Valid character?
7588          JRST CONC DZS,\.RPCNT,EN       ;Nope, done with this DZ
7589                                 ;Check parity?
7590         LDB I,[.BP %DZLM,A]     ;Get line # on DZ
7591         ADDI I,<DZNLN*.RPCNT>+NFDZTY
7592         CAIL I,NFDZTY+NDZTYS
7593          BUG
7594         PUSHJ P,NTYI1           ;Send char to TTY code
7595         JRST CONC DZS,\.RPCNT,LP
7596 CONC DZS,\.RPCNT,EN:
7597 ]
7598         POP P,I
7599         CONO PI,TTYON-1         ;Turn ints back on
7600         POPJ P,
7601 ];DZ11P
7602
7603 IFN TK10P,[
7604 NTYST:  PUSH P,C        ;START A TK10 TTY
7605         CONI PI,C
7606         ANDI C,177      ;SAVE WHICH PI CHANNELS ARE ON
7607         CONO PI,TTYOFF
7608         CONO NTY,@TTYLT(I)
7609         CONO NTY,10+TTYCHN
7610         CONO PI,2000(C) ;RESTORE PI STATUS
7611         POP P,C
7612         POPJ P,
7613 ]
7614
7615 IFN NNVTTS,[
7616 NVTYST: PUSH P,I
7617         SKIPL I,NOVATT
7618         PUSHJ P,NTYST
7619         POP P,I
7620         POPJ P,
7621 ]
7622
7623 TTYPT:  PUSH P,B        ;TTYST ROUTINE FOR STY TTYS.
7624         PUSH P,C
7625         MOVE B,STYSTS-NFSTTY(I) ;USER
7626 IFN NETP,[
7627         TLNE B,%SSNET
7628          JRST TTYPT2
7629 TTYPT3:
7630 ];NETP
7631         MOVE C,STYMSK-NFSTTY(I) ;CHANNELS OPEN MASK
7632         AND C,MSKST2(B)
7633         JUMPE C,POPCBJ  ;JUMP IF INTS NOT ENABLED
7634         MOVN B,C
7635         AND C,B
7636         MOVE B,STYSTS-NFSTTY(I)
7637         IORM C,IFPIR(B)
7638         JRST POPCBJ
7639
7640 IFN NETP,[      ;START STY THAT'S DIRECT CONNECTED TO NETWORK
7641 TTYPT2: CONI PI,C
7642         ANDI C,177      ;SAVE WHICH PI CHANNELS ARE ON
7643         CONO PI,NETOFF
7644         MOVSI B,%SSNET
7645         TDNN B,STYSTS-NFSTTY(I)
7646          JRST [ CONO PI,2000(C) ? JRST TTYPT3 ]
7647         SKIPL STYNTL-NFSTTY(I)
7648          JRST TTYPT4    ;ALREADY ON ACTIVATE LIST
7649         MOVE B,STYNTA
7650         MOVEM B,STYNTL-NFSTTY(I)
7651         MOVEM I,STYNTA
7652 TTYPT4: CONO PI,2000(C) ;RESTORE PI STATUS
7653         JRST POPCBJ
7654 ];NETP
7655
7656 IFN NETYS,[
7657 TTYSTE: CONO PI,400     ;PI OFF
7658         SKIPL DTEOST
7659          JRST TYSTE1
7660         HRRZM I,DTEOST  ;TELL 11 TO SET OUTPUT DONE
7661         CONO PI,200     ;PI ON
7662         CONO DTE,%DBL11 ;INTERRUPT 11
7663         POPJ P,
7664
7665 TYSTE1: CONO PI,200     ;PI ON
7666         CONO DTE,%DBL11 ;INTERRUPT 11
7667         AOS DTEHC       ;COUNT NUMBER OF TIMES HAD TO WAIT
7668         SKIPL DTEOST    ;THERE'S NO WAY TO AVOID HAVING TO WAIT ONE PLACE
7669          JRST .-2       ; OR ANOTHER.  THE -11 TRIES TO PICK UP OUTPUT-DONE FAST.
7670         JRST TTYSTE
7671 ];NETYS
7672
7673 IFN DL10P,[
7674 TTYSTD: SKIPN DL10F
7675          JRST TYPEN1
7676         CONO PI,400     ;PI OFF
7677         SKIPE DL10SO
7678          JRST TTYSD1
7679         HRRZM I,DL10SO  ;TELL 11 TO SET OUTPUT DONE
7680         CONO PI,200     ;PI ON
7681         CONO DLC,100040+TTYCHN  ;INTERRUPT 11
7682         POPJ P,
7683
7684 TTYSD1: CONO PI,200     ;PI ON
7685         CONO DLC,100040+TTYCHN  ;INTERRUPT 11
7686         AOS DL10HC      ;COUNT NUMBER OF TIMES HAD TO WAIT
7687         SKIPE DL10SO    ;THERE'S NO WAY TO AVOID HAVING TO WAIT ONE PLACE
7688          JRST .-2       ;OR ANOTHER.  THE -11 TRIES TO PICK UP OUTPUT-DONE FAST.
7689         JRST TTYSTD
7690 ]
7691 \f
7692 EBLK
7693
7694 DEFINE TTYREP WRD
7695 .CRFOFF
7696 REPEAT NCT,CONC T,\.RPCNT,$!WRD
7697 .CRFON
7698 TERMIN
7699
7700 IFNDEF TIBL,TIBL==41
7701 IFNDEF TOBL,TOBL==101
7702 TIBS==TIBL*2-1
7703 TOBS==TOBL*4
7704
7705 IFNDEF MICBAA,MICBAA==50.       ;MAXIMUM NUMBER OF INPUT BUFFER CHARACTERS BEFORE AUTOMATIC ACTIVATION
7706
7707 IFNDEF TYOWNC,TYOWNC==20.       ;MIN # BYTES OF SPACE THERE MUST BE
7708         ;IN OUTPUT BUFFER BEFORE IT IS OK TO TRY TO OUTPUT ANYTHING.
7709
7710 TIB:    BLOCK TIBL*NCT          ;TTY INPUT BUFFERS (18 BITS PER CHARACTER)
7711 TOB:    BLOCK TOBL*<NCT-N11TYS> ;TTY OUTPUT BUFFERS (8 BITS PER CHARACTER)
7712
7713 ;INPUT BUFFER BITS:
7714 %TXMPE==400000  ;MAIN PROGRAM ECHO CHARACTER
7715 %TXPIE==200000  ;PI ECHO CHARACTER
7716 %TXCOM==100000  ;COM MODE ECHO CHAR; DO PI ECHO EVEN IF HDX TTY.
7717 %TXIGN==40000   ;IGNORE THIS CHAR AT .IOT TIME.
7718 %TXACT==20000   ;THIS IS AN ACTIVATION CHAR.
7719 %TXINT==10000   ;THIS CHAR SHOULD INTERRUPT THE USER.
7720
7721 ;NOW COME THE BITS OF THE CHARACTER ITSELF:
7722 %TXTOP==4000    ;"TOP" KEY.
7723 %TXECI==2000    ;ECHOED DUE TO ECHOIN SYSTEM CALL
7724 ;%TXSFT==1000   ;"SHIFT" KEY.
7725 %TXSUP==1000    ;"SUPER" KEY.
7726 %TXMTA==400     ;"META" KEY.
7727 %TXCTL==200     ;"CONTROL" KEY.
7728 %TXASC==177     ;THE ASCII PART OF THE CHARACTER.
7729         ;%TXTOP+CERTAIN LETTERS ARE MAGIC KEYS.  %TXTOP+"Z IS DEFERRED CALL.
7730
7731 ;OUTPUT BUFFER BIT:
7732 %TXDIS==200     ;1 => THIS IS A %TD CHARACTER.
7733 IF2 EXPUNGE %TXDIS ;SO %TX BIT TYPEOUT MODE LOOKS NICE.
7734
7735 TIIP:   REPEAT NCT,  (002200)TIB-1+.RPCNT*TIBL+TIBL     ;INPUT BUFFER INPUT POINTER
7736 TIOP:   REPEAT NCT,  (002200)TIB-1+.RPCNT*TIBL+TIBL     ;INPUT BUFFER OUTPUT POINTER
7737                      (002200)TIB-1                      .SEE TTEBAK
7738 TIBEP:  REPEAT NCT,  (002200)TIB-1+.RPCNT*TIBL+TIBL     ;END OF INPUT BUFFER POINTER
7739 TOIP:   REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL     ;OUTPUT BUFFER INPUT POINTER
7740         REPEAT N11TYS,0
7741 TOOP:   REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL     ;OUTPUT BUFFER OUTPUT POINTER
7742         REPEAT N11TYS,0
7743 TOBEP:  REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL+TOBL        ;END OF OUTPUT BUFFER POINTER
7744         REPEAT N11TYS,1
7745 TOBBP:  REPEAT NCT-N11TYS,(041000)TOB-1+.RPCNT*TOBL     ;BEG OF OUTPUT BUFFER POINTER
7746         REPEAT N11TYS,1
7747 TINTP:  REPEAT NCT,2200,,TIB-1+.RPCNT*TIBL+TIBL ;INTERRUPT CHARACTER POINTER
7748 ECHOC:  REPEAT NCT,0    ;COUNT OF ECHO BUF CHARS THAT ARE REALLY ECHO CHARS
7749 ECHOP:  REPEAT NCT,2200,,TIB-1+.RPCNT*TIBL+TIBL ;POINTER TO INPUT CHARACTER TO BE ECHOED NEXT
7750 TINTC:  REPEAT NCT,0    ;COUNT OF CHARACTERS AVAILABLE FOR .ITYIC'ING.
7751 TICC:   REPEAT NCT,0    ;TYPE IN CHARACTER COUNT
7752 TACC:   REPEAT NCT,0    ;ACTIVATION CHARACTER COUNT
7753 TORM:   REPEAT NCT,TOBS ;# CHARS ROOM LEFT IN OUTPUT BUFFER.
7754 TOCMBF: REPEAT NCT,440700,,TCMBLK+.RPCNT*5      ;5-word string buffer for each
7755 TCMBLK: BLOCK NCT*5     ;tty for outputting commands that are longer than a few chars.
7756 \f
7757 TTYERQ: REPEAT NCT,-1   ;LIST OF TTYS NEEDING ECHO LINKED THRU THESE WDS. (NIL = 200000,,)
7758                         ;-1 FOR TTY NOT NEEDING ECHO.
7759 TYOSW:  REPEAT NCT,-1   ;AOSE-STYLE SWITCH FOR MP USE OF TTY.
7760 TTNTO:  REPEAT NCT,0    ;# CHANNELS TTY IS OPEN ON (IN ALL JOBS.)
7761 TYIMSK: REPEAT NCT,0    ;BIT SET FOR EACH CHANNEL THE TTY IS OPEN FOR
7762                         ;INPUT ON IN THE JOB THAT OWNS THE TTY NOW.
7763 TYOMSK: REPEAT NCT,0    ;SIMILAR, BUT FOR OUTPUT CHANNELS.
7764 TTYBYP: BLOCK NCT       ;NOT 0 => B.P. TO ASCIZ STRING TO OUTPUT AT INT. LVL.
7765 TTLTM:  REPEAT NCT,0    ;TIME LAST CHRWAS REMOVED FROM OUTPUT BUFFER.
7766 TTYOAC: REPEAT NCT,-1   ;-1 IF TTY OUTPUT INACTIVE 
7767 TTITM:  REPEAT NCT,0    ;TIME OF LAST TYPE-IN ON TTY (NOT USED BY SYSTEM).
7768 TTYLJB: REPEAT NCT,0    ;LAST JOB TO OUTPUT TO THIS TTY.  DOES NO HARM IF ABSURD.
7769
7770 TTYIPC: REPEAT NCT,[
7771 IFG APL,IFE APL-.RPCNT, TTYIS5  ;JUST STORE AND EXIT FOR AP LINE.
7772         .ELSE TTYI      ;TTY INPUT PC
7773 ]
7774 TYBPC:  REPEAT NCT,TYBN ;PC OF ^\-HANDLING CO-ROUTINE.
7775 TTOALC: REPEAT NCT,-1   ;LH IS -1 TO ALLOW M.P. TYPEOUT, OR 0 TO DELAY IT.
7776                         ;RH IS OUTPUT ALLOCATION: -1 => INFINITY (THE NORMAL CASE),
7777                         ;ELSE # OF CHARS ALLOWED TO BE OUTPUT. ^\ COMMANDS ARE
7778                         ;USED BY THE TTY TO ALLOCATE FOR OUTPUT.
7779
7780 TCMXV:  TTYREP VER      ;MAX LINES VERT
7781 TCMXH:  TTYREP HOR      ;MAX CHR HORZ
7782 TTYROL: TTYREP ROL      ;# LINES PER GLITCH WHEN SCROLLING.
7783 TTYIHP: REPEAT NCT,30.  ;INT LVL HPOS
7784 TTYIVP: REPEAT NCT,5    ;INT LVL VPOS
7785 TTYLPP: REPEAT NCT,<TPLEN*2*.RPCNT>#-1
7786                 ;IDX OF PC PPR ASSOCIATED WITH TTY,
7787                 ;OR NEGATIVE => NONE NOW ASSOCIATED,
7788                 ;AND IS 1'S COMP. OF IDX OF PC PPR
7789                 ;FORMERLY ASSOCIATED.
7790 TTYEPP: REPEAT NCT,<TPLEN*2*.RPCNT>     ;IDX OF PC PPR TO USE FOR ECHO.
7791 TTYLPS: REPEAT NCT,5,,30.       ;IF TTYLPP <0, THIS IS MAIN PRGM VPOS,,HPOS.
7792
7793 TPBEG:  ;BEGINNING OF PC PPR VARS.
7794 TPHB:   ;USE 0          ;HPOS OF LEFT MARGIN.
7795 TPVB:   BLOCK 1         ;VPOS OF TOP MARGIN (1ST LINE OF PC PPR)
7796 TPHE:   ;USE TCMXH      ;HPOS OF 1ST COLUMN AFTER RIGHT MARGIN
7797 TPVE:   ;USE TCMXV      ;VPOS OF 1ST LINE BELOW BOTTOM MARGIN
7798 TPHP:   BLOCK 1         ;HORIZONTAL POSITION OF CURSOR
7799 TPVP:   BLOCK 1         ;VERTICAL POSITION OF CURSOR
7800 TPVM:   BLOCK 1         ;NUMBER OF LINES BEFORE A **MORE** IS ALLOWED
7801 TPSP:   BLOCK 1         ;SAVED CURSOR POS (FOR ^PS AND ^PR)
7802 TPFLAG: BLOCK 1         ;HOLDS RANDOM FLAGS.
7803 %TF==0,,777775
7804 %TFEOP==1       ;1 => HAVE JUST ENTERED LAST LINE OF PC PPR.
7805                 ;NEXT ATTEMPT TO OUTPUT SHOULD DO **MORE** PROC.
7806 %TFIGL==2       ;1 => LAST CHAR WAS CR NOT IN IMAGE MODE.
7807                 ;IF NEXT CHAR IS LF, IGNORE IT.
7808
7809         TPLEN==.-TPBEG
7810         .=TPBEG
7811
7812 REPEAT 2*NCT,[          ;NOW ASSEMBLE INITIAL CONTENTS OF PC PPR VARS.
7813         0
7814         0+IFE .RPCNT&1,30.      ;TPHP & TPVP: NONZERO FOR MAIN PRGM.
7815         0+IFE .RPCNT&1,5
7816         0 ? 0 ? 0
7817 ]
7818 EXPUNG TPHB,TPHE,TPVE
7819
7820 IFN .-TPBEG-NCT*TPLEN*2,.ERR
7821
7822 COMT1:  BLOCK NCT       ;COM TEMPORARY STORAGE
7823 COMT3:  BLOCK NCT       ;DITTO.  WHILE QUERYING FOR A LINK, THIS IS -1 IF
7824                         ;IN IEC MODE, WHICH MEANS OK TO PASS TYPEIN THROUGH
7825 DZLBIT::        ; Also Line number bits for DZ11
7826 CHNBIT: REPEAT 20,1_<.RPCNT>
7827 \f
7828 ;DATA POINT CONTROLLER LINE VARIABLES
7829 ;THIS ARRAY LOOKED AT BY HARDWARE
7830
7831 IFNDEF LDBFF,LDBFF==10. ;LENGTH OF OUTPUT BUFFER^2 (PER LINE)
7832
7833 IFN DPKPP,[
7834 DPKBAS: REPEAT NDPTYS,[
7835         -1      ;CHR CNT
7836         (440701,,0)     ;BYTE PNTR
7837 ]
7838
7839 DBBFP:  REPEAT NDPTYS,  440700,,DBBF+.RPCNT*LDBFF       ;PNTRS TO OUTPUT BUFFER
7840 DPKC:   REPEAT NDPTYS,  DPKBAS+2*.RPCNT ;PNTR TO HARDWARE COUNT WORD
7841 DPKP:   REPEAT NDPTYS,  DPKBAS+2*.RPCNT+1       ;PNTR TO BUFFER PNTR WD
7842 DBBF:   BLOCK LDBFF*NDPTYS      ;OUTPUT BUFFER
7843
7844 DPSPT:  2       ;134
7845         6       ;600
7846         1       ;110
7847         2       ;150
7848         3       ;300
7849         24.     ;1200
7850         36.     ;1800
7851         48.     ;2400
7852         48.     ;4800
7853 LDPSPT==.-DPSPT
7854 ]
7855 DBBCC:  0       ;CHRS REMAINING IN CURRENT BLOCK
7856         ;FOR DPK, SET ACC. TO OUTPUT SPEED, TO
7857         ;REPRESENT APPROX. 100MS TYPEOUT TIME.
7858         ;FOR MTY, SET TO 5.
7859
7860 DBBCC1: 0       ;INITTED LIKE DBBCC, BUT NOT DECREMENTED.
7861
7862 DBBBP:  0       ;BYTE PNTR TO DBBF BUFFER OR MTYOW.
7863
7864 ;MORTON BOX LINE VARIABLES
7865 IFN MTYP,[
7866 MTYOW:  0       ;UP TO 5 CHARS TO BE OUTPUT PUT IN THIS WD.
7867 MTYNC==5        ;NUMBER OF CHARS PACKED IN ABOVE WORD.
7868 ]
7869
7870 ;DTE20 VARIABLES OTHER THAN THOSE IN LOW CORE
7871 ;I.E. NOT (DIRECTLY) REFERENCED BY 11
7872 IFN NETYS,[
7873 DTEHC:  0       ;NUMBER OF TIMES LOOPING AT TTYSTE
7874 DTECNI: 0       ;CONI DTE, AT LAST INTERRUPT
7875 DTEBBY: 0       ;NON-ZERO => BUFFER BUSY WITH TRANSFER IN PROGRESS
7876                 ; FOR DEBUGGING, THE NON-ZERO VALUE IS THE DTEOUT COMMAND.
7877 DTEBBT: 0       ;TIME-OUT IN HALF-SECOND UNITS
7878 DTEOBL==200     ;NUMBER OF CHARACTERS IN OUTPUT BUFFER
7879 DTEOBF: BLOCK <DTEOBL+3>/4      ;TTY OUTPUT BUFFER
7880 ];NETYS
7881 \f
7882 IFN NNVTTS,[
7883 NOVATT: -1      ;TTY # NOVA CONNECTED TO -1 IF NONE
7884 NVIPTT: -1      ;CURRENT NOVA PSEUDO TTY ON INPUT
7885 NVOPTT: 0       ;CURRENT NOVA PSEUDO TTY ON OUTPUT
7886 NVTSIP: 0       ;-1 IF NOVA TTY SELECT IN PROGRESS (OUTPUT)
7887 NVTSSC: 0       ;CHAR SAVED HERE DURING NVTSIP -1
7888 NVTCC:  0       ;# CHARS SENT TO CURRENT TTY SINCE RESCANING OTHER PSEUDO TTYS
7889 NNVSEC: 0       ;LAST CONSOLE TO CHECK IN TYP0 SEARCH
7890 NNVSFL: 0       ;-1 IF SERVING PREV SELECTED 
7891                 ;IE IF IT CRAPS OUT, SEARCH EVEN THO IT = NNVSEC
7892 ]
7893
7894 IFN N11TYS,[
7895 ;PDP11-TV COMMUNICATION VARIABLES:
7896
7897 TT11HD: .+1     ;ADDR (IN PDP10 ADDRESS SPACE) OF PDP11 CHANNEL
7898         0       ;HEADER AREA. IF @TT11HD IS NONZERO, THERE
7899                 ;IS INPUT TO BE PROCESSED.
7900
7901 TT1111: 0       ;# TV'S THE 11 IS SET UP FOR
7902 TT11RL: 0       ;# TV'S IN USE = MIN (TT1111, N11TYS).
7903 TT11OL: 0       ;# PDP10 WORDS IN A PDP11-TV OUTPUT BUFFER.
7904 TT11ER: BLOCK 6 ;FILLED WHEN BAD DATA COMMING FROM PDP11
7905                 .SEE TT11LS
7906
7907 TT11LO=400000+TTPG0*2000        ;BEGINNING OF PDP11 MEMORY IN PDP10 ADDRESS SPACE.
7908 TT11HA==10+TT11LO       ;PDP10 ADDR OF PDP11'S 40 (CHNL HDR AREA ADDR)
7909 TT11UP==TT11HA+2        ;PDP10 ADDR OF "11 UP" FLAG.
7910 TT11DN==TT11UP+1        ;PDP10 ADDR OF "11 ABOUT TO GO DOWN" FLAG.
7911
7912 $11==1,,777700          ;DEFINE B.P.'S TO PDP11 FIELDS OF A PDP10 WORD.
7913 $11WD0==242000          ;LOW (EVEN) 11 WORD
7914 $11WD1==042000          ;HIGH (ODD) 11 WORD
7915
7916 $11AD0==261600          ;LOW 11 WORD, SHIFTED DOWN 2 (FOR CONVERTING 11-ADDRESS TO 10 ADDRESS).
7917 $11AD1==061600          ;HIGH 11 WORD, SHIFTED DOWN 2
7918
7919 $11BY0==241000          ;LOWEST 11 BYTE.  EACH 10-WORD HOLDS 4 11-BYTES.
7920 $11BY1==341000          ;NEXT 11 BYTE
7921 $11BY2==041000          ;THIRD BYTE
7922 $11BY3==141000          ;FOURTH BYTE
7923
7924 ;FORMAT OF AN INPUT BUFFER: (ALL POINTERS ARE PDP11 ADDRS)
7925 ;PDP11 WORD #,  ...       MEANING.
7926 ;       0       ...     0 => FREE, ELSE -<# DATA CHARS>.
7927 ;       1       ...     ZERO, ALWAYS.
7928 ;       2       ...     -> NEXT BUFFER FOR THIS TTY.
7929 ;       3       ...     -> NEXT ACTIVE BUFFER.
7930 ;       4       ...     KEYBOARD NUMBER (= <TTY #>-NF11TY)
7931 ;       5+      ...     DATA CHARS, 1 PER PDP11 WORD.
7932
7933 ;FORMAT OF AN OUTPUT BUFFER:
7934 ;STARTS AT A MULTIPLE-OF-FOUR PDP11 ADDRESS, HAS A BUNCH OF BYTES,
7935 ;TT11BY BITS PER BYTE (USED TO BE 16, NOW 8).  BYTES ARE IN PDP10 ORDER.
7936 ;AFTER THE PDP11 PICKS UP A BYTE OUT OF THE BUFFER, IT STORES BACK -1,
7937 ;WHICH TELLS THE 10 THAT IT IS OK TO STORE ANOTHER BYTE THERE.
7938 ];N11TYS
7939 \f
7940 IFN DZ11P,[
7941 ;DZ11 STORAGE
7942 ;Temp metering locs
7943 DZXINC: 0               ;Count of DZ transmit interrupts
7944 DZXCHC: 0               ;Count of DZ transmit characters
7945 ;
7946 DZDCRQ: 0               ;Disconnect requests
7947 DZCORQ: 0               ;Connect requests.
7948 IFG NDZTYS-36.,.ERR Too many DZ TTYS, fix code using DZDCRQ or DZCORQ
7949 ];DZ11P
7950 \f
7951 LOCTTY: 0       ;CONSOLE INPUT CHAR READ FROM
7952 LTTYIPC:0       ;TTYIPC USED IN LAST INPUT INT (DEBUGGING ONLY)
7953 LTYBPC: 0       ;TYBPC USED IN LAST INPUT INT (DEBUGGING ONLY)
7954 LEPCHR: 0       ;-1 IF CURRENT INPUT CHAR IS A LOCAL EDITING PROTOCOL COMMAND CHAR.
7955
7956 TTYA:   0
7957 TTYACS: BLOCK 17-B+1
7958 IFN KA10P, TTYAPC:      0       ;APR CONI AT TTYBRK.
7959 TTYPDP: -LTTYP,,TTYPDL-1
7960 TTYPDL: BLOCK LTTYP
7961
7962 IFN TTLPTP,[
7963 LPTTTY:         TTLPTP  ;TTY# THAT IS REALLY LPT
7964 LPTTIME:        0       ;LAST TIME SYSTEM GOT INPUT FROM LPT
7965 ]
7966
7967 STYMAX: NCT     ;Highest-numbered STY to be allocated (for limiting load)
7968 STYOSW: -1      ;PSEUDO TTY OPEN SWITCH
7969         0
7970
7971 TTERQS: MOVE    ;LIST (THREADED THRU TTYERQ) OF TTYS NEEDING ECHOING.
7972                 ;"MOVE" (= 200000,,) IS THE END OF THE LIST.
7973                 ;OTHERWISE, A POINTER IS THE NUMBER OF A TTY
7974                 ;WHOSE TTYERQ VAR. HOLDS THE NEXT POINTER.
7975
7976 TTEDMY: 0       .SEE TYOPV0     ;DUMMY VARIABLE BLOCK
7977         0       .SEE TYOPV1     ;PASSED BY ECHO ROUTINE
7978         TTEDMY  .SEE TYOPV2     ;TO .IOT RTNS.
7979         0       .SEE TYOPV3,TTELUP
7980
7981 NTTELU: 0       .SEE TTELUP     ;ECHOING STATISTICS.
7982 NTTEWA: 0       .SEE TTEWAT
7983 NTTEL1: 0       .SEE TTELP1
7984
7985 STYNTO: BLOCK NSTTYS    ;NUMBER TIMES PSEUDO TTY OPEN
7986 STYMSK: REPEAT NSTTYS,0 ;BIT FOR EACH CHNL STY OPEN FOR INPUT ON
7987 STYOMS: REPEAT NSTTYS,0 ;OUTPUT
7988 STYSTS: REPEAT NSTTYS,0 ;STY STATUS   0 => FREE SLOT
7989                         ;RH = USER INDEX THAT HAS IT OPEN
7990 %SSHNG==400000          ;4.9 = 1 => DON'T HANG ON INPUT IOTS
7991 %SSUSE==200000          ;4.8 = 1 => IN USE
7992 %SSINT==100000          ;4.7 = 1 => HAVE GIVEN INT ON STY OUTPUT CHNS ALREADY
7993 %SSONT==040000          ;4.6 = 1 => DITTO FOR STY INPUT (TTY OUTPUT)
7994 %SSOHG==20000           ;4.5 = 1 => DON'T HANG ON OUTPUT IOT
7995 %SSORS==10000           ;4.4 = 1 => THIS STY WANTS %TDORS WHEN A
7996                         ;TTY OUTPUT RESET IS DONE.
7997 IFN NETP,[
7998 %SSNET==4000            ;4.3 = 1 => THIS STY CONNECTED TO SOME NET SOCKETS.
7999 %SSCHA==2000            ;4.2 = 0 FOR ARPANET, 1 FOR CHAOS NET
8000 %SSTCP==1000            ;4.1 = 1 for TCP internet (%SSCHA must be 0)
8001
8002 STYNTI: REPEAT NSTTYS,-1; If %SSNET set, holds net connection identifier.
8003                         ;   NCP: Input IMSOC idx,,Output IMSOC idx
8004                         ;   CHA: connection index
8005                         ;   TCP: TCB (connection) index
8006                         ;   Otherwise -1
8007 STYNTA: 0               ;HEAD OF LIST OF DIRECT-CONNECTED STYS NEEDING DATA XFER.
8008                         ;0 IS NIL;  A TTY # POINTS TO A STY.
8009 STYNTB: 0 .SEE STYNTC   ;COPIED STYNTA LIST USED INSIDE STYNTC ONLY
8010 STYNTL: REPEAT NSTTYS,-1;STYNTA LIST THREADED THROUGH THIS TABLE.
8011                         ;+ NEXT TTY IN LIST, 0 END OF LIST, - NOT IN LIST
8012 STYORC: REPEAT NSTTYS,0 ;OUTPUT-RESET CHARACTERS, 8-BIT BYTES TERMINATED BY 0
8013 TYPNTF: 0               ;-1 WHILE TYP BEING CALLED FROM STYNT0
8014 NTORFU: 0               .SEE TYPOR3
8015 ] ;NETP
8016
8017 STYICH: 0               ;TEMP STORAGE FOR PSEUDO-TTY INPUT CHAR
8018 \f
8019 TCTYP:  TTYREP TCT      ;THIS WORD SAYS HOW TO PERFORM
8020         ;CURSOR CTL FUNCTIONS ON TTY.
8021 %TNPRT==0       ;PRINTING TTY.
8022 %TNDP==1        ;TTY USES DATAPOINT CURSOR CTL CODES.
8023 %TNODP==2       ;LOSING DATAPOINT (ML-KA HAS SOME).
8024 %TNIML==3       ;TTY USES IMLAC CURSOR CODES.
8025 %TNTEK==4       ;TEKTRONIX 4000 SERIES
8026 %TNTV==5        ;TTY IS A KNIGHT TV DISPLAY.
8027 %TNMEM==6       ;MEMOWRECK
8028 %TNSFW==7       ;"SOFTWARE" TTY THAT WANTS I.T.S. CURSOR-MOTION CODES.
8029 %TNTRM==10      ;TERMINET
8030 %TNESC==11      ;TTY WANTING STANDARD ASCII ESCAPE SEQUENCES
8031 %TNDTM==12      ;DATAMEDIA
8032 %TNRAY==13      ;TELERAY 1061
8033 %TNHDS==14      ;HDS CONCEPT-100
8034 %TNH19==15      ;H19/Z19
8035 %TNAAA==16      ;AAA
8036 %TNMAX==17
8037
8038 ;TTYOPT WORD DESCRIBES CHARACTERISTICS OF THE PARTICULAR
8039 ;TERMINAL ATTACHED TO EACH LINE.
8040 TTYOPT: TTYREP OPT
8041
8042 ;LEFT HALF BITS ARE:
8043 %TOALT==200000  ;4.8 => STANDARDIZE ALTMODES.
8044 %TOCLC==100000  ;4.7 => CONVERT LOWER CASE TO UPPER.
8045 %TOERS==40000   ;4.6 => THIS TTY CAN SELECTIVELY ERASE.
8046 %TOHDX==20000   ;4.5 => THIS TTY IS HALF-DUPLEX.
8047 $TOHDX==370100
8048 %TOMVB==10000   ;4.4 => THIS TTY CAN BACKSPACE.
8049 %TOSAI==4000    ;4.3 => THIS TTY HAS SAIL CHAR SET ON OUTPUT.
8050 %TOSA1==2000    ;4.2 INIT %TSSAI OF NEW JOBS.
8051 %TOOVR==1000    ;4.1 => THIS TTY CAN OVERPRINT SUCCESSFULLY.
8052 %TOMVU==400     ;3.9 => THIS TTY CAN MOVE CURSOR UP (IS A DISPLAY).
8053 %TOMOR==200     ;3.8 => DO **MORE** PROCESSING ON THIS TTY
8054                 ;(ACTUALLY JUST USED TO INIT %TSMOR FOR NEW JOBS).
8055 %TOROL==100     ;3.7 SIMILARLY, INIT %TSROL FOR NEW JOBS.
8056 %TORAW==40      ;3.6 => SUPPRESS CURSOR MOTION OPTIMIZATION.
8057 %TOLWR==20      ;3.5 => THIS TTY HAS LOWER CASE KEYBOARD.
8058 %TOFCI==10      ;3.4 => THIS TTY CAN INPUT 12-BIT CHARACTERS (HAS FULL KEYBOARD).
8059 %TOIML==4       ;3.3 => IMLAC, HANDLES CURSOR MOTION STRANGELY.
8060 %TOLID==2       ;3.2 => LINE INSERT AND DELETE WORK
8061 %TOCID==1       ;3.1 => CHARACTER INSERT AND DELETE WORK
8062
8063 ;RIGHT HALF:
8064 %TPPLF==100000
8065 $TPPLF==170300  ;3-BIT FIELD SAYING HOW TO PAD LF.
8066         ;0 - DON'T. 1 - MEMOWRECK, 2741. 2 - TERMINET.
8067 %TPPCR==10000
8068 $TPPCR==140300  ;3-BIT FIELD SAYING HOW TO PAD CR.
8069         ;7 - UNUSED. 6 - MEMOWRECK. 5 - 2741. 4 - EXECUPORT.
8070         ;0 - DON'T. 1 - NORMAL. 2 - DOUBLE.
8071         ;ON DATAPOINTS, = # CHARS PADDING NEEDED FOR ALL CURSOR MOTION.
8072         ;4 IS RIGHT FOR 2400 BAUD; 3, FOR 1200.
8073         ;ON TERMINETS, 0 => NO PADDING, OTHER CODES ARE
8074         ;1 FOR 10CPS, 2 FOR 15CPS, 3, 4, 5 FOR 30, 60, 120 CPS.
8075 %TPPCW==6       ;FOR MEMO WRECK.
8076 %TPPTB==1000
8077 $TPPTB==110300  ;3 BIT FIELD SAYING HOW MUCH PADDING NEEDED AFTER TAB.
8078         ;0 => TABS NOT ALLOWED; ELSE 1 +<# PADDING CHARS NEEDED>
8079 %TPMTA==400     ;1.9 => HARDWARE META KEY SETS 8TH BIT
8080 %TPPRN==200     ;1.8 => INTERCHANGE () WITH [] ON INPUT
8081 %TPTEL==100     ;1.7 => TREAT CRLF INPUT AS CR FOR TELNET PROTOCOL
8082 %TPCBS==40      ;1.6 => ENABLE SPECIAL TREATMENT OF 034 ("CONTROL BACK SLASH") ON INPUT.
8083                  ;(THE "INTELLIGENT TERMINAL PROTOCOL").
8084 %TP11T==20      ;1.5 => PDP-11 TV TTY. REFLECTS %TY11T.
8085                  ;NOT SETTABLE BY USER.
8086 %TPORS==10      ;1.4 => OUTPUT RESET ON THIS TTY SHOULD REALLY DO SOMETHING.
8087 %TPRSC==4       ;1.3 => THIS TTY SUPPORTS %TDRSU, %TDRSD
8088
8089 ;SMARTS VARIABLE, %TQ IN LH, %TR IN RH, BIT DEFINITIONS IN BITS >
8090 TTYSMT: TTYREP SMT
8091 .SEE %TQ
8092 .SEE %TR
8093 \f
8094 TTYST1: REPEAT NCT,0    ;FIRST SIX GROUPT (SIX BITS PER GROUP)
8095 TTYST2: REPEAT NCT,0    ;SECOND SIX GROUPS (SIX BITS PER GROUP)
8096 TTYSTS: REPEAT NCT,%TSFRE,,-1   ;MODE BITS FOR TTY
8097
8098 ;GROUP NUMBER              CHARACTERS
8099 ;[      0               ^A-^F ^K-^L ^N-^R ^T-^Z ^] ^^ ^_ ^@ ^\
8100 ;       1               A-Z   LOWER CASE A-Z
8101 ;       2               0-9
8102 ;       3               !"#$(DOLLAR)%&',.:;?@\ (ACCENT GRAVE) (VERTICAL BAR) (TILDE)
8103 ;       4               *+-/=^_
8104 ;       5               <>[]() (LEFT BRACE) (RIGHT BRACE)
8105 ;       6               ^G ^S (^S IS IN GROUP 0 AS FAR AS %TGIMG IS CONCERNED)
8106 ;       7               LF ^I(TAB)
8107 ;       10              (ALTMODE)
8108 ;       11              CR
8109 ;       12              RUBOUT
8110 ;       13              SPACE ^H(BACKSPACE)
8111
8112 ;TTYST1 HAS GROUPS 0 THROUGH 5 FROM LEFT TO RIGHT
8113 ;TTYST2 HAS 6 THROUGH 13
8114 ;EACH GROUP HAS SIX BITS AS FOLLOWS:
8115 %TGINT==1       ;N.1 => INTERRUPT ON THIS GROUP
8116 %TGACT==2       ;N.2 => ACTIVATE ON THIS GROUP (FOR SWAPPING)
8117 %TGSPC==4       ;N.3 => SPECIAL HACKS. (THIS SET ON GROUP 1 => CONVERT LOWER CASE INPUT)
8118 %TGIMG==10      ;N.4 => IMAGE MODE OUTPUT (N.4=0  => ASCII MODE)
8119                 ;N.6-N.5 => ECHO MODE
8120                 ;       00 => NO ECHO
8121 %TGPIE==20      ;       01 => PI  ECHO (ECHO CHARACTER WHEN TYPED)
8122 %TGMPE==40      ;       10 => MAIN PROGRAM ECHO (ECHO WHEN MAIN PROGRAM RECEIVES CHARACTER)
8123
8124 ;TTYSTS HAS RANDOM BITS ASSOCIATED WITH THE TELETYPE
8125 %TSFRE==400000  ;4.9 => TTY FREE
8126 %TSCLE==200000  ;4.8 => ECHO ^L AS UPARROW-L EVEN ON DISPLAYS
8127                 ;(OTHERWISE WOULD ECHO AS CLEAR SCREEN)
8128 %TSHDX==100000  ;4.7 REFLECTS %TOHDX BIT.
8129 %TSFCO==040000  ;4.6 => HANDLE 9-BIT CHARS ON OUTPUT, USING ALPHA, BETA.
8130 %TSALT==020000  ;4.5 => DON'T STANDARDIZE ALTMODE.
8131 %TSROL==010000  ;4.4 => SCROLL MODE.
8132 %TSSAI==004000  ;4.3 => ECHO AND ASCII MODE SHOULD USE SAIL CHAR SET.
8133 %TSACT==002000  ;4.2 => GOBBLE NEXT CHAR REGARDLESS OF ACTIVATION STATUS
8134 %TSNEA==001000  ;4.1 => DON'T ECHO IN THE ECHO AREA.  ECHO IN M.P. AREA.
8135 %TSINT==000400  ;3.9 => INT ON NEXT CHAR REGARDLESS
8136 %TSMOR==000200  ;3.8 => INHIBIT **MORE**.
8137 %TSATY==000100  ;3.7 SET BY .ATTY, SAYS TTY WAS TAKEN AWAY & RETURNED.
8138                 ;3.6-3.5 UNUSED.
8139 %TSNOE==000010  ;3.4 => DEFER ECHOING, AND MAKE INPUT IOT'S ACT AS IF %TIECH=1.
8140 %TSLCZ==000004  ;3.3 => LAST CHARACTER TYPED WAS ^Z (NOT PRECEEDED BY ^_)
8141 %TSSII==000002  ;3.2 => SUPER IMAGE INPUT MODE
8142 %TSCNS==000001  ;3.1 => CONSOLE
8143 $TSCNS==220100
8144                 ;RH => USER INDEX
8145                 ;       -1 => NO USER
8146
8147 TTYSTA: REPEAT NCT,%TACFM,,     ;NOT SAVED AT ATTY
8148 %TACFM==400000  ;4.9 = 0 => NEEDS TO HAVE CONSOLE FREE MSG EVENTUALLY TYPED
8149                 ;       CLEARED BY OPEN OR ZFLAG WHEN INITIALIZING CONSOLE PROCEDURE
8150                 ;       SET BY SYS JOB AFTER TYPING CONSOLE FREE MSG
8151                 ;WHEN THIS BIT IS 0, TTY ISN'T AVAILABLE FOR BEING GOBBLED DOWN
8152                 ;FOR ANY NEW USE.
8153 %TACTZ==200000  ;4.8 ON => TTY IS FREE AND BEING ^Z'D, SO EVEN THOUGH IT APPEARS
8154                 ;OTHERWISE TO NEED A CONSOLE-FREE MESSAGE IT SHOULDN'T GET ONE.
8155 %TANJS==100000  ;4.7 ON => TTY IS BEING ^Z'D, BUT THERE ARE NO JOB SLOTS.
8156                 ;4.8 WILL BE ON AND 4.9 OFF. SYS JOB WILL RESTORE ALL TO NORMAL
8157                 ;AFTER TYPING "SYSTEM FULL" ON THE TTY.
8158 %TANEC==070000  ;4.6-4.3 NUMBER OF FOLLOWING CHARS TO INHIBIT ECHO AND INTS FOR.
8159                 ;THIS IS USED FOR THE ARG CHARS THAT FOLLOW TOP-E, TOP-S, TOP-Y, ETC.
8160 \f
8161 TTYCOM: REPEAT NCT,0,,-1        ;COMMUNICATE WORD
8162 ;4.9 => TTY IN COMMUNICATE MODE
8163 %TCLFT==200000  ;4.8 => LOCAL FEED THROUGH (SET IF MY PRGM RECIEVING HIS CHRS)
8164 %TCRFT==100000  ;4.7 => REMOTE FEED THROUGH (SET IF HIS PRGM RECIEVING MY CHRS)
8165 %TCICO==40000   ;4.6 => INPUT COMMUNICATE OVERRIDE (SET IF MY CONSOLE FEEDING MY
8166                 ; PRGM EVEN THO IN COMM MODE).  ALSO IMPLIES OUTPUT OVER-RIDE.
8167 %TCOCO==20000   ;4.5 => OUTPUT COMMUNICATE OVERRIDE (SET IF MY PRGM'S OUTPUT TO APPEAR ON MY CONSOLE ONLY EVEN THO IN COM MODE)
8168 ;4.4-4.3 => MESSAGE RECEIPT SWITCH
8169                 ;00 => ACCEPT
8170 %TCRFS==10000   ;10 => REFUSE
8171 %TCQRY==4000    ;01 => INTERROGATE
8172 %TCMTR==2000    ;4.2  SET FOR TTY WHOSE MOTOR IS OFF & MUST BE TURNED
8173 ;ON BEFORE ANY OTHER OUTPUT IS DONE.
8174 ;(ONLY TERMINETS HAVE THEIR MOTORS SHUT OFF BY ITS).
8175 %TCECH==1000    ;4.1 THE OUTPUT BUFFER CONTAINS ECHOING OUTPUT.
8176                 ;THIS MAKES OUTPUT RESET DO NOTHING.
8177                 ;THE BUFFER MUST NOT CONTAIN ECHO OUTPUT AND NORMAL OUTPUT AT ONE TIME.
8178 %TCDET==200     ;3.8 CONSOLE'S TREE DETACHED BY TOP LEVEL INTERRUPT.
8179         ;SET BY NDETAC AS SIGNAL TO SYSCFM (CNSL-FREE-MSG TYPER)
8180 %TCDNG==100     ;3.7 => TYPE BELL ON TTY (BECAUSE INPUT BFR FULL).
8181 %TCCBK==40      ;3.6 => READING UNAME OR TTY # AFTER ^_K.
8182 %TCCBS==20      ;3.5 => READING UNAME OR TTY # AFTER ^_S.
8183 %TCFPD==10      ;3.4 => FIRST PART DONE (USED FOR %TNESC ESCAPE SEQUENCES, %TNODP CR)
8184 %TCTPN==4       ;3.3 TYPE ^_N ON LEAVING COM MODE (UNLESS USER EXPLICITLY TYPES ^_N)
8185 %TCPAD==2       ;3.2  0 => PADDING NECESSARY ON DATAPOINT.
8186 %TCHNG==1       ;3.1 TTY'S DONE FLAG APPEARS TO BE FRIED, TIME OUT QUICKLY
8187 ;RH => USER INDEX COMMUNICATING WITH (-1 NONE)
8188
8189
8190 ;TTYTYP TABLE
8191 ;THIS TABLE HOLDS BITS THAT DESCRIBE THE LINE
8192 ;AND ITS CONTROLLER, RATHER THAN THE TTY ATTACHED TO THE LINE.
8193
8194 %TTLCL==400000  ;BIT 4.9 ONE => LOCAL TTY
8195 %TT340==200000  ;BIT 4.8 ONE => CONSOLE NEXT TO 340 OR A 340 SLAVE
8196 %TT3HP==100000  ;BIT 4.7 HIGH PRIORITY ON 340
8197 %TTPAR==004000  ;BIT 4.3 THIS TTY NEEDS PARITY BIT SENT.
8198 %TTDDI==002000  ;BIT 4.2 DONT DING ON EXCESS INPUT
8199 $TTISP==260400  ;3.8-3.5 INPUT SPEED CODE
8200 $TTOSP==220400  ;3.4-3.1 OUTPUT SPEED CODE
8201
8202 %TYDPK==400000  ;BIT 2.9 DATAPOINT KLUDGE TERMINAL
8203 %TYSTY==200000  ;BIT 2.8 PSEUDO TTY
8204 %TYNVA==100000  ;BIT 2.7 NOVA TTY
8205 %TYMTY==040000  ;BIT 2.6 MORTON BOX
8206 %TYDIL==020000  ;BIT 2.5 DIAL UP
8207 %TY11T==010000  ;BIT 2.4 PDP-11 TV TTY.
8208 %TYDL== 004000  ;BIT 2.3 DL10 TTY
8209 %TYOTY==002000  ;BIT 2.2 ORDINARY KA-10 CONSOLE TTY
8210 %TYETY==001000  ;BIT 2.1 DTE-20 TTY (KL-10 CONSOLE)
8211 %TYNTY==000400  ;BIT 1.9 TK-10 TTY.
8212 %TYMDM==000200  ;BIT 1.8 LINE HAS MODEM CONTROL, DETECTS DIALINS AND HANGUPS
8213 %TYKST==000100  ;BIT 1.7 KS-10 CONSOLE TTY
8214 %TYDZT==000040  ;BIT 1.6 DZ-11 TTY ON KS-10
8215 %TYRLM==000020  ;BIT 1.5 ROLM DATA SWITCH
8216
8217 TTYTYP: TTYREP TYP      ;PART OF TTYTYP MAY BE WRITEABLE.
8218 BBLK
8219         0       ;DISOWNED JOBS CANT HAVE LPT
8220         %TTLCL,,;SYSTEM JOB CAN GET LPT
8221
8222 .CRFOFF
8223 IRPS X,,TYP OPT HOR VER TCT ROL SMT
8224 REPEAT NCT,[
8225 CONC EXPUNG T,\.RPCNT,$!X
8226 ]
8227 TERMIN
8228 .CRFON
8229
8230 OVHMTR UUO      ;YET MORE RANDOM UUOS