1 TITLE PTYSRH - HALF DUPLEX PSEUDO TELETYPE SERVICE ROUTINES
\r
2 SUBTTL D. WITCRAFT/RAP TS3.19 24 SEP 68 V004
\r
4 ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP
\r
6 ENTRY PTYSRH ;DUMMY GLOBAL FOR FULL DUPLEX PTY
\r
11 ;ACCUMULATOR ASSIGNMENTS
\r
22 SP=2000 ;SPECIAL TTY CHARACTER
\r
23 T37=10000 ;MODEL 37-FULL CHARACTER SET
\r
24 SYNC=40000 ;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
32 INTERNAL FTCHECK,FTMONP
\r
33 IFN FTCHECK+FTMONP,<
\r
34 EXTERNAL PTYDDB,PTYCSV,PTYSAC,PTYBND,PTYBM1,PTYDDS,PIOSAV,PDDSAV
\r
35 EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV
\r
36 INTERNAL PTYSA0,PTYRE0,ACSAV0
\r
38 IFE FTCHECK+FTMONP,<
\r
39 ;PSEUDO CONSOLE DEVICE DATA BLOCK
\r
40 ;REMAINING PTY DDB'S ARE GENERATED
\r
41 ;OUT OF LINE AT BUILD TIME
\r
44 PTYDDB: SIXBIT /PTY0/
\r
45 XWD 0,10000+STTYBF+1 ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.
\r
59 XP PTYDDS,.-ZZ ;SIZE OF PTY DDB
\r
61 PTYSA2: BLT SCNHAC,0
\r
67 POPJ PDP, ;INITIALIZE
\r
68 POPJ PDP, ;PRINT ERROR, STOP JOB
\r
73 \fEXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL
\r
75 PTYREL: LDB LINE,[POINT 6,DEVCHR(DDB),23]
\r
81 HRRZ DDB,TTYTAB(LINE)
\r
86 ;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, A SPACE IS
\r
87 ;SENT TO SCNSER (TCOMM) CAUSING AN ENTRY TO BE MADE IF
\r
88 ;A TTY DATA BLOCK IS AVAILABLE. IF NONE IS AVAILABLE,
\r
89 ;AN "X" IS RETURNED IN WHICH CASE IODERR IS SET IN PTY STATUS
\r
90 ;AND OUTPUT IS TERMINATED.
\r
92 ;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE
\r
93 ;TRANSMITTED TO TCOMM. IF A RESPONSE IS RECIEVED AS INDICATED
\r
94 ;BY THE SP BIT IN TTY STATUS, THE PTY OUTPUT BUFFER IS
\r
95 ;ADVANCED IOPTRE IS SET IN PTY STATUS , AND CONTROL RETURNS
\r
96 ;TO THE OUPTUT UUO AND THENCE TO THE USER.
\r
97 ;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE
\r
98 ;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS
\r
99 ;UNTIL THEY ARE EMPTY.
\r
101 ;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)
\r
102 ;DOES AN "OUTPUT" UUO. IOPTW IS SET WHENEVER THE OBJECT JOB DOES
\r
103 ;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH
\r
104 ;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.
\r
105 ;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON
\r
106 ;SET IN THE OF IOS)
\r
109 EXTERNAL TCONLN,TTYTIBTPYTAB,PTYTAB,SETIOD
\r
110 EXTERNAL ADVBFF,RUNIT,RECIN3,PUTCHI
\r
111 EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL
\r
113 PTYOUT: LDB LINE,PUNIT
\r
116 HRRZM DDB,PTYTAB(LINE)
\r
117 SKIPE TPYTAB(LINE) ;HAS A TTY DDB BEEN ASSIGNED?
\r
120 MOVEI CHREC,240 ;NO
\r
122 CAIE CHREC,"X" ;ANY AVAILABLE?
\r
125 TRO IOS,DEVIOS(DDB) ;NO
\r
126 MOVEM IOS,DEVIOS(DDB)
\r
129 PTYOU6: TLO IOS,T37+IOFST ;FORCE BUFFER RESET
\r
130 ;T37 SO TABS, ETC NOT TRNSLATED (TIMING ERRO OTHERWI)
\r
131 MOVEM IOS,DEVIOS(DDB)
\r
132 JSR PTYRET ;RESTORE ACS
\r
134 PTYOU0: TRNE IOS,IOPTRE
\r
136 TLZE IOS,IOBEG ;FIRST IO
\r
138 TLZN IOS,IOFST ;FIRST ITEM IN BUFFER?
\r
140 TLO IOS,IO ;YES. INITIALIZE POINTER & COUNT
\r
141 HRRZ TAC,DEVOAD(DDB)
\r
142 ADD TAC,[XWD 700,1]
\r
144 MOVEM TAC,DEVOAD(DDB)
\r
146 JUMPE ITEM,PTYOU8 ;BUFFER EMPTY>
\r
147 \f PUSHJ PDP,ITMCNT
\r
148 MOVEM ITEM,DEVCTR(DDB)
\r
149 \fPTYOU1: TRO IOS,IOACT
\r
151 JSR PTYSAV ;SAVE ACS
\r
156 PTYOU2: SOSGE DEVCTR(PDDB) ;BUFFER EMTY?
\r
158 ILDB CHREC,DEVOAD(PDDB) ;NO
\r
159 PTYOU7: PUSHJ PDP,TCOMM ;SEND NEXT CHARACTER
\r
162 TLNE IOS,SP ;SPECIAL CHARACTER ECHO?
\r
163 JRST PTYOU4 ;YES, SEE IF CONTROL CHAR ECHO
\r
164 TLNE IOS,SYNC ;NO. BREAK CHARACTER SEEN IF OBJ. JOB SWAPPED OUT?
\r
165 JRST PTYOU3 ;YES, BUFFER NOT MOVED INTO OBJECT
\r
166 ;JOB TTY IN BUFFER
\r
169 PTYOU4: CAIE CHREC,"^"
\r
171 MOVEM CHREC,PTYCSV(PDDB);YES. FLUSH OUTPUT
\r
172 MOVEM IOS,DEVIOS(DDB) ;SAVE TTY STATE
\r
173 TRO PIOS,IOPTRE ;LET USER KNOW
\r
175 PTYOU3: JRS PTYRET ;RESTORE ACS
\r
177 PTYOU8: TLZE IOS,IOW
\r
178 PUSHJ PDP,SETIOD ;START PTY JOB
\r
180 HRL TAC,DEVBUF(DDB)
\r
182 MOVEM TAC,DEVOAD(DDB)
\r
183 PUSHJ PDP,ADVBFE ;ADVANCE PTY OUTPUT BUFFER
\r
184 JRST PTYOU5 ;NEXT BUFFER IS EMPTY.
\r
185 TRNN PIOS,IOPTRE ;RESPONSE?
\r
187 TRO IOS,IOPTRE ;YES, SET RESPONSE FLAG AND RETURN TO USER
\r
188 PTYOU5: TRZ IOS,IOACT+IOPTW ;CONSIDER OUTPUT COMPLETED
\r
190 MOVEM IOS,DEVIOS(DDB)
\r
192 \fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFF,STOSQD,ADRERR
\r
194 PTYIN: LDB LINE,[POINT 6,DEVCHR(DDB),23]
\r
196 HRRZ PDDB,TTYTAB(LINE) ;TTY DDB ADDRESS
\r
197 JUMPN PDDB,PTYIN1 ;HAS TTY DDB BEEN LOST?
\r
198 TRO IOS,IOIMPM ;YES, THAT'S ALL.
\r
201 PTYIN1: PUSH PDP,LINE
\r
203 TDZ IOS,[XWD IO,IOPTRE]
\r
204 MOVEI TAC,440700+PROG
\r
205 HLLM TAC,DEVPTR(DDB)
\r
208 MOVE PIOS,DEVIOS(PDDB)
\r
212 EXCH CHREC,PTYCSV(DDB) ;HAS FIRST CHAR BEEN REC?
\r
213 JUMPE CHREC,PTYIN5+1 ;NO
\r
215 PTYIN4: TLNN PIOS,IO+SP ;IS TTY DONE?
\r
216 JRST PTYI38 ;YES. THATS ALL
\r
218 PUSHJ PDP,STODAT ;STORE CHARACTER
\r
220 JRST PTYIN6 ;BUFFER FULL
\r
222 PTYIN5: JUMPE ITEM,PTYI3A ;IF COUNT RUNS OUT
\r
223 EXCH PIOS,IOS ;NO. GET NEXT CHAR.
\r
224 EXCH PDDB,DDB ;SET IOS AND DBD FOR TTY
\r
225 POP PDP,LINE ;RESTORE LINE NO.
\r
226 PUSH PDP,ITEM ;SAVE ITEM COUNT
\r
230 POP PDP,ITEM ;RESTORE ITEM COUNT
\r
235 \fPTYI3A: TRZ IOS,IOBKTL
\r
236 TRO IOS,IOPTRE ;INPUT READY
\r
237 PTYI3B: PUSHJ PDP,STOSQD
\r
241 PTYIN6: TRO IOS,IOPTRE+RPTB
\r
242 PUSHJ PDP,ADVBFF ;ADVANCE PTY BUFFER
\r
243 JRST PTYI10 ;NEXT BUFFER IS FULL.
\r
247 PTYI10: TLZE IOS, IOW
\r
251 PTYIN8: MOVEM IOS, DEVIOS(DDB)
\r
253 \f;SAVE ACCUMULATORS
\r
254 ;CALL MOVEI DDB,ADDRESS OF PTYDB
\r
258 IFE FTCHECK+FTMONP,<
\r
261 PTYSA0: MOVEM SCHHAC,PTYBDN(DDB) ;SAVE HIGH AC
\r
263 ADDI SCHNHAC,PTYBM1
\r
265 SUBI SCNHAC,SCNHAC-1
\r
266 XCT PTYSA2 ;DO BLT SCNHAC
\r
270 ;RESTORE ACCUMULATORS
\r
271 ;CALL MOVEI PDDB,PTY DATA BLOCK ADDRESS
\r
274 IFE FTCHECK+FTMONP,<
\r
277 PTYRE0: HRRZ SCNHAC,PDDB
\r
283 ;SAVE ONLY PIOS AND PDDB
\r
285 IFE FTCHECK+FTMONP,<
\r
288 ACSAV0: MOVEM PIOS,PIOSAV
\r
292 ACRET: MOVE PIOS,PIOSAV
\r
295 \f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE
\r
296 ;TTY OUTPUT WITH PTY INPUT
\r
300 EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE
\r
302 PTYPE: MOVE PDDB,LINE
\r
304 HRRZ PDDB,PTYTAB(PDDB)
\r
305 TRO IOS,IOACT ;FORCE RESCHED TO CONTROL JOB
\r
306 MOVEM IOS,DEVIOS(DDB)
\r
308 IORB TAC,DEVIOS(PDDB)
\r
309 MOVEM CHREC,PTYCSV(PDDB) ;SAVE CHARACTER
\r
311 PTWAKE: PUSH PDP,TEM
\r
313 LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR
\r
315 HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE
\r
316 PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS
\r
317 JRST PTWAK1 ;YES, WAS NOT SLEEPING
\r
318 HLRZ TEM,(TAC1) ;SLEEPING JOB?
\r
320 SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON
\r
321 LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE
\r
322 CAME TEM,TAC ;IS IT THIS ONE?
\r
323 SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE
\r
324 MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP
\r
326 AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0
\r
328 PTWAK1: POP PDP,TAC1
\r
331 \f;ROUTINES TO SET VARIOUS BITS
\r
332 ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE
\r
334 INTERNAL PTYOW,PTMNMD,PTMNMZ
\r
336 PTMNMD: PUSH PDP,PIOS
\r
337 MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE
\r
340 PTMNMZ: PUSH PDP,PIOS
\r
341 HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE
\r
344 PTYOW: PUSH PDP,PIOS
\r
345 MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT
\r
347 PTYSET: MOVE PDDB,LINE
\r
348 SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO
\r
349 HRRZ PDDB,PTYTAB(PDDB)
\r
350 TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED
\r
351 ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED
\r
352 IORB PIOS,DEVIOS(PDDB)
\r
353 TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT?
\r
354 PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB
\r