1 TITLE PTYSRF - FULL DUPLEX PSEUDO TELETYPE SERVICE ROUTINES
\r
2 SUBTTL M. FREDRIKSEN/RCC TS 06 DEC 68 V006
\r
4 ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP
\r
6 ENTRY PTYSRF ;DUMMY GLOBAL FOR FULL DUPLEX PTY
\r
11 ;ACCUMULATOR ASSIGNMENTS
\r
20 ;FOLLOWING BITS, AND LINE AND CHREC ASSIGMENTS
\r
21 ; MUST AGREE WITH THOSE IN SCNSRF
\r
25 TOIP=400000 ;SIGN OF TTYPTR IN TTY DDB
\r
26 SYNC=20000 ;BREAK CHARACTER SEEN---FROM SCNSER
\r
28 ;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)
\r
30 IOPTW=4000 ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT)
\r
31 IOPTRE=2000 ;PTY RESPONSE IS READY
\r
32 MONMOD=1000 ;PTY IS IN MONITOR MODE
\r
36 FTTTYSER=-1 ;FORCE MULT DEF GLOBAL IF WRONG APRSER
\r
37 \fINTERNAL FTCHECK,FTMONP
\r
38 IFN FTCHECK+FTMONP,<
\r
39 EXTERNAL PTYDDB,PIOSAV,PTYSAC,PTYDNB,PTYBM1,PTYDDS,PIOSAV,PDDSAV
\r
40 EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV
\r
41 INTERNAL PTYSA0,PTYRE0,ACSAV0
\r
43 IFE FTCHECK+FTMONP,<
\r
44 ;PSEUDO CONSOLE DEVICE DATA BLOCK
\r
45 ;REMAINING PTY DDB'S ARE GENERATED
\r
46 ;OUT OF LINE AT BUILD TIME
\r
49 PTYDDB: SIXBIT /PTY0/
\r
50 XWD 0,10000+STTYBF+1 ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.
\r
58 XP PTYDDS,.-ZZ ;SIZE OF PTY DDB
\r
62 POPJ PDP, ;INITIALIZE
\r
63 POPJ PDP, ;PRINT ERROR, STOP JOB
\r
69 EXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL,PUNIT
\r
71 PTYREL: LDB LINE,PUNIT
\r
76 HRRZ DDB,TTYTAB(LINE)
\r
84 ;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, ONE IS CREATED
\r
85 ;IF A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE,
\r
86 ;IODERR IS SET IN PTY STATUS AND OUTPUT IS TERMINATED.
\r
88 ;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE
\r
89 ;PLACED IN THE TTY INPUT BUFFER, THE PTY OUTPUT BUFFER IS
\r
90 ;ADVANCED, IOPTW IS CLEARED IN PTY STATUS, AND CONTROL RETURNS
\r
91 ;TO THE OUPTUT UUO AND THENCE TO THE USER.
\r
92 ;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE
\r
93 ;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS
\r
94 ;UNTIL THEY ARE EMPTY.
\r
96 ;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)
\r
97 ;DOES AN "OUTPUT" UUO. IOPTW IS SET WHENEVER THE OBJECT JOB DOES
\r
98 ;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH
\r
99 ;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.
\r
100 ;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON
\r
101 ;SET IN THE OF IOS)
\r
104 EXTERNAL TCONLN,TTYTAB,TPYTAB,PTYTAB,SETIOD
\r
105 EXTERNAL ADVBFF,PUNIT,RECIN3,PUTCHI
\r
106 EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL
\r
108 PTYOUT: LDB LINE,PUNIT
\r
109 HRRZM DDB,PTYTAB(LINE)
\r
111 HLL LINE,LINTAB(LINE)
\r
113 SKIPE PDDB,TTYTAB(LINE)
\r
119 MOVEM PIOS,DEVIOS(PDDB)
\r
121 PTEXCH: EXCH IOS,PIOS
\r
124 \fPTYOU1: MOVE PIOS,DEVIOS(PDDB)
\r
127 PTYOU2: MOVEI AC2,@DEVOAD(PDDB)
\r
130 HRRZ AC1,DEVOAD(PDDB)
\r
131 ADD AC1,[XWD 700+PROG,1]
\r
132 MOVEI DAT,TTIBUF(DDB)
\r
134 PTYOU3: ILDB CHREC,AC1
\r
142 TLNE TAC,BREAKB+FCSBRK
\r
145 IORB IOS,DEVIOS(DDB)
\r
146 CAIN CHREC,3 ;CONTROL C
\r
147 PUSHJ PDP,CNCTST ;SEE IF SECOND, STOP JOB IF SO
\r
149 PTYOU4: MOVEI DAT,TTIBUF(DDB) ;MAY HAVE SWITCHED TO TIOBUF
\r
152 MOVE TAC,TIFCTR(DDB) ;SEE IF BUFFER FILLING UP
\r
153 CAIL TAC,10 ;WAKE JOB IF SO
\r
155 PUSHJ PDP,RECIN3 ;CLOBBERS DAT AND TAC
\r
156 PTYOU5: SOJG AC2,PTYOU3
\r
157 PTYOU6: PUSHJ PDP,PTEXCH
\r
162 MOVEM IOS,DEVIOS(DDB)
\r
165 PTYOUW: PUSHJ PDP,INBFUL ;TURN OFF SYNC, CHECK FOR
\r
167 TRO PIOS,IOBKTL ;CANT PUT BATCH IN IOW
\r
168 JRST PTYOU6 ;ABORT BUFFER AND RETURN TO BATCH
\r
169 \fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFE,ADRERR,TTYPTR
\r
170 EXTERNAL BUFCLR,XMTINT,PTYGET,TTYCHR,TTOBUF
\r
172 PTYIN: LDB DAT,PUNIT
\r
173 SKIPE PDDB,TPYTAB(DAT) ;TTY DDB ADDRESS
\r
175 TRO IOS,IOIMPM ;YES, THAT'S ALL.
\r
178 PTYIN1: MOVE PIOS,DEVIOS(PDDB)
\r
180 PTYIN4: TRO IOS,IOPTRE
\r
181 HRRZ TAC,DEVIAD(DDB)
\r
184 MOVEI LINE,TCONLN(DAT)
\r
187 MOVEI AC1,@DEVIAD(PDDB)
\r
188 ADD AC1,[XWD 700,1]
\r
189 MOVEM IOS,DEVIOS(DDB)
\r
190 MOVSI IOS,TOIP ;MARK TYPE-OUT ACTIVE
\r
191 IORM IOS,TTYPTR(DDB)
\r
195 PTYIN2: PUSHJ PDP,PTYGET ;SHOULD BE XMITIN1+1
\r
196 SKIPL TTYPTR(DDB) ;STILL GOING?
\r
197 JRST PTYIN5 ;NO. END OF STRING FROM TTY
\r
200 PTYIN5: PUSHJ PDP,PTEXCH
\r
201 MOVEI AC3,@DEVIAD(DDB)
\r
203 HRRM AC1,1(AC3) ;WORD COUNT TO BATCH
\r
206 SKIPGE TTYPTR(PDDB) ;STILL MORE TO COME?
\r
207 JRST PTYIN6 ;YES. SEE IF ROOM
\r
209 PTYIN3: MOVEM IOS,DEVIOS(DDB)
\r
212 PTYIN6: MOVSI TAC,TOIP ;CLEAR ACTIVE BIT IN CASE STOPPED
\r
213 ANDCAM TAC,TTYPTR(PDDB)
\r
214 SOJG AC2,PTYIN4 ;COUNT, GO ON IF ROOM
\r
215 JRST PTYIN3 ;NO ROOM, STOP
\r
216 \f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE
\r
217 ;TTY OUTPUT WITH PTY INPUT
\r
221 EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE
\r
223 PTYPE: PUSH PDP,PDDB
\r
226 HRRZ PDDB,PTYTAB(PDDB)
\r
228 MOVEM IOS,DEVIOS(DDB)
\r
230 IORB PIOS,DEVIOS(PDDB)
\r
236 PTWAKE: PUSH PDP,TAC1 ;SAVE LINE
\r
238 LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR
\r
239 HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE
\r
240 PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS
\r
241 JRST PTWAK1 ;YES, WAS NOT SLEEPING
\r
242 HLRZ TEM,(TAC1) ;SLEEPING JOB?
\r
244 SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON
\r
245 LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE
\r
246 CAME TEM,TAC ;IS IT THIS ONE?
\r
247 SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE
\r
248 MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP
\r
250 AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0
\r
252 PTWAK1: POP PDP,TEM
\r
253 POP PDP,TAC1 ;RESTORE LINE
\r
255 \f;ROUTINES TO SET VARIOUS BITS
\r
256 ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE
\r
258 INTERNAL PTYOW,PTMNMD,PTMNMZ
\r
260 PTMNMD: PUSH PDP,PIOS
\r
261 MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE
\r
264 PTMNMZ: PUSH PDP,PIOS
\r
265 HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE
\r
268 PTYOW: PUSH PDP,PIOS
\r
269 MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT
\r
271 PTYSET: PUSH PDP,PDDB
\r
273 SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO
\r
274 HRRZ PDDB,PTYTAB(PDDB)
\r
275 JUMPE PDDB,PTYST1 ;PREVENT CATASTROPHE
\r
276 TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED
\r
277 ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED
\r
278 IORB PIOS,DEVIOS(PDDB)
\r
279 TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT?
\r
280 PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB
\r
281 PTYST1: POP PDP,PDDB
\r