Cleanup of typos.
[retro-software/dec/tops10/v1.19.git] / src / iocss.mac
1            TITLE IOCSS - IO COMMON SYSTEM SUBROUTINES\r
2            SUBTTL 8-15-65\r
3            EXTERNAL CLOSE1,DEVLST,ERROR,JBTADR\r
4            EXTERNAL JOB,JOBFF,RELEA1,USRJDA,WAIT1,CLDS,CLEN\r
5            EXTERNAL PJOBN,CPOPJ1,PIOMOD,CPOPJ,CPOPJ2\r
6            EXTERNAL SCNOFF,SCNON\r
7 \f\r
8 \r
9 ,DEC 06 00 EX COM L PT PRE 01 ADVBFE\r
10 ,H.R. MORSE         64-12-26\r
11 ,CALLING SEQUENCE\r
12 ,         PUSHJ PDP,ADVBFE\r
13 ,         EXIT1               RETURN IF NEXT BUFFER IS EMPTY\r
14 ,         EXIT2               RETURN IF NEXT BUFFER IS FULL\r
15 ,CLEARS THE USE BIT (IOUSE:=0) OF THE BUFFER POINTED TO BY THE\r
16 ,OUTPUT BUFFER ADDRESS (DEVOAD) OF THE CURRENT DEVICE DATA BLOCK\r
17 ,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING\r
18 ,UPON RETURN, SKIPS IF THE NEXT BUFFER IS FULL.\r
19 ,MONITOR INTERFACE\r
20 ,         STORAGE:  6\r
21 ,         SYMBOLS SET/USED:\r
22 ,             ACCUMULATORS:     DEVDAT U\r
23 ,                               PDP    S/U\r
24 ,                               TAC    S/U\r
25 ,             DEVICE DATA BLOCK:         DEVOAD S/U\r
26 ,             JOB BUFFER HEADER:         IOUSE  S/U\r
27           INTERN ADVBFE\r
28 ADVBFE:   ADRCHK DEVOAD(DEVDAT)\r
29           HRLZI TAC,IOUSE;      IOUSE:=0\r
30           ANDCAB TAC,@DEVOAD(DEVDAT)\r
31           HRRM TAC,DEVOAD(DEVDAT); DEVOAD 18-35:=NEXT BUFFER ADDRESS\r
32           SKIPGE @DEVOAD(DEVDAT);       IS IOUSE=0?\r
33           AOS (PDP);                    EXIT2. BUFFER IS FULL\r
34           POPJ PDP,;            EXIT1. BUFFER IS EMPTY\r
35 \f\r
36 \r
37 ,DEC 06 00 EX COM L PT PRE 01 ADVBFF\r
38 ,H.R. MORSE         64-12-26\r
39 ,CALLING SEQUENCE\r
40 ,         PUSHJ PDP,ADVBFF\r
41 ,         EXIT1                 RETURN IF NEXT BUFFER IS FULL\r
42 ,         EXIT2                 RETURN IF NEXT BUFFER IS EMPTY\r
43 ,SETS THE USE BIT (IOUSE:=1) OF THE BUFFER POINTED TO BY THE\r
44 ,INPUT BUFFER ADDRESS (DEVIAD) OF THE CURRENT DEVICE DATA BLOCK\r
45 ,AND ADVANCES THE BUFFER ADDRESS TO THE NEXT BUFFER IN THE RING.\r
46 ,UPON RETURN. SKIPS IF THE NEXT BUFFER IS EMPTY,\r
47 ,MONITOR INTERFACE\r
48 ,         STORAGE:   6\r
49 ,         SYMBOLS SET/USED:\r
50 ,             ACCUMULATORS:             DEVDAT U\r
51 ,                                       PDP    S/U\r
52 ,                                       TAC    S/U\r
53 ,             DEVICE DATA BLOCK:        DEVIAD S/U\r
54 ,             JOB BUFFER HEADER:        IOUSE  S/U\r
55           INTERN ADVBFF\r
56 ADVBFF:   ADRCHK DEVIAD(DEVDAT)\r
57           HRLZI TAC,IOUSE;      IOUSE:=1\r
58           IORB TAC,@DEVIAD(DEVDAT)\r
59           HRRM TAC,DEVIAD(DEVDAT); DEVIAD:=NEXT BUFFER ADDRESS\r
60           SKIPL @DEVIAD(DEVDAT);        IOUSE=1?\r
61           AOS (PDP);            EXIT2. NEXT BUFFER IS EMPTY\r
62           POPJ PDP,;            EXIT1. NEXT BUFFER IS FULL\r
63 \f\r
64 \r
65 \r
66 ,DEC 06 00 EX COM L PT PRE 01 ASCIA\r
67 ,C. FRAZIER AND W. SEGAL      64-12-26\r
68 ,CALLING SEQUENCE\r
69 ,         PUSHJ PDP,ASCIA\r
70 ,         EXIT                ALWAYS RETURNS HERE\r
71 ,ADDS THE ASCII INCREMENT (RIGHT JUSTIFIED) IN AC TAC1 TO THE FIVE\r
72 ,DIGIT ASCII NUMBER (LEFT JUSTIFIED) IN AC TAC AND LEAVES THE \r
73 ,RESULT (LEFT JUSTIFIED) IN AC TAC. TAC1 IS RESTORED.\r
74 ,MONITOR INTERFACE\r
75 ,         STORAGE:  21\r
76 ,         SYMBOLS SET/USED:\r
77 ,             ACCUMULATORS:     PDP  U\r
78 ,                               TAC  S/U\r
79 ,                               TAC1 S/U\r
80 \f\r
81 \r
82 ;         INTERN ASCIA\r
83 ;ASCIA:   PUSH PDP,TAC1;        SAVE TAC1 = ASCII INCREMENT (RIGHT JUST\r
84 ;         AND TAC1,K2;          CLEAR MOST SIGNIFICANT 3 BITS OF\r
85 ;,                              EACH CHARACTER\r
86 ;         LSH TAC,-1;           TAC=FIVE DIGIT ASCII NO.(RIGHT JUST.)\r
87 ;         IOR TAC,K4;           SET SECOND AND THIRD MOST SIGNIFICANT\r
88 ;,                              BITS OF EACH CHARACTER TO ONES.\r
89 ;         TLZN TAC,400000\r
90 ;         ADD TAC,K1\r
91 ;         ADD TAC1,TAC\r
92 ;         AND TAC1,K3\r
93 ;         MOVE TAC,K4\r
94 ;         AND TAC,TAC1\r
95 ;         ASH TAC,-3\r
96 ;         SUBM TAC1,TAC\r
97 ;         IOR TAC,K4\r
98 ;         LSH TAC,1\r
99 ;         TRO TAC,1\r
100 ;         POP PDP,TAC1;         RESTORE TAC1\r
101 ;         POPJ PDP,;            RETURN\r
102 ;K1:      OCT 215064321506;     CHARACTER MASK: 1000110\r
103 ;K2:      OCT 036170743617;     CHARACTER MASK: 0001111\r
104 ;K3:      OCT 176773757677;     CHARACTER MASK: 0111111\r
105 ;K4:      OCT 140603014060;     CHARACTER MASK: 0110000\r
106 \f\r
107 \r
108           INTERNAL ASSIN,ASSASG\r
109 \r
110 ASSIN:    PUSHJ PDP,DEVSRC      ;SEARCH FOR DEVICE\r
111           POPJ PDP,             ;DEVICE NOT FOUND\r
112           MOVEI TAC1, ASSPRG    ;DEVICE FOUND, FLAG AS ASSIGNED BY PROG\r
113 \r
114 ;ASSIGN DEVICE IF UNASSIGNED\r
115 ;CALL:    MOVE ITEM, JOB NUMBER\r
116 ;         MOVE DEVDAT, ADDR. OF DDB\r
117 ;         MOVEI TAC1, EITHER ASSPRG OR ASSCON\r
118 ;         PUSHJ PDP, ASSASG\r
119 ;         CANT ASSIGN RETURN\r
120 ;         ASSIGNED RETURN\r
121 \r
122 ASSASG:   CONO APR,CLDS         ;DISABLE CLOCK\r
123           LDB TAC,PJOBN         ;GET JOB NUMBER IN DEV DATA BLOCK\r
124           CAMN TAC,ITEM         ;IS IT ALREADY ASSIGNED TO THIS JOB\r
125           JRST ASSAS1           ;YES\r
126           MOVEI TAC, ASSPRG+ASSCON      ;NO, IS IT ASSIGNED TO ANOTHE\r
127           CONO PI, SCNOFF       ;TURN SCANNER OFF\r
128           TDNE TAC, DEVMOD(DEVDAT)      ;ARE EITHER ASSIGNED BITS SET\r
129           JRST ASSAS2           ;YES\r
130           IORM TAC1, DEVMOD(DEVDAT)     ;NO, SET ONE OF THEM\r
131           DPB ITEM,PJOBN        ;AND STORE JOB NUMBER\r
132 ASSAS1:   AOS (PDP)\r
133 ASSAS2:   CONO PI, SCNON        ;TURN SCANNER BACK ON\r
134           CONO APR,CLEN         ;RENABLE CLOCK\r
135           POPJ PDP,\r
136 \f\r
137 \r
138 ;ROUTINE TO SEARCH FOR A DEVICE\r
139 ;CALL:    HRR ITEM,JOB NUMBER\r
140 ;         MOVE TAC,[SIXBIT .DEVICE NAME.]\r
141 ;         PUSHJ PDP, DEVSRC\r
142 ;         NOT FOUND\r
143 ;         FOUND\r
144 \r
145           INTERNAL DEVLG,DEVSRC,DEVPHY\r
146           EXTERNAL SYSTAP,DEVOPR\r
147 \r
148 DEVSRC:   PUSHJ PDP, DEVLG      ;SEARCH LOGICAL NAMES FIRST\r
149           JRST DEVPHY           ;NOT FOUND, SEARCH PHYSICAL NAMES\r
150           JRST CPOPJ1           ;FOUND\r
151 \r
152 ;SEARCH LOGICAL NAMES\r
153 \r
154 DEVLG:    HLRZ DEVDAT,DEVLST    ;BEGINNING OF DDB CHAIN\r
155           JUMPE TAC,CPOPJ       ;0 CANNOT BE A LOGICAL NAME\r
156 DEVLP0:   CAME TAC,DEVLOG(DEVDAT)       ;COMPARE WITH LOGICAL NAME\r
157           JRST DEV0             ;NO MATCH\r
158           LDB TAC1,PJOBN        ;DOES THE LOGICAL NAME BELONG TO THIS J\r
159           CAMN TAC1,ITEM\r
160           JRST CPOPJ1                   ;YES\r
161 DEV0:     HLRZ DEVDAT,DEVSER(DEVDAT)    ;NO, KEEP LOOKING\r
162           JUMPN DEVDAT,DEVLP0\r
163           POPJ PDP,             ;FINISH AND NOT FOUND\r
164 \r
165 ;SEARCH PHYSICAL NAMES\r
166 \r
167 DEVPHY:   JUMPE TAC,CPOPJ       ;ZERO CANNOT BE A LOGICAL NAME\r
168           CAMN TAC,[SIXBIT  /OPR/] ;IS IT "OPR"?\r
169           MOVE TAC,DEVOPR       ;YES, CHANGE TO OPERATORS TTY\r
170           CAMN TAC,[SIXBIT  /SYS/] ;IS IT "SYS"?\r
171           MOVE TAC,SYSTAP       ;YES, CHANGE TO SYSTEM TAPE NAME\r
172           HLRZ DEVDAT,DEVLST    ;SEARCH DEVICE DATA BLOCKS\r
173 DEVLP1:   CAMN TAC,DEVNAM(DEVDAT)\r
174           JRST CPOPJ1           ;FOUND\r
175           HLRZ DEVDAT,DEVSER(DEVDAT)\r
176           JUMPN DEVDAT,DEVLP1\r
177           POPJ PDP, ;NOT FOUND\r
178 \f\r
179 \r
180 ,DEC 06 00 EX COM L PT PRE 01 BUFCLC\r
181 ,H. R. MORSE        64-12-26\r
182 ,CALLING SEQUENCE\r
183 ,         PUSHJ PDP,BUFCLC\r
184 ,         EXIT                  RETURNS HERE IF MEMORY NOT EXCEEDED\r
185 , SETS UP AN N BUFFER RING FOLLOWING THE USERS PROGRAM, WHERE N\r
186 , IS IN THE ADDRESS FIELD OF AC UUO.\r
187 , THE BUFFER RING FORMAT IS AS FOLLOWS:\r
188 ,         LOCATION  LH   CONTENTS   RH\r
189 , C(JOBFF) + 1              BUFFER              C(JOBFF) +1\r
190 ,    + 0(BUFFER SIZE+2)      SIZE                    + 1(BUFFER SIZ+2)\r
191 , C(JOBFF) +1               BUFFER              C(JOBFF) +1\r
192 ,    +1(BUFFER SIZE+2)       SIZE                    +  2(BUFFER SIZE+2)\r
193 ,        .                    .                             .\r
194 ,        .                    .                             .\r
195 ,        .                    .                             .\r
196 , C(JOBFF) + 1              BUFFER              C(JOBFF) + 1\r
197 ,    + (N-2)(BUFFER SIZE+2)  SIZE                    +(N-1)(BUFFER SIZE+2)\r
198 , C(JOBFF) + 1              BUFFER              C(JOBFF) + 1\r
199 ,    + (N-1)(BUFFER SIZE+2)  SIZE       \r
200 ,THEN SET           BUFPNT:=IOUS,C(JOBFF) + 1\r
201 , AND               JOBFF:=C(JOBFF) + 1 + N(BUFFER SIZE + 2)\r
202 , BUFWRD IS RESTORED.\r
203 ,MONITOR INTERFACE\r
204 ,         STORAGE:  20\r
205 ,         ROUTINES CALLED:   ADRCK\r
206 ,         SYMBOLS SET/USED:\r
207 ,             ACCUMULATORS:  BUFPNT S/U         PROG   U\r
208 ,                            BUFWRD S/U         TAC   S/U\r
209 ,                            DEVDAT U           TAC1  S/U\r
210 ,                            PDP    S/U         UUO   U\r
211 ,         DEVICE DATA BLOCK: DEVCHR U\r
212 ,         JOB AREA:          JOBFF  S/U\r
213 ,         JOB BUFFER HEADER: IOUSE  U\r
214 \f\r
215 \r
216           INTERN BUFCLC\r
217 BUFCLC:   PUSH PDP,BUFWRD;      SAVE BUFWRD ON STACK\r
218           LDB TAC,[POINT 12,DEVCHR(DEVDAT),35];TAC:=BUFFER SIZE\r
219           HRRZ BUFPNT,JOBFF(PROG);BUFPNT:=FIRST FREE LOCATION + 1\r
220           ADDI BUFPNT,1\r
221           HRRZ BUFWRD,BUFPNT\r
222           HRLI BUFPNT,PROG\r
223           HRL BUFWRD,TAC;       BUFWRD:=BUFFER SIZE,FIRST FREE LOC + 1\r
224           ADDI TAC,2;           TAC:=BUFFER SIZE + 2\r
225           HRRZ TAC1,UUO;        TAC1:=N=ADDRESS FIELD OF AC UUO\r
226 BUFC1:    ADD BUFWRD,TAC;       BUFWRD:=C(BUFWRD) + C(TAC)\r
227           ADRCHK BUFPNT;        CHECK BUFFER FOR MEMORY BOUND\r
228           MOVEM BUFWRD,@BUFPNT; BUFFER HEADER+1:=C(BUFWRD)\r
229           HRR BUFPNT,BUFWRD;    BUFPNT 18-35:=C(BUFWRD 18-35)\r
230           SOJG TAC1,BUFC1;      N:=N-1.  IS N>0?\r
231           HRR BUFWRD,JOBFF(PROG)\r
232           ADDI BUFWRD,1\r
233           PUSHJ PDP,ADRCK       ;CHECK LAST ADR. OF HEADER\r
234           HRRZI TAC,-2(BUFPNT)\r
235           SUB BUFPNT,TAC\r
236           MOVEM BUFWRD,@BUFPNT;LINK LAST BUFFER TO FIRST BUFFER\r
237           ADD BUFPNT,TAC\r
238           HRRM BUFPNT,JOBFF(PROG);JOBFF:=C(JOBFF)+1+N(BUFFER SIZE+2)\r
239           HRR BUFPNT,BUFWRD;    BUFPNT:=IOUSE,ADDRESS OF FIRST BUFFER\r
240 ,                                        IN RING.\r
241           HRLI BUFPNT,IOUSE\r
242           POP PDP,BUFWRD;       RESTORE BUFWRD FROM STACK.\r
243           POPJ PDP,;            RETURN\r
244 \f\r
245 \r
246 ,DEC 06 00 EX COM L PT PRE 01 BUFCLR\r
247 ,H. R. MORSE        64-12-26\r
248 ,CALLING SEQUENCE\r
249 ,         PUSHJ PDP,BUFCLR\r
250 ,         EXIT                  RETURNS HERE IF MEMORY NOT EXCEEDED\r
251 , CLEAR THE WORD COUNT AND DATA AREA OF THE BUFFER WHOSE ADDRESS\r
252 , IS IN TAC 18-35.\r
253 ,MONITOR INTERFACE:\r
254 ,         STORAGE:  13\r
255 ,         ROUTINE CALLED:    ADRCK\r
256 ,         SYMBOLS SET/USED:\r
257 ,             ACCUMULATORS:  PDP  U             TAC   S/U\r
258 ,                            PROG U             TAC1  S/U\r
259           INTERN BUFCLR\r
260 BUFCLR:   HRLI TAC,PROG\r
261           ADRCHK TAC;           PROCEED IF CURRENT BUFFER ADDRESS\r
262 ,                                   < PROTECTION ADDRESS.\r
263           HLRZ TAC1,@TAC;       TAC1 18-35=SIZE\r
264           TRZ TAC1,400000\r
265           ADD TAC1,TAC;         TAC1:=CURRENT BUFFER ADDRESS + SIZE\r
266           ADRCHK TAC1;          PROCEED IF CURRENT BUFFER ADDRESS\r
267 ,                                    + SIZE < PROTECTION ADDRESS.\r
268           MOVEI TAC,@TAC;       TAC:=CURRENT BUFFER ADDRESS+1,\r
269 ,                                    CURRENT BUFFER ADDRESS+1\r
270           HRL TAC,TAC\r
271           AOBJN TAC,.+1\r
272           CLEARM 0(TAC);        WORD COUNT:=0\r
273           AOS TAC;              TAC:=CURRENT BUFFER ADDRESS+1,\r
274 ,                                    CURRENT BUFFER ADDRESS+2\r
275           BLT TAC,@TAC1;        CLEAR BUFFER\r
276           POPJ PDP,;            RETURN\r
277 \f\r
278           SUBTTL 5-17-65 PART 2\r
279 \f\r
280 \r
281 ,CALLING SEQUENCE\r
282 ,         PUSHJ PDP,CKS12\r
283 ,         EXIT                  ALWAYS RETURNS HERE\r
284 ,CALCULATES FOLDED 12 BIT CHECKSUMS OF THE DATA WORDS IN THE\r
285 ,BUFFER WHOSE ADDRESS IS IN AC TAC1.  TWO ALGORITHMS ARE USED.\r
286 ,ON RETURN, THE LEFT HALF OF AC TAC CONTAINS A CHECKSUM OBTAINED\r
287 ,BY ACCUMULATING, IN ONES COMPLEMENT, THE DATA WORDS AND FOLDING IT.\r
288 ,THE LEFT HALF OF AC DAT CONTAINS A CHECKSUM OBTAINED BY ACCUMULATING\r
289 ,IN TWOS COMPLEMENT, THE DATA WORDS AND FOLDING IT.  AC TAC1\r
290 ,CONTAINS A 1.\r
291 ,MONITOR INTERFACE\r
292 ,         STORAGE:  20\r
293 ,         ROUTINES CALLED:   FOLD\r
294 ,         SYMBOLS SET/USED:\r
295 ,             ACCUMULATORS:  DAT   S/U          SUB    S\r
296 ,                            PDP   U            TAC    S/U\r
297 ,                            PROG  U            TAC1   S/U\r
298 \f\r
299 \r
300           INTERN CKS12\r
301 CKS12:    ADD TAC1,PROG;        TAC1:=-WORD COUNTER,ADDRESS OF FIRST DATA\r
302           AOS TAC1\r
303           HRRZ TAC,0(TAC1)\r
304           MOVNS TAC\r
305           AOS TAC1\r
306           HRL TAC1,TAC\r
307           CLEARM TAC;           INITIALIZE TWOS COMPLEMENT SUM\r
308 CKS12A:   ADD TAC,0(TAC1);      TWOS COMPLEMENT ADD\r
309           AOBJN TAC1,CKS12A;    DONE?\r
310 FOLD:     LSHC TAC,-30\r
311           LSH TAC1,-14\r
312           ADD TAC,TAC1\r
313           LSHC TAC,-14\r
314           LSH TAC1,-30\r
315           ADD TAC,TAC1\r
316           TRZE TAC,770000\r
317           AOS TAC\r
318           HRLZS TAC\r
319           MOVEI TAC1,1          ;TAC1:=1\r
320           POPJ PDP,\r
321 \f\r
322 \r
323 ,DEC 06 00 EX COM L PT PRE 01 CLRBYT\r
324 ,H. R. MORSE        64-12-26\r
325 ,CALLING SEQUENCE \r
326 ,         PUSHJ PDP,CLRBYT\r
327 ,         EXIT                  ALWAYS RETURN HERE\r
328 ,CALLED WITH A BYTE POINTER IN AC TAC, IT CLEARS THE REST OF THE\r
329 ,WORD POINTED TO BY THE BYTE POINTER.\r
330 ,MONITOR INTERFACE\r
331 ,         STORAGE:   7\r
332 ,         SYMBOLS SET/USED:\r
333 ,             ACCUMULATORS:   PDP    U\r
334 ,                             TAC    U\r
335 ,                             TAC1   S/U\r
336           INTERN CLRBYT\r
337 CLRBYT:   LDB TAC1,[POINT 6,TAC,5];     TAC1:=P\r
338           DPB TAC1,[POINT 12,TAC,11];   TAC 0-5:=0, TAC 6-12:=P\r
339           SETZM TAC1\r
340           DPB TAC1,TAC;         CLEAR BITS 36-P THROUGH 35\r
341           POPJ PDP,;            RETURN\r
342 \f\r
343 \r
344 ;ROUTINE TO RELEASE ALL DEVICES ASSIGNED TO JOB\r
345 \r
346 INTERNAL IORELS\r
347 EXTERNAL PUUOAC,RELEA3\r
348 \r
349 \r
350 IORELS:   MOVEI TAC,RELEA3      ;RELEASE ALL IO DEVICES(DONT CLOSE)\r
351 \r
352 ;ROUTINE TO DO IO FOR ALL DEVICES ASSIGNED TOI JOB\r
353 ;CALL     MOVEI TAC,ADR. OR IO SUB.\r
354 ;         PUSHJ PDP,IOALL\r
355 \r
356 INTERNAL IOALL\r
357 \r
358 IOALL:    PUSH PDP,TAC          ;SAVE ADR. FO SUB.\r
359           HRLZI DAT, -20\r
360 IOALL1:   MOVE DEVDAT, USRJDA(DAT)\r
361           MOVE IOS,DEVIOS(DEVDAT)\r
362           MOVEI UUO,0\r
363           DPB DAT,PUUOAC\r
364           SKIPE DEVDAT\r
365           PUSHJ PDP,@(PDP)      ;CALL THE SUB.\r
366           AOBJN DAT, IOALL1\r
367           POP PDP,TAC\r
368           POPJ PDP,\r
369 \r
370 ;KILL ALL DEVICES(RELEASE WITHOUT WAITING FOR DEVICE INACTIVE)\r
371 \r
372 INTERNAL IOKILL\r
373 EXTERNAL RELEA5\r
374 \r
375 IOKILL:   MOVEI TAC,RELEA5\r
376           JRST IOALL\r
377 \f\r
378 \r
379 ,DEC 06 00 EX COM L PT PRE 01 IOSET\r
380 ,H. R. MORSE        64-12-26\r
381 ,CALLING SEQUENCE\r
382 ,         PUSHJ PDP,IOSET\r
383 ,         EXIT      ALWAYS RETURNS HERE\r
384 ,THIS PROGRAM IS CALLED FROM AN INTERRUPT SERVICE ROUTINE.\r
385 ,IT PUTS THE ADDRESS OF THE DATA AREA OF THE JOB (C(JBTADR18-35))\r
386 ,CONNECTED TO THE DEVICE SPECIFIED BY AC DEVDAT IN AC PROG AND\r
387 ,PUTS THE ITEM POINTER (C(DEVCTR)) IN AC ITEM.\r
388 ,MONITOR INTERFACE\r
389 ,         STORAGE:   5\r
390 ,         SYMBOLS SET/USED:\r
391 ,             ACCUMULATORS:             DEVDAT U   PDP  U\r
392 ,                                       ITEM   S   PROG S/U\r
393 ,             DEVICE DATA BLOCK:        DEVCHR U\r
394 ,                                       DEVCTR U\r
395 ,             SYSTEM ADDRESSES:         JBTADR U\r
396           INTERN IOSET\r
397 \r
398 IOSET:    LDB PROG,PJOBN\r
399           MOVE ITEM,DEVCTR(DEVDAT); ITEM:=ITEM POINTER=C(DEVCTR)\r
400           HRRZ PROG,JBTADR(PROG);       PROG:=C(JBTADR 18-35)\r
401           POPJ PDP,;                    RETURN\r
402 \f\r
403 \r
404 ,6-CSS-DEC-IOSETC-PL-PRE1\r
405 ,H.R. MORSE   17-11-64\r
406 \r
407 ,CALLING SEQUENCE\r
408 ,         PUSHJ PDP,IOSETC\r
409 ,         EXIT                  ALWAYS RETURN HERE\r
410 \r
411 ,SETS JBFPTR18-35:=C(TAC1 18-35)\r
412 ,         JBFCTR:=C(ITEM)*[WORD LENGTH/BYTE SIZE]\r
413 ,WHERE    WORD LENGTH:=36 DECIMAL\r
414 ,         BYTE SIZE:=C(JBFPTR6-11)\r
415 ,         [X]:= INTEGER PART OF X\r
416 \r
417 ,MONITOR INTERFACE\r
418 ,         STORAGE:   11\r
419 ,         ROUTINES CALLED:      ITMCT1\r
420 ,         SYMBOLS SET/USED:\r
421 ,             ACCUMULATORS:     JBUF S/U        TAC S/U\r
422 ,                               ITEM S/U        TAC1 S/U\r
423 ,                               PDP U\r
424 \r
425           INTERN IOSETC\r
426 \r
427 IOSETC:   ADDI JBUF,1                   ;JBFPTR12-18:=0\r
428           HRLZI TAC,7777        ;JBFPTR18-35:=C(TAC1 18-35)+1\r
429           ANDM TAC,@JBUF\r
430           HRRM TAC1,@JBUF\r
431           AOS @JBUF\r
432           LDB TAC1,[POINT 6,@JBUF,11]   ;TAC1:=BYTE SIZE\r
433           PUSHJ PDP,ITMCT1      ;JBFCTR:=C(ITEM)*[36/BYTE SIZE]\r
434           ADDI JBUF+1\r
435           MOVEM ITEM,@JBUF\r
436           POPJ PDP,             ;EXIT\r
437 \f\r
438 \r
439 ,DEC 06 00 EX COM L PT PRE 01 ITMSET, ITMCNT, ITMCT1\r
440 ,H.R. MORSE   64-12-26\r
441 \r
442 ,CALLING SEQUENCE\r
443 ,         PUSHJ PDP,ITMSET\r
444 ,         EXIT                  ALWAYS RETURNS HERE\r
445 ,SETS AC ITEM:=(BUFFER SIZE-1)*[WORD LENGTH/BYTE SIZE]\r
446 ,WHERE BUFFER SIZE:=BITS 1-17 OF THE BUFFER HEADER WORD POINTED TO\r
447 ,                   BY C(DEVADR)\r
448 ,        WORD LENGTH:=36 DECIMAL\r
449 ,        BYTE SIZE:=INTEGER PART OF X.\r
450 \r
451 ,CALLING SEQUENCE\r
452 ,         PUSHJ PDP,ITMCNT\r
453 ,         EXIT                  ALWAYS RETURNS HERE\r
454 ,SETS AC ITEM=C(ITEM)*[WORD LENGTH/BYTE SIZE]\r
455 \r
456 ,CALLING SEQUENCE\r
457 ,         PUSHJ PDP,ITMCT1\r
458 ,         EXIT                  ALWAYS RETURNS HERE\r
459 ,SETS AC ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)]\r
460 \r
461 ,MONITOR INTERFACE\r
462 ,         STOAGE:   7\r
463 ,         SYMBOLS SET/USED:\r
464 ,             ACCUMULATORS:     DEVDAT U   TAC S/U\r
465 ,                               ITEM S/U   TAC1 S/U\r
466 ,                               PDP U\r
467 ,         DEVICE DATA BLOCK:    DEVADR U\r
468 ,                               DEVPTR U\r
469 \f\r
470 \r
471           INTERN ITMSET,ITMCNT,ITMCT1\r
472 ITMSET:   LDB ITEM,[POINT 17,@DEVADR(DEVDAT),17];ITEM:=BUFFER SIZE-1\r
473           SUBI ITEM,1\r
474 ITMCNT:   LDB TAC1,[POINT 6,DEVPTR(DEVDAT),11];TAC1:=BYTE SIZE\r
475 ITMCT1:   MOVEI TAC,44          ;ITEM:=C(ITEM)*[WORD LENGTH/C(TAC1)]\r
476           IDIV TAC,TAC1\r
477           IMUL ITEM,TAC\r
478           POPJ PDP,\r
479 \f\r
480 \r
481 ;ROUTINE TO SET DEVICE STATUS WORD FROM UUO\r
482 \r
483 INTERNAL SETIOS\r
484 EXTERNAL ILLMOD\r
485 \r
486 SETIOS:   LDB TAC,[POINT 4,UUO,35]      ;GET DEVICE DATA MODE\r
487           MOVEI TAC,1           ;AND CHECK FOR LEGALITY\r
488           LSH TAC,(TAC1)\r
489           TDNN TAC,DEVMOD(DEVDAT)\r
490           JRST ILLMOD           ;ILLEGAL MODE\r
491           TRZ UUO,IOACT         ;LET USER SET ALL BITS EXCEPT IOACT\r
492           HRRM UUO,DEVIOS(DEVDAT)\r
493           POPJ PDP,\r
494 \f\r
495 \r
496 ,DEC 06 00 EX COM L PT PRE 01 NEWBUF, BPNSET\r
497 ,H. R. MORSE        64-12-26\r
498 ,CALLING SEQUENCE\r
499 ,         PUSHJ PDP,NEWBUF\r
500 ,         EXIT                  ALWAYS RETURNS HERE\r
501 ,CLEARS THE BUFFERE CURRENTLY POINTED TO BY THE INPUT BUFFER\r
502 ,ADDRESS (DEVDR) OF THE CURRENT DEVICE. SETS UP THE BYTE\r
503 ,POINTER (DEVPTR), AND THE ITEM COUNT (DEVCTR) AND RETURNS.\r
504 ,CALLING SEQUENCE\r
505 ,         PUSHJ PDP,BPNSET\r
506 ,         EXIT                  ALWAYS RETURNS HERE\r
507 ,SETS UP THE BYTE POINTER (DEVPTR) AND THE ITEM COUNT (DEVCTR)\r
508 ,OF THE CURRENT DEVICE AND RETURNS.\r
509 ,MONITOR INTERFACE\r
510 ,         STORAGE:  10\r
511 ,         ROUTINES CALLED:      BUFCLR, ITMSET\r
512 ,         SYMBOLS SET/USED:     \r
513 ,             ACCUMULATORS:     DEVDAT U        PDP U\r
514 ,                               ITEM   U        TAC S/U\r
515 ,             DEVICE DATA BLOCKS:       DEVADR U\r
516 ,                               DEVCTR S\r
517 ,                               DEVPTR S/U\r
518 \f\r
519           INTERN BPNSET,NEWBUF\r
520 \r
521 NEWBUF:   HRRZ TAC,DEVADR(DEVDAT); TAC:=INPUT BUFFER HEADER ADDRESS\r
522           PUSHJ PDP,BUFCLR;     CLEAR INPUT BUFFER.\r
523 BPNSET:   HRR TAC,DEVADR(DEVDAT)\r
524           HRLZI TAC,7737\r
525           AND TAC,DEVPTR(DEVDAT); DEVPTR 0-5:=0, DEVPTR 12:=0\r
526           HRR TAC,DEVADR(DEVDAT); DEVPTR 10-35:=C(DEVADR 18-35) + 1\r
527           AOS TAC\r
528           MOVEM TAC,DEVPTR(DEVDAT)\r
529           PUSHJ PDP,ITMSET;     ITEM:=(BUFFER SIZE-1)[36/BYTE SIZE]\r
530           MOVEM ITEM,DEVCTR(DEVDAT); DEVCTR:=ITEM COUNT\r
531           POPJ PDP,;            RETURN\r
532 \f\r
533 \r
534 ,DEC 06 00 EX COM L PT PRE 02 SETBYT\r
535 ,H. R. MORSE        64-12-26\r
536 ,CALLING SEQUENCE\r
537 ,         PUSHJ PDP,SETBYT\r
538 ,         EXIT                  ALWAYS RETURN HERE\r
539 ,SETS     TAC 0-5:=0\r
540 ,         TAC 6-11:=S\r
541 ,         TAC 12-13:=0\r
542 ,         TAC 14-17:=PROG\r
543 ,WHERE S=35 IF DATA MODE (IOS 32-25) IS BINARY (B)\r
544 ,      S=8  IF DATA MODE IS IMAGE (I)\r
545 ,      S=7  IF DATA MODE IS   ASCII PACKED (A)\r
546 ,                             ASCII LINE (AL)\r
547 ,                             ASCII SEQUENCED (AS)\r
548 ,                             ASCII SEQUENCED (ASL)\r
549 ,                   OR        ALTERNATE MODE BREAK (AM)\r
550 ,MONITOR INTERFACE\r
551 ,         STORAGE:   12\r
552 ,         SYMBOLS SET/USED:\r
553 ,             ACCUMULATORS:     PROG  U                 TAC   S\r
554 ,                               PDP   U                 TAC1  S/U\r
555 ,             DEVICE DATA BLOCK:          DEVIOS U\r
556           INTERN SETBYT\r
557 SETBYT:   MOVE TAC1,DEVIOS(DEVDAT);     FETCH DATA MODE, BITS 32-35 0\r
558           ANDI TAC1, 17\r
559           CAIE TAC1,IB          ;DATA MODE IMAGE BINARY?\r
560           CAIN TAC1,B;          IS DATA MODE=BINARY?\r
561           HRLI TAC,4400+PROG;   SET BYTE SIZE TO 36.\r
562           CAIN TAC1,I;          IS DATA MODE=IMAGE?\r
563           JRST SETBY1\r
564           TRNE TAC1,14;         IS DATA MODE=ASCII PACKED,ASCII LINE,\r
565           JRST .+2;             ASCII SEQUENCED,OR ASCII SEQUENCED LINE\r
566           HRLI TAC,700+PROG;    SET BYTE SIZE TO 7.\r
567           POPJ PDP,;            RETURN\r
568 \r
569 SETBY1:   HLLZ TAC,DEVMOD(DEVDAT)\r
570           TLZ TAC,770077\r
571           TLO TAC,PROG\r
572           POPJ PDP,\r
573 \f\r
574 \r
575 ,DEC 06 00 EX COM L PT PRE 01 STORE ITEM\r
576 ,H.R. MORSE         64-12-26\r
577 ,CALLING SEQUENCE\r
578 ,         PUSHJ PDP,STODAT\r
579 ,         EXIT1                 CHECKSUM ERROR\r
580 ,         EXIT2                 BLOCK FULL OR BLOCK COMPLETE\r
581 ,         EXIT3                 DATA STORED CORRECTLY\r
582 ,CALLED FROM AN INPUT SERVICE ROUTINE WITH A DATA ITEM IN AC DAT.\r
583 ,STORES THE DATA ITEM IN THE BUFFER, CHECKING TO SEE IF IT WERE\r
584 ,THE FIRST ITEM ON THE BUFFER AND SETTING UP THE POINTER AND\r
585 ,WORD COUNT APPROPRIATELY CHECKING THE MODE TO SEE IF ANY SPECIAL\r
586 ,PROCESSING NEED BE DONE.  FOR EXAMPLE, GENERATION OF SEQUENCE\r
587 ,NUMBERS PRECEDING EACH LINE IN SEQUENCE MODE, OR THE TERMINATION\r
588 ,OF A BUFFER ON CERTAIN CHARACTERS IN OTHER MODES, OR IF THE BUFFER\r
589 ,RETURN OCCURS ON AN ERROR CONDITION. THE SECOND RETURN OCCURS\r
590 ,ON A BLOCK FULL CONDITION OR BLOCK COMPLETE CONDITION, THE THIRD\r
591 ,RETURN OCCURS ON THE DATA STORED CORRECTLY CONDITION.  THIS\r
592 ,ROUTINE ALSO DOES SOME CHECKING ON INPUT OF BINARY RECORD,\r
593 ,PAPER TAPE OR CARDS.\r
594 ,CALLING SEQUENCE\r
595 ,         PUSHJ PDP,STOSQD\r
596 ,         XXXX                  ALWAYS SKIPS\r
597 ,         EXIT                  ALWAYS RETURNS HERE\r
598 ,STORES THE WORD COUNT:=C(DEVPTR 18-35) -C(DEVIAD 18-35) - 1\r
599 ,IN THE BUFFER.\r
600 ,MONITOR INTERFACE\r
601 ,         STORAGE:  69\r
602 ,         ROUTINES CALLED: ASCIA, CKS12, ITMSET, NEWBUF\r
603 ,         SYMBOLS SET/USED:\r
604 ,             ACCUMULATORS:             DAT    U  PDP  U\r
605 ,                                       DEVDAT U  TAC S/U\r
606 ,                                       IOS    S/U         TAC1 S/U\r
607 ,                                       ITEM   S/U\r
608 ,             DEVICE DATA BLOCK:        DEVCTR U  DEVPTR S/\r
609 ,                                       DEVIAD U  DEVSEQ S/\r
610 ,             IO STATUS WORD: A     U             I      U\r
611 ,                                       AS   U             IOBKTL S\r
612 ,                                       ASL  U             IODTER S\r
613 ,                                       B    U             IOFST  S/\r
614 ,             JOB BUFFER AREA:          WORD COUNT S\r
615 \f\r
616           INTERN STODAT, STOSQD\r
617 \r
618 STODAT:   TLNE IOS,IOFST;       WILL THE NEXT ITEM BE THE FIRST ITEM\r
619 ,                                  OF A BUFFER?\r
620           PUSHJ PDP,NEWBUF;     SET UP A NEW BUFFER. ITEM:=(BUFFER\r
621 ,                                  SIZE - 1)*[36/BYTE SIZE]\r
622           LDB TAC1,PIOMOD;      TAC1:=DATA MODE\r
623           CAIN TAC1,B;          MODE=BINARY?\r
624           JRST STOBIN\r
625           TLZ IOS,IOFST\r
626 STO1:     DPBI DAT,DEVPTR(DEVDAT); STORE DATA IN BUFFER.\r
627           CAIE TAC1,A;          MODE=ASCII,  IMAGE, OR BINARY?\r
628           CAIN TAC1,I\r
629           JRST STOAIB\r
630           CAIN TAC1,B\r
631           JRST STOAIB\r
632           CAIG DAT,214          ;LINE FEED,FORM FEED, OR VERTICAL TAB?\r
633           CAIGE DAT,212\r
634           JRST .+2  ;NO\r
635           JRST STOSQD           ;YES\r
636           SOJGE ITEM,CPOPJ2;    ITEM:=C(ITEM)-1. IS C(ITEM)>OR=0?\r
637 STOE1:    TRO IOS,IOBKTL                ;IOBKTL:=1\r
638           JRST CPOPJ\r
639 STOAIB:   SOJG ITEM,CPOPJ2;     ITEM:=C(ITEM)-1. IS C(ITEM)>0?\r
640           CAIN TAC1,A;          MODE=ASCII?\r
641           JRST STOSQD\r
642           CAIN TAC1,B;          MODE=BINARY?\r
643           JRST STOBND\r
644 STOI:     PUSHJ PDP,ITMSET;     ITEM:=(BUFFER SIZE-1)*[36/BYTE SIZE]\r
645 ,                                      - C(DEVCTR)\r
646           SUB ITEM,DEVCTR(DEVDAT)\r
647           HRRZ TAC1,DEVIAD(DEVDAT)      ;STORE ITEM COUNT INSTEAD OF\r
648           ADDI ITEM,1           ;IN FIRST WORD OF BUFFER\r
649           AOJA TAC1,STOSQE\r
650 \f\r
651 STOSQD:   MOVE TAC1,DEVIAD(DEVDAT); TAC1:=ADDRESS OF WORD COUNT\r
652           AOS TAC1\r
653           HRRZ ITEM,DEVPTR(DEVDAT); ITEM:=C(DEVPTR 18-25) -\r
654 ,                                     C(DEVIAD 18-35) -1\r
655           SUB ITEM,TAC1\r
656 STOSQE:   HRRM ITEM,@TAC1       ;WORD COUNT TO FIRST WORD IN BUFFER\r
657           JRST CPOPJ1;          EXIT2. BLOCK COMPLETE\r
658 STOBIN:   TLZN IOS,IOFST;       WILL THE NEXT ITEM BE THE FIRST ITEM\r
659           JRST STO1;               OF A BUFFER?  IOSFST:=0\r
660           HRRZ TAC,DAT\r
661           CAMLE TAC,ITEM;       IS WORD COUNT <OR= (BUFFER SIZE-1)*\r
662           JRST STOE1;              [36/BYTE SIZE]?\r
663           MOVE ITEM,TAC;        ITEM:=WORD COUNT\r
664           MOVEM DAT,@DEVPTR(DEVDAT); STORE WORD COUNT IN BUFFER\r
665           JRST CPOPJ2;          EXIT3.  DATA STORED CORRECTLY.\r
666 STOBND:   HRRZ TAC1,DEVIAD(DEVDAT)\r
667           PUSHJ PDP,CKS12;      COMPUTE CHECKSUM\r
668           ADD TAC1, DEVIAD(DEVDAT)\r
669           HLLZ TAC1,@TAC1;      DATA CHECKSUM=COMPUTED CHECKSUM?\r
670           CAMN TAC,TAC1\r
671           JRST CPOPJ1;          EXIT2. BLOCK COMPLETE\r
672           TRO IOS,IODTER;       IODTER:=1\r
673           JRST CPOPJ;           EXIT1. CHECKSUM ERROR\r
674 \f\r
675 \r
676 ,DEC 06 00 EX COM L PT PRE 01 UINTQ\r
677 ,H.R. MORSE  64-12-26\r
678 ,CALLING SEQUENCE\r
679 ,         PUSHJ PDP, UINT1\r
680 ,         EXIT                  ALWAYS RETURNS HERE\r
681 ,TAC:=CONTENTYS OF WORD FOLLOWING UUO CALL\r
682 ,FROM USERS AREA.\r
683 ,MONITOR INTERFACE\r
684 ,         STORAGE: 4\r
685 ,         SYMBOLS SET/USED:\r
686 ,            ACCUMULATORS:   PDP U      TAC S/U\r
687 ,                            PROG U     \r
688               INTERN UINTQ\r
689 UINTQ:        MOVE TAC, -1(PDP)                 ;TAC:=ADDRESS FOLLOWING UUO C\r
690               HRLI TAC, PROG                    ;RELOCATE ADDRESS\r
691               MOVE TAC, @TAC                    ;TAC:=CONTENTS OF WORD FOLLOW\r
692                                                 ;UUO CALL FROM USERS AREA\r
693               POPJ PDP,                         ;RETURN\r
694 \r
695               END,\r