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 TCOMLN,TTYTAB,TCOMM,TPYTAB,PTYTAB,ITMCNT,SETIOD
\r
110 EXTERNAL ADVBFE,PUNIT
\r
112 PTYOUT: LDB LINE,PUNIT
\r
115 HRRZM DDB,PTYTAB(LINE)
\r
116 SKIPE TPYTAB(LINE) ;HAS A TTY DDB BEEN ASSIGNED?
\r
119 MOVEI CHREC,240 ;NO
\r
121 CAIE CHREC,"X" ;ANY AVAILABLE?
\r
124 TRO IOS,DEVIOS(DDB) ;NO
\r
125 MOVEM IOS,DEVIOS(DDB)
\r
128 PTYOU6: TLO IOS,T37+IOFST ;FORCE BUFFER RESET
\r
129 ;T37 SO TABS, ETC NOT TRNSLATED (TIMING ERRO OTHERWI)
\r
130 MOVEM IOS,DEVIOS(DDB)
\r
131 JSR PTYRET ;RESTORE ACS
\r
133 PTYOU0: TRNE IOS,IOPTRE
\r
135 TLZE IOS,IOBEG ;FIRST IO
\r
137 TLZN IOS,IOFST ;FIRST ITEM IN BUFFER?
\r
139 TLO IOS,IO ;YES. INITIALIZE POINTER & COUNT
\r
140 HRRZ TAC,DEVOAD(DDB)
\r
141 ADD TAC,[XWD 700,1]
\r
143 MOVEM TAC,DEVOAD(DDB)
\r
145 JUMPE ITEM,PTYOU8 ;BUFFER EMPTY>
\r
146 \f PUSHJ PDP,ITMCNT
\r
147 MOVEM ITEM,DEVCTR(DDB)
\r
148 \fPTYOU1: TRO IOS,IOACT
\r
150 JSR PTYSAV ;SAVE ACS
\r
155 PTYOU2: SOSGE DEVCTR(PDDB) ;BUFFER EMTY?
\r
157 ILDB CHREC,DEVOAD(PDDB) ;NO
\r
158 PTYOU7: PUSHJ PDP,TCOMM ;SEND NEXT CHARACTER
\r
161 TLNE IOS,SP ;SPECIAL CHARACTER ECHO?
\r
162 JRST PTYOU4 ;YES, SEE IF CONTROL CHAR ECHO
\r
163 TLNE IOS,SYNC ;NO. BREAK CHARACTER SEEN IF OBJ. JOB SWAPPED OUT?
\r
164 JRST PTYOU3 ;YES, BUFFER NOT MOVED INTO OBJECT
\r
165 ;JOB TTY IN BUFFER
\r
168 PTYOU4: CAIE CHREC,"^"
\r
170 MOVEM CHREC,PTYCSV(PDDB);YES. FLUSH OUTPUT
\r
171 MOVEM IOS,DEVIOS(DDB) ;SAVE TTY STATE
\r
172 TRO PIOS,IOPTRE ;LET USER KNOW
\r
174 PTYOU3: JSR PTYRET ;RESTORE ACS
\r
176 PTYOU8: TLZE IOS,IOW
\r
177 PUSHJ PDP,SETIOD ;START PTY JOB
\r
179 HRL TAC,DEVBUF(DDB)
\r
181 MOVEM TAC,DEVOAD(DDB)
\r
182 PUSHJ PDP,ADVBFE ;ADVANCE PTY OUTPUT BUFFER
\r
183 JRST PTYOU5 ;NEXT BUFFER IS EMPTY.
\r
184 TRNN PIOS,IOPTRE ;RESPONSE?
\r
186 TRO IOS,IOPTRE ;YES, SET RESPONSE FLAG AND RETURN TO USER
\r
187 PTYOU5: TRZ IOS,IOACT+IOPTW ;CONSIDER OUTPUT COMPLETED
\r
189 MOVEM IOS,DEVIOS(DDB)
\r
191 \fEXTERNAL TCONLN,TTYTAB,SETIOD,STODAT,ADVBFF,STOSQD,ADRERR
\r
193 PTYIN: LDB LINE,[POINT 6,DEVCHR(DDB),23]
\r
195 HRRZ PDDB,TTYTAB(LINE) ;TTY DDB ADDRESS
\r
196 JUMPN PDDB,PTYIN1 ;HAS TTY DDB BEEN LOST?
\r
197 TRO IOS,IOIMPM ;YES, THAT'S ALL.
\r
200 PTYIN1: PUSH PDP,LINE
\r
202 TDZ IOS,[XWD IO,IOPTRE]
\r
203 MOVEI TAC,440700+PROG
\r
204 HLLM TAC,DEVPTR(DDB)
\r
207 MOVE PIOS,DEVIOS(PDDB)
\r
211 EXCH CHREC,PTYCSV(DDB) ;HAS FIRST CHAR BEEN REC?
\r
212 JUMPE CHREC,PTYIN5+1 ;NO
\r
214 PTYIN4: TLNN PIOS,IO+SP ;IS TTY DONE?
\r
215 JRST PTYI3B ;YES. THATS ALL
\r
217 PUSHJ PDP,STODAT ;STORE CHARACTER
\r
219 JRST PTYIN6 ;BUFFER FULL
\r
221 PTYIN5: JUMPE ITEM,PTYI3A ;IF COUNT RUNS OUT
\r
222 EXCH PIOS,IOS ;NO. GET NEXT CHAR.
\r
223 EXCH PDDB,DDB ;SET IOS AND DBD FOR TTY
\r
224 POP PDP,LINE ;RESTORE LINE NO.
\r
225 PUSH PDP,ITEM ;SAVE ITEM COUNT
\r
229 POP PDP,ITEM ;RESTORE ITEM COUNT
\r
234 \fPTYI3A: TRZ IOS,IOBKTL
\r
235 TRO IOS,IOPTRE ;INPUT READY
\r
236 PTYI3B: PUSHJ PDP,STOSQD
\r
240 PTYIN6: TRO IOS,IOPTRE+RPTB
\r
241 PUSHJ PDP,ADVBFF ;ADVANCE PTY BUFFER
\r
242 JRST PTYI10 ;NEXT BUFFER IS FULL.
\r
246 PTYI10: TLZE IOS, IOW
\r
250 PTYIN8: MOVEM IOS, DEVIOS(DDB)
\r
252 \f;SAVE ACCUMULATORS
\r
253 ;CALL MOVEI DDB,ADDRESS OF PTYDB
\r
257 IFE FTCHECK+FTMONP,<
\r
260 PTYSA0: MOVEM SCNHAC,PTYBND(DDB) ;SAVE HIGH AC
\r
264 SUBI SCNHAC,SCNHAC-1
\r
265 XCT PTYSA2 ;DO BLT SCNHAC
\r
269 ;RESTORE ACCUMULATORS
\r
270 ;CALL MOVEI PDDB,PTY DATA BLOCK ADDRESS
\r
273 IFE FTCHECK+FTMONP,<
\r
276 PTYRE0: HRRZ SCNHAC,PDDB
\r
282 ;SAVE ONLY PIOS AND PDDB
\r
284 IFE FTCHECK+FTMONP,<
\r
287 ACSAV0: MOVEM PIOS,PIOSAV
\r
291 ACRET: MOVE PIOS,PIOSAV
\r
294 \f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE
\r
295 ;TTY OUTPUT WITH PTY INPUT
\r
299 EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE
\r
301 PTYPE: MOVE PDDB,LINE
\r
303 HRRZ PDDB,PTYTAB(PDDB)
\r
304 TRO IOS,IOACT ;FORCE RESCHED TO CONTROL JOB
\r
305 MOVEM IOS,DEVIOS(DDB)
\r
307 IORB TAC,DEVIOS(PDDB)
\r
308 MOVEM CHREC,PTYCSV(PDDB) ;SAVE CHARACTER
\r
310 PTWAKE: PUSH PDP,TEM
\r
312 LDB TAC,[POINT 6,DEVCHR(PDDB),5] ;PTY JOB NR
\r
314 HRRZ TAC1,CLOCK ;LAST JOB IN CLOCK QUEUE
\r
315 PTWAK2: CAIN TAC1,CIPWTM1 ;LOOKED AT ALL JOBS
\r
316 JRST PTWAK1 ;YES, WAS NOT SLEEPING
\r
317 HLRZ TEM,(TAC1) ;SLEEPING JOB?
\r
319 SOJA TAC1,PTWAK2 ;NO, IN QUEUE FOR SOME OTHER REASON
\r
320 LDB TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE
\r
321 CAME TEM,TAC ;IS IT THIS ONE?
\r
322 SOJA TAC1,PTWAK2 ;LNO, LOOP TILL DONE
\r
323 MOVE TEM,(TAC1) ;YES, ZERO TIME LEFT TO SLEEP
\r
325 AOS TEM ;LADD ONE SO NEXT TICK WILL MAKE 0
\r
327 PTWAK1: POP PDP,TAC1
\r
330 \f;ROUTINES TO SET VARIOUS BITS
\r
331 ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE
\r
333 INTERNAL PTYOW,PTMNMD,PTMNMZ
\r
335 PTMNMD: PUSH PDP,PIOS
\r
336 MOVEI PIOS,MONMOD ;PTY INTO MONITOR MODE
\r
339 PTMNMZ: PUSH PDP,PIOS
\r
340 HRROI PIOS,MONMOD ;PTY OUT OF MONITOR MODE
\r
343 PTYOW: PUSH PDP,PIOS
\r
344 MOVEI PIOS,IOPTW ;PTY IN OUTPUT WAIT
\r
346 PTYSET: MOVE PDDB,LINE
\r
347 SUBI PDDB,TCONLN ;FIND PTY THAT TTY IS LINKED TO
\r
348 HRRZ PDDB,PTYTAB(PDDB)
\r
349 TLZE PIOS,-1 ;BIT TO BE SET OR ZEEROED
\r
350 ANDCAB PIOS,DEVIOS(PDDB) ;ZEROED
\r
351 IORB PIOS,DEVIOS(PDDB)
\r
352 TRNE PIOS,IOPTW ;IS LINKED TTY JOB IN INPUT WAIT?
\r
353 PUSHJ PDP,PTWAKE ;YES, WAKE UP CONTROL JOB
\r