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
10 ;ACCUMULATOR ASSIGNMENTS
\r
18 ;FOLLOWING BITS, AND LINE AND CHREC ASSIGMENTS
\r
19 ; MUST AGREE WITH THOSE IN SCNSRF
\r
23 TOIP=400000 ;SIGN OF TTYPTR IN TTY DDB
\r
24 SYNC=20000 ;BREAK CHARACTER SEEN---FROM SCNSER
\r
26 ;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)
\r
28 IOPTW=4000 ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT)
\r
29 IOPTRE=2000 ;PTY RESPONSE IS READY
\r
30 MONMOD=1000 ;PTY IS IN MONITOR MODE
\r
34 FTTTYSER=-1 ;FORCE MULT DEF GLOBAL IF WRONG APRSER
\r
35 \fINTERNAL FTCHECK,FTMONP
\r
36 IFN FTCHECK+FTMONP,<
\r
37 EXTERNAL PTYDDB,PIOSAV,PTYSAC,PTYDNB,PTYBM1,PTYDDS,PIOSAV,PDDSAV
\r
38 EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV
\r
39 INTERNAL PTYSA0,PTYRE0,ACSAV0
\r
41 IFE FTCHECK+FTMONP,<
\r
42 ;PSEUDO CONSOLE DEVICE DATA BLOCK
\r
43 ;REMAINING PTY DDB'S ARE GENERATED
\r
44 ;OUT OF LINE AT BUILD TIME
\r
47 PTYDDB: SIXBIT /PTY0/
\r
48 XWD 0,10000+STTYBF+1 ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.
\r
57 XP PTYDDS,.-ZZ ;SIZE OF PTY DDB
\r
61 POPJ PDP, ;INITIALIZE
\r
62 POPJ PDP, ;PRINT ERROR, STOP JOB
\r
68 EXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL,PUNIT
\r
70 PTYREL: LDB LINE,PUNIT
\r
75 HRRZ DDB,TTYTAB(LINE)
\r
82 ;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, ONE IS CREATED
\r
83 ;IF A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE,
\r
84 ;IODERR IS SET IN PTY STATUS AND OUTPUT IS TERMINATED.
\r
86 ;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE
\r
87 ;PLACED IN THE TTY INPUT BUFFER, THE PTY OUTPUT BUFFER IS
\r
88 ;ADVANCED, IOPTW IS CLEARED IN PTY STATUS, AND CONTROL RETURNS
\r
89 ;TO THE OUPTUT UUO AND THENCE TO THE USER.
\r
90 ;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE
\r
91 ;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS
\r
92 ;UNTIL THEY ARE EMPTY.
\r
94 ;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)
\r
95 ;DOES AN "OUTPUT" UUO. IOPTW IS SET WHENEVER THE OBJECT JOB DOES
\r
96 ;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH
\r
97 ;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.
\r
98 ;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON
\r
102 EXTERNAL TCONLN,TTYTAB,TPYTAB,PTYTAB,SETIOD
\r
103 EXTERNAL ADVBFF,PUNIT,RECIN3,PUTCHI
\r
104 EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL
\r
106 PTYOUT: LDB LINE,PUNIT
\r
107 HRRZM DDB,PTYTAB(LINE)
\r
109 HLL LINE,LINTAB(LINE)
\r
111 SKIPE PDDB,TTYTAB(LINE)
\r
117 MOVEM PIOS,DEVIOS(PDDB)
\r
119 PTEXCH: EXCH IOS,PIOS
\r
122 \fPTYOU1: MOVE PIOS,DEVIOS(PDDB)
\r
125 PTYOU2: MOVEI AC2,@DEVOAD(PDDB)
\r
128 HRRZ AC1,DEVOAD(PDDB)
\r
129 ADD AC1,[XWD 700+PROG,1]
\r
130 MOVEI DAT,TTIBUF(DDB)
\r
132 PTYOU3: ILDB CHREC,AC1
\r
140 TLNE TAC,BREAKB+FCSBRK
\r
142 IORB IOS,DEVIOS(DDB)
\r
143 CAIN CHREC,3 ;CONTROL C
\r
144 PUSHJ PDP,CNCTST ;SEE IF SECOND, STOP JOB IF SO
\r
146 PTYOU4: MOVEI DAT,TTIBUF(DDB) ;MAY HAVE SWITCHED TO TIOBUF
\r
149 MOVE TAC,TIFCTR(DDB) ;SEE IF BUFFER FILLING UP
\r
150 CAIL TAC,10 ;WAKE JOB IF SO
\r
152 PUSHJ PDP,RECIN3 ;CLOBBERS DAT AND TAC
\r
153 PTYOU5: SOJG AC2,PTYOU3
\r
154 PTYOU6: PUSHJ PDP,PTEXCH
\r
159 MOVEM IOS,DEVIOS(DDB)
\r
162 PTYOUW: PUSHJ PDP,INBFUL ;TURN OFF SYNC, CHECK FOR
\r
164 TRO PIOS,IOBKTL ;CANT PUT BATCH IN IOW
\r
165 JRST PTYOU6 ;ABORT BUFFER AND RETURN TO BATCH
\r
166 \fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFE,ADRERR,TTYPTR
\r
167 EXTERNAL BUFCLR,XMTINT,PTYGET,TTYCHR,TTOBUF
\r
169 PTYIN: LDB DAT,PUNIT
\r
170 SKIPE PDDB,TPYTAB(DAT) ;TTY DDB ADDRESS
\r
172 TRO IOS,IOIMPM ;YES, THAT'S ALL.
\r
175 PTYIN1: MOVE PIOS,DEVIOS(PDDB)
\r
177 PTYIN4: TRO IOS,IOPTRE
\r
178 HRRZ TAC,DEVIAD(DDB)
\r
181 MOVEI LINE,TCONLN(DAT)
\r
184 MOVEI AC1,@DEVIAD(PDDB)
\r
185 ADD AC1,[XWD 700,1]
\r
186 MOVEM IOS,DEVIOS(DDB)
\r
187 MOVSI IOS,TOIP ;MARK TYPE-OUT ACTIVE
\r
188 IORM IOS,TTYPTR(DDB)
\r
192 PTYIN2: PUSHJ PDP,PTYGET ;SHOULD BE XMITIN1+1
\r
193 SKIPL TTYPTR(DDB) ;STILL GOING?
\r
194 JRST PTYIN5 ;NO. END OF STRING FROM TTY
\r
197 PTYIN5: PUSHJ PDP,PTEXCH
\r
198 MOVEI AC3,@DEVIAD(DDB)
\r
200 HRRM AC1,1(AC3) ;WORD COUNT TO BATCH
\r
203 SKIPGE TTYPTR(PDDB) ;STILL MORE TO COME?
\r
204 JRST PTYIN6 ;YES. SEE IF ROOM
\r
206 PTYIN3: MOVEM IOS,DEVIOS(DDB)
\r
209 PTYIN6: MOVSI TAC,TOIP ;CLEAR ACTIVE BIT IN CASE STOPPED
\r
210 ANDCAM TAC,TTYPTR(PDDB)
\r
211 SOJG AC2,PTYIN4 ;COUNT, GO ON IF ROOM
\r
212 JRST PTYIN3 ;NO ROOM, STOP
\r
213 \f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE
\r
214 ;TTY OUTPUT WITH PTY INPUT
\r
218 EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE
\r
220 PTYPE: PUSH PDP,PDDB
\r
223 HRRZ PDDB,PTYTAB(PDDB)
\r
225 MOVEM IOS,DEVIOS(DDB)
\r
227 IORB PIOS,DEVIOS(PDDB)
\r
233 PTWAKE: PUSH PDP,TAC1 ;SAVE LINE
\r
235 LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR
\r
236 HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE
\r
237 PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS
\r
238 JRST PTWAK1 ;YES, WAS NOT SLEEPING
\r
239 HLRZ TEM,(TAC1) ;SLEEPING JOB?
\r
241 SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON
\r
242 LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE
\r
243 CAME TEM,TAC ;IS IT THIS ONE?
\r
244 SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE
\r
245 MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP
\r
247 AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0
\r
249 PTWAK1: POP PDP,TEM
\r
250 POP PDP,TAC1 ;RESTORE LINE
\r
252 \f;ROUTINES TO SET VARIOUS BITS
\r
253 ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE
\r
255 INTERNAL PTYOW,PTMNMD,PTMNMZ
\r
257 PTMNMD: PUSH PDP,PIOS
\r
258 MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE
\r
261 PTMNMZ: PUSH PDP,PIOS
\r
262 HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE
\r
265 PTYOW: PUSH PDP,PIOS
\r
266 MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT
\r
268 PTYSET: PUSH PDP,PDDB
\r
270 SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO
\r
271 HRRZ PDDB,PTYTAB(PDDB)
\r
272 JUMPE PDDB,PTYST1 ;PREVENT CATASTROPHE
\r
273 TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED
\r
274 ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED
\r
275 IORB PIOS,DEVIOS(PDDB)
\r
276 TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT?
\r
277 PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB
\r
278 PTYST1: POP PDP,PDDB
\r