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