22deebcf5bdbfee46243c2b8e9008208732eef41
[retro-software/dec/tops10/v4.5.git] / src / ptysrf.mac
1 TITLE   PTYSRF - FULL DUPLEX PSEUDO TELETYPE SERVICE ROUTINES\r
2 SUBTTL  M. FREDRIKSEN/RCC  TS  06 DEC 68 V006\r
3 XP      VPTYSF,006\r
4                 ;PUT VERSION NUMBER IN GLOB LISTINGS AND LOADER STORAGE MAP\r
5 \r
6 ENTRY PTYSRF            ;DUMMY GLOBAL FOR FULL DUPLEX PTY\r
7 PTYSRF:\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         PIOS=13\r
18         PDDB=14\r
19 \r
20 ;FOLLOWING BITS, AND LINE AND CHREC ASSIGMENTS\r
21 ; MUST AGREE WITH THOSE IN SCNSRF\r
22 \r
23         BREAKB=20000\r
24         FCSBRK=4000\r
25         TOIP=400000             ;SIGN OF TTYPTR IN TTY DDB\r
26         SYNC=20000              ;BREAK CHARACTER SEEN---FROM SCNSER\r
27 \r
28 ;PTY DEVICE DEPENDENT IO STATUS BITS (RH DEVIOS)\r
29 \r
30 IOPTW=4000              ;OUTPUT WAIT (OBJ. JOB HAS DONE INPUT)\r
31 IOPTRE=2000             ;PTY RESPONSE IS READY\r
32 MONMOD=1000             ;PTY IS IN MONITOR MODE\r
33 \r
34 INTERNAL FTTTYSER\r
35 \r
36 FTTTYSER=-1             ;FORCE MULT DEF GLOBAL IF WRONG APRSER\r
37 \fINTERNAL FTCHECK,FTMONP\r
38 IFN FTCHECK+FTMONP,<\r
39 EXTERNAL PTYDDB,PIOSAV,PTYSAC,PTYDNB,PTYBM1,PTYDDS,PIOSAV,PDDSAV\r
40 EXTERNAL PTYSAV,PTYSA2,PTYRET,PACSAV\r
41 INTERNAL PTYSA0,PTYRE0,ACSAV0\r
42 >\r
43 IFE FTCHECK+FTMONP,<\r
44 ;PSEUDO CONSOLE DEVICE DATA BLOCK\r
45 ;REMAINING PTY DDB'S ARE GENERATED\r
46 ;OUT OF LINE AT BUILD TIME\r
47         INTERN  PTYDDB\r
48         ZZ=.\r
49 PTYDDB: SIXBIT  /PTY0/\r
50         XWD     0,10000+STTYBF+1        ;PTY0 IS UNIT 1,PTY1 IS UNIT 2, ETC.\r
51         Z\r
52         EXP     PTYDSP\r
53         Z\r
54         Z\r
55         XWD     PROG,0\r
56         XWD     PROG,0\r
57         Z\r
58         XP      PTYDDS,.-ZZ     ;SIZE OF PTY DDB\r
59 >\r
60 \fINTERNAL PTYDSP\r
61 EXTERNAL OUT\r
62         POPJ    PDP,    ;INITIALIZE\r
63         POPJ    PDP,            ;PRINT ERROR, STOP JOB\r
64 PTYDSP: JRST PTYREL\r
65         JRST OUT\r
66         JRST PTYOUT\r
67         JRST PTYIN\r
68 \r
69 EXTERNAL PTYTAB,TCONLN,TTYTAB,TTYKIL,PUNIT\r
70 \r
71 PTYREL: LDB LINE,PUNIT\r
72         ADDI LINE,TCONLN\r
73         SKIPN TTYTAB(LINE)\r
74         POPJ PDP,\r
75         PUSH PDP,DDB\r
76         HRRZ DDB,TTYTAB(LINE)\r
77         PUSHJ PDP,TTYKIL\r
78         POP PDP,DDB\r
79 \r
80         LDB LINE,PUNIT\r
81         SETZM PTYTAB(LINE)\r
82         POPJ PDP,\r
83 \f;PTY OUTPUT\r
84 ;IF NO TTYTAB ENTRY EXISTS FOR THIS PTY, ONE IS CREATED\r
85 ;IF A TTY DATA BLOCK IS AVAILABLE.  IF NONE IS AVAILABLE,\r
86 ;IODERR IS SET IN PTY STATUS AND OUTPUT IS TERMINATED.\r
87 \r
88 ;IF A TTY DEVICE DATA BLOCK IS AVAILABLE, CHARACTERS ARE\r
89 ;PLACED IN THE TTY INPUT BUFFER, THE PTY OUTPUT BUFFER IS\r
90 ;ADVANCED, IOPTW IS CLEARED IN PTY STATUS, AND CONTROL RETURNS\r
91 ;TO THE OUPTUT UUO AND THENCE TO THE USER.\r
92 ;IF NO RESPONSE IN ENCOUNTERED, OUTPUT PROCEEDS IN THE \r
93 ;NORMAL FASHION ADVANCING THE PTY OUTPUT BUFFERS\r
94 ;UNTIL THEY ARE EMPTY.\r
95 \r
96 ;IOPTRF IS SET EVERY TIME THE JOB RUNNING 0N THE PTY (OBJECT JOB)\r
97 ;DOES AN "OUTPUT" UUO.  IOPTW IS SET WHENEVER THE OBJECT JOB DOES\r
98 ;AN INPUT, THE OBJECT JOB THEN GOES INTO I/O WAIT UNTIL THE JOB WITH\r
99 ;THE PTY ASSIGNED (CONTROL JOB) HAS COMPLETED ITS OUTPUT UUO.\r
100 ;MONMUD INDICATES PTY IS IN MONITOR MODE (ITS LINKED TTYDDB HAS TPMON\r
101 ;SET IN THE OF IOS)\r
102 \r
103 \r
104 EXTERNAL TCONLN,TTYTAB,TPYTAB,PTYTAB,SETIOD\r
105 EXTERNAL ADVBFF,PUNIT,RECIN3,PUTCHI\r
106 EXTERNAL TTIBUF,SPCHEK,DDBSRC,LINTAB,CNCTST,TIFCTR,INBFUL\r
107 \r
108 PTYOUT: LDB     LINE,PUNIT\r
109         HRRZM   DDB,PTYTAB(LINE)\r
110         ADDI    LINE,TCONLN\r
111         HLL     LINE,LINTAB(LINE)\r
112 \r
113         SKIPE   PDDB,TTYTAB(LINE)\r
114         JRST    PTYOU1\r
115         PUSHJ   PDP,PTEXCH\r
116         PUSHJ   PDP,DDBSRC\r
117         TROA    PIOS,IODERR\r
118         JRST    PTYOU2\r
119         MOVEM   PIOS,DEVIOS(PDDB)\r
120 \r
121 PTEXCH: EXCH    IOS,PIOS\r
122         EXCH    DDB,PDDB\r
123         POPJ    PDP,\r
124 \fPTYOU1:        MOVE    PIOS,DEVIOS(PDDB)\r
125         PUSHJ   PDP,PTEXCH\r
126 \r
127 PTYOU2: MOVEI   AC2,@DEVOAD(PDDB)\r
128         MOVE    AC2,1(AC2)\r
129         IMULI   AC2,5\r
130         HRRZ    AC1,DEVOAD(PDDB)\r
131         ADD     AC1,[XWD 700+PROG,1]\r
132         MOVEI   DAT,TTIBUF(DDB)\r
133 \r
134 PTYOU3: ILDB    CHREC,AC1\r
135         JUMPE   CHREC,PTYOU5\r
136         PUSHJ   PDP,SPCHEK\r
137         JRST    PTYOU4\r
138         CAIE    CHREC,176\r
139         CAIN    CHREC,33\r
140         MOVEI   CHREC,175\r
141         MOVEI   IOS,0\r
142         TLNE    TAC,BREAKB+FCSBRK\r
143 \r
144         MOVSI   IOS,SYNC\r
145         IORB    IOS,DEVIOS(DDB)\r
146         CAIN    CHREC,3         ;CONTROL C\r
147         PUSHJ   PDP,CNCTST      ;SEE IF SECOND, STOP JOB IF SO\r
148 \r
149 PTYOU4: MOVEI   DAT,TTIBUF(DDB)         ;MAY HAVE SWITCHED TO TIOBUF\r
150         PUSHJ   PDP,PUTCHI\r
151         JRST    PTYOUW\r
152         MOVE    TAC,TIFCTR(DDB)         ;SEE IF BUFFER FILLING UP\r
153         CAIL    TAC,10                  ;WAKE JOB IF SO\r
154         TLNE    IOS,SYNC\r
155         PUSHJ   PDP,RECIN3              ;CLOBBERS DAT AND TAC\r
156 PTYOU5: SOJG    AC2,PTYOU3\r
157 PTYOU6: PUSHJ   PDP,PTEXCH\r
158         PUSHJ   PDP,ADVBFE\r
159         JFCL\r
160         TRZ     IOS,IOPTW\r
161         TLO     IOS,IOFST\r
162         MOVEM   IOS,DEVIOS(DDB)\r
163         POPJ    PDP,\r
164 \r
165 PTYOUW: PUSHJ   PDP,INBFUL              ;TURN OFF SYNC, CHECK FOR\r
166                                         ; PANIC CONTROL C.\r
167         TRO     PIOS,IOBKTL     ;CANT PUT BATCH IN IOW\r
168         JRST    PTYOU6          ;ABORT BUFFER AND RETURN TO BATCH\r
169 \fEXTERNAL TCONLN,TTYTAB,SETIOD,ADVBFE,ADRERR,TTYPTR\r
170 EXTERNAL BUFCLR,XMTINT,PTYGET,TTYCHR,TTOBUF\r
171 \r
172 PTYIN:  LDB DAT,PUNIT\r
173         SKIPE PDDB,TPYTAB(DAT)  ;TTY DDB ADDRESS\r
174         JRST    PTYIN1\r
175         TRO IOS,IOIMPM          ;YES, THAT'S ALL.\r
176         JRST PTYIN3\r
177 \r
178 PTYIN1: MOVE    PIOS,DEVIOS(PDDB)\r
179         TRZA    IOS,IOPTRE\r
180 PTYIN4: TRO     IOS,IOPTRE\r
181         HRRZ    TAC,DEVIAD(DDB)\r
182         PUSHJ   PDP,BUFCLR\r
183         JRST    ADRERR\r
184         MOVEI   LINE,TCONLN(DAT)\r
185         PUSHJ   PDP,PTEXCH\r
186         MOVEI   AC2,TTYCHR\r
187         MOVEI   AC1,@DEVIAD(PDDB)\r
188         ADD     AC1,[XWD 700,1]\r
189         MOVEM   IOS,DEVIOS(DDB)\r
190         MOVSI   IOS,TOIP        ;MARK TYPE-OUT ACTIVE\r
191         IORM    IOS,TTYPTR(DDB)\r
192         PUSHJ   PDP,XMTINT\r
193         SKIPA\r
194 \r
195 PTYIN2: PUSHJ   PDP,PTYGET              ;SHOULD BE XMITIN1+1\r
196         SKIPL   TTYPTR(DDB)     ;STILL GOING?\r
197         JRST    PTYIN5          ;NO. END OF STRING FROM TTY\r
198         IDPB    CHREC,AC1\r
199         SOJG    AC2,PTYIN2\r
200 PTYIN5: PUSHJ   PDP,PTEXCH\r
201         MOVEI   AC3,@DEVIAD(DDB)\r
202         SUBI    AC1,1(AC3)\r
203         HRRM    AC1,1(AC3)      ;WORD COUNT TO BATCH\r
204         PUSHJ   PDP,ADVBFF\r
205         JRST    PTYIN3\r
206         SKIPGE  TTYPTR(PDDB)    ;STILL MORE TO COME?\r
207         JRST    PTYIN6          ;YES. SEE IF ROOM\r
208 \r
209 PTYIN3: MOVEM   IOS,DEVIOS(DDB)\r
210         POPJ    PDP,\r
211 \r
212 PTYIN6: MOVSI   TAC,TOIP        ;CLEAR ACTIVE BIT IN CASE STOPPED\r
213         ANDCAM  TAC,TTYPTR(PDDB)\r
214         SOJG    AC2,PTYIN4      ;COUNT, GO ON IF ROOM\r
215         JRST    PTYIN3          ;NO ROOM, STOP\r
216 \f;INTERCEPT TTY OUTPUT AT UUO LEVEL AND SYNCHRONIZE\r
217 ;TTY OUTPUT WITH PTY INPUT\r
218 \r
219 \r
220 INTERNAL PTYPE\r
221 EXTERNAL TCONLN,PTYTAB,CLOCK,CIPWTM1,WAKE\r
222 \r
223 PTYPE:  PUSH    PDP,PDDB\r
224         MOVE PDDB,LINE\r
225         SUBI PDDB,TCONLN\r
226         HRRZ PDDB,PTYTAB(PDDB)\r
227         PUSH    PDP,PIOS\r
228         MOVEM IOS,DEVIOS(DDB)\r
229         MOVEI PIOS,IOPTRE\r
230         IORB PIOS,DEVIOS(PDDB)\r
231         PUSHJ   PDP,PTWAKE\r
232         POP     PDP,PIOS\r
233         POP     PDP,PDDB\r
234         POPJ    PDP,0\r
235 \r
236 PTWAKE: PUSH    PDP,TAC1        ;SAVE LINE\r
237         PUSH    PDP,TEM\r
238         LDB     TAC,[POINT 6,DEVCHR(PDDB),5]    ;PTY JOB NR\r
239         HRRZ    TAC1,CLOCK              ;LAST JOB IN CLOCK QUEUE\r
240 PTWAK2: CAIN    TAC1,CIPWTM1            ;LOOKED AT ALL JOBS\r
241         JRST PTWAK1                     ;YES, WAS NOT SLEEPING\r
242         HLRZ    TEM,(TAC1)              ;SLEEPING JOB?\r
243         CAIE    TEM,WAKE\r
244         SOJA    TAC1,PTWAK2             ;NO, IN QUEUE FOR SOME OTHER REASON\r
245         LDB     TEM,[POINT 6,(TAC1),23] ;JOB NR IN QUEUE\r
246         CAME    TEM,TAC                 ;IS IT THIS ONE?\r
247         SOJA    TAC1,PTWAK2             ;LNO, LOOP TILL DONE\r
248         MOVE    TEM,(TAC1)              ;YES, ZERO TIME LEFT TO SLEEP\r
249         TRZ     TEM,7777\r
250         AOS     TEM                     ;LADD ONE SO NEXT TICK WILL MAKE 0\r
251         MOVEM   TEM,(TAC1)\r
252 PTWAK1: POP     PDP,TEM\r
253         POP     PDP,TAC1        ;RESTORE LINE\r
254         POPJ    PDP,\r
255 \f;ROUTINES TO SET VARIOUS BITS\r
256 ;CALLED FROM SCNSER WITH TTY LINE NUMBER IN LINE\r
257 \r
258 INTERNAL PTYOW,PTMNMD,PTMNMZ\r
259 \r
260 PTMNMD: PUSH    PDP,PIOS\r
261         MOVEI   PIOS,MONMOD     ;PTY INTO MONITOR MODE\r
262         JRST    PTYSET\r
263 \r
264 PTMNMZ: PUSH    PDP,PIOS\r
265         HRROI   PIOS,MONMOD     ;PTY OUT OF MONITOR MODE\r
266         JRST    PTYSET\r
267 \r
268 PTYOW:  PUSH    PDP,PIOS\r
269         MOVEI   PIOS,IOPTW      ;PTY IN OUTPUT WAIT\r
270 \r
271 PTYSET: PUSH    PDP,PDDB\r
272         MOVE    PDDB,LINE\r
273         SUBI    PDDB,TCONLN     ;FIND PTY THAT TTY IS LINKED TO\r
274         HRRZ    PDDB,PTYTAB(PDDB)\r
275         JUMPE   PDDB,PTYST1             ;PREVENT CATASTROPHE\r
276         TLZE    PIOS,-1         ;BIT TO BE SET OR ZEEROED\r
277         ANDCAB  PIOS,DEVIOS(PDDB)       ;ZEROED\r
278         IORB    PIOS,DEVIOS(PDDB)\r
279         TRNE    PIOS,IOPTW      ;IS LINKED TTY JOB IN INPUT WAIT?\r
280         PUSHJ   PDP,PTWAKE      ;YES, WAKE UP CONTROL JOB\r
281 PTYST1: POP     PDP,PDDB\r
282         POP     PDP,PIOS\r
283         \r
284         POPJ    PDP,0\r
285 \fPTYEND:        END\r
286 \f\r
287 \0\0\0\0\r