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