14d7517bab11035a3f02a1dfba32a0231bbd7b95
[retro-software/dec/tops10/v4.5.git] / src / scnsrf.mac
1 TITLE   SCNSRF - SCANNER AND CONSOLE TELETYPE SERVICE ROUTINE - V415\r
2 SUBTTL R CLEMENTS.RCC  TS  03 JUN 69\r
3         XP VSCNSF,415\r
4 \r
5 ENTRY SCNSRF\r
6 SCNSRF:\r
7 \r
8 \r
9 ;SCANSER IS ORGANIZED INTO THE FOLLOWING SECTIONS\r
10 \r
11 ;         I.     COMMENTARY ON OPERATION AND DATA STRUCTURES\r
12 ;        II.     SYSTEM INITIALIZATION ROUTINE - SCNINI\r
13 ;       III.     UUO LEVEL ROUTINES\r
14 ;                        A. DDTIN\r
15 ;                        B. DDOUT\r
16 ;                        C. TTYUUO\r
17 ;                        D. TTYIN\r
18 ;                        E. TTYOUT\r
19 ;        IV.      COMAND LEVEL ROUTINES\r
20 ;                        A. TTYATT\r
21 ;                        B. TTYCOM\r
22 ;                        C. TTYDCM\r
23 ;                        D. TTYDET\r
24 ;                        E. TTYFND,TTYFNU\r
25 ;                        F. TTYKIL\r
26 ;                        G. TTYSET\r
27 ;                        H. TTYSRC\r
28 ;                        I. TTYSTC\r
29 ;                        J. TTYTLK\r
30 ;                        K. TTYUSR\r
31 ;         V.      INTERRUPT SERVICE ROUTINES\r
32 ;                        A. CTYINT\r
33 ;                        B. SCNINT\r
34 ;                        C. RFCINT - ALL LINES RECEIVER INTERRUPT\r
35 ;                                1. TTEDIT - EDITS AND ECHOS\r
36 ;                        D. XMTINT -  TRANSMIT INTERRUPT\r
37 ;                                1. GETCHR\r
38 ;                                2. TYP\r
39 \f;DATA STRUCTURES AND PARAMETERS\r
40 \r
41 ; DEFINED BY BUILD PROCESS FOR THE CONFIGURATION\r
42 ;               SCNLIN=OCTAL NO. OF SCANNER LINES (0 THRU SCNLIN-1)\r
43 \r
44 ;               TRANSLATOR TABLE PARAMETERS\r
45 ;               TTYLEN=SCNLIN+1 LENGTH OF TTY TRANSLATOR TABLE (INCLUDING CTY)\r
46 ;               TTYTAB: BLOCK TTYLEN    TTY TRANSLATOR TABLE\r
47 ;                       SIGN BIT=1 IF COMMAND JUST TYPED\r
48 ;                       BIT 1 =1 IF DELAYED COMMAND\r
49 ;                       BITS 3-11 = JOB NO TTY IS ATTACHED TO (TPCJOBN)\r
50 ;                       BITS 12-17=TALK RING LINE # (PTALK)\r
51 ;                       BITS 18-35=ADDR. OF DEVICE DATA BLOCK\r
52 ;                               FOR THIS LINE.\r
53 ;               DEVOPR: 0       SIXBIT PHYSICAL NAME OF OPERATORS\r
54 ;                               CONSOLE\r
55 \r
56 ;       DEFINED IN IOINI2\r
57 ;               LINE NUMBER PARAMETERS\r
58 ;               MLTTYL=-NO. OF TTY DEVICE DATA BLOCKS\r
59 ;               TCONLN=SCNLIN   CTY LINE NUMBER\r
60 ;               MTTYLN=-TTYLEN  -LENGTH OF TRANSLATOR TABLE\r
61 ;               TTYLST=TTY0D0   FIRST TTY DEVICE DATA BLOCK\r
62 \r
63 ;               TTY DEVICE DATA BLOCK FORMAT\r
64 ;               (STANDARD IS AS DEFINED ON SYSTEM PARAMETER TAPE)\r
65 ;               DEVNAM: PHYSICAL DEVICE NAME SET UP DYNAMICALLY\r
66 ;                       VIA SCNIN0.\r
67 ;               DEVCHR: LEFT HALF IS STANDARD\r
68 ;                       BITS 18-23=LINE NUMBER(BYTE POINTER=PUNIT)\r
69 ;                       BITS 24-35=MONITOR BUFFER SIZE + 1\r
70 \f;              DEVIOS: LEFT HALF\r
71 ;                       1,2,4,20,40 ARE STANDARD\r
72                         USRB=100        ;SET TTY TO USER MODE\r
73                                         ;WHEN OUTPUT FINISHES\r
74                         IOSUPR=200      ;SUPPRESS ALL OUTPUT\r
75                                         ;TILL NEXT INPUT OR INIT (^O).\r
76                         TRMON=400       ;TTY IS IN MONITOR\r
77                                         ;COMMAND MODE.\r
78                         DDTM=1000       ;DDT MODE\r
79                         TTYDTC=2000     ;TTY DDB IS DETACHED FROM LINE\r
80                         SYNC=20000      ;BREAK CHARACTER SEEN\r
81                                         ;SIGNAL TO INCREMENT SYNC COUNT\r
82                                         ;FOR BUFFER INVOLVED\r
83                         TTYIOW=400000   ;TTY INPUT WAIT BIT\r
84 \r
85 IFNDEF FTHDPX,<FTHDPX=-1>       ;NON-ZERO TO INCLUDE HALF-DUPLEX CODE\r
86 IFNDEF FTDDTM,<FTDDTM=-1>       ;NON-ZERO TO IUNCLUDE CALLI DDTIN,OUT\r
87 \r
88 FTTTYSER=-1     ;DEFINE THIS SYSTEM TO HAVE SCNSRF\r
89 \r
90 INTERN FTTTYSER ;ASSURE MULT DEF GLOBALS IF WRONG APSER\r
91 \f;                      RIGHT HALF BITS (USER MODE0\r
92                         FCS=100         ;FULL CHARACTER SET. PASS\r
93                                         ;ON ALL CHARACTERS EXCEPT ^C\r
94                                         ;NO SPECIAL CHARACTER PROCESSING\r
95                         NOECHO=200      ;ECHO SUPPRESSION REQ BY PROG\r
96                         DLRSUP=400      ;400 SUPPPRES "$" FOR ALTMODE\r
97                         MERTPO=IOIMPM   ;MONITOR ERROR TYPE-OUT\r
98                         IGNOR=IODERR    ;IGNORE ALL INT, FOR 1/2\r
99                                         ;OF A SECOND WHEN ECHO\r
100                                         ;FAILURE OCCURS.\r
101                         ECHOF=IODTER    ;ECHO FAILURE OCCURED.\r
102 ;               DEVSER: STANDARD\r
103 ;               DEVBUF: STANDARD\r
104 ;               DEVIAD: BITS 6-12=HORIZONTAL POSITION (BYTE\r
105 ;                               POINTER = PHPOS).\r
106 ;                       BITS 13-35 ARE STANDARD.\r
107 ;               DEVOAD: BITS 0-8=NUMBER OF CHARACTERS TO FIT\r
108 ;                                       ;INTO OUTPUT BUFFER\r
109 ;                                       (POINTER= PFITCH)\r
110 ;                       BITS 13-35 ARE STANDARD\r
111 \r
112 ;THE FOLLOWING ARE DEFINITIONS OF THE RELATIVE LOCATIONS OF THE\r
113 ;BUFFER PARAMETER WORDS OF THE DEVICE DATA BLOCK FOR EACH BUFFER. WITH\r
114 ;TTX'BUF AS THE BASE (DETAILED DESCRIPTIN IN SCNDDB COMMENTS):\r
115 \r
116         XP      BUF,0           ;BUF(DAT) CONTAINS POINTER TO BEG. OF CURRENT BUFFER\r
117         XP      PUTR,1          ;PUTR(DAT)-PUTS CHARACTER INTO BUFFER\r
118         XP      PCTR,2          ;NUMBER OF TIMES TO INCR. PUTR BEFORE REINITING\r
119         XP      TAKR,3          ;TAKER POINTER TO PICK UP CHARACTERS\r
120         XP      TCTR,4          ;COUNT OF NUMBER OF TIMES TAKR CAN BE INCREMENTED\r
121         XP      FCTR,5          ;COUNT OF FREE SPACES LEFT IN BUFFER\r
122 \f;DEFINITION OF LINE CHARACTERISTICS TABLE BITS\r
123 ;LINTAB MADE BY SYSTEM BYUILDER\r
124 ;FOLLOWING IS FORMAT AS SET UP BY SCNINI\r
125 ;       XWD BITS,LOGICAL LINE#\r
126 \r
127 EXTERNAL LINTAB\r
128 \r
129 PTYLIN=400000           ;THIS LINE LINKED TO PTY\r
130 CTYLIN=200000           ;THIS "LINE" IS CONSOLE DEVICE "TTY"\r
131 DISLIN=100000           ;THIS LINE IS TO A DISPLAY KEYBOARD\r
132 DSDTLN=40000            ;DATA SET DATA LINE\r
133 DSCTLN=20000            ;DATA SET CONTROL LINE\r
134 HLFDPX=10000            ;HALF DUPLEX LINE\r
135 TTYRMT=4000             ;REMOTE TTY LINE\r
136 \r
137 ;ABOVE ARE "PERMANENT" CHARACTERISTICS\r
138 \r
139 TLKRNG=1                ;THIS LINE CURRENTLY IN A TALK RING\r
140 XON=2                   ;^Q TYPED, PAPER TAPE INPUT\r
141 \r
142 FULTWX=4                ;SELF ECHOING FULL DUPLEX\r
143 T35=10                  ;MODEL 35\r
144 T37=20                  ;MODEL 37\r
145 ROBTPB=40               ;RUBOUT TYPED LAST (ECHO \ BEFORE NEXT CHAR.)\r
146 LINRDY=100              ;LINE TYPED IN BY USER (TISYNC .G.0)\r
147                         ; NOT ACTUALLY IN LINTAB. BUT RETURNED BY\r
148                         ; GETLIN IN TTCALL\r
149 \r
150 ;ABOVE ARE TEMPORARY BITS, TURNED ON AND OFF BY VARIOUS MEANS\r
151 ;(BY MONITOR, TYPE-IN COMMANDS, OR PROGRAM)\r
152 \r
153 LGLSET=T37+T35+FULTWX+XON       ;THESE CAN BE SET OR ZEROED BY PROGRAM\r
154 KILMSK=ROBTPB+TLKRNG+XON        ;CLEARED AT TTYKIL\r
155 \r
156 ;DECLARE THESE AS INTERNS TO GET THEM IN THE MAP\r
157 ;AND TO CHECK AGAINST S IN COMMON\r
158 \r
159 INTERNAL PTYLIN,CTYLIN,DISLIN,DSDTLN,DSCTLN,HLFDPX,TTYRMT\r
160 INTERNAL T35,T37,FULTWX,LGLSET,KILMSK,XON\r
161 \f;ACCUMULATOR ASSIGNMENTS\r
162 \r
163         CHREC=TEM       ;AC FOR CHARACTER\r
164         DDB=DEVDAT      ;ADDRESS OF DEVICE DATA BLOCK\r
165         LINE=TAC1       ;SCANNER LINE NUMBER\r
166         HPOS=ITEM       ;HORIZONTAL POSITION OF TTY,(0-71)\r
167 \r
168 ;SPECIAL SYMBOLS\r
169 \r
170         PION=200        ;TURN PI ON BIT\r
171         PIOFF=400       ;TURN PI OFF BIT\r
172 \r
173         IDLECH=1        ;DELAY CHAR FOR TABS, ETC,\r
174                         ; SHOULD BE ^V, BUT FOR 37'S\r
175 \r
176 ;BYTE POINTERS\r
177 \r
178 INTERNAL TPCJOBN,TYPX,FULTWX,TYPE,TAKR,BREAKB\r
179 \r
180 PHPOS:  POINT 7,DEVIAD(DEVDAT),12       ;HORIZONTAL POSITION\r
181 TPCJOBN:POINT 9,TTYTAB(LINE),11         ;JOB NUMBER FOR TTY.\r
182 PSAVCH: POINT 7,TTYPTR(DDB),10          ;SAVE CHAR TO ECHO ON UUO LEVEL\r
183 \r
184 INTERNAL FTTALK\r
185 \r
186 IFN FTTALK,<\r
187         PTALK:  POINT 6,TTYTAB(LINE),17 ;POINTER TO ANOTHER TTY IN TALK RING\r
188 >\r
189 \r
190 INTERN PLASTC,PCOMIC\r
191 \r
192 PLASTC: POINT 7,TTYPTR(DDB),35  ;FOR EACH CHECKING ON HDX LINES\r
193 PCOMIC: POINT 9,TTYPTR(DDB),19  ;FOR RESCANNING COMMAND INPUT LINE\r
194                                 ;"COMMAND INPUT COUNTER" SAVES TITCTR\r
195 PLSTLC: POINT 9,TTYPTR(DDB),28  ;FOR ^U DELETION\r
196 \r
197 TOIP=400000     ;SIGN OF TTYPTR(DDB) - TYPE-OUT IN PROGRESS\r
198 \r
199 ;TTYPTR CONTAINS THE FOLLOWING BYTES:\r
200 ;\r
201 ;       0       ON IF TYPE-OUT IN PROGRESS\r
202 ;       1-3     SPARE\r
203 ;       4-10    PSAVCH, FOR INTERRUPTED ECHO\r
204 ;       11-19   PCOMIC, FOR COMMAND RESCAN\r
205 ;       20-28   PLSTLC, FOR ^U\r
206 ;       29-35   PLASTC, FOR EACH CHECKING HALF DUPLEX LINES\r
207 \f;SCNINI IS CALLED AT SYSTEM INITIALIZATION TIME FROM\r
208 ;IOGO IN SYSINI VIA DISPATCH TABLE\r
209 ;IT     1)CLEARS ALL RECEIVER FLAGS.\r
210 ;       2)CLEARS THE PHYSICAL NAME (DEVNAM) OF ALL UNUSED\r
211 ;         (TTYUSE=0) TTY DEVICE DATA BLOCKS,\r
212 ;       3)SETS DEVIOD TO XWD TPMON+IOFST,0 IN ALL TTY DEVICE\r
213 ;         DATA BLOCKS.\r
214 ;       4)SETS TTYUSE#1 IN ALL TTY DDBS IN THE TRANSLATOR TABLE.\r
215 \r
216 EXTERNAL SCNSCH,MLTTYL,MTTYLN,TTYTAB,SCNINI\r
217 \r
218 TTYINI: MOVEI TAC,SCNCHN\r
219         CONO TTY,1200(TAC)      ;CLEAR CTY, ASSIGN CHANNEL\r
220         PUSHJ   PDP,SCNINI      ;DEVICE DEPENDENT SCANNER INIT\r
221         MOVSI TAC1,MLTTYL       ;NO. OF TTY DEV. DATA BLOCKS. NOT LINES\r
222         MOVSI IOS,TPMON+IOFST   ;VIRGIN STATUS\r
223         MOVEI DDB,TTYLST        ;FIRST TTY DDB ADDRESS\r
224 \r
225 SCN1:   MOVSI DAT,TTYUSE        ;TTY DDB IN USE BIT\r
226         TDNN DAT,DEVMOD(DDB)    ;IS THIS TTY DDB IN USE?\r
227         SETZM DEVNAM(DDB)       ;NO, SET PHYSICAL NAME TO 0.\r
228         MOVEM IOS,DEVIOS(DDB)   ;SET IOS TO INITIAL STATE\r
229         ANDCAM DAT,DEVMOD(DDB)  ;CLEAR TTYUSE BIT.\r
230         SETZM   TTYPTR(DDB)     ;CLEAR TOIP, ETC\r
231         MOVSI   TAC,TTYCHR      ;NUMBER OF CHARACTERS IN BUFFER\r
232         HRRI    TAC,TIBF(DDB)   ;ADDRESS OF TTY INPUT BUFFER\r
233         MOVEM   TAC,TTIBUF(DDB) ;SET IT UP\r
234         HRRI    TAC,TOBF(DDB)   ;ADDRESS OF TTY OUTPUT BUFFER\r
235         MOVEM   TAC,TTOBUF(DDB) ;SET UP INFO FOR THAT\r
236         PUSHJ PDP,TSETBF        ;CLEAR MONITOR BUFFERS\r
237         HLRZ DDB,DEVSER(DDB)    ;GET NEXT TTY DDB\r
238         AOBJN TAC1,SCN1\r
239         MOVSI TAC1,MTTYLN       ;SET DDB USE BITS FROM TRANSLATOR TABLE\r
240 SCN2:   MOVSI TAC,TTYUSE\r
241         SKIPE DDB,TTYTAB(TAC1)\r
242         IORM TAC,DEVMOD(DDB)\r
243         HRRZ TA,TAC1            ;SET UP PERMANENT LINTAB BITS\r
244         CAIGE   TAC,TCONLN      ;ORDINARY TTY LINE?\r
245         JRST    SCN3            ;YES\r
246         CAIE    TAC,TCONLN      ;CTY LINE?\r
247         TLOA    TAC,PTYLIN      ;NO. MUST BE PTY LINE NR\r
248         TLO     TAC,CTYLIN+T35  ;YES\r
249 SCN3:   HRRM    TAC,LINTAB(TAC1)        ;SET LOG. LINE NUMBERS\r
250         IORB    TAC,LINTAB(TAC1)        ;SET SIGNIFICANT BITS\r
251         TLZ     TAC,KILMSK      ;ZAP INSIGNIFICANT BITS\r
252         TLNE    TAC,DSDTLN              ;IF A DATAPHONE,\r
253         TLZ     TAC,LGLSET              ; CLEAR OTHERS TOO\r
254         HLLM    TAC,LINTAB(TAC1)        ;LEAVING REST OF BITS AS THEY WERE\r
255         AOBJN TAC1,SCN2\r
256         POPJ PDP,\r
257 \f;ROUTINES TO SET UP BUFFERS\r
258 \r
259 INTERNAL TSETBF,SETBFI,PUTCHI\r
260 \r
261 SETBFI: MOVEI   DAT,1\r
262         DPB     DAT,PCOMIC\r
263         DPB     DAT,PLSTLC\r
264         MOVEI   DAT,TTIBUF(DDB)         ;SPECIFY INPUT BUFFER\r
265         SETZM   TISYNC(DDB)             ;NO LINES IN BUFFER\r
266         JRST    SETBF0                  ;INIT BUFFER\r
267 \r
268 TSETBF: PUSHJ   PDP,SETBFI              ;INIT TTI BUFFER\r
269 SETBF2: MOVEI   DAT,TTOBUF(DDB)         ;SPECIFY OUTPUT BUFFER\r
270 SETBF0: MOVE    TAC,BUF(DAT)\r
271         HRLI    TAC,440700      ;INITIAL TAKR AND PUTR\r
272         MOVEM   TAC,TAKR(DAT)\r
273         MOVEM   TAC,PUTR(DAT)\r
274         MOVEI   TAC,1           ;INITIALIZE COUNTERS TOO\r
275         MOVEM   TAC,TCTR(DAT)\r
276         MOVEM   TAC,PCTR(DAT)\r
277         HLRZ    TAC,BUF(DAT)    ;CHARACTER COUNT\r
278         MOVEM   TAC,FCTR(DAT)   ;UPDATE FREE CHARACTER COUNT\r
279 \r
280 ;ROUTINE TO PUT A CHARACTER INTO A BUFFER (FOR INPUT,MERTPO, AND ONCE)\r
281 ;CALL   MOVEI DAT,TTYBUF(DDB)           ;TO SPECIFY BUFFER\r
282 ;       PUSHJ   PDP,PUTCHI\r
283 ;       ERROR RETURN, BUFFER "FULL"\r
284 ;       SUCCESSFUL RETURN\r
285 \r
286 PUTCHI: SOSGE   FCTR(DAT)               ;ANY FREE SPACES LEFT?\r
287         JRST    PUTCI0                  ;NO\r
288 PUTCI2: SOSLE   PTCR(DAT)               ;LAST BYTE IN BUFFER FILLED?\r
289         JRST    PUTCI1          ;NO, GO AHEAD\r
290         PUSH    PDP,TAC\r
291         MOVE    TAC,BUF(DAT)    ;GET ADR AND SIZE OF BUFFER\r
292         HLRZM   TAC,PCTR(DAT)   ;INITIAL COUNTER\r
293         HRLI    TAC,440700      ;MAKE A BYTE POINTER\r
294         MOVEM   TAC,PUTR(DAT)   ;STORE IT\r
295         POP     PDP,TAC ;RESTORE TAC\r
296 PUTCI1: IDPB    CHREC,PUTR(DAT)\r
297         JRST    CPOPJ1\r
298 \r
299 ;ROUTINE TO STUFF MONITOR ERROR MESSAGE IN TTI BUFFER\r
300 ;CALLED IN LINE FROM PUTCH0\r
301 \r
302 TTIOUT: MOVE    IOS,DEVIOS(DDB)\r
303         AOS     TOFCTR(DDB)             ;RE-ADJUST FREE CHAR COUNT\r
304         TRNN    IOS,MERTPO              ;MONITOR ERROR MESSAGES?\r
305         JRST    GETCH1                  ;NO, ZERO CHREC TO INDICATE\r
306         MOVEI   DAT,TTIBUF(DDB)         ;YES, PUT REST IN TTI BUFFER\r
307         SOSGE   FCTR(DAT)               ;ANY SPACE?\r
308         JRST    PUTCI0                  ;NO.\r
309         SOS     0(PDP)                  ;YES, COMPENSATE SKIP RETURN\r
310         JRST    PUTCI2                  ;AND GO TO MIDDLE OF PUTCHI\r
311 \f;CHARACTER AND BUFFER HANDLING ROUTINES\r
312 \r
313 ;ROUTINE TO PICK UP A CHARACTER FROM ANY BUFFER\r
314 ;CALL   MOVEI   DAT,TTXBUF(DDB)         ;TO SPECIFY BUFFER\r
315 ;       PUSHJ   PDP,GETCHR\r
316 ;       ONLY RETURN             ;CHARACTER OR ZERO IN CHREC\r
317 ;                               ;ZERO INDICATES BUFFER "EMPTY"(TAKR=PUTR)\r
318 \r
319 INTERNAL GETCHR\r
320 \r
321 GETCHR: HLRZ    CHREC,BUF(DAT)          ;SIZE OF THIS BUFFER\r
322         CAMG    CHREC,FCTR(DAT)         ;IS FREE COUNTER EQUAL TO SIZE?\r
323                                         ;I.E., IS THE BUFFER EMPTY?\r
324         JRST    GETCH1                  ;YES. LOAD CHREC WITH ZERO AND EXIT\r
325         SOSLE   TCTR(DAT)               ;NO, ARE WE AT END OF BUFFER?\r
326         JRST    GETCH2          ;YES. GO ON.\r
327         MOVE    CHREC,BUF(DAT)  ;YES. START AT TOP AGAIN\r
328         HLRZM   CHREC,TCTR(DAT) ;INITIAL COUNTER\r
329         HRLI    CHREC,440700            ;MAKE A BYTE POINTER\r
330         MOVEM   CHREC,TAKR(DAT) ;INITIAL POINTER\r
331 GETCH2: ILDB    CHREC,TAKR(DAT)         ;GET CHARACTER\r
332         AOS     FCTR(DAT)               ;INCREMENT FREE CHAR. COUNT\r
333         JUMPE   CHREC,GETCHR            ;SKIP NULLS\r
334         POPJ    PDP,\r
335 GETCH1: TDZA    CHREC,CHREC     ;RETURN 0 INDICATING END OF BUFFER\r
336 PUTCI0: AOS     FCTR(DAT)       ;READJUST FREE COUNTER\r
337         POPJ    PDP,\r
338 \r
339 ;ROUTINE TO PLACE A CHARACTER INTO THE OUTPUT BUFFER\r
340 ;CALLED AT INTERRUPT LEVEL\r
341 ;CALL   MOVE    CHREC,CHARACTER TO PLACE INTO BUFFER\r
342 ;       PUSHJ   PDP,PUTCHO\r
343 ;       ONLY RETURN, WHETHER OR NOT CHARACTER WAS PLACED\r
344 \r
345 PUTCHO: SOSGE   TOFCTR(DDB)             ;RETURN IMMEDIATELY IF NO ROOM\r
346         JRST    TTIOUT                  ;UNLESS MONITOR ERROR MESSAGE\r
347         CONO    PI,PIOFF                ;PREVENT PCTR AND PUTR DIFFERENCE\r
348         SOSLE   TOPCTR(DDB)             ;LAST BYTE IN BUFFER?\r
349         JRST    PUTCO1          ;NO. GO ON.\r
350         MOVE    TAC,TTOBUF(DDB) ;GET COUNT AND ADDRESS\r
351         HLRZM   TAC,TOPCTR(DDB) ;INITIAL COUNTER\r
352         HRLI    TAC,440700      ;MAKE A BYTE POINTER\r
353         MOVEM   TAC,TOPUTR(DDB) ;INITIAL POINTER\r
354 PUTCO1: IDBP    CHREC,TOPUTR(DDB)       ;PUT CHARACTER INTO BUFFER\r
355         CONO    PI,PION                 ;GET PI BACK ON\r
356         POPJ    PDP,\r
357 \f;ROUTINE TO CHECK IF A CHARACTER IS SPECIAL(ASCII 0-37, 175-177)\r
358 ;CALL   MOVE    CHREC,CHAR. TO BE CHECKED\r
359 ;       PUSHJ   PDP,SPCHEK\r
360 ;       RETURN1 IF REGULAR ASCII CHAR (40-174), C(TAC)=0\r
361 ;       RETURN2 IF SPECIAL CHAR., TAC LOADED WITH WORD FROM SPCTAB\r
362 \r
363 INTERNAL SPCHEK\r
364 \r
365 SPCHEK: MOVEI   TAC,0                   ;LOAD TAC WITH 0 OR SPECIAL CHAR. WORD\r
366         CAIGE   CHREC,40\r
367         JRST    SPCHK1\r
368         CAIG    CHREC,174\r
369         POPJ    PDP,\r
370         SKIPA   TAC,SPCTAB-135(CHREC)\r
371 \r
372 SPCHK1: MOVE    TAC,SPCTAB(CHREC)\r
373         JRST    CPOPJ1\r
374 \f;SPECIAL CHARACTER TABLE\r
375 ;FORMAT XWD BITS+CHAR,ADRESS OF ROUTINE\r
376 ;HIGH ORDER BITS IN LH:\r
377 \r
378 SPACTN=40000            ;SPECIAL ACTION TO BE TAKEN\r
379 SPOUT=100000            ;SPECIAL HANDLING ON UUO OUTPUT\r
380 BREAKB=20000            ;BREAK CHARACTER\r
381 SPHPOS=10000            ;CHARACTER AFFECTS HORIZONTAL POSITION\r
382 ECSBRK=4000             ;BREAK CHARACTER IN FCS(100) MODE\r
383 ECHSUP=2000             ;SUPRESS ECHO OF CHAR ITSELF\r
384 \r
385 SPCTAB: XWD     ECHSUP,0                        ;NULL\r
386         XWD     ECHSUP,0                        ;^A SOH\r
387         XWD     SPACTN+ECHSUP,CONTB             ;^B FULTWX SH\r
388         XWD     SPACTN+ECHSUP+BREAKB,CONTC      ;^C\r
389         XWD     ECHSUP,0                        ;^D EOT\r
390         XWD     ECHSUP,0                        ;^E WRU\r
391         XWD     SPACTN+ECHSUP,CONTF             ;^F T37 SW\r
392         XWD     FCSBRK,0                        ;^G (BELL)\r
393         XWD     SPACTN+SPHPOS,CONTH             ;^H OR BACKSPACE KEY\r
394         XWD     SPACTN+SPHPOS+SPOUT,CONTI       ;^I OR TAB\r
395         XWD     BREAKB,0                        ;^J OR LINE FEED\r
396         XWD     SPACTN+SPOUT+BREAKB,CONTK       ;^K OR VERT TAB\r
397         XWD     SPACTN+SPOUT+BREAKB,CONTL       ;^L OR FORM FEED\r
398         XWD     SPACTN+SPHPOS,CRLF              ;^M OR CARRIAGE RETURN\r
399         XWD     ECHSUP,0                        ;^N\r
400         XWD     SPACTN,CONTO                    ;^O SUPP OUTPUT\r
401         XWD     SPACTN+ECHSUP,CONTP             ;^P T35 SW\r
402         XWD     SPACTN+ECHSUP,CONTQ             ;^Q XON (PAPERTAPE)\r
403         XWD     ECHSUP,0                        ;^R TAPE PUNCH OFF\r
404         XWD     SPACN+ECHSUP,CONTS              ;^S XOFF\r
405         XWD     ECHSUP,0                        ;^T TAPE PUNCH OFF\r
406         XWD     SPACTN,CONTU                    ;^U DELETE LINE\r
407         XWD     ECHSUP,0                        ;^V\r
408         XWD     ECHSUP,0                        ;^W\r
409         XWD     ECHSUP,0                        ;^X\r
410         XWD     ECHSUP,0                        ;^Y\r
411         XWD     SPACTN+BREAKB+ECHSUP,CONTZ      ;^Z TTY EOF\r
412         XWD     SPACTN+BREAKB+ECHSUP,ALTMOD     ;ASCII 33 (ALT-MODE)\r
413         XWD     ECHSUP,0                        ;ASCII 34\r
414         XWD     ECHSUP,0                        ;ASCII 35\r
415         XWD     ECHSUP,0                        ;ASCII 36\r
416         XWD     ECHSUP,0                        ;ASCII 37\r
417 \r
418 ;ABOVE ARE CONTROL CHARACTERS, BELOW ASCII 175-177\r
419 \r
420         XWD     SPACTN+BREAKB+ECHSUP,ALTMOD     ;OLD DEC ALTMOD 175\r
421         XWD     SPACTN+BREAKB+ECHSUP,ALTMOD     ;ALT-MODE 176\r
422         XWD     SPACTN+ECHSUP+FCSBRK,RUBOUT     ;177 RUBOUT\r
423 \fIFN FTDDTM,<\r
424 \r
425 ;INPUT TO DDT\r
426 ;CALL AC,[SIXBIT /DDTIN/]       AC CONTAINS POINTER TO BUFFER AREA\r
427 ;BUFFER AREA MUST BE 21 WORDS LONG\r
428 \r
429 INTERNAL DDTIN\r
430 EXTERNAL WSYNC,IADRCK,ADRERR\r
431 EXTERNAL PTYOW\r
432 \r
433 DDTIN:  PUSHJ PDP,TTYFNU        ;SET UP DEVDAT,LINE\r
434         MOVE    IOS,[XWD TTYIOW+DDTM,IOACT]\r
435         IORB IOS,DEVIOS(DDB)    ;PUT INTO I/O WAIT\r
436         MOVE    TAC,TIPUTR(DDB)\r
437         CAMN    TAC,TITAKR(DDB) ;ANYTHING IN BUFFER;\r
438         PUSHJ   PDP,TWSYNC      ;NO, WAIT FOR SOME\r
439 DDTIW:  MOVE    IOS,[XWD TTYIOW,IOACT]\r
440         ANDCAB IOS,DEVIOS(DDB)\r
441 \r
442         MOVSI TAC,IOFST+DDTM\r
443         IORM TAC,DEVIOS(DEVDAT) ;STOP ALL IO\r
444         HRRZ TAC,@UUO           ;CONTENTS OF USER (DDT) AC\r
445         ADDI TAC,21\r
446         PUSHJ PDP,IADRCK\r
447         JRST ADRERR\r
448         SUBI TAC,21\r
449         PUSHJ PDP,IADRCK\r
450         JRST ADRERR\r
451         MOVSI   AC2,440700+PROG\r
452         HRR     AC2,TAC\r
453         MOVE    TAC1,TIPUTR(DDB)\r
454         MOVEI   DAT,TTIBUF(DDB)\r
455         MOVEI   AC1,<21*5>-1    ;NUMBER OF CHARACTERS ALLOWED\r
456 \fXFRIN: PUSHJ   PDP,GETCHR      ;TRANSFER INTO USER'S AREA\r
457         JUMPE   CHREC,XFRIN2\r
458         PUSHJ   PDP,SPCHEK\r
459         JRST    XFIN1\r
460         TLNE    TAC,FCSBRK+BREAKB\r
461         SOS     TISYNC(DDB)\r
462 XFRIN1: CAIN    CHREC,3         ;PRESTORED CONTROL C?\r
463         JRST    DDONC           ;YES, GO INTO MONITOR MODE\r
464         IDPB    CHREC,AC2\r
465         SOJG    AC1,XFRIN               ;LOOP TILL DONE\r
466 XFRIN2: MOVEI   CHREC,0         ;TERMINATE STRING\r
467         IDPB    CHREC,AC2\r
468         MOVSI TAC,IOSUPR        ;MAKE SURE IO NO LONGER SUPR.\r
469         ANDCAM TAC,DEVIOS(DEVDAT)\r
470         POPJ PDP,\r
471 \r
472 DDTCNC: PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
473         JRST    MONUS6          ;GO PROCESS ^C\r
474 >\r
475 \r
476 EXTERNAL PTYOW,WSYNC\r
477 \r
478 ;TWSYNC IS CALLED FOR INPUT IO WAIT\r
479 \r
480 TWSYNC: TLNE    LINE,PTYLIN     ;PSEUDO TELETYPE TTYDDB?\r
481         PUSHJ   PDP,PTYOW       ;SET OUTPUT WAIT BIT IN PTY DEVIOS WORD\r
482         TLNE    LINE,XON        ;DO WE WANT TO START RDR?\r
483         TLNE    LINE,PTYLIN+HLFDPX+FULTWX       ;CAN WE?\r
484         JRST    WSYNC           ;NO\r
485         MOVEI   CHREC,21        ;READER START CHAR\r
486         PUSHJ   PDP,OUTCHS      ;TO OUTPUT BUFFER\r
487         PUSHJ   PDP,UTYPET      ;START TTY, AND\r
488         JRST    WSYNC           ;WAIT FOR INPUT\r
489 \fEXTERNAL WSYNC,IADRCK,ADRERR,CPOPJ\r
490 EXTERNAL JOBPFI,GETWD1\r
491 \r
492 IFN FTDDTM,<\r
493 ;OUTPUT FROM DDT\r
494 ;CALL AC,[SIXBIT /DDTOUT/]      AC HAS POINTER TO DDT OUTPUT BUFFER\r
495 \r
496 INTERNAL DDTOUT\r
497 \r
498 DDTOUT: PUSHJ PDP,TTYFNU\r
499         MOVE    UUO,@UUO\r
500 >\r
501 \r
502 DDT5:   MOVSI   IOS,IO+DDTM\r
503         IORB    IOS,DEVIOS(DDB)\r
504         HRLI    UUO,PROG        ;POINT TO USER AC\r
505         HRRI    UUO,-1(PROG)            ;COMPENSATE FOR GETWD1\r
506 DDT2:   MOVE    DAT,[XWD 440700,TAC]    ;BYTE POINTER TO TAC\r
507         PUSHJ   PDP,GETWD1              ;GET THE USER'S WORD\r
508 DDT3:   TLNN    DAT,760000              ;ANY CHARS LEFT?\r
509         JRST    DDT2                    ;NO, GET ANOTHER WORD\r
510 DDT4:   ILDB    CHREC,DAT               ;BYTE FROM TAC\r
511         JUMPE   CHREC,DDTUTT            ;NULL IS END OF STRING\r
512         PUSHJ   PDP,OUTCHR      ;PLACE CHAR IN OUTPUT BUFFER\r
513         JUMPN   CHREC,DDT3      ;LOOP IF CHARACTER WAS PLACED\r
514         ADD     DAT,[XWD 070000,0]      ;BACK UP POINTER\r
515         PUSH    PDP,DAT                 ;SAVE BYTE POINTER TO TAC\r
516         PUSH    PDP,TAC                 ;AND SAVE THE CHARS IN TAC\r
517         PUSHJ   PDP,DDTUTT              ;START OUTPUT\r
518 \r
519 DDTWAT: MOVEI IOS,IOACT         ;WAIT UNTIL MONITOR BUFFER EMPTY\r
520         IORB IOS,DEVIOS(DDB)\r
521         PUSHJ PDP,WSYNC\r
522         POP PDP,TAC                     ;RESTORE CHARSIN TAC\r
523         POP PDP,DAT                     ;RESTORE BYTE POINTER TO TAC\r
524         JRST DDT3                       ;TRY AGAIN\r
525 \r
526 DDTUTT: PUSHJ   PDP,TTYFNU              ;RESTORE DAT,LINE\r
527         JRST    UTYPET                  ;AND START OUTPUT\r
528 \f;MORE CHARACTER AND BUFFER HANDLING ROUTINES\r
529 \r
530 ;OUTCHR CALLED AT UUO LEVEL TO OUTPUT A CHARACTER\r
531 ;DAT AND DDB MUST BE SET UP\r
532 ;CHECK IS MADE FOR WHETHER SPECIAL ECHO IS REQUIRED\r
533 ;RIGHT THINGS ARE DONES WITH PHPOS & HPOS(NEEDNT BE SET)\r
534 ;CALL   MOVE    CHREC,CHAR TO BE OUTPUT\r
535 ;       PUSHJ   PDP,OUTCHR\r
536 ;       ONLY RETURN, WITH CHAR, OR ITS SPECIAL ECHO PLACED IN OUT BUFFER\r
537 \r
538 INTERNAL OUTCHS\r
539 \r
540 OUTCHR: TLNE    IOS,IOSUPR      ;I/O OFF BY ^O?\r
541         POPJ    PDP,            ;YES. RETURN\r
542         MOVEI   HPOS,20         ;CHECK FREE SPACE\r
543         CAML    HPOS,TOFCTR(DDB)        ; FOR EXPANDING CHARS\r
544         JRST    GETCH1          ;NOT ENOUGH ROOM\r
545 OUTCHS: PUSH    PDP,TAC\r
546         PUSH    PDP,HPOS\r
547         PUSH    PDP,TAC1        ;SAVE LINE\r
548         PUSHJ   PDP,STLNAC      ;GET LINE DATA\r
549         ANDI    CHREC,177       ;MASK ANYT JUNK\r
550         LDB     HPOS,PHPOS      ;GET HORIZONTAL POSITION\r
551         PUSHJ   PDP,ADJHP               ;NEW HPOS AFTER CHAR OUTPUT\r
552         JFCL\r
553         TLNE    LINE,DISLIN+PTYLIN      ;IS IT A DISPLAY OR PTY?\r
554         JRST    OUTCH2          ;YES, IGNORE HPOS AND FILLERS\r
555         CAIL    HPOS,^D72       ;DID IT GO OVER LINE?\r
556         PUSHJ   PDP,CRLFEC      ;YES, OUTPUT CRLF\r
557         TLNE    TAC,SPOUT       ;VT,FF,HT?\r
558         JUMPGE  LINE,OUTCH1     ;YES, HANDLE THEM UNLESS PTY\r
559 OUTCH2: PUSHJ   PDP,PUTCHO      ;PLACE IN BUFFER\r
560 OUTCH3: DPB     HPOS,PHPOS      ;UPDATE IN CORE\r
561         POP     PDP,TAC1        ;RESTORE LINE\r
562         POP     PDP,HPOS\r
563         JRST    TPOPJ\r
564 \f;HERE ON UUO OUTPUT OF HT,FF,VT\r
565 \r
566 OUTCH1: PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
567         TLNE    LINE,T35        ;SMART TTY?\r
568         JRST    OUTC1A          ;YES\r
569         MOVE    TAC,CHREC       ;COPY THE CHARACTER\r
570         MOVEI   CHREC,40        ;STUPID TTY.\r
571         LDB     HPOS,PHPOS      ;GET OLD POSITION\r
572         CAIE    TAC,11          ;H TAB?\r
573         MOVEI   CHREC,12        ;NO. OUTPUT LF'S.\r
574 OUTC1C: CAIN    TAC,14          ;FF?\r
575         MOVNI   HPOS,10         ;YES. 8 LF'S\r
576         CAIN    TAC,13          ;VT?\r
577         MOVNI   HPOS,4          ;YES. 4 LF'S\r
578 OUTC1B: PUSHJ   PDP,PUTCH0      ;OUTPUT THE PHONEY CHAR\r
579         ADDI    HPOS,1          ;COUNT THE OUTPUTS\r
580         TRNE    HPOS,7          ;ENOUGH?\r
581         JRST    OUTC1B          ;NO. MORE.\r
582         JRST    OUTCH3          ;NO MORE.\r
583 \r
584 OUTC1A: ;HERE ON OUTPUT OF SLOW CHARS TO SMART TTY\r
585         PUSHJ   PDP,PUTCH0      ;SENT THE REAL CHAR\r
586         MOVE    TAC,CHREC       ;COPY THE CHARACTER\r
587         MOVEI   CHREC,IOLECH    ;A DELAY CHARACTER\r
588         SUBI    HPOS,2          ;TWO SHLUFF CHARACTERS\r
589         JRST    OUTC1C          ;GO OUTPUT THE SLUFFS.\r
590                                 ;COUNT WILL BE MODIFIED ON VT,FF\r
591 \r
592                         ;CALLED AT UUO AND INT LEVEL\r
593                         ;TO ADJUST HPOS FOR OUTPUT OF CHREC\r
594                         ;SKIPS IF SPCHECK SAYS SPECIAL CHAR\r
595 \r
596 ADJHP:  CAIL    CHREC,174       ;HIGH SPECIALS?\r
597         JRST    SPCHEK          ;YES, NO HPOS MOTION\r
598         CAIL    CHREC,40        ;CONTROL CHARACTERS?\r
599         AOJA    HPOS,SPCHEK     ;NO. COUNT HPOS FOR PRINT CHAR\r
600         CAIN    CHREC,10        ;BACKSP?\r
601         SOJL    HPOS,.+2        ;YES\r
602         CAIN    CHREC,15        ;CARRIAGE RETURN?\r
603         MOVEI   HPOS,0          ;YES.\r
604         CAIE    CHREC,11        ;TAB?\r
605         JRST    SPCHEK          ;NO. NO HP MOD\r
606         TRO     HPOS,7          ;TAB. TO NEXT 8\r
607         AOJA    HPOS,SPCHEK\r
608 \fINTERNAL FTCHECK,FTMONP\r
609 IFN FTCHECK+FTMONP,<\r
610 EXTERNAL SCNDDB,TTYLST,TTIBUF,TIPUTR,TITAKR,TITCTR,TIFCTR,TISYNC\r
611 EXTERNAL TTOBUF,TOPUTR,TOPCTR,TOTAKR,TTYCHR,SCNDDS,CCHAR,LINSAV\r
612 EXTERNAL TOTCTR,TOFCTR\r
613 >\r
614 IFE FTCHECK+FTMONP,<\r
615 \f;DESCRIPTION OF DEVICE DATA BLOCK FOR TELETYPES\r
616 ;THERE IS ONE DEVICE DATA BLOCK FOR EACH JOB THAT CAN BE INITIALIZED\r
617 ;UNDER TIME-SHARING, WHETHER THIS JOB IS ATTACHED TO A PHYSICAL LINE\r
618 ;NUMBER OR NOT, THEREFORE THERE SHOULD BE ONE DDB FOR EVERY LINE NUMBER\r
619 ;PLUS ONE FOR EVERY PSEUDO-TELETYPE PLUS ONE FOR EVERY ADDITIONAL JOB\r
620 ;THAT AN INSTALATION MAY WISH TO RUN DETACHED FROM A PHYSICAL LINE\r
621 ;PLUS ONE DDB TO PRINT ERROR MESSAGES WHEN ALL JOBS (DDB'S ARE\r
622 ;INITIALIZED.\r
623 ;THE FUNCTIONS OF THE FIRST EIGHT WORDS ARE AS DESCRIBED IN THE\r
624 ;COMMENTS IN THE SYSTEM PARAMETER TAPE( FILE NAME S). LOCATION 11\r
625 ;THROUGH 27 (OCTAL) RELATIVE TO SCNDDB PERTAIN DIRECTLY TO THE\r
626 ;SCANNER SERVICE BUFFERING SCHEME. THE SUBSEQUENT 2*20(OCTAL) LOCATIONS\r
627 ;ARE CURRENTLY THE TWO TELETYPE BUFFERS. THEY NEED NOT BE IN THE DDB\r
628 ;AS LONG AS THEIR ADDRESSES ARE PLACED IN THE RIGHT HALF OF TTIBUF.\r
629 ;AND TTOBUF EITHER AT ASSEMBLY, BUILD OR RUN TIME, IF DYNAMIC\r
630 ;BUFFER CONSTRUCTION IS TO BE ADDED THESE BUFFERS MAY BE PLACED ANYWHERE IN\r
631 ;FRE CORE STORAGE, AND THE RIGHT HALF OF THE REQUIRED TTXBUF(WHERE "X"\r
632 ;MAY BE "I" OR "O")MAY BE LOADED ONLY WHEN THAT BUFFER IS REQUIRED.\r
633 \r
634 ;THERE ARE TWO BUFFERS, EACH OF WHICH IS A "RING" UNTO ITSELF:\r
635 ;INPUT---POINTED TO BY TTIBUF\r
636 ;       ALL CHARACTERS TYPED GO INTO THIS BUFFER, IN ADDITION, ALL\r
637 ;OTHER COMMANDS TO BE READ BY THE COMMAND INTERPRETER IN COMCON\r
638 ;(APRSER) ARE STORED HERE,\r
639 ;OUTPUT BUFFER---POINTED TO BY TTOBUF\r
640 ;       ALL CHARACTERS THAT ARE OUTPUT ARE PLACED SEQUENTIALLY IN THIS\r
641 ;BUFFER; THIS INCLUDES ECHOED CHARACTERS AS WELL AS NORMAL OUTPUT OF\r
642 ;CHARACTER STRINGS.\r
643 \r
644 ;THERE ARE NINE BUFFER PARAMETER WORDS ASSOCIATED WITH EACH BUFFER\r
645 ;(EXCEPT FOR THE OUTPUT BUFFER, WHICH ONLY NEEDS SIX), THE LAST\r
646 ;FOUR CHARACTERS IUN THE MNEMONIC DESCRIBES THE FUNCTION OF THE WORD\r
647 ;WHILE THE FIRST TWO CHARACTERS IDENTIFY WHICH BUFFER THAT THE\r
648 ;FUNCTION APPLIES TO. THE FORMULA FOR THESE WORDS IS TX'FUNC, WHERE\r
649 ;THE RELATIVE POSITION OF ALL TX'FNC1 TO TTX'BUF IS THE SAME FOR\r
650 ;ALL BUFFERES. IN THE MANNER, THE ADDRESS OF TTX'BUF IS LOADED INTO\r
651 ;ACCUMULATOR DAT, AND THE RELATIVE POSITIONS FUNCT1-FUNCT9 ARE\r
652 ;DEFINED TO BE 0-10(OCTAL); I.E., FUNCT(DAT) WILL IDENTIFY THE DESIRED\r
653 ;BUFFER PARAMETER WORD REGARDLESS OF BUFFER.\r
654 \f;FOLLOWING ARE DEFINITIONS OF THE RELATIVE BUFFER PARAMETER WORDS:\r
655 ;TTX'BUF OR BUF(DAT)---THE LEFT HALF CONTAINS NUMBER OF BYTES IN BUFFER AND THE RIGHT\r
656 ;       HALF THE ADDRESS OF THE FIRST WORD OF THE BUFFER, THIS WORD IS\r
657 ;       ONLY READ BY THE CURRENT CODE.  UPON THE ADDITION OF DYNAMIC\r
658 ;       BUFFER ALLOCATION. THIS WORD WOULD BE LOADED IN THE SAME FORMAT\r
659 ;       AT THE TIME THAT THE BUFFER WOULD BE BUILT.\r
660 ;\r
661 ;SCNINI SETS BUFFERS TO LENGTH TTYCHR AT PRESENT. ALSO\r
662 ;PRESENT CODE OCCASIONALLY USES TTYCHR RATHER THEN READING LH\r
663 ;OR TTXBUF\r
664 ;\r
665 ;TX'PUTR OR PUTR(DAT)---BYTE POINTER USED TO PLACE CHARACTERS INTO THE\r
666 ;       BUFFER. IT MUST ALWAYS BE AHEAD OF OR EQUAL TO THE TAKER POINTER.\r
667 ;TX'PCTR OR PCTR(DAT)---COUNT OF NUMBER OF TIMES THAT PUTR MAY BE INCREMENTED\r
668 ;       BEFORE REACHING THE LAST BYTE IN THE LAST WORD OF THE BUFFER\r
669 ;       (NOT THE AMMOUNT OF FREE SPACE LEFT)\r
670 ;TX'TAKR OR TAKR(DAT)---BYTE POIUNTER USED BY ALL ROUTINES TO PICK UP\r
671 ;       CHARACTERS FRM THE BFFER. WHEN THE TAKR IS EQUAL TO THE PUTR.\r
672 ;       THE BUFFER IS "EMPTY".\r
673 ;TX'TCTR OR TCTR(DAT)---COUNT OF THE NUMBER OF TIMES THAT THE TAKR CAN\r
674 ;       BE INCREMENTED BEFORE REACHING THE PHYSICAL END OF THE BUFFER.\r
675 ;TX'FCTR OR FCTR(DAT)---FREE CHARACTER COUNT; I.E., HOW MANY TIMES MAY THE\r
676 ;       PUTR BE INCREMENTED BEFORE IT WOULD COME AROUND AND "STEP ON"\r
677 ;       THE TAKR, WHEN THE FREE CHAR. COUNT IS ZERO, NO MORE CHARACTERS\r
678 ;       MAY BE PLACED IN THE BUFFER (USUAL RESULT IS GOING INTO IO WAIT)\r
679 ;TISYNC---COUNT OF NUMBER OF "LINES" THAT HAVE BEEN TYPED\r
680 ;       INTO INPUT BUFFER.\r
681 \f;SCANNER DEVICE DATA BLOCK\r
682 ;REMAINING SCN DDB'S ARE GENERATED\r
683 ;OUT OF LINE AT BUILD TIME.\r
684 \r
685 INTERNAL SCNDDB,LINSAV\r
686         TTYLST=.        ;FIRST TTT DDB\r
687         ZZ=.\r
688 SCNDDB: SIXBIT  /TTY0/          ;DEVNAME\r
689         XWD     0,STTYBF+1              ;DEVCHR\r
690         Z                       ;DEVIOS\r
691         EXP     SCNDSP          ;DEVSER\r
692         XWD     DVTTY+DVIN+DVOUT,3      ;DEVMOD\r
693         Z                               ;DEVLOG\r
694         Z               ;DEVBUF\r
695         XWD     PROG,0          ;DEVIAD, PHPOS BITS 6-12\r
696         XWD     PROG,0          ;DEVOAD, PFITCH BITS 0-8\r
697         XP      TTYPTR,.-ZZ             ;TTYPTR\r
698         Z                       ;PLASTC,PLSTLC,PCOMIC,POSAVCH,TOIP\r
699         XP      TISYNC,.-ZZ\r
700         Z\r
701         XP      TTIBUF,.-ZZ\r
702         XWD     STTYBF*5,0      ;RH IS BUFFER ADR\r
703         XP      TIPUTR,.-ZZ\r
704         Z\r
705         XP      TIPCTR,.-ZZ\r
706         Z\r
707         XP      TITAKR,.-ZZ\r
708         Z\r
709         XP      TITCTR,.-ZZ\r
710         Z\r
711         XP      TIFCTR,.-ZZ\r
712         Z\r
713 \f       XP      SYSPDL,.\r
714 ;BUFFER USED AS PUSH-DOWN LIST BY SYSTEM DURING\r
715 ;INITIALIZATION AND RESTARTING\r
716 \r
717         XP      TIBF,.-ZZ\r
718         REPEAT STTYBF,< 0>\r
719         XP      TTOBUF,.-ZZ\r
720         XWD     STTYBF*5,0\r
721         XP      TOPUTR,.-ZZ\r
722         Z\r
723         XP      TOPCTR,.-ZZ\r
724         Z\r
725         XP      TOTAKR,.-ZZ\r
726         Z\r
727         XP      TOTCTR,.-ZZ\r
728         Z\r
729         XP      TOFCTR,.-ZZ\r
730         Z\r
731 \f       XP      TOBF,.-ZZ\r
732         REPEAT STTYBF,<0>\r
733 ;NO. OF CHAR. IN MON. BUF.\r
734 \r
735         XP      TTYCHR,<<STTYBF>*5>\r
736         XP      SCNDDS,.-ZZ     ;SIZE OF SCN DDB\r
737 \r
738 LINSAV: 0\r
739 >       ;CLOSE IFE FTMONP WAY BACK\r
740 \f;DEVICE DEPENDENT PART OF IO UUOS.\r
741 \r
742 \r
743 ;DISPATCH TABLE\r
744 \r
745 INTERNAL        SCNDSP\r
746 EXTERNAL OUT,SCNON,SCNOFF\r
747 \r
748         JRST    TTYINI          ;INITIALIZATION\r
749         JRST    CPOPJ1          ;TTY HUNG TIME-OUT, IGNORE\r
750 SCNDSP: JRST    TTYREL          ;RELEASE\r
751         JRST    OUT             ;CLOSE\r
752         JRST    TTYOUT          ;OUTPUT\r
753 \r
754 TTYIN:  MOVE    IOS,[XWD TTYIOW,IOACT]  ;INDICATE INPUT WAIT\r
755         IORB    IOS,DEVIOS(DDB)\r
756         MOVSI   IOS,DDTM+TPMON\r
757         ANDCAB  IOS,DEVIOS(DDB)\r
758         PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
759 IFN FTHDPX,<\r
760         TLNE    LINE,HLFDPX\r
761         TLNN    IOS,IO\r
762 >\r
763 TTYIN1: SKIPG   TISYNC(DDB)\r
764         PUSHJ   PDP,TWSYNC\r
765         PUSHJ   PDP,MONUSR\r
766 TENDIN: MOVE    IOS,[XWD TTYIOW+DDTM+IOSUPR,ECHOF+MERTP+IGNOR+IOACT]\r
767 T0POPJ: ANDCAB  IOS,DEVIOS(DDB)\r
768         POPJ    PDP,\r
769 \f;ROUTINE TO MOVE A LINE OR STRING FROM TTY INPUT BUFFER TO USER'S INPUT BUFFER\r
770 ;CALLED ONLY FROM UUO LEVEL,FROM INPUT UUO ONLY\r
771 \r
772 EXTERNAL ADVBFF,STTIOD,BUFCLR\r
773 \r
774 MONUSR: HRRZ    TAC,DEVIAD(DDB)         ;ADDRESS OF BUFFER IN USER AREA\r
775         PUSHJ   PDP,BUFCLR              ;CLEAR WHOLE BUFFER\r
776         JRST    ADRERR                  ;ADDRESS CHECK RETURN\r
777         PUSHJ   PDP,STLNAC      ;SETUP LINE\r
778         MOVEI   AC2,TTYCHR              ;MAX NR OF CHARACTERS\r
779         MOVEI   AC1,@DEVIAD(DDB)        ;ADDRESS OF USR BUFFER-1\r
780         ADD     AC1,[XWD 10700,1]       ;MAKE BYTE POINTER POINT RIGHT\r
781         MOVEI   DAT,TTIBUF(DDB)         ;SPECIFY USER MODE INPUT BUFFER\r
782 \r
783 MONUS1: PUSHJ   PDP,GETCHR              ;GET A CHAR, FROM IT\r
784         JUMPE   CHREC,MONUS3            ;ZERO IMPLIES EMPTY BFR\r
785         IDPB    CHREC,AC1               ;PLACE CHAR. IN USER BUFFER\r
786         PUSHJ   PDP,SPCHEK              ;SPECIAL CHARACTER?\r
787         JRST    MONUS2                  ;NO\r
788 \r
789         TLNE    TAC,FCSBRK+BREAKP       ;A BREAK CHARACTER?\r
790         SOSA    TISYNC(DDB)             ;SOME BREAK, COUNT IT DOWN\r
791 MONUS2: SOJG    AC2,MONUS1              ;NO, USER BUFFER FULL?\r
792         CAIN    CHREC,3                 ;STORED CONTROL C?\r
793         JRST    MONUS7                  ;YES, HANDLE IT\r
794         MOVEI   IOS,0\r
795         CAIN    CHREC,"Z"-100           ;^Z READ?\r
796         MOVSI   IOS,IOEND\r
797         IORB    IOS,DEVIOS(DDB)\r
798 \r
799 MONUS3: MOVEI   AC2,@DEVIAD(DDB)        ;BREAK CHAR OR COUNTED OUT, INPUT UUO DONE\r
800         SUBI    AC1,1(AC2)              ;CALCULATE NUMBER OF WORDS\r
801         HRRM    AC1,1(AC2)              ;STORE IN 3RD BUFFER WORD\r
802 \r
803 MONUS4: PUSHJ   PDP,ADVBFF              ;INPUT UUO DONE,NEXT BUFFER FULL?\r
804         JRST    MONUS5                  ;YES, INPUT REALLY IS DONE\r
805         SKIPLE  TISYNC(DDB)             ;NO, DO WE HAVE MORE LINES FOR IT?\r
806         JRST    MONUS8                  ;YES, GIVE USER NEXT LINE, TOO\r
807 \r
808 MONUS5: MOVSI   IOS,IOFST\r
809         IORB    IOS,DEVIOS(DDB)\r
810         TLZE    IOS,IOW                 ;TTY IN INPUT WAIT?\r
811         PUSHJ   PDP,STTIOD              ;YES., TAKE IT OUT OF IT\r
812         POPJ    PDP,0\r
813 \fMONUS6:        PUSHJ   PDP,CNCMOD              ;CONTROL C MODE\r
814         MOVSI   TAC,70000               ;DECREMENT TAKR POINTER\r
815         ADDM    TAC,TITAKR(DDB)         ;SO NEXT ILDB WILL GET ^C\r
816         AOS     TITCTR(DDB)             ;ADJUST COUNTER\r
817         SOS     TIFCTR(DDB)             ;ADJUST FREE CHAR. COUNT\r
818         AOS     TISYNC(DDB)     ;SEE THE ^C AGAIN\r
819         PUSHJ   PDP,COMSET              ;WAKE UP COMMAND DECODER\r
820         JRST    WSYNC                   ;AND WAIT FOR INTERPRETATION\r
821 \r
822 MONUS7: MOVE    IOS,[XWD TTYIOW,IOACT]\r
823         IORB    IOS,DEVIOS(DDB) ;PUT JOB BACK IN IOWAIT\r
824         PUSHJ   PDP,MONU6\r
825         JRST    TTYIN   ;RESTART INPUT UUO\r
826 \r
827 MONUS8: TLNN    IOS,IOEND       ;ROOM FOR ANOTHER BUFFER, ^Z SEEN?\r
828         JRST    MONUSR          ;NO, GO PASS ANOTHER LINE\r
829         POPJ    PDP,            ;YES, LET UUOCON HANDLE EOF\r
830 \f;OUTPUT UUO\r
831 \r
832 EXTERNAL PTYPE,ADVBFE\r
833 \r
834 TTYOUT: MOVSI   IOS,IOBEG\r
835         TDNE    IOS,DEVIOS(DDB)\r
836         TLO     IOS,IOSUPR              ;KILL ^O ON FIRST OUTPUT\r
837         IOR     IOS,[XWD TPMON+DDTM,ECHOF+MERTPO+IGNOR+IOACT]\r
838         ANDCAM  IOS,DEVIOS(DDB)\r
839         MOVSI   IOS,IO+IOFST\r
840         IORB    IOS,DEVIOS(DDB)\r
841 \r
842         PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
843         PUSH    PDP,LINE                ;SAVE INFO\r
844         PUSHJ   PDP,USRMON      ;MOVE USER'S BUFFER TO TTO BUFFER\r
845         PUSHJ   PDP,ADVBFE              ;ADVANCE USER'S HEADERS\r
846         SKIPA\r
847         JRST .+3                        ;MOVE BUFFERS AVAILABLE\r
848 \r
849         MOVEI   IOS,IOACT               ;NO MORE BUFFERS\r
850         ANDCAB  IOS,DEVIOS(DDB)         ;CLEAR ACTIVE IN IOS\r
851         POP     PDP,LINE                ;RESTORE LINE INFO\r
852 UTYPET: JUMPL   LINE,PTYPE      ;START PTY EXCHANGE IF PTY LINE\r
853         MOVSI   TAC,TOIP\r
854         CONO PI,PIOFF   ;PREVENT TIMING GLITCH\r
855         TDNN    TAC,TTYPTR(DDB)         ;IS TYPE-OUT ALREADY ON?\r
856         JRST    UTYPE1\r
857         CONO    PI,PION\r
858         POPJ    PDP,0\r
859 \r
860 UTYP1:  IORM    TAC,TTYPTR(DDB)         ;START TYPEOUT\r
861         JRST    XMTIN1\r
862 \f;ROUTINE TO MOVE USER OUTPUT BUFFER TO MON. OUTPUT BUFFER\r
863 ;CALLED ONLY AT UUO LEVEL,BY OUTPUT UUO\r
864 \r
865 EXTERN UADRCK\r
866 \r
867 USRMON: MOVEI   AC2,@DEVOAD(DDB)        ;ADDRESS OF 2ND BUFFER WORD\r
868         MOVE    AC2,1(AC2)              ;NUMBER OF WORDS TO OUTPUT\r
869         IMULI   AC2,5                   ;NR OF CHARACTERS\r
870 \r
871 USRMN1: HRRZ    AC1,DEVOAD(DDB)         ;ADDRESS OF BUFFER\r
872         PUSHJ   PDP,UADRCK              ;MAKE SURE IT IS OK\r
873         ADD     AC1,[XWD 10700+PROG,1]  ;MAKE POINTER RELOCATABLE\r
874 \r
875 USRMN2: ILDB    CHREC,AC1               ;PICK UP CHARACTER\r
876 USRMN4: JUMPE   CHREC,USRMN5            ;IF NULL, IGNORE\r
877         PUSHJ   PDP,OUTCHR              ;PLACE IN OUTPUT BUFFER\r
878         JUMPE   CHREC,USRMN3            ;IF NO MORE ROOM IN MON. BUFFER\r
879 \r
880 USRMN5: SOJG    AC2,USRMN2              ;LOOP AS LONG AS THERE ARE CHAR'S,\r
881         POPJ    PDP,                    ;DONE\r
882 \r
883 USRMN3: PUSH    PDP,AC2                 ;NUMBER OF CHARACTERS TO GO\r
884         PUSH    PDP,AC1                 ;SAVE RELOCATABLE POINTER\r
885         MOVE    LINE,-3(PDP)            ;GET SAVED LINE CHAR WORD\r
886         PUSHJ   PDP,TTOUWS              ;WAIT FOR ID\r
887         POP     PDP,AC1                 ;RESTORE POINTER\r
888         POP     PDP,AC2                 ;RESTORE COUNT\r
889         MOVE    IOS,DEVIOS(DDB)         ;RESTORE IOS\r
890         LDB     CHREC,AC1               ;GET LAST CHARACTER\r
891         JRST    USRMN4                  ;RETURN TO OUT LOOP\r
892 \r
893 TTOUWS: MOVE    IOS,[XWD IO,IOACT]      ;SET DEVICE ACTIVE (TTY)\r
894         IORB    IOS,DEVIOS(DDB)\r
895         PUSHJ   PDP,UTYPET              ;START TYPING IF NEEDED\r
896         JRST    WSYNC                   ;WAIT TILL ROOM IN BUFFER\r
897 \f;TTCALL - QUANTITY IN AC FIELD DETERMINES ACTION OF UUO (051)\r
898 \r
899 INTERNAL TTYUUO\r
900 EXTERN  UADCK1\r
901 \r
902 TTYUUO: PUSHJ   PDP,TTYFNU\r
903         CAIL    UCHN,TTUUOL             ;TOO HIGH AC FIELD?\r
904         POPJ    PDP,                    ;YES, NO-OP\r
905         CAIE    UCHN,1          ;A READ OPERATION?\r
906         CAIN    UCHN,3          ;I.E., PURE?\r
907         JRST    @TTUUOT(UCHN)   ;YES. DONT ADR CHECK\r
908         HRRZ    AC1,UUO\r
909         PUSHJ   PDP,UADCK1\r
910         JRST    @TTUUOT(UCHN)           ;DISPATCH TO UUO ROUTINES\r
911 \r
912 TTUUOT: EXP     INCHRW                  ;(0)INPUT CHAR. WAIT TILL TYPED\r
913         EXP     ONEOUT                  ;(1)OUTPUT A CHARACTER\r
914         EXP     INCHRS                  ;(2)INPUT A CHAR. & SKIP\r
915 \r
916         EXP     OUTSTR                  ;(3)OUTPUT A STRING\r
917         EXP     INCHWL                  ;(4)INPUT CHAR, WAIT.LINE MODE\r
918         EXP     INCHSL                  ;(5)INPUT CHAR, SKIP. LINE MODE\r
919         EXP     GETLIN                  ;(6)GET LINE CHARACTERISTICS WORD\r
920         EXP     SETLIN                  ;(7)SET BITS IN LH LINTAB\r
921         EXP     TRESOU                  ;(10)BACK UP POINTER TO COMMAND\r
922         EXP     SETBFI                  ;(11)CLEAR INPUT BUFFER\r
923         EXP     SETBF2                  ;(12)CLEAR OUTPUT BUFFER\r
924         EXP     SKPINC                  ;(13)SKIP IF CHAR TO INPUT\r
925         EXP     SKPINL                  ;(14)SKIP IF LINE TO INPUT\r
926 \r
927 TTUUOL=.-TTUUOT\r
928 \f;INPUT A CHARACTER AND SKIP---IF NONE TYPED, DON'T SKIP\r
929 \r
930 INCHSL: SKIPG   TISYNC(DDB)     ;ANY LINES IN BUFFER?\r
931         POPJ    PDP,0           ;NO, RETURN\r
932 INCHRS: MOVEI   DAT,TTIBUF(DDB)         ;GET A CHARACTER\r
933         PUSHJ   PDP,GETCHR              ;FROM TTI BUFFER\r
934         JUMPE   CHREC,CPOPJ             ;RETURN IF NULL(EMPTY BUFFER)\r
935         PUSHJ   PDP,SPCHEK\r
936         JFCL\r
937         TLNE    TAC,FCSBRK+BREAKB\r
938         SOS     TISYNC(DDB)     ;KEEP BREAK COUNT RIGHT\r
939         PUSHJ   PDP,TENDIN              ;CLEAR UP IOACT, IOSUPR, ETC\r
940         CAIN    CHREC,3\r
941         JRST    MONUS6          ;STORED ^C\r
942         MOVEM   CHREC,@UUO              ;MOVE INTO LOC, SPECIFIED BY UUO\r
943         JRST    CPOPJ1                  ;AND SKIP RETURN\r
944 \r
945 ;INPUT CHARACTER AND WAIT, LINE MODE\r
946 \r
947 INCHWL: PUSHJ   PDP,INCHSL              ;SEE IF ANY CHARS.\r
948         JRST    .+2     ;NO\r
949         POPJ    PDP,0           ;YES. GIVE IT TO USER\r
950         MOVE    IOS,[XWD TTYIOW,IOACT]  ;NONE, WAIT FOR IT\r
951         IORM    IOS,DEVIOS(DDB)         ;TTY TO IOW STATE\r
952         MOVSI   IOS,DDTM        ;JUST IN CASE\r
953         ANDCAB  IOS,DEVIOS(DDB) ;CLEAR DDTMODE BREAK FLAG\r
954         PUSHJ   PDP,TWSYNC      ;WAIT FOR CHAR\r
955         JRST    INCHWL  ;AND TRY AGAIN\r
956 \r
957 ;OUTPUT A STRING\r
958 \r
959 OUTSTR: JRST    DDT5                    ;JUST USE DDT OUTPUT CODE\r
960 \r
961 SKPINL: SKIPLE  TISYNC(DDB)             ;INPUT BUFFER HAVE A LINE?\r
962         AOS     0(PDP)                  ;YES, SKIP.\r
963         POPJ    PDP,0                   ;RETURN\r
964 \r
965 SKPINC: HLRZ    TAC,TTIBUF(DDB) ;SIZE OF IN BUFFER\r
966         CAMLE   TAC,TIFCTR(DDB)         ;SIZE > # FREE CHARS?\r
967         AOS     0(PDP)                  ;YES. SKIP.\r
968         POPJ    PDP,0                   ;RETURN.\r
969 \f;MORE ROUTINES CALLED BY TTY UUO DISPATCHER\r
970 \r
971 EXTERNAL TTPLEN,GETWDU\r
972 \r
973 ;INCHRW GOES INTO I/O WAIT IF NO CHARACTER HAS BEEN TYPED--NO SKIPS\r
974 \r
975 INCHRW: PUSHJ   PDP,INCHRS              ;GET ACHAR IF ONE IS THERE\r
976         JRST    .+2                     ;NONE THERE\r
977         POPJ    PDP,                    ;CHAR, PICKED UP AND STORED\r
978         MOVE    IOS,[XWD TTYIOW+ODTM,IOACT][    ;SETUP FOR IOWAIT\r
979         IORB    IOS,DEVIOS(DDB)         ;SPECIFICALLY FOR INPUT WAIT\r
980         PUSHJ   PDP,TWSYNC              ;WAIT FOR CHAR. TO BE TYPED\r
981         JRST    INCHRW                  ;GO GET IT\r
982 \r
983 ;ONEOUT OUTPUTS ONE CHARACTER\r
984 \r
985 ONEOUT: PUSHJ   PDP,GETWDU              ;PICK UP CHAR FROM USER\r
986         MOVE    CHREC,TAC               ;PUT IT IN PROPER AC\r
987         ANDI    CHREC,177       ;MASK ANY JUNK\r
988 \r
989         JUMPE   CHREC,CPOPJ     ;DONT STORE NULLS\r
990         PUSHJ   PDP,OUTCHR              ;PLACE IT IN TTO BUFFER\r
991         JUMPN   CHREC,DDTUTT    ;IF IT STORED, RETURN\r
992         PUSHJ   PDP,TTOUWS      ;BUFFER WAS FULL. TRY AGAIN LATER\r
993         JRST    ONEOUT\r
994 \r
995 ;GETLIN PUTS LINE CHARACTERISTICS WORD INTO ADR. IN UUO ADR. FIELD\r
996 \r
997 GETLIN: SKIPGE  TAC,@UUO                ;DOES USER WANT ONE LINE CHAR. WD.?\r
998         JRST    GETLN1                  ;YES\r
999         MOVEI   LINE,0                  ;NO, CHECK SIZE OF NUMBER\r
1000         CAIL    TAC,TTPLEN              ;TOO HIGH?\r
1001         JRST    GETLN1                  ;YES, GIVE HIM THE 0.\r
1002         MOVE    LINE,LINTAB(LINE)       ;OK, GET THE ENTRY\r
1003         HRRZ    DEVDAT,TTYTAB(TAC)      ;GET DEVDAT ON REQUESTED LINE\r
1004                                         ; NOTE - NO LONGER ON JOB'S TTY\r
1005         LDB     TAC,PJOBN               ;GET JOB NUMBER OF REQUESTED TTY\r
1006         JUMPE   TAC,GETLN1              ;IF NONE, NO LINES.\r
1007         SKIPLE  TISYNC(DEVDAT)          ;ANY TYPE-IN?\r
1008         TLO     LINE,LINRDY             ;YES. FLAG.\r
1009 GETLN1: MOVE    LINE,@UUO               ;GIVE IT TO USER\r
1010         POPJ    PDP,\r
1011 \r
1012 ;ROUTINE TO SET LINE CHARACTERISTICS THAT ARE SETABLE\r
1013 \r
1014 SETLIN: MOVSI   TAC,LGLSET              ;MAKE MASK OF ALL OF THEM\r
1015         ANDCAM  TAC,LINTAB(LINE)\r
1016         AND     TAC,@UUO                ;SET ONLY THOSE BITS USER WANTS SET\r
1017         IORM    TAC,LINTAB(LINE)        ;SET RESULTANT\r
1018         POPJ    PDP,\r
1019 \f;ROUTINE TO ATTACH TTY TO A JOB\r
1020 ;CALL:  MOVE DEVDAT,ADDRESS OF TTY DEVICE DATA BLOCK\r
1021 ;       MOVE ITEM,JOB NUMBER\r
1022 ;       PUSHJ PDP,TTYATT\r
1023 ;       ERROR   ;DEVDAT=DDB ADR OF OTHER TTY\r
1024                 ;IF ANOTHER ALREADY IS ATTACHED.\r
1025 ;       OK RETURN       ;DEVDAT, DAT AND TRANSLATOR TABLE SET\r
1026 \r
1027 ;CALLED FROM COMCON (ATTACH) AND COMCSS (JOBINI)\r
1028 ;ON OK RETURN   1)SETS TTYATC\r
1029 ;               3)PUTS ADDRESS OF ATTACHED DDB INTO DEVDAT.\r
1030 ;               4)SETS PHYSICAL NAME TO SIXBIT /TTY LINE #/\r
1031 ;                 OR SIXBIT /CTY/,\r
1032 ;               5)SETS DEVOPR IF IT IS NON-ZERO.\r
1033 \r
1034 INTERNAL TTYATT,TTYATI\r
1035 EXTERNAL PUNIT,PJOBN,TTYTAB\r
1036 \r
1037 TTYATI:\r
1038 INTERNAL FTATTACH\r
1039 IFN FTATTACH,<\r
1040 TTYATT: PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
1041         MOVEI   DEVDAT,TTYLST   ;SEARCH FOR DDB THAT IS ATTACHED\r
1042         SKIPA\r
1043 TTYAT2: HLRZ DEVDAT,DEVSER(DEVDAT)\r
1044         JUMPE DEVDAT,TTYAT4     ;HAVE ALL TTY DDB'S BEEN LOOKED AT?\r
1045         LDB TAC,PJOBN           ;NO, GET JOB NUMBER.\r
1046         HLL TAC,DEVMOD(DEVDAT)  ;ATTACH AND USE BITS\r
1047         TLNN TAC,DVTTY          ;IS THIS STILL A TTY DDB?\r
1048         JRST TTYAT4             ;NO. THIS MUST BE IJOB.\r
1049         MOVE IOS,DEVIOS(DDB)\r
1050         CAIN ITEM,(TAC)         ;JOB NUMBER THE ONE TO ATTACH?\r
1051         TLNN TAC,TTYATC         ;YES, IS DDB ATTACHED TO JOB?\r
1052         JRST TTYAT2             ;NO, KEEP LOOKING,\r
1053         TLNE IOS,TTYDTC         ;IS DDB DETACHED FROM LINE?\r
1054         JRST TTYAT5             ;YES, OK TO ATTACH TTY OF REQUESETER TO JOB\r
1055         MOVE TAC,-3(PDP)        ;NO. GET TTY DEVDAT OF JOB DOING ATTACH COM.\r
1056                                 ; AS PUSHED BY COMMAND DECODER\r
1057         SKIPE TAC,DEVNAM(TAC)   ;PHYSICAL NAME OF REQUESTOR TTY\r
1058         CAME TAC,DEVOPR         ; CHECK IF OPR IS REQUESTOR\r
1059         POPJ PDP,               ;NO, ERROR RETURN, CAN'T ATTACH\r
1060         PUSH PDP,LINE           ;YES, SAVE LINE CHARACTERISTICS\r
1061         LDB LINE,PUNIT  ;GET LINE NO. OF TTY BEING GRABBED\r
1062         HRRZ TAC,(PDP)          ;OPERATOR'S LINE NUMBER?\r
1063         CAME LINE,TAC           ;IS OPERATOR TRYING TO GRAB HIMSELF?\r
1064                                 ; IF YES, DO NOT DETACH HIM\r
1065         PUSHJ PDP,TTYDET        ;DETACH TTY OF JOB BEING GRABBED BY OPR\r
1066         POP PDP,LINE            ;RESTORE LINE CHARACTERISTICS\r
1067 TTYAT5: PUSH PDP,DEVDAT         ;SAVE NEW DDB ADDRESS.\r
1068 \f       MOVE DEVDAT,TTYTAB(LINE)\r
1069         PUSHJ PDP,TTYDET        ;DETACH DDB FROM TTY\r
1070         POP PDP,DEVDAT\r
1071 TTYAT3: DPB ITEM,TPCJOBN        ;STORE ATTACHED JOB NO.\r
1072         DPB ITEM,PJOBN          ;SET JOB NUMBER\r
1073         MOVSI   IOS,TTYDTC      ;INDICATE DDB NO LONGER DET. FROM LINE\r
1074         ANDCAB  IOS,DEVIOS(DDB)\r
1075         MOVSI TAC,TTYATC        ;SET ATTACHED BIT\r
1076         JRST SCNIN              ;SO INITIALIZE DDB\r
1077 \r
1078 TTYAT4: MOVE DEVDAT,TTYTAB(LINE);RESTORE OLD DDB ADDRESS.\r
1079         JRST TTYAT3\r
1080 >\r
1081 IFE FTATTACH,<\r
1082 TTYATT: LDB LINE,PUNIT          ;LINE NO. OF THIS TTY\r
1083         DPB ITEM,TPCJOBN\r
1084         DPB ITEM.PJOBN\r
1085         MOVSI TAC,TTYATC\r
1086         JRST SCNIN>\r
1087 \f;ROUTINE TO SETUP AC DEVDAT TO ADDRESS OF TTY WHICH HAS TYPED A COMMAND\r
1088 ;AC DAT TO BYTE POINTER TO OUTPUT BUFFER FOR COMMAND MESSAGES\r
1089 ;AC TAC TO BYTE POINTER TO COMMAND STRING\r
1090 ;AC ITEM TO JOB NUMBER TTY IS ATACHED TO\r
1091 ;CALL:  PUSHJ PDP,TTYCOM\r
1092 ;       NONE FOUND\r
1093 ;       AC'S SETUP\r
1094 ;CALLED FROM COMMAND\r
1095 \r
1096 INTERNAL TTYCOM,TTYCM\r
1097 EXTERNAL MTTYLN,TTYTAB,CPOPJ\r
1098 \r
1099 TTYCOM: SKIPL   LINE,LINSAV\r
1100         MOVSI LINE,MTTYLN\r
1101         SKIPL   TAC,TTYTAB(LINE)\r
1102 TTYCM1: AOBJN LINE,.-1\r
1103         MOVEM LINE,LINSAV\r
1104         JUMPG LINE,CPOPJ\r
1105         HRRZ DEVDAT,TTYTAB(LINE)\r
1106         JUMPE   DDB,TTYCM2      ;THIS SHOULDNT HAPPEN, BUT...\r
1107         MOVEI   DAT,TTIBUF(DDB) ;SO GETCHR CAN BE CALLED FROM COMCON\r
1108         MOVE    LINE,TITCTR(DDB)\r
1109         DPB     LINE,PCOMIC     ;SAVE COMMAND INPUT COUNTER\r
1110         LDB LINE,PUNIT          ;LINE NO.\r
1111         LDB ITEM,PJOBN          ;JOB NO. TTY ATTACHED TO\r
1112         TLNN    TAC,200000      ;IS THIS A DELAYED COMMAND?\r
1113         JRST CPOPJ1             ;NO, RETURN TO SCAN IT\r
1114         MOVSI   TAC,200000      ;INDICATED NO LONGER DELAYED COMMAND\r
1115         ANDCAM  TAC,TTYTAB(LINE)\r
1116         JRST    CPOPJ1          ;RETURN TO COMMAND SCAN\r
1117 \r
1118 TTYCM:  MOVSI   DDB,200000      ;INDICATE DELAYED COMMAND\r
1119         IORB    DDB,TTYTAB(LINE)\r
1120         PUSHJ   PDP,TRESCN      ;BACK UP TO START OF COMMAND\r
1121         MOVE    LINE,LINSAV     ;TRESCN HAS CALLED STLNAC\r
1122         JRST    TTYCM1          ;LOOK FOR OTHER COMMAND TP PROCESS\r
1123 \r
1124 TTYCM2: MOVSI   DDB,600000      ;CLEAR COMMAND BITS IN TTYTAB\r
1125         ANDCAM  DDB,TTYTAB(LINE)\r
1126         JRST    TTYCOM          ;GO TRY AGAIN\r
1127 \fINTERNAL FTATTACH\r
1128 \r
1129 IFN FTATTACH,<\r
1130 ;ROUTINE TO DETACH TTY FROM JOB\r
1131 ;CALL:  MOVE DEVDAT,ADDRESS OF TTY DDB TO BE DETACHED\r
1132 ;       PUSHJ PDP,TTYDET\r
1133 \r
1134 ;CALLED FROM TTYATT AND COMCON (DETACH)\r
1135 ;CLEARS TTYATC AND TRNALSATOR TABLE ENTRY.\r
1136 ;SETS TTYDTC IN DEVIOS(DDB)\r
1137 \r
1138 \r
1139 INTERNAL TTYDET\r
1140 EXTERNAL PUNIT,TTYTAB\r
1141 \r
1142 TTYDET: MOVSI   TAC,TTYATC\r
1143         TDNN    TAC,DEVMOND(DDB)        ;IS THIS DDB WORTH KEEPING?\r
1144         JRST    TTYDT1          ;NO. GO JUNK IT\r
1145 \r
1146         MOVSI   IOS,TTYDTC      ;YES. MARK IT DETACHED\r
1147         IORM    IOS,DEVIOS(DDB)\r
1148         JRST    TTYKL1          ;GO CLEAR TTYTAB AND DEVNAM\r
1149 \r
1150 TTYDT1: MOVSI   IOS,TTYDTC+IO   ;CLEAR SOME BITS TO FORCE KILL\r
1151         ANDCAM  IOS,DEVIOS(DDB)\r
1152         MOVSI   IOS,TOIP        ;ALSO TYPEOUT IN PROGRESS\r
1153         ANDCAM  IOS,TTYPTR(DDB)\r
1154         JRST    TTYKIL          ;TTYKIL WILL NOW KILL DDB\r
1155 >\r
1156 \r
1157 INTERN TRESCN\r
1158 \r
1159 TRESCN: LDB     TAC,PCOMIC      ;GET OLD TITCTR\r
1160         MOVEM   TAC,TITCTR(DDB) ;RESTORE IT\r
1161         PUSHJ   PDP,TBYTEP\r
1162         MOVEM   TAC,TITAKR(DDB)\r
1163 TRESC1: MOVE    TAC,TIPCTR(DDB) ;CALLED HERE FROM ^U CODE\r
1164         CONO    PI,PIOFF\r
1165         SUB     TAC,TITCTR(DDB)\r
1166         SKIPG   TAC\r
1167         ADDI    TAC,TTYCHR\r
1168         MOVEM   TAC,TIFCTR(DDB)\r
1169         CONO    PI,PION\r
1170         JRST    STLNAC\r
1171 \r
1172 TRESCU: PUSHJ   PDP,TRESCN\r
1173         SETZM   TISYNC(DDB)\r
1174         MOVEI   DAT,TTIBUF(DDB)\r
1175 TRESCL: PUSHJ   PDP,GETCHR\r
1176         JUMPE   CHREC,TRESCN\r
1177         PUSHJ   PDP,SPCHEK\r
1178         JRST    TRESCL\r
1179         TLNE    TAC,FCSBRK+BREAKB\r
1180         AOS     TISYNC(DDB)\r
1181         JRST    TRESCL\r
1182 \fTLHBYT:        XWD     350700,0\r
1183         XWD     260700,0\r
1184         XWD     170700,0\r
1185         XWD     100700,0\r
1186         XWD     010700,0\r
1187 \r
1188 TBYTEP: PUSH    PDP,TAC1                ;SAVE LINE\r
1189         MOVNS   TAC\r
1190         SKIPGE  TAC\r
1191         ADDI    TAC,TTYCHR\r
1192         IDIVI   TAC,5\r
1193         ADD     TAC,TTIBUF(DDB)\r
1194         HLL     TAC,TLWBYT(TAC1)\r
1195         POP     PDP,TAC1                ;RESTORE LINE\r
1196         POPJ    PDP,0\r
1197 \f;ROUTINE TO FIND TTY FOR A JOB\r
1198 ;CALL:  MOVE ITEM,JOB NUMBER\r
1199 ;       PUSHJ PDP, TTYFND\r
1200 ;       RETURN WITH DEVDAT SET TO ADR OFF DDB\r
1201 ;       AND DAT SET TO BYTE POINTER TO MONITOR OUTPUT BUFFER\r
1202 \r
1203 INTERNAL TTYFNU,TTYFND,TTYERP\r
1204 EXTERNAL JOB\r
1205 \r
1206 \r
1207 TTYFNU: MOVE ITEM,JOB\r
1208 TTYFND: PUSHJ PDP,TTYSRC\r
1209 TTYDAT: MOVEI   DAT,TTOBUF(DDB)\r
1210         POPJ PDP,\r
1211 \r
1212 ;PUT JOB IN IO WAIT IF TTY BUFFER NOT EMPTY\r
1213 ;CALLED BY NON ERROR MESSAGE ROUTINES AT UUO LEVEL\r
1214 \r
1215 INTERNAL TTYFUW\r
1216 EXTERNAL WSYNC\r
1217 \r
1218 TTYFUW: PUSHJ PDP,TTYFNU\r
1219         MOVE    TAC,TOPUTR(DDB)\r
1220         TLNN    LINE,PTYLIN\r
1221         CAMN    TAC,TOTAKR(DDB)\r
1222         POPJ PDP,\r
1223         MOVEI IOS,IOACT         ;YES\r
1224         IORB IOS,DEVIOS(DDB)\r
1225         JRST WSYNC\r
1226 \r
1227 ;ROUTINE TO INDICATE MONITOR ERROR MESSAGE TO BE FORCED OUT\r
1228 ;WHEN NO MORE ROOM IN TTO BUFFER, TTI BUFFER WILL BE USED\r
1229 \r
1230 TTYERP: PUSHJ   PDP,TTYSRC              ;FIND TTY DDB\r
1231         MOVEI   IOS,MERTPO              ;SET MONITOR ERROR PRINT OUT BIT\r
1232         IORB    IOS,DEVIOS(DDB)\r
1233         JRST    SETBFI                  ;CLEAR TTI BUFFER\r
1234 \fTTYREL:        MOVEI   IOS,777777-IOACT        ;CLEAR INITED STUFF IN IOS\r
1235         MOVSI TAC,TTYATC\r
1236         TDNE    TAC,DEVMOD(DDB)\r
1237         JRST    T0POPJ                  ;GO CLEAR OUT IOS BITS\r
1238 \r
1239 ;ROUTINE TO SET SCNSER TO RETURN TTY TO VIRGIN STATE\r
1240 ;CALL:  MOVE DDB, ADDRESS OF DEVICE DATA BLOCK\r
1241 ;       PUSHJ PDP,TTYKIL\r
1242 \r
1243 ;CALLED FROM COMCSS (JOBKIL).\r
1244 ;IF NOT OPERATOR CONSOL, THEN\r
1245 ;       1)CLEAR PHYSICAL AND LOGICAL NAMES,\r
1246 ;       2)CLEAR JOB NUMBER ASSIGNMENT\r
1247 ;       3)CLEAR TTYUSE,TTYATC,ASSCON,ASSPRG,\r
1248 ;       4)CLEAR ENTRY IN TRANSLATOR TABLE.\r
1249 \r
1250 \r
1251 \r
1252 INTERNAL TTYKIL\r
1253 EXTERNAL PJOBN,PTMNMD\r
1254 \r
1255 \r
1256 TTYKIL: MOVSI   IOS,TTYIOW+IOW+TTYDTC+SYNC+DDTM+USRB\r
1257                                         ;CLEAR TTY INPUT AND OUTPUT\r
1258         ANDCAM  IOS,DEVIOS(DDB)         ;WAIT BITS SO TTY WILL BE KILLED\r
1259                                         ;PROPERLY AT INTER, LEVEL IS STILL OUTPUTING\r
1260                                 ; ALSO CLEAR DDT MODE AND SYNC FOR\r
1261                                 ; NEXT USER OF THE DDB\r
1262         MOVSI   IOS,TPMON               ;CLEAR JOB NUMBER\r
1263         DPB     IOS,PJOBN\r
1264         IORB    IOS,DEVIOS(DDB)         ;TURN TPMON ON IN CASE TTY IS\r
1265                                         ;STILL OUTPUTTING\r
1266         PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
1267         TLNE    LINE,PTYLIN\r
1268         PUSHJ   PDP,PTMNMD              ;YES, PUT PTY INTO MONITOR MODE\r
1269         SKIPL   TTYPTR(DDB)     ;CHECK TOIP\r
1270         TLNE    IOS,IO          ;IS IT OUTPUTTING OR TALKING?\r
1271         POPJ    PDP,                    ;YES, DDB WILL BE KILLED AT\r
1272                                         ;INTERRUPT LEVEL\r
1273         HLLZS   DEVIOS(DDB)     ;CLEAR INITTED STUFF IN IOS\r
1274         TLZ     LINE,KILMSK     ;CLEAR BITS IN LINE TABLE\r
1275         TLNE    LINE,DSDTLN     ;DATAPHONE?\r
1276         TLZ     LINE,LGLSET     ;INITIALIZE OTHER MODES\r
1277         HLLM    LINE,LINTAB(LINE)\r
1278         SETZB TAC,DEVLOG(DEVDAT)        ;CLEAR LOGICAL NAME\r
1279         MOVE TAC,[XWD TTYUSR+TTYATC,ASSCON+ASSPRG]\r
1280         ANDCAM TAC,DEVMOD(DEVDAT)       ;CLEAR ATTACH,USE, AND ASSIGN BITS\r
1281 TTYKL1: LDB LINE,PUNIT                  ;LINE NO.\r
1282         SETZM TTYTAB(LINE)              ;CLEAR TRANSLATOR TABLE\r
1283         SETZM   DEVNAM(DDB)\r
1284         POPJ    PDP,0\r
1285 \f;ROUTINE TO SET TTY INTO USER MODE NOW.\r
1286 ;CALL:  MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
1287 ;       PUSHJ PDP,TTYSET\r
1288 \r
1289 ;CALLED FROM RUNCSS (START1)\r
1290 ;CLEARS DDTM,IOUPR,USRB,TTYIOW AND IOW\r
1291 \r
1292 \r
1293 INTERNAL TTYSET\r
1294 \r
1295 TTYSET: MOVSI   IOS,DDTM+IOSUPR+USRB+TTYIOW+IOW\r
1296         JRST    T0POPJ  ;GO CLEAR BITS\r
1297 \fINTERN STLNAC\r
1298 \r
1299 EXTERNAL JOB,MTTYLN,TTYTAB,DEVPHY,DEVOPR,ERROR\r
1300 \r
1301 ;ROUTINE TO SEARCH TRANSLATOR TABLE FOR TTY\r
1302 ;CALL:  MOVE ITEM,JOB NUMBER\r
1303 ;       PUSHJ PDP,TTYSRC\r
1304 ;       RETURN WITH ADDRESS OF DEVICE DATA BLOCK IN DEVDAT.\r
1305 \r
1306 \r
1307 TTYSRC: JUMPE ITEM,TTYF1        ;SEARCH FOR OPER. TTY IF JOB NO. 0\r
1308         MOVSI LINE,MTTYLN       ;NUMBER OF TTY DDBS\r
1309 TTYSRA: HRRZ DEVDAT,TTYTAB(LINE)\r
1310         JUMPE DEVDAT,TTYF0\r
1311         LDB TAC,TPCJOBN\r
1312         CAIN TAC,(ITEM)\r
1313         JRST    TTYF9           ;FOUND\r
1314 TTYF0:  AOBJN LINE,TTYSRA\r
1315 TTYF1:  MOVSI TAC,576062        ;LOOK FOR DEVICE "OPR"\r
1316 \r
1317         PUSHJ PDP,DEVPHY        ;SEARCH PHYSICAL DEVICE NAMES FOR OPR\r
1318         SKIPA TAC,DEVOPR        ;NOT FOUND.\r
1319         JRST    TTYF9\r
1320         JUMPN TAC,TTYF3         ;WAS OPR SPECIFIED IN ONCE ONLY CODE?\r
1321         MOVEI DDR,TTYLST        ;NO\r
1322         SKIPE DEVNAM(DDB)       ;HAS A TTY BEEN TYPED ON?\r
1323         JRST    TTYF9\r
1324         MOVEI LINE,TCONLN       ;NO USE CTY.\r
1325         HRRZ    DDB,TTYTAB(LINE)        ;DOES IT HAVE A DDB?\r
1326         JUMPN   DDB,TTYF9               ;YES. USE IT.\r
1327         MOVSI TAC,(SIXBIT /CTY/)        ;NO\r
1328 TTYF3:  PUSHJ PDP,GETDDB        ;GET A DDB FOR DEVOPR\r
1329         JSP     DAT,ERROR       ;SHOULD NEVER HAPPEN\r
1330 TTYF9:  MOVE    IOS,DEVIOS(DDB) ;SET UP IOS\r
1331 STLNAC: LDB     LINE,PUNIT      ;GET UNIT # FROM DDB\r
1332         HLL     LINE,LINTAB(LINE)       ;AND LINE BITS\r
1333         POPJ    PDP,0           ;RETURN\r
1334 \f;ROUTINE TO START TTY OUTPUT AFTER CLEARING USRB\r
1335 \r
1336 EXTERNAL PTMNMD,PTMNMZ\r
1337 \r
1338 INTERNAL TTYSTC,TTYTCM\r
1339 \r
1340 TTYTCM:\r
1341 TTYSTC: MOVSI TAC,USRB          ;CLEAR BIT IN MEMORY\r
1342         ANDCAM TAC,DEVIOS(DDB)\r
1343         PUSHJ   PDP,STLNAC\r
1344         TLNE    LINE,PTYLIN\r
1345         PUSHJ   PDP,PTMNMD\r
1346 \r
1347 ;ROUTINE TO START TTY OUTPUT\r
1348 ;CALL:  MOVE DAT,BYTE POINTER TO LAST OUTPUT ITEM\r
1349 ;       MOVE DEVDAT,ADDRESS OF TTY DDB\r
1350 ;       MOVE ITEM,JOB NUMBER    ;(MUST BE PRESERVED)\r
1351 ;       PUSHJ PDP,TTYSTR\r
1352 \r
1353 ;CALLED FROM COMINI\r
1354 ;INITIALIZED TTY FOR MONITOR OUTPUT AND STARTS OUTPUT\r
1355 \r
1356 INTERNAL TTYSTR\r
1357 EXTERNAL CLRBYT\r
1358 \r
1359 TTYSTR: MOVE IOS,[XWD DDTM+IOSUPR+IOBEG+IO+TPMON,IODTER+IOBKTL+IGNOR+IOACT]\r
1360         ANDCAB IOS,DEVIOS(DDB)\r
1361         PUSHJ   PDP,STLNAC      ;GET LINE CHARACTERISTICS\r
1362         JUMPGE  LINE,TTSTR1     ;IF NOT PTY, JUMP\r
1363         TLNE    IOS,USRB\r
1364         PUSHJ   PDP,PTMNMZ\r
1365 TTSTR1: MOVSI   TAC,IO+TPMON\r
1366         TLNE    IOS,USRB        ;GOING OUT OF MONITOR MODE?\r
1367         TLZ     TAC,TPMON       ;YES\r
1368         IORM    TAC,DEVIOS(DDB)\r
1369         MOVSI   TAC,USRB+TPMON\r
1370         TLNE    IOS,USRB\r
1371         ANDCAM  TAC,DEVIOS(DDB)\r
1372         MOVE    IOS,DEVIOS(DDB) ;GET CORRECT IOS\r
1373         SKIPLE  TISYNC(DDB)     ;HAS USER TYPED AHEAD?\r
1374         PUSHJ   PDP,COMSET      ;YES, WAKE UP COMMAND DECODER(IF IN MON. MODE)\r
1375         JRST    UTYRET          ;GO TYPE FIRST CHAR.\r
1376 \f;ROUTINE TO ADD TTY TO TALK RING\r
1377 ;CALL:  ADR. OF DDB TO BE ADDED TO RING AT -3(PDP)\r
1378 ;       MOVE TAC,SIXBIT /TTYN/\r
1379 ;       PUSHJ PDP,TTYTLK\r
1380 ;       TTY IS BUSY RETURN OR NOT A TTY OR TOO BIT A LINE NO.\r
1381 ;       OLK RETURN, TTY ADDED TO TALK RING\r
1382 \r
1383 INTERNAL FTTALK\r
1384 IFN FTTALK,<\r
1385 INTERNAL TTYTLK\r
1386 EXTERNAL PUNIT,CPOPJ1\r
1387 \r
1388 TTYTLK: PUSHJ   PDP,GETDDB      ;IN CASE NOT SET UP\r
1389         POPJ    PDP,0           ;NONE AVAIL. GIVE UP\r
1390         MOVE TAC,DEVMOD(DEVDAT)\r
1391         TLNN TAC,DVTTY\r
1392         POPJ PDP,\r
1393         MOVE IOS,DEVIOS(DEVDAT) ;IS TTY IN MONITOR MODE AND LEFT HAND MARGIN?\r
1394         MOVE    TAC1,-3(PDP)    ;TTY GIVING TALK COMMAND\r
1395 \r
1396         MOVE    TAC1,DEVNAM(TAC1)       ;ITS NAME\r
1397         MOVE    TAC,DEVNAM(DEVDAT)      ;OPR IS NEVER TOO BUSY...\r
1398         CAME    TAC1,DEVOPR     ;EITHER ONE OPR?\r
1399         CAMN    TAC,DEVOPR\r
1400         JRST    TTYTK1\r
1401         TLNE IOS,TPMON\r
1402         TLNN IOS,IOFST\r
1403         POPJ PDP,               ;NO, HE IS BUSY.\r
1404 TTYTK1: CONO    PI,SCNOFF\r
1405         LDB LINE,PUNIT          ;LINE NUMBER IS RING.\r
1406         MOVSI   TAC,TLKRNG\r
1407         LDB     CHREC,PTALK\r
1408         TDDN    TAC,LINTAB(LINE)\r
1409         HRRZ    CHREC,LINE\r
1410         IORM    TAC,LINTAB(LINE)\r
1411         EXCH DDB,-3(PDP)        ;GET DDB OF TALKER\r
1412         LDB LINE,PUNIT          ;LINE NO. OF TALKER\r
1413         DPB     CHREC,PTALK             ;SET POINTER INTO RING\r
1414         HRLI    LINE,TLKRNG\r
1415         IORB    LINE,LINTAB(LINE)\r
1416         MOVEM LINE,TAC          ;SAVE LINE NO. OF TALKER\r
1417         EXCH DDB,-3(PDP)        ;RESTORE\r
1418         LDB LINE,PUNIT          ;LINE NO. IN RING AGAIN\r
1419         DPB TAC,PTALK           ;MADE IT POINT TO TALKER\r
1420         CONO    PI,SCNON\r
1421         JRST CPOPJ1             ;OK RETURN\r
1422 >\r
1423 \f;ROUTINES TO SET SCANNER TO START UP JOB WHEN OUTPUT FINISHES\r
1424 ;CALL:  MOVE DEVDAT,TTYDDB ADR.\r
1425 ;       PUSHJ PDP,TTYUSR\r
1426 ;       TTY WILL GO TO USER MODE WHEN TYPING OUT STOPS\r
1427 \r
1428 EXTERNAL SETRUN\r
1429 \r
1430 INTERNAL TTYUSR\r
1431 \r
1432 TTYUSR: MOVSI IOS,USRB          ;SET BIT TO SWITCH TTY TO USER MODE\r
1433         IORM IOS,DEVIOS(DDB)    ;WHEN MONITOR OUTPUT FINISHES\r
1434         JRST SETRUN             ;GO FLAG JOB AS RUNABLE IMMEDIATELY\r
1435 \f;CTY INTERRUPT SERVICE ROUTINE\r
1436 \r
1437 INTERNAL CTYINT\r
1438 EXTERNAL SCNSAV,SCNCHN,TCONLN\r
1439 \r
1440 CTYINI: CONSO TTY,50            ;TTI OR TTO FLAG?\r
1441         JRST CTYINT                     ;NO\r
1442         JSR     SCNSAV                  ;YES, SAVE AC'S\r
1443         MOVEI   LINE,TCONLN             ;LOAD LINE WITH PROPER\r
1444         CONSO TTY,40            ;YES. TTI FLAG?\r
1445         JRST CTYOU1             ;NO.\r
1446         DATAI TTY,CHREC\r
1447         JRST    RECINT          ;RECEIVER INTERRUPT HANDLER\r
1448 \r
1449 CTYOU1: MOVEI CHREC,SCNCHN\r
1450         CONO TTY,200(CHREC)     ;CLEAR TTO FLAG.\r
1451         JRST    XMTINT          ;COMMON TRANSMIT INTERRUPT HANDLER\r
1452 \r
1453 ;SCANNER INTERRUPT SERVICE ROUTINE IS IN SEPARATE DEVICE DEPENDENT SECTION\r
1454 \r
1455 EXTERNAL SCNSAV,TCONLN,TTYTAB\r
1456 \f;COMMON RECEIVER INTERRUPT FOR ALL KEYBOARD DEVICES\r
1457 \r
1458 INTERNAL RECINT,INUS2,INJEST\r
1459 \r
1460 EXTERNAL COMCNT\r
1461 \r
1462 RECINT:\r
1463 INUS2:  ;TAG FOR INTERRUPT SERVICE\r
1464 INJEXT: ;ANOTHER TAG, NOT USED, BUT WANTED BY LOSING DLSINT\r
1465 \r
1466         TRNN    CHREC,177       ;IGNORE NULLS\r
1467         POPJ    PDP,0           ;DISMISS INTERRUPT\r
1468         HLL     LINE,LINTAB(LINE)       ;GET LINE CHARACTERISTICS\r
1469         HRRZ    DDB,TTYTAB(LINE)        ;IS THERE A DDB FOR THIS LINE?\r
1470         JUMPN   DDB,RECIN1              ;YES. GO NO\r
1471         PUSHJ   PDP,DDBSRC              ;NO, FIND ONE\r
1472         JRST    TYPX\r
1473 \r
1474 RECIN1: TLNE    LINE,HLFDPX             ;HALF DUPLEX LINE?\r
1475         JRST    RECHDX                  ;GO SEE WHETHER INPUT OR OUTPUT\r
1476 RECIN8:                         ;RETURN FROM RECHDX\r
1477 \r
1478 IFN FTTALK,<    TLNE    LINE,TLKRNG     ;IN A TALK RING?\r
1479                 JRST    DOTALK          ;YES, GO TALK\r
1480 >\r
1481         MOVE    IOS,DEVIOS(DDB)         ;SET UP IOS\r
1482 RECIN2: ANDI    CHREC,177               ;7-BIT ASCII ONLY\r
1483         CAIN    CHREC,3                 ;CONTROL C?\r
1484         PUSHJ   PDP,CNCTST              ;YES, SEE IF 2ND CONTROL C\r
1485         LDB     HPOS,PHPOS              ;PICK UP HORIZONTAL POSITION OF OUTPUT CHAR.\r
1486         MOVEI   DAT,TTIBUF(DDB)         ;USER MODE INPUT BUFFER\r
1487         PUSHJ   PDP,TTEDIT              ;GO EDIT (AND ECHO) CHARACTER\r
1488         DPB     HPOS,PHPOS              ;STORE HORIZONTAL POSITION\r
1489         HLLM    LINE,LINTAB(LINE)       ;UPDATE LINE TABLE\r
1490         MOVE    TAC,TIFCTR(DDB)         ;FRE SPACES LEFT?\r
1491         CAIG    TAC,12          ;ONLY 10 LEFT?\r
1492         JRST    RWARN           ;YES, GO OUTPUT XOFF\r
1493         TLNN    IOS,SYNC+DDTM           ;WAS A BREAK CHARACTER TYPED?\r
1494         JRST    TYPTST                  ;NO, GO SEE IF ECHO NEED BE TYPED\r
1495 \f       INTERN RECIN3           ;FOR PTYSRF\r
1496 RECIN3: MOVE    TAC,TTYTAB(LINE)        ;IS IT IN COMMAND WAIT NOW?\r
1497         TLNE    TAC,600000      ;..\r
1498         JRST    RECIN4          ;YES. NOT AGAIN.\r
1499         SKIPG   TISYNC(DDB)             ;HAS USER TYPED AHEAD?\r
1500         PUSHJ   PDP,COMSET              ;NO, WAKE UP COMMAND DECORDER NOW\r
1501 RECIN4: TLNE    IOS,SYNC\r
1502         AOS     TISYNC(DDB)             ;BREAK CHARACTER (BUMP LINE COUNT)\r
1503         MOVSI   IOS,SYNC                ;CLEAR SYNC IN CORE\r
1504         ANDCAB  IOS,DEVIOS(DDB)         ; ..\r
1505         MOVE    TAC,TIPCTR(DDB)         ;UPDATE COUNTER FOR ^U\r
1506         DPB     TAC,PLSTLC\r
1507         TLZN    IOS,TTYIOW              ;IN TELETYPE INPUT WAIT?\r
1508         JRST    TTYTST                  ;NO, GO ECHO\r
1509         PUSHJ   PDP,STTIOD              ;YES, SET IO DONE(OUT OF TTY IOW)\r
1510         MOVSI   IOS,IOW+TTYIOW\r
1511         ANDCAB  IOS,DEVIOS(DDB)         ;CLEAR WAIT BITS\r
1512 TYPTST: MOVSI   TAC,TOIP                ;CHECK TOIP\r
1513         CONO    PI,PIOFF\r
1514         SKIPGE  TTYPTR(DDB)             ;TYPEOUT HAPPENING?\r
1515         JRST    TYPT1\r
1516         IORM    TAC,TTYPTR(DDB)         ;NO, BUT THERE IS NOW\r
1517         CONO    PI,PION\r
1518         PUSHJ   PDP,STLNAC              ;TAC1 CLOBBERED ABOVE BY STTIOD\r
1519         JRST    XMTIN1                  ;START OUTPUT\r
1520 \r
1521 TYPT1:  CONO    PI,PION\r
1522         POPJ    PDP,\r
1523 \r
1524 RWARN:  TLNE    LINE,HLFDPX+FULTWX      ;CAN LINE BE STOPPED?\r
1525         JRST    RECIN3          ;NO. WAKE JOB AND CROSS FINGERS.\r
1526         MOVEI   CHREC,23        ;YES. SEND AN XOFF.\r
1527         PUSHJ   PDP,PUTCHO      ; ..\r
1528         MOVEI   CHREC,IDLECH    ;AND AND IDLE FOR TTY TO THINK ON.\r
1529         PUSHJ   PDP,PUTCHO      ;OUTPUT IT.\r
1530         JRST    RECIN3          ;GO WAKE JOB.\r
1531 \fIFN FTHDPX,<\r
1532 \r
1533 ;ROUTINE TO HANDLE HALF DUPLEX RECEIVE INTERRUPTS\r
1534 ;CALLED ONLY AT RCV INTERRUPT LEVEL\r
1535 \r
1536 EXTERN CLOCK\r
1537 \r
1538 RECHDX: MOVE IOS,DEVIOS(DDB)    ;SETUP IOS\r
1539         TRNE    IOS,IGNOR       ;IN AN ECHO CHECK?\r
1540         POPJ    PDP,            ;YES, IGNORE THIS\r
1541         TRZE    IOS,ECHOF       \r
1542         JRST    RECHD1\r
1543         SKIPL   TTYPTR(DDB)             ;SHOULD THIS BE AN ECHO?\r
1544         JRST    RECIN8          ;NO. ITS A RECEIVE CHARACTER\r
1545         ANDI    CHREC,177       ;AN ECHO. CHECK IT\r
1546         LDB     TAC,PLASTC      ;GET WHAT WAS SENT\r
1547         CAMN    TAC,CHREC       ;SAME?\r
1548         POPJ    PDP,0           ;YES, DISMISS INT.\r
1549 ECHO:   MOVSI   TAC,TOIP\r
1550         ANDCAM  TAC,TTYPTR(DDB)         ;TURN OFF TOIP\r
1551         TLZ     IOS,IO                  ;BAD CHARACTER, SHUT DOWN XMT.\r
1552         TRO     IOS,ECHOF+IGNOR ;MARK FOR THE 1/2 SEC IGNORE.\r
1553         MOVEI   TAC,(LINE)      ;SETUP CLOCK REQUEST\r
1554         LSH     TAC,^D12\r
1555         TRO     TAC,^D30        ;1/2 SECOND\r
1556         HRLI    TAC,ENDECH      ;WHERE TO RESPOND TO\r
1557         CONO    PI,PIOFF\r
1558         IDPB    TAC,CLOCK       ;REQUEST FROM CLOCK\r
1559         CONO    PI,PION\r
1560         MOVEM   IOS,DEVIOS(DDB) ;ONLY AT INTERRUPT LEVEL\r
1561         POPJ    PDP,            ;DISMISS INTERRUPT\r
1562 \r
1563 ENDECH: MOVE    DDB,TTYTAB(TAC) ;HERE ON TIMEOUT OF ECHOCHECK\r
1564         MOVEI   IOS,IGNOR       ;KILL IGNORE INT BIT\r
1565         JRST    T0POPJ          ;CLEAR BIT IN IOS, RETURN TO CLK\r
1566 \r
1567 RECHD1: ANDI    CHREC,177\r
1568         CAIN    CHREC,3         ;^C DURING ECHO CHECK?\r
1569         DPB     CHREC,TITAKR(DDB)       ;YES, MAKE IT LIKE 2 OF THEM\r
1570         JRST    RECIN8          ;PROCESS AS INPUT\r
1571 >       ;END OF FTHDPX\r
1572 \f;ROUTINE TO TYPE X IF LINE CANNOT GET INTO SYSTEM\r
1573 \r
1574 TYPX:   ANDI    CHREC,177\r
1575         CAIN    CHREC,"X"       ;CHAR, RECEIVED AN "X"\r
1576         POPJ    PDP,            ;YES, MAY BE ECHO, DISMISS INT.\r
1577         MOVEI   CHREC,"X"\r
1578         JRST    TYPL            ;TYPE OUT "X"\r
1579 \r
1580 ;ROUTINE TO WAKE UP COMMAND DECORDER IF TPMON IS SET\r
1581 \r
1582 COMSET: TLNN    IOS,TPMON               ;MONITOR MODE?\r
1583         POPJ    PDP,                    ;NO, NOT MONITOR COMMAND\r
1584         MOVSI   IOS,IOFST\r
1585         IORB    IOS,DEVIOS(DDB)\r
1586         MOVSI   TAC,400000              ;SET SIGN BIT\r
1587         IORM    TAC,TTYTAB(LINE)        ;IN TTY TRANSLATOR TABLE\r
1588         AOS     COMCNT                  ;INDICATE ONE MORE COMMAND\r
1589         POPJ    PDP,\r
1590 \fINTERNAL XMTINT,PTYGET\r
1591 \r
1592 XMTINT: HLL     LINE,LINETAB(LINE)      ;GET LINE CHAR.\r
1593         HRRZ    DDB,TTYTAB(LINE)        ;GET DDB ADDRESS\r
1594         JUMPE   DDB,CPOPJ               ;IF NONE, X BEING TYPED\r
1595         MOVE    IOS,DEVIOS(DDB)         ;GET IO STATUS\r
1596         TLNN    LINE,HLFDPX             ;HALF DUPLEX LINE?\r
1597         JRST    XMTIN1                  ;NO, REGULAR TRANSMIT INTERRUPT\r
1598 \r
1599 PTYGET:                         ;CALL HERE TO SKIP ABOVE OVERHEAD\r
1600         SKIPL   TTYPTR(DDB)             ;WAS TYPE-OUT IN PROGRESS?\r
1601         POPJ    PDP,                    ;IGNORE XMT DURING ECHO CK\r
1602 XMTIN1: MOVEI   DAT,TTOBUF(DDB)         ;SPECIFY TTO BUFFER\r
1603 XMTI1A  CONO    PI,PIOFF                ;KEEP TOIP AND PUTR/TAKR EQUAL\r
1604         HLRZ    TAC,BUF(DAT)            ;IS OUTPUT BUFFER EMPTY?\r
1605         CAMLE   TAC,FCTR(DAT)           ;I.E. FREE COUNT AT MAX?\r
1606         JRST    XMTIN2                  ;NO, TYPING STILL IN PROGRESS\r
1607 \r
1608         TRNE    IOS,MERTPO      ;MONITOR ERROR MESSAGE?\r
1609         CAIE    DAT,TIOBUF(DDB) ;OUTPUT BUFFER?\r
1610         JRST    XMTIN4          ;NO, MUST REALLY BE DONE\r
1611         MOVEI   DAT,TTIBUF(DDB) ;YES. NOW EMPTY OUT TTI BUFFER\r
1612         JRST    XMTI1A\r
1613 \f;HERE WHEN OUTPUT BUFFER(S) EMPTIED\r
1614 \r
1615 XMTIN4: MOVEI   IOS,MERTPO\r
1616         ANDCAB  IOS,DEVIOS(DDB)\r
1617         MOVSI   CHREC,TOIP\r
1618         ANDCAM  CHREC,TTYPTR(DDB)       ;CLEAR MERTPO AND TOIP\r
1619         CONO    PI,PION\r
1620         MOVEI   CHREC,0\r
1621         LDB     HPOS,PJOBN              ;JOB NUMBER DDB IS ATTACHED TO\r
1622         TLNN    IOS,IO\r
1623         JRST    LINDON\r
1624         MOVSI   IOS,IO\r
1625         ANDCAB  IOS,DEVIOS(DDB)\r
1626         TLNE    LINE,TLKRNG     ;OR TALKING?\r
1627         JRST    LINDON                  ;YES\r
1628         JUMPN   HPOS,LINDON             ;LINE DONE IF DDB IS A JOB\r
1629                                 ;OTHERWISE, DDB ONLY USED TO TYPE A\r
1630         JRST    TTYKIL                  ;MESSAGE; KILL TTY DDB\r
1631 \r
1632 \r
1633 XMTIN2: CONO    PI,PION\r
1634         PUSHJ   PDP,GETCHR              ;NO, GET NEXT CHAR. IN BUFFER\r
1635         JUMPE   CHREC,XMTIN1            ;IGNORE NULLS\r
1636         JUMPL   IOS,TYPE                ;KEEP TYPING IF INPUT I/O WAIT\r
1637         TRNN    IOS,IOACT               ;ARE WE IN I/O WAIT?\r
1638         JRST    TYPE                    ;NOT IN IO WAIT\r
1639         MOVEI   HPOS,TTYCHR-10          ;WAKE 8 CHARS BEFORE END\r
1640         CAML    HPOS,FCTR(DAT)          ;IS THERE ROOM ENOUGH NOW?\r
1641         JRST    TYPE                    ;NO, KEEP TYPING\r
1642 \r
1643 LINDON: TLNE    IOS,IOW                 ;IN IO WAIT?\r
1644         TLNE    IOS,TTYIOW              ;YES. TTY INPUT WAIT?\r
1645         JRST    TYPE                    ;NO. GO TYPE CHAR.\r
1646         PUSHJ   PDP,STTIOD              ;YES, SET IO DONE (OUT OF WSYNC)\r
1647         PUSHJ   PDP,STLNAC              ;RESTORE TAC1\r
1648         MOVE    IOS,[XWD IOW,IOACT]     ;INDICATE NO IO ACTIVE OR WAIT\r
1649         ANDCAB  IOS,DEVIOS(DDB)\r
1650 \r
1651 TYPE:   JUMPE   CHREC,CPOPJ     ;IS TYPING STILL TO BE IN PROGRESS?\r
1652         JRST    TYPL            ;YES.\r
1653 \f;TTY KEYBOARD EDITOR ROUTINE\r
1654 ;UPON RECEIPT OF A CHARACTER, THIS ROUTINE DETERMINES WHAT TO DO\r
1655 ;WITH IT: WHETHER IT'S A SPECIAL CHARACTER NEEDING SPECIAL ECHOING,\r
1656 ;WHETHER SOME OTHER CHARACTER IS TO BE STORED IN ITS PLACE, WHETHER\r
1657 ;IT IS A BREAK CHARACTER (LINE TERMINATOR), OR WHETHER THE CHARACTER\r
1658 ;TYPED IS A SIGNAL TO UNDERTAKE SOME SPECIAL ACTION.\r
1659 ;IN ANY CASE, ALL SPECIAL ACTION, INCLUDING DUPLEXING TAKES PLACE ON\r
1660 ;THE LEVEL OF THIS ROUTINE.\r
1661 ;       THIS ROUTINE CALLS SPCHEK, WHICH MAKES USE OF THE SPECIAL\r
1662 ;CHARACTER TABLE, SPCTAB, TO MAKE ANY CHANGES IN THE ACTION GENERATED\r
1663 ;BY SPECIFIC CHARACTERS MAKE THE ALTERATIONS REQUIRED BY THE\r
1664 ;COMMENTS DESCRIBING SPCTAB. NOTE THAT IF A CHARACTER IS TO DISPATCH\r
1665 ;TO A "SPECIAL ACTION ROUTINE" OR SPECIAL ECHO ROUTINE, THE LEFT\r
1666 ;HALF OF THE CORRESPONDING CHARACTER-WORD MUST HAVE SPACTN\r
1667 ;SET  AND THE ADDRESS OF THE SPECIAL ROUTINE MUST BE\r
1668 ;ASSEMBLED INTO THE RIGHT HALF OF THE WORD.\r
1669 ;CALL   HAVE 7-BIT ASCII CHARACTER IN CHREC\r
1670 ;       LDB     HPOS,PHPOS\r
1671 ;       MOVEI   DAT,TTIBUF(DDB)\r
1672 ;       PUSHJ   PDPD,TTEDIT\r
1673 ;       RETURN WITH ACTION DONE, SYNC (LH IOS) SET IF BREAK CHAR. STORED\r
1674 \r
1675 TTEDIT: PUSHJ   PDP,ADJHP       ;ADJUST HP AND CHECK SPECIAL\r
1676         JRST    TIPACK          ;NOT SPECIAL\r
1677         MOVSI   IOS,0\r
1678         TLNE    TAC,BBREAK+FCSBRK       ;BREAK CHAR?\r
1679         TLO     IOS,SYNC        ;BREAK CHAR, SET SYNC\r
1680         IORB    IOS,DEVIOS(DDB) ;SET SYNC\r
1681         JUMPL   TAC,0(TAC)      ;DISPATCH IF SPACTN SET\r
1682 TIPACK: CAIGE   CHREC,140       ;LOWER CASE LETTER?\r
1683         JRST    TTIPUT          ;NO\r
1684         TLNN    LINE,T37        ;YES. IS THIS TTY IN 37 MODE?\r
1685         TRZ     CHREC,40        ;NO. MAKE CHAR UPPER CASE\r
1686 TTIPUT: TLZE    LINE,ROBTPD     ;HAVE WE BEEN DELETING?\r
1687         PUSHJ   PDP,BSECHO      ;YES. OUTPUT A BACKSLASH\r
1688 TTIPT1: PUSHJ   PDP,PUTCHI      ;PUT CHAR IN INPUT BUFFER\r
1689         JRST    INBFUL          ;IT DIDNT FIT\r
1690         LTNN    TAC,ECHSUP      ;SHOULD THIS CHAR BE ECHOED?\r
1691 DUPLEX: TLNE    LINE,FULTWX,HLFDPX      ;IS THIS LINE ECHOING ITSELF?\r
1692         POPJ    PDP,0           ;JUST RETURN WITHOUT ECHO\r
1693 DUPLX1: PUSH    PDP,TAC         ;SAVE TAC OVER PUTCHO\r
1694         TLNN    IOS,TPMON       ;SHOULD ECHO IF IN MONITOR MODE\r
1695         TRNN    IOS,NOECHO      ;AND UNLESS USER SAYS NO, IN USER MODE\r
1696         PUSHJ   PDP,PUTCHO      ;SO ECHO IT.\r
1697         JRST    TPOPJ           ;RESTORE TAC AND RETURN\r
1698 \r
1699 INTERNAL INBFUB                 ;FOR THE PTY\r
1700 \r
1701 INBFUL: MOVSI   IOS,SYNC        ;DONT COUNT SYNC COUNT\r
1702         ANDCAB  IOS,DEVIOS(DDB) ; SINCE CHAR NOT STORED\r
1703         CAIN    CHREC,3 ;CHAR WONT FIT, WAS IT ^C?\r
1704         JRST    CNCTS1          ;YES. PANIC OUT OF THIS BIND\r
1705         MOVEI   CHREC,7         ;NO. JUST ECHO BELL TO SHOW LOSS\r
1706         JRST    PUTCHO          ;OUTPUT BELL\r
1707 \f;CALLED WITH A JUMPL TAC,(TAC), WHERE TAC IS LOADED FROM SPCTAB\r
1708 ;SPECIAL CHARACTER HANDLING ROUTINES\r
1709 \r
1710 CONTC:  PUSHJ   PDP,DELETL      ;SINCE PEOPLE WANT FREE ^U\r
1711         MOVE    TAC,SPCTAB+3    ;SINCE DELETL CLOBBERS TAC\r
1712 CONTZ:  PUSHJ   PDP,CNTLEC      ;OUTPUT ^C OR ^Z\r
1713         PUSHJ   PDP,CRLFEC      ;OUTPUT A CRLF\r
1714         JRST    TTIPUT          ;AND STORE THE 003 OR 032\r
1715 \r
1716 CONTO:  PUSHJ   PDP,SETBF2      ;CLEAR THE OUTPUT BUFFER\r
1717         MOVSI   IOS,IOSUPR      ;SET TO JUNK FURTHER OUTPUT\r
1718         IORB    IOS,DEVIOS(DDB)\r
1719         JRST    CONTU1          ;ECHO, ETC.\r
1720 CONTU:  TLNE    IOS,DDTM        ;IN DDTMODE,\r
1721         JRST    TTIPUT          ; PASS THIS CHARACTER\r
1722         TLZ     LINE,ROBTPD     ;NO MORE BACKSLASH\r
1723         PUSHJ   PDP,DELETL      ;^U DELETES INPUT LINE\r
1724 CONTU1: PUSHJ   PDP,CNTLEC      ;ECHO ^O OR ^U\r
1725         JRST    CRLFEC          ;OUTPUT A CRLF AND RETURN WITHOUT\r
1726                                 ; STORING THE ^O OR ^Z\r
1727 \r
1728 ALTMOD: HRRI    TAC,(CHREC)     ;SAVE WHICH KIND OF ALTMOD\r
1729         MOVEI   CHREC,44        ;ECHO A $\r
1730         TLNN    IOS,TPMON\r
1731         TRNN    IOS,DLRSUP      ;400 IN IOS REMOVES ECHO OF $\r
1732         PUSHJ   PDP,AOJDPX\r
1733         MOVEI   CHREC,(TAC)     ;RESTORE THE CHARACTER\r
1734         TRNN    IOS,FCS         ;UNLESS FCS MODE,\r
1735         MOVEI   CHREC,175       ;TURN INTO OLD ALTMOD\r
1736         JRST    TTIPUT          ;STORE THE CHARACTER\r
1737 \r
1738 CONTF:  TLC     LINE,T35+T37    ;COMPLEMENT T37 ON ^F\r
1739 CONTP:  TLCA    LINE,T35        ;COMPLEMENT T35 ON ^P\r
1740 CONTB:  TLC     LINE,FULTWX     ;COMPLEMENT FULTWX ON ^B\r
1741         POPJ    PDP,0           ;AND RETURN WITHOUT STORING THESE\r
1742 \r
1743 CONTQ:  TLOA    LINE,XON        ;PAPER TAPE MODE\r
1744 CONTS:  TLZ     LINE,XON        ;NOT PAPER TAPE\r
1745         JRST    TTIPUT          ;DO STORE THESE FOR CUSP\r
1746 \fCONTH: TLNE    LINE,T37        ;BACKSPACE\r
1747         JRST    TTIPUT          ;JUST PASS TO PROG IF 37 TTY\r
1748 RUBOUT: TLNN    LINE,XON\r
1749         JRST    RUBOU3\r
1750 RUBOU4: MOVSI   IOS,SYNC        ;IF PAPER TAPE, NO BREAK\r
1751         JRST    T0POPJ          ;OR STORE, RETURN.\r
1752 RUBOU3: TLNE    IOS,TPMON       ;IN MONITOR MODE, NOT A BREAK CHAR\r
1753         JRST    RUBOU2\r
1754         TDNE    IOS,[XWD DDTM,FCS]\r
1755         JRST    TTIPT1          ;STORE RUBOUT IF DDT OR FCS\r
1756 RUBOU2: PUSHJ   PDP,RUBOU4      ;NOT A BREAK AFTER ALL\r
1757         LDB     CHREC,PUTR(DAT) ;GET LAST CHAR IN\r
1758         PUSHJ   PDP,DCPUTR      ;BACK UP TIPUTR\r
1759         JRST    RUBOU1          ;IT'S EMPTY ALREADY\r
1760         TLON    LINE,ROBTPD     ;MARK IN RUBOUT SEQUENCE\r
1761         PUSHJ   PDP,BSECHO      ;AND OUTPUT BACKSLASH IF FIRST\r
1762 AOJDPX: AOJA    HPOS,DUPLX1     ;OUTPUT AND COUNT HPOS\r
1763 \r
1764 RUBOU1: TLZE    LINE,ROBTPD     ;END OF INPUT STREAM REACHED\r
1765         \r
1766         PUSHJ   PDP,BSECHO      ;OUTPUT A BACKSLASH\r
1767         JRST    CRLFEC          ;AND A CR LF\r
1768 \r
1769 CONTK:  HRRI    TAC,4           ;HERE ON V TAB\r
1770         SKIPA\r
1771 CONTL:  HRRI    TAC,10          ;HERE ON FORMFEED\r
1772         TLNN    LINE,T35                ;THIS TTY HAVE VERT MECHANICS?\r
1773         JRST    SIMFF           ;NO, SIMULATE IT\r
1774         PUSHJ   PDP,TTIPUT      ;PUT CHAR IN BUFFER AND ECHO IT\r
1775 CONTI1: MOVEI   CHREC,IDLECH            ;SYNCHRONOUS IDLE CHARACTERS\r
1776 SIMFF1: PUSHJ   PDP,DUPLX1      ;OUTPUT ECHO OF LF OR IDL\r
1777         TRNE    TAC,17          ;DONE YET?\r
1778         SOJA    TAC,.-2         ;NO. OUTPUT MORE\r
1779         POPJ    PDP,0           ;DONE\r
1780 \fSIMFF: TLO     TAC,ECHSUP      ;DON'T OUTPUT FF OR VT TO A 33\r
1781         PUSHJ   PDP,TTIPUT      ;PUT IT IN BUFFER\r
1782         MOVEI   CHREC,12        ;SIMULATE WITH LF'S\r
1783         JRST    SIMFF1\r
1784 \r
1785 CONTI:  TLNN    LINE,T35\r
1786         TLO     TAC,ECHSUP      ;DONT OUTPUT TAB TO 33\r
1787         PUSHJ   PDP,TTIPUT      ;PUT IN BUFFER AND MAYBE ECHO\r
1788         TLEN    LINE,XON+DISLIN ;IF PAPER TAPE,DISMISS\r
1789         POPJ    PDP,0           ; SO AS NOT TO OVERFILL OUTBUF\r
1790                                 ;ALSO, DISPLAY DOESNT WANT FILLER\r
1791         HRRI    TAC,1           ;TWO IDLES\r
1792         TLNE    LINE,T35\r
1793         JRST    CONTI1          ;GO SEND SLUFFS\r
1794 \r
1795 CONTI2: MOVEI   CHREC,40        ;SPACES FOR THE 33'S\r
1796         LDB     HPOS,PHPOS      ;WHERE WAS I BEFORE TAB?\r
1797         PUSHJ   PDP,AOJDPX      ;OUTPUT A SPACE\r
1798         TRNE    HPOS,7          ;AT A TAB STOP?\r
1799         JRST    .-2             ;NO. MORE SPACES.\r
1800         POPJ    PDP,0           ;RETURN FROM TTEDIT\r
1801 \fCRLFEC:        MOVEI   HPOS,0  ;ECHO A CR LF, SAVING CHREC\r
1802         PUSH    PDP,CHREC\r
1803         MOVEI   CHREC,15        ;CARRIAGE RETURN\r
1804         PUSHJ   PDP,DUPLX1      ;OUTPUT IT\r
1805         MOVEI   CHREC,12        ;LINE FEED\r
1806         PUSHJ   PDP,DUPLX1      ;OUTPUT THAT TOO\r
1807 CHPOPJ: POP     PDP,CHREC       ;RESTORE CHREC\r
1808         POPJ    PDP,0\r
1809 \r
1810 CNTLEC: HRRI    TAC,100(CHREC)  ;SAVE UN-CNTL CHARACTER\r
1811         MOVEI   CHREC,"^"\r
1812         PUSHJ   PDP,AOJDPX\r
1813         MOVEI   CHREC,(TAC)     ;TYPE ^ CHAR\r
1814         PUSHJ   PDP,AOJDPX\r
1815         TRZ     CHREC,100       ;RESTORE IT TO A CNTL CHAR\r
1816         POPJ    PDP,0\r
1817 \r
1818 CRLF:   MOVEI   HPOS,0  ;HERE ON INPUT OF A CARRIAGE RETURN\r
1819         TLNE    LINE,XON        ;IF PAPER TAPE, NO FREE LF\r
1820 \r
1821         JRST    TTIPUT          ;JUST STORE THE CR\r
1822         PUSHJ   PDP,TTIPUT      ;ORDINARILY, STORE AND GO ON HERE\r
1823         MOVEI   CHREC,12        ;BY ADDING A LF\r
1824         MOVSI   IOS,SYNC        ;WHICH IS A BREAK CHARACTER\r
1825         IORB    IOS,DEVIOS(DDB)\r
1826         TLNN    LINE,FULTWX+HLFDPX      ;IF NOT SELF ECHOING.\r
1827         JRST    TTIPUT          ;THIS WILL GIVE LF ECHO\r
1828         PUSHJ   PDP,TTIPUT      ;OTHERWISE, THIS WONT\r
1829         JRST    DUPLX1          ;BUT THIS WILL\r
1830 \fINTERN FTLOGIN\r
1831 \r
1832 INTERN CNCTST\r
1833 \r
1834 CNCTST:\r
1835 IFN FTLOGIN,<   EXTERN  JBTSTS\r
1836 \r
1837         LDB     TAC,PJOBN\r
1838         MOVE    TAC,JBTSTS(TAC)\r
1839         TLNE    TAC,JACCT\r
1840         MOVEI   CHREC,175\r
1841 >\r
1842         LDB     TAC,TIPUTR(DDB)\r
1843         CAIE    TAC,3\r
1844         POPJ    PDP,\r
1845 CNCTS1: PUSHJ   PDP,TSETBF      ;STOP ALL I/O, BY CLEARING BUFFERS\r
1846         MOVEI   DAT,TTIBUF(DDB)         ;GET POINTER BACK TO INPUT BFR\r
1847         MOVE    TAC,SPCTAB+3            ;AND BITS FOR CONTROL C\r
1848 \r
1849 \r
1850 CNCMOD: MOVE    IOS,[XWD DDTM+IO+IOSUPR+USRB,MERTPO+ECHOF+IGNOR]\r
1851         ANDCAM  IOS,DEVIOS(DDB)\r
1852         MOVSI   IOS,TPMON+IOFST\r
1853         IORB    IOS,DEVIOS(DDB)\r
1854         TLNE    LINE,PTYLIN             ;*\r
1855         PUSHJ   PDP,PTMNMD              ;*\r
1856         POPJ    PDP,\r
1857 \f;ROUTINE TO ECHO BACK-SLASH\r
1858 \r
1859 BSECHO: PUSH    PDP,CHREC               ;*\r
1860         MOVEI   CHREC,"\"\r
1861         PUSHJ   PDP,AOJDPX\r
1862         JRST    CHPOPJ\r
1863 \r
1864 ;ROUTINE TO DECREMENT PUTR\r
1865 \r
1866 INTERN DCPUTR\r
1867 \r
1868 DCPUTR: LDB     TAC,PLSTLC              ;CHECK FOR NONE TO DELETE\r
1869         CAMN    TAC,PCTR(DAT)\r
1870         POPJ    PDP,\r
1871 \r
1872         MOVSI   TAC,70000\r
1873         ADD     TAC,PUTR(DAT)           ;*\r
1874         TLNE    TAC,400000\r
1875         ADD     TAC,[XWD 347777,-1]\r
1876 \r
1877         MOVEM   TAC,PUTR(DAT)\r
1878         AOS     FCTR(DAT)\r
1879         AOS     TAC,PCTR(DAT)\r
1880         CAIG    TAC,TTYCHR              ;*\r
1881         JRST    CPOPJ1                  ;*\r
1882         SUBI    TAC,TTYCHR              ;*\r
1883         MOVEM   TAC,PCTR(DAT)\r
1884         MOVEI   TAC,STTYBF\r
1885         ADDM    TAC,PUTR(DAT)           ;*\r
1886         JRST    CPOPJ1\r
1887 \r
1888 ;ROUTINE TO DELETE CURRENT LINE (^U)\r
1889 \r
1890 DELETL: LDB     TAC,PLSTLC              ;WAS THERE LAST BREAK?\r
1891         MOVEM   TAC,TIPCTR(DDB)         ;STORE COUNT\r
1892         PUSHJ   PDP,TBYTEP              ;CONVERT TO A BYTE POINTER\r
1893         MOVEM   TAC,TIPUTR(DDB)         ;SAVE POINTER\r
1894         JRST    TRESC1                  ;GO COMPUTE TIFCTR\r
1895 \fIFN FTTALK,<\r
1896 EXTERNAL TPOPJ\r
1897 DOTALK: ANDI    CHREC,177\r
1898         HRRZ    DDB,TTYTAB(LINE)\r
1899         JUMPE   DDB,CPOPJ       ;NO SUCH LINE\r
1900         CAIN    CHREC,3\r
1901         JRST    NOTALK\r
1902         PUSH    PDP,LINE\r
1903 DOTAL1: LDB     LINE,PTALK\r
1904         HLL     LINE,LINTAB(LINE)\r
1905         HRRZ    DDB,TTYTAB(LINE)\r
1906         JUMPE   DDB,DOTAL2\r
1907         PUSH    PDP,CHREC\r
1908         CAMN    LINE,-1(PDP)\r
1909         TLNN    LINE,FULTWX+HLFDPX\r
1910         PUSHJ   PDP,PUTCHO\r
1911         MOVE    IOS,DEVIOS(DEVDAT)\r
1912         PUSHJ   PDP,TYPTST\r
1913         POP     PDP,CHREC\r
1914 DOTAL2: CAME    LINE,0(PDP)\r
1915         JRST    DOTAL1\r
1916         JRST    TPOPJ\r
1917 \r
1918 ;IF I TYPE A ^C IN TALK RING, THEN\r
1919 ;ASSUME NEXT_ME_PREV\r
1920 ;SET NEXT_PREV\r
1921 ;IF NEXT=PREV, CLEAR ITS TLKRNG BIT\r
1922 ;SET ME_ME\r
1923 ;CLEAR TLKRNG BIT IN LINTAB(ME)\r
1924 \r
1925 NOTALK: MOVEI   HPOS,0(LINE)    ;ME\r
1926         LDB     CHREC,PTALK     ;NEXT\r
1927 NOTAL1: LDB     TAC,PTALK\r
1928         CAMN TAC,HPOS   ;ME_?\r
1929         JRST    NOTAL2          ;YES. LINE=PREV\r
1930         MOVE    LINE,TAC        ;NO. FIND PREV\r
1931         JRST    NOTAL1\r
1932 NOTAL2: DPB     CHREC,PTALK     ;MAKE NEXT_PREV\r
1933         CAIE    CHREC,(LINE)    ;RING NOW EMPTY?\r
1934         JRST    NOTAL3  ;NO\r
1935         MOVSI   CHREC,TLKRNG    ;YES, CLR HIS BIT\r
1936         ANDCAM  CHREC,LINTAB(LINE)\r
1937 NOTAL3: MOVSI   CHREC,TLKRNG\r
1938         MOVE    LINE,HPOS       ;ME\r
1939         DPB     HPOS,PTALK      ;ME_ME\r
1940         ANDCAM  CHREC,LINTAB(LINE)      ;CLR MY BIT\r
1941         MOVEI   CHREC,3         ;GET A ^C AGAIN\r
1942         DPB     CHREC,TIPUTR(DDB)       ;LOOK LIKE 2 OF THEM\r
1943         JRST    RECINT          ;AND PROCESS IT FROM THE TOP\r
1944 >\r
1945 \f;ROUTINE TO TYPE CHAR\r
1946 ;CALL   MOVE LINE,LINE NO.\r
1947 ;       MOVE CHREC,CHARACTER\r
1948 ;       PUSHJ PDP,TYP\r
1949 \r
1950 INTERNAL TYPL\r
1951 EXTERNAL TCONLN,SCNTYP,PEVEN8\r
1952 \r
1953 TYP:\r
1954 TYPL:   TLNE    LINE,PTYLIN\r
1955         POPJ PDP,               ;YES\r
1956         PUSHJ   PDP,PEVEN8      ;GENERATE CORRECT PARITY\r
1957         TLNE LINE,CTYLIN        ;NO,CONSOLE TTY?\r
1958         JRST    SCNTYP                  ;TYPE CHAR.\r
1959 CTYP:   DATAO TTY,CHREC\r
1960         DPB     CHREC,PLASTC\r
1961         POPJ PDP,\r
1962 \f;ROUTINE TO SETUP DDB FOR OUTPUT\r
1963 ;CALL   MOVE TAC,[SIXBIT /TTY#/\r
1964 ;       PUSHJ PDP,GETDDB\r
1965 ;       NONE AVAILABLE RETURN\r
1966 ;       RETURN WITH LINE AND DDB SETUP\r
1967 \r
1968 EXTERNAL TCONLN,CPOPJ,CPOPJ1,TPOPJ1\r
1969 \r
1970 INTERNAL GETDDB\r
1971 \r
1972 GETDDB: MOVEI LINE,TCONLN\r
1973         CAMN TAC,[SIXBIT /CTY/] ;CTY?\r
1974         JRST GETDB1             ;YES\r
1975         HLLZ LINE,TAC           ;NO\r
1976         CAME LINE,[SIXBIT /TTY/]        ;TTY PREFIX?\r
1977         POPJ PDP,               ;NO\r
1978         TLZ TAC,-1              ;YES\r
1979         JUMPE TAC,CPOPJ         ;TTY?\r
1980         ROTC TAC,30             ;NO\r
1981         TRZE LINE,20            ;IS FIRST SUFFIX AN OCTA;L DIGIT?\r
1982         TRNE LINE,70\r
1983         POPJ PDP,               ;NO\r
1984         ROT TAC,3               ;YES\r
1985         TRC TAC,2               ;IS THERE A 2ND SUFFIX THAT IS AN\r
1986         TRNN TAC,7              ;OCTAL DIGIT?\r
1987         ROTC TAC,3              ;YES\r
1988         CAIL    LINE,TCONLN     ;LEGAL LINE NUMBER?\r
1989         POPJ    PDP,            ;NO\r
1990 GETDB1: HRRZ    DDB,TTYTAB(LINE)        ;DOES THIS LINE HAVE A DDB?\r
1991         JUMPN   DDB,CPOPJ1              ;JUMP IF SO.\r
1992         PUSHJ PDP,DDBSRC        ;NO. SEARCH FOR FREE DDB\r
1993         POPJ PDP,               ;NONE AVAILABLE\r
1994         HLLZM IOS,DEVIOS(DDB)   ;INITIALIZE STATE\r
1995         PUSH    PDP,DEVNAM(DDB)\r
1996         MOVEI   TAC,ASSCON+ASSPRG\r
1997         ANDCAM  TAC,DEVMOD(DDB)\r
1998         JRST TPOPJ1\r
1999 \f;ROUTINE TO SEARCH FOR FREE TTY DEV DATA BLOCK\r
2000 ;CALL:  MOVE LINE,TTY LINE NO.\r
2001 ;       PUSHJ PDP,DDBSRC\r
2002 ;       NONE FOUND OR LINE NO, TOO BIG\r
2003 ;       RETURN DEVDAT,LINE AND DEVNAME SET AND BITS TPMON,IOFST,IOACT,\r
2004 ;               TTYUSE,ASSCON SET.\r
2005 \r
2006 EXTERNAL TTPLEN,MLTTYL,CPOPJ\r
2007 INTERNAL DDBSRC\r
2008 \r
2009 DDBSRC: HRRZ    TAC,LINE                ;NUMBER OF LINE ONLY\r
2010         CAILE TAC,TTPLEN        ;IS LINE NO. TOO BIG\r
2011         POPJ PDP,               ;YES.\r
2012         MOVSI IOS,MLTTYL        ;NO. OF TTY DDBS\r
2013         MOVEI DEVDAT,TTYLST     ;ADDRESS OF FIRST TTY DDB\r
2014         SKIPA   TAC,[XWD TTYUSE+TTYATC,ASSPRG+ASSCON]\r
2015         HLRZ DEVDAT,DEVSER(DEVDAT)      ;CHAIN THRU DDBS\r
2016         TDNE TAC,DEVMOD(DEVDAT) ;USE,ATTACH OR ASSIGN BITS ON?\r
2017         AOBJN IOS,.-2           ;YES. DONE?\r
2018 \r
2019         JUMPGE IOS,CPOPJ        ;YES. DEVICE DATA BLOCK FOUND?\r
2020         MOVSI   TAC,TOIP                ;CLEAR TOIP IN DDB\r
2021         ANDCAM  TAC,TTYPTR(DDB)         ;IN CASE OF PREVIOUS DETACH\r
2022         MOVSI   TAC,PROG\r
2023         MOVEM   TAC,DEVIAD(DDB) ;CLEARS PHPOS\r
2024         MOVEM   TAC,DEVOAD(DDB) ;CLEARS PFITCH\r
2025         MOVE IOS,[XWD TPMON+IOFST,IOACT]\r
2026         PUSH    PDP,DAT\r
2027         PUSHJ   PDP,TSETBF              ;INITIALIZE BUFFERS\r
2028         POP     PDP,DAT\r
2029         MOVE TAC,[XWD TTYUSE,ASSCON];INITIALIZE DATA BLOCK.\r
2030 \r
2031 ;FALL INTO SCNIN\r
2032 \f;INITIALIZE TTY DEVICE DATA BLOCK(CALLED FROM TTYATT TOO)\r
2033 ;CALL:  MOVE TAC,BITS IN DEVMOD TO BE TURNED ON\r
2034 ;       MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
2035 ;       PUSHJ PDP,SCNIN\r
2036 ;       SKIP RETURN ALWAYS\r
2037 \r
2038 ;       CALLED BY JRST FROM TTYATT\r
2039 ;       AND FALLS IN FROM DDBSRC ABOVE\r
2040 \r
2041 ;SETS PHYSICAL NAME TO SIXBIT /TTY#/ OR SIXBIT /CTY/\r
2042 ;       WHERE # IS THE LINE NUMBER.\r
2043 ;STORES LINE NUMBER IN DEVICE DATA BLOCK\r
2044 \r
2045 EXTERNAL PUNIT,TTYTAB,TCONLN,CPOPJ1\r
2046 \r
2047 SCNIN:  IORM TAC,DEVMOD(DEVDAT)\r
2048         DPB LINE,PUNIT          ;SET LINE NO. IN DDB.\r
2049 \r
2050 INTERNAL FTTALK\r
2051 IFN FTTALK,<\r
2052         DPB LINE,PTALK          ;SETUP TALK RING TO CONTAIN\r
2053                                 ;ONLY THIS TTY.\r
2054 >\r
2055         MOVSI TAC,646471        ;SIXBIT /TTY/\r
2056         MOVEM TAC,DEVNAM(DEVDAT)\r
2057         MOVE TAC,[POINT 6,DEVNAM(DEVDAT),17]\r
2058         TRNN LINE,70            ;IS THERE A HIGH ORDER OCTAL DIGIT?\r
2059         JRST SCNIN0             ;NO\r
2060         ROT LINE,-3             ;YES, CONVERT TO SIXBIT.\r
2061         ADDI LINE,20\r
2062         IDPB LINE,TAC           ;STORE HIGH ORDER SIXBIT DIGIT\r
2063         TRZ LINE,-1             ;LOW ORDER DIGIT IN LINE\r
2064         ROT LINE,3\r
2065 SCNIN0: ADDI LINE,20\r
2066         IDPB LINE,TAC           ;STORE LOW ORDER DIGIT\r
2067         PUSHJ   PDP,STLNAC\r
2068         HRRM DEVDAT,TTYTAB(LINE)        ;SET DDB ADR. IN TRANSLATOR TABLE.\r
2069         MOVSI TAC,436471        ;SIXBIT /CTY/\r
2070         TLNE    LINE,CTYLIN     ;IS THIS CONSOLE TTY?\r
2071         MOVEM TAC,DEVNAM(DEVDAT);YES, SET NAME TO CTY.\r
2072         TLNE    LINE,PTYLIN             ;IS THIS A PTY?\r
2073         PUSHJ   PDP,PTMNND              ;YES. SET IT INTO MONITOR MODE\r
2074         JRST CPOPJ1             ;SUCCESSFUL RETURN.\r
2075 \fSCNEND:        END\r
2076 \f\r