Added SRCCOM.MAC
[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 ;ACCUMULATOR ASSIGNMENTS\r
11 \r
12         DDB=DEVDAT\r
13         LINE=TAC1\r
14         CHREC=TEM\r
15         SCNHAC=12\r
16         PIOS=13\r
17         PDDB=14\r
18         RPTB=400\r
19 \r
20         SP=2000                 ;SPECIAL TTY CHARACTER\r
21         T37=10000               ;MODEL 37-FULL CHARACTER SET\r
22 SYNC=40000              ;BREAK CHARACTER SEEN---FROM SCNSER\r
23 \r
24 ;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)\r
25 \r
26 IOPTW=4000              ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT)\r
27 IOPTRE=2000             ;PTY RESPONSE IS READY\r
28 MONMOD=1000             ;PTY IS IN MONITOR MODE\r
29 \r
30 \r
31 INTERNAL FTCHECK,FTMONP\r
32 IFN FTCHECK+FTMONP,<\r
33 EXTERNAL PTYDDB,PTYCSV,PTYSAC,PTYBND,PTYBM1,PTYDDS,PIOSAV,PDDSAV\r
34 EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV\r
35 INTERNAL PTYSA0,PTYRE0,ACSAV0\r
36 >\r
37 IFE FTCHECK+FTMONP,<\r
38 ;PSEUDO CONSOLE DEVICE DATA BLOCK\r
39 ;REMAINING PTY DDB'S ARE GENERATED\r
40 ;OUT OF LINE AT BUILD TIME\r
41         INTERN  PTYDDB\r
42         ZZ=.\r
43 PTYDDB: SIXBIT  /PTY0/\r
44         XWD     0,10000+STTYBF+1        ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.\r
45         Z\r
46         EXP     PTYDSP\r
47         XWD     DVIN+DVOUT,3\r
48         Z\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      PTYSAC,.-ZZ\r
56         BLOCK   13\r
57         XP      PTYBND,PTYSAC+12\r
58         XP      PTYBM1,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 \f\r
66 INTERNAL PTYDSP\r
67 EXTERNAL OUT\r
68         POPJ    PDP,    ;INITIALIZE\r
69         POPJ    PDP,            ;PRINT ERROR, STOP JOB\r
70 PTYDSP: JRST PTYREL\r
71         JRST OUT\r
72         JRST PTYOUT\r
73         JRST PTYIN\r
74 \fEXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL\r
75 \r
76 PTYREL: LDB LINE,[POINT 6,DEVCHR(DDB),23]\r
77         SETZM PTYTAB(LINE)\r
78         ADDI LINE,TCONLN\r
79         SKIPN TTYTAB(LINE)\r
80         POPJ PDP,\r
81         PUSH PDP,DDB\r
82         HRRZ DDB,TTYTAB(LINE)\r
83         PUSHJ PDP,TTYKIL\r
84         POP PDP,DDB\r
85         POPJ PDP,\r
86 \f;PTY OUTPUT\r
87 ;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, A SPACE IS\r
88 ;SENT TO SCNSER (TCOMM) CAUSING AN ENTRY TO BE MADE IF\r
89 ;A TTY DATA BLOCK IS AVAILABLE.  IF NONE IS AVAILABLE,\r
90 ;AN "X" IS RETURNED IN WHICH CASE IODERR IS SET IN PTY STATUS\r
91 ;AND OUTPUT IS TERMINATED.\r
92 \r
93 ;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE\r
94 ;TRANSMITTED TO TCOMM. IF A RESPONSE IS RECIEVED AS INDICATED\r
95 ;BY THE SP BIT IN TTY STATUS, THE PTY OUTPUT BUFFER IS\r
96 ;ADVANCED IOPTRE IS SET IN PTY STATUS , AND CONTROL RETURNS\r
97 ;TO THE OUPTUT UUO AND THENCE TO THE USER.\r
98 ;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE \r
99 ;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS\r
100 ;UNTIL THEY ARE EMPTY.\r
101 \r
102 ;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)\r
103 ;DOES AN "OUTPUT" UUO.  IOPTW IS SET WHENEVER THE OBJECT JOB DOES\r
104 ;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH\r
105 ;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.\r
106 ;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON\r
107 ;SET IN THE OF IOS)\r
108 \r
109 \r
110 EXTERNAL TCOMLN,TTYTAB,TCOMM,TPYTAB,PTYTAB,ITMCNT,SETIOD\r
111 EXTERNAL ADVBFE,PUNIT\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 ERROR OTHERWISE)\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 \r
150 \fPTYOU1:        TRO IOS,IOACT\r
151         TRZ IOS,IOPTRE\r
152         JSR PTYSAV              ;SAVE ACS\r
153         LDB     LINE,PUNIT\r
154         ADDI LINE,TCONLN\r
155         EXCH    IOS,PIOS\r
156 \r
157 PTYOU2: SOSGE DEVCTR(PDDB)      ;BUFFER EMTY?\r
158         JRST PTYOU3             ;YES\r
159         ILDB CHREC,DEVOAD(PDDB) ;NO\r
160 PTYOU7: PUSHJ PDP,TCOMM         ;SEND NEXT CHARACTER\r
161         TLNE IOS,IOFST\r
162         JRST PTYOU3\r
163         TLNE    IOS,SP          ;SPECIAL CHARACTER ECHO?\r
164         JRST    PTYOU4          ;YES, SEE IF CONTROL CHAR ECHO\r
165         TLNE    IOS,SYNC        ;NO. BREAK CHARACTER SEEN IF OBJ. JOB SWAPPED OUT?\r
166         JRST    PTYOU3          ;YES, BUFFER NOT MOVED INTO OBJECT\r
167                                 ;JOB TTY IN BUFFER \r
168         JRST PTYOU2             ;NO\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: JSR 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,STODAT,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 PTYI3B             ;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 \r
236 \f\r
237 PTYI3A: TRZ     IOS,IOBKTL\r
238         TRO     IOS,IOPTRE      ;INPUT READY\r
239 PTYI3B: PUSHJ PDP,STOSQD\r
240         JRST    ADRERR\r
241         TLOA IOS,IOFST\r
242 \r
243 PTYIN6: TRO     IOS,IOPTRE+RPTB\r
244         PUSHJ PDP,ADVBFF        ;ADVANCE PTY BUFFER\r
245         JRST PTYI10             ;NEXT BUFFER IS FULL.\r
246         TLO IOS,IOFST\r
247         TRZE IOS,RPTB\r
248         JRST PTYIN5+1\r
249 PTYI10: TLZE IOS, IOW\r
250         PUSHJ PDP, SETIOD\r
251         TRZ IOS,IOACT+RPTB\r
252         POP PDP, LINE\r
253 PTYIN8: MOVEM IOS, DEVIOS(DDB)\r
254         POPJ PDP,\r
255 \r
256 \r
257 \f;SAVE ACCUMULATORS\r
258 ;CALL   MOVEI DDB,ADDRESS OF PTYDB\r
259 ;       JSR PTYSAV\r
260 \r
261 \r
262 IFE FTCHECK+FTMONP,<\r
263 PTYSAV: 0\r
264 >\r
265 PTYSA0: MOVEM SCNHAC,PTYBND(DDB)        ;SAVE HIGH AC\r
266         HRRZ SCNHAC,DDB\r
267         ADDI SCNHAC,PTYBM1\r
268         HRRM SCNHAC,PTYSA2\r
269         SUBI SCNHAC,SCNHAC-1\r
270         XCT     PTYSA2          ;DO BLT SCNHAC\r
271         MOVE PDDB,DDB\r
272         JRST @PTYSAV\r
273 \r
274 \r
275 ;RESTORE ACCUMULATORS\r
276 ;CALL   MOVEI PDDB,PTY DATA BLOCK ADDRESS\r
277 ;       JSR PTYRET\r
278 \r
279 \r
280 IFE FTCHECK+FTMONP,<\r
281 PTYRET: 0\r
282 >\r
283 PTYRE0: HRRZ SCNHAC,PDDB\r
284         ADDI SCNHAC,PTYSAC\r
285         HRLZS   SCNHAC\r
286         BLT SCNHAC,SCNHAC\r
287         JRST @PTYRET\r
288 \r
289 ;SAVE ONLY PIOS AND PDDB\r
290 \r
291 \r
292 IFE FTCHECK+FTMONP,<\r
293 PACSAV: 0\r
294 >\r
295 ACSAV0: MOVEM   PIOS,PIOSAV\r
296         MOVEM   PDDB,PDDSAV\r
297         JRST    @PACSAV\r
298 \r
299 ACRET:  MOVE    PIOS,PIOSAV\r
300         MOVE    PDDB,PDDSAV\r
301         POPJ    PDP,\r
302 \f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE\r
303 ;TTY OUTPUT WITH PTY INPUT\r
304 \r
305 \r
306 INTERNAL PTYPE\r
307 EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE\r
308 \r
309 PTYPE:  MOVE PDDB,LINE\r
310         SUBI PDDB,TCONLN\r
311         HRRZ PDDB,PTYTAB(PDDB)\r
312         TRO     IOS,IOACT       ;FORCE RESCHED TO CONTROL JOB\r
313         MOVEM IOS,DEVIOS(DDB)\r
314         MOVEI TAC,IOPTRE\r
315         IORB TAC,DEVIOS(PDDB)\r
316         MOVEM CHREC,PTYCSV(PDDB)        ;SAVE CHARACTER\r
317 \r
318 PTWAKE: PUSH PDP,TEM\r
319         PUSH    PDP,TAC1\r
320         LDB     TAC,[POINT 6,DEVCHR(PDDB),5]    ;PTY JOB NR\r
321         HRRZ    TAC1,CLOCK              ;LAST JOB IN CLOCK QUEUE\r
322 PTWAK2: CAIN    TAC1,CIPWTM1            ;LOOKED AT ALL JOBS\r
323         JRST PTWAK1                     ;YES, WAS NOT SLEEPING\r
324         HLRZ    TEM,(TAC1)              ;SLEEPING JOB?\r
325         CAIE    TEM,WAKE\r
326         SOJA    TAC1,PTWAK2             ;NO, IN QUEUE FOR SOME OTHER REASON\r
327         LDB     TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE\r
328         CAME    TEM,TAC                 ;IS IT THIS ONE?\r
329         SOJA    TAC1,PTWAK2             ;LNO, LOOP TILL DONE\r
330         MOVE    TEM,(TAC1)              ;YES, ZERO TIME LEFT TO SLEEP\r
331         TRZ     TEM,7777\r
332         AOS     TEM                     ;LADD ONE SO NEXT TICK WILL MAKE 0\r
333         MOVEM   TEM,(TAC1)\r
334 PTWAK1: POP     PDP,TAC1\r
335         POP     PDP,TEM\r
336         POPJ    PDP,\r
337 \f;ROUTINES TO SET VARIOUS BITS\r
338 ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE\r
339 \r
340 INTERNAL PTYOW,PTMNMD,PTMNMZ\r
341 \r
342 \r
343 PTMNMD: JSR     PACSAV          ;SAVE 2 AC'S\r
344         MOVEI   PIOS,MONMOD     ;PTY INTO MONITOR MODE\r
345         JRST    PTYSET\r
346 \r
347 PTMNMZ: JSR     PACSAV          ;SAVE AC'S\r
348         HRROI   PIOS,MONMOD     ;PTY OUT OF MONITOR MODE\r
349         JRST    PTYSET\r
350 \r
351 PTYOW:  JSR     PACSAV\r
352         MOVEI   PIOS,IOPTW      ;PTY IN OUTPUT WAIT\r
353 \r
354 PTYSET: MOVE    PDDB,LINE\r
355         SUBI    PDDB,TCONLN     ;FIND PTY THAT TTY IS LINKED TO\r
356         HRRZ    PDDB,PTYTAB(PDDB)\r
357         TLZE    PIOS,-1         ;BIT TO BE SET OR ZEEROED\r
358         ANDCAB  PIOS,DEVIOS(PDDB)       ;ZEROED\r
359         IORB    PIOS,DEVIOS(PDDB)\r
360         TRNE    PIOS,IOPTW      ;IS LINKED TTY JOB IN INPUT WAIT?\r
361         PUSHJ PDP,PTWAKE        ;YES, WAKE UP CONTROL JOB\r
362         JRST ACRET\r
363 \r
364 \f       END\r