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