1 TITLE SCNSRF - SCANNER AND CONSOLE TELETYPE SERVICE ROUTINE - V415
\r
2 SUBTTL R CLEMENTS.RCC TS 03 JUN 69
\r
9 ;SCANSER IS ORGANIZED INTO THE FOLLOWING SECTIONS
\r
11 ; I. COMMENTARY ON OPERATION AND DATA STRUCTURES
\r
12 ; II. SYSTEM INITIALIZATION ROUTINE - SCNINI
\r
13 ; III. UUO LEVEL ROUTINES
\r
19 ; IV. COMAND LEVEL ROUTINES
\r
31 ; V. INTERRUPT SERVICE ROUTINES
\r
34 ; C. RFCINT - ALL LINES RECEIVER INTERRUPT
\r
35 ; 1. TTEDIT - EDITS AND ECHOS
\r
36 ; D. XMTINT - TRANSMIT INTERRUPT
\r
39 \f;DATA STRUCTURES AND PARAMETERS
\r
41 ; DEFINED BY BUILD PROCESS FOR THE CONFIGURATION
\r
42 ; SCNLIN=OCTAL NO. OF SCANNER LINES (0 THRU SCNLIN-1)
\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
53 ; DEVOPR: 0 SIXBIT PHYSICAL NAME OF OPERATORS
\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
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
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
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
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
88 FTTTYSER=-1 ;DEFINE THIS SYSTEM TO HAVE SCNSRF
\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
101 ECHOF=IODTER ;ECHO FAILURE OCCURED.
\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
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
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
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
137 ;ABOVE ARE "PERMANENT" CHARACTERISTICS
\r
139 TLKRNG=1 ;THIS LINE CURRENTLY IN A TALK RING
\r
140 XON=2 ;^Q TYPED, PAPER TAPE INPUT
\r
142 FULTWX=4 ;SELF ECHOING FULL DUPLEX
\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
150 ;ABOVE ARE TEMPORARY BITS, TURNED ON AND OFF BY VARIOUS MEANS
\r
151 ;(BY MONITOR, TYPE-IN COMMANDS, OR PROGRAM)
\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
156 ;DECLARE THESE AS INTERNS TO GET THEM IN THE MAP
\r
157 ;AND TO CHECK AGAINST S IN COMMON
\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
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
171 PION=200 ;TURN PI ON BIT
\r
172 PIOFF=400 ;TURN PI OFF BIT
\r
174 IDLECH=1 ;DELAY CHAR FOR TABS, ETC,
\r
175 ; SHOULD BE ^V, BUT FOR 37'S
\r
181 INTERNAL TPCJOBN,TYPX,FULTWX,TYPE,TAKR,BREAKB
\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
190 PTALK: POINT 6,TTYTAB(LINE),17 ;POINTER TO ANOTHER TTY IN TALK RING
\r
193 INTERN PLASTC,PCOMIC
\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
200 TOIP=400000 ;SIGN OF TTYPTR(DDB) - TYPE-OUT IN PROGRESS
\r
202 ;TTYPTR CONTAINS THE FOLLOWING BYTES:
\r
204 ; 0 ON IF TYPE-OUT IN PROGRESS
\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
217 ; 4)SETS TTYUSE#1 IN ALL TTY DDBS IN THE TRANSLATOR TABLE.
\r
219 EXTERNAL SCNCHN,MLTTYL,MTTYLN,TTYTAB,SCNINI
\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
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
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
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
261 \f;ROUTINES TO SET UP BUFFERS
\r
263 INTERNAL TSETBF,SETBFI,PUTCHI
\r
265 SETBFI: MOVEI DAT,1
\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
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
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
288 ; ERROR RETURN, BUFFER "FULL"
\r
289 ; SUCCESSFUL RETURN
\r
291 PUTCHI: SOSGE FCTR(DAT) ;ANY FREE SPACES LEFT?
\r
293 PUTCI2: SOSLE PCTR(DAT) ;LAST BYTE IN BUFFER FILLED?
\r
294 JRST PUTCI1 ;NO, GO AHEAD
\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
304 ;ROUTINE TO STUFF MONITOR ERROR MESSAGE IN TTI BUFFER
\r
305 ;CALLED IN LINE FROM PUTCH0
\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
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
318 ;ROUTINE TO PICK UP A CHARACTER FROM ANY BUFFER
\r
319 ;CALL MOVEI DAT,TTXBUF(DDB) ;TO SPECIFY BUFFER
\r
321 ; ONLY RETURN ;CHARACTER OR ZERO IN CHREC
\r
322 ; ;ZERO INDICATES BUFFER "EMPTY"(TAKR=PUTR)
\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
340 GETCH1: TDZA CHREC,CHREC ;RETURN 0 INDICATING END OF BUFFER
\r
341 PUTCI0: AOS FCTR(DAT) ;READJUST FREE COUNTER
\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
349 ; ONLY RETURN, WHETHER OR NOT CHARACTER WAS PLACED
\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
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
366 ; RETURN1 IF REGULAR ASCII CHAR (40-174), C(TAC)=0
\r
367 ; RETURN2 IF SPECIAL CHAR., TAC LOADED WITH WORD FROM SPCTAB
\r
371 SPCHEK: MOVEI TAC,0 ;LOAD TAC WITH 0 OR SPECIAL CHAR. WORD
\r
376 SKIPA TAC,SPCTAB-135(CHREC)
\r
378 SPCHK1: MOVE TAC,SPCTAB(CHREC)
\r
380 \f;SPECIAL CHARACTER TABLE
\r
381 ;FORMAT XWD BITS+CHAR,ADRESS OF ROUTINE
\r
382 ;HIGH ORDER BITS IN LH:
\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
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
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
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
424 ;ABOVE ARE CONTROL CHARACTERS, BELOW ASCII 175-177
\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
432 ;CALL AC,[SIXBIT /DDTIN/] AC CONTAINS POINTER TO BUFFER AREA
\r
433 ;BUFFER AREA MUST BE 21 WORDS LONG
\r
436 EXTERNAL WSYNC,IADRCK,ADRERR
\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
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
457 MOVSI AC2,440700+PROG
\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
466 TLNE TAC,FCSBRK+BREAKB
\r
468 XFRIN1: CAIN CHREC,3 ;PRESTORED CONTROL C?
\r
469 JRST DDTCNC ;YES, GO INTO MONITOR MODE
\r
471 SOJG AC1,XFRIN ;LOOP TILL DONE
\r
472 XFRIN2: MOVEI CHREC,0 ;TERMINATE STRING
\r
474 MOVSI TAC,IOSUPR ;MAKE SURE IO NO LONGER SUPR.
\r
475 ANDCAM TAC,DEVIOS(DEVDAT)
\r
478 DDTCNC: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS
\r
479 JRST MONUS6 ;GO PROCESS ^C
\r
482 EXTERNAL PTYOW,WSYNC
\r
484 ;TWSYNC IS CALLED FOR INPUT IO WAIT
\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
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
500 ;CALL AC,[SIXBIT /DDTOUT/] AC HAS POINTER TO DDT OUTPUT BUFFER
\r
504 DDTOUT: PUSHJ PDP,TTYFNU
\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
525 DDTWAT: MOVEI IOS,IOACT ;WAIT UNTIL MONITOR BUFFER EMPTY
\r
526 IORB IOS,DEVIOS(DDB)
\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
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
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
542 ; ONLY RETURN, WITH CHAR, OR ITS SPECIAL ECHO PLACED IN OUT BUFFER
\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
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
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
570 \f;HERE ON UUO OUTPUT OF HT,FF,VT
\r
572 OUTCH1: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS
\r
573 TLNE LINE,T35 ;SMART TTY?
\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
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
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
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
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
608 CAIN CHREC,15 ;CARRIAGE RETURN?
\r
610 CAIE CHREC,11 ;TAB?
\r
611 JRST SPCHEK ;NO. NO HP MOD
\r
612 TRO HPOS,7 ;TAB. TO NEXT 8
\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
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
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
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
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
667 ;SCNINI SETS BUFFERS TO LENGTH TTYCHR AT PRESENT. ALSO
\r
668 ;PRESENT CODE OCCASIONALLY USES TTYCHR RATHER THEN READING LH
\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
691 INTERNAL SCNDDB,LINSAV
\r
692 TTYLST=. ;FIRST TTT DDB
\r
694 SCNDDB: SIXBIT /TTY0/ ;DEVNAME
\r
695 XWD 0,STTYBF+1 ;DEVCHR
\r
698 XWD DVTTY+DVIN+DVOUT,3 ;DEVMOD
\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
708 XWD STTYBF*5,0 ;RH IS BUFFER ADR
\r
720 ;BUFFER USED AS PUSH-DOWN LIST BY SYSTEM DURING
\r
721 ;INITIALIZATION AND RESTARTING
\r
739 ;NO. OF CHAR. IN MON. BUF.
\r
741 XP TTYCHR,<<STTYBF>*5>
\r
742 XP SCNDDS,.-ZZ ;SIZE OF SCN DDB
\r
745 > ;CLOSE IFE FTMONP WAY BACK
\r
746 \f;DEVICE DEPENDENT PART OF IO UUOS.
\r
752 EXTERNAL OUT,SCNON,SCNOFF
\r
754 JRST TTYINI ;INITIALIZATION
\r
755 JRST CPOPJ1 ;TTY HUNG TIME-OUT, IGNORE
\r
756 SCNDSP: JRST TTYREL ;RELEASE
\r
758 JRST TTYOUT ;OUTPUT
\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
769 TTYIN1: SKIPG TISYNC(DDB)
\r
772 TENDIN: MOVE IOS,[XWD TTYIOW+DDTM+IOSUPR,ECHOF+MERTPO+IGNOR+IOACT]
\r
773 T0POPJ: ANDCAB IOS,DEVIOS(DDB)
\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
778 EXTERNAL ADVBFF,STTIOD,BUFCLR
\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
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
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
801 CAIN CHREC,"Z"-100 ;^Z READ?
\r
803 IORB IOS,DEVIOS(DDB)
\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
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
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
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
828 MONUS7: MOVE IOS,[XWD TTYIOW,IOACT]
\r
829 IORB IOS,DEVIOS(DDB) ;PUT JOB BACK IN IOWAIT
\r
831 JRST TTYIN ;RESTART INPUT UUO
\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
838 EXTERNAL PTYPE,ADVBFE
\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
846 IORB IOS,DEVIOS(DDB)
\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
853 JRST .+3 ;MOVE BUFFERS AVAILABLE
\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
860 CONO PI,PIOFF ;PREVENT TIMING GLITCH
\r
861 TDNN TAC,TTYPTR(DDB) ;IS TYPE-OUT ALREADY ON?
\r
866 UTYPT1: IORM TAC,TTYPTR(DDB) ;START TYPTEOUT
\r
868 \f;ROUTINE TO MOVE USER OUTPUT BUFFER TO MON. OUTPUT BUFFER
\r
869 ;CALLED ONLY AT UUO LEVEL,BY OUTPUT UUO
\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
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
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
886 USRMN5: SOJG AC2,USRMN2 ;LOOP AS LONG AS THERE ARE CHAR'S,
\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
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
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
916 JRST @TTUUOT(UCHN) ;DISPATCH TO UUO ROUTINES
\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
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
934 \f;INPUT A CHARACTER AND SKIP---IF NONE TYPED, DON'T SKIP
\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
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
947 JRST MONUS6 ;STORED ^C
\r
948 MOVEM CHREC,@UUO ;MOVE INTO LOC, SPECIFIED BY UUO
\r
949 JRST CPOPJ1 ;AND SKIP RETURN
\r
951 ;INPUT CHARACTER AND WAIT, LINE MODE
\r
953 INCHWL: PUSHJ PDP,INCHSL ;SEE IF ANY CHARS.
\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
965 OUTSTR: JRST DDT5 ;JUST USE DDT OUTPUT CODE
\r
967 SKPINL: SKIPLE TISYNC(DDB) ;INPUT BUFFER HAVE A LINE?
\r
968 AOS 0(PDP) ;YES, SKIP.
\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
977 EXTERNAL TTPLEN,GETWDU
\r
979 ;INCHRW GOES INTO I/O WAIT IF NO CHARACTER HAS BEEN TYPED--NO SKIPS
\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
989 ;ONEOUT OUTPUTS ONE CHARACTER
\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
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
1001 ;GETLIN PUTS LINE CHARACTERISTICS WORD INTO ADR. IN UUO ADR. FIELD
\r
1003 GETLIN: SKIPGE TAC,@UUO ;DOES USER WANT ONE LINE CHAR. WD.?
\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
1018 ;ROUTINE TO SET LINE CHARACTERISTICS THAT ARE SETABLE
\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
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
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
1040 INTERNAL TTYATT,TTYATI
\r
1041 EXTERNAL PUNIT,PJOBN,TTYTAB
\r
1046 TTYATT: PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS
\r
1047 MOVEI DEVDAT,TTYLST ;SEARCH FOR DDB THAT IS ATTACHED
\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
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
1084 TTYAT4: MOVE DEVDAT,TTYTAB(LINE);RESTORE OLD DDB ADDRESS.
\r
1088 TTYATT: LDB LINE,PUNIT ;LINE NO. OF THIS TTY
\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
1100 ;CALLED FROM COMMAND
\r
1102 INTERNAL TTYCOM,TTYCM
\r
1103 EXTERNAL MTTYLN,TTYTAB,CPOPJ
\r
1105 TTYCOM: SKIPL LINE,LINSAV
\r
1107 SKIPL TAC,TTYTAB(LINE)
\r
1108 TTYCM1: AOBJN LINE,.-1
\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
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
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
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
1140 ;CALLED FROM TTYATT AND COMCON (DETACH)
\r
1141 ;CLEARS TTYATC AND TRNALSATOR TABLE ENTRY.
\r
1142 ;SETS TTYDTC IN DEVIOS(DDB)
\r
1146 EXTERNAL PUNIT,TTYTAB
\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
1152 MOVSI IOS,TTYDTC ;YES. MARK IT DETACHED
\r
1153 IORM IOS,DEVIOS(DDB)
\r
1154 JRST TTYKL1 ;GO CLEAR TTYTAB AND DEVNAM
\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
1165 TRESCN: LDB TAC,PCOMIC ;GET OLD TITCTR
\r
1166 MOVEM TAC,TITCTR(DDB) ;RESTORE IT
\r
1168 MOVEM TAC,TITAKR(DDB)
\r
1169 TRESC1: MOVE TAC,TIPCTR(DDB) ;CALLED HERE FROM ^U CODE
\r
1171 SUB TAC,TITCTR(DDB)
\r
1174 MOVEM TAC,TIFCTR(DDB)
\r
1178 TRESCU: PUSHJ PDP,TRESCN
\r
1180 MOVEI DAT,TTIBUF(DDB)
\r
1181 TRESCL: PUSHJ PDP,GETCHR
\r
1182 JUMPE CHREC,TRESCN
\r
1185 TLNE TAC,FCSBRK+BREAKB
\r
1188 \fTLHBYT: XWD 350700,0
\r
1194 TBYTEP: PUSH PDP,TAC1 ;SAVE LINE
\r
1199 ADD TAC,TTIBUF(DDB)
\r
1200 HLL TAC,TLHBYT(TAC1)
\r
1201 POP PDP,TAC1 ;RESTORE LINE
\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
1209 INTERNAL TTYFNU,TTYFND,TTYERP
\r
1214 TTYFNU: MOVE ITEM,JOB
\r
1215 TTYFND: PUSHJ PDP,TTYSRC
\r
1216 TTYDAT: MOVEI DAT,TTOBUF(DDB)
\r
1220 ;PUT JOB IN IO WAIT IF TTY BUFFER NOT EMPTY
\r
1221 ;CALLED BY NON ERROR MESSAGE ROUTINES AT UUO LEVEL
\r
1226 TTYFUW: PUSHJ PDP,TTYFNU
\r
1227 MOVE TAC,TOPUTR(DDB)
\r
1229 CAMN TAC,TOTAKR(DDB)
\r
1231 MOVEI IOS,IOACT ;YES
\r
1232 IORB IOS,DEVIOS(DDB)
\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
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
1244 TDNE TAC,DEVMOD(DDB)
\r
1245 JRST T0POPJ ;GO CLEAR OUT IOS BITS
\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
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
1261 EXTERNAL PJOBN,PTMNMD
\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
1272 IORB IOS,DEVIOS(DDB) ;TURN TPMON ON IN CASE TTY IS
\r
1274 PUSHJ PDP,STLNAC ;GET LINE CHARACTERISTICS
\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
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
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
1297 ;CALLED FROM RUNCSS (START1)
\r
1298 ;CLEARS DDTM,IOUPR,USRB,TTYIOW AND IOW
\r
1303 TTYSET: MOVSI IOS,DDTM+IOSUPR+USRB+TTYIOW+IOW
\r
1304 JRST T0POPJ ;GO CLEAR BITS
\r
1307 EXTERNAL JOB,MTTYLN,TTYTAB,DEVPHY,DEVOPR,ERROR
\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
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
1322 TTYF0: AOBJN LINE,TTYSRA
\r
1323 TTYF1: MOVSI TAC,576062 ;LOOK FOR DEVICE "OPR"
\r
1325 PUSHJ PDP,DEVPHY ;SEARCH PHYSICAL DEVICE NAMES FOR OPR
\r
1326 SKIPA TAC,DEVOPR ;NOT FOUND.
\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
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
1344 EXTERNAL PTMNMD,PTMNMZ
\r
1346 INTERNAL TTYSTC,TTYTCM
\r
1349 TTYSTC: MOVSI TAC,USRB ;CLEAR BIT IN MEMORY
\r
1350 ANDCAM TAC,DEVIOS(DDB)
\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
1361 ;CALLED FROM COMINI
\r
1362 ;INITIALIZED TTY FOR MONITOR OUTPUT AND STARTS OUTPUT
\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
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
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
1394 EXTERNAL PUNIT,CPOPJ1
\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
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
1410 POPJ PDP, ;NO, HE IS BUSY.
\r
1411 TTYTK1: CONO PI,SCNOFF
\r
1412 LDB LINE,PUNIT ;LINE NUMBER IS RING.
\r
1415 TDNN TAC,LINTAB(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
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
1428 JRST CPOPJ1 ;OK RETURN
\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
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
1445 EXTERNAL SCNSAV,SCNCHN,TCONLN
\r
1447 CTYINT: CONSO TTY,50 ;TTI OR TTO FLAG?
\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
1454 JRST RECINT ;RECEIVER INTERRUPT HANDLER
\r
1456 CTYOU1: MOVEI CHREC,SCNCHN
\r
1457 CONO TTY,200(CHREC) ;CLEAR TTO FLAG.
\r
1458 JRST XMTINT ;COMMON TRANSMIT INTERRUPT HANDLER
\r
1460 ;SCANNER INTERRUPT SERVICE ROUTINE IS IN SEPARATE DEVICE DEPENDENT SECTION
\r
1462 EXTERNAL SCNSAV,TCONLN,TTYTAB
\r
1463 \f;COMMON RECEIVER INTERRUPT FOR ALL KEYBOARD DEVICES
\r
1465 INTERNAL RECINT,INUS2,INJEST
\r
1470 INUS2: ;TAG FOR INTERRUPT SERVICE
\r
1471 INJEST: ;ANOTHER TAG, NOT USED, BUT WANTED BY LOSING DLSINT
\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
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
1485 IFN FTTALK,< TLNE LINE,TLKRNG ;IN A TALK RING?
\r
1486 JRST DOTALK ;YES, GO TALK
\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
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
1521 SKIPGE TTYPTR(DDB) ;TYPEOUT HAPPENING?
\r
1523 IORM TAC,TTYPTR(DDB) ;NO, BUT THERE IS NOW
\r
1525 PUSHJ PDP,STLNAC ;TAC1 CLOBBERED ABOVE BY STTIOD
\r
1526 JRST XMTIN1 ;START OUTPUT
\r
1528 TYPT1: CONO PI,PION
\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
1540 ;ROUTINE TO HANDLE HALF DUPLEX RECEIVE INTERRUPTS
\r
1541 ;CALLED ONLY AT RCV INTERRUPT LEVEL
\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
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
1562 TRO TAC,^D30 ;1/2 SECOND
\r
1563 HRLI TAC,ENDECH ;WHERE TO RESPOND TO
\r
1565 IDPB TAC,CLOCK ;REQUEST FROM CLOCK
\r
1567 MOVEM IOS,DEVIOS(DDB) ;ONLY AT INTERRUPT LEVEL
\r
1568 POPJ PDP, ;DISMISS INTERRUPT
\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
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
1579 \f;ROUTINE TO TYPE X IF LINE CANNOT GET INTO SYSTEM
\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
1585 JRST TYPL ;TYPE OUT "X"
\r
1587 ;ROUTINE TO WAKE UP COMMAND DECORDER IF TPMON IS SET
\r
1589 COMSET: TLNN IOS,TPMON ;MONITOR MODE?
\r
1590 POPJ PDP, ;NO, NOT MONITOR COMMAND
\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
1597 \fINTERNAL XMTINT,PTYGET
\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
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
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
1620 \f;HERE WHEN OUTPUT BUFFER(S) EMPTIED
\r
1622 XMTIN4: MOVEI IOS,MERTPO
\r
1623 ANDCAB IOS,DEVIOS(DDB)
\r
1625 ANDCAM CHREC,TTYPTR(DDB) ;CLEAR MERTPO AND TOIP
\r
1628 LDB HPOS,PJOBN ;JOB NUMBER DDB IS ATTACHED TO
\r
1632 ANDCAB IOS,DEVIOS(DDB)
\r
1633 TLNE LINE,TLKRNG ;OR TALKING?
\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
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
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
1657 TYPE: JUMPE CHREC,CPOPJ ;IS TYPING STILL TO BE IN PROGRESS?
\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
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
1681 TTEDIT: PUSHJ PDP,ADJHP ;ADJUST HP AND CHECK SPECIAL
\r
1682 JRST TIPACK ;NOT SPECIAL
\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
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
1705 INTERNAL INBFUL ;FOR THE PTY
\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
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
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
1734 ALTMOD: HRRI TAC,(CHREC) ;SAVE WHICH KIND OF ALTMOD
\r
1735 MOVEI CHREC,44 ;ECHO A $
\r
1737 TRNN IOS,DLRSUP ;400 IN IOS REMOVES ECHO OF $
\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
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
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
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
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
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
1774 CONTK: HRRI TAC,4 ;HERE ON V TAB
\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
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
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
1799 JRST CONTI1 ;GO SEND SLUFFS
\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
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
1816 CNTLEC: HRRI TAC,100(CHREC) ;SAVE UN-CNTL CHARACTER
\r
1819 MOVEI CHREC,(TAC) ;TYPE ^ CHAR
\r
1821 TRZ CHREC,100 ;RESTORE IT TO A CNTL CHAR
\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
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
1841 IFN FTLOGIN,< EXTERN JBTSTS
\r
1844 MOVE TAC,JBTSTS(TAC)
\r
1848 LDB TAC,TIPUTR(DDB)
\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
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
1863 \f;ROUTINE TO ECHO BACK-SLASH
\r
1865 BSECHO: PUSH PDP,CHREC ;*
\r
1870 ;ROUTINE TO DECREMENT PUTR
\r
1874 DCPUTR: LDB TAC,PLSTLC ;CHECK FOR NONE TO DELETE
\r
1875 CAMN TAC,PCTR(DAT)
\r
1879 ADD TAC,PUTR(DAT) ;*
\r
1881 ADD TAC,[XWD 347777,-1]
\r
1883 MOVEM TAC,PUTR(DAT)
\r
1886 CAIG TAC,TTYCHR ;*
\r
1888 SUBI TAC,TTYCHR ;*
\r
1889 MOVEM TAC,PCTR(DAT)
\r
1891 ADDM TAC,PUTR(DAT) ;*
\r
1894 ;ROUTINE TO DELETE CURRENT LINE (^U)
\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
1903 DOTALK: ANDI CHREC,177
\r
1904 HRRZ DDB,TTYTAB(LINE)
\r
1905 JUMPE DDB,CPOPJ ;NO SUCH LINE
\r
1909 DOTAL1: LDB LINE,PTALK
\r
1910 HLL LINE,LINTAB(LINE)
\r
1911 HRRZ DDB,TTYTAB(LINE)
\r
1915 TLNN LINE,FULTWX+HLFDPX
\r
1917 MOVE IOS,DEVIOS(DEVDAT)
\r
1920 DOTAL2: CAME LINE,0(PDP)
\r
1924 ;IF I TYPE A ^C IN TALK RING, THEN
\r
1925 ;ASSUME NEXT_ME_PREV
\r
1927 ;IF NEXT=PREV, CLEAR ITS TLKRNG BIT
\r
1929 ;CLEAR TLKRNG BIT IN LINTAB(ME)
\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
1938 NOTAL2: DPB CHREC,PTALK ;MAKE NEXT_PREV
\r
1939 CAIE CHREC,(LINE) ;RING NOW EMPTY?
\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
1951 \f;ROUTINE TO TYPE CHAR
\r
1952 ;CALL MOVE LINE,LINE NO.
\r
1953 ; MOVE CHREC,CHARACTER
\r
1957 EXTERNAL TCONLN,SCNTYP,PEVEN8
\r
1960 TYPL: TLNE LINE,PTYLIN
\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
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
1974 EXTERNAL TCONLN,CPOPJ,CPOPJ1,TPOPJ1
\r
1978 GETDDB: MOVEI LINE,TCONLN
\r
1979 CAMN TAC,[SIXBIT /CTY/] ;CTY?
\r
1982 CAME LINE,[SIXBIT /TTY/] ;TTY PREFIX?
\r
1985 JUMPE TAC,CPOPJ ;TTY?
\r
1987 TRZE LINE,20 ;IS FIRST SUFFIX AN OCTA;L DIGIT?
\r
1991 TRC TAC,2 ;IS THERE A 2ND SUFFIX THAT IS AN
\r
1992 TRNN TAC,7 ;OCTAL DIGIT?
\r
1994 CAIL LINE,TCONLN ;LEGAL LINE NUMBER?
\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
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
2012 EXTERNAL TTPLEN,MLTTYL,CPOPJ
\r
2015 DDBSRC: HRRZ TAC,LINE ;NUMBER OF LINE ONLY
\r
2016 CAILE TAC,TTPLEN ;IS LINE NO. TOO BIG
\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
2028 MOVEM TAC,DEVIAD(DDB) ;CLEARS PHPOS
\r
2029 MOVEM TAC,DEVOAD(DDB) ;CLEARS PFITCH
\r
2030 MOVE IOS,[XWD TPMON+IOFST,IOACT]
\r
2032 PUSHJ PDP,TSETBF ;INITIALIZE BUFFERS
\r
2034 MOVE TAC,[XWD TTYUSE,ASSCON];INITIALIZE DATA BLOCK.
\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
2041 ; SKIP RETURN ALWAYS
\r
2043 ; CALLED BY JRST FROM TTYATT
\r
2044 ; AND FALLS IN FROM DDBSRC ABOVE
\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
2050 EXTERNAL PUNIT,TTYTAB,TCONLN,CPOPJ1
\r
2052 SCNIN: IORM TAC,DEVMOD(DEVDAT)
\r
2053 DPB LINE,PUNIT ;SET LINE NO. IN DDB.
\r
2057 DPB LINE,PTALK ;SETUP TALK RING TO CONTAIN
\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
2065 ROT LINE,-3 ;YES, CONVERT TO SIXBIT.
\r
2067 IDPB LINE,TAC ;STORE HIGH ORDER SIXBIT DIGIT
\r
2068 TRZ LINE,-1 ;LOW ORDER DIGIT IN LINE
\r
2070 SCNIN0: ADDI LINE,20
\r
2071 IDPB LINE,TAC ;STORE LOW ORDER DIGIT
\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