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