cleaned up typos
[retro-software/dec/tops10/v4.5.git] / src / uuocon.mac
1 TITLE   UUOCON - UUO HANDLER AND UUO+IO ROUTINES - V434\r
2 SUBTTL /RCC TS 03 JUN 69\r
3 XP VUUOCN,434   ;THIS MACRO PUTS VERSION NO. IN STORAGE MAP AND GLOB\r
4 \r
5         ENTRY UUOCON    ;ALWAYS LOAD UUOCON(IF LIB SEARCH)\r
6 UUOCON:\r
7 \r
8 ;THIS ROUTINE COMBINES THE OLD SYSCON,SYSCSS, AND IOCONT ROUTINES\r
9 ;IT CONSISTS OF THE UUO TRAP HANDLER\r
10 ;THE CALL UUO ROUTINES AND THE IO UUO ROUTINES\r
11 ;SOME UUO DO DISPATCH TO OTHER ROUTINES OUTSIDE OF UUOCON\r
12 ,   ALL UUOS DROP THEMSELVES IN REAL LOCATION 40, AND TRAP\r
13 , TO 41.  THE UUO HANDLER SHUFFLES THE UUO OFF TO THE USER'S\r
14 , 40,41, IF IT IS NOT A SYSTEM UUO.\r
15 ;SYSTEM UUOS(40-77) FIRST SAVE THE USERS ACS IN RELATIVE LOC 0-17\r
16 ;THEN THE FOLLOWING ACS ARE LOADED UP BEFORE DISPATCHING:\r
17 ;       PDP     ;PUSHDOWN LIST IN CURRENT JOB DATA AREA\r
18 ;       PROG    ;CURRENT JOB RELOCATION IN RH,PROTECTION IN LH\r
19 ;       JDAT    ;ADDRESS OF CURRENT JOB DATA AREA\r
20 ;       UUO     ;THE CONTENTS OF LOC 40 WITH PROG IN INDEX FIELD\r
21 ;               ;SO THAT RELOCATION CAN BE DONE FOR PICKING UP ARGUMENTS\r
22                 ; EXCEPT THAT ON A CALL OR CALLI UUO, THE ADDRESS IS\r
23                 ; MODIFIED TO BE THE AC OF THE UUO,FOR\r
24                 ; PICKING UP ARGUMENTS.\r
25 ;       DEVDAT  ;ADR. OF DEVICE DATA BLOCK\r
26 ;       IOS     ;DEVICE IO STATUS WORD\r
27 ;       DSER    ;ADR. OF DEVICE SERVICE ROUT. DISPATCH TABLE\r
28 ;       UCHN    ;THE USER IO CHANNEL(AC FIELD) OF UUO\r
29 \r
30 ;RETURN IS PUSHED ON END OF PD LIST\r
31 ;THEN IF CALL WAS FROM USER MODE, THE UUO ROUTINE IS CALLED\r
32 ;WITH A PUSHJ, SO THAT ALL UUO ROUTINE RETURN WITH A POPJ PDP,\r
33 ;WHICH WILL RETURN CONTROL TO UUOCON WHICH WILL RESTORE USERS\r
34 ;ACS AND RETURN TO HIM\r
35 ;IF THE CALL IS FROM EXEC MODE, THE UUO ROUTINE IS CALLED\r
36 ;BY DOING JUST A JRST,  WHEN THE UUO ROUTINE RETURNS WITH\r
37 ;A POPJ, IT WILL RETURN TO THE EXEC WITHOUT RESTORING\r
38 ;ANY ACS\r
39 , CONTROL MAY ALWAYS BE RETURNED BY EXECUTING A\r
40 ;       POPJ PDP,\r
41 , WHICH WILL RESTORE THE ACS, APR BITS, AND RETURN.\r
42 , THE UUO HANDLER IS PURE IF THE FOLLOWING RESTRICTIONS ARE OBSERVED.\r
43 , RESTRICTIONS: UUOS CANNOT BE CALLED BY INTERRUPT SERVICE ROUTINES.\r
44 \f;HERE ON UUO FROM USER\r
45 ;USER AC 17 ALREADY SAVED IN LOC USRSAV(SEE COMMON)\r
46 ;AC 17 CONTAINS ADR OF JOB(JOBADR)\r
47 ;SAVE HIS ACS ON REL. LOC 0-17\r
48 \r
49 ;TO UUOSY1 IF UUO FROM EXEC MODE (AC 17 GUARRANTEED NOT TO BE EQUAL TO AC PROG)\r
50 \r
51 INTERNAL UUOUSR,UUOSY1,USRXIT\r
52 EXTERN FORTY,SIXTY\r
53 EXTERN ADRERR,CORUUO,DEVHNG,GETWRD,HOLD,ILLINS\r
54 EXTERN ILLMOD,IOIERR,JOBKL,JOBSAV,PHOLD,REASSI,SETAPR\r
55 EXTERN STWAIT,UGTSEG,URUN,USCHED,UUOERR\r
56 EXTERN WAIT1,WSYNC\r
57 EXTERNAL USRSAV,JOBPDL,MJOBPD,PUUOAC,USRJDA\r
58 EXTERNAL USRHCU,JOB,JBTSTS,TIMEF\r
59 EXTERNAL JOBDAT,JOBAC,UUO0,FORTY\r
60 \r
61 UUOUSR: MOVEM 16,16(17)         ;STORE AC16 IN USER 16\r
62         MOVEI 16,(17)           ;SET UP BLT POINTER\r
63         BLT 16,15(17)           ;MOVE REAL AC'S TO USER AREA\r
64         MOVE TAC,USRSAV         ;MOVE USER 17 TO USER'S AREA\r
65         MOVEM TAC,17(17)\r
66         MOVE PROG,17            ;LOAD UP POINTER TO USER PROGRAM AREA\r
67 IFN JDAT-PROG,<\r
68         MOVE JDAT,JOBDAT        ;ADDRESS OF JOB DATA AREA\r
69 >\r
70         MOVSI PDP,MJOBPD        ;LOAD UP PUSH DOWN AC AND\r
71         HRRI PDP,JOBPDL(JDAT)   ;MAKE ABSOLUTE RATHER THAN RELATIVE\r
72 UUOSY1: PUSH PDP,UUO0           ;SAVE RETURN ON PUSH DOWN LIST\r
73         MOVE UUO,FORTY          ;GET THE UUO INTO AC(UUO)\r
74         TLNN UUO,740000         ;SYSTEM UUO?\r
75 ILEGAL: JRST UUOERR             ;NO, 0-37 ARE ILLEGAL,PRINT ERROR\r
76         TLO UUO,PROG            ;SET FOR RELOCATION\r
77         LDB TAC1,[POINT 9,UUO,8];PICK UP UUO OP CODE\r
78         CAIL TAC1,100           ;ILLEGAL INSTRUCTION?\r
79         JRST ILLINS             ;YES, STOP JOB AND PRINT ERROR\r
80         LDB UCHN,PUUOAC         ;SETUP USER DEVICE CHANNEL NUMBER\r
81         SKIPE DEVDAT,USRJDA(UCHN)       ;GET ADRESS OF DEVICE DATA BLOCK\r
82         CAMLE UCHN,USRHCU       ;IS IT LESS THAN OR EQUAL TO HIGHEST\r
83                                 ; USER IO CHANNEL IN USE FOR CURRENT JOB?\r
84         JRST NOCHAN             ;CHANNEL NOT ASSIGNED\r
85         MOVE IOS,DEVIOS(DEVDAT) ;GET DATA BLOCK STATUS WORD\r
86         MOVE DSER,DEVSER(DEVDAT);SETUP IO SERVICE DISPATCH\r
87                                 ; TABLE ADDRESS\r
88         CAIL TAC1,LNGUUO        ;LONG DISPATCH TABLE UUO?\r
89         JRST DISP1              ;YES\r
90 DISP0:  ROT TAC1,-1             ;DIVIDE UUO OPCODE BY 2, SAVE REMAINDER\r
91         MOVE DAT,UUOTAB-20(TAC1);GET DISPATCH TABLE ENTRY\r
92 DISP2:  TLNN TAC1,400000        ;WAS UUO ODD?\r
93         MOVS DAT,DAT            ;NO, USE LH OF DISPATCH ENTRY\r
94         CAME PROG,17            ;UUO FROM SYSTEM?\r
95         JRST (DAT)              ;YES, RETURN ADDRESS ALREADY ON PD \r
96                                 ; LIST. AVOID RESTORING USER\r
97                                 ; ACS ON RETURN TO SYSTEM.\r
98 \f;DISPATCH TO UUO ROUTINE\r
99 ;THE FOLLOWING CODE IS EXECUTED ON ALL RETURN TO USER PROGRAMS\r
100 ;BUT IS NEVER EXECUTED ON RETURNS FROM EXEC UUOS(SAVGET)\r
101 \r
102         PUSHJ PDP,(DAT)         ;NO, FROM USER. ALL\r
103                                 ; UUO ROUTINES RETURN WITH POPJ\r
104         JRST USRXIT             ;NO SKIP RETURN TO USER\r
105 USRXT1: AOS (PDP)               ;SKIP RETURN TO USER\r
106 USRXIT: MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
107         MOVE TAC,JBTSTS(ITEM)\r
108         JUMPG TAC,USRXT2        ;HAS A CONTROL C BEEN EXECUTED?\r
109         TLNN TAC,STOPIO         ;TRYING TO STOP IO?\r
110         SKIPE TIMEF             ;NO. HAS CLOCK TICKED WHILE IN MONITOR?\r
111 USRXT2: PUSHJ PDP,USCHED        ;YES, GO CALL SCHEDULER\r
112         POP PDP,UUO0            ;USER RETURN ADDRESS\r
113         MOVSI 17,JOBAC(PROG)    ;RESTORE ALL USER ACS\r
114         BLT 17,17\r
115         JEN @UUO0               ;RESTORE FLAGS AND RETURN TO USER\r
116                                 ; DISMISS INTERRUPT ONLY ON TRPJEN UUO\r
117                                 ; IN ALL OTHER CASES NO INTERRUPTS\r
118                                 ; IN PROGRESS\r
119 \r
120 NOCHAN:NOCHAN:  CAMN PROG,17            ;UUO FROM USER?\r
121                                 ;IF FROM EXEC, PROBABLY SAVEGET WHICH SETS USRCHN NEG. IN LH\r
122         CAIGE TAC1,IOUUO        ;YES, IS THIS AN IO UUO?\r
123         JRST DISP0              ;NO, GO DISPATCH\r
124         CAIE TAC1,70            ;YES,IS IT CLOSE OR RELEASE?\r
125         CAIN TAC1,71            ;CLOSE AND RELEASE ALWAYS LEGAL EVEN THOUGH NO DEVICE ASSIGNED\r
126         JRST USRXIT\r
127         JRST IOIERR             ;NO, PRINT IO TO UNASSIGNED CHANNEL\r
128                                 ; AND STOP JOB\r
129 \r
130 DISP1:  MOVE TAC,DEVMOD(DEVDAT) ;LONG DISPATCH TABLE UUO\r
131         TLNE TAC,DVLNG          ;DOES THIS DEVICE HAVE A LONG\r
132                                 ; DISPATCH TABLE?\r
133         JRST DISP0              ;YES, DISPATCH\r
134         CAIGE TAC1,76           ;NO, IS UUO LOOKUP OR ENTER?\r
135         JRST USRXIT             ;NO, RETURN TO USER\r
136         JRST USRXT1             ;YES, SKIP RETURN TO USER\r
137 \f\r
138 ;TABLE OF UUO DISPATCH ADDRESSES\r
139 ;IN FORMAT:\r
140 ;       XWD 40,41\r
141 ;       XWD 42,43\r
142 ;       .\r
143 ;       XWD 76,77\r
144 \r
145 \r
146 \r
147 UUOTAB: XWD UCALL,UINIT         ;(40,41)CALL,INIT\r
148         XWD UUOERR,UUOERR       ;(42,43)FIVE UUOS FOR EACH INSTALLATION\r
149         XWD UUOERR,UUOERR       ;(44,45)TO DEFINE AS THEY SEE FIT\r
150         XWD UUOERR,UCALLI       ;(46,47),CALLI\r
151 IFN FTTTYSER,<\r
152 EXTERN TTYUUO\r
153         XWD UOPEN,TTYUUO        ;(50,51)OPEN, TTCALL\r
154 >\r
155 IFE FTTTYSER,<\r
156         XWD     UOPEN,CPOPJ     ;(50,51)OPEN, NO-OP FOR TTCALL\r
157 >\r
158         XWD ILEGAL,ILEGAL       ;(52,53)\r
159         XWD ILEGAL,URENAM       ;(54,55),RENAME\r
160 XP IOUUO,55                     ;LOWEST IO UUO(RENAME)\r
161         XWD TIN,TOUT            ;(56,57)IN,OUT\r
162         XWD SETIOS,USTATO       ;(60,61)SETSTS,STATO\r
163         XWD USTATS,USTATZ       ;(62,63)GETSTS,STATZ\r
164         XWD UINBF,UOUTBF        ;(64,65)INBUF,OUTBUF\r
165         XWD IN,UOUT             ;(66,67)INPUT,OUTPUT\r
166         XWD CLOSE1,RELEA1       ;(70,71)CLOSE,RELEASE\r
167 XP LNGUUO,72                    ;LOWEST LING DISPATCH TABLE UUO\r
168         XWD UMTAPE,UDGF         ;(72,73)MTAPE,GETF\r
169         XWD UDSI,UDSO           ;(74,75)SETI,SETO\r
170         XWD UDLK,UDEN           ;(76,77)LOOKUP,ENTER\r
171 \r
172 ;UUOS 42, 43, 44, 45, AND 46 ARE FOR CUSTOMERS TO DEFINE AS THEY PLEASE\r
173 ;UUOS 40, 41 AND 47 THROUGH 77 ARE DEFINED BY DIGITAL\r
174 ;UUOS 51,52,53 AND 54 ARE RESERVED FOR EXPANSION BY DIGITAL\r
175 \f, CALLING SEQUENCE\r
176 ,       CALL D,[SIXBIT/NAME/]\r
177 , WHERE NAME IS THE NAME OF A SYSTEM ROUTINE.\r
178 , IF NO SYSTEM ROUTINE WITH THE SPECIFIED NAME IF FOUND, THIS ROUTINE\r
179 , EXITS TO UUOERR.\r
180 ;CONTENTS OF USER AC PLACED IN AC TAC,UUO SET TO POINT\r
181 ;TO USER AC, PROG IN LH.\r
182 ;ITEM SET TO JOB NUMBER\r
183 \r
184 EXTERNAL JOB\r
185 \r
186 UCALL:  PUSHJ PDP,GETWDU        ;SET TAC FROM CONTENTS OF EFFECTIVE ADDRESS OF\r
187                                 ; UUO FROM EITHER HIGH OR LOW SEG\r
188                                 ; DO NOT RETURN IF ERROR\r
189                                 ; SET ITEM TO CURRENT JOB NO.\r
190         MOVSI TAC1,-UCLLEN-CCLLEN-1     ;-SUM OF LENGTHS OF SIXBIT TABLES,\r
191                                 ; -1 FOR THE CARRY TO LH IN AOBJN\r
192         HRRI TAC1,-CCLLEN       ;- LENGTH OF CUSTOMER TABLE\r
193         CAME TAC,UCLTAB(TAC1)   ;SEARCH SYSTEM ROUTINE NAME TABLE\r
194         AOBJN TAC1,.-1\r
195         HRRM TAC1,UUO           ;STORE INDEX IN UUO, JUST AS IF USER HAD DONE CALLI UUO\r
196 \r
197 \r
198 ;CALLI UUO      -       CALL IMMEDIATE\r
199 ;CALLI D,E\r
200 ;WHERE E IS RELATIVE INDEX IN CALL TABLE\r
201 \r
202 INTERNAL UCALLI\r
203 \r
204 UCALLI: HRRE TAC1,UUO           ;GET CALLI NUMBER (POS. = DIGITAL, NEG. = CUSTOMER DEFINED)\r
205         CAML TAC1,[-CCLLEN]     ;MORE NEGATIVE THAN MOST NEGATIVE CUSTOMER DEFINED UUO?\r
206         CAIL TAC1,UCLLEN        ;MORE POSITIVE THAT DIGITAL DEFINED UUO?\r
207         POPJ PDP,               ;YES, RETURN TO USER TREAT AS NO-OP SO\r
208                                 ; PROGRAMS AHEAD OF MONITOR WILL STILL\r
209                                 ; RUN WITHOUT ERROR MESSAGE\r
210         CAMN PROG,17            ;NO, WAS UUO FROM MONITOR?\r
211         POP PDP,TAC             ;REMOVE RETURN\r
212         HRR UUO,UCHN            ;UUO AC FIELD\r
213         MOVE TAC,@UUO           ;PICK UP CONTENTS OF USER AC\r
214         ROT TAC1,-1             ;DEVIDE BY 2 AND SAVE REMAINDER\r
215         MOVE DAT,UCLJMP(TAC1)   ;GET DISPACTH TABLE ENTRY\r
216         MOVE ITEM,JOB           ;SETUP CURRENT JOB NUMBER(IN CASE THIS IS CALLI)\r
217         JRST DISP2              ;AND GO DISPATCH\r
218 \f\r
219 ;CALL UUO DISPATCH TABLE\r
220 ;NEW UUO'S MUST BE ADDED AT END SINCE CALLI DEPENDS ON\r
221 ;POSITION IN TABLE, CUSTOMERS SHOULD ADD UUO'S IN CNAMES MACRO SO CALLI ADDRESS\r
222 ;WILL BE NEGATIVE.  IN THIS WAY BOTH DIGITAL AND ITS CUSTOMERS CAN ADD UUO'S\r
223 ;WITHOUT CONFLICT, DIGITAL GOING POSITIVE, CUSTOMERS GOING NEGATIVE.\r
224 ; (ALSO, TOWARD TOP OF PAGE)\r
225 \r
226 ;ALSO EXTERNALS MUST BE IN RH(IE ODD CALLI INDECIES)\r
227 \r
228 EXTERNAL DDTIN,DDTOUT,CPOPJ\r
229 \r
230 DEFINE CNAMES <\r
231         X CPOPJ,CPOPJ           ;(-3) PLACE FOR CUSTOMERS TO PATCH UUOS\r
232         X CPOPJ,CPOPJ           ;(-2) \r
233         X LIGHTS,LIGHTS         ;(-1) SET LIGHTS (EXAMPLE OF CUSTOMER DEFINED UUO)\r
234 >\r
235 \r
236 DEFINE NAMES,<\r
237         X RESET,RESET           ;(0)RESET IO\r
238         X DDTIN,DDTIN           ;(1)EXT-GET DDT CHAR.\r
239         X SETDDT,SETDDT         ;(2)SETDDT LOC IN PROTECTED JOB DATA\r
240         X DDTOUT,DDTOUT         ;(3)EXT:SEND DDT CHAR.\r
241         X DEVCHR,DVCHR          ;(4)DEVICE CHARACTISTICS\r
242         X DDTGT,CPOPJ           ;(5)GET DDT MODE\r
243         X GETCHR,DVCHR          ;(6)DEVICE CHAR.(DIFF. NAME)\r
244         X DDTRL,CPOPJ           ;(7)RELEASE DDT MODE\r
245         X WAIT,WAIT             ;(10)WAIT TILL DEVICE INACTIVE\r
246         X CORE,CORUUO           ;(11)CORE UUO\r
247         X EXIT,EXIT             ;(12)EXIT\r
248         X UTPCLR,UTPCLR         ;(13)CLEAR DEC TAPE DIRECTORY \r
249         X DATE,DATE             ;(14)GET DATE\r
250         X LOGIN,LOGIN           ;(15)LOGIN\r
251         X APRENB,APRENB         ;(16)ENABLE APR FOR TRAPPING\r
252         X LOGOUT,LOGOUT         ;(17)LOGOUT\r
253         X SWITCH,SWITCH         ;(20)RETURN DATA SWITCHES\r
254         X REASSIGN,REASSIGN     ;(21)REASSIGN DEVICE TO ANOTHER JOB\r
255         X TIMER,TIMER           ;(22)RETURN JIFFY CLOCK TIME\r
256         X MSTIME,MSTIME         ;(23)RETURN TIME OF DAY IN MS\r
257         X GETPPN,GETPPN         ;(24)RETURN PROJECT-PROGRAMMER NUMBER\r
258         X TRPSET,TRPSET         ;(25)SET PI TRAP LOC, AND USER IO\r
259         X TRPJEN,UUOERR         ;(26)DISMISS INTERRUPT TO EXEC MODE(SUPERCEDED BY UJEN)\r
260         X RUNTIM,JOBTIM         ;(27)RETURN TOTAL JOB RUNNING TIME\r
261         X PJOB,JOBNO            ;(30)RETURN JOB NUMBER\r
262         X SLEEP,SLEEP           ;(31)SLEEP FOR N SECONDS, THEN RETURN TO USER\r
263         X SETPOV,SETPOV         ;(32)SET PUSH DOWN OVERFLOW TRAP\r
264                                 ; (FOR COMPATIBILITY ONLY)\r
265         X PEEK,UPEEK            ;(33)TO PEEK AT CERTAIN MONITOR PARAMETERS\r
266         X GETLIN,GETLN          ;(34) GET TTY UNE NUMBER\r
267         X RUN,URUN              ;(35) RUN DEV:FILE\r
268         X SETUWP,SETUWP         ;(36) SET OR CLEAR USER MODE WRITE PROTECT\r
269         X REMAP, REMAP          ;(37) REMAP TOP OF LOW SEGMENT INTO HIGH SEG\r
270         X GETSEG,UGTSEG         ;(40) GET SHARABLE HIGH SEG\r
271         X GETTAB,GETTAB         ;(41) GET EXEC ADDRESS OF A JOB TABLE\r
272         X SPY,USPY              ;(42) SET HIGH SEG TO BE PHYSICAL CORE\r
273         X SETNAM,SETNAM         ;(43) SETNAME OF THIS PROGRAM\r
274         X CPOPJ,CPOPJ           ;2 SPARE UUO'S FOR PATCHING - DIGITAL ONLY\r
275         X CPOPJ,CPOPJ           ;ALWAYS ADD NEW UUO'S ABOVE THESE\r
276                                 ;CUSTOMERS SHOULD ADD UUO'S ABOVE\r
277                                 ;IN CNAMES MACRO RATHER THAN NAMES MACRO\r
278                                 ; SO THAT THEIR CALLI INDECES WILL\r
279                                 ; BE NEGATIVE\r
280 >\r
281 \f;GENERATE SIXBIT TABLE OF UUO NAMES\r
282 \r
283 DEFINE X (A,B) <\r
284         <SIXBIT /A/>\r
285 >\r
286 \r
287 ;GENERATE CUSTOMER CALL/CALLI UUO'S\r
288 \r
289 CCLTAB: CNAMES\r
290 CCLLEN=.-CCLTAB         ;LENGTH OF CUSTOMER DEFINED CALL/CALLI UUO'S\r
291                         ;(MINIMUM CALLI NUMBER, TOO)\r
292 \r
293 ;GENERATE DIGITAL UUO'S\r
294 \r
295 UCLTAB: NAMES\r
296 UCLLEN=.-UCLTAB         ;DEFINE LENGTH OF DIGITAL UUO TABLE(MAX. CALLI NO. TOO)\r
297 \fDEFINE X (A,B)\r
298 <       ZZ=ZZ+1\r
299         DEFINE XX (C)           ;DEFINE XX IN CASE JOB NUMBER OF CUSTOMER UUO'S\r
300 <       XWD UUOERR,C\r
301 >>\r
302 ZZ=0\r
303 ;COUNT NUMBER OF CUSTOMER DEFINED UUO'S\r
304         CNAMES\r
305 \r
306 ;GENERATE HALF WORD UUO DISPATCH TABLE\r
307 \r
308 DEFINE X (A,B)\r
309 <       IFE ZZ&1,\r
310 <       DEFINE XX (C)\r
311 <\r
312         XWD B,C\r
313 >>\r
314         IFN ZZ&1,\r
315 <\r
316         XX B\r
317 >\r
318 ZZ=ZZ+1\r
319 >\r
320 \r
321 ;GENERATE CUSTOMER TABLE\r
322 \r
323 CUSTAB: CNAMES\r
324 \r
325 \r
326 ZZ=0\r
327 \r
328 ;GENERATE DIGITAL TABLE\r
329 \r
330 UCLJMP: NAMES\r
331 \r
332         IFN ZZ&1,<XX 0> ;GEN. LAST WORD IF ODD NUMBER OF UUOS\r
333 \r
334 ;FIX UP SYMBOLS NOT IN UUOCON\r
335 \r
336 IFN FT2REL,<EXTERN USPY>\r
337 IFE FT2REL,<USPY=LCPOPJ>\r
338 \f;EXIT UUO ROUTINE\r
339 ;CALL:  CALL FIELD, [SIXBIT/EXIT/]\r
340 ;IF FIELD - 0, PRINT EXIT ^C.  CONT WILL NOT WORK\r
341 ;IF FIELD NON-ZERO, JUST PRINT.  DO NOT RELEASE DEVICES\r
342 \r
343 EXTERNAL TTYFUW\r
344 \r
345 EXIT:   JUMPN UCHN,MONRET       ;AC FIELD NON-ZERO?\r
346         PUSHJ PDP,IORELS        ;NO, RELEASE ALL DEVICES\r
347         PUSHJ PDP,TTYFUW        ;FIND TTY FOR CURRENT JOB\r
348                                 ; SET ITEM TO JOB NO.,DAT TO OUTPUT BYTE POINTER\r
349                                 ; DEVDAT TO TTY DDB\r
350         JSP TAC,PHOLD           ;MOVE "EXIT" TO OUTPUT BUFFER\r
351                                 ; AND STOP JOB, AND START TTY, CONT WILL NOT WORK\r
352         ASCIZ /\r
353 EXIT/\r
354 \r
355 ;       CALL 1,[SIXBIT/EXIT/] - RETURN TTY TO MONITOR MODE,\r
356 ;       STOP JOB, BUT DO NOT RELEASE DEVICES\r
357 ;TYPE . WITH NO CRLF, ALLOW CONT COMMAND TO RETURN AFTER UUO\r
358 \r
359         EXTERN PRPER,STOP1,CRLF,TTYSTC\r
360 \r
361 MONRET: PUSHJ PDP,TTYFUW        ;FIND TTY FOR CURRENT JOB\r
362         PUSHJ PDP,CRLF          ;PRINT CR LF\r
363         PUSHJ PDP,PRPER         ;PRINT .\r
364         PUSHJ PDP,TTYSTC        ;PUT TTY INTO COMMAND MODE\r
365         JRST STOP1              ;START TTY IN MONITOR MODE AND STOP JOB\r
366                                 ;BUT ALLOW CONTINUE TO WORK (RETURN CONTROL AFTER EXIT UUO)\r
367 \r
368 ;SETPOV - SET PUSH DOWN OVERFLOW TRAP\r
369 ;CALL   MOVE AC,ADR. OF TRAP ON PD OVF\r
370 ;       CALL AC,[SIXBIT /SETPOV/]\r
371 \r
372 EXTERNAL JOBAPR\r
373 \r
374 SETPOV: MOVEM TAC,JOBAPR(JDAT)\r
375         MOVEI TAC,1B19\r
376         JRST APRENB             ;SET TRAP LOC.\r
377 \r
378 \f;RESET UUO ROUTINE\r
379 \r
380 INTERNAL RESET,FTTRPSET\r
381 EXTERNAL JOBPD1\r
382 \r
383 RESET:\r
384 IFN FTTRPSET,<\r
385         EXTERN STOPTS\r
386         CAIN    TAC,1           ;IS THIS JOB 1 DOING THE RESET?\r
387         SETZM   STOPTS          ;YES. MAKE SURE SCHEDULING ALLOWED\r
388                                 ; IN CASE THIS FOLLOWS A TRPSET UUO\r
389 >\r
390 IFN FT2REL,<\r
391         EXTERN HRESET\r
392         PUSHJ PDP,HRESET        ;FLAG USER AS HAVING UWP ON FOR HIGH SEG\r
393                                 ; AND DO DATAO TO SET UWP ON\r
394 >\r
395         PUSHJ PDP,IOKILL        ;RELEASE ALL DEVICES\r
396         MOVSI TAC,777777-USRMOD ;CLEAR ALL UUO PC FLAGS IN LH, EXCEPT USER MODE\r
397         ANDCAM TAC,JOBPD1(JDAT) ;LEAVE USER MODE OFF TOO, IF EXEC DOING CALL RESET\r
398                                 ; FALL INTO APRENB WITH RH TAC=0\r
399                                 ; SO THAT ALL APR INTERRUPTS WILL BE DISABLED\r
400 \f;ROUTINE TO SET UP APR FOR USER TRAPPING\r
401 ;CALL:  CALL AC,[SIXBIT /APRENB/]\r
402 ;WITH FOLLOWING APR CONSO FLAG BITS\r
403 ;TO INDICATE WHICH APR CONDITIONS SHOULD\r
404 ;TRAP TO USER WHEN TRAP OCCURS FROM USER MODE\r
405 \r
406 ;1B19   ;PUSHDOWN OVERFLOW\r
407 ;1B22   ;ILLEGAL MEMORY\r
408 ;1B23   ;NON-EXISTENT MEMORY\r
409 ;1B26   ;CLOCK\r
410 ;1B29   ;FLOATING POINT OVERFLOW\r
411 ;1B32   ;ARITH. OVERFLOW\r
412 \r
413 INTERNAL APRENB\r
414 \r
415 APRENB: HRRM TAC,JOBENB(JDAT)   ;SET RH TO CONSO BITS IN JOB DATA AREA\r
416                                 ; USED EVERY TIME IS STARTED UP\r
417 \r
418         JRST SETAPR             ;GO ENABLE/DISABLE APR FOR FOV AND HR OV\r
419                                 ; ALSO SET APR CONSO INSTR. FOR PROPER FLAGS\r
420                                 ; AND RETURN TO USER\r
421 \f;RETURN JOB NUMBER FOR THIS JOB\r
422 \r
423 JOBNO:  SKIPA TAC,ITEM          ;JOB NUMBER\r
424                                 ; SKIP AND STORE TAC IS USER AC\r
425 \r
426 ;RETURN THE DATE TO THE USER\r
427 \r
428 EXTERNAL THSDAT\r
429 \r
430 DATE:   MOVE TAC,THSDAT\r
431         JRST STOTAC\r
432 \r
433 ;RETURN JOB RUNNING TIME IN MILLISECONDS\r
434 \r
435 INTERNAL FTTIME\r
436 \r
437 JOBTIM:\r
438 IFN FTTIME,<EXTERNAL JOBN\r
439         SKIPL TAC\r
440         CAILE TAC,JOBN\r
441         JRST    RTZER\r
442         SKIPN TAC\r
443         MOVE TAC,ITEM\r
444         SKIPA TAC,TTIME(TAC)    ;TOTAL JOB RUNNING TIME\r
445         EXTERNAL TTIME\r
446 >\r
447 IFE FTTIME,<\r
448                 TDZA TAC,TAC    ;RETURN ZERO IF NO TIMMING COM.\r
449 >\r
450 \r
451 ;RETURN TIME OF DAY IN MILLISECONDS\r
452 \r
453 EXTERNAL TIME,JIFSEC\r
454 \r
455 MSTIME: MOVE TAC,TIME           ;TIME OF DAY IN JIFFIES\r
456         IMULI TAC,^D1000\r
457         IDIVI TAC,JIFSEC        ;DIVIDE BY NO. OF JIFFIES PER SECOND\r
458         JRST STOTAC\r
459 \f\r
460 ;PUT JOB TO SLEEP FOR NSECONDS\r
461 ;CALL   CALL AC,[SIXBIT /SLEEP/]\r
462 \r
463 INTERNAL FTSLEEP,SLEEP\r
464 \r
465 SLEEP:\r
466 IFN FTSLEEP,<\r
467 EXTERNAL JIFSEC,JBTSTS,PION,PIOFF,SETSLP,WAKE,CLOCK\r
468         MOVSI TAC1,CLKR\r
469         TDNE TAC1,JBTSTS(ITEM)  ;DOES THIS JOB HAVE A CLOCK QUEUE\r
470                                 ; REQUEST IN CLOCK QUEUE?\r
471         JRST SLEEP1             ;YES, DO NOT PUT ANOTHER ONE IN\r
472         IMULI TAC,JIFSEC        ;MULTIPLY BY NO. OF JIFFIES PER SECOND\r
473         TRNN TAC,7777           ;0 TIME?(CHECK ONLY 12 BITS)\r
474         MOVEI TAC,1             ;YES. SLEEP 1 JIFFY\r
475         DPB ITEM,[POINT 6,TAC,23]\r
476         HRLI TAC,WAKE           ;ADR. IN RUNCSS WHEN JOB WAKES UP\r
477         CONO PI,PIOFF\r
478         IDPB TAC,CLOCK\r
479         CONO PI,PION\r
480 SLEEP1: JRST SETSLP             ;SET JOB STATUS WORD SO JOB WILL NOT RUN\r
481 >\r
482 IFE FTSLEEP,<   POPJ PDP,       ;RETURN IMMEDIATELY IF NOT A FEATURE>\r
483 \r
484 ;PEEK INTO MONITOR UUO\r
485 ;CALL   MOVEI   AC,<MONITOR ADDRESS>\r
486 ;       CALL    AC,[SIXBIT .PEEK.]\r
487 \r
488         EXTERN SYSSIZ\r
489 \r
490 UPEEK:\r
491 IFN FTLOGIN,<\r
492         HLRZ    TAC1,PRJPRG(ITEM)       ;GET USER'S PROJECT NR\r
493         CAIE    TAC1,1                  ;ADMIN NR?\r
494         JFCL            ;SHOULD BE PATCHED TO "JRST UUOERR" IF\r
495                         ; IF CUSTOMER WANTS PEEK UUO NOT ALLOWED FOR ALL USERS\r
496 >\r
497         CAMLE TAC,SYSSIZ        ;ONLY UP TO SIZE OF SYSTEM\r
498         JRST RTZER              ;RETURN 0 IF USER ASKING TOO BIG\r
499         MOVE    TAC,(TAC)\r
500         JRST    STOTAC\r
501 \f;SET OR CLEAR USER MODE WRITE PROTECT BIT IN HIGH SEG FOR THIS USER ONLY\r
502 ;CALL:  MOVEI AC,0 OR 1\r
503 ;       CALL AC,[SIXBIT /SETUWP/] OR CALLI AC,34\r
504 ;       ERROR - MACHINE OR MONITOR CANNOT HANDLE TWO REG, OR TRYING TO CLEAR\r
505 ;                       ;UWP OF A SHARABLE SEG(AC=1 ON RETURN)\r
506 ;       OK RETURN - AC CONTAINS PREVIOUS SETTING( OR JOB HAS NO HIGH SEG)\r
507 \r
508 IFN FT2REL,<\r
509         EXTERN USTUWP\r
510 SETUWP: JRST USTUWP             ;GO TO ROUTINE IN SEGCON\r
511                                 ;IF FT2REL=0, SETUWP DOES RTZER\r
512 >\r
513 \r
514 \r
515 ;UUO TO REMAP TOP PART OF LOW SEGMENT INTO HIGH SEGMENT\r
516 ;PREVIOUS HIGH SEG(IF ANY) IS KILLED AND A NEW SEGMENT NUMBER IS ASSIGNED\r
517 ;TO THIS JOB. REMAP IS USED BY LOADER AND GET\r
518 ;CALL:  MOVEI AC,NEW HIGHEST USER ADR IN LOW SEG(EXEC ORS IN 1777)\r
519 ;       CALL AC,[SIXBIT /REMAP/] OR CALLI AC,35\r
520 ;       ERROR RETURN, MACHINE OR EXEC CANNOT HANDLE 2 REG OR DESIRED ADR\r
521 ;                       ;GREATER THAN OLD LOW SEG\r
522 ;       OK RETURN, LOW SEG ABOVE ARG NOW THE HIGH SEG\r
523 \r
524 IFN FT2REL,<\r
525         EXTERN UREMAP\r
526 REMAP:  JRST UREMAP             ;CORE1 MODULE IN SEGCON\r
527 >\r
528 IFE FT2REL,<\r
529 REMAP=CPOPJ                     ;ERROR RETURN TO USER(CPOPJ IS AN EXTERN)\r
530 >\r
531 \r
532 ;ROUTINE TO GET WORD FROM USER AREA AT UUO LEVEL - EITHER SEGMENT\r
533 ;CALL:  MOVE PROG,XWD PROTECTION,RELOCATION FOR LOW SEG\r
534 ;       HRR UUO,USER ADR.\r
535 ;       HRLI UUO,PROG   ;FOR RELOCATION\r
536 ;       PUSHJ PDP,GETWDU\r
537 ;       RETURN ONLY IF ADDRESS OK, WORD IN TAC, ABS. ADR IN TAC1\r
538 \r
539 ;       IF OUT OF BOUNDS, PRINT ILL UUO AND STOP JOB\r
540 \r
541         INTERN GETWDU,GETWD1\r
542         EXTERN JOB\r
543 \r
544 GETWD1: HRRI UUO,1(UUO)         ;INCREMENT UUO BEFORE PICKING UP WORD\r
545 GETWDU: MOVE ITEM,JOB           ;SETUP CURRENT JOB NUMBER\r
546         PUSHJ PDP,GETWRD        ;GET THE WORD AND CHECK IF LEGAL\r
547         JRST UUOERR             ;ADR. NOT IN LOW OR HIGH SEG, PRINT ERROR\r
548 LCPOPJ:\r
549 RMPERR: POPJ PDP,               ;OK RETURN, TAC=WORD, TAC1=ABS. ADR.\r
550 \f;SET LIGHTS ON CONSOLE FROM USER PROGRAM\r
551 \r
552 ;CALL AC,[SIXBIT /DATAO/] OR CALLI AC,-1\r
553 \r
554 ;THIS IS AN EXAMPLE OF A USER DEFINED UUO WITH A NEGATIVE CALLI ARG.\r
555 \r
556 LIGHTS: DATAO PI,TAC            ;SENT USER'S AC TO CONSOLE LIGHTS\r
557         POPJ PDP,               ;RETURN TO HIM\r
558 \r
559 ;RETURN TIME OF DAY IN JIFFIES (60THS,50THS OR MS)\r
560 \r
561 EXTERNAL TIME\r
562 \r
563 TIMER:  SKIPA TAC,TIME          ;FALL INTO STOTAC\r
564 \r
565 ;RETURN DATA SWITCHES\r
566 \r
567 \r
568 SWITCH: DATAI TAC\r
569 \r
570 ;ROUTINE TO STORE TAC IN USER AREA AS SPECIFIED BY UUO\r
571 ;MUST BE CALLED FROM UUO LEVEL WITH PROG SETUP\r
572 ;ALSO PROG IN INDEX FIELD OF UUO\r
573 \r
574 INTERNAL STOTAC\r
575 \r
576 STOTAC: HRRZ AC1,UUO\r
577         PUSHJ PDP,UADCK1        ;IS ADDRESS IN BOUNDS(OR IN ACS)?\r
578         MOVEM TAC,@UUO          ;YES, STORE\r
579         POPJ PDP,\r
580 \r
581 ;RETURN DEVICE CHARACTERISTICS\r
582 \r
583 EXTERNAL JOB,PJOBN\r
584 \r
585 DVCHR:  PUSHJ PDP,DEVSRC        ;SERACH FOR DEVICE\r
586         TDZA TAC,TAC            ;NOT A DEVICE, RETURN ZERO\r
587         SKIPA TAC,DEVMOD(DEVDAT);DEVICE FOUND,RETURN DEVMOD\r
588         JRST STOTAC             ;RETURN ZERO, DEVICE NOT FOUND\r
589         LDB TAC1,PJOBN          ;GET JOB NO.  USING DEVICE\r
590         CAME TAC1,JOB           ;DOES CURRENT USER ALREADY HAVE IT?\r
591         TRNN TAC,ASSCON+ASSPRG  ;NO, IS IT ASSIGNED?\r
592         TLO TAC,DVAVAL          ;NO, BUT HE CAN GET IT.\r
593         JRST STOTAC\r
594 \r
595 ;RETURN PROJECT-PROGRAMMER NUMBER IN AC\r
596 \r
597 GETPPN:\r
598 INTERNAL FTLOGIN\r
599 IFN FTLOGIN,<\r
600         EXTERNAL PRJPRG\r
601         MOVSI TAC,JACCT\r
602         TDNE TAC,JBTSTS(ITEM)   ;LOGIN OR LOGOUT CUSP RUNNING ?\r
603         JRST GETPPL             ;YES, SPECIAL PROJ,PROG NUMBER CHANGE.\r
604         SKIPA TAC,PRJPRG(ITEM)  ;NO, RETURN PROJECT-PROGRAMMER NO. OF THIS JOB.\r
605 >\r
606 \r
607 INTERN RTZER\r
608 \r
609 IFE FT2REL, <\r
610 SETUWP:                         ;SETUWP RETURNS 0\r
611 >\r
612 \r
613 RTZER:  MOVEI TAC,0             ;RETURN 0. TO USER AC\r
614         JRST STOTAC             ;AS SPECIFIED IN AC FIELD OF HIS UUO\r
615 \fEXTERNAL USRDDT\r
616 \r
617 SETDDT: MOVEM TAC,USRDDT\r
618         POPJ PDP,               ;RETURN TO USER\r
619 \r
620 ;WAIT FOR IO TO BECOME INACTIVE ON CHANNEL AC\r
621 \r
622 \r
623 WAIT:   JUMPE DEVDAT,CPOPJ      ;CHANNEL ASSIGNED?\r
624         JRST WAIT1              ;WAIT TILL INACTIVE BEFORE\r
625                                 ; RETURNING TO USER.\r
626 \r
627 \r
628 IFN     FTLOGIN, <\r
629 EXTERNAL        DUMPPP,MJOBN\r
630 GETPPL: MOVE    TAC,DUMPPP      ;CHANGE USER'S NUMBERS TO [1,2]\r
631         EXCH    TAC,PRJPRG(ITEM)        ; AND GET OLD NUMBERS.\r
632         MOVSI   TAC1,MJOBN      ;CHECK FOR OTHER USERS UNDER SAME PP NUMBER.\r
633         CAMN    TAC,PRJPRG(TAC1)        ;ANOTHER USER UNDER SAME PROJ,PROG NUMBER ?\r
634         AOSA    (PDP)           ;YES, SKIP RETURN TO USER (LOGIN OR LOGOUT)\r
635         AOBJN   TAC1,.-2        ;NO, KEEP LOOKING\r
636         JRST    STOTAC\r
637 >\r
638 \r
639 GETLN:  PUSHJ   PDP,TTYFND      ;FIND USER'S TTY DATA BLOCK.\r
640         MOVE    TAC,DEVNAM(DEVDAT)      ;GET DEVICE NAME IN SIXBIT\r
641         JRST    STOTAC          ;RETURN IT TO USER.\r
642 \f;LOGIN UUO USED ONLY BY LOGIN CUSP\r
643 ;CALL:  CALL AC,[SIXBIT /LOGIN/]\r
644 ;WHERE AC CONTAINS XWD -NO. OF ENTRIES,LOCATION\r
645 ;WHICH IS A LIST OF JOB STATISTICS TO BE STORED IN MONITOR\r
646 \r
647 INTERNAL FTLOGIN\r
648 \r
649 IFN FTLOGIN,<\r
650 EXTERNAL JOB,JBTSTS,TTYFUW\r
651 \r
652 LOGIN:  MOVSI TAC1,JLOG         ;IS USER ALREADY LOGGED IN?\r
653         TDNE TAC1,JBTSTS(ITEM)\r
654         JRST UUOERR             ;YES, PRINT ILLEGAL UUO\r
655         HLRE AC1,TAC            ;NO, -NO. OF WORDS\r
656         HRR UUO,TAC             ;FIRST REL. LOC.\r
657         MOVE AC2,[XWD -LOGTOP,LOGTAB]   ;SET FOR LOOP\r
658 LOGIN1: AOSG AC1                ;FINISHED HIS COUNT?\r
659         SKIPA AC3,@UUO          ;NO, GET NEXT WORD FROM USER AREA\r
660         MOVEI AC3,0             ;YES, STORE 0\r
661         MOVEM AC3,@(AC2)        ;NO, STORE ITEM\r
662         ADDI UUO,1              ;GET NEXT ITEM\r
663         AOBJN AC2,LOGIN1        ;FINISHED NO. OF MONITOR TABLES?\r
664         IORM TAC1,JBTSTS(ITEM)  ;YES, FINALLY SET LOGIN BIT\r
665         MOVSI   TAC1,JACCT      ;RESET THIS BIT TO INDICATE LOG-IN IS\r
666         ANDCAM  TAC1,JBTSTS(ITEM)       ; NOW COMPLETE AND ^C IS AGAIN PERMITTED.\r
667 LOGIN2: PUSHJ PDP,IORELS        ;RELEASE ALL DEVICES\r
668         PUSHJ PDP,TTYFUW        ;FIND TTY AND PRINT ^C\r
669         JRST HOLD\r
670 \r
671 ;TABLE OF POINTERS TO TABLES(STORED WITH JOB NUMBER AS INDEX)\r
672 ;TO MAKE LOGIN SET MORE TABLES IN MONITOR, JUST ADD TABLE NAMES AT END\r
673 \r
674 EXTERNAL PRJPRG\r
675 \r
676 \r
677 LOGTAB: XWD ITEM,PRJPRG         ;PROJECT-PROGRAMMER NUMBER\r
678 IFN FTPRV,<\r
679         EXTERN JBTPRV\r
680         XWD ITEM,JBTPRV         ;JOB PRIVILEGE BITS\r
681 >\r
682 IFE FTPRV,<\r
683         EXP IOS                 ;STORE IN AC IOS, SINCE PRIVILEGE TABLE DOES NOT EXIST\r
684 >\r
685 \r
686 LOGTOP=.-LOGTAB ;NO. OF TABLES TO BE SET\r
687 >\r
688 \f\r
689 ;LOGOUT UUO\r
690 \r
691 INTERNAL FTLOGIN\r
692 EXTERNAL TTYTCM\r
693 \r
694 IFN FTLOGIN,<\r
695 LOGOUT: PUSHJ   PDP,TTYFUW\r
696         MOVSI   TAC,JLOG\r
697         TDNN    TAC,JBTSTS(ITEM)        ;IS JOB ALREADY LOGGED OUT ?\r
698         JRST    JOBKL           ;NO, GO COMPLETE WORK OF LOGOUT CUSP.\r
699         JRST    EXIT    ;YES, TREAT AS "EXIT"\r
700 >\r
701 \r
702 IFE FTLOGIN,<\r
703 \r
704 LOGIN=UUOERR    ;CANT DO A LOGIN UUO\r
705 LOGOUT=EXIT     ;TREAT A KJOB UUO AS AN EXIT IN 10/40\r
706 >\r
707 \f;GETTAB UUO\r
708 ;UUO TO RETURN CONTENTS OF A MONITOR JOB TABLE ENTRY\r
709 ;CALL:  HRROI AC, MONITOR JOB TABLE NUMBER\r
710 ;       HRLI AC, JOB NUMBER (OPTIONAL) LH .LT. 0 MEANS CURRENT JOB\r
711 ;       CALL AC, [SIXBIT /GETTAB/] OR CALLI AC,41\r
712 ;       ERROR RETURN AC PRESERVED IF LH OR RH TOO BIG OR\r
713                                 ; AC=-1 IF NOT PRIVILIGED TO GET INFO\r
714 ;       NORMAL RETURN - AC=0 IF TABLE IS UNDEFINED\r
715 IFN FTGETTAB,<\r
716         EXTERN JOB,JOBMAX,TTYTAB,TTPMXL,JOBMXL,JBTMXL\r
717 \r
718 GETTAB: HLRZ ITEM,TAC           ;GET USER SUPPLIED JOB NUMBER\r
719         SKIPGE TAC              ;DID HE SUPPLY ONE?\r
720         MOVE ITEM, JOB          ;NO, USE CURRENT JOB NUMBER\r
721         HRRZS TAC               ;GET TABLE NUMBER IN TAC\r
722         CAIL TAC,GTTBLN         ;IS TABLE NUMBER LEGAL?\r
723         POPJ PDP,               ;YES. ERROR RETURN, AC UNCHANGED\r
724         LDB TAC1,[POINT 9,NUMTAB(TAC),8]        ;MAX LEGAL ARG.\r
725         CAMLE ITEM,TAC1         ;DOES HIS ARG EXCEED LEGAL ONE?\r
726         POPJ PDP,0              ;YES. ERROR RETURN\r
727         MOVE TAC,@NUMTAB(TAC)   ;GET CONTENTS OF MONITOR TABLE\r
728         AOS (PDP)               ;OK (SKIP) RETURN TO USER\r
729         JRST STOTAC             ;RETURN TAC IN HIS AC\r
730 \r
731 ;THE MONITOR JOB TABLE NUMBERS:\r
732         EXTERN JBTSTS,JBTADR,JBTPRG,NSWTBL,CNFTBL,NSWMXL,CNFMXL\r
733 NUMTAB: XWD ITEM+JBTMXL,JBTSTS  ;0 - JOB STATUS BITS\r
734         XWD ITEM+JBTMXL,JBTADR  ;1 - JOB SIZE -1 AND ABS.LOC\r
735 IFN FTLOGIN,<\r
736         EXTERN PRJPRG\r
737         XWD ITEM+JBTMXL,PRJPRG  ;2 - PROJECT,PROGRAMMER NUMBER\r
738 >\r
739 IFE FTLOGIN,<\r
740         XWD JBTMXL,[0]  ;2 - NOT DEFINED\r
741 >\r
742         XWD ITEM+JBTMXL,JBTPRG  ;3 - PROGRAM BEING RUN\r
743 IFN FTTIME,<\r
744 \r
745         EXTERN TTIME\r
746 \r
747         XWD ITEM+JOBMXL,TTIME   ;4 - TOTAL RUN TIME IN JIFFIES\r
748 >\r
749 IFE FTTIME,<\r
750         XWD JOBMXL,[0]  ;4 - NOT DEFINED TABLE - RETURN 0\r
751 >\r
752 IFN FTKCT,<\r
753         EXTERN JBTKCT\r
754         XWD ITEM+JOBMXL,JBTKCT  ;5 - KILO-CORE TICKS(JIFFIES*SIZE IN K)\r
755 >\r
756 IFE FTKCT,<\r
757         XWD JOBMXL,[0]  ;5  NOT DEFINED TABLE - RETURN 0\r
758 >\r
759 \fIFN FTPRV,<\r
760         EXTERN JBTPRV\r
761         XWD ITEM+JOBMXL,JBTPRV  ;6 - PRIVILEGE BITS SET BY LOGIN\r
762 >\r
763 IFE FTPRV,<\r
764         XWD JOBMXL,[0]          ;6 - NOT DEFINED TABLE - RETURN 0\r
765 >\r
766 IFN FTSWAP,<\r
767         EXTERN JBTSWP,SWPTBL,SWPMXL\r
768         XWD ITEM+JBTMXL,JBTSWP  ;7 - LOC ON DISK, SIZE ON DISK, IN CORE PROTECT TIME\r
769 >\r
770 IFE FTSWAP,<\r
771         XWD JOBMXL,[0]          ;7 - NOT DEFINED TABLE - RETURN 0\r
772 >\r
773         XWD ITEM+TTPMXL,TTYTAB  ;10 - TTY TRANSLATOR TABLE\r
774         XWD ITEM+CNFMXL,CNFTBL  ;11 - CONFIGURATION DATA\r
775         XWD ITEM+NSWMXL,NSWTBL  ;12 - NON-SWAPPING DATA\r
776 IFN FTSWAP,<\r
777         XWD ITEM+SWPMXL,SWPTBL  ;13 - SWAPPER DATA\r
778 >\r
779 IFE FTSWAP,<\r
780         EXP [0]         ;13 - UNDEFINED\r
781                                 ;ALL CALL ARE ERROR RETURNS SINCE TABLE\r
782                                 ; HAS NO ENTRIES\r
783 >\r
784 IFN FT2REL,<\r
785 \r
786 EXTERN JBTSGN,ITMSGN\r
787 \r
788         XWD ITMSGN,JBTSGN       ;14 - HIGH SEG NO. THIS JOB IS USING\r
789                                 ;LH=ITEM+JOBMXL IF REENTRANT SOFTWARE\r
790                                 ;LH=0+JOBMXL, SO ALL ENTRIES RETURN 0\r
791                                 ; IF NON-REENTRANT SOFTWARE\r
792 >\r
793 IFE FT2REL,<\r
794         XWD JOBMXL,[0]          ;14 - UNDEFINED\r
795 >\r
796 IFN FTDISK,<\r
797         EXTERN ODPMXL,ODPTBL\r
798         XWD ITEM+ODPMXL,ODPTBL  ;15 - ONCE ONLY DISK PARAMETERS\r
799 >\r
800 IFE FTDISK,<\r
801         EXP [0]                 ;50 - UNDEFINED\r
802 >\r
803 GTTBLN=.-NUMTAB                 ;LENGTH OF TABLE\r
804 >\r
805 \r
806 IFE FTGETTAB,<GETTAB=UUOERR>\r
807 \r
808 ;UUO TO SET CURRENT PROGRAM NAME\r
809 ;       MOVE AC,[SIXBIT /NAME/]\r
810 ;       ALWAYS RETURN\r
811 \r
812         EXTERN JBTPRG\r
813 \r
814 SETNAM: MOVEM TAC,JBTPRG(ITEM)  ;STORE PROGRAM NAME FOR SYSTAT AND SYSDPY\r
815         POPJ PDP,\r
816 \r
817 \f\f\r
818 ;UUO TO SET JOB TO USE IO IN USER MODE\r
819 ;AND TO SET PI INTERRUPT LOCATION IN LOWER CORE(WORKS ONLY ON PDP-10'S -SEE NEXT PAGE)\r
820 ;CALL:  CALL AC,[SIXBIT /TRPSET/]\r
821 ;       ERROR RETURN, USER NOT ALLOWED TO DO IO IN USER MODE\r
822 ;       OK RETURN\r
823 \r
824 ;WHERE RH(AC)=REL ADR. OF 1 INSTRUCTION TO BE MOVED INTO\r
825 ;THE MONITOR PI TRAP LOCATION(40-57) AS SPECIFIED BY LH(AC)\r
826 ;RELOCATION OF JOB IS ADDED TO RH OF INSTRUCTION AS IT IS MOVED.\r
827 ;ALSO THE RELOCATION IS ADDED TO THE RH OF WORD IN USER AREA SPECIFIED BY\r
828 ;RH OF USER INSTRUCTION IN CASE IT IS A BLKO/BLKI POINTER\r
829 ;THE USER MUST RESET EVERY TRPSET CALL IF BLKI/BLKO POINTER \r
830 ;AND SHOULD SET RH TO 0 IF JSR PC WORD\r
831 ;THE APR IS ALSO SET SO USER MAY DO IO IN USER MODE\r
832 ;TO SET USER MODE IO WITHOUT SETTING LOWER CORE, C(AC)=0\r
833 ;STOP TIME SHARING ONLY IF AC IS NON-ZERO(IE RUN ONLY JOB 1)\r
834 \r
835 INTERNAL FTTRPSET\r
836 \r
837 TRPSET:\r
838 IFN FTTRPSET,<\r
839 EXTERNAL JOBPD1,STOPTS\r
840 \r
841         CAIE ITEM,1             ;IS THIS JOB 1?\r
842         POPJ PDP,               ;NO, ERROR RETURN\r
843         SETZM STOPTS            ;CLEAR THE STOP TIME SHARING FLAG\r
844         JUMPE TAC,TRPST1        ;IS AC 0?(DO NOT SET PI LOC IF YES)\r
845         HLRZ TAC1,TAC           ;NO, SET LOWER CORE\r
846         CAIL TAC1,40            ;IS IT LEGAL LOWER CORE ADR.?\r
847         CAIL TAC1,60\r
848         POPJ PDP,               ;NO, ERROR RETURN\r
849         SETOM STOPTS            ;SET STOP TIME SHARING FLAG, SO NO OTHER JOBS\r
850                                 ; JOBS WILL RUN AND NO CORE SHUFFLING\r
851         HRLI TAC,PROG           ;YES, SET TO RELOCATE\r
852         MOVE TAC,@TAC           ;GET THE INSTR.\r
853         ADDI TAC,(PROG)         ;ADD RELOCATION SO WILL POINTER TO USER AREA\r
854         HRRZ    DAT,PROG        ;USER RELOCATION\r
855         ADDM    DAT,(TAC)               ;ALSO ADD RELOCATION TO WORD POINTED TO BY INSTR\r
856                                 ; IN CASE IT IS A BLKI/BLKO POINTER WORD\r
857                                 ; USER SHOULD RESET RH OF POINTER IF BLKI/BLKO INSTR\r
858                                 ; OR CLEAR PC LOC IF JSR INSTR\r
859         EXCH TAC,(TAC1)         ;AND STORE IN MONITOR TRAP LOC.\r
860 TRPST1: AOS (PDP)               ;OK RETURN\r
861         MOVSI TAC1,4000         ;SET USER IO PC FLAG\r
862         IORM TAC1,JOBPD1(JDAT)  ;IN UUO RETURN PC\r
863 >\r
864         JRST STOTAC             ;RETURN PREVIOUS CONTENTS OF PI LOC.\r
865 \f\r
866 ;ROUTINE TO DISMISS INTERRUPT  FOR JOB DOING USER IO\r
867 ;WHEN PC IS IN EXEC MODE\r
868 ;NOTE  THE TRPJEN UUO HAS BEEN ELIMINATED\r
869 ;BECAUSE UUO HANDLER CANNOT BE INTERRUPTED AND REENTERED\r
870 ;INSTEAD INTERRUPTS IN USER MODE ARE DISMISSED\r
871 ;BY USING OP CODE 100 (UJEN) WHICH\r
872 ;TRAPS TO EXEC 61 INSTEAD OF 41 ON PDP-10'S\r
873 ;UJEN IS A NO-OP ON PDP-6'S AND SO THIS FACILTY IS GOOD ON PDP-10'S ONLY\r
874 ;CALL:  RESTORE ALL EXEC ACS\r
875 ;               UJEN ADR        ;UJEN=100\r
876 ;               WHERE ADR CONTAINS PC STORED BY INTERRUPT JSR\r
877 ;               SEE UUO HANDLER (UUO2) FOR CODE\r
878 \f;FOR PURPOSES OF COMMENTING THIS SUBROUTINE THE\r
879 ;TERM 'BUFFER HEADER' SHALL REFER TO THE 3 WORD HEADER\r
880 ;WHICH IS USED BY THE USER PROGRAM AND THIS EXEC FOR\r
881 ;REFERING TO THE RING BUFFERS.\r
882 \r
883 ;THE CONTENTS OF THE 3 WORD HEADER (AS SET BY THE MONITOR\r
884 ;               ON EACH INPUT AND OUTPUT UUO).\r
885 ;               BIT 18-35=ADDRESS OF SECOND WORD OF THE\r
886 ;               CURRENT BUFFER IN RING WHICH USER IS REFERENCING\r
887 ;       WORD 2: BYTE POINTER TO CURRENT ITEM.\r
888 ;       WORD 3: POSITIVE ITEM COUNT (NO. OF ITEMS LEFT ON\r
889 ;               INPUT, NO. OF FREE ITEMS TO GO ON OUTPUT).\r
890 \r
891 ;EACH BUFFER IN THE RING HAS FOLLOWING FORMAT (AS THE USER SEES IT)\r
892 \r
893 ;       WORD 1: RESERVED FOR BLOCK NUMBER FOR FIXED ADDRESS DEVICES\r
894 ;       WORD 2: BIT 0=USE BIT FOR THIS BUFFER\r
895 ;               BIT 1-17=NO. OF WORDS WHICH FOLLOW (LENGTH OF BUFFER)/\r
896 ;               BIT 18-35=ADDRESS OF SECOND WORD OF NEXT BUFFER IN RING\r
897 ;       WORD 3: LH=LINK TO NEXT BLOCK (SET BY MONITOR FOR DECTAPE)\r
898 ;               RH=NO. OF WORDS OF DATA WHICH FOLLOW (USUALLY\r
899 ;               SET BY EXEC EXCEPT IF THE USER HAS SPECIFIED\r
900 ;               THAT HE WANTS TO COMPUTE WORD COUNT\r
901 ;               HIMSELF INSTEAD OF HAVING THE MONITOR DO IT\r
902 ;               USING THE BYTE POINTER IN THE 3 WORD HEADER).\r
903 \r
904 \r
905 \r
906 \r
907 \r
908 ,CALLING SEQUENCE\r
909 ,       CLOSE D,\r
910 ,       EXIT            ALWAYS RETURNS HERE\r
911 , THIS ROUTINES PROCESSES THE CLOSE UUO AND DETERMINES WHETHER THE\r
912 ,OUTPUT ROUTINE SHOULD BE CALLED IF OUTPUT WERE ACTIVE, CLEARS\r
913 ,THE INPUT BUFFER AREA IF INPUT WERE ACTIVE, AND CLEARS THE \r
914 ,ITEM COUNTS OF BOTH INPUT AND OUTPUT HEADERS SERVING TO BOTH\r
915 ,TERMINATE THE USE OF THE DEVICE AND SET THE I/O ROUTINES TO\r
916 ,ACCEPT ANOTHER INPUT OR OUTPUT COMMAND IN A CLEAR STATE.\r
917 ,IN THE CASE OF OUTPUT DEVICES, THE CLOSE ROUTINE OF THE DEVICE HANDL-\r
918 ,ING ROUTINE IS CALLED IN CASE ANY SPECIAL HANDLING IS REQUIRED.\r
919 \fINTERNAL CLOSE1\r
920 EXTERNAL PIOMOD\r
921 \r
922 CLOSE1: PUSHJ PDP,WAIT1         ;WAIT UNTIL DEVICE IS INACTIVE\r
923         TRNN UUO,CLSIN          ;SUPPRESS INPUT CLOSE?\r
924         TLOE DEVDAT,ICLOSB      ;NO. INPUT ALREADY BEEN CLOSED?\r
925         JRST UCLS2              ;YES\r
926         LDB TAC,PIOMOD          ;NO\r
927         CAIGE TAC,SD            ;DUMP MODE?\r
928         JRST UCLSBI             ;NO. CLOSE BUFFERED INPUT.\r
929 UCLS5:  PUSHJ PDP,DCLI(DSER)    ;YES. DISPATCH TO DEVICE DEP. ROUTINE\r
930         JRST UCLS2              ;MUST NOT DESTROY UUO,DEVDAT,DSER,UCHN\r
931 UCLSBI: MOVE    TAC,DEVMOD(DEVDAT)\r
932         TLNE DEVDAT,INBFB+INPB  ;WAS AN INPUT BUFFER SETUP?\r
933         JRST UCLS4              ;YES\r
934         TLNE    TAC,DVDSK       ;CLOSING A DISK FILE ?\r
935         JRST    UCLS5           ;YES, DO DEVICE DEPENDENT CLOSE ANYWAY.\r
936         JRST    UCLS2           ;NO, CLOSE NOT NECESSARY.\r
937 UCLS4:  TLNE TAC,DVLNG          ;IS THIS A LONG DISPATCH TABLE?\r
938         PUSHJ PDP,DCLI(DSER)    ;YES, CLOSE INPUT\r
939         HRRZ TAC1,DEVBUF(DEVDAT)\r
940         HRLI TAC1,PROG\r
941         HRRZ DAT,@TAC1          ;FIRST WORD OF 3 WORD BUFFER HEADER\r
942         HRR TAC1,@TAC1          ;REMEMBER CURRENT BUFFER IN TAC1\r
943         HRLZI TAC,IOUSE         ;USED BOTH FOR HEADER AND EACH BUFFER\r
944         JUMPE DAT,UCLS1         ;HAS A RING BEEN SETUP?(NO IF 0)\r
945         HRLI DAT,PROG           ;YES\r
946         MOVEI AC1,(DAT)         ;IS ADDRESS SPECIFIED BY CONTENTS OF\r
947         PUSHJ PDP,UADRCK        ;FIRST WORD OF 3 WORD BUFFER HEADER IN BOUNDS?\r
948         SETZM AC1\r
949 UCLS0:  HRR DAT,@DAT            ;ADVANCE CURRENT INPUT BUFFER ADDRESS\r
950         CAIN AC1,(DAT)          ;IS THIS THE SAME BUFFER AS LAST ONE?\r
951         JRST UCLS1              ;YES. BAD RING. LOOPING ON ITSELF.\r
952         MOVEI AC1,(DAT)         ;IS ADDRESS OK?\r
953         PUSHJ PDP,UADRCK\r
954         ANDCAM TAC,@DAT         ;YES, CLEAR USE BIT.\r
955         CAME TAC1,DAT           ;DONE?\r
956         JRST UCLS0\r
957 \fEXTERNAL USRJDA\r
958 \r
959 UCLS1:  HRLI DAT,PROG\r
960         HRR DAT,DEVBUF(DEVDAT)\r
961         IORM TAC,@DAT           ;FLAG AS VIRGIN BUFFER IN 3 WORD HEADER\r
962         ADDI DAT,2              ;JBFCTR:=0\r
963         SETZM @DAT              ;CLEAR INPUT ITEM COUNT.\r
964         MOVE IOS,[XWD IOEND,IODEND]\r
965         ANDCAB IOS,DEVIOS(DEVDAT)\r
966 UCLS2:  TRNN UUO,CLSOUT         ;SUPPRESS OUTPUT CLOSE?\r
967         TLOE DEVDAT,OCLOSB      ;NO. OUTPUT ALREADY CLOSED?\r
968         JRST UCLS3              ;YES\r
969         IFN FT2REL,<\r
970         EXTERN RELSEG\r
971         PUSH PDP,UCHN\r
972         PUSHJ PDP,RELSEG        ;CLEAR SHARED SEG NAME IF FILE JUST CLOSED HAS\r
973                                 ; EXTENSION .SHR AND SEG HAS SAME DIRECTORY AND NAME\r
974         POP PDP,UCHN\r
975 >\r
976         LDB TAC,PIOMOD          ;NO.\r
977         CAIGE TAC,SD            ;DUMP MODE?\r
978         JRST UCLSBO             ;NO. CLOSE BUFFERED OUTPUT\r
979 UCLS7:  PUSHJ PDP,DCL(DSER)     ;YES. DISPATCH TO DEVICE DEP. ROUTINE\r
980         JRST UCLS3\r
981 UCLSBO: TLNN DEVDAT,OUTBFB+OUTPB        ;WAS AN OUTPUT BUFFER SET UP?\r
982         JRST UCLS6              ;NO\r
983         HLR DAT, DEVBUF(DEVDAT) ;VIRGIN OUBPUT BUFFER?\r
984         HRLI DAT, PROG\r
985         SKIPG @DAT\r
986         JRST UCLS6              ;YES, DO NOT CLOSE UNLESS IT IS A DISK FILE\r
987 UCLS2A: MOVE    DSER,DEVSER(DEVDAT)\r
988         SKIPL @DEVOAD(DEVDAT)   ;NO, HAS SERVICE ROUTINE WRITTEN\r
989                                 ; ITS NEXT BUFFER YET?\r
990         JRST UCLS2B             ;YES\r
991         TRZ     IOS,760000      ;NO,CLEAR ERROR BITS AND START OUTPUT DEVICE\r
992         PUSH PDP,UUO\r
993         PUSHJ   PDP,DOU(DSER)   ;CALL SERVICE ROUTINE TO DO OUTPUT\r
994         POP PDP,UUO\r
995         PUSHJ   PDP,WAIT1       ;WAIT TILL MOST BUFFERS FILLED\r
996         TRNN    IOS,760000      ;ERROR?\r
997         JRST UCLS2A             ;NO,RETURN WHEN ALL EMPTIED\r
998                                 ; OR SHUFFLING REQUIRED STOPS DEVICE\r
999 \f\r
1000 UCLS2B: MOVE DSER,DEVSER(DEVDAT)\r
1001         PUSHJ PDP,DCL(DSER)     ;CLOSE OUTPUT BUFFER\r
1002         HLR DAT,DEVBUF(DEVDAT)\r
1003         HRLI DAT,PROG\r
1004         HRLZI TAC,IOUSE\r
1005         IORM TAC,@DAT\r
1006         ADDI DAT,2\r
1007         SETZM @DAT              ;JBFCTR:=0\r
1008         PUSHJ PDP,WAIT1\r
1009         TLO DEVDAT,OCLOSB       ;SET OCLOSB AFTER OUTPUT IS COMPLETE\r
1010 UCLS3:  HLLM DEVDAT,USRJDA(UCHN)\r
1011         POPJ PDP,               ;EXIT THIS UUO\r
1012 \r
1013 UCLS6:  MOVSI   TAC,DVDSK\r
1014         TDNE    TAC,DEVMOD(DEVDAT)      ;CLOSING A DISK FILE ?\r
1015         JRST    UCLS7           ;YES, DO DISK CLOSE ROUTINE IN ANY EVENT\r
1016         JRST    UCLS3\r
1017 \f,CALLING SEQUENCE\r
1018 ,       INBUF D,N\r
1019 ,       EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED\r
1020 ,CALLING SEQUENCE\r
1021 ,       OUTBUF D,N\r
1022 ,       EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED\r
1023 , SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM FOR DEVICE\r
1024 , D AND INITIALIZES THE JOB BUFFER AREA HEADER:\r
1025 ,       JBFADR0:=1,     JBFADR 1-17:=0\r
1026 ,       JBFADR 18-35:=ADDRESS OF FIRST BUFFER IN RING\r
1027 ,INPUT SETS DEVIAD:=ADDRESS OF FIRST BUFFER IN RING\r
1028 ,OUTPUT SET DEVOAD:=ADDRESS OF FIRST BUFFER IN RING\r
1029 ,BUFPNT IS RESTORED.\r
1030 \f       INTERNAL UINBF, UOUTBF\r
1031         EXTERNAL PUUOAC,USRJDA\r
1032 \r
1033 \r
1034 UOUTBF: TLO DEVDAT,OUTBFB       ;FLAG OUTBUF UUO DONE\r
1035         PUSH PDP,BUFPNT         ;SAVE BUFPNT ON STACK\r
1036         PUSHJ PDP,BUFCLC        ;SET UP BUFFER RING\r
1037         HLR TAC,DEVBUF(DEVDAT)  ;TAC:=OUTPUT BUFFER AREA HEADER ADDRESS\r
1038         HRRM BUFPNT,DEVOAD(DEVDAT)      ;DEVOAD:=ADDRESS OF FIRST BUFFER\r
1039                                 ; IN RING\r
1040 UOBF1:  HRLI TAC,PROG           ;RELOCATE BUFFER AREA HEADER ADDRESS\r
1041         MOVEM BUFPNT,@TAC       ;JBFADR:=IOUSE,ADDRESS OF FIRST BUFFER\r
1042                                 ; IN RING\r
1043         LDB TAC,PUUOAC\r
1044         MOVEM DEVDAT,USRJDA(TAC)\r
1045         POP PDP,BUFPNT          ;RESTORE BUFPNT FROM STACK\r
1046         POPJ PDP,               ;EXIT THIS UUO\r
1047 UINBF:  TLO DEVDAT,INBFB        ;FLAG INBUF UUO DONE\r
1048         PUSH PDP,BUFPNT         ;SAVE BUFPNT ON STACK\r
1049         PUSHJ PDP,BUFCLC        ;SET UP BUFFER RING\r
1050         HRRM BUFPNT,DEVIAD(DEVDAT)      ;DEVIAD:=ADDRESS OF FIRST BUFFER\r
1051                                 ; IN RING\r
1052         HRR TAC,DEVBUF(DEVDAT)  ;TAC:=INPUT BUFFER AREA HEADER ADDRESS\r
1053         JRST UOBF1\r
1054 \f;OPEN UUO - PERFORMS SAME OPERATION AS INIT\r
1055 ;MAY BE USED EASILY BY REENTRANT PROGRAMS\r
1056 ;CALLING SEQUENCE FROM USER AREA\r
1057 ;       OPEN D,ADR\r
1058 ;       ERROR RETURN\r
1059 ;       DEVICE INITED\r
1060 \r
1061 ;LH(ADR)=0,RH(ADR)=DATA MODE THIS INIT\r
1062 ;LH(ADR+1)=OUTPUT BUFFER HEADER ADDRESS\r
1063 ;RH(ADR+1)=INPUT BUFFER HEADER ADDRESS\r
1064 ;C(ADR+2,...,ADR+5)=SAME AS LOOKUP OR ENTER\r
1065 \r
1066 INTERNAL UOPEN\r
1067 \r
1068 UOPEN:  PUSHJ PDP,GETWDU        ;SET TAC TO CONTENTS OF FIRST ARG(IO STATUS BITS)\r
1069         AOJA UUO,UINIT0         ;MAKE UUO POINT TO ARG+1(WITH PROG STILL\r
1070                                 ; IN INDEX FIELD)\r
1071 \r
1072 \r
1073 ,CALLING SEQUENCE\r
1074 ,       INIT D,MODUS    D=JOB DEVICE CHANNEL\r
1075 ,                       MODUS=IORDEL,IOCON,IOWC,MODE.\r
1076 ,       SIXBIT/NAME/    DEVICE NAME\r
1077 ,       XWD OBUF,IBUF   BUFFER AREA HEADER ADDRESSES\r
1078 ,       EXIT1           DEVICE NOT AVAILABLE\r
1079 ,       EXIT2           DEVICE PROPERLY ASSIGNED\r
1080 ,THE LEFT HALF OF NAME CONTAINS THE THREE LETTER DEVICE MNEMONIC,\r
1081 ,   THE RIGHT HALF IS EITHER ZERO (SYSTEM WILL ASSIGN AN ARBITRARY\r
1082 ,   UNIT) OR NON-ZERO TO REQUEST A SPECIFIC UNIT (LEFT JUSTIFIED).\r
1083 ,IF THE SELECTED DEVICE IS NOT AVAILABLE, CONTROL RETURNS TO EXIT1.\r
1084 ,OTHERWISE, THE DEVICE IS ASSIGNED TO THE USER AND ATTACHED TO HIS\r
1085 ,CHANNEL D.  THE DEVICE IS INITIALIZED IN THE FOLLOWING MANNER AFTER\r
1086 ,IOACT IS ZERO:\r
1087 ,       IOBEG:=1\r
1088 ,       DATA MODE:=BITS 32-35 OF AC UUO\r
1089 ,       IOCON:=BIT 31 OF AC UUO\r
1090 ,       IOWC:=BIT 30 OF AC UUO\r
1091 ,       IORDEL:=BIT 29 OF AC UUO\r
1092 ,       IOACT:=IODEND:=IOBKTL:=IODTER:=IODERR:=IOIMPM:=0\r
1093 ,       JBFADR:=JBFCTR:=0 FOR THE SPECIFIED BUFFERS.\r
1094 ,       DEVBUF:=OBUF,IBUF\r
1095 \fINTERNAL UINIT\r
1096 EXTERNAL STREQ,STUSER\r
1097 EXTERNAL USRJDA,USRHCU,SYSTAP,TPOPJ,TPOPJ1,IADPTR\r
1098 \r
1099 UINIT:  MOVE TAC,UUO            ;SAVE FIRST ARG(IO STATUS BITS) IN TAC\r
1100         HRR UUO,-1(PDP)         ;SET UUO TO ADR+1 OF USER ARGS\r
1101         AOS -1(PDP)             ;SET RETURN SKIP THE 2 ARGUMENTS\r
1102         AOS -1(PDP)\r
1103 UINIT0: PUSH PDP,UUO            ;HERE ON OPEN UUO, SAVE ADR+1 OF USER ARGS\r
1104         PUSH PDP,TAC            ;SAVE IO STATUS BITS(FIRST ARG)\r
1105         SKIPE DEVDAT,USRJDA(UCHN)       ;IS A DEVICE ALREADY ASSIGNED TO THIS CHAN?\r
1106         CAMLE UCHN,USRHCU       ;YES, IS THIS CHAN. LESS OR EQUAL TO HIGHEST\r
1107                                 ; CHAN. FOR THIS USER?\r
1108         JRST UINITA             ;NO, NO PREVIOUS DEVICE TO RELEASE\r
1109         PUSHJ PDP,RELEA0        ;RELEASE PREVIOUS DEVICE ON THIS CHAN.\r
1110 UINITA: MOVE UUO,-1(PDP)        ;RESTORE UUO (ADR+1 OF 3 ARGS)\r
1111         PUSHJ PDP,GETWDU        ;C(TAC)=DEVICE NAME IF IN BOUNDS\r
1112                                 ; DO NOT RETURN IF OUT OF BOUNDS(PRINT ERR AND STOP)\r
1113                                 ; SET ITEM TO CURRENT JOB NUMBER\r
1114         PUSHJ PDP,DEVSRC        ;SEARCH FOR DEVICE NAME\r
1115                                 ; (SET SYSDEV BIT IN LH OF\r
1116                                 ; DEVDAT IF THIS IS SYSTEM TAPE)\r
1117         JRST UINITE             ;NO SUCH DEVICE\r
1118         MOVE UUO,(PDP)          ;RESTORE USER'S MODE SETTING\r
1119         PUSHJ   PDP,CHKMOD      ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN\r
1120         MOVE TAC,DEVNAM(DEVDAT) ;PHYSICAL DEVICE NAME\r
1121         CAME TAC,[SIXBIT /DSK/] ;NOT DISK?\r
1122         CAME TAC,SYSTAP         ;SYSTEM TAPE DEVICE?\r
1123         JRST UINIT1             ;NO, DISK OR NOT SYSTEM TAPE\r
1124         AOSE STREQ              ;SYSTEM TAPE, INCREMENT REQUEST COUNT\r
1125         PUSHJ PDP,STWAIT        ;SYSTEM TAPE BUSY, PUT JOB IN WAIT\r
1126         MOVEM ITEM,STUSER       ;SET THIS JOB AS ONLY USER OF SYSTEM TAPE\r
1127                                 ; CONTROL C DOES NOT STOP JOB WHILE USING S. T.\r
1128 UINIT1: MOVE TEM,DEVMOD(DEVDAT) ;DEVICE CHARACTERISTICS\r
1129         TLNN TEM,DVDTA          ;IS THIS DEVICE A DECTAPE?\r
1130         JRST UINITB             ;NO\r
1131         LDB TAC1,IADPTR         ;YES, GE NO OF USER CHANS DEV INITED ON\r
1132         HRR TEM,TAC1            ;SAVE OLD NUMBER\r
1133         AOS TAC1                ;INCREASE CHANNEL COUNT\r
1134         CAIL TAC1,3             ;ANY MORE THAN JUST 2 CHANNELS?\r
1135         JRST UINITE             ;YES, GIVE ERROR RETURN(POP TAC)\r
1136         DPB TAC1,IADPTR         ;YES, STORE UPDATED CHANNEL COUNT FOR THIS DEVICE(DTA)\r
1137 UINITB: MOVEI TAC1,ASSPRG       ;TRY TO ASSIGN IT BY PROGRAM\r
1138         PUSHJ PDP,ASSASG\r
1139         JRST UINIT6             ;NOT AVAILABLE, GIVE ERROR RETURN(POP TAC)\r
1140         POP PDP,UUO             ;RESTORE USER'S MODE SETTING\r
1141         PUSHJ PDP,SETIOS        ;SET DDB IOS STATUS WORD\r
1142                                 ; FROM RT. HALF OF AC UUO\r
1143                                 ; WAIT FOR DEVICES TO BECOME INACTIVE IN CASE IT IS\r
1144                                 ; INITED ON A DIFFERENT CHANNEL(OR MONITOR COMMAND\r
1145                                 ; RESPONSE ON TTY)\r
1146         MOVSI IOS,IOBEG\r
1147         IORB IOS,DEVIOS(DEVDAT)\r
1148 \fUINITL:        CAMG UCHN,USRHCU        ;IS THIS CHAN. .GT. HIGHEST CHAN. IN USE?\r
1149         JRST UINITC             ;NO\r
1150         AOS TAC,USRHCU          ;YES, BUMP HIGHEST SO FAR BY ONE\r
1151         SETZM USRJDA(TAC)       ;AND CLEAR IT OUT\r
1152         JRST UINITL             ;AND KEEP LOOKING\r
1153 \r
1154 UINITC: TLO DEVDAT,INITB+ICLOSB+OCLOSB;SET INIT UUO BIT\r
1155                                 ;PREVENT SUPERFLUOUS CALLS TO CLOSE (SEE LOOKUP,ENTER)\r
1156         AOS UUO,(PDP)           ;ADVANCE TO 3RD ARG(BUFFER HEADER)\r
1157         PUSHJ PDP,GETWDU        ;C(TAC)=BUFFER HEADER ARG\r
1158         HLRZ TAC1,TAC           ;OUTPUT BUFFER HEADER FROM USER\r
1159         JUMPE TAC1,UINIT4       ;WAS ONE SPECIFIED?\r
1160         HRLM TAC1,DEVBUF(DEVDAT);YES, SET DEVICE DATA BLOCK\r
1161         TLO DEVDAT,OBUFB        ;SET OUTPUT BUFFER SPECIFIED BIT\r
1162         PUSHJ PDP,UINITZ        ;INITIALIZE OUTPUT BUFFER HEADER\r
1163 UINIT4: PUSHJ PDP,GETWDU        ;C(TAC)=BUFFER HEADER ARG FROM USER\r
1164         HRRZ TAC1,TAC           ;INPUT BUFFER HEADER\r
1165         JUMPE TAC1,UINIT5       ;WAS ONE SPECIFIED?\r
1166         HRRM TAC1,DEVBUF(DEVDAT)        ;YES, SET DEVICE DATA BLOCK\r
1167         TLO DEVDAT,IBUFB        ;SET INPUT BUFFER SPECIFIED BIT\r
1168         MOVSI IOS,IOEND         ;CLEAR END OF FILE FLAG\r
1169         ANDCAB IOS,DEVIOS(DEVDAT)       ;AND RETAIN IOS\r
1170         PUSHJ PDP,UINITZ        ;INITIALIZE INPUT BUFFER HEADER\r
1171 UINIT5: MOVEM DEVDAT,USRJDA(UCHN)       ;STORE UUO BITS AND  DEVICE\r
1172                                 ; DATA BLOCK ADDRESS\r
1173         JRST TPOPJ1             ;SUCCESSFUL RETURN(POP TAC)\r
1174 \r
1175 UINIT6: TLNE TEM,DVDTA          ;WAS DEVICE A DECTAPE?\r
1176         DPB TEM,IADPTR          ;YES, RESTORE NO. OF USER CHAN INITED ON\r
1177 UINITE: POP PDP,TAC             ;REMOVE IO STATUS ARG\r
1178         JRST TPOPJ              ;AND GIVE ERROR RETURN AND POP TAC\r
1179 \f,CALLING SEQUENCE\r
1180 ,       PUSHJ PDP,UINITZ\r
1181 ,       EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED.\r
1182 ,SETS JBFADR:=JBFCTR:=0 FOR THE BUFFER AREA HEADER WHOSE ADDRESS\r
1183 ,IS IN AC TAC1.  ALSO,JBFPTR 0-5:=JBFPTR 12-17:=0,JBFPTR 6-11:=BYTE SIZE\r
1184 \r
1185 \r
1186 UINITZ: HRLI TAC1,PROG          ;SET FOR RELOCATION\r
1187         MOVEI AC1,2(TAC1)       ;CHECK 3RD WORD OF BUFFER HEADER\r
1188         PUSHJ PDP,UADRCK\r
1189         SETZM @TAC1             ;CLEAR FIRST WORD (CURRENT BUFFER) OF 3 WORD HEADER\r
1190         AOS TAC1                ;POINT TO SECOND WORD (BYTE POINTER)\r
1191         PUSH PDP,TAC1\r
1192         AOS TAC1                ;POINT TO THIRD WORD (ITEM COUNT)\r
1193         SETZM @TAC1             ;SET ITEM COUNT TO ZERO\r
1194         PUSHJ PDP,SETBYT        ;SET BYTE SIZE ACCORDING TO MODE AS SET IN AC IOS\r
1195         TLZ TAC,770077\r
1196         POP PDP,TAC1\r
1197         HLLM TAC,@TAC1          ;AND STORE IN SECOND WORD\r
1198         POPJ PDP,               ;RETURN\r
1199 \f;LONG DISPATCH TABLE UUOS - GET HERE ONLY IF DEVICE HAS LONG\r
1200 ;DISPACTH TABLE\r
1201 ;DISPACTH TO DEVICE DEPENDENT SERVICE ROUTINE\r
1202 ;ENTER UUO - ENTER FILE NAME IN DIRECTORY\r
1203 \r
1204 EXTERNAL USRJDA\r
1205 \r
1206 UDEN:   MOVEI TAC,CLSIN\r
1207         TLNN DEVDAT,OCLOSB      ;FILE OPEN?\r
1208         PUSHJ PDP,UDLKC         ;YES. CLOSE IT[OCLOSB_1]\r
1209         TLO IOS,IOBEG\r
1210         TRZ IOS,776000\r
1211         MOVEM IOS,DEVIOS(DEVDAT)\r
1212         HLLM DEVDAT,USRJDA(UCHN)        ;STORE UUO BITS\r
1213         PUSHJ PDP,DEN(DSER)     ;ATTEMPT AN ENTER\r
1214         POPJ PDP,               ;FAILURE\r
1215         TLZ DEVDAT,OCLOSB\r
1216         TLO DEVDAT,ENTRB                ;NOTE SUCCESSFUL ENTER\r
1217         JRST DLKDEN             ;STORE THE PROGRESS BITS\r
1218 \r
1219 ;LOOKUP UUO - LOOKUP FILE NAME IN DIRECTORY\r
1220 \r
1221 EXTERNAL USRJDA\r
1222 \r
1223 UDLK:   MOVEI TAC,CLSOUT        ;IN HIBIT OUTPUT CLOSE BIT\r
1224         TLNN DEVDAT,ICLOSB      ;FILE OPEN?\r
1225         PUSHJ PDP,UDLKC         ;YES. CLOSE IT[ICLOSB_1]\r
1226         TDZ IOS,[XWD IOEND,776000]\r
1227         MOVEM IOS,DEVIOS(DEVDAT)\r
1228         HLLM DEVDAT,USRJDA(UCHN)        ;STORE UUO BITS\r
1229         PUSHJ PDP,DLK(DSER)     ;ATTEMPT A LOOKUP\r
1230         POPJ PDP,               ;FAILURE\r
1231         TLZ DEVDAT,ICLOSB\r
1232         TLO DEVDAT,LOOKB        ;NOTE SUCCESSFUL LOOKUP\r
1233 DLKDEN: LDB TAC,PUUOAC          ;GET CHANNEL #\r
1234         HLLM DEVDAT,USRJDA(TAC) ;STORE UUO PROGRESS BITS\r
1235         JRST CPOPJ1             ;SUCCESS RETURN TO USER (CALL+2)\r
1236 \r
1237 INTERNAL UDLKC\r
1238 \r
1239 UDLKC:  PUSH PDP,UUO\r
1240         HRRI    UUO,(TAC)\r
1241         PUSHJ PDP,CLOSE1\r
1242         POP PDP,UUO\r
1243         JRST    WAIT1\r
1244 \f;RENAME UUO - HERE ON SHORT DISPATCH TABLE DEVICES TOO\r
1245 INTERNAL FT2REL\r
1246 \r
1247 EXTERNAL CPOPJ1\r
1248 \r
1249 URENAM: MOVE TAC,DEVMOD(DEVDAT) ;IS THIS DEVICE A LONG DISPATCH TABLE?\r
1250         TLNN TAC,DVLNG\r
1251         JRST CPOPJ1             ;NO, GIVE SKIP RETURN TO USER\r
1252 IFE FT2REL,<\r
1253         JRST DRN(DSER)          ;YES, DISPATCH TO SERVICE ROUTINE\r
1254 >\r
1255 IFN FT2REL,<\r
1256         EXTERN RELSG1\r
1257         PUSHJ PDP,DRN(DSER)     ;TRY TO RENAME (SERVICE ROUTINE)\r
1258         POPJ PDP,               ;ERROR,ERROR RETURN TO USER\r
1259         JRST RELSG1             ;SUCCESSFUL RENAME, GO ZERO SHARABLE SEG NAME\r
1260                                 ; IF NEW FILE EXT IS .SHR AND FILE NAME\r
1261                                 ; FIND DIRECTORY (DEVICE) ARE SAME AS SHARABLE SEG\r
1262                                 ; ALWAYS SKIP RETURN\r
1263 >\r
1264 \r
1265 ;SETO UUO - SET NEXT OUTPUT BLOCK NUMBER(DECTAPE)\r
1266 \r
1267 UDSO:   JRST DSO(DSER)\r
1268 \r
1269 ;SETI UUO - SET NEXT INPUT BLOCK NUMBER\r
1270 \r
1271 UDSI:   JRST DSI(DSER)\r
1272 \r
1273 ;GETF UUO - GET NEXT FREE BLOCK\r
1274 \r
1275 UDGF:   JRST DGF(DSER)\r
1276 \r
1277 ;MTAPE UUO - MAGTAPE OPERATIONS\r
1278 \r
1279 UMTAPE: JRST DMT(DSER)\r
1280 \r
1281 ;UTPCLR - CLEAR DECTAPE DIRECT.\r
1282 \r
1283 UTPCLR: MOVE TAC,DEVMOD(DEVDAT) ;IS THIS A LONG DISPATCH TABLE?\r
1284         TLNN TAC,DVLNG\r
1285         POPJ PDP,               ;NO,RETURN\r
1286         JRST DCLR(DSER)         ;YES, DISPATCH\r
1287 \f;INPUT UUO\r
1288 \r
1289 ;1)  IF OUTPUT ACTIVE ON THIS CHANNEL, WAIT FOR IT TO COMPLETE.\r
1290 ;2)  IF DUMP MODE, WAIT FOR DEVICE INACTIVE, CALL SERVICE\r
1291 ;       ROUTINE TO START INPUT, WAIT TILL COMPLETE, THEN RETURN TO USER.\r
1292 ;3)  IF NO BUFFER RING SETUP, SET UP 2 RING BUFFER.\r
1293 ;4)  IF FIRST REFERENCE, START SERVICE ROUTINE, GO TO\r
1294 ;5)  FLAG CURRENT BUFFER AS FREE TO RECEIVE MORE INPUT\r
1295 ;       (USE BIT SET TO 0).\r
1296 ;       START SERVICE ROUTINE FILLING FIRST BUFFER WITH USE BIT 0\r
1297 ;       (NEXT BUFFER OR ONE AHEAD OF IT)\r
1298 ;       (SERVICE ROUTINE WILL SET USE BIT WHEN IT FINISHES FILLING\r
1299 ;       BUFFER).\r
1300 ;7)  IF NEXT INPUT BUFFER IS FULL OF DATA, GO TO 10).\r
1301 ;8)  PUT JOB IN IO WAIT TILL NEXT BUFFER FILLED.\r
1302 ;9)  IF NEXT INPUT BUFFER STILL NOT FILLED, CHECK FOR END\r
1303 ;       OF FILE OR ERROR BITS SET BY SERVICE ROUTINE.\r
1304 ;10) CONVERT WORD COUNT AS STORED BY SERVICE ROUTINE IN THIRD\r
1305 ;       WORD OF BUFFER TO ITEM COUNT AND STORE IN THIRD WORD\r
1306 ;       OF HEADER (ITEM COUNT) ALSO SET BYTE POINTER (SECOND\r
1307 ;       WORD OF HEADER) AND RETURN TO USER.\r
1308 \fINTERNAL IN\r
1309 EXTERNAL USRJDA,PIOMOD\r
1310 \r
1311 IN:     TLNE IOS,IO             ;IS THIS DEVICE ALREADY DOING OUTPUT?\r
1312         PUSHJ PDP,WAIT1         ;YES, WAIT TILL IT IS FINISHED.\r
1313         TLO DEVDAT,INPB         ;FOR THIS DEVICE.\r
1314         TLZ DEVDAT,ICLOSB\r
1315         HLLM DEVDAT,USRJDA(UCHN)        ;IN LH OF CURRENT JOB DEVICE CHANNEL\r
1316         LDB TAC,PIOMOD          ;IO MODE\r
1317         CAIL TAC,SD             ;IT THE IO MODE DUMP(SD,D,DR)?\r
1318         JRST INDMP              ;YES\r
1319 IN1:    HRR JBUF,DEVBUF(DEVDAT) ;NO, GET ADDRESS OF BUFFER HEADER\r
1320         HRLZI TAC,IOUSE         ;BUFFER INUSE BIT\r
1321         HRLI JBUF,PROG          ;SET INDEX FIELD FOR RELOCATION USING AC PROG\r
1322         MOVEI AC1,2(JBUF)       ;CHECK BUFFER HEADER\r
1323         PUSHJ PDP,UADRCK\r
1324         MOVE IOS,DEVIOS(DEVDAT) ;SETUP IO STATUS AGAIN FORM FROM MEMORY\r
1325                                 ; AC IOS IS CLOBBERED BY AUTOMATIC CORE EXPANSION\r
1326                                 ; ON AN IMPLICIT INBUF ON FIRST INPUT\r
1327         MOVE TAC1,@JBUF         ;GET WORD 1 OF 3 WORD BUFFER HEADER.\r
1328         HRLI TAC1,PROG          ;SET INDEX FIELD COR RELOCATION USING AC PROG\r
1329         SKIPG @JBUF             ;HAS A BUFFER RING BEEN SET UP (RH NON-ZERO)\r
1330                                 ; WHICH HAS BEEN REFERENCED BY PREVIOUS INPUT (BIT0=0)\r
1331         JRST INPUTF             ;NO. GO SET UP BUFFER IF NECESSARY AND DO FIRST IO\r
1332         HRRZ AC1,TAC1           ;YES, CHECK ADR. TO SEE IF OK\r
1333         PUSHJ PDP,UADRCK\r
1334         MOVE    IOS,DEVIOS(DEVDAT)\r
1335         TDNN    TAC,@TAC1\r
1336         JRST    INPT1\r
1337         ANDCAB TAC,@TAC1        ;FLAG CURRENT BUFFER AS FREE TO\r
1338                                 ; RECEIVE MORE INPUT, CLEAR USE BIT\r
1339                                 ; AND GET POINTER TO NEXT BUFFER\r
1340         HRRM TAC,@JBUF          ;SET WORD 1 IN 3 WORD HEADER TO NEXT BUFFER\r
1341         HRRZ AC1,TAC            ;AND CHECK ITS ADDRESS TO SEE IF IN BOUNDS\r
1342         PUSHJ PDP,UADRCK\r
1343         TRNE IOS,IOACT          ;IS THE DEVICE ALREADY ACTIVE\r
1344         JRST INPT0C             ;YES\r
1345         MOVE AC1,DEVMOD(DEVDAT) ;GET DEVICE CHARACTERISTIC WORD\r
1346         HRLI TAC,PROG           ;SET FOR RELOCATION\r
1347         TLNN AC1,DVTTY          ;IS IT A TTY?\r
1348         HRR TAC,@TAC            ;GET POINTER 1 BUFFER AHEAD OF NEXT BUFFER\r
1349                                 ; IF NOT TTY.\r
1350         HRRZ AC1,TAC            ;SEE IF USER HAS CLOBBERED POINTER\r
1351         PUSHJ PDP,UADRCK\r
1352         SKIPL @TAC              ;IS THE USE BIT SET?\r
1353         PUSHJ PDP,CALIN         ;NO, START SERVICE ROUTINE FILLING EMPTY BUFFER\r
1354 INPT0C: HRR TAC1,@TAC1          ;GET USE BIT FOR NEXT BUFFER\r
1355 INPT0A: SKIPGE @TAC1            ;IS USE BIT SET YET?(BUFFER FILLED YET?)\r
1356         JRST INPUT2             ;YES, RETURN IMMEDIATELY TO USER\r
1357 \fINPT2: PUSHJ PDP,WSYNC         ;NO, PUT JOB IN IO WAIT TILL BUFFER FILLED.\r
1358         SKIPL @TAC1             ;RETURN WHEN BUFFER FILLED. CHECK TO MAKE SURE.\r
1359         JRST INEOF              ;NO, MUST BE EOF OR ERROR\r
1360 INPUT2: ADDI TAC1,1             ;YES, GET WORD COUNT AS SET BY IO SERVICE\r
1361         HRRZ ITEM,@TAC1         ;RH OF 3RD WORD(FIRST SO-CALLED DATA WORD)\r
1362         SOJA TAC1,IOSETC        ;SET ITEM COUNT AND BYTE POINTER\r
1363                                 ; IN 3 WORD HEADER AND RETURN TO USER\r
1364 \r
1365 INPT1:  TRNN    IOS,IOACT\r
1366         PUSHJ   PDP,CALIN\r
1367         JRST    INPT2\r
1368 \r
1369 \r
1370 INEOF:  TDNN IOS,[XWD IOEND,IODERR+IOBKTL+IODTER+IOIMPM]\r
1371                                 ; EOF OR ERROR BIT SET BY SERVICE ROUTINE\r
1372         JSP     DAT,UUOERR      ;NO,MONITOR ERROR AT UUO LEVEL\r
1373         TLNE IOS,IOEND          ;IS THIS EOF?\r
1374         TRO IOS,IODEND          ;YES, SET USER EOF BIT.\r
1375         IORM IOS,DEVIOS(DEVDAT)\r
1376         POPJ PDP,               ;RETURN TO USER'S PROGRAM\r
1377 \r
1378 \r
1379 \r
1380 ;HERE ON FIRST INPUT AFTER INIT, INIT & LOOKUP, OR INIT & LOOKUP & INPUT\r
1381 INPUTF: ANDCAB TAC,@JBUF        ;MARK THAT BUFFERS HAVE BEEN REFER\r
1382                                 ; BY CLEARING SIGN BIT OF 1ST WORD IN 3 WORD\r
1383                                 ; IN 3 WORD BUFFER HEADER\r
1384         JUMPE TAC,INPUT3        ;HAS A RING BEEN SET UP YET?\r
1385         HRRZ AC1,TAC1           ;YES ADDRESS CHECK FIRST USER BUFFER\r
1386         PUSHJ PDP,UADRCK        ;\r
1387         SKIPG @TAC1             ;IS USE BIT SET IN FIRST USER INPUT BUFFER?\r
1388                                 ; CAN HAPPEN IF TTY AND USER HAS TYPED\r
1389                                 ; IN LINE AFTER INBUF BUT BEFORE FIRST INPUT UUO\r
1390         JRST INPUT2             ;YES, DO NOT CALL SERVICE ROUTINE(SCNSER)\r
1391                                 ; SINCE USER BUFFER ALREADY HAS DATA\r
1392         HRRM TAC,DEVIAD(DEVDAT) ;YES, STORE ADR. OF 2ND WORD OF\r
1393                                 ; A BUFFER FOR SERVICE ROUTINE\r
1394         PUSHJ PDP,CALIN         ;YES. GO START IO SERVICE ROUTINE\r
1395                                 ; FILLING BUFFER\r
1396         JRST INPT0A\r
1397 INPUT3: HRRI UUO,2              ;BUFFERS NOT SETUP YET.\r
1398                                 ; SET UP 2\r
1399         PUSHJ PDP, UINBF\r
1400         HLLZS UUO               ;CLEAR RIGHT HALF\r
1401         JRST IN1\r
1402 \r
1403 \r
1404 INDMP:  PUSHJ PDP,WSYNC         ;INPUT DUMP\r
1405         PUSHJ PDP,DDI(DSER)     ;CALL SERVICE ROUTINE\r
1406         JRST WAIT1              ;THEN WAIT TILL IO  FINISHED BEFORE\r
1407                                 ; RETURNING TO USER.\r
1408 \f\r
1409 EXTERNAL JOBPFI,USRREL\r
1410 \r
1411 CALIN:  TLNE IOS,IOEND\r
1412         POPJ PDP,\r
1413         PUSH PDP,TAC1\r
1414         PUSH PDP,JBUF\r
1415         HRRZ AC1,DEVIAD(DEVDAT) ;IS FIRST ADR. ABOVE JOB DATA AREA?\r
1416         CAIG AC1,JOBPFI\r
1417         JRST ADRERR             ;NO, PRINT ERROR AND STOP JOB\r
1418         HLRZ AC2,@DEVIAD(DEVDAT)        ;GET LENGTH OF BUFFER\r
1419         TRZ AC2,IOUSE           ;CLEAR USE BIT IN CASE IT IS ON(TTY)\r
1420         ADD AC1,AC2\r
1421         CAMLE AC1,USRREL        ;IS LAST ADDRESS IN BOUNDS?\r
1422         JRST ADRERR             ;NO, STOP JOB AND PRINT ERROR\r
1423         PUSHJ PDP,DIN(DSER)     ;DISPATCH TO IO SERVICE ROUTINE\r
1424         POP PDP,JBUF\r
1425         POP PDP,TAC1\r
1426         POPJ PDP,\r
1427 \f,CALLING SEQUENCE\r
1428 ,     OUTPUT D,\r
1429 ,     EXIT\r
1430 ,OR\r
1431 ,     OUTPUT D, ADR\r
1432 ,     EXIT\r
1433 \r
1434 ,IF INPUT IS ACTIVE, WAIT FOR IT TO COMPLETE.\r
1435 ,IF DUMP MODE WAS SELECTED BY THE LAST INIT UUO OR SETSTS UUO\r
1436 ,   THE PROGRAM WAITS UNTIL THE DEVICE IN INACTIVE AND THEN\r
1437 ,   WRITES THE DUMPFILE AND RETURNS CONTROL TO THE USER'S PROGRAM\r
1438 ,   WHEN IO HAS COMPLETED.\r
1439 ,IF THE MODE IS NOT DUMP, THEN\r
1440 ,1) IF ADR IS NOT ZERO, WAIT FOR DEVICE TO BECOME INACTIVE THEN SET THE\r
1441 ,   CURRENT BUFFER ADDRESS EQUAL TO ADR AND AN INDICATOR (JBFADR0)\r
1442 ,   SPECIFYING THAT THIS BUFFER RING HAS NEVER BEEN REFERENCED FROM THE\r
1443 ,   USER'S PROGRAM BY AN INPUT OR AN OUTPUT UUO.  OTHERWISE, GO TO\r
1444 ,   2) DIRECTLY.\r
1445 \r
1446 ,2) IF THE BUFFER RING HAS NEVER BEEN REFERENCED (JBFADR0=1), THE\r
1447 ,   BUFFER IS CLEARED, IOUSE SET TO ZERO AND\r
1448 ,      IF THE CURRENT BUFFER ADDRESS IS ZERO, A TWO BUFFER RING IS SET UP.\r
1449 ,      THEN GO TO 8\r
1450 ,\r
1451 ,3) IF THE BUFFER RING HAS BEEN REFERENCED (JBFADR0=0   ,THEN A CHECK IS\r
1452 ,   MADE TO DETERMINE IF THE WORD COUNT IS TO BE COMPUTED.\r
1453 ,      IF THE WORD COUNT IS TO BE COMPUTED (IOWC=0), IT IS SET EQUAL\r
1454 ,      TO THE ADDRESS FOR THE LAST DATA WORD MINUS THE ADDRESS OF THE\r
1455 ,      BUFFER MINUS ONE.\r
1456 \r
1457 ,4) IOUSE IS SET TO ONE, INDICATING THAT THE BUFFER IS FULL OR BEING\r
1458 ,   EMPTIED, AND THE CURRENT BUFFER ADDRESS IS ADVANCED.\r
1459 \r
1460 ,5) IF THE DEVICE IS NOT ACTIVE (IOACT=0), OUTPUT IS STARTED.\r
1461 ,6) IF THE CURRENT BUFFER IS FULL OR BEING EMPTIED (IOUSE=1),\r
1462 ,   THE PROGRAM WAITS UNTIL THE DEVICE FINISHES THE BUFFER\r
1463 ,   (THE OUTPUT SERVICE ROUTINE CLEARS THE USE BIT WHEN\r
1464 ,   IT FINISHES OUTPUTTING A BUFFER).\r
1465 ,7) THE CURRENT BUFFER IS CLEARED.\r
1466 ,8) THE ITEM POINTER IS INITIATED TO THE CURRENT BUFFER ADDRESS+1\r
1467 ,   AND THE ITEM COUNT IS SET TO THE PRODUCT OF THE BUFFER SIZE\r
1468 ,   MINUS ONE AND THE INTEGER PART OF 36/BYTE SIZE.\r
1469 ,9) RETURN TO THE USER'S PROGRAM\r
1470 \f;HERE ON OUTPUT UUO\r
1471 EXTERNAL USRJDA,PIOMOD\r
1472 \r
1473 UOUT:   TLO DEVDAT,OUTPB        ;SET OUTPUT UUO BIT\r
1474         TLZ DEVDAT,OCLOSB       ;CLEAR CLOSE OUTPUT BIT\r
1475 \r
1476 ;HERE FROM DEVICE SERVICE ROUTINES ON CLOSE UUO\r
1477 \r
1478 INTERNAL OUT\r
1479 \r
1480 OUT:    TLNN IOS,IO             ;IS THIS DEVICE ALREADY DOING INPUT?\r
1481         PUSHJ PDP,WAIT1         ;YES, WAIT TILL IT BECOMES INACTIVE\r
1482         HLLM DEVDAT,USRJDA(UCHN);SAVE NEW BIT SETTINGS.\r
1483         LDB TAC,PIOMOD          ;GET DATA MODE SET BY INIT OR SETSTS.\r
1484         CAIL TAC,SD             ;IS IT DUMP MODE(SD,DR,D)?\r
1485         JRST OUTDMP             ;YES.\r
1486         PUSHJ PDP,OUTA          ;NO, CHECK FOR NON-ZERO ADDRESS(USER\r
1487                                 ; CHANGING RING)\r
1488         HLR JBUF,DEVBUF(DEVDAT) ;REL. ADDR. OF OUTPUT BUFFER HEADER\r
1489         MOVEI AC1,2(JBUF)       ;CHECK END OF 3 WORD HEADER\r
1490         PUSHJ PDP,UADRCK\r
1491         HRLI JBUF,PROG          ;SET INDEX FIELD FOR RELOCATION.\r
1492         SKIPG TAC1,@JBUF        ; CHECK FIRST WORD OF BUFFER HEADER\r
1493         JRST OUTF               ;RING NOT SET UP OR FIRST REFERENCE TO RING\r
1494         AOS JBUF                ;COMPUTE WORD COUNT FROM BYTE POINTER\r
1495         HRRZ TAC,@JBUF          ;GET RH OF BYTE POINTER.\r
1496         ADDI TAC1,1             ;REL. ADDR. OF 3RD WORD IN BUFFER.\r
1497         SKIPE   TAC\r
1498         SUB TAC,TAC1            ;DISTANCE FILLED BY USER.\r
1499         HRLI TAC1,PROG\r
1500         TRNE IOS,IOWC           ;DOES USER WANT SYSTEM TO COMPUTE WORD\r
1501                                 ; COUNT FROM BYTE POINTER?\r
1502         JRST OUT2               ;NO.\r
1503         HRRZ AC1,TAC1           ;PROCEED ONLY IF ADDR. OF WORD COUNT IN BOUNDS\r
1504         ADDI    AC1,(TAC)       ;FORM REL. ADR OF LAST WORD TO OUTPUT\r
1505         PUSHJ PDP,UADRCK\r
1506         HRRM TAC,@TAC1          ;YES, STORE WORD COUNT IN 3RD WORD OF BUFFER.\r
1507 \fOUT2:  SUBI JBUF,1             ;REL. ADDR. OF 1ST WORD IN HEADER\r
1508                                 ; (POINTER TO CURRENT BUFFER).\r
1509         SUBI TAC1,1                     ;REL. ADDR. OF 2ND WORD IN BUFFER\r
1510                                         ; (LINK TO NEXT BUFFER).\r
1511         HRLZI TAC,IOUSE         ;FLAG CURRENT BUFFER CONTAINS ACTIVE DATA.\r
1512         IORB TAC,@TAC1\r
1513         HRRM TAC,@JBUF          ;ADVANCE CURRENT BUFFER ADDRESS\r
1514         MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE?\r
1515         TRNN IOS,IOACT\r
1516         PUSHJ PDP,DOU(DSER)     ;NO,START OUTPUT.\r
1517         HLR JBUF,DEVBUF(DEVDAT) ;JBUF TO REL. ADDR. OF BUFFER HEADER\r
1518         HRLI JBUF,PROG          ;SET TO RELOCATE\r
1519         MOVE TAC1,@JBUF         ;TAC1 TO REL. ADDR. OF 2ND WORD OF BUFFER.\r
1520         HRRZ AC1,TAC1\r
1521         PUSHJ PDP,UADRCK\r
1522         HRLI TAC1,PROG\r
1523         MOVEI   TAC,@JBUF\r
1524         HLLZS   1(TAC)\r
1525         SKIPG @TAC1             ;HAS SERVICE ROUTINE EMPTIED NEXT BUFFER\r
1526                                 ; YET (USE BIT = 0)?\r
1527         PUSHJ PDP,WSYNC         ;NO, WAIT.\r
1528         JRST OUTS               ;RETURN TO USER.\r
1529 \r
1530 \r
1531 OUTF:   SKIPE TAC1,@JBUF\r
1532         JRST OUTF1\r
1533         HRRI UUO,2\r
1534         PUSHJ PDP,UOUTBF\r
1535         HLR JBUF,DEVBUF(DEVDAT)\r
1536         HRLI JBUF,PROG\r
1537 OUTF1:  HRLZI TAC, IOUSE\r
1538         ANDCAB TAC, @JBUF       ;IOUSE:=0\r
1539         HRRM TAC,DEVOAD(DEVDAT)\r
1540 OUTS:   HRRZ TAC,@JBUF          ;CLEAR NEXT OUTPUT BUFFER.\r
1541         PUSHJ PDP,BUFCLR        ;BEING CLEARED.\r
1542         JRST ADRERR             ;ADDRESS CHECK\r
1543         HRR TAC1,@JBUF\r
1544         HRLI TAC1,PROG\r
1545         LDB ITEM,[POINT 17,@TAC1,17]\r
1546         SOJA ITEM,IOSETC\r
1547                                 ; ADDRESS+1\r
1548                                 ; JBFCTR:=(BUFFER SIZE-1)*[36/BYTE\r
1549                                 ; SIZE]\r
1550                                 ; RETURN TO USER'S PROGRAM\r
1551 \r
1552 OUTDMP: PUSHJ PDP,WSYNC\r
1553         PUSHJ PDP,DDO(DSER)\r
1554         JRST WAIT1              ;WAIT BEFORE RETURNING TO USER\r
1555 \f\r
1556 ,CALLING SEQUENCE:\r
1557 ,       PUSHJ PDP,OUTA\r
1558 ,       EXIT            ALWAYS RETURNS HERE\r
1559 ,IF THE ADDRESS FIELD OF AC UUO IS ZERO,EXIT. OTHERWISE,CHECK IOACT.\r
1560 ,IF IOACT=1, WAIT FOR IOACT=0.\r
1561 ,SET JBFADR18-35:=ADDRESS FIELD OF AC UUO. JBFADR0:=1 AND EXIT.\r
1562 \r
1563         INTERN OUTA\r
1564 OUTA:   TRNN UUO,777774         ;IS BUFFER ADDRESS SPECIFIED?\r
1565         POPJ PDP,               ;NO\r
1566         PUSHJ PDP,WAIT1\r
1567         HLR JBUF,DEVBUF(DEVDAT)\r
1568         HRLI JBUF,PROG\r
1569         HRRM UUO,@JBUF\r
1570         HRRM UUO,DEVOAD(DEVDAT)\r
1571         HRLZI TAC,IOUSE\r
1572         ANDCAM TAC,@JBUF\r
1573         POPJ PDP,               ;RETURN\r
1574 \f,RELEASE A DEVICE\r
1575 \r
1576 INTERNAL RELEA1,RELEA2,RELEA3,RELEA5,RELEA6,RELEA9\r
1577 EXTERNAL USRJDA,USRHCU,CPOPJ,SYSTAP,STUSER,STREQ,STAVAL,PJOBN,IADPTR\r
1578 \r
1579 RELEA0:\r
1580 RELEA2:RELEA3:\r
1581 RELEA1: TRZ UUO,-1              ;CLOSE BOTH INPUT AND OUTPUT\r
1582         PUSHJ PDP,CLOSE1\r
1583         PUSHJ PDP,WAIT1         ;WAIT FOR DEVICE TO BECOME INACTIVE\r
1584 RELEA5: PUSHJ PDP,DRL(DSER)     ;DISPATCH TO DEVICE SERVICE ROUTINE\r
1585         MOVEI IOS,IOACT         ;CLEAR IO ACTIVE BIT\r
1586         ANDCAB IOS,DEVIOS(DEVDAT)       ;AND RETURN WITH IOS SET\r
1587         LDB TAC1,IADPTR         ;GET COUNT OF NO OF CHANS DEVICE ON(IF DTA)\r
1588         SOS TAC1                ;COUNT DOWN BY ONE\r
1589         MOVE TAC,DEVMOD(DEVDAT)\r
1590         TLNE TAC,DVDTA          ;DEVICE A DTA?\r
1591         DPB TAC1,IADPTR         ;YES, STORE UPDATED COUNT\r
1592         SETZB DAT,USRJDA(UCHN)  ;CLEAR DEVICE ASSIGNMENT\r
1593         MOVE TAC,USRHCU         ;HIGHEST IO CHANNEL IN USE\r
1594 RELEA4: HRRZ TAC1,USRJDA(TAC)\r
1595         JUMPN DAT,RELE4A        ;NON-ZERO CHAN. ALREADY?\r
1596         MOVE DAT,TAC1           ;NO, SET DAT WHEN FIRST(HIGHEST) FOUND\r
1597         MOVEM TAC,USRHCU        ;STORE HIGHEST IN USE CHANNEL\r
1598 RELE4A: CAIE TAC1,(DEVDAT)      ;IS THIS DEVICE SAME AS ONE BEING RELEASED?\r
1599         SOJGE TAC,RELEA4\r
1600         JUMPGE TAC,CPOPJ        ;EXIT IF ON ANOTHER CHANNEL\r
1601         HLLZS DEVIAD(DEVDAT)    ;CLEAR INPUT BUFFER ADDRESS\r
1602         HLLZS DEVOAD(DEVDAT)    ;AND OUTPUT BUFFER ADDRESS.\r
1603 \f;CALLED FROM ERROR STOP ROUTINE(ESTOP)\r
1604 RELEA9: MOVE TAC,DEVNAM(DEVDAT) ;IS THIS SYSTEM TAPE?\r
1605         CAME TAC,[SIXBIT /DSK/] ;DSK IS NEVER QUEUED\r
1606         CAME TAC,SYSTAP\r
1607         JRST RELEA7             ;IS DISK OR NOT SYSTEM TAPE\r
1608         SKIPN STUSER            ;HAS COUNT ALREADY BEEN REDUCED AT ESTOP?\r
1609         JRST RELEA7             ;YES\r
1610         SETZM STUSER            ;YES, CLEAR SYSTEM USER NO.\r
1611         SOSL STREQ              ;YES, REDUCE COUNT\r
1612         SETOM STAVAL            ;SOMEONE IS WAITING, SET AVAILABLE FLAG/\r
1613 RELEA7: MOVEI TAC1,ASSPRG       ;CLEAR ASSIGNED BY PROGRAM BIT\r
1614 RELEA6: ANDCAB TAC1,DEVMOD(DEVDAT)      ;CALLED FROM DEASSIGN\r
1615         TRZ TAC1,777            ;CLEAR JOB NO. FIELD\r
1616 INTERNAL FTDISK\r
1617 IFE FTDISK,<\r
1618                 TDNN TAC1,[XWD TTYATC,ASSCON+ASSPRG]\r
1619                 DPB TAC1,PJOBN  ;CLEAR JOB NUMBER IF ALL 3 BITS OFF\r
1620                 POPJ PDP,       ;IE ASSIGNED BY CONSOLE,PROGRAM, OR\r
1621 >\r
1622 IFN FTDISK,<EXTERNAL CLRDDB,IPOPJ\r
1623         TDNE TAC1,[XWD TTYATC,ASSCON+ASSPRG]\r
1624         POPJ PDP,               ;DEVICE ASSIGNED BY OTHER MEANS TOO\r
1625         DPB TAC1,PJOBN          ;CLEAR JOB NUMBER\r
1626         PUSH PDP,ITEM           ;SAVE JOB NO.\r
1627         TLNE TAC1,DVDSK         ;IS DEVICE A DSK\r
1628         PUSHJ PDP,CLRDDB        ;YES-RETURN DDB TO STORAGE\r
1629         JRST IPOPJ              ;RESTORE JOB NO. & RETURN.\r
1630 >\r
1631 \f\r
1632 ,CALLING SEQUENCE\r
1633 ,       STATO D,MASK\r
1634 ,       EXIT1           ALL SELECTED BITS ARE 0\r
1635 ,       EXIT2           SOME SELECTED BITS ARE 1\r
1636 ,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S CHANNEL D WHICH\r
1637 ,ARE SELECTED BY MASK.\r
1638 \r
1639 \r
1640         INTERN USTATO\r
1641 USTATO: TRNE IOS,(UUO)          ;SKIP IF ANY INDICATED BITS ARE ONE\r
1642         AOS (PDP)\r
1643         POPJ PDP,               ;RETURN TO USER\r
1644 \r
1645 \r
1646 ,CALLING SEQUENCE\r
1647 ,       STATUS D,ADR\r
1648 ,       EXIT            ALWAYS RETURNS HERE\r
1649 ,STORES I/O STATUS WORD OF DEVICE ON CHANNEL D IN LOCATION ADR.\r
1650 \r
1651 \r
1652 INTERN USTATS\r
1653 \r
1654 \r
1655 USTATS: HRRZ TAC,IOS            ;GET USER HALF OF IOS.\r
1656         JRST STOTAC             ;ADDRESS CHECK AND STORE IN USER AREA\r
1657 \r
1658 \r
1659 ,CALLING SEQUENCE\r
1660 ,       STATZ D,MASK\r
1661 ,       EXIT1           SOME SELECTED BITS ARE 1\r
1662 ,       EXIT2           ALL SELECTED BITS ARE 0\r
1663 \r
1664 ,TESTS BITS OF I/O STATUS WORD OF DEVICE ON USER'S\r
1665 ,CHANNEL D WHICH ARE SELECTED BY MASK.\r
1666 \r
1667         INTERN USTATZ\r
1668 \r
1669 USTATZ: TRNN IOS,(UUO)          ;SKIP IF ALL INDICATED BITS ARE ZERO\r
1670         AOS (PDP)\r
1671         POPJ PDP,               ;RETURN TO USER\r
1672 \f;IN UUO - LIKE INPUT   SKIPS IF  EOF OR ERRORS\r
1673 \r
1674 INTERNAL TIN\r
1675 \r
1676 TIN:    PUSHJ PDP,IN            ;DO INPUT UUO\r
1677         TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM+IODEND\r
1678         AOS (PDP)\r
1679         POPJ PDP,\r
1680 \r
1681 \r
1682 ;OUT UUO - LIKE OUTPUT  -  SKIPS IF ERRORS\r
1683 \r
1684 INTERNAL TOUT\r
1685 \r
1686 TOUT:   PUSHJ PDP,UOUT          ;DO OUTPUT UUO\r
1687         TRNE IOS,IOBKTL+IODTER+IODERR+IOIMPM\r
1688         AOS (PDP)\r
1689         POPJ PDP,\r
1690 \r
1691 \r
1692 ;5 UUOS FOR EACH INSTALLATION TO DEFINE\r
1693 ;OPCODES 42-46\r
1694 \r
1695 \r
1696 \fSUBTTL IOCSS - COMMON IO SUBROUTINES\r
1697 \r
1698 ;ROUTINE TO ADVANCE OUTPUT BUFFER AT INTERRUPT LEVEL\r
1699 \r
1700 ;CALL:  PUSHJ PDP,ADVBFE\r
1701 ,       EXIT1           RETURN IF NEXT BUFFER IS EMPTY\r
1702 ,       EXIT2           RETURN IF NEXT BUFFER IS FULL\r
1703 ,CLEARS THE USE BIT (IOUSE:=0) OF THE BUFFER POINTED TO BY THE\r
1704 ,OUTPUT BUFFER ADDRESS (DEVOAD) OF THE CURRENT DEVICE DATA BLOCK\r
1705 ,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.\r
1706 ,UPON RETURN, SKIPS IF THE NEXT BUFFER IS FULL.\r
1707 ;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO\r
1708 ;MAKE SURE IT IS NOT IN JOB DATA AREA OR ABOVE USER AREA\r
1709 ;THE SECOND WORD OF CURRENT BUFFER WAS CHECKED AT UUO LEVEL\r
1710 ;OR PREVIOUS CALL TO ADVBFE\r
1711 \r
1712 INTERNAL ADVBE1,ADVBFE\r
1713 EXTERNAL XJBPFI,CPOPJ\r
1714 \r
1715 ADVBFE: MOVEI TAC1,@DEVOAD(DEVDAT)      ;ABS. ADR. OF 2ND WORD OF LAST BUF.\r
1716         JUMPE TAC1,CPOPJ        ;HAS DEVOAD BEEN CLEARED BY RELEASE?\r
1717         MOVEM IOS,-1(TAC1)      ;NO. STORE IO STATUS WORD(ERROR BITS)\r
1718                                 ; IN FIRST WORD OF BUFFER\r
1719         MOVSI TAC,IOUSE         ;IOUSE:=0\r
1720         ANDCAB TAC,(TAC1)       ;CLEAR USE BIT IN 2ND WORD\r
1721                                 ; ADRESS CHECKED WHEN STORED IN DEVOAD\r
1722                                 ; DEVICE ACTIVE SINCE THEN\r
1723         HRLZ TAC,TAC            ;NEXT BUFFER ADR. TO LH\r
1724         CAMLE TAC,XJBPFI        ;IS IT IN IO PROTECTED PART OF JOB DATA AREA?\r
1725         CAML TAC,PROG           ;NO, IS IT GREATER OR EQUAL TO LAST WORD IN USER AREA?\r
1726         POPJ PDP,               ;YES, DO NOT STORE NEXT ADDRESS\r
1727                                 ; CATCH ERROR LATER AT UUO LEVEL\r
1728         HLRM TAC,DEVOAD(DEVDAT) ;NOW SAFELY STORE NEXT BUFFER ADRESS\r
1729 \r
1730 ;ENTER HERE FROM SCNSER TO CHECK IF NEXT BUFFER FULL OF DATA YET\r
1731 \r
1732 ADVBE1: SKIPL @DEVOAD(DEVDAT)   ;IS IOUSE=0?\r
1733         POPJ PDP,               ;EXIT1. BUFFER IS EMPTY\r
1734         JRST ADVBF1     ;GO SEE IF USER TYPED CONTROL C\r
1735                                 ; OR EXEC IS WAITING TO SHUFFLE JOB\r
1736 \f\r
1737 ;ROUTINE TO ADVANCE INPUT BUFFER AT INTERRUPT LEVEL\r
1738 \r
1739 ;CALL:  PUSHJ PDP,DEVBFF\r
1740 ,       EXIT1           RETURN IF NEXT BUFFER IS FULL\r
1741 ,       EXIT2           RETURN IF NEXT BUFFER IS EMPTY\r
1742 ,SETS THE USE BIT (IOUSE:=1) OF THE BUFFER POINTED TO BY THE\r
1743 ,INPUT BUFFER ADDRESS (DEVIAD) OF THE CURRENT DEVICE DATA BLOCK\r
1744 ,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.\r
1745 ,UPON RETURN, SKIPS IF THE NEXT BUFFER IS EMPTY.\r
1746 ;SECOND WORD OF NEXT BUFFER IS ADDRESS CHECKED TO MAKE SURE\r
1747 ;IT IS NOT IN IO PROTECTED PART OF JOB DATA AREA OR ABOVE\r
1748 ;USER AREA\r
1749 ;ALSO END OF BUFFER IS CHECKED TO MAKE SURE NOT ABOVE JOB AREA\r
1750 \r
1751 INTERNAL ADVBFF\r
1752 EXTERNAL XJBPFI,PJOBN,JBTSTS,CPOPJ\r
1753 \r
1754 ADVBFF: MOVEI TAC1,@DEVIAD(DEVDAT)      ; ABS. ADR. OF LAST INPUT BUFFER\r
1755         JUMPE TAC1,CPOPJ        ;HAS DEVIAD BEEN CLEARED BY RELEASE?\r
1756         MOVEM IOS,-1(TAC1)      ;NO. STORE IOS WORD IN FIRST WORD OF BUF.\r
1757         MOVSI TAC,IOUSE         ;IOUSE:=1\r
1758         IORB TAC,(TAC1)         ;FLAG THAT DATA HAS BEEN INPUT\r
1759         HRLZ TAC,TAC            ;NEXT BUFFER TO LEFT HALF\r
1760         CAMLE TAC,XJBPFI        ;IS ADR. IN PROT. PART OF JOB DATA AREA?\r
1761         CAML TAC,PROG           ;NO, WILL SECOND AND THIRD WORD FIT?\r
1762         POPJ PDP,               ;NO, GIVE ERROR RETURN SO DEVICE WILL STOP\r
1763         HLRM TAC,DEVIAD(DEVDAT) ;YES, SAFELY STORE ADDRESS OF NEXT BUFFER\r
1764         SKIPGE TAC1,@DEVIAD(DEVDAT)     ;IS NEXT INPUT BUFFER STILL FULL?\r
1765         POPJ PDP,               ;YES, GIVE STOP RETURN\r
1766         TRZ TAC1,-1             ;XWD LENGTH OF BUFFER,0\r
1767         ADD TAC,TAC1            ;ADD LENGTH TO REL. ADR. OF SECOND WORD\r
1768                                 ; LENGTH=NO. WORDS WHICH FOLLOW SECOND\r
1769         CAMLE TAC,PROG          ;IS LAST WORD IN BOUNDS?\r
1770         POPJ PDP,               ;NO, GIVE STOP RETURN\r
1771 ADVBF1: LDB TAC,PJOBN           ;GET JOB NO. FROM DEVICE DATA BLOCK\r
1772         SKIPGE TAC,JBTSTS(TAC)  ;IS RUN BIT ON IN JOB STATUS WORD\r
1773         TLNE TAC,SHF+CMWB       ;YES, SYSTEM WAITING TO SHUFFLE,\r
1774                                 ; EXECUTE A COMMAND, OR TO SWAP JOB OUT?\r
1775                                 ; SHF SET BY SWAPPER TO STOP IO IF IT WANTS TO SWAP JOB OUT\r
1776                                 ; 2 RELOC REG SOFTWARE DOES NOT SET SHF IN LOW SEG\r
1777                                 ; IF JOB HAS 2 SEG, SINCE HIGH SEG CAN BE\r
1778                                 ; SWAPPED EVEN THOUGH ACTIVE IO IN LOW SEG.\r
1779                                 ; THUS A LIMITED FORM OF MONITOR BUFFERING IS ACHIEVED\r
1780         POPJ PDP,               ;YES,PRETEND NEXT BUFFER NOT AVAILABLE\r
1781         TRNN IOS,IOCON          ;NEXT BUFFER AVAILABLE. DISCONTINUOUS MODE?\r
1782         AOS (PDP)               ;NO\r
1783         POPJ PDP,               ;YES\r
1784 \f\r
1785 ;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY\r
1786 ;CALL   HRRZ AC1,REL ADR.\r
1787 ;       PUSHJ PDP,UADCK1\r
1788 ;       NEVER RETURNS IF ERROR,STOPS JOB AND PRINTS ERROR\r
1789 ;BAD ADR. IF IN LOC 20-JOBPFI IN JOB DATA AREA\r
1790 ;OR IF ABOVE PROTECTION(USRREL) FOR CURRENT JOB\r
1791 \r
1792 INTERNAL UADCK1\r
1793 EXTERNAL USRREL,JOBPFI\r
1794 \r
1795 UADCK1: TRNN AC1,777760         ;IN USER ACS?\r
1796         POPJ PDP,               ;YES, ADDRESS IS OK\r
1797 \r
1798 ;ROUTINE TO ADDRESS CHECK AT UUO LEVEL ONLY\r
1799 ;USER ACS ARE ALSO ILLEGAL(ADR IS FOR IO USE LATER AT\r
1800 ;INTERRUPT LEVEL)\r
1801 ;CALL:  HRRZ AC1,REL.ADR.\r
1802 ;       PUSHJ PDP,UADRCK\r
1803 ;       NEVER RETURN IF ERROR\r
1804 \r
1805 INTERNAL UADRCK\r
1806 EXTERNAL USRREL,JOBPFI\r
1807 \r
1808 UADRCK: CAILE AC1,JOBPFI        ;IS ADR. IN IO PROT. PART OF JOB DATA AREA?\r
1809         CAMLE AC1,USRREL        ;NO, IS IT ABOVE PROTECT.?\r
1810         JRST ADRERR             ;YES, STOP JOB AND PRINT ERROR\r
1811         POPJ PDP,               ;NO\r
1812 \r
1813 ;ROUTINE TO ADDRESS CHECK AT ANY LEVEL\r
1814 ;CALL:  MOVE PROG,[XWD PROT.,RELOC,]\r
1815 ;       HRRZ TAC,REL. ADR.\r
1816 ;       PUSHJ PDP,IADRCK\r
1817 ;       ERROR RETURN(ERROR MESSAGE NOT PRINTED,JOB NOT STOPPED)\r
1818 ;       OK RETURN\r
1819 \r
1820 INTERNAL IADRCK\r
1821 EXTERNAL JOBPFI,CPOPJ1\r
1822 \r
1823 IADRCK: MOVS TAC1,PROG          ;GET PROTECTION(TO RH)\r
1824         CAILE TAC,JOBPFI        ;ADR. ABOVE PROT. PART OF JOB DATA AREA?\r
1825         CAILE TAC,(TAC1)        ;YES, BELOW OR EQUAL TO PROTECT.?\r
1826         POPJ PDP,               ;NO\r
1827         JRST CPOPJ1             ;YES, SKIP RETURN\r
1828 \f\r
1829 ;ROUTINE TO CHECK VALIDITY OF A DUMP MODE COMMAND LIST\r
1830 ;WHICH IS:\r
1831 ;A LIST OF 0 OR MORE IOWD FORMAT WORDS\r
1832 ; TERMINATED BY A GOTO WORD(LH=0)\r
1833 ; WHICH POINTS TO ANOTHER LIST OF 0 OR MORE IOWD FORMAT WORDS ETC.\r
1834 ; UNTIL A GOTO WORD IS ENTIRELY ZERO\r
1835 ;\r
1836 ;SINCE MONITOR DOES NOT RESCHEDULE WHEN IN EXEC MODE\r
1837 ;A MAXIMUM LIST OF 100 IS IMPOSED\r
1838 \r
1839 ;CALL:  MOVE UUO,[XWD PROG,REL. ADR. OF FIRST COMMAND]\r
1840 ;       PUSHJ PDP,COMCHK\r
1841 ;       ADDRESS CHECK RETURN(ERROR ROUTINE IS NOT CALLED)\r
1842 ;       OK RETURN, SUM OF LH OF IOWDS IN DAT\r
1843 ;       USER ADDRESS OF FIRST IOWD LH PROG IN INDEX FIELD IN UUO\r
1844 ;\r
1845 \r
1846 INTERNAL COMCHK\r
1847 EXTERNAL JOBPFI,USRREL,TPOPJ1,USRHCU\r
1848 \r
1849 COMCHK: PUSH PDP,UUO            ;SAVE POINTER TO LIST\r
1850         PUSH PDP,AC2\r
1851         MOVEI AC1,JOBPFI        ;HIGHEST IO PROTECTED LOC. IN JOB DATA AREA\r
1852         SKIPGE USRHCU           ;IS A SAVE OR GET IN PROGRESS(MAYBE RUN UUO)\r
1853         MOVEI AC1,JOBSAV        ;YES, HIGHEST LOC. NOT WRITTEN BY SAVE\r
1854         SETZB DAT,AC2           ;CLEAR WORD COUNT AND ADDRESS OF FIRST IOWD\r
1855         MOVEI ITEM,100          ;ONLY 100 LISTS\r
1856         SKIPA TAC1,UUO          ;CHECK THE START OF LIST.\r
1857 COMCK0: HRR UUO,TAC1            ;CHANGE COMMAND LIST POINTER ON GO TO WORD\r
1858         HRRZ TAC,TAC1           ;SET UP TAC FOR IADRCK\r
1859         TRNN TAC,777760         ;IS LIST IN THE ACS?\r
1860         JRST COMCK1             ;YES. THAT'S OK.\r
1861         PUSHJ   PDP,IADRCK\r
1862         JRST    COMCKE          ;BAD ADDR.\r
1863 COMCK1: SOJLE ITEM,COMCKE       ;EXCEEDED 100 YET?\r
1864         SKIPN TAC1,@UUO         ;NO. GET NEXT IOWD. END OF LIST?\r
1865         JRST COMCK2             ;YES\r
1866         JUMPG TAC1,COMCK0       ;NO. IS IT A GO TO WORD?\r
1867         HLRE TAC,TAC1           ;NO. SAVE NEGATIVE WORD COUNT\r
1868         HRRZS TAC1              ;GET LOWEST ADDRESS-1\r
1869         CAMGE TAC1,AC1          ;IS IT GREATER THAN LOC. PROTECTED\r
1870                                 ; FROM IO IN JOB DATA AREA?\r
1871         JRST COMCKE             ;NO. ERROR RETURN\r
1872         SUB TAC1,TAC            ;YES. COMPUTE LAST LOC.\r
1873         CAMLE TAC1,USRREL       ;IS LAST LOC. IN BOUNDS?\r
1874         JRST COMCKE             ;NO. ERROR RETURN\r
1875         SUB DAT,TAC             ;YES. ACCUMULATE NEG. WORD COUNT\r
1876         SKIPN AC2               ;IS THIS THE FIRST IOWD?\r
1877         MOVE AC2,UUO            ;YES. SAVE ADDRESS IN AC2\r
1878         AOJA UUO,COMCK1         ;GO GET NEXT IOWD\r
1879 \fCOMCK2:        SKIPE AC2               ;ARE THERE ANY IOWDS WITH LH NOT 0?\r
1880         MOVE UUO,AC2            ;YES, POINT UUO TO FIRST SUCH IOWD.\r
1881         POP PDP,AC2\r
1882         JRST TPOPJ1             ;REMOVE SAVED UUO AND SKIP RETURN\r
1883 \r
1884 \r
1885 COMCKE: POP PDP,AC2\r
1886         POP PDP,UUO             ;RESTORE ORIGINAL UUO\r
1887         POPJ PDP,               ;ERROR RETURN\r
1888 \fINTERNAL ASSASG,FTDISK\r
1889 EXTERNAL SCNON,SCNOFF,PJOBN\r
1890 \r
1891 ;ASSIGN DEVICE IF UNASSIGNED\r
1892 ;CALL:  MOVE ITEM, JOB NUMBER\r
1893 ;       MOVE DEVDAT, ADDR. OF DDB\r
1894 ;       MOVEI TAC1, EITHER ASSPRG OR ASSCON\r
1895 ;       PUSHJ PDP, ASSASG\r
1896 ;       CAN'T ASSIGN RETURN\r
1897 ;       ASSIGNED RETURN\r
1898 \r
1899 \r
1900 ASSASG: IFN FTDISK,<EXTERNAL SETDDB\r
1901                 MOVE TAC,DEVMOD(DEVDAT) ;IS IT A DISK?\r
1902         TLNE TAC,DVDSK\r
1903         PUSHJ PDP,SETDDB        ;YES, BUILD DEVICE DATA BLOCK\r
1904 >\r
1905         NOSCHEDULE              ;DISABLE SCHEDULING\r
1906         LDB TAC,PJOBN           ;GET JOB NUMBER IN DEV DATA BLOCK\r
1907         CAMN TAC,ITEM           ;IS IT ALREADY ASSIGNED TO THIS JOB\r
1908         JRST ASSAS1             ;YES\r
1909         MOVEI TAC, ASSPRG+ASSCON        ;NO, IS IT ASSIGNED TO ANOTHER JOB?\r
1910         CONO PI,SCNOFF          ;TURN SCANNER OFF\r
1911         TDNE TAC, DEVMOD(DEVDAT)        ;ARE EITHER ASSIGNED BITS SET?\r
1912         JRST ASSAS2             ;YES\r
1913         DPB ITEM,PJOBN          ;NO, STORE JOB NUMBER\r
1914 ASSAS1: IORM TAC1,DEVMOD(DEVDAT)        ;SET ONE OF ASSIGN BITS\r
1915         AOS (PDP)\r
1916 ASSAS2: CONO PI,SCNON           ;TURN SCANNER CHAN. BACK ON\r
1917         SCHEDULE                ;SCHEDULING\r
1918         POPJ PDP,\r
1919 \f;ROUTINE TO SEARCH FOR A DEVICE\r
1920 ;CALL:  HRR ITEM,JOB NUMBER\r
1921 ;       MOVE TAC,[SIXBIT .DEVICE NAME.]\r
1922 ;       PUSHJ PDP, DEVSRC\r
1923 ;       NOT FOUND\r
1924 ;       FOUND\r
1925 \r
1926         INTERNAL DEVLG,DEVSRC,DEVPHY\r
1927         EXTERNAL SYSTAP,DEVOPR,TTYFND,CPOPJ1,DEVLST,PJOBN,GETDDB\r
1928 \r
1929 DEVSRC:\r
1930 IFN FTLOGIN,<\r
1931         MOVSI   DEVDAT,JLOG     ;DO NOT ALLOW LOGICAL NAMES IF THE JOB IS NOT\r
1932                                 ; NOT LOGGED IN OR IS IN THE PROCESS OF BEING LOGGED OUT\r
1933         TDNE DEVDAT,JBTSTS(ITEM)        ;OTHERWISE USER CAN RUN OWN LOGOUT PROGRAM\r
1934                                 ; JLOG SET TO 0 IN COMMAND DECODER ON KJOB\r
1935 >\r
1936         PUSHJ PDP, DEVLG        ;SEARCH LOGICAL NAMES FIRST\r
1937         JRST DEVPHY             ;NOT FOUND, SEARCH PHYSICAL NAMES\r
1938         JRST CPOPJ1             ;FOUND\r
1939 \r
1940 ;SEARCH LOGICAL NAMES\r
1941 \r
1942 DEVLG:  HLRZ DEVDAT,DEVLST      ;BEGINNING OF DDB CHAIN\r
1943 DEVLP0: CAME TAC,DEVLOG(DEVDAT) ;COMAPRE WITH LOGICAL NAME\r
1944         JRST DEV0               ;NO MATCH\r
1945         LDB TAC1,PJOBN          ;DOES THE LOGICAL NAME BELONG TO THIS JOB?\r
1946         CAMN TAC1,ITEM\r
1947         JUMPN TAC,CPOPJ1        ;YES, GIVE SUCCESSFUL RET. IF NAME NOT 0\r
1948 DEV0:   HLRZ DEVDAT,DEVSER(DEVDAT)      ;NO, KEEP LOOKING\r
1949         JUMPN DEVDAT,DEVLP0\r
1950         POPJ PDP,               ;FINISHED AND NOT FOUND\r
1951 \f\r
1952 ;SEARCH PHYSICAL NAMES\r
1953 \r
1954 DEVPHY: CAMN TAC,[SIXBIT /OPR/] ;IS IT "OPR"?\r
1955         MOVE TAC,DEVOPR         ;YES, CHANGE TO OPERATOR'S TTY\r
1956         CAMN TAC,[SIXBIT /SYS/] ;IS IT "SYS"?\r
1957         SKIPA TAC,SYSTAP        ;YES, CHANGE TO SYSTEM TAPE DEVICE NAME\r
1958         TDZA TAC1,TAC1          ;NO, CLEAR SYSTEM TAPE FLAG\r
1959         MOVEI TAC1,SYSDEV       ;YES, SET SYSTEM TAPE FLAG\r
1960         HLRZ DEVDAT,DEVLST      ;SEARCH DEVICE DATA BLOCKS\r
1961 DEVLP1:\r
1962         TLO DEVDAT,(TAC1)       ;SET SYSTEM TAPE BIT IF SEARCHING FOR SYS\r
1963         CAMN TAC,DEVNAM(DEVDAT) ;MATCH OF PHYSICAL NAME?\r
1964         JUMPN TAC,CPOPJ1        ;YES, GIVE OK RET. IF NAME IS NOT 0\r
1965         HLRZ DEVDAT,DEVSER(DEVDAT)\r
1966         JUMPN DEVDAT,DEVLP1\r
1967         CAME TAC,[SIXBIT /TTY/] ;IS THIS PUBLIC LOGICAL NAME TTY?\r
1968         JRST    GETDDB          ;SEE IF IT'S A TTY.\r
1969         PUSH PDP,DAT            ;SAVE OUTPUT BYTE POINTER(TTY) OR INIT. ARG. ADR.\r
1970         PUSHJ PDP,TTYFND        ;YES, FIND TTY JOB IS ATTACHED TO\r
1971         POP PDP,DAT             ;RESTORE\r
1972         JRST CPOPJ1             ;AND GIVE SUCCESSFUL RETURN\r
1973 \f;ROUTINE TO SETUP N-RING IO BUFFER IN USER AREA\r
1974 \r
1975 ;CALL:  PUSHJ PDP,BUFCLC\r
1976 ,       EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED\r
1977 , SETS UP AN N BUFFER RING FOLLOWING THE USER'S PROGRAM, WHERE N\r
1978 , IS IN THE ADDRESS FIELD OF AC UUO.\r
1979 , THE BUFFER RING FORMAT IS AS FOLLOWS:\r
1980 ,       LOCATION                LH   CONTENTS   RH\r
1981 , C(JOBFF) + 1              BUFFER         C(JOBFF) +1\r
1982 ,    + 0(BUFFER SIZE+2)      SIZE               + 1(BUFFER SIZE+2)\r
1983 , C(JOBFF) +1               BUFFER         C(JOBFF) +1\r
1984 ,     +1(BUFFER SIZE+2)      SIZE                + 2(BUFFER SIZE+2)\r
1985 ,         .             .                    .\r
1986 ,       .               .                    .\r
1987 ,       .               .                    .\r
1988 , C(JOBFF) + 1          BUFFER     C(JOBFF) + 1\r
1989 ,    + (N-2)(BUFFER SIZE+2)  SIZE               +(N-1)(BUFFER SIZE+2)\r
1990 , C(JOBFF) + 1          BUFFER     C(JOBFF) + 1\r
1991 ,    + (N-1)(BUFFER SIZE+2)  SIZE                  \r
1992 ,THEN SET       BUFPNT:=IOUSE,C(JOBFF) + 1\r
1993 , AND           JOBFF:=C(JOBFF) + N(BUFFER SIZE + 2)\r
1994 , BUFWRD IS RESTORED.\r
1995         INTERNAL BUFCLC\r
1996         EXTERNAL JOBFF\r
1997 \r
1998 BUFCLC: PUSH PDP,BUFWRD         ;SAVE BUFWRD ON STACK\r
1999         LDB TAC,[POINT 12,DEVCHR(DEVDAT),35];TAC:=BUFFER SIZE\r
2000         HRRZ BUFPNT,JOBFF(PROG) ;BUFPNT:=FIRST FREE LOCATION + 1\r
2001         ADDI BUFPNT,1\r
2002         HRRZ BUFWRD,BUFPNT\r
2003         HRLI BUFPNT,PROG\r
2004         HRL BUFWRD,TAC          ;BUFWRD:=BUFFER SIZE,FIRST FREE LOC + 1\r
2005         ADDI TAC,2              ;TAC:=BUFFER SIZE + 2\r
2006         HRRZ TAC1,UUO           ;TAC1:=N=ADDRESS FIELD OF AC UUO\r
2007         HRRZ AC1,TAC            ;BUFFER SIZE+2\r
2008         IMUL AC1,TAC1           ;TIME NO. OF BUFFERS\r
2009         ADD AC1,BUFWRD          ;LOC. OF FIRST BUFFER\r
2010         HRRZ AC1,AC1            ;MAKE SURE POSITIVE\r
2011         CAMG AC1,USRREL         ;WILL THIS SPACE FIR IN USER CORE?\r
2012         JRST BUFC1              ;YES, FO DO INBUF CODE\r
2013                                 ; NO, AUTOMATICALLY EXPAND SIZE OF USER CORE\r
2014 \f       PUSH PDP,TAC            ;SAVE A BUNCH OF ACS USED IN CORE AND IO WAIT\r
2015         PUSH PDP,UUO\r
2016         PUSH PDP,TAC1\r
2017         PUSH PDP,BUFPNT\r
2018         PUSH PDP,BUFWRD\r
2019         PUSH PDP,DEVDAT\r
2020         PUSH PDP,DSER\r
2021         MOVE ITEM,JOB           ;CURRENT JOB NUMBER\r
2022         MOVE TAC,AC1            ;HIGHEST USER ADR. TO TRY FOR\r
2023         MOVEI UUO,UUO           ;SET INDEX FIELD TO 0, SO STOTAC WILL STORE\r
2024                                 ; NO. OF K CORE AVAILABLE IN EXEC AC UUO INSTEAD\r
2025                                 ; OF USER'S AC UUO\r
2026         PUSHJ PDP,CORUUO        ;TRY TO ASSIGN CORE\r
2027         JFCL                    ;ERROR RETURN-LET ADR CHECK HAPPEN AND STOP JOB\r
2028         POP PDP,DSER\r
2029         POP PDP,DEVDAT\r
2030         POP PDP,BUFWRD\r
2031         POP PDP,BUFPNT\r
2032         POP PDP,TAC1\r
2033         POP PDP,UUO\r
2034         POP PDP,TAC\r
2035 BUFC1:  ADD BUFWRD,TAC          ;BUFWRD:=C(BUFWRD) + C(TAC)\r
2036         HRRZ AC1,BUFPNT         ;IS LAST ADDR IN BOUNDS?\r
2037         PUSHJ PDP,UADRCK\r
2038         MOVEM BUFWRD,@BUFPNT    ;BUFFER HEADER+1:=C(BUFWRD)\r
2039         HRR BUFPNT,BUFWRD       ;BUFPNT 18-35:=C(BUFWRD 18-35)\r
2040         SOJG TAC1,BUFC1         ;N:=N-1.  IS N GR 0?\r
2041         HRR BUFWRD,JOBFF(PROG)\r
2042         ADDI BUFWRD,1\r
2043         MOVEI AC1,-2(BUFPNT)    ;CHECK LAST ADR. OF HEADER\r
2044         PUSHJ PDP,UADRCK\r
2045         SUB BUFPNT,TAC\r
2046         MOVEM BUFWRD,@BUFPNT    ;LINK LAST BUFFER TO FIRST BUFFER\r
2047         ADDI BUFPNT,-1(TAC)\r
2048         HRRM BUFPNT,JOBFF(PROG) ;JOBFF:=C(JOBFF)+1+N(BUFFER SIZE+2)\r
2049         HRR BUFPNT,BUFWRD       ;BUFPNT:=IOUSE,ADDRESS OF FIRST BUFFER\r
2050                                 ; IN RING.\r
2051         HRLI BUFPNT,IOUSE\r
2052         POP PDP,BUFWRD          ;RESTORE BUFWRD FROM STACK.\r
2053         POPJ PDP,               ;RETURN\r
2054 \f;ROUTINE TO CLEAR IO BUFFER IN USER AREA\r
2055 ;CALLED AT INTERRUPT AND UUO LEVEL\r
2056 \r
2057 ;CALL:  HRRZ TAC,REL. ADR. OF 2ND WORD OF USER BUFFER\r
2058 ;       PUSHJ PDP,BUFCLR\r
2059 ;       ERROR RETURN MEMORY EXCEEDED\r
2060 ,       EXIT            RETURNS HERE IF MEMORY NOT EXCEEDED\r
2061 , CLEARS THE WORD COUNT AND DATA AREA OF THE BUFFER WHOSE ADDRESS\r
2062 , IS IN TAC 18-35.\r
2063 \r
2064         INTERNAL BUFCLR\r
2065         EXTERNAL TPOPJ,CPOPJ1\r
2066 \r
2067 BUFCLR: PUSHJ PDP,IADRCK        ;IN BOUNDS?\r
2068         POPJ PDP,               ;NO. ERROR RETURN\r
2069         HRLI TAC,PROG\r
2070         PUSH PDP,TAC            ;SAVE FIRST BUFFER ADR.\r
2071         HLRZ TAC1,@TAC          ;TAC1 18-35=SIZE\r
2072         TRZ TAC1,400000\r
2073         ADD TAC,TAC1            ;LAST ADR=2ND ADR+SIZE\r
2074         TLZ TAC,-1              ;CLEAR LEFT HALF\r
2075         PUSHJ PDP,IADRCK        ;LAST ADDRESS IN BOUNDS?\r
2076         JRST TPOPJ              ;NO. ERROR RETURN\r
2077         HRLI TAC,PROG           ;SET LAST ADR. FOR RELOC.\r
2078         POP PDP,TAC1            ;RESTORE FIRST ADR.\r
2079         NOSHUFF                 ;NO SHUFFLING\r
2080         MOVEI TAC1,@TAC1        ;ABS. ADR. OF 2ND WORD OF BUFFER\r
2081         HRL TAC1,TAC1\r
2082         AOBJN TAC1,.+1          ;THIRD WORD IN BUFFER\r
2083         SETZM (TAC1)            ;CLEAR THIRD WORD\r
2084         AOS TAC1                ;SET DEST. ADR. TO 4TH WORD\r
2085         BLT TAC1,@TAC           ;CLEAR BUFFER\r
2086         SHUFFLE                 ;SHUFFLING\r
2087         JRST CPOPJ1             ;SUCESSFUL RETURN\r
2088 \f\r
2089 ;ROUTINE TO COMPUTE 12 BIT FOLDED CHECKSUM\r
2090 \r
2091 ;CALL:  PUSHJ PDP,CKS12\r
2092 ,       EXIT            ALWAYS RETURNS HERE\r
2093 ,CALCULATES FOLDED 12 BIT CHECKSUMS OF THE DATA WORDS IN THE\r
2094 ,BUFFER WHOSE ADDRESS IS IN AC TAC1.  TWO ALGORITHMS ARE USED.\r
2095 ,ON RETURN, THE LEFT HALF OF AC TAC CONTAINS A CHECKSUM OBTAINED\r
2096 ,BY ACCUMULATING, IN ONE'S COMPLEMENT, THE DATA WORDS AND FOLDING IT.\r
2097 ,THE LEFT HALF OF AC DAT CONTAINS A CHECKSUM OBTAINED BY ACCUMULATING,\r
2098 ,IN TWO'S COMPLEMENT, THE DATA WORDS AND FOLDING IT.  AC TAC1\r
2099 ,CONTAINS A 1.\r
2100 \r
2101         INTERN CKS12\r
2102 \r
2103 CKS12:  ADD TAC1,PROG           ;TAC1:=-WORD COUNT,ADDRESS OF FIRST DATA WORD\r
2104         AOS TAC1\r
2105         HRRZ TAC,0(TAC1)\r
2106         MOVNS TAC\r
2107         AOS TAC1\r
2108         HRL TAC1,TAC\r
2109         CLEARM TAC              ;INITIALIZE TWO'S COMPLEMENT SUM\r
2110 CKS12A: ADD TAC,0(TAC1)         ;TWO'S COMPLEMENT ADD\r
2111         AOBJN TAC1,CKS12A       ;DONE?\r
2112         LSHC TAC,-30\r
2113         LSH TAC1,-14\r
2114         ADD TAC,TAC1\r
2115         LSHC TAC,-14\r
2116         LSH TAC1,-30\r
2117         ADD TAC,TAC1\r
2118         TRZE TAC,770000\r
2119         AOS TAC\r
2120         HRLZS TAC\r
2121         MOVEI TAC1,1            ;TAC1:=1\r
2122         POPJ PDP,\r
2123 \f;ROUTINE TO CLEAR RESIDUE OF WORD POINTED TO BY A BYTE POINTER\r
2124 \r
2125 ;CALL:  PUSHJ PDP,CLRBYT\r
2126 ,       EXIT            ALWAYS RETURNS HERE\r
2127 ,CALLED WITH A BYTE POINTER IN AC TAC, IT CLEARS THE REST OF THE\r
2128 ,WORD POINTED TO BY THE BYTE POINTER.\r
2129 \r
2130         INTERNAL CLRBYT\r
2131 \r
2132 CLRBYT: LDB TAC1,[POINT 6,TAC,5]        ;TAC1:=P\r
2133         DPB TAC1,[POINT 12,TAC,11]      ;TAC 0-5:=0,TAC 6-12:=P\r
2134         SETZM TAC1\r
2135         DPB TAC1,TAC            ;CLEAR BITS 36-P THROUGH 35\r
2136         POPJ PDP,               ;RETURN\r
2137 \r
2138 ;ROUTINE TO PUT EVEN PARITY IN ( OR TAKE IT OUT OF ) BIT 28 OF\r
2139 ;AC TEM. ASSUMING CHARACTER IS IN BITS 28-35 OF TEM, REST CLEAR.\r
2140 ;TAC IS DESTROYED. CALLED FROM PTP AND TTY SERVICE ROUTINES\r
2141 \r
2142 ;CALL:  PUSHJ   PDP,PEVEN8\r
2143 ;       EXIT HERE WITH TEM SET TO EVEN PARITY\r
2144 \r
2145         INTERNAL PEVEN8\r
2146 \r
2147 PEVEN8: MOVE    TAC,TEM         ;COPY ORIGINAL CHARACTER\r
2148         IMULI   TAC,200401      ;MAKE THREE COPIES OF THE CHAR\r
2149         AND     TAC,[OCT 11111111]      ;GET THE BITS INDIVIDUALLY\r
2150         IMUL    TAC,[OCT 11111111]      ;ADD UP THE BITS\r
2151         TLNE    TAC,10          ;TEST THE PARITY OF THE SUM\r
2152         TRC     TEM,200         ;IT WAS ODD. MAKE IT EVEN.\r
2153         POPJ    PDP,0           ;RETURN\r
2154 \f;ROUTINE TO RELEASE ALL DEVICES ASSIGNED TO JOB\r
2155 \r
2156 INTERNAL IORELS\r
2157 EXTERNAL PUUOAC\r
2158 \r
2159 \r
2160 IORELS: MOVEI TAC,RELEA3        ;RELEASE ALL IO DEVICES(DON'T CLOSE)\r
2161 \r
2162 ;ROUTINE TO DO IO FOR ALL DEVICES ASSIGNED TO JOB\r
2163 ;CALL   MOVEI TAC,ADR. OF IO SUB.\r
2164 ;       PUSHJ PDP,IOALL\r
2165 ;       RETURNS WITH ITEM=CURRENT JOB # ,UUO PRESERVED\r
2166 \r
2167 INTERNAL IOALL\r
2168 EXTERNAL TPOPJ,USRHCU,USRJDA\r
2169 \r
2170 IOALL:  PUSH PDP,TAC            ;SAVE ADR. OF SUB.\r
2171         PUSH PDP,UUO            ;SAVE UUO\r
2172         SETZB UCHN,UUO          ;START WITH USER CHANNEL 0\r
2173 IOALL1: CAMLE UCHN,USRHCU       ;IS IT GREATER THAN HIGHEST CHAN. USED?\r
2174         JUMPN UCHN,IOALL2       ;YES - RETURN\r
2175                                 ; IF USRCHU IS NEG - ASSUME SAVGET\r
2176                                 ; WHICH USES CHANNEL 0\r
2177         SKIPN DEVDAT,USRJDA(UCHN)       ;GET NEXT DDB ADR., IS IT IN USE?\r
2178         AOJA UCHN,IOALL1        ;NO, KEEP GOING\r
2179         MOVE IOS,DEVIOS(DEVDAT)\r
2180         DPB UCHN,PUUOAC\r
2181         MOVE DSER,DEVSER(DEVDAT)        ;SETUP ADR. OF DEV. DISP. TABLE\r
2182         LDB TAC,PJOBN           ;GET JOB NUMBER WHICH JOB IS ASSIGNED TO\r
2183         CAMN TAC,JOB            ;IS IT SAME AS CURRENT JOB(SHOULD BE EXCEPT FOR 140\r
2184                                 ; RESTART WHILE THIS JOB WAS SWAPPED OUT)\r
2185                                 ; DEVICE DATA BLOCKS JOB NUMBERS ARE SET TO 0 ON\r
2186                                 ; 140 RESTART,BUT THE JOB DATA AREA DEVICE ASSIGNMENTS\r
2187                                 ; FOR SWAPPED OUT JOBS HAVE NOT\r
2188         PUSHJ PDP,@-1(PDP)      ;YES,CALL THE SUB.\r
2189         AOJA UCHN,IOALL1        ;INCREMENT USER CHAN. NO.\r
2190 IOALL2: POP PDP,UUO             ;RESTORE UUO & RETURN RESTORING TAC TOO\r
2191         MOVE ITEM,JOB           ;GET JOB NO.\r
2192         JRST TPOPJ\r
2193 \r
2194 \r
2195 ;WAIT TILL ALL DEVICES ARE INACTIVE\r
2196 \r
2197 INTERNAL IOWAIT\r
2198 \r
2199 IOWAIT: MOVEI TAC,WAIT1\r
2200         JRST IOALL\r
2201 \f\r
2202 ;KILL ALL DEVICES(RELEASE WITHOUT WAITING FOR DEVICE INACTIVE)\r
2203 \r
2204 INTERNAL IOKILL\r
2205 \r
2206 IOKILL: MOVEI TAC,RELEA5\r
2207         PUSHJ PDP,IOALL         ;RELEASE ALL DEVICES WITHOUT WAITING\r
2208 \r
2209 ;ROUTINE TO CLEAR PROTECTED JOB DATA AREA IN MONITOR\r
2210 ;AND RECLAIM FREE AREA ABOVE USER PROGRAM FOR IO BUFFERS\r
2211 ;CALL:  MOVE JDAT,ADR. OF CURRENT JOB DATA AREA\r
2212 ;       PUSHJ PDP,SETUSR\r
2213 \r
2214 INTERNAL SETUSR,CLRUSR\r
2215 EXTERNAL USRLO1,USRLO,USRHI,JOBSA,JOBFF\r
2216 EXTERNAL JOBENB,USRHCU\r
2217 \r
2218 SETUSR: HLRZ TAC,JOBSA(JDAT)    ;RESET FIRST FREE LOC. FOR THIS JOB\r
2219         MOVEM TAC,JOBFF(JDAT)\r
2220 CLRUSR: SETZM JOBENB(JDAT)      ;INITIALIZE APR TRAPPING (I.E., NONE)\r
2221         MOVEI TAC,USRLO1        ;FIRST LOC+1 TO CLEAR\r
2222         HRLI TAC,USRLO          ;FIRST LOC.\r
2223         SETZM USRLO\r
2224         BLT TAC,USRHI\r
2225         SETZM USRHCU            ;CLEAR HIGHEST USER IO CHAN. IN USE\r
2226         POPJ PDP,\r
2227 \f\r
2228 ;ROUTINE TO FLAG DEVICE ACTIVE\r
2229 ;CALL   MOVE IOS,IO STATUS BITS\r
2230 ;       MOVE DEVDAT,ADDRESS OF DEVICE DATA BLOCK\r
2231 ;       PUSHJ PDP,SETACT\r
2232 ;CALLED BY ALL IO SERVICE ROUTINES AT UUO AND INTERRUPT LEVELS\r
2233 \r
2234 INTERNAL SETACT,CLRACT,STOIOS,ORACT\r
2235 EXTERNAL PDVTIM,PDVCNT\r
2236 \r
2237 ORACT:  TRO IOS,IOACT\r
2238         IORB IOS,DEVIOS(DEVDAT)\r
2239         JRST ORACT1\r
2240 SETACT: TRO IOS,IOACT\r
2241         TLZA    IOS,IOW\r
2242 CLRACT: TRZ IOS,IOACT\r
2243 STOIOS: MOVEM IOS,DEVIOS(DEVDAT)\r
2244 ORACT1: LDB TAC,PDVTIM          ;GET NO. OF SECONDS\r
2245         DPB TAC,PDVCNT          ;TO WAIT BEFORE\r
2246         POPJ PDP,               ;DEVICE IS CONSIDERED HUNG\r
2247 \r
2248 INTERNAL DEVCHK\r
2249 EXTERNAL HNGTIM,HNGSEC,DEVLST\r
2250 \r
2251 DEVCHK: MOVEI TAC,HNGSEC        ;RESET HUNG DEVICE CHECK TIME\r
2252         MOVEM TAC,HNGTIM        ;TO CHECK ONCE A SECOND\r
2253         HLRZ DEVDAT,DEVLST\r
2254 DEVCK0: MOVE IOS,DEVIOS(DEVDAT) ;IS DEVICE ACTIVE?\r
2255         TRNN IOS,IOACT\r
2256         JRST DEVCK1             ;NO\r
2257         LDB TAC,PDVCNT          ;YES,DECREMENT\r
2258         SOJL TAC,DEVCK1         ;0 MEANS IGNORE DEVICE\r
2259         DPB TAC,PDVCNT\r
2260         JUMPN TAC,DEVCK1        ;HAS COUNT GONE TO 0?\r
2261         MOVE DSER,DEVSER(DEVDAT);YES, GET DISPATCH TABLE ENTRY\r
2262         PUSH PDP,DEVDAT\r
2263         PUSHJ PDP,DHNG(DSER)    ;DISPATCH TO SERVICE ROUTINES TO \r
2264                                 ; UNHANG DEVICE\r
2265         PUSHJ PDP,DEVHNG        ;PRINT ERROR MESSAGE AND STOP JOB\r
2266         POP PDP,DEVDAT          ;DO NOT PRINT MESS. AND STOP JOB RETURN\r
2267 DEVCK1: HLRZ DEVDAT,DEVSER(DEVDAT)\r
2268         JUMPN DEVDAT,DEVCK0\r
2269         POPJ PDP,\r
2270 \f;ROUTINE TO SETUP PROG AND ITEM FOR INTERRUPT SERVICE ROUTINE\r
2271 \r
2272 ;CALL   PUSHJ PDP,IOSET\r
2273 ,       EXIT    ALWAYS RETURNS HERE\r
2274 ,THIS PROGRAM IS CALLED FROM AN INTERRUPT SERVICE ROUTINE.\r
2275 ,IT PUTS THE ADDRESS OF THE DATA AREA OF THE JOB (C(JBTADR18-35))\r
2276 ,CONNECTED TO THE DEVICE SPECIFIED BY AC DEVDAT IN AC PROG AND\r
2277 ,PUTS THE ITEM POINTER (C(DEVCTR)) IN AC ITEM.\r
2278 \r
2279         INTERNAL IOSET\r
2280         EXTERNAL PJOBN,JBTADR\r
2281 \r
2282 IOSET:  LDB PROG,PJOBN\r
2283         MOVE ITEM,DEVCTR(DEVDAT)        ;ITEM:=ITEM POINTER=C(DEVCTR)\r
2284         MOVE PROG,JBTADR(PROG)  ;PROG:=C(JBTADR 18-35)\r
2285         MOVE IOS,DEVIOS(DEVDAT) ;GET IO STATUS FROM THE DDB\r
2286         POPJ PDP,               ;RETURN\r
2287 \r
2288 ,CALLING SEQUENCE\r
2289 ,       PUSHJ PDP,IOSETC\r
2290 ,       EXIT            ALWAYS RETURNS HERE\r
2291 \r
2292 ,SETS JBFPTR18-35:=C(TAC1 18-35)\r
2293 ,       JBFCTR:=C(ITEM)*[WORD LENGTH/BYTE SIZE]\r
2294 ,WHERE  WORD LENGTH:=36 DECIMAL\r
2295 ,       BYTE SIZE:=C(JBFPTR6-11)\r
2296 ,       [X]:= INTEGER PART OF X\r
2297 \r
2298 \r
2299         INTERN IOSETC\r
2300 \r
2301 \r
2302 IOSETC: ADDI JBUF,1             ;JBFPTR12-18:=0\r
2303         HRLZI TAC,7777          ;JBFPTR18-35:=C(TAC1 18-35)+1\r
2304         ANDM TAC,@JBUF\r
2305         HRRM TAC1,@JBUF\r
2306         AOS @JBUF\r
2307         LDB TAC1,[POINT 6,@JBUF,11]     ;TAC1:=BYTE SIZE\r
2308         PUSHJ PDP,ITMCT1        ;JBFCTR:=C(ITEM)*[36/BYTE SIZE]\r
2309         ADDI JBUF,1\r
2310         MOVEM ITEM,@JBUF\r
2311         POPJ PDP,               ;EXIT\r
2312 \f;ROUTINE TO RETURN NO. OF ITEMS IN BUFFER\r
2313 \r
2314 ;CALL:  PUSHJ PDP,ITMSET\r
2315 ,       EXIT            ALWAYS RETURNS HERE\r
2316 ,SETS AC ITEM:=(BUFFER SIZE-1)*[WORD LENGTH/BYTE SIZE]\r
2317 ,WHERE BUFFER SIZE:=BITS 1-17 OF THE BUFFER HEADER WORD POINTED TO\r
2318 ,               BY C(DEVADR)\r
2319 ,       WORD LENGTH:=36 DECIMAL\r
2320 ,       BYTE SIZE:=INTEGER PART OF X.\r
2321 \r
2322 ,CALLING SEQUENCE\r
2323 ,       PUSHJ PDP,ITMCNT\r
2324 ,       EXIT            ALWAYS RETURNS HERE\r
2325 ,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/BYTE SIZE]\r
2326 \r
2327 ,CALLING SEQUENCE\r
2328 ,       PUSHJ PDP,ITMCT1\r
2329 ,       EXIT            ALWAYS RETURNS HERE\r
2330 ,SETS AC ITEM:=C(ITEM)*[WORD LENGHT/C(TAC1)]\r
2331 \r
2332         INTERN ITMSET,ITMCNT,ITMCT1\r
2333 ITMSET: LDB ITEM,[POINT 17,@DEVADR(DEVDAT),17];ITEM:=BUFFER SIZE-1\r
2334         SUBI ITEM,1\r
2335 ITMCNT: LDB TAC1,[POINT 6,DEVPTR(DEVDAT),11];TAC1:=BYTE SIZE\r
2336 ITMCT1: MOVEI TAC,44            ;ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)]\r
2337         IDIV TAC,TAC1\r
2338         IMUL ITEM,TAC\r
2339         POPJ PDP,\r
2340 \f;ROUTINE TO SET DEVICE STATUS WORD FROM UUO\r
2341 ;AND SETUP IOS\r
2342 \r
2343 INTERNAL SETIOS\r
2344 \r
2345 SETIOS: PUSHJ   PDP,WAIT1       ;WAIT FOR DEVICE (INCLUDING TTY\r
2346                                 ; MONITOR COMMAND RESPONSE WHEN\r
2347                                 ; USER INITS TTY)\r
2348 \r
2349         PUSHJ   PDP,CHKMOD      ;CHECK FOR LEGAL MODE, IF NOT RIGHT DONT RETURN\r
2350         TRZ UUO,IOACT           ;LET USER SET ALL BITS EXCEPT IOACT\r
2351         HRRM UUO,DEVIOS(DEVDAT)\r
2352         POPJ PDP,\r
2353 \r
2354 \r
2355 \r
2356 ;CHECK FOR A LEGAL MODE FOR DEVICE\r
2357 CHKMOD:         LDB TAC1,[POINT 4,UUO,35]       ;GET DEVICE DATA MODE\r
2358         MOVEI TAC,1             ;AND CHECK FOR LEGALITY\r
2359         LSH TAC,(TAC1)\r
2360         TDNN TAC,DEVMOD(DEVDAT)\r
2361         JRST ILLMOD             ;ILLEGAL MODE\r
2362         POPJ    PDP,            ;OK\r
2363 \r
2364 \r
2365 ;SETUP BYTE POINTER AND ITEM COUNT\r
2366 ;CALL   PUSHJ PDP,NEWBUF\r
2367 ;       ADDRESS CHECK WHEN SETTING UP BUFFER\r
2368 ;       OK RETURN\r
2369 \r
2370 \r
2371 \r
2372 EXTERNAL CPOPJ1\r
2373 INTERNAL NEWBUF,NEWBF1\r
2374 \r
2375 NEWBF1:\r
2376 NEWBUF: HRRZ TAC,DEVADR(DEVDAT) ;TAC:=INPUT BUFFER HEADER ADDRESS\r
2377         PUSHJ PDP,BUFCLR        ;CLEAR INPUT BUFFER.\r
2378         POPJ PDP,               ;ADDRESS CHECK\r
2379         HRLZI TAC,7737\r
2380         AND TAC,DEVPTR(DEVDAT)  ;DEVPTR 0-5:=0, DEVPTR 12:=0\r
2381         HRR TAC,DEVADR(DEVDAT)  ;DEVPTR 18-35:=C(DEVADR 18-35) + 1\r
2382         AOS TAC\r
2383         MOVEM TAC,DEVPTR(DEVDAT)\r
2384         PUSHJ PDP,ITMSET        ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]\r
2385         MOVEM ITEM,DEVCTR(DEVDAT)       ;DEVCTR:=ITEM COUNT\r
2386         JRST CPOPJ1             ;RETURN\r
2387 \f;ROUTINE TO SETUP BYTE POINTER ACCORDING TO DATA MODE\r
2388 \r
2389 ;CALL:  PUSHJ PDP,SETBYT\r
2390 ,       EXIT            ALWAYS RETURNS HERE\r
2391 ,SETS   TAC 0-5:=0\r
2392 ,       TAC 6-11:=S\r
2393 ,       TAC 12-13:=0\r
2394 ,       TAC 14-17:=PROG\r
2395 ,WHERE S=36 IF DATA MODE (IOS 32-25) IS BINARY (B)\r
2396 ,       IMAGE (I), IMAGE BINARY (IB), OR DUMP (SD,D,DR)\r
2397 ,      S=7  IF DATA MODE IS     ASCII PACKED (A)\r
2398 ,                       ASCII LINE (AL)\r
2399 ,                       ASCII SEQUENCED (AS)\r
2400 ,                       ASCII SEQUENCED LINE (ASL)\r
2401 ,               OR      ALTERNATE MODE BREAK (AM)\r
2402 \r
2403         INTERN SETBYT\r
2404 \r
2405 SETBYT: TRNN IOS,14             ;IS MODE LESS THAN 10?\r
2406         HRLI TAC,700+PROG       ;YES,ASCII OR ASCII LINE\r
2407         TRNE IOS,14             ;10 OR GREATER?\r
2408         HRLI TAC,4400+PROG      ;YES, IMAGE,IMAGE BIN. OR BIN.\r
2409         POPJ PDP,\r
2410 \f;ROUTINE TO STORE DATA IN IOBUFFER FOR INPUT CHAR. AT A TIME DEVICES\r
2411 \r
2412 ;CALL:  PUSHJ PDP,STODAT\r
2413 ,       EXIT1           CHECKSUM ERROR\r
2414 ,       EXIT2           BLOCK FULL OR BLOCK COMPLETE\r
2415 ,       EXIT3           DATA STORED CORRECTLY\r
2416 ,CALLED FROM AN INPUT SERVICE ROUTINE WITH A DATA ITEM IN AC DAT.\r
2417 ,STORES THE DATA ITEM IN THE BUFFER, CHECKING TO SEE IF IT WERE\r
2418 ,THE FIRST ITEM ON THE BUFFER AND SETTING UP THE POINTER AND\r
2419 ,WORD COUNT APPROPRIATELY CHECKING THE MODE TO SEE IF ANY SPECIAL\r
2420 ,PROCESSING NEED BE DONE. FOR EXAMPLE, THE TERMINATION\r
2421 ,OF A BUFFER ON CERTAIN CHARACTERS IN OTHER MODES, OR IF THE BUFFER\r
2422 ,IS FULL.  THERE ARE THREE RETURNS FROM THIS ROUTINE: THE FIRST\r
2423 ,RETURN OCCURS ON AN ERROR CONDITION, THE SECOND RETURN OCCURS\r
2424 ,ON A BLOCK FULL CONDITION OR BLOCK COMPLETE CONDITION, THE THIRD\r
2425 ,RETURN OCCURS ON THE DATA STORED CORRECTLY CONDITION.  THIS\r
2426 ,ROUTINE ALSO DOES SOME CHECKING ON INPUT OF BINARY RECORD,\r
2427 ,PAPER TAPE OR CARDS.\r
2428 ,CALLING SEQUENCE\r
2429 ,       PUSHJ PDP,STOSQD\r
2430 ,       XXXX            ALWAYS SKIPS \r
2431 ,       EXIT            ALWAYS RETURNS HERE\r
2432 ,STORES THE WORD COUNT:=C(DEVPTR 18-35) -C(DEVIAD 18-35) - 1\r
2433 ,IN THE BUFFER.\r
2434 \f       INTERN STODAT, STOSQD\r
2435         EXTERNAL PIOMOD,CPOPJ,CPOPJ1,CPOPJ2\r
2436 \r
2437 STODAT: TLNN IOS,IOFST          ;IS THIS FIRST ITEM OF BUFFER?\r
2438         JRST STO0               ;NO\r
2439         PUSHJ PDP,NEWBUF        ;SET UP A NEW BUFFER. ITEM:=(BUFFER \r
2440                                 ; SIZE - 1)*[36/BYTE SIZE]\r
2441         POPJ PDP,\r
2442 STO0:   LDB TAC1,PIOMOD         ;DATA MODE\r
2443         CAIN TAC1,B             ;MODE=BINARY?\r
2444         JRST STOBIN\r
2445         TLZ IOS,IOFST\r
2446 STO1:   IDPB DAT,DEVPTR(DEVDAT) ;STORE DATA IN BUFFER.\r
2447         CAIE TAC1,A             ;MODE=ASCII, IMAGE, OR BINARY?\r
2448         CAIN TAC1,I\r
2449         JRST STOAIB\r
2450         CAIE TAC1,IB            ;IMAGE BINARY?\r
2451         CAIN TAC1,B             ;CHECKSUM BINARY?\r
2452         JRST STOAIB             ;YES\r
2453         ANDI    DAT,177         ;NO, MUST BE ASCII LINE MODE.\r
2454         CAIG     DAT,14         ;LINE FEED,FORM FEED, OR VERTICAL TAB?\r
2455         CAIGE   DAT,12\r
2456         JRST .+2                ;NO\r
2457         JRST STOSQF             ;YES\r
2458         SOJGE ITEM,CPOPJ2       ;ITEM:=C(ITEM)-1. IS C(ITEM) GR OR=0?\r
2459 STOE1:  TRO IOS,IOBKTL  ;IOBKTL:=1\r
2460         POPJ    PDP,\r
2461 STOAIB: SOJG ITEM,CPOPJ2;       ITEM:=C(ITEM)-1. IS C(ITEM) GR 0?\r
2462         CAIN TAC1,A             ;MODE=ASCII?\r
2463         JRST STOSQF             ;YES\r
2464         CAIN TAC1,B             ;MODE=BINARY?\r
2465         JRST STOBND             ;YES, COMPUTE CHECKSUM AND CHECK.\r
2466         PUSHJ PDP,ITMSET        ;ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]\r
2467                                 ; - C(DEVCTR)\r
2468         SUB ITEM,DEVCTR(DEVDAT)\r
2469         MOVE TAC1,DEVIAD(DEVDAT)        ;STORE ITEM COUNT\r
2470         ADDI ITEM,1             ;IN FIRST WORD OF BUFFER\r
2471         AOJA TAC1,STOSQE\r
2472 \fSTOSQD:        TLZN IOS,IOFST          ;FIRST CALL?\r
2473         JRST STOSQF             ;NO\r
2474         PUSHJ PDP,NEWBUF        ;YES, CLEAR BUFFER,SET ITEM COUNT\r
2475         POPJ PDP,               ;ADDRESS CHECK\r
2476 STOSQF: MOVE TAC1,DEVIAD(DEVDAT)        ;REL. ADR. OF BUFFER\r
2477         AOS TAC1\r
2478         HRRZ ITEM,DEVPTR(DEVDAT)        ;ITEM:=C(DEVPTR 18-35) -\r
2479                                 ; C(DEVIAD 18-35) -1\r
2480         SUBI ITEM,(TAC1)\r
2481 STOSQE: HRRM ITEM,@TAC1         ;WORD COUNT TO FIRST WORD IN BUFFER\r
2482         JRST CPOPJ1             ;EXIT2. BLOCK COMPLETE\r
2483 \r
2484 \r
2485 STOBIN: TLZN IOS,IOFST          ;WILL THE NEXT ITEM BE THE FIRST ITEM\r
2486         JRST STO1               ;OF A BUFFER?  IOFST:=0\r
2487         HRRZ TAC,DAT            ;YES.\r
2488         CAMLE TAC,ITEM          ;IS WORD COUNT LE (BUFFER SIZE-1)*\r
2489         JRST STOE1              ; [36/BYTE SIZE]?\r
2490         MOVE ITEM,TAC           ;ITEM:=WORD COUNT\r
2491         MOVEM DAT,@DEVPTR(DEVDAT)       ;STORE WORD COUNT IN BUFFER\r
2492         JRST CPOPJ2             ;EXIT3.  DATA STORED CORRECTLY.\r
2493 \r
2494 STOBND: HRRZ TAC1,DEVIAD(DEVDAT)\r
2495         PUSHJ PDP,CKS12         ;COMPUTE CHECKSUM\r
2496         ADD TAC1, DEVIAD(DEVDAT)\r
2497         HLLZ TAC1,@TAC1         ;DATA CHECKSUM=COMPUTED CHECKSUM?\r
2498         CAMN TAC,TAC1\r
2499         JRST CPOPJ1             ;EXIT2. BLOCK COMPLETE\r
2500         TRO IOS,IODTER          ;IODTER:=1\r
2501         POPJ PDP,               ;EXIT1. CHECKSUM ERROR\r
2502 \r
2503 \r
2504         LIT\r
2505 IFN FTCHECK,<INTERNAL CHKEND\r
2506         CHKEND=.\r
2507 >\r
2508 \r
2509 UUOEND: END\r