1e2b1e5b82c9582489f48027a2faa5c2b823f59d
[retro-software/dec/tops10/v4.5.git] / src / ptysrh.mac
1 TITLE   PTYSRH - HALF DUPLEX PSEUDO TELETYPE SERVICE ROUTINES\r
2 SUBTTL  D. WITCRAFT/RAP  TS3.19  24 SEP 68  V004\r
3 XP      VPTYSF,004\r
4                 ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP\r
5 \r
6 ENTRY PTYSRH            ;DUMMY GLOBAL FOR FULL DUPLEX PTY\r
7 PTYSRH:\r
8 \r
9 \r
10 \r
11 ;ACCUMULATOR ASSIGNMENTS\r
12 \r
13         DDB=DEVDAT\r
14         LINE=TAC1\r
15 \r
16         CHREC=TEM\r
17         SCNHAC=12\r
18         PIOS=13\r
19         PDDB=14\r
20         RPTB=400\r
21 \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
25 \r
26 ;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)\r
27 \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
31 \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
37 >\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
42         INTERN  PTYDDB\r
43         ZZ=.\r
44 PTYDDB: SIXBIT  /PTY0/\r
45         XWD     0,10000+STTYBF+1        ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.\r
46         Z\r
47         EXP     PTYDSP\r
48         XWD     DVIN+DVOUT,3\r
49         Z\r
50         XWD     PROG,0\r
51         XWD     PROG,0\r
52         Z\r
53         XP      PTYCSV,.-ZZ\r
54         Z\r
55         XP      PTYDDS,.-ZZ\r
56         BLOCK   13\r
57         XP      PTYBND,PTYSAC+12\r
58         XP      PTYDM1,PTYBND-1\r
59         XP      PTYDDS,.-ZZ     ;SIZE OF PTY DDB\r
60 \r
61 PTYSA2: BLT     SCNHAC,0\r
62 PIOSAV: 0\r
63 PDDSAV: 0\r
64 >\r
65 \fINTERNAL PTYDSP\r
66 EXTERNAL OUT\r
67         POPJ    PDP,    ;INITIALIZE\r
68         POPJ    PDP,            ;PRINT ERROR, STOP JOB\r
69 PTYDSP: JRST PTYREL\r
70         JRST OUT\r
71         JRST PTYOUT\r
72         JRST PTYIN\r
73 \fEXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL\r
74 \r
75 PTYREL: LDB LINE,[POINT 6,DEVCHR(DDB),23]\r
76         SETZM PTYTAB(LINE)\r
77         ADDI LINE,TCONLN\r
78         SKIPN TTYTAB(LINE)\r
79         POPJ PDP,\r
80         PUSH PDP,DDB\r
81         HRRZ DDB,TTYTAB(LINE)\r
82         PUSHJ PDP,TTYKIL\r
83         POP PDP,DDB\r
84         POPJ PDP,\r
85 \f;PTY OUTPUT\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
91 \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
100 \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
107 \r
108 \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
112 \r
113 PTYOUT: LDB LINE,PUNIT\r
114         JSR PTYSAV\r
115         SKIPN PTYTAB(LINE)\r
116         HRRZM DDB,PTYTAB(LINE)\r
117         SKIPE TPYTAB(LINE)      ;HAS A TTY DDB BEEN ASSIGNED?\r
118         JRST PTYOU0-1           ;YES\r
119         ADDI LINE,TCONLN\r
120         MOVEI CHREC,240         ;NO\r
121         PUSHJ PDP,TCOMM\r
122         CAIE CHREC,"X"          ;ANY AVAILABLE?\r
123         JRST PTYOU6             ;YES\r
124         JSR PTYRET\r
125         TRO IOS,DEVIOS(DDB)     ;NO\r
126         MOVEM IOS,DEVIOS(DDB)\r
127         POPJ PDP,\r
128 \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
133 \r
134 PTYOU0: TRNE    IOS,IOPTRE\r
135         POPJ    PDP,\r
136         TLZE IOS,IOBEG          ;FIRST IO\r
137         TLO IOS,IOFST           ;YES\r
138         TLZN IOS,IOFST          ;FIRST ITEM IN BUFFER?\r
139         JRST PTYOU1             ;NO\r
140         TLO IOS,IO              ;YES. INITIALIZE POINTER & COUNT\r
141         HRRZ TAC,DEVOAD(DDB)\r
142         ADD TAC,[XWD 700,1]\r
143         ADDI TAC,(PROG)\r
144         MOVEM TAC,DEVOAD(DDB)\r
145         HRRZ ITEM,@TAC\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
150         TRZ IOS,IOPTRE\r
151         JSR PTYSAV              ;SAVE ACS\r
152         LDB     LINE,PUNIT\r
153         ADDI LINE,TCONLN\r
154         EXCH    IOS,PIOS\r
155 \r
156 PTYOU2: SOSGE DEVCTR(PDDB)      ;BUFFER EMTY?\r
157         JRST PTYOU3             ;YES\r
158         ILDB CHREC,DEVOAD(PDDB) ;NO\r
159 PTYOU7: PUSHJ PDP,TCOMM         ;SEND NEXT CHARACTER\r
160         TLNE IOS,IOFST\r
161         JRST PTYOU3\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
167         JRST PTYOU2             ;NO\r
168 \r
169 PTYOU4: CAIE CHREC,"^"\r
170         JRST PTYOU7\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
174 \r
175 PTYOU3: JRS PTYRET              ;RESTORE ACS\r
176         EXCH    IOS,PIOS\r
177 PTYOU8: TLZE IOS,IOW\r
178         PUSHJ PDP,SETIOD        ;START PTY JOB\r
179         HRLI    TAC,PROG\r
180         HRL     TAC,DEVBUF(DDB)\r
181         HRR     TAC,@TAC\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
186         JRST PTYOU0             ;NO\r
187         TRO IOS,IOPTRE          ;YES, SET RESPONSE FLAG AND RETURN TO USER\r
188 PTYOU5: TRZ IOS,IOACT+IOPTW     ;CONSIDER OUTPUT COMPLETED\r
189         TLO IOS,IOFST\r
190         MOVEM IOS,DEVIOS(DDB)\r
191         POPJ PDP,\r
192 \fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFF,STOSQD,ADRERR\r
193 \r
194 PTYIN:  LDB LINE,[POINT 6,DEVCHR(DDB),23]\r
195         ADDI LINE,TCONLN\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
199         JRST PTYIN8\r
200 \r
201 PTYIN1: PUSH PDP,LINE\r
202         TLO IOS,IOFST\r
203         TDZ IOS,[XWD IO,IOPTRE]\r
204         MOVEI   TAC,440700+PROG\r
205         HLLM    TAC,DEVPTR(DDB)\r
206 \r
207         TRO IOS,IOACT\r
208         MOVE PIOS,DEVIOS(PDDB)\r
209         TLNN PIOS,IO+SP\r
210         JRST PTYI10\r
211         SETZM CHREC\r
212         EXCH CHREC,PTYCSV(DDB)  ;HAS FIRST CHAR BEEN REC?\r
213         JUMPE CHREC,PTYIN5+1    ;NO\r
214                                 ;YES,SAVE LINE NO.\r
215 PTYIN4: TLNN PIOS,IO+SP         ;IS TTY DONE?\r
216         JRST PTYI38             ;YES. THATS ALL\r
217         MOVE DAT,CHREC\r
218         PUSHJ PDP,STODAT        ;STORE CHARACTER\r
219         JRST    ADRERR\r
220         JRST PTYIN6             ;BUFFER FULL\r
221 \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
227         PUSH PDP,PROG\r
228         PUSHJ PDP,TCOMM\r
229         POP PDP,PROG\r
230         POP PDP,ITEM            ;RESTORE ITEM COUNT\r
231         EXCH PIOS,IOS\r
232         EXCH PDDB,DDB\r
233         PUSH PDP,LINE\r
234         JRST PTYIN4\r
235 \fPTYI3A:        TRZ     IOS,IOBKTL\r
236         TRO     IOS,IOPTRE      ;INPUT READY\r
237 PTYI3B: PUSHJ PDP,STOSQD\r
238         JRST    ADRERR\r
239         TLOA IOS,IOFST\r
240 \r
241 PTYIN6: TRO     IOS,IOPTRE+RPTB\r
242         PUSHJ PDP,ADVBFF        ;ADVANCE PTY BUFFER\r
243         JRST PTYI10             ;NEXT BUFFER IS FULL.\r
244         TLO IOS,IOFST\r
245         TRZE IOS,RPTB\r
246         JRST PTYIN5+1\r
247 PTYI10: TLZE IOS, IOW\r
248         PUSHJ PDP, SETIOD\r
249         TRZ IOS,IOACT+RPTB\r
250         POP PDP, LINE\r
251 PTYIN8: MOVEM IOS, DEVIOS(DDB)\r
252         POPJ PDP,\r
253 \f;SAVE ACCUMULATORS\r
254 ;CALL   MOVEI DDB,ADDRESS OF PTYDB\r
255 ;       JSR PTYSAV\r
256 \r
257 \r
258 IFE FTCHECK+FTMONP,<\r
259 PTYSAV: 0\r
260 >\r
261 PTYSA0: MOVEM SCHHAC,PTYBDN(DDB)        ;SAVE HIGH AC\r
262         HRRZ SCNHAC,DDB\r
263         ADDI SCHNHAC,PTYBM1\r
264         HRRM SCNHAC,PTYSA2\r
265         SUBI SCNHAC,SCNHAC-1\r
266         XCT     PTYSA2          ;DO BLT SCNHAC\r
267         MOVE PDDB,DDB\r
268         JRST @PTYSAV\r
269 \r
270 ;RESTORE ACCUMULATORS\r
271 ;CALL   MOVEI PDDB,PTY DATA BLOCK ADDRESS\r
272 ;       JSR PTYRET\r
273 \r
274 IFE FTCHECK+FTMONP,<\r
275 PTYRET: 0\r
276 >\r
277 PTYRE0: HRRZ SCNHAC,PDDB\r
278         ADDI SCNHAC,PTYSAC\r
279         HRLZS   SCNHAC\r
280         BLT SCNHAC,SCNHAC\r
281         JRST @PTYRET\r
282 \r
283 ;SAVE ONLY PIOS AND PDDB\r
284 \r
285 IFE FTCHECK+FTMONP,<\r
286 PACSAV: 0\r
287 >\r
288 ACSAV0: MOVEM   PIOS,PIOSAV\r
289         MOVEM   PDDB,PDDSAV\r
290         JRST    @PACSAV\r
291 \r
292 ACRET:  MOVE    PIOS,PIOSAV\r
293         MOVE    PDDB,PDDSAV\r
294         POPJ    PDP,\r
295 \f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE\r
296 ;TTY OUTPUT WITH PTY INPUT\r
297 \r
298 \r
299 INTERNAL PTYPE\r
300 EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE\r
301 \r
302 PTYPE:  MOVE PDDB,LINE\r
303         SUBI PDDB,TCONLN\r
304         HRRZ PDDB,PTYTAB(PDDB)\r
305         TRO     IOS,IOACT       ;FORCE RESCHED TO CONTROL JOB\r
306         MOVEM IOS,DEVIOS(DDB)\r
307         MOVEI TAC,IOPTRE\r
308         IORB TAC,DEVIOS(PDDB)\r
309         MOVEM CHREC,PTYCSV(PDDB)        ;SAVE CHARACTER\r
310 \r
311 PTWAKE: PUSH PDP,TEM\r
312         PUSH    PDP,TAC1\r
313         LDB     TAC,[POINT 6,DEVCHR(PDDB),5]    ;PTY JOB NR\r
314 \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
319         CAIE    TEM,WAKE\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
325         TRZ     TEM,7777\r
326         AOS     TEM                     ;LADD ONE SO NEXT TICK WILL MAKE 0\r
327         MOVEM   TEM,(TAC1)\r
328 PTWAK1: POP     PDP,TAC1\r
329         POP     PDP,TEM\r
330         POPJ    PDP,\r
331 \f;ROUTINES TO SET VARIOUS BITS\r
332 ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE\r
333 \r
334 INTERNAL PTYOW,PTMNMD,PTMNMZ\r
335 \r
336 PTMNMD: PUSH    PDP,PIOS\r
337         MOVEI   PIOS,MONMOD     ;PTY INTO MONITOR MODE\r
338         JRST    PTYSET\r
339 \r
340 PTMNMZ: PUSH    PDP,PIOS\r
341         HRROI   PIOS,MONMOD     ;PTY OUT OF MONITOR MODE\r
342         JRST    PTYSET\r
343 \r
344 PTYOW:  PUSH    PDP,PIOS\r
345         MOVEI   PIOS,IOPTW      ;PTY IN OUTPUT WAIT\r
346 \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
355         JSRT ACRET\r
356 \f       END\r
357 \f\r