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