Added base source
[retro-software/dec/tops10/v4.5.git] / src / dskser.mac
1 IFN FTRA10, <\r
2 TITLE DSKSER -- DEVICE-INDEPENDENT DISK SERVICE ROUTINES.\r
3 >\r
4 IFE FTRA10, <\r
5 IFN FTRC10,<\r
6 TITLE   DSKSRB - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (BURROUGHS)\r
7 >>\r
8 IFE FTRC10,<\r
9 TITLE   DSKSRD - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (DATA PRODUCTS)\r
10 >\r
11 SUBTTL  A, BLACKINGTOM/CMF/TH/CHW/RCC/AF   TS 02 JUN 69  V424\r
12 XP      VDSKSR,424\r
13 \r
14 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
15 \r
16 INTERNAL FTRA10         ;TO ASSEMBLE DSKSER AS A\r
17                         ; DEVICE INDEPENDENT ROUTINE SET\r
18                         ; THIS SWITCH TO -1,  NOTE THAT MDFINT (THE BRYANT\r
19                         ; DSKINT) WAS WRITTEN SO AS TO KEEP DSKSER DEVICE-INDEPENDENT\r
20                         ; THIS SWITCH AND CODE ENCLOSED IN ITS IFE'S WILL ULTIMATELY\r
21                         ; BE REMOVED FROM DSKSER.\r
22 \r
23 \r
24 INTERNAL        FTRC10          ;TO ASSEMBLE DSKSER FOR THE PDP-10 DISK\r
25                                 ; (MODEL RC-10), SET THIS SWITCH TO -1,\r
26                                 ; FOR OLD (270) DISK SET IT = 0.\r
27 \r
28 IFN FTRA10, <\r
29 ENTRY DSKSER\r
30 DSKSER:\r
31 >\r
32 IFE FTRA10, <\r
33 IFN     FTRC10, <\r
34 ENTRY DSKSRB                    ;THIS SYMBOL IS TO PERMIT SYSTEM\r
35 DSKSRB:                         ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE,\r
36 >\r
37 IFE FTRC10, <\r
38 ENTRY DSKSRD            ;THIS ENTRY FOR SELECTIVE LOAD BY BUILD\r
39 DSKSRD:\r
40 >>\r
41 \r
42 EXTERNAL JIFMIN\r
43 \r
44 INTERNAL WLBIT,DSKFGS,CHKCNT\r
45 \r
46 TA=BUFPNT                       ;USED BY RENAME\r
47 TB=BUFWRD                       ;USED BY RENAME\r
48 \r
49 IFE FTRA10, <\r
50 INTERNAL MFDBLK,SATXWD\r
51 IFN     FTRC10, <\r
52 MFDBLK: 66                      ;ON PDD-10 DISK, MFD RETRIEVAL INFORMATION AND SAT\r
53 SATXWD: XWD -NUMSAT,67          ;BLOCKS GO AT THESE ABSOLUTE  ADDRESSES\r
54                                 ; UNLESS USER SPECIFIES OTHERWISE DURING "ONCE".\r
55 >\r
56 IFE     FTRC10, <\r
57 MDFBLK: 13000                   ;THIS BLOCK CONTAINS RETRIEVAL INFO, OF MFD\r
58 SATXWD: XWD -NUMSAT,13001       ;LH=NUMBER OF SAT BLOCKS.\r
59                                 ;RH=FIRST SAT BLOCK NUMBER.\r
60 >>\r
61 \f\r
62 CHKCNT=200                      ;NUMBER OF WORDS TO CHECK-SUM\r
63 W8BIT=400000                    ;WAIT INDICATION FOR DDB\r
64 \r
65 ; BITS IN LH OF IOS\r
66 \r
67 NMP=100                         ;NO MORE INPUT POINTERS (LH OF  IOS)\r
68 UBFS=200                        ;USING BUFFER IN FREE STORAGE (LH OF IOS)\r
69 NORELB=400                      ;DO NOT RELOCATE BUFFER ON I/O (LH IOS)\r
70 UBFU=1000                       ;USING BUFFER IN USER AREA\r
71 NCTRLC=2000                             ;DISABLE ^C DURING CRUCIAL SEQUENCES OF NON-\r
72                                         ; INTERRUPTABLE OPERATIONS\r
73 DAFLG=4000\r
74 AUFLG=10000\r
75 DSKFGS=AUFLG+DAFLG+UBFS+NCTRLC  ;USED TO SUPPRESS ACTION OF ^C,  SEE STOPCK\r
76 PRCHG=20000                     ;PROTECTION CHANGED\r
77 LIR=IOEND                       ;LAST INPUT REQUESTED\r
78 \r
79 ;MISCELLANEOUS CONSTANTS\r
80 TRIES=3                         ;NUMBER OF TIMES TO READ OR WRITE BAD BLOCK\r
81 BLKSIZ=200                      ;SIZE OF DATA BLOCK. DUMP MODE REQUIRES THIS\r
82 NBLKSZ=-BLKSIZ                  ;TO BE A POWER OF 2.\r
83 BLKP2=7                         ;BLKSIZ = 2^BLKP2\r
84 \r
85 ;TEST BITS PUT  IN LH OF DEVOAD\r
86 \r
87 PNTDIF=200000                   ;POINTERS IN CORE DO NOT MATCH POINTERS ON DISC\r
88 VRGPTR=100000                   ;FLAG TO SIGNAL THAT POINTERS HAVE NEVER BEEN WRITTEN\r
89 RENBIT=20000                    ;"RENAMING" INDICATION FOR SETLE ROUTINE\r
90 WPRO=40000                      ;LOOKUP DONE, FILE IS IN WRITE PROTTECT\r
91 CKSUPR=10000                    ;FLAG SET IF READING DUMP FILES IN NON-DUMP MODE\r
92 \f\r
93 ;CONSTANTS USED IN CONNECTION WITH ACCESS TABLE ENTRIES\r
94 \r
95 ATPP=0                          ;PROJECT,PROGRAMMER NUMBERS\r
96 ATNAME=1                        ;OWNER NAME\r
97 ATEXT=2                         ;EXTENSION\r
98 TBITS=2                         ;TEST BITS AND RCOUNT\r
99 ATBLOK=3                        ;BLOCK NUMBER OF RETRIEVL INFO OF UFD IN LH\r
100 ATLINK=3                        ;LINK TO NEXT ENTRY IN RH\r
101 \r
102 WTBIT=400000                    ;FILE IS BEING CREATED\r
103 DTBIT=200000                    ;DELETE WHEN THRU READING\r
104 RTBIT=100000                    ;FILE HAS BEEN RENAMED\r
105 ATBITS=500000                   ;WTBIT+RTBIT\r
106 ATIND=40000                     ;NAME IS ALREADY IN DIRECTORY\r
107 ATCLO=20000                     ;OUTPUT CLOSE TO BE DONE\r
108 RWTBIT=10000                    ;FILE BEING READ AND  WRITTEN, BUT NOT CREATED,\r
109 RCOUNT=7777                     ;MASK FOR THE COUNT OF READERS\r
110 \r
111 ;CONSTANTS USED IN CONNECTION WITH SAT BLOCKS\r
112 \r
113 XP NUMBIT,^D36*BLKSIZ           ;NUMBER OF BITS IN ONE BLOCK\r
114 \r
115 IFE FTRA10, <\r
116 IFN     FTRC10, <\r
117 XP      NUMSAT,4                ;ONLY FOUR SAT BLOCK ON PDP-10 DISK,\r
118 >\r
119 IFE     FTRC10, <\r
120 XP NUMSAT,16                    ;NUMBER OF SAT BLOCKS FOR 5.76 MILLION\r
121                                         ;WORD DATA PRODUCTS MODEL 270 DISK,\r
122 >>\r
123 XP WLBIT,400000                         ;IF BIT IS ON IN FIRST SATENT ENTRY\r
124                                 ;WORD, THE DISK IS WRITE-LOCKED.\r
125 \f\r
126 EXTERNAL DSKOFF\r
127 \r
128 DEFINE NOSCHEDULE <\r
129         CONO PI,DSKOFF\r
130 >\r
131 \r
132 EXTERNAL DSKON\r
133 DEFINE SCHEDULE <\r
134         CONO PI,DSKON\r
135 >\r
136 \f\r
137 INTERNAL FTCHECK,FTMONP\r
138 IFN FTCHECK+FTMONP,<\r
139 EXTERNAL DDBPTR,DSKCOR,PTRN,MOPTR,MIPTR,RUNUSR,SAVPRG,USRCNT\r
140 EXTERNAL SATPTR,SAT,SATBK2,DIRSIZ\r
141 EXTERNAL DSKDDB,DEVACC,DEVCNT,DEVBLK,DEVBKO,DSKBUF\r
142 EXTERNAL DSKCNT,SETCNT,PTR1,FPNTR,FPNTR1,FAT,DFBUSY,LOCORE,GTCOR3\r
143 EXTERNAL GTCOR2,CORBIT,CKSMCT,DSKSIZ,DSKACC,DSKAPP,CORBSZ,MONBUF\r
144 >\r
145 IFE FTCHECK+FTMONP,<\r
146 \r
147 ;DISK DEVICE DATA BLOCKS & MISCELLANEOUS CONSTANTS, WORKING STORAGE\r
148 DDBPTR: Z                       ;LOCATION OF NEXT DDB TO LOOK AT\r
149                                 ;DURING DISK INTERRUPT\r
150 \r
151 ;MORE MISCELLANEOUS FOR DISK\r
152 \r
153 INTERNAL SATPTR,SAT,SATBK2,REFLAG,DFBUSY,CKSMCT\r
154 MOPTR:  BLOCK   1               ;POINTER TO NEXT TASK TO DO\r
155 MIPTR:  BLOCK   1               ;POINTER TO NEXT FREE QUEUE ENTRY\r
156 \r
157 RUNUSR: BLOCK   1               ;LH=DEVDAT OF USER JOB RUNNING\r
158                                 ;RH= UNUSED\r
159 USRCNT: BLOCK   1               ;COUNT OF WAITING USER JOBS\r
160 DFBUSY: 0                       ;-1 IF DISK CONTROL IN USE, 0 IF FREE\r
161 FAT:    0                       ;POINTER TO FIRST ACCESS TABLE ENTRY\r
162 DKSMOT: 0                       ;COUNT OF VARIOUS CHECKSUM ERRORS\r
163 REFLAG: 0                       ;CONTAINS A PPN TO ALLOW LOGIN AFTER REFRESH\r
164 UXFERS: 0                       ;TOTAL USER TRANSFER ATTEMPTED\r
165 ECOUNT: 0                       ;TOTAL HARDWARE ERRORS ON USER TRANSFERS\r
166 ;DISK STORAGE ALLOCATION CONTROL\r
167 \r
168 SATPTR: BLOCK   1               ;POINTER TO CURRENT SATENT ENTRY\r
169 SATPIK: BLOCK   1               ;POINTER TO NON-FULL SAT ENTRY\r
170 SATCHG: BLOCK   1               ;0 IF SAT BLOCK IN CORE=BLOCK ON DISK, -1 OTHERWISE\r
171 SATTEM: BLOCK 1                 ;TEMPORARY SAVE LOCATIONS USED DURING SAT READ\r
172 SATTMP: BLOCK 1                 ; ROUTINE TO AVOID PUSH-DOWN LIST OVERFLOW.\r
173 \r
174 IFN FTRA10, <\r
175 EXTERNAL MFDBLK,SATXWD,NUMBLK,SATENT,SENTSZ,SATTOP\r
176 >\r
177 IFE FTRA10,<\r
178 INTERNAL SATENT\r
179 \r
180 IFN     FTRC10, <\r
181 XP      NUMBLK,^D4000   ;NUMBER OF DATA BLOCKS PER SAT BLOCK ON THE\r
182                         ; PDP-10 MODEL RC-10 DISK FILE.\r
183 >\r
184 IFE     FTRC10, <\r
185         XP      NUMBLK,5400     ;NUMBER OF DATA BLOCKS REPRESENTED BY\r
186                                 ;ONE SAT BLOCK ON THE DATA PRODUCTS 270 DISK.\r
187 >\r
188         XP      SENTSZ,3                ;SIZE OF EACH SATENT ENTRY\r
189 IFN     FTREC10, <\r
190 DSKXDB=0                        ;ON PDP-10 DISK FILE STORAGE BEGINS IN LOGICAL\r
191                                 ; BLOCK NO. 0,\r
192 >\r
193 IFE     FTRC10, <\r
194 DSKXDB=5400                     ;FILE STORAGE BEGINS ON SECOND DISK OF OLD (MOD 270)\r
195                                 ; DISK FILE SINCE FIRST DISK IS ALLOCATED\r
196                                 ; TO SWAPPING.\r
197 >\r
198 \f\r
199 SATENT: REPEAT  NUMSAT,<\r
200         XWD     DSKXDB,0        ;RH CONTAINS WLBIT AND COUNT OF BLOCK USED\r
201         BLOCK   1               ;BIT MASK, SINGLE ROTATING BIT\r
202         BLOCK   1               ;XWD LENGTH OF SAT TABLE POINTER WORD\r
203                                 ; IN SAT BLOCK\r
204         DSKXDB=DSKXDB+NUMBLK>\r
205 \r
206         XP      SATTOP,SATENT*SENTSZ*NUMSAT-SENTSZ\r
207 >;END OF FTRA100 CONDITIONAL\r
208 \r
209 SAT:    BLOCK   200             ;CURRENT SAT BLOCK\r
210 \r
211         XP      SAATM2,SAT-2    ;LOWEST ABS, ADR-1 ALLOWED IN CHANNEL COMMAND\r
212                                 ; LIST - USED TO KEEP FROM WIPING OUT MONITOR.\r
213 SATBK2: XWD     -200,SAT\r
214 \f\r
215         XP      DIRSIZ,4                ;NO. OF WORDS OF RET. INFO WHICH ARE\r
216                                 ;NOT POINTERS.\r
217 \r
218 ;THE DUMMY DEVICE DATA BLOCK\r
219 DSKCOR=10\r
220 DSKSIZ=4*DSKCOR                 ;NUMBER OF WORDS ALLOCATED FOR DDB\r
221                                 ;MUST BE A MULTIPLE OF FOR (SEE GETCOR)\r
222 \r
223 INTERN  DSKDDB\r
224 DSKDDB: SIXBIT  /DSK/\r
225         XWD     ^D5*HUNGST,201\r
226         Z\r
227         EXP     DSKDSP\r
228         XWD     DVOUT+DVIN+DVDIR+DVDSK+DVLNG,154403\r
229         Z\r
230         Z\r
231         XWD     PROG,\r
232         XWD     PROG,\r
233         XP      DEVFIL,.-DSKDDB ;FILE NAME\r
234         Z                       ;SIXBIT/FILE? - FILE NAME\r
235         XP      DEVEXT,.-DSKDDB ;FILE EXTENSION\r
236         Z                       ;XWD SIXBIT/EXT/,BLOCK# OF THE RIB\r
237         XP DEVPPN,.-DSKDDB      ;PROJ,PROGRAMMER FOR CURRENT\r
238                                 ; (OR MOST RECENT) LOOKUP,ENTER,RENAME\r
239         Z\r
240         XP      DEVACC,.-DSKDDB ;C(LH)=LOCATION OF CCESS TABLE ENTRY\r
241         Z                       ;C(LH)=ADDRESS OF ACCESS TABLE ENTRY\r
242                                 ;C(RH)=ADDRESS OF CURRENT POINTER IN DDB\r
243         XP      DEVCNT,.-DSKDDB ;C(LH)USED DURING LOOKUP,ENTER\r
244         Z                       ;C(LH)==RELATIVE BLOCK# WITHIN UFD OPTIMIZE UFD SEARCHES)\r
245                                 ;C(RH)=COUNT OF BLOCKS IN FILE\r
246         XP      DEVBLK,.-DSKDDB ;C(LH)=BLOCK NUMBER OF CURRENT POINTER\r
247         Z                       ;C(LH)=LOGICAL BLOCK# OF RIB\r
248                                 ;C(RH)=RELATIVE LOC. OF RIB\r
249                                 ;POINTER IN THAT BLOCK\r
250         XP      DEVBKO,.-DSKDDB ;LIKE DEVBLK, BUT FOR BEGINNING\r
251         Z                       ;SIMILAR TO DEVBLK - SAY WHERE CURRENT\r
252                                 ; POINTER COME FROM\r
253         XP      DSKBUF,.-DSKDDB ;C(LH)=-SIZE OF MONITOR READ/WRITE\r
254         Z                       ;C(LH)=-SZIE OF READ/WRITE\r
255                                 ;C(RH)=BUFFER IN USER AREA\r
256         XP      DSKCNT,.-DSKDDB ;C(LH)=BLOCK NUMBER TO READ/WRITE\r
257         Z                       ;C(LH)=LOGICAL BLOCK@ FOR READ OR WRITE\r
258                                 ;C(RH)=ERROR COUNT OR ERROR BITS\r
259         XP      SETCNT,.-DSKDDB ;LH CONTAINS POINTER TO R.I. OF\r
260                                 ;C(LH)=BLOCK# OF UFD RIB\r
261         Z                       ;UFD, RH IS SETO, SETI COUNTER.\r
262         XP      PTR1,.-DSKDDB   ;RETRIEVAL INFO STARTS HERE\r
263                                 ; DEFINE THE AREA CONTAINING RETRIEVAL; POINTERS\r
264         XP      FPNTR,PTR1+DIRSIZ       ;LOC. OF FIRST POINTER TO RET. INFO.\r
265         XP      FPNTR1,FPNTR-1\r
266         XP      PTRN,DSKSIZ-1\r
267 \f\r
268 ;DEFINE 3 WORD ENTRY CONTROLLING BIT SEARCH IN DDBTAB\r
269 \r
270 INTERNAL LOCORE,CRINIT\r
271 EXTERNAL DDBTAB\r
272 \r
273 LOCORE: EXP 0                   ;ADDRESS OF FIRST 4 WORD BLOCK IN FREE CORE AREA\r
274                                 ; SET BY LINKDB\r
275 CORBIT: 0                       ;FLOATING 1 BIT USED IN SEARCHES\r
276 CORIWD: XWD 0,0                 ;AOBJN POINTER TO FIRST WORD IN DDBTAB CONTAINING A 0\r
277 CRINIT: XWD 0,DDBTAB            ;INITIAL AOBJN POINTER FOR CORIWD\r
278                                 ; LH SET BY LINKDB\r
279 MONBUF: BLOCK 200               ;MONITOR BUFFER, USED TO READ RETRIEVAL POINTERS, ETC.\r
280 \f\r
281 ;ERROR CODES FOR LOOKUP, RENAME  AND/OR ENTER\r
282 \r
283 NOTINU=0                        ;NO SUCH FILE\r
284 NOTINM=1                        ;NO SUCH USER\r
285 PHOTF=2                         ;PROTECTION FAILURE\r
286 NORITE=3                        ;MORE THAN 1 WRITE TO A FILE\r
287 RENFAL=4                        ;TRIED TO RENAME FILE TO EXISTING NAME OR ENTER\r
288                                 ; A NULL FILE NAMES\r
289 NOFILE=5                        ;TRIED TO RENAME WITH NO FILE SELECTED\r
290 ERRBIT=1                        ;BITS GO IN WORD 1 OF THE ENTRY\r
291 \r
292 ;DISK DISPATCH TABLE\r
293 \r
294 INTERNAL DSKDSP\r
295 \r
296         JRST DSKINI             ;INITILIZE\r
297         JRST CPOPJ1             ;DSK HUNG TIMEOUT, NO ERROR MESSAGE\r
298 DSKDSP: JRST DFREL              ;RELEASE\r
299         JRST DFCLSO             ;CLOSE OUTPUT\r
300         JRST DFOUT              ;OUTPUT\r
301         JRST DFIN               ;INPUT\r
302         JRST DFENTR             ;ENTER\r
303         JRST DFLOOK             ;LOOKUP\r
304         JRST DFDMPO             ;DUMP OUTPUT\r
305         JRST DFDMPI             ;DUMP INPUT\r
306         JRST DFSET              ;USETO\r
307         JRST DFSET              ;USETI\r
308         POPJ PDP,               ;UGETF\r
309         JRST DFREN              ;RENAME\r
310         JRST DFCLSI             ;CLOSE INPUT\r
311         POPJ PDP,               ;UTPCLR\r
312         POPJ PDP,               ;MTAPE\r
313 \f\r
314 ;ACCINI - CALLED AT 140 START, 143 RESTART\r
315 ;  RESTORE DEVICE DATA BLOCK CHAIN\r
316 ; INITIALIZE DDBTAB BIT SEARCHING ENTRY\r
317 \r
318 INTERNAL ACCINI\r
319 \r
320 ACCINI: MOVSI TAC,(SIXBIT /DSK/)\r
321         MOVEI DEVDAT,DSKDDB     ;POINT TO PROTOTYPE DDB\r
322 ACCIN1: HLRZ DEVDAT,DEVSER(DEVDAT)\r
323         JUMPE DEVDAT,ACCIN2\r
324         CAMN TAC,DEVNAM(DEVDAT)\r
325         JRST ACCIN1\r
326 ACCIN2: MOVEI TAC,DSKDDB\r
327         HRLM DEVDAT,DEVSER(TAC) ;LINK PROTOTYPE TO FIRST NON DSK DDB\r
328         MOVSI TAC,400000\r
329         MOVEM TAC,CORBIT        ;INITIALIZE FLOATING 1 BIT\r
330         MOVE TAC,CRINIT\r
331         MOVEM TAC,CORIWD        ;RESET AOBJN WORD\r
332 \r
333         POPJ PDP,\r
334 \r
335 ;DSKINI - CALLED AT START, RESTART, 143 RESTART\r
336 ; REMOVE ACCESS ENTRIES, REMOVE DDB'S NOT ASSIGNED BY CONSOLE. CLEAR THE MONITOR QUEUE\r
337 INTERNAL DSKINI, SETSAT\r
338 EXTERNAL DISKUP,DFWUNS\r
339 \r
340 DSKINI: IFN FTSWAP, <\r
341         SETZM SQREQ             ;NO SWAPPING REQUEST\r
342         SETZM SERA\r
343 >\r
344         IFE FTRA10, <\r
345 EXTERNAL DSKCON\r
346         HLLZS DSKCON            ;CLEAR INTERRUPT FLAGS FOR CONSO\r
347 >\r
348         SETZM DFBUSY            ;DISK CONTROL AVAILABLE\r
349         SETZM RUNUSR            ;NO USER I/O IN PROGRESSS\r
350         SETOM USRCNT            ;NO USER TRANSFERS WAITING\r
351         SETZB DDBPTR            ;NO NEXT DDB\r
352                                 ; CLEAR IOS (SUPERSTITIOUS, BUT POSSIBLY NECESSARY)\r
353         MOVEI DEVDAT,DSKDDB     ;PREPARE TO RELEASE DISK DDB'S\r
354 DSKIN0: HLRZ DEVDAT,DEVSER(DEVDAT) ;GET DDB LINK\r
355         JUMPE DEVDAT,DSKIN1     ;JUMP IF END REACHED\r
356         MOVSI TAC, (SIXBIT /DSK/) ;DEVICE NAME\r
357         CAME TAC,DEVNAM(DEVDAT) ;IS THIS A DISK DDB?\r
358         JRST DSKIN1             ;NO. DONE\r
359         HLRZ TAC, DEVACC(DEVDAT) ; GET POINTER TO ACCESS ENTRY\r
360         SKIPE TAC               ;ACCESS ENTRY EXIST?\r
361         PUSHJ PDP,CLRAT         ;YES. REMOVE IT\r
362         MOVSI TAC,W8BIT         ;PREPARE TO CLEAR "TRANSFER WAITING" BIT \r
363         ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAITING\r
364         ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAITING\r
365         MOVE TAC,DEVMOD(DEVDAT)\r
366         TRNN TAC,ASSCON         ;DDB ASSIGNED BY ASSIGN COMMAND?\r
367         PUSHJ PDP,CLRDDB        ;NO. REMOVE DDB\r
368         JRST DSKIN0             ;CONTINUE\r
369 \r
370 DSKIN1: SETZM FAT               ;NO ACCESS ENTRIES\r
371         MOVEI TAC,MQUEUE+1      ;DESTINATION FOR BLT\r
372         MOVEM TAC,MIPTR\r
373         MOVEM TAC,MOPTR         ;RESET IN AND OUT POINTERS\r
374         HRLI TAC,MQUEUE\r
375         SETZM MQUEUE            ;SOURCE FOR BLT\r
376         BLT TAC,MQTOP-1         ;CELAR THE MONITOR QUEUE\r
377         PUSHJ PDP,DISKUP        ;DETERMINE IF DISK IS FUNCTIONING\r
378 SETSAT: AOSE STARTS             ;SKIP FIRST TIEM ONLY\r
379         JRST SAT01              ;WRITE SAT BLOCK IN CORE\r
380         JRST DFWUNS             ;SCAN ALL SAT BLOCKS\r
381 STARTS: -1                      ;COUNT STARTS, RESTARTS\r
382 \f\r
383 ;WRITE OUT SAT BLOCK, ENTER AT DSKSTP WITH FIXED START 147,\r
384 ;AT SAT01 UPON RE-ENTRY OF INITIALIZATION.\r
385 \r
386 INTERN DSKSTP,SAT05,JSAT06\r
387 \r
388 EXTERNAL DSKBIT,WSYNC,STOIOS,DCBBIT\r
389 \r
390 DSKSTP: HRRZI TAC,DSKBIT\r
391         IORI TAC,DCBBIT         ;DCBBIT NON-ZERO ONLY FOR DATA-PRODUCTS N$1K\r
392         IORI TAC,2200           ;CLEAR PI SYSTEM\r
393         CONO PI,10000(TAC)\r
394         SKIPL STARTS            ;HAS A SAT BLOCK BEEN READ IN?\r
395         PUSHJ PDP,SAT01         ;YES, WRITE IT OUT\r
396         CONO PI,10000\r
397         POPJ PDP,               ;YOU ARE SAFELY DONE.\r
398 \r
399 SAT01:  MOVEI DEVDAT,DSKDDB\r
400         SETZB IOS,DEVIOS(DEVDAT)\r
401         MOVEI PROG,0\r
402         PUSH PDP,WSYNC          ;CHANGE WSYNC ROUTINE\r
403         MOVE TAC,JSAT06\r
404         MOVEM TAC,WSYNC\r
405 SAT05:  MOVEI ITEM,TRIES        ;SET UP COUNT FOR ERRORS\r
406 SAT02:  PUSHJ PDP,SATBLK        ;SET UP TAC,TAC1\r
407         PUSHJ PDP,MQOUT         ;WRITE IT.\r
408         JRST SAT04              ;ERROR\r
409         SETZM SATCHG            ;SHOW SAT BLOCK IN CORE = BLOCK ON DISK.\r
410 \r
411         POP PDP,WSYNC           ;NO ERRORS, SO RETURN.\r
412         SETZM DEVIOS(DEVDAT)\r
413         POPJ PDP,\r
414 \r
415 SAT04:  SOJG ITEM,SAT02         ;ERRORS, SO TRY AGAIN\r
416         POP PDP,WSYNC           ;RESTORE WSYNC ROUTINE\r
417         JRST 4,SAT01\r
418 \r
419 SAT06:  MOVEI TAC,IOACT         ;THIS IS SUBSTITUE FOR WSYNC\r
420         TDNE TAC,DEVIOS(DEVDAT)\r
421         JRST .-1\r
422         POPJ PDP,\r
423 \r
424 JSAT06: JRST SAT06\r
425 \f\r
426 SUBTTL ENTER, LOOKUP, RENAME, CLOSE\r
427 ;ENTER UUO\r
428 \r
429 EXTERNAL TIME,PRJPRG,CPOPJ, THSDAT\r
430 \r
431 DFENTR: SKIPN @UUO              ;ZERO FILE NAME ?\r
432         JRST    DFER12\r
433         PUSHJ PDP,ALTMFD        ;ENTER TO MFD?\r
434         TLNE DEVDAT,LOOKB       ;NO, HAS LOOKUP BEEN DONE?\r
435         JRST DFENT5             ;YES\r
436         TLO IOS,IO\r
437         PUSHJ PDP,SETLE         ;RETURNS WITH PP ON PDL\r
438         JRST DFERR4             ;NO UFD, CLOCK ON\r
439         JRST DFENT2             ;NO FILE, CLOCK ON.\r
440         JRST DFERR6             ;FILE BEING WRITTEN\r
441         JRST DFENT7             ;FILE BEING READ,CHECK FOR WRITERS\r
442 \r
443 DFENT1: SCHEDULE\r
444         HRRZ TAC,DEVEXT(DEVDAT) ;BLOCK# OF FIRST RIB\r
445         PUSHJ PDP,SETPTR        ;READ FIRST RETRIEVAL POINTERS TO DDB\r
446         MOVSI DAT,100000        ;WRITE PROTECTION BIT\r
447         PUSHJ PDP,PROTEK        ;WRITE PROTECTED?\r
448         JRST DFERR3             ;NAME WRONG\r
449         JRST DFERR5             ;PROTECTION FAILURE.\r
450         MOVEI TAC1,WTBIT+ATIND+ATCLO ;BITS FOR ACCESS ENTRY-FILE EXISTS\r
451         TLZA IOS,PRCHG          ;PREPARE FOR PROTECTION CHECK\r
452 DFENT2: MOVEI TAC1,WTBIT+ATCLO  ;BITS FOR ACCESS ENTRRY - FILE CREATION\r
453         HLLZS DEVEXT(DEVDAT)    ;SET TO 0 RIB BLOCK#\r
454         NOSCHEDULE\r
455         PUSHJ PDP,SCANAT        ;SCAN ACCESS TABLE FROM BEGINNING\r
456         JRST DFENT3             ;NOT THERE\r
457 \f\r
458 DFEN2A: MOVE DAT,TBITS(TAC)     ;WRITE BIT ON?\r
459         TRNE DAT,WTBIT\r
460         JRST DFERR6             ;YES,ERROR\r
461         PUSHJ PDP,SCNAT2\r
462         JRST DFENT3\r
463         JRST DFEN2A\r
464 \r
465 DFENT3: TLZE    IOS,PRCHG       ;PROTECTION FAILURE?\r
466         JRST DFERR5             ;YES. GIVE ERROR RETURN.\r
467         SCHEDULE\r
468         PUSH PDP,TAC1           ;SAVE ACCESS BITS\r
469         PUSHJ PDP,DFGETF        ;GET A BLOCK FOR RETRIEVAL POINTERS. # IN TAC\r
470         POP PDP,TAC1            ;RESTORE ACCESS BITS\r
471         HRLZM TAC,DEVBLK(DEVDAT) ;SET CURRENT RIB# AND INDEX IN DDB\r
472         HRLZM TAC,DEVBKO(DEVDAT)\r
473         HRRM TAC,DEVEXT(DEVDAT) ;STORE FIRST RIB#\r
474         NOSCHEDULE\r
475 \r
476         MOVE DAT,TAC1           ;ACCESS ENTRY BITS\r
477         PUSHJ PDP,SETAT         ;CREATE ACCESS ENTRY. RETURN POINTER IN TAC1\r
478         HRLM TAC1,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY\r
479         MOVEI DAT,PTR1(DEVDAT)  ;SET UP RETRIEVAL INFO\r
480         MOVE TAC,DAT            ;DESTINATION (DDB)\r
481         HRLI TAC,@UUO           ;SOURCE (UUO PARAMETER BLOCK)\r
482         BLT TAC,2(DAT)          ;NAME & EXTENSION\r
483         SCHEDULE\r
484         MOVE TAC1,THSDAT\r
485         ORI TAC1,400000         ;MAKE SURE ACCESS DATE NON-ZERO,\r
486         HRRM TAC1,1(DAT)        ;STORE THSDAT AS ACCESS DATE\r
487         MOVE TAC1,2(DAT)\r
488         TLZ TAC1,777740         ;IS THERE A DATE ALREADY?\r
489         JUMPN TAC1,DFENT4       ;YES IF JUMP.\r
490         MOVE TAC,TIME           ;NO, GET TIME.\r
491         IDIVI TAC,JIFMIN\r
492         HRRZ TAC1,THSDAT        ;AND DATE.\r
493         DPB TAC,[POINT 11,TAC1,23]\r
494 DFENT4: TLO TAC1,55000          ;PROTECTION\r
495         DPB IOS,[POINT 4,TAC1,12] ;MODE\r
496         MOVEM TAC1,2(DAT)       ;STORE PROTECTION MODE TIME DATE IN DDB\r
497         MOVE ITEM,JOB\r
498         MOVE TAC,PRJPRG(ITEM)\r
499         MOVEM TAC,3(DAT)        ;STORE PROGRAMMER# IN DDB\r
500         SETZM 4(DAT)            ;CLEAR FIRST POINTER\r
501         MOVSI IOS,NMP           ;SET "NO MORE POINTERS"\r
502         ORB IOS,DEVIOS(DEVDAT)\r
503         TLZ DEVDAT,OCLOSB\r
504         HLLZS DEVCNT(DEVDAT)    ;CLEAR FILE SIZE\r
505         MOVSI TAC,VRGPTR        ;SET "VIRGIN POINTER" FLAG (O DFO4A SUBROUTINE\r
506         IORM TAC,DEVOAD(DEVDAT) ;WILL CREATE A NEW RIB WHEN JUST CALLED\r
507         JRST ALLOK\r
508 \f\r
509 ;AN ENTER AFTER A LOOKUP, SET "RWTBIT" FLAG IN ACCESS ENTRY\r
510 \r
511 DFENT5: MOVE TAC,DEVOAD(DEVDAT) ;CHECK PROTECTION\r
512         TLNE TAC,WPRO\r
513         PUSHJ PDP,DFERR5        ;FAILURE, THIS WILL NOT RETURN HERE\r
514         HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
515         NOSCHEDULE\r
516         MOVE TAC1,TBITS(TAC)    ;GET ACCESS BITS\r
517         TROE TAC1,RWTBIT        ;FILE BEING READN AND WRITTEN ALREADY?\r
518         PUSHJ PDP,DFERR6        ;YES,  THIS WILL NOT RETURN HERE\r
519         MOVEM TAC1,TBITS(TAC)   ;NO, SET IT\r
520         SCHEDULE\r
521         CONO PI,DSKON\r
522 \r
523         MOVE TAC,@UUO           ;SAVE FILE?\r
524         CAME TAC,DEVFIL(DEVDAT)\r
525         JRST DFERR8             ;NO, NAME WRONG\r
526         ADDI UUO,1\r
527         HLLZ  TAC,@UUO          ;PICKUP EXTENSION FROM USER ENTER BLOCK\r
528         XOR TAC,DEVEXT(DEVDAT)  ;COMPARE WITH LOOKUP EXTENSIONS(AND PICKUP\r
529                                 ; RETRIEVAL INFORMATION\r
530         TLNE TAC,-1             ;EXTENSION THE SAME?\r
531         JRST DFERR8             ;NO, EXTENSION WRONG\r
532         SOS     UUO             ;YES, RETRIEVE LATEST RETRIEVAL INFORMATION AND\r
533         PUSHJ   PDP,SETPTR      ;STORE CURRENT SIZE IN THE 4TH WORD OF THE 4-WORD\r
534         PUSHJ   PDP,DFLUK4      ;ENTER BLOCK (IN CASE SOME OTHER USER HAS APPENDED\r
535                                 ; DATA TO THIS FILE BETWEEN THE TIME THIS USER DID\r
536                                 ; HIS LOOK-UP AND THIS ENTER.) NOTE: THIS LAST\r
537                                 ; PUSHJ WILL EXIT TO UUOCON--NOT RETURN HERE!\r
538 \r
539 ;FILE IS BEING READ\r
540 \r
541 DFENT7: PUSHJ PDP,SCNAT2        ;FIND ANOTHER\r
542         JRST DFENT1             ;NO WRITERS, PERMIT THIS ENTER\r
543         JRST DFERR6             ;MUST BE BEING WRITTEN OR RENAMED\r
544 \f\r
545 ;LOOKUP UUO\r
546 \r
547 EXTERNAL UDLKC,TPOPJ\r
548 \r
549 DFLOOK: SKIPN   @UUO            ;ZERO FILE NAME ?\r
550         JRST    DFER12          ;IF SO, ERROR.\r
551         MOVEI TAC,CLSIN         ;SUPPRESS INPUT CLOSE IF UDLKC IS CALLED\r
552         TLNE DEVDAT,ENTRB       ;ENTER DONE YET?\r
553         PUSHJ PDP,UDLKC         ;CLOSE OUTPUT\r
554         TLZ IOS,IO              ;INPUT STATE\r
555         PUSHJ PDP,SETLE         ;RETURNS WITH PP ON PDL\r
556         JRST DFERR4             ;NO UFD, CLOCK ON\r
557         JRST DFERR7             ;NO FILE, CLOCK ON.\r
558         JRST DFLUK8             ;FILE BEING WRITTEN\r
559         JRST DFLUK3             ;FILE BEING READ\r
560 \r
561 DFLUK2: MOVEI DAT,0\r
562         PUSHJ PDP,SETAT         ;BUILD AN ACCESS ENTRY\r
563         MOVE TAC,TAC1           ;TAC,TAC1 POINT TO ACCESS ENTRY\r
564 \r
565 DFLUK3: AOS TBITS(TAC)          ;INCREMENT RCOUNT\r
566         HRLM TAC,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY\r
567         SCHEDULE\r
568         MOVE TAC,DEVEXT(DEVDAT) ;FIRST RIB#\r
569         PUSHJ PDP,SETPTR        ;GET IN THE RETRIEVAL INFO\r
570 \r
571         TLZE IOS,PRCHG          ;PROTECTION CHANGE FAILURE?\r
572         JRST DFLUK7             ;YES. ERROR RETURN\r
573         MOVSI DAT,200000        ;READ PROTECTION BIT\r
574         PUSH J PDP,PROTEK       ;READ PROTECTED?\r
575         JRST DFERR3             ;NAME WRONG\r
576         JRST DFLUK7             ;PROTECTION FAILURE\r
577 \r
578         MOVE TAC1,DEVOAD(DEVDAT) ;CHECK WRITE PROTECTION FOR\r
579         MOVSI DAT,100000        ;POSSIBLE SUBSEQUENT ENTER\r
580         PUSHJ PDP,PROTKX\r
581         TLOA TAC1,WPRO          ;WRITE PROTECTED. SET FLAG\r
582         TLZ TAC1,WPRO           ;WRITE OK--RESET FLAG\r
583         IORM TAC1,DEVOAD(DEVDAT)\r
584 \f\r
585 DFLUK4: MOVSI TAC,PTR1(DEVDAT)  ;COPY INFO TO LOOKUP PARAMETER BLOCK\r
586         NOSCHEDULE\r
587         HRRI TAC,@UUO           ;DESTINATION IS UUO PARAMETER BLOCK\r
588         MOVE TAC1,TAC\r
589         BLT TAC,2(TAC1)         ;BLT NAME. EXT. PROTECTION, ETC FROM DDB TO USER\r
590         SCHEDULE\r
591         HLRE TAC,FPNTR1(DEVDAT) ;FILE LENGTH (USUALLY -WORDS)\r
592         ADD UUO,3\r
593         HRLZM TAC,@UUO          ;SET UP 4TH WORD OF DIRECTORY HDR.\r
594         SUBI UUO,3              ;RESET UUO\r
595         MOVMS TAC               ;SET FILE SIZE (WORDS) IN DDB\r
596         HRRM TAC,DEVCNT(DEVDAT)\r
597         TLZ DEVDAT,ICLOSB\r
598         MOVSI TAC,VRGPTR        ;POINTERS DO EXIST ON THE DISK SO\r
599         ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR THE VIRGIN POINTERS FLAG.\r
600 \f\r
601 ALLOK:  MOVEI DAT,FPNTR(DEVDAT) ;SKIP FILE INFO IN FIRST RIB\r
602         HRRM DAT,DEVACC(DEVDAT) ;SET VERTICAL POINTER POINTER\r
603         MOVEI TAC,1\r
604         HRRM TAC,SETCNT(DEVDAT) ;"POISITONED" AT RELATIVE BLOCK 1 OF FILE\r
605         MOVSI TAC,777760-WPRO-VRGPTR ;CLEAR FLAGS\r
606         ANDCAM TAC,DEVOAD(DEVDAT)\r
607 \r
608 IFG CHKCNT,<\r
609 ;TO GET AROUND CHECKSUM FAILURE WHILE READING DUMP FILES IN NON-DUMP MODE\r
610 \r
611         LDB TAC1,[POINT 4,-2(DAT),12]\r
612         CAIGE TAC1,15           ;IS FILE IN DUMP MODE?\r
613         JRST ALLXIT             ;NO\r
614         LDB TAC1,[POINT 4,DEVIOS(DEVDAT),35]\r
615         MOVSI TAC,CKSUPR\r
616         CAIGE TAC1,15           ;IS CURRENT MODE DUMP?\r
617         IORM TAC,DEVOAD(DEVDAT) ;NO. SUPPRESS CHECKSUM\r
618 >\r
619 ALLXIT: POP PDP,TAC             ;REMEMBER 0(PDP) WASS XWD PROJ,PROG\r
620 \r
621         AOS (PDP)               ;RETURN TO CALL+2\r
622         JRST CLRBUF             ;RELEASE MONITOR BUFFER\r
623 \r
624 DFLUK7: PUSHJ PDP,DFCL21        ;PROTECTION FAILURE,CLEAR ACCESS\r
625         JRST DFERR5\r
626 \r
627 ;FILE IS BEING WRITTEN\r
628 \r
629 DFLUK8: PUSHJ PDP,SCNAT2        ;LOOK FOR ANOTHER\r
630         JRST DFLUK2             ;NO MORE\r
631         JRST DFLUK3             ;FOUND WHAT MUST BE READ\r
632 \r
633 ;TEST FOR MFD ALTERAION\r
634 \r
635 EXTERNAL SYSPP,JOB,PRJPRG\r
636 \r
637 ALTMFD: MOVEI TAC,3(UUO)        ;IS PROJ, PROG. = 1,1?\r
638         TLO TAC,PROG            ;RELOCATE\r
639         MOVE TAC,@TAC           ;XWD PROJ,PROG\r
640         CAME TAC,SYSPP\r
641         POPJ PDP,               ;NO,RETURN\r
642 \r
643         MOVE ITEM,JOB\r
644         XOR TAC,PRJPRG(ITEM)\r
645         TLNN TAC,-1             ;PRIVILEGED USER?\r
646         POPJ PDP,               ;YES, RETURN\r
647 \r
648         JRST    DFERR5\r
649 \f\r
650 ;RENAME UUO\r
651 \r
652 EXTERNAL CPOPJ1\r
653 EXTERNAL THSDAT\r
654 DFREN:  PUSHJ PDP,DFRENX\r
655         POPJ PDP,\r
656         JRST CPOPJ1\r
657 \r
658 DFRENX: SKIPN DEVFIL(DEVDAT)    ;IS THERE AN OLD FILE?\r
659         JRST DFER11             ;NO, UNDEFINED FILE\r
660         TLO IOS,IO              ;YES, LOOK FOR THE FILE\r
661         MOVSI TAC,RENBIT        ;RESET BIT\r
662         ANDCAM TAC,DEVOAD(DEVDAT)\r
663         ADDI UUO,3              ;POINT TO XWD PROJ,PROG\r
664         PUSHJ PDP,SETLE9        ;RETURNS WITH PP ON PDL\r
665         JRST DFERR4             ;NO UFD, CLOCK ON\r
666         JRST DFERR7             ;NO SUCH FILE, CLOCK ON.\r
667         JRST DFERR6             ;FILE BEING WRITTEN\r
668         JRST DFREN1             ;ALREADY HAS ACCESS ENTRY\r
669 \r
670         MOVEI DAT,0             ;BUILD ACCESS ENTRY\r
671         PUSHJ PDP,SETAT\r
672         MOVE TAC,TAC1           ;TAC,TAC1 POINT TO ACCESS ENTRY\r
673 \r
674 DFREN1: AOS TBITS(TAC)          ;INCREMENT RCOUNT\r
675         HRLM TAC,DEVACC(DEVDAT) ;SAVE POINTER TO ACCESS ENTRY\r
676         SCHEDULE\r
677         HRRZ TAC,DEVEXT(DEVDAT) ;CAN THIS FILE BE RENAMED?\r
678         PUSHJ PDP,SETPTR        ;READ IN FIRST SET OF RETRIEVAL POINTERS\r
679         MOVEI   AC1,@UUO        ;IS THE PROTECTION TO BE CHANGED ?\r
680         MOVEI   TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO IN DDB\r
681         MOVE    AC1,2(AC1)      ;USER SPECIFIED PROTECTION\r
682         XOR     AC1,2(TAC)      ;COMPARE WITH STORED PROTECTION\r
683         TLZ     IOS,PRCHG\r
684         TLNN    AC1,777000      ;ANY DIFFERENCES?\r
685         JRST DFRN2A\r
686         MOVSI DAT,400000        ;YES, CAN IT BE?\r
687         PUSHJ PDP,PROTKX\r
688         JRST DFREN8             ;NO, ERROR\r
689         TLO IOS,PRCHG           ;YES\r
690 DFRN2A: MOVSI DAT,100000        ;CAN THIS BE RE-WRITTEN?\r
691         PUSHJ PDP,PROTEK\r
692         JRST DFERR3             ;BAD RETREIVAL INFO\r
693         JRST DFRN8A             ;WRITE PROTECTED\r
694         TLZ IOS,PRCHG           ;ARBITRARY CHANGE OK.\r
695 \f\r
696 DFREN2: NOSCHEDULE\r
697         PUSHJ PDP,SCANAT        ;SCAN ACCESS TABLE FROM BEGINNING\r
698         JRST DFRN1B             ;NO\r
699 \r
700 DFRN1A: MOVE DAT,TBITS(TAC)     ;YES, BEING ALTERED?\r
701         TRNE DAT,ATBITS         ;FILE BEING CREATED OR RENAMED?\r
702         JRST DFREN9             ;YES, YOU LOSE.\r
703         PUSHJ PDP,SCNAT2        ;NO, CONTINUE SCANNING\r
704         JRST DFRN1B\r
705         JRST DFRN1A             ;FOUND ANOTHER\r
706 \r
707 DFRN1B: HLRZ TAC,DEVACC(DEVDAT) ;SET RENAME FLAG IN FIRST ENCOUNTERED ACCESS ENTRY\r
708         MOVEI AC1,RTBIT         ;RENAME BIT\r
709         ORM AC1,TBITS(TAC)\r
710         SCHEDULE\r
711 \f\r
712         MOVE TAC,@UUO           ;GET NEW FILENAME\r
713         CAME TAC,DEVFIL(DEVDAT) ;SAVE AS DDB?\r
714         JRST DFREN3             ;NO\r
715         ADDI UUO,1              ;YES, SAME EXTENSION?\r
716         MOVE TAC,@UUO           ;NEW EXTENSION\r
717         XOR TAC,DEVEXT(DEVDAT)  ;COMPARE WITH DDB?\r
718         TLNE TAC,-1             ;SAME?\r
719         SOJA UUO,DFREN3         ;NO\r
720 \r
721 ;FILENAME AND EXTENSION ARE IDENTICAL. CHANGE ONLY PROTECTION\r
722 \r
723         TLZ IOS,PRCHG           ;CLEAR PRTOECTION CHANGE FLAG\r
724         ADDI UUO,1              ;YES, CHANGE PROTECTION\r
725         LDB AC1,[POINT 9,@UUO,8] ;NEW PROTECTION\r
726         HRRZ TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER,CONTAINING RETRIEVAL INFO\r
727         ADDI TAC1,2             ;POINT TO PROTECTION\r
728         TLNN IOS,UBFS           ;BUFFER IN MONITOR CORE?\r
729         TLO TAC1,PROG           ;NO, RELOCATION.\r
730         DPB AC1,[POINT 9,@TAC1,8] ;STORE NEW PROTECTION IN RIB\r
731 \r
732         PUSHJ PDP,WRI           ;RE-WRITE THE BLOCK\r
733 \r
734 DFREXT: AOS -1(PDP)             ;LEAVE\r
735         POP PDP,TAC\r
736         PUSHJ PDP,CLRBUF        ;CLEAR NAY DUMP BUFFER\r
737         JRST DFCL21             ;CLEAR ACCESS ENRTY AND EXIT\r
738 \r
739 DFREN3: TLZE IOS,PRCHG          ;IS ONLY PROTECTION CHANGE PERMITTED?\r
740         JRST DFREN8             ;YES. ERROR SINCE TRYING TO CHANGE NAME.EXT\r
741         POP PDP,TAC             ;BACK UP PDP\r
742         PUSHJ PDP,ALTMFD        ;ALTERING MFD?\r
743         SKIPN @UUO              ;RENAMING TO 0 (I.E. DELETING)?\r
744         JRST DFREN7             ;YES\r
745 \r
746         MOVE TAC,DEVACC(DEVDAT) ;SAVE INFO ON OLD FILE THAT WILL BE CHANGED BY SETLE\r
747         HLR TAC,SETCNT(DEVDAT)  ;BLOCK# OF UFD RIB\r
748         PUSH PDP,TAC            ;SAVE XWD ACCESS POINTER, BLOCK#\r
749         MOVE TA,DEVEXT(DEVDAT)  ;BLOCK# OF FIRST FILE RIB\r
750         HLL TA,DEVCNT(DEVDAT)   ;RELATIVE TO UFD BLOCK#\r
751         MOVE TB,DEVFIL(DEVDAT)  ;HOLD FILE NAME\r
752 \r
753         MOVSI TAC,RENBIT\r
754         ORM TAC,DEVOAD(DEVDAT)  ;FOR "SETLE"\r
755         PUSHJ PDP,SETLE0        ;LOOK FOR THIS NEW FILE NAME\r
756         JRST DFERR4             ;NO UFD (SHOULD NOT HAPPEN)\r
757         JRST DFREN5             ;NEW FILE NOT THERE\r
758         JFCL                    ;NEW NAME ALREADY THERE, ERROR\r
759         JFCL\r
760         POP     PDP,TAC\r
761         SCHEDULE\r
762         PUSHJ PDP,DFCL21\r
763         JRST DFER10\r
764 \f\r
765 ;ALTER RETRIEVAL INFORMATION\r
766 \r
767 DFREN5: POP PDP,DAT             ;BACK UP PDP\r
768 \r
769         MOVEM TB,DEVFIL(DEVDAT) ;RESTORE OLD FILE NAME TO DDB\r
770         HRRM TA,DEVEXT(DEVDAT)  ;RESTORE BLOCK# OF RIB\r
771         HLLM TA,DEVCNT(DEVDAT)  ;RESTORE UFD RELATIVE BLOCK\r
772 \r
773         MOVE TAC,(PDP)          ;XWD ACCESS POINTER, BLOCK#\r
774         HLLM TAC,DEVACC(DEVDAT) ;RESTORE POINTER TO ACCESS ENTRY\r
775         HRLM TAC,SETCNT(DEVDAT) ;RESTORE BLOCK# OF UFD RIB\r
776         HRRZ TAC,TA\r
777         MOVSM TAC,DEVBLK(DEVDAT) ;RESET BLOCK#, INDEX TO RETRIEVAL POINTERS\r
778         PUSHJ PDP,RRIA          ;GET RETRIEVAL INFO BLOCK\r
779         PUSHJ PDP,SET000        ;POINT TAC1 TO WORD 0\r
780 \r
781         MOVE TAC,@UUO           ;GET NEW NAME\r
782         MOVEM TAC,@TAC1         ;STORE IN RIB\r
783         ADDI TAC1,1             ;CHANGE EXTENSION\r
784         ADDI UUO,1\r
785         MOVE TAC,@TAC1          ;GET OLD EXTENSION\r
786         HLLM TAC,DEVEXT(DEVDAT) ;RESET EXTENSION IN DDB\r
787         MOVE TAC,@UUO           ;NEW EXTENSION\r
788         HRR TAC,THSDAT          ;AND ACCESS DATE\r
789         ORI TAC,400000          ;INSURE IT IS NON-ZERO\r
790         MOVEM TAC,@TAC1         ;STORE IN RIB\r
791         ADDI TAC1,1             ;CHANGE PROTECTION\r
792         ADDI UUO,1\r
793         LDB TAC,[POINT 9,@UUO,8] ;GET NEW PROTECTION\r
794         DPB TAC,[POINT 9,@TAC1,8] ;STORE IN RIB\r
795 \r
796         PUSHJ PDP,WRI           ;RE-WRITE RIB\r
797 \f\r
798 ;ALTER UFD BLOCK\r
799 \r
800         PUSHJ PDP,FINDE         ;BRING IN CORRECT BLOCK\r
801         \r
802         SUBI UUO,1              ;REPLACE EXTENSION IN UFD\r
803         MOVE TAC,@UUO\r
804         HLLM TAC,@TAC1\r
805         SUBI UUO,1              ;AND NAME\r
806         SUBI TAC1,1\r
807         MOVE TAC,@UUO\r
808         MOVEM TAC,@TAC1\r
809 \r
810         PUSHJ PDP,WUFD          ;RE-WRITE THE BLOCK\r
811         JRST DFREXT             ;LEAVE\r
812 \r
813 ;FILE COULD NOT BE RENAMED BECAUSE OF PROTECTION\r
814 \r
815 DFRN8A: TLNE  IOS,PRCHG         ;PROTECTION CHANGE?\r
816         JRST DFREN2             ;YES\r
817 \r
818 DFREN8: PUSHJ PDP,DFCL21        ;TAKE OUT ACCESS ENTRY\r
819         JRST DFERR5             ;AND LEAVE\r
820 \r
821 ;FILE COULD NOT BE RENAMED BECAUSE IT WAS BEING CREATED.\r
822 \r
823 DFREN9: SCHEDULE\r
824         PUSHJ PDP,DFCL21        ;TEAKE OUT ACCESS ENTRY\r
825         JRST DFERR6\r
826 \f\r
827 ;DELETE A FILE FROM A UFD\r
828 \r
829 DFREN7: PUSHJ PDP,FINDE         ;FIND THE CORRECT BLOCK\r
830 \r
831         NOSCHEDULE\r
832         MOVEI TAC1,@TAC1\r
833         SUBI TAC1,1             ;DESTINATION\r
834         HRLI TAC1,2(TAC1)       ;SOURCE IS ENTRY BEYOND DESTINATION\r
835 \r
836         HRRZ    AC2,DSKBUF(DEVDAT)\r
837         ADDI    AC2,BLKSIZ-2    ;SET LIMIT OF BLT\r
838         TLNN    IOS,UBFS        ;BUFFER IN MONITOR ONE?\r
839         ADDI    AC2,(PROG)      ;NO. RELOCATE\r
840 \r
841         BLT TAC1,(AC2)          ;MOVE SOME WORDS UP (ONE TOO MANY BECAUSE\r
842                                 ; COULD BE DELETING 64TH ENTRY IN UFD BLOCK)\r
843 \r
844         SETZM @AC2              ;MAKE SURE OF ZERO\r
845         SETZM 1(AC2)\r
846         SCHEDULE\r
847 \r
848         PUSHJ PDP,WUFD          ;RE-WRITE\r
849         AOS (PDP)               ;SKIP RETURN\r
850         HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
851         MOVEI TAC1,DTBIT\r
852         IORM TAC1,TBITS(TAC)    ;SET TO DELETE WHEN THROUGH READIN\r
853         JRST DFCL21             ;CLOSE ACCESS ENTRY AND LEAVE\r
854 \f\r
855 ;SET UP ARGUMENT LIST FOR LOOKUP, ENTER, AND RENAME\r
856 ;SEARCH THRU MFD AND UFD FOR THE FILE-NAME,\r
857 ;EXIT TO CALL+1 IF A UFD CANNOT BE FOUND.\r
858 ;EXIT TO CALL+2 IF THE FILE IS NOT FOUND.\r
859 ;EXIT TO CALL+3 IF FILE IS BEING WRITTEN\r
860 ;EXIT TO CALL+4 IF FILE IS BEING READ\r
861 ;EXIT TO CALL+5 IF THE FILE DOES NOT HAVE ACCESS ENTRY.\r
862 \r
863 ;UPON EXIT,     (PDP) = OWNER PROJ,-PROG. NUMBER\r
864 \r
865 EXTERNAL SYSPP,JOB,PRJPRG,CPOPJ2,CPOPJ1\r
866 \r
867 SETLE:  MOVSI TAC,RENBIT        ;TURN OFF THE FLAG\r
868         ANDCAM TAC,DEVOAD(DEVDAT)\r
869 \r
870 SETLE0: MOVEM IOS,DEVIOS(DEVDAT)\r
871         TLO UUO,PROG\r
872         MOVE AC1,@UUO           ;PICK UP FILE NAME\r
873         MOVEM AC1,DEVFIL(DEVDAT) ;STORE FILE NAME AND EXT IN DDB\r
874 \r
875         ADDI UUO,1\r
876         HLLZ AC1,@UUO\r
877         MOVEM AC1,DEVEXT(DEVDAT)\r
878         ADDI UUO,2              ;UUO POINTS TO PP\r
879 SETLE9: MOVE ITEM,JOB           ;TRY CURRENT JOB PP.\r
880         SKIPG DAT,@UUO          ;IS IT A PP?\r
881         MOVE DAT,PRJPRG(ITEM)   ;NO. GET PP FROM TABLE.\r
882         TLNE DEVDAT,SYSDEV      ;SYSTEM DEVICE?\r
883         MOVE DAT,SYSPP          ;YES, USE SYSTEM (CUSP) PROJ,PROG #\r
884         MOVEM DAT,@UUO\r
885         MOVEM DAT,DEVPPN(DEVDAT) ;SAVE PRJ,PRG FOR USE BY UUOCON\r
886         SUBI UUO,3              ;UUO POINTS TO FILE NAME\r
887         EXCH DAT,(PDP)          ;PUT PP-NUMBER IN PD LIST\r
888         PUSH PDP,DAT            ;PDP POINTS TO CALL+1\r
889 \f\r
890 ;SEARCH MFD FOR THE OWNER OF THE FILE\r
891 \r
892         MOVE DAT,-1(PDP)         ;XWD PROJ,PROG\r
893         MOVSI AC1,(SIXBIT /UFD/) ;EXTENSION "UFD"\r
894         MOVE TAC,MFDBLK          ;BLOCK# OF MFD RIB\r
895         PUSHJ PDP,DIRSRC\r
896         POPJ PDP,                ;UFD NOT THERE\r
897 \r
898 ;SEARCH UFD FOR THE FILE\r
899 \r
900         AOS (PDP)                ;PDP POITNS TO CALL+2\r
901         ADDI TAC,1               ;POINT TO XWD SIXBIT/EXT/,BLOCK#\r
902         HRRZ TAC,@TAC            ;BLOCK# OF UFD RIB\r
903         HRLM TAC,SETCNT(DEVDAT)  ;SAVE BLOCK#\r
904         SETZM DEVCNT(DEVDAT)     ;LH WILL BE USED TO COUNT UFD BLOCKS\r
905         MOVE AC1,DEVEXT(DEVDAT)\r
906         PUSHJ PDP,DSRC10         ;SEARCH UFD\r
907         POPJ PDP,                ;FILE NOT THERE\r
908 \r
909         ADDI TAC,1               ;POINT TO XWD SIXBIT/EXT/,BLOCK#\r
910         MOVE AC3,@TAC\r
911         HRRM AC3,DEVEXT(DEVDAT)  ;SAVE BLOCK# OF FIRST RIB\r
912         AOS (PDP)                ;PDP POINTS TO CALL+3\r
913         MOVE AC2,-1(PDP)         ;XWD PROJ,PROG\r
914         NOSCHEDULE\r
915         PUSHJ PDP,SCNAT0         ;LOOK IN ACCESS TABLE\r
916         JRST CPOPJ2              ;NOT THERE. RETURN TO CALL+5\r
917         MOVE DAT,TBITS(TAC)      ;RENAMING?\r
918         TRNE DAT,WTBIT           ;BEING WRITTEN?\r
919         POPJ PDP,                ;YES. RETURN TO CALL+3\r
920         TRNN DAT,RTBIT\r
921         JRST CPOPJ1              ;NO, ALL OK, RETURN TO CALL+4\r
922         MOVE TAC,DEVOAD(DEVDAT)  ;ARE WE RENAMING?\r
923         TLNE TAC,RENBIT\r
924         POP PDP,TAC              ;YES\r
925         POP     PDP,TAC\r
926         JRST DFERR6\r
927 \f\r
928 ;CHECK RETRIEVAL INFO FOR ELIGIBILITY\r
929 ;ENTER WITH C(DAT) = PROTECTION TO CHECK IN BITS 0-2\r
930 ;EXIT TO CALL+1 IF NAME OR EXTENSION WRONG\r
931 ;EXIT TO CALL+2 IF PROTECTION WRONG\r
932 ;EXIT TO CALL+3 IF ALL OK\r
933 \r
934 EXTERNAL JOB,PRJPRG,CPOPJ1,DUMPPP\r
935 \r
936 PROTEK: MOVEI TAC,PTR1(DEVDAT)  ;POINT TO RETRIEVAL INFO\r
937         MOVE AC1,@TAC           ;NAME OK?\r
938         CAME AC1,DEVFIL(DEVDAT)\r
939         POPJ PDP,               ;NO\r
940         HLLZ AC2,DEVEXT(DEVDAT)\r
941         HLLZ AC1,1(TAC)         ;EXTENSION FROM RIB\r
942         CAM AC1,AC2\r
943         POPJ PDP,               ;EXTENSION NOT RIGHT\r
944 \r
945         AOS (PDP)\r
946 PROTKX: MOVE AC1,-1(PDP)\r
947 \r
948 PROTKY: MOVE ITEM,JOB\r
949         XOR AC1,PRJPRG(ITEM)\r
950         TRNN AC1,-1             ;SAVEM PROGRAMMER?\r
951         JRST PROT1              ;YES\r
952 \r
953         ROT DAT,-3              ;ROTATE TO PROJECT FIELD\r
954         TLNE AC1,-1             ;NO, SAME PROJECT?\r
955         ROT DAT,-3              ;NO, ROTATE TO UNIVERAL FIELD\r
956 \r
957 PROT1:  TLZ DAT,60000   ;DO NOT TEST OWNER READ OR PROTECT PROTECTION\r
958         TDNN DAT,2(TAC)\r
959         JRST CPOPJ1     ;PROTECTION O.K.\r
960         MOVE AC1,PRJPRG(ITEM)\r
961         CAMN AC1,DUMPPP ;EQUAL TO DUMPPER PROJECT\r
962                         ;PROGRAMMER NUMBER?\r
963         AOS(PDP)        ;YES, ALL FILES AVAILABLE\r
964         POPJ PDP,\r
965 \f\r
966 ;CLOSE UUO\r
967 ;CLOSE AN OUTPUT FILE\r
968 \r
969 EXTERNAL PIOMOD,WAIT1,OUT\r
970 \r
971 DFCLSO: TLNN DEVDAT,ENTRB       ;ENTER DONE YET?\r
972         POPJ PDP,       ;NO, FORGET IT\r
973         HLRZ TAC,DEVACC(DEVDAT) ;SHOULD WE CLOSE? (POINT TO ACCESS ENTRY)\r
974         IFN FTRCHK,<\r
975         SKIPN TAC       ;ACCESS TABLE POINTER EXISTS?\r
976         HALT .  ;IF NOT, HALT, NO RE-START POSSIBLE.\r
977 >\r
978         MOVE TAC,TBITS(TAC)\r
979         IFN FTRCHK, <\r
980         TRNN TAC,ATCLO+RWTBIT   ;CREATION OR UPDATE OF FILE IN PROGRESS?\r
981         HALT .  ;NO, ERROR. CAN'T CONTINUE\r
982 >\r
983         LDB TAC,PIOMOD\r
984         CAIGE TAC,DR    ;DUMP MODE?\r
985         TLNE DEVDAT,DSKRLB      ;RESET UUO IN PROGRESS?\r
986         JRST DFCL2      ;YES TO EITHER QUESTION\r
987         HLRZ TAC,DEVBUF(DEVDAT) ;NO. GET ADDRESS OF OUTPUT\r
988                         ; BUFFER HEADER BLOCK.\r
989         TLO TAC,PROG    ;RELOCATE\r
990         SKIPG TAC1,@TAC ;VIRGIN BUFFERS (NO RING SET-UP) ?\r
991         JRST DFCL2      ;YES, DON'T OUTPUT\r
992         AOS TAC ;TAC POINTS TO OUTPUT BYTE POINTER\r
993         ADD TAC1,[XWD PROG,1]   ;TAC1 POINTS TO WORD COUNT PRECEDING\r
994                         ; USER DATA BUFFER\r
995         HRRZ AC1,@TAC   ;PICK UP OUTPUT BYTE POINTER\r
996         SKIPE AC1       ;DON'T CALCULATE WORD COUNT IF BYTE POINTER\r
997                         ; NOT SET UP\r
998         SUBI AC1,(TAC1) ;CALCULATE NUMBER OF WORDS USER HAS FILLED\r
999         TRNE IOS,IOWC   ;USER KEEPING HIS OWN WORD COUNT ?\r
1000         HRRZ AC1,@TAC1  ;YES, SUBSTITUTE HIS COUNT FOR\r
1001                         ; COMPUTED WORD COUNT\r
1002         SKIPN AC1       ;WORD COUNT EQUAL TO 0?\r
1003         JRST DFCL2      ;YES, DON'T OUTPUT 0-WORD FINAL BLOCK.\r
1004         PUSHJ PDP,OUT   ;NO, GO WRITE LAST PARTIAL BUFFER\r
1005         PUSHJ PDP,WAIT1 ;WAIT FOR IT TO FINISH\r
1006         \r
1007 DFCL2:  PUSHJ PDP,SETBUF        ;CHOOSE A BUFFER AREA FOR RETRIEVAL POINTERS\r
1008         TLO IOS,NMP!NCTRLC              ;SET NMP, MUST NOT INTERRUPT POINTER WRITING\r
1009         MOVEM IOS,DEVIOS(DEVDAT) ;DO DFO4A WON'T READ NEW POINTERS IN\r
1010         PUSHJ PDP,DFO4A ;WRITE OUT LAST BLOCK OF POINTERS\r
1011         HLRZ AC1,DEVBLK(DEVDAT)\r
1012         XOR AC1,DEVEXT(DEVDAT)\r
1013         TRNE AC1,-1             ;ONLY ONE BLOCK OF POINTERS?\r
1014         PUSHJ PDP,RRIB  ;NO. READ FIRST BLOCK INTO BUFFER\r
1015         PUSHJ PDP,SET000\r
1016         ADDI TAC1,3     ;SET TAC1 TO POINT TO 4TH WORD OF BUFFER\r
1017         MOVN AC1,DEVCNT(DEVDAT) ;PICK UP AND NEGATE SIZE OF FILE\r
1018         HRLM AC1,@TAC1  ;NEGATIVE WORD COUNT INTO FOURTH WORD OF FIRST RIB\r
1019         PUSHJ PDP,WRIB  ;WRITE OUT FIRST BLOCK OF RETRIEVAL INFORMATION\r
1020 \f\r
1021 ;CLOSE UUO CONTINUED.\r
1022 ;THE FILE AND ALL ITS POINTERS HAVE BEEN PUT ON DISK.\r
1023 ;NOW PUT ENTRY IN DIRECTORY.\r
1024         TLZ DEVDAT,ENTRB\r
1025         HLRZ TAC,DEVACC(DEVDAT) ;PICK UP ACCESS TABLE POINTER\r
1026         MOVE DAT,TBITS(TAC)     ;GET STATUS BITS AND READ COUNT\r
1027         TRZE DAT,RWTBIT ;CLOSING AND UPDATED FILE?\r
1028         JRST DFCLU1     ;YES\r
1029         TLNE DEVDAT,DSKRLB      ;RESET UUO IN PROGRESS?\r
1030         JRST DFC16A     ;YES\r
1031         TRNN DAT,ATIND  ;IUS NAME ALREADY IN DIRECTORY?\r
1032         JRST DFCL20     ;NO. INSERT IT\r
1033         MOVEM IOS,DEVIOS(DEVDAT)\r
1034         PUSHJ PDP,FINDE ;BRING IN BLOCK WITH THIS ENTRY.\r
1035         MOVE TAC,DEVEXT(DEVDAT) ;CHANGE BLOCK POINTER\r
1036         EXCH TAC,@TAC1  ;TAC1 POINTS TO ENTRY IN UFD BLOCK\r
1037         MOVEM TAC,DEVEXT(DEVDAT);SAVE POINTER TO RIB OF OLD VERSION FOR RECLAM  \r
1038         PUSHJ PDP,WUFD  ;WRITE THE BLOCK BACK OUT\r
1039         HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER\r
1040         NOSCHEDULE\r
1041         PUSH PDP,ATPP(TAC)      ;SAVE XWD PROJ,PROG\r
1042         PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY\r
1043         POP PDP,AC2     ;XWD PROJ,PROG\r
1044         PUSHJ PDP,SCNAT0        ;SCAN FOR ANY OTHERS READING OLD VERSION\r
1045         JRST DFCL17             ;NONE\r
1046         \r
1047 DFCL16: MOVEI AC1,DTBIT ;DELETE WHEN THRU READING SINCE IT WAS JUST UPDATED\r
1048         IORM AC1,TBITS(TAC)\r
1049         PUSHJ PDP,SCNAT2        ;LOOK FOR MORE\r
1050         JRST CLRBUF     ;NO MORE\r
1051         JRST DFCL16\r
1052 DFC16A: PUSHJ PDP,CLRAT ;UPON RESET UUO WITH PARTIALLY WRITTEN FILE.\r
1053                         ; CLEAR ACCESS TABLE ENTRY RECLAIM DISK SPACE.\r
1054                         \r
1055 DFCL17: SCHEDULE\r
1056         HRRZ TAC,DEVEXT(DEVDAT) ;RIB# OF FILE\r
1057         JRST RECLAM\r
1058         \r
1059 DFCL20: PUSHJ PDP,INSDIR                ;INSERT THE NAME\r
1060         HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER\r
1061         NOSCHEDULE\r
1062         PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY\r
1063         JRST CLRBUF     ;CLEAR ANY BUFFER IN FREE STORAGE\r
1064 DFCLU1: MOVEM DAT,TBITS(TAC)    ;STORE STATUS BITS (WITH UPDATE MARKER CLEARED)\r
1065         TLN DEVDAT,LOOKB        ;WAS IUNPUT SIDE OF FILE ALSO CLOSED?\r
1066         POPJ PDP,       ;NO, LET THE USER KEEP READING IT\r
1067         TRNE DAT, RCOUNT        ;YES, ANYBODY ELSE STILL READING IT?\r
1068         JRST DFCLU2     ;YES\r
1069         TRNE DAT,DTBIT  ;NO, WAS IT MARKED FOR DELETION?\r
1070         JRST DFC16A     ;YES, GO DELETE IT AND RECLAIM DISK SPACE\r
1071         PUSHJ PDP,CLRAT ;NO, CLEAR ACCESS TABLE ENTRY\r
1072 DFCLU2: HRRZS DEVACC(DEVDAT)    ;CLEAR POINTER TO ACCESS TABLE\r
1073         JRST CLRBUF     ;CLEAR ANY BUFFER AREA AND EXIT.,\r
1074 \r
1075 \r
1076         ;CLOSE UUO CONTINUED.\r
1077 ;CLOSE AN INPUT FILE.\r
1078 \r
1079 DFCLSI: TLZN DEVDAT,LOOKB\r
1080         POPJ PDP,\r
1081 DFCL21: HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY\r
1082         JUMPE TAC,CPOPJ ;EXIT IF ACCESS TABLE ALREADY CLOSED\r
1083                         ; (PROBABLY ^C DURING EARLIER ATTEMPT)\r
1084         MOVE TAC1,TBITS(TAC)    ;GET STATUS BITS\r
1085         IFN FTRCHK,<\r
1086         TRNE TAC1,ATCLO ;IS THIS FILE SIMPLY BEING CREATED (NOT UPDATED)?\r
1087         HALT CPOPJ              ;IF SO, SOMEBODY IS VERY CONFUSED.\r
1088 >\r
1089         NOSCHEDULE\r
1090         SOS TAC1,TBITS(TAC)     ;DECREMENT RCOUNT\r
1091         TRNE TAC1,RCOUNT+RWTBIT ;ANY MORE READS? OR OUTPUT CLOSE TO DO?\r
1092         JRST DFCL23     ;YES, LEAVE\r
1093 \r
1094         TRNE TAC1,DTBIT ;TO BE DELETED?\r
1095         JRST  DFC16A    ;YES\r
1096         PUSHJ PDP,CLRAT ;CLEAR THE ENTRY AND EXIT\r
1097 DFCL23: SCHEDULE\r
1098         TLZN DEVDAT,INPB        ;ANY INPUT UUO'\r
1099         JRST CLRBUF     ;NO, JUST EXIT, RETURNING MON BUF\r
1100         PUSHJ PDP,SETBUF        ;YES, UPDATE ACCESS DATE AS FOLLOWS:\r
1101         PUSHJ PDP,RRIB  ;READ IN JUST BLOCK OF RETRIEVAL INFORMATION.\r
1102         SUBI TAC1,BLKSIZ-2      ;SET TAC1 TO 2ND WORD OF BLOCK\r
1103         LDB AC1,[POINT 17,@TAC1,35] ;GET PREVIOUS ACCESS DATA.\r
1104         CAMN AC1,THSDAT ;ALREADY ACCESSED EARLIER TODAY?\r
1105         JRST CLRBUF     ;YES, JUST CLEAR BUFFER AND EXIT.\r
1106         MOVE AC1,THSDAT ;NO, STORE TODAY(S DATE AS NEW ACCESS DATE.\r
1107         DPB AC1,[POINT 17,@TAC1,35] ;\r
1108         PUSHJ PDP,WRIB  ;REWRITE FIRST BLOCK OF RETRIEVAL INFORMATION.\r
1109         JRST CLRBUF     ;CLEAR BUFFER AND EXIT.\r
1110 \r
1111 SUBTTL DIRECTORY SEARCHING\r
1112 ;SEARCH DIRECTORY FOR A PARTICULAR ENTRY.\r
1113 ;ENTRY BY:      MOVE DAT,NAME\r
1114 ;               HLLZ AC1,EXTENSION\r
1115 ;               HRRZ TAC,BLOCK NUMBER FOR POINTERS\r
1116 ;               PUSHJ PDP,DIRSRC\r
1117 ;               EXIT1           NAME NOT FOUND\r
1118 ;               EXIT2           NAME FOUND, TAC POINTS TO ENTRY\r
1119 \r
1120 DIRSRC: PUSH PDP,AC1\r
1121         PUSH PDP,DAT    ;0(PDP) IS FILENAME,-1(PDP) IS EXTENSION\r
1122         PUSHJ PDP,SETPTR        ;READ UFD RETRIEVAL POINTERS\r
1123 DRSRC0: HRRZ TAC,DEVACC(DEVDAT)\r
1124         CAILE TAC,PTRN(DEVDAT)  ;MORE POINTERS IN CORE?\r
1125         JRST DRSRC7     ;NO, GET MORE.\r
1126         HRRZ TAC,(TAC)\r
1127         JUMPE TAC,DRSRC6        ;0 SIGNALS END OF POINTERS\r
1128         AOS DEVACC(DEVDAT)      ;NEXT POINTER\r
1129 \r
1130         AOS DEVCNT(DEVDAT)      ;COUNT UFD BLOCKS SEARCHED\r
1131         PUSHJ PDP,MQIN  ;READ IN DATA BLOCK\r
1132         JRST RERA       ;ERROR, YOU LOSE.\r
1133 \r
1134         MOVE TAC1,DSKBUF(DEVDAT) ;XWD-L,POINTER\r
1135         HRRZ TAC,TAC1\r
1136         TLNN IOS,UBFS   ;DUMP MODE?\r
1137         HRLI TAC,PROG   ;NO. RELOCATE.\r
1138         HLLZ AC1,-1(PDP)        ;SIXBIT/EXT/\r
1139 DRSR3A: SKIPN AC3,@TAC  ;BLOCK ENTIRELY SEARCHED?\r
1140         JRST DRSRC0     ;YES\r
1141         ADDI TAC,1\r
1142         CAMN AC3,(PDP)  ;NAMES MATCH?\r
1143         JRST DRSRC8     ;YES\r
1144 \r
1145 DRSRC4: ADDI TAC,1\r
1146         HRRZ AC3,TAC\r
1147         CAIE AC3,BLKSIZ(TAC1)   ;IS BLOCK ENTIRELY SEARCHED?\r
1148         JRST DRSR3A     ;NO\r
1149         JRST DRSRC0\r
1150 \r
1151 DRSRC7: TLNE IOS,NMP    ;ANY MORE POINTERS ON DISK?\r
1152         JRST DRSRC6             ;NO\r
1153         PUSHJ PDP,GETPTR                ;YES, GET SOME\r
1154         JRST DRSRC0\r
1155 \r
1156 DRSRC8: HLLZ AC3,@TAC   ;DOES EXTENSION MATCH\r
1157         CAME AC3,AC1\r
1158         JRST DRSRC4     ;NO\r
1159         SUBI TAC,1      ;POINT TO FIRST WORD OF ENTRY\r
1160 \r
1161         AOS -2(PDP)     ;YES, ENTRY IS FOUND\r
1162         MOVSS DEVCNT(DEVDAT)    ;SAVE COUNT OF UFD BLOCKS FOR USE AT CLOSE\r
1163 ;EXIT\r
1164 \r
1165 DRSRC6: POP PDP,DAT\r
1166         POP PDP,AC1\r
1167         POPJ PDP,       ;"FILE" NOT FOUND\r
1168 ;CHECK PROTECTION ON UFD\r
1169 \r
1170 DSRC10: PUSH PDP,AC1    ;PUSH EXTENSION\r
1171         PUSHJ PDP,SETPTR\r
1172         MOVSI DAT,200000        ;SET UP TO TEST READ BIT\r
1173         TLNE IOS,10     ;IS IT LOOKUP>\r
1174         ROT DAT,-1              ;NO,TEST WRITE PROTECTION\r
1175         MOVEI TAC,PTR1(DEVDAT)\r
1176         HRRZ AC1,-3(PDP)                ;XWD PROJ,PROG\r
1177         TLZ     IOS,PRCHG\r
1178         PUSHJ PDP,PROTKY\r
1179         TLO IOS,PRCHG   ;FLAG PROTECTION CHANGE\r
1180         PUSH PDP,DEVFIL(DEVDAT) ;PUSH FILENAME TO MAKE PDL LOOK LIKE DIRSRC\r
1181         JRST DRSRC0\r
1182 \r
1183         \r
1184 ;FIND A UFD ENTRY,  IT MUST BE THERE.\r
1185 \r
1186 EXTERNAL AUREQ,AUWAIT\r
1187 \r
1188 FINDE: AOSE AUREQ\r
1189         PUSHJ PDP,AUWAIT\r
1190         TLO IOS,AUFLG\r
1191         HLRZ TAC,SETCNT(DEVDAT) ;SET TAC TO UFD POINTERS\r
1192         HLRZ DAT,DEVCNT(DEVDAT) ;SET DAT TO COUNT COMPUTED BY DIRSRC\r
1193         ADDI DAT,DIRSIZ\r
1194 \r
1195 FINDE1: MOVSM TAC,DEVBLK(DEVDAT);READ A POINTER BLOCK\r
1196         PUSHJ PDP,RRIA\r
1197         CAILE DAT,BLKSIZ-2      ;POINTER IN THIS BLOCK?\r
1198         JRST FINDE2             ;NO, GET NEXT ONE\r
1199         SUBI DAT,1                      ;YES, BRING THEM IN\r
1200         HRRM DAT,DEVBLK(DEVDAT) ;SET INDEX INTO RIB\r
1201         PUSHJ PDP,DFIN4         ;COPY POINTERS INTO DDB\r
1202         HRRZ TAC,PTR1(DEVDAT)   ;GET RETRIEVAL POINTER FOR UFD BLOCK\r
1203 \r
1204         PUSHJ PDP,MQIN          ;READ THE UFD BLOCK\r
1205         JRST RERA                       ;ERROR\r
1206         PUSHJ PDP,SET000                ;FIND THE ENTRY\r
1207         HLLZ AC1,DEVEXT(DEVDAT) ;GET EXTENSION FROM DDB\r
1208 \r
1209 SRCU1:  MOVE TAC,@TAC1  ;GET FILE NAME FROM UFD\r
1210         ADDI TAC1,1\r
1211         CAME TAC,DEVFIL(DEVDAT) ;SAME?\r
1212         AOJA TAC1,SRCU1         ;NAMES DO NOT MATCH\r
1213         HLLZ TAC,@TAC1          ;GET EXTENSION FROM UFD\r
1214         CAME TAC,AC1            ;SAME?\r
1215         AOJA TAC1,SRCU1         ;EXTENSIONS DO NOT MATCH\r
1216         POPJ PDP,                       ;FOUND IT\r
1217 \r
1218 FINDE2: PUSHJ PDP,SET176                ;GET THE NEXT POINTER BLOCK\r
1219         HLRZ TAC,@TAC1\r
1220         SUBI DAT,BLKSIZ-2       ;BACK UP DAT\r
1221         JRST FINDE1\r
1222 \r
1223 ;INSERT AN ENTRY IN A DIRECTORY.\r
1224 \r
1225 EXTERNAL AUREQ,AUWAIT,AUAVAL\r
1226 \r
1227 INSDIR: AOSE AUREQ      \r
1228         PUSHJ PDP,AUWAIT\r
1229         TLO IOS,AUFLG\r
1230         SETZM DEVCNT(DEVDAT)    ;CLEAR BEFORE COUNTING BLOCK OF UFD\r
1231         HLRZ TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB\r
1232         PUSHJ PDP,SETPTR                ;SET UP FIRST POINTERS,.\r
1233         SOS DEVACC(DEVDAT)      ;SYNC\r
1234 \r
1235 INSD1:  AOS TAC,DEVACC(DEVDAT)  ;GET NEXT POINTER,\r
1236         HRRZS TAC\r
1237         AOS DEVCNT(DEVDAT)      ;COUNT EACH UFD BLOCK\r
1238         CAILE TAC,PTRN(DEVDAT)  ;ANY MORE IN CORE?\r
1239         JRST INSD10             ;NO, GET SOME MORE\r
1240 \r
1241 INSD2:  HRRZ TAC,(TAC)  ;GET RETRIEVAL POINTER\r
1242         JUMPE TAC,INSD5         ;0 SIGNALS END OF POINTERS\r
1243         PUSHJ PDP,MQIN  ;READ UFD BLOCK\r
1244         JRST RERA               ;ERROR.\r
1245 \r
1246         PUSHJ PDP,SET176                ;SET TAC1 TO WORD 127\r
1247         SKIPE @TAC1             ;IS IT ZERO?\r
1248         JRST INSD1              ;NO, BLOCK FULL.\r
1249 \r
1250         MOVSS DEVCNT(DEVDAT)    ;SAVE RELATIVE# OF BLOCK CONTAINING NEW ENTRY\r
1251         PUSHJ PDP,INSD3         ;INSERT ENTRY.\r
1252 \r
1253         JRST WUFD               ;WRITE BLOCK AND LEAVE\r
1254 \r
1255 ;INSERT THE ENTRY.\r
1256 \r
1257 INSD3:  HRRZ AC1,DSKBUF(DEVDAT)\r
1258 INSD3B: CAIN AC1,(TAC1)         ;BEGINNING OF BLOCK?\r
1259         JRST INSD3A     ;YES\r
1260         SUBI TAC1,2\r
1261         SKIPN @TAC1             ;SEARCH UFD BLOCK BACKWARDS\r
1262                                 ; FOR LAST NON-ZERO FILENAME.\r
1263 \r
1264         JRST INSD3B\r
1265 \r
1266         ADDI TAC1,2     ;MOVE IN NAME.\r
1267 INSD3A: MOVE TAC,DEVFIL(DEVDAT)\r
1268         MOVEM TAC,@TAC1\r
1269         ADDI TAC1,1     ;MOVE IN EXTENSION & POINTER.\r
1270         MOVE TAC,DEVEXT(DEVDAT)\r
1271         IFN FTRCHK,<\r
1272                 TRNN TAC,-1     ;POINTER TO BLOCK 0\r
1273 \r
1274                 HALT .+1                ;FOR RETRIEVAL INFO\r
1275                                         ; CONTINUE-GET BAD INFO MESSAGE\r
1276 >\r
1277         MOVEM TAC,@TAC1\r
1278         POPJ PDP,\r
1279 \r
1280 ;CREATE NEW UFD BLOCK AND ADD ENTRY. THEN FIND THE LAST OR ONLY\r
1281 ;POINTER BLOCK, ADD POINTER IF POSSIBLE.  IF NOT POSSIBLE.\r
1282 ;CREATE NEW POINTER BLOCK AND PUT THE POINTER IN IT.\r
1283 \r
1284 INSD5:  PUSHJ PDP,SET000        ;@TAC1 POINTS TO WORD 0 OF BUFFER\r
1285         NOSCHEDULE\r
1286         MOVEI TAC,@TAC1         ;POINT TO WORD 0 OF BUFFER\r
1287         SETZM 2(TAC)            ;CLEAR FOR BLT\r
1288         MOVSI DAT,2(TAC)        ;SOURCE\r
1289         HRRI DAT,3(TAC)         ;DESTINATION\r
1290         BLT DAT,BLKSIZ-1(TAC)   ;CLEAR WORDS 2.-127.\r
1291         SCHEDULE\r
1292 \r
1293         PUSHJ PDP,INSD3A        ;INSERT ENTRY IN WORDS 0,1\r
1294         MOVSS DEVCNT(DEVDAT)    ;SAVE RELATIVE BLOCK# OF THIS UFD BLOCK\r
1295         PUSHJ PDP,DFGETF        ;GET A FREE BLOCK\r
1296         MOVEM TAC,SETCNT(DEVDAT) ;SAVE IT\r
1297 \r
1298         IFG CHKCNT,<\r
1299         MOVE TAC,DSKBUF(DEVDAT)\r
1300         PUSHJ PDP,CHKSUM\r
1301         HRLM TAC1,SETCNT(DEVDAT)\r
1302         MOVE TAC,SETCNT(DEVDAT)\r
1303         >\r
1304 \r
1305 INSD5A: PUSHJ PDP,MQOUT         ;WRITE THE UFD BLOCK OUT\r
1306         JRST INSD11             ;ERROR\r
1307 \r
1308         PUSHJ PDP,RRI           ;READ POINTER BACK IN.\r
1309 INSD6:  PUSHJ PDP,SET176\r
1310         HLRZ TAC,@TAC1          ;LAST OR ONLY BLOCK?\r
1311         JUMPE TAC,INSD7\r
1312 \r
1313         PUSHJ PDP,RRIA          ;NO, READ NEXT ONE.\r
1314         JRST INSD6\r
1315 \r
1316 INSD7:  SUBI TAC1,1             ;YES, ROOM FOR ANOTHER POINTER?\r
1317         SKIPN @TAC1\r
1318         SOJA TAC1,INSD8\r
1319 \r
1320         PUSHJ PDP,NEWRIB        ;CREATE NEW POINTER BLOCK.\r
1321         PUSHJ PDP,SET000        ;SET TAC1 TO FIRST WORD\r
1322 INSD7A: MOVE TAC,SETCNT(DEVDAT) ;GET POINT SAVED ABOVE\r
1323         MOVEM TAC,@TAC1         ;STORE POINTER TO NEW UFD BLOCK\r
1324         PUSHJ PDP,WRI           ;WRITE BLOCK\r
1325         SOSL AUREQ              ;RELEASE UFD RESOURCE\r
1326         SETOM AUAVAL\r
1327         TLZ IOS,AUFLG\r
1328         MOVEM IOS,DEVIOS(DEVDAT)\r
1329         POPJ PDP,\r
1330 \r
1331 ;ROOM FOR ANOTHER POINTER IN THIS BLOCK.  FIND LAST POINTER.\r
1332 ;INSERT NEW ONE, AND WRITE BLOCK OUT.\r
1333 \r
1334 INSD8:  SKIPN @TAC1\r
1335         SOJA TAC1,INSD8         ;SCAN BACKWARDS FOR LAST POINTER\r
1336         AOJA TAC1,INSD7A        ;FOUND IT.  ADD NEW ONE.\r
1337 \r
1338 ;GET MORE POINTERS INTO CORE.\r
1339 \r
1340 INSD10: TLNE IOS,NMP            ;ANY MORE ON DISC?\r
1341         JRST INSD5              ;NO\r
1342         PUSHJ PDP,GETPTR\r
1343         MOVE TAC,DEVACC(DEVDAT)\r
1344         JRST INSD2\r
1345 \r
1346 ;WRITE ERROR. IF WRITE-LOCK. FIX IT.\r
1347 \r
1348 INSD11: TRNN IOS,IOIMPM\r
1349         JRST WERA               ;IT WAS NOT, YOU LOSE.\r
1350 \r
1351         PUSHJ PDP,WLERA         ;GET ANOTHER BLOCK\r
1352         HRRM TAC,SETCNT(DEVDAT)\r
1353         JRST INSD5A\r
1354 \r
1355 \r
1356 ;OUTPUT A UFD BLOCK, PERFORM CHECKSUM IF NEEDED, WRITE THE BLOCK OUT.\r
1357 ;IF WRITE-LOCK ERROR, TRY ANOTHER BLOCK. FINALLY, IF POINTERS WERE\r
1358 ;ALTERED, WRITE THEM OUT.\r
1359 \r
1360 EXTERNAL AUREQ,AUAVAL\r
1361 \r
1362 WUFD:   IFG CHKCNT,<\r
1363         MOVE TAC,DSKBUF(DEVDAT) ;POINTER TO BUFFER\r
1364         PUSHJ PDP,CHKSUM        ;RETURN CHECKSUM IN TAC1\r
1365         >\r
1366         MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION\r
1367         IFG CHKCNT,<\r
1368         HRLM TAC1,(TAC)         ;STORE CHECKSUM IN RETRIEVAL POINTER\r
1369         MOVSI TAC1,PNTDIF\r
1370         ORM TAC1,DEVOAD(DEVDAT) ;NOTE THAT POINTERS IUN DDB NOT=DISK\r
1371         >\r
1372         IFLE CHKCNT,<\r
1373         MOVE TAC1,DEVOAD(DEVDAT)\r
1374         TLO TAC1,PRTOUT\r
1375         TLZ TAC1,PNTDIF\r
1376         MOVEM TAC1,DEVOAD(DEVDAT)\r
1377         >\r
1378         HRRZ TAC,(TAC)          ;GET BLOCK# FROM RETRIEVAL POINTER\r
1379 \r
1380 WUFD1:  PUSHJ PDP,MQOUT         ;WRITE UFD BLOCK\r
1381         JRST WUFD3              ;WRITE ERROR\r
1382         MOVE TAC,DEVOAD(DEVDAT)\r
1383         TLO IOS,NMP             ;SET NMP\r
1384         MOVEM IOS,DEVIOS(DEVDAT) ;SO DFO4A WON'T READ POINTERS\r
1385         TLN TAC,PNTDIF          ;WERE POINTERS CHANGED?\r
1386         PUSHJ PDP,DFO4A         ;YES, WRITE THEM OUT.\r
1387         SOSL AUREQ              ;RELEASE UFD RESOURCE\r
1388         SETOM AUAVAL\r
1389         TLZ IOS,AUFLG           ;NOTE THAT UFD RELEASED\r
1390         MOVEM IOS,DEVIOS(DEVDAT)\r
1391         POPJ PDP,\r
1392 \r
1393 WUFD3:  MOVE TAC1,DSKCNT(DEVDAT);WAS ERROR WRITE-LOCK?\r
1394         TRNN TAC1,IOIMPM\r
1395         JRST WERA\r
1396         TRZ IOS,IOIMPM          ;YES\r
1397         MOVEM IOS,DEVIOS(DEVDAT)\r
1398         MOVSI TAC1,PNTDIF\r
1399         ORM TAC1,DEVOAD(DEVDAT)\r
1400         PUSHJ PDP,WLERA         ;FREE CURRENT ASSIGNED BLOCK AND GET A NEW ONE\r
1401         MOVE TAC1,DEVACC(DEVDAT)\r
1402         HRRM TAC,(TAC1)\r
1403         JRST WUFD1\r
1404 \r
1405 SUBTTL ACCESS TABLE PROCESSING\r
1406 ;SCAN ACCESS TABLE.\r
1407 ;EXIT TO CALL+1 WITH TAC SET TO THE LAST ENTRY IF NOT THERE.\r
1408 ;EXIT TO CALL+2 WITH TAC SET TO CORRECT ENTRY IF THERE.\r
1409 \r
1410 EXTERNAL CPOPJ1,CPOPJ\r
1411 \r
1412 SCANAT: MOVE AC2,-1(PDP)\r
1413 SCNAT0: SKIPN TAC,FAT           ;ANY AT ALL?\r
1414 SCNHLT: POPJ PDP,               ;NO, LEAVE (HALT PC HERE IF ATTEMPT\r
1415                                 ; TO CLEAR NON-EXISTANT ACCESS TABLE)\r
1416 \r
1417 SCNAT1: CAME AC2,ATPP(TAC)      ;PROJ,-PROG. THE SAME?\r
1418         JRST SCNAT2             ;NO\r
1419 \r
1420         MOVE DAT,DEVFIL(DEVDAT) ;NAMES THE SAME?\r
1421         CAME DAT,ATNAME(TAC)\r
1422         JRST SCNAT2\r
1423 \r
1424         HLLZ DAT,ATEXT(TAC)     ;EXTENSION THE SAME?\r
1425         HLLZ AC3,DEVEXT(DEVDAT)\r
1426         CAMN DAT,AC3\r
1427         JRST CPOPJ1             ;YES\r
1428 \r
1429 ;CONTINUE SCAN FROM CURRENT ENTRY\r
1430 \r
1431 SCNAT2: HRRZ DAT,ATLINK(TAC)    ;ANY MORE ENTRIES?\r
1432         JUMPE DAT,CPOPJ         ;NO\r
1433         MOVE TAC,DAT            ;YES, GO TO THE NEXT ONE\r
1434         JRST SCNAT1\r
1435 \r
1436 ;CLEAR AN ACCESS ENTRY.\r
1437 ;IT IS ASSUMED THAT NO SCHEDULING WILL TAKE PLACE.\r
1438 ;ENTER WITH TAC POINTING TO THE ENTRY TO WIPE OUT.\r
1439 \r
1440 CLRAT:  IFN     FTRCHK,<\r
1441         SKIPN TAC               ;ATTEMPT TO CLEAR NON EXISTENT ACCESS TABLE IS AN ERROR\r
1442 \r
1443         HALT SCNHLT             ;CONTINUE WILL POPJ AND EXIT.\r
1444 >\r
1445         HRRZS DEVACC(DEVDAT)    ;CLEAR ACCESS TABLE POINTER IN DEVICE DATA BLOCK\r
1446         MOVEI AC2,FAT           ;START AT BEGINNING OF LINKED ACCESS TABLE ENTRIES\r
1447         SUBI AC2,ATLINK\r
1448 \r
1449 CLRAT1: MOVE AC1,AC2            ;PICKUP THE NEXT ACCESS TABLE\r
1450         HRRZ AC2,ATLINK(AC1)\r
1451         IFN     FTRCHK,<\r
1452         SKIPN AC2               ;ZERO LINK INDICATES END OF TABLE WITHOUT\r
1453                                 ;FINDING ENTRY TO BE CLEARED\r
1454         HALT SETHLT             ;CONTINUING AFTER THIS ERROR WILL CONTINUE\r
1455                                 ; NORMALLY (IE POPJ)\r
1456 >\r
1457         CAME AC2,TAC            ;DOES THIS ENTRY LINK TO THE ONE TO BE CLOBBERED?\r
1458         JRST CLRAT1             ;NO,CONTINUE SERACH\r
1459 \r
1460         MOVE AC2,ATLINK(TAC)    ;YES, FOUND IT\r
1461         HRRM AC2,ATLINK(AC1)    ;LINK AROUND IT\r
1462         JRST CLRCOR             ;CLEAR THE CORE\r
1463 \r
1464 ;FIND A HOLD FOR ACCESS TABLE ENTRY AND SET A LINK.\r
1465 ;BUILD UP THE ENTRY\r
1466 ;UPON ENTRY, DAT SHOULD CONTAIN TEST BITS TO SET\r
1467 \r
1468 \r
1469 SETAT:  PUSHJ PDP,GETFCR        ;TAC1 POINTS TO 4 WORD BLOCK\r
1470         HLL DAT,DEVEXT(DEVDAT)\r
1471         MOVEM DAT,ATEXT(TAC1)   ;STORE EXTENSION\r
1472         MOVE DAT,DEVFIL(DEVDAT)\r
1473         MOVEM DAT,ATNAME(TAC1)  ;STORE FILE NAME\r
1474         MOVE DAT,-1(PDP)        ;XWD PROJ,PROG\r
1475         MOVEM DAT,ATPP(TAC1)    ;STORE XWD PROJ,PROG\r
1476         HLL DAT,SETCNT(DEVDAT)  ;LOGICAL BLOCK# OF UFD RIB\r
1477         HRR DAT,FAT             ;POINTER TO NEXT ENTRY\r
1478         MOVEM DAT,ATLINK(TAC1)  ;STORE LINKE\r
1479         HRRZM TAC1,FAT          ;POINT FAT TO THIS NEW ENTRY\r
1480 SETHLT: POPJ PDP,               ;HALT PC HERE IF END OF TABLE WITHOUT FINDING\r
1481                                 ; ENTRY TO BE CLEARED\r
1482 \r
1483 SUBTTL DUMP INPUT/OUTPUT\r
1484 ;DUMP MODE OUTPUT\r
1485 \r
1486 EXTERNAL COMCHK,ADRERR,SAVDDL\r
1487 \r
1488 DFDMPO: TLNN DEVDAT,ENTRB       ;ENTER YET?\r
1489         JRST DFERR2             ;NO, UNDEFINED FILE\r
1490 \r
1491         TLO IOS,10              ;OUTPUT STATUS\r
1492         MOVEM IOS,DEVIOS(DEVDAT)\r
1493         PUSHJ PDP,COMCHK        ;CHECK IOWDS\r
1494         JRST ADRERR             ;ERROR\r
1495 \r
1496 DFDO0:  SKIPN TAC,@UUO          ;PICK UP NEXT IOWD\r
1497         POPJ PDP,               ;IT WAS ZERO, LEAVE\r
1498         TLNE TAC,-1             ;LH ZERO?\r
1499         JRST DFDO0A             ;NO\r
1500         HRR UUO,TAC             ;YES, ANOTHER TABLE\r
1501         JRST DFDO0\r
1502 \r
1503 DFDO0A: ADDI TAC,1              ;FORM XWD - LENGTH, FIRST-ADDRESS\r
1504         PUSH PDP,TAC            ;SAVE IT\r
1505 \r
1506 DFDO1:  PUSHJ PDP,UPDA          ;SET DAREQ INTERLOCK (SAT BLOCKS MAY ONLY\r
1507                                 ; BE MANIPULATED BY ONE USER AT A TIME!)\r
1508 DFDO1A: PUSHJ PDP,SATGET        ;AQUIRE A NON-FULL SAT BLOCK\r
1509                                 ; ITEM IS DESTROYED IF SATGET CALLS MQIN,MQOUT\r
1510         HLRE ITEM(PDP)          ;ITEM < [LH OF IOWD]/200\r
1511         MOVMS ITEM\r
1512         ADDI ITEM,BLKSIZ-1      ;MAKE E.G. 129 WORDS USE 2 DISK BLOCK\r
1513         ASH ITEM,-BLKP2         ;NUMBER OF BLOCK REQUIRED FOR THIS WRITE\r
1514 DFDO2A: HRRZ AC1,SATPTR\r
1515         MOVE AC2,SATBK2\r
1516 DFDO1B: PUSHJ PDP,GETBIT        ;ASK FOR C(ITEM BITS)\r
1517         JRST DFDO6              ;NOT AVAILABLE\r
1518 \r
1519         ADDM ITEM,@SATPTR       ;INCREMENT COUNT\r
1520         SETOM SATCHG            ;SAT BLOCK HAS BEEN CHANGED\r
1521         HLRZ DAT,@SATPTR        ;COMPUTE BLOCK NUMBER LESS 1.\r
1522         SCHEDULE\r
1523         PUSHJ   PDP,DOWNDA      ;RESET DAREQ INTERLOCK.\r
1524         ADDI DAT,-2(TAC1)\r
1525         PUSH PDP,DAT            ;AND SAVE BLOCK NUMBER LESS 1\r
1526         PUSH PDP,ITEM           ;SAVE COUNT OF BLOCKS WRITTEN\r
1527         MOVE TAC1,-2(PDP)       ;SET UP AN IOWD (SAVED AT DFDO0A)\r
1528         MOVEM TAC1,DSKBUF(DEVDAT)\r
1529         MOVN TAC,ITEM\r
1530         LSH TAC,BLKP2\r
1531         HLRES TAC1\r
1532 \r
1533         CAML TAC,TAC1\r
1534         HRLM TAC,DSKBUF(DEVDAT) ;ONLY A PARTIAL WRITE\r
1535         HLRE TAC1,DSKBUF(DEVDAT)\r
1536         MOVMS TAC1\r
1537         PUSHJ PDP,UPDEVC        ;UPDATE SIZE OF FILE\r
1538         ADDM ITEM,SETCNT(DEVDAT) ;NON UPDATE RELATIVE BLOCK# WITHIN THE FILE\r
1539 \r
1540         MOVE TAC1,DSKBUF(DEVDAT) ;PICK UP ADDRESS AND WORD COUNT\r
1541         TLZN TAC1,BLKSIZ-1      ;AN EVEN NUMBER OF DISK BLOCKS TO BE WRITTEN?\r
1542         JRST DFDO2G             ;YES, DON'T WORRY ABOUT PARTIAL BLOCK\r
1543                                 ;HANDLING PROBLEMS\r
1544         PUSH PDP,TAC1           ;NO, SAVE ADDRESS WITH COUNT OF FULL BLOCKS-1\r
1545                                 ; TO BE WRITTEN\r
1546         PUSH PDP,DSKBUF(DEVDAT) ;SAVE,ORIGINAL ADDRESS ;EXACT WORD COUNT ALSO\r
1547         PUSHJ PDP,SETBUF        ;GET MONITOR BUFFER\r
1548         MOVE TAC1,DSKBUF(DEVDAT) ;TAC1 GETS ADDRESS OF MONITOR BUFFER\r
1549                                 ; (RELOCATION NOT NECESSARY)\r
1550         POP PDP,TAC             ;USER'S INITIAL ADDR AND WC\r
1551         PUSHJ PDP,SAVDDL        ;ADJUST IN CASE THIS IS A SAVE OF A \r
1552                                 ; HIGH SEGMENT, WHICH WAS MOVED IN CORE\r
1553                                 ; DURING I/O WAIT.\r
1554         MOVE AC1,TAC\r
1555         HRRZ TAC,-2(PDP)        ;GET INITIAL BLOCK NUMBER-1\r
1556 DFDO2C: ADD AC1,[XWD BLKSIZ,BLKSIZ] ;SET UP ADDRESS, WORD COUNT, AND LOGICAL\r
1557         AOS TAC                 ;BLOCK NUMBER FOR LAST (PARTIAL) BLOCK\r
1558         JUMPL AC1,DFDO2C        ;OF THIS DUMP MODE OUTPUT REQUEST.\r
1559         SUB AC1,[XWD BLKSIZ,BLKSIZ]\r
1560         HLL AC2,AC1             ;SAVE LH\r
1561 DFDO2D: MOVE AC2,(AC1)          ;MOVE DATA FROM END OF USER'S\r
1562         MOVEM AC2,(TAC1)        ;OUTPUT AREA DT MONITOR BUFFER\r
1563         AOBJP TAC1,.\r
1564         AOBJP AC1,DFDO2D\r
1565 DFDO2E: SETZM (TAC1)            ;ZERO OUT THE REMAINDER OF THE MONTOR BUFFER\r
1566         AOBJN TAC1,DFDO2E\r
1567         PUSHJ PDP,MQOUT         ;WRITE OUT THE PARTIAL FULL MONITOR BUFFER\r
1568                                 ; WHICH CONTAINS THE LAST BLOCK OF THE DUMP MODE\r
1569                                 ; MODE OUTPUT REQUEST\r
1570         JFCL                    ;IGNORE ERROR RETURN\r
1571         PUSHJ PDP,CLRBUF        ;RELINQUISH THE MONTOR BUFFER\r
1572         POP PDP,DSKBUF(DEVDAT)  ;RETRIEVE ORIGINAL ADDRESS\r
1573         MOVSI TAC1,BLKSIZ       ;WITH WORD COUNT THSAT HAS LOW-ORDER BITS CLEARED\r
1574         ADDB TAC1,DSKBUF(DEVDAT) ;ADD IN BLOCK SIZE TO DETERMINE NUMBER\r
1575                                 ; NUMBER OF FULL BLOCKS YET TO BE WRITTEN\r
1576         JUMPG TAC1,DFDO2B       ;IF NO FULL BLOCKS TO BE WRITTEN SKIP OVER\r
1577                                 ; OUTPUT SEQUENCE\r
1578 DFDO2G: MOVE TAC,DSKBUF(DEVDAT) ;ORIGINAL ADDRESS AND WORD COUNT\r
1579         PUSHJ PDP,SAVDDL        ;AJDUST IN CASE OF SAVE OF HIGH SEG\r
1580                                 ; WHICH HAS MOVED DURING IO WAIT\r
1581         MOVEM TAC,DSKBUF(DEVDAT)        ;STORE BACK IN DDB\r
1582         MOVE TAC,-1(PDP)        ;WRITE THE BLOCKS\r
1583         ADDI TAC,1\r
1584         PUSHJ PDP,MQOUT\r
1585         JRST DFDO7              ;ERROR\r
1586 DFDO2B: POP PDP,ITEM            ;RESTORE COUNT\r
1587 \r
1588 ;TOSS OUT A SERIES OF CONSECUTIVE POINTERS\r
1589 \r
1590         HRRZ AC2,DEVACC(DEVDAT) ;GET RETRIEVAL POINTER POINTER\r
1591 DFDO3A: MOVE AC1,@AC2           ;IS POINTER ALREADY THERE?\r
1592         ADDI AC2,1\r
1593         TRNE AC1,-1     \r
1594         JRST DFDO9              ;YES\r
1595 \r
1596         CAIG AC2,PTRN(DEVDAT)   ;NO, IS THERE A NEXT ONE?\r
1597         SETZM @AC2              ;CLEAR NEXT POINTER\r
1598         TLO IOS,NMP             ;FLAG END OF POINTERS\r
1599         MOVEM IOS,DEVIOS(DEVDAT)\r
1600 DFDO3B: AOS DAT,(PDP)           ;PUT A POINTER IN CORE\r
1601         HRRZM DAT,-1(AC2)       ;STORE NEW POINTER IN DDB\r
1602         MOVSI DAT,PNTDIF\r
1603         ORM DAT,DEVOAD(DEVDAT)  ;SHOW THAT POINTERS IN DDB NOT=DISK\r
1604         \r
1605         IFG CHKCNT,<            ;GET CHECKSUM\r
1606         MOVE TAC,-1(PDP)\r
1607         PUSHJ PDP,SAVDDL        ;ADJUST ADR IN CASE OF HIGH SEG SAVE\r
1608         PUSHJ PDP,CHKSUM\r
1609 \r
1610         HRLM TAC1,-1(AC2)\r
1611         >\r
1612 \r
1613         CAILE AC2,PTRN(DEVDAT)  ;MORE POINTERS?\r
1614         JRST DFDO4              ;LAST POINTER IN CORE\r
1615 \r
1616 DFDO3C: MOVE TAC1,[XWD BLKSIZ,BLKSIZ];INCREMENT IOWD\r
1617         ADDM TAC1,-1(PDP)\r
1618         SOJG ITEM,DFDO3A        ;ANY MORE?\r
1619         POP PDP,DAT\r
1620         HRRM AC2,DEVACC(DEVDAT)\r
1621         SKIPGE (PDP)\r
1622         JRST DFDO1              ;NOT FINISHED, GET NEXT SET\r
1623         POP PDP,TAC             ;BACK UP PDP\r
1624         AOJA UUO,DFDO0          ;GO BAK FOR MORE\r
1625 \r
1626 ;WRITE POINTERS ONTO DISK\r
1627 \r
1628 DFDO4:  HRLM ITEM,(PDP)         ;SAVE COUNT OF BLOCKS TO WRITE\r
1629         PUSHJ PDP,SETBUF        ;FIND SOME 200 WORD AREA\r
1630         PUSHJ PDP,DFO4A         ;WRITE THEM\r
1631         PUSHJ PDP,CLRBUF        ;CLEAR THE AREA\r
1632         MOVEI AC2,PTR1(DEVDAT)  ;RESET AC2 TO FIRST POINTER\r
1633         HLRZ ITEM,(PDP)         ;RESTORE COUNT OF BLOCKS TO WRITE\r
1634         JRST DFDO3C\r
1635 \r
1636 DFDO6:  LSH ITEM,-1     ;TRY FOR 1/2 EARLIER REQUEST\r
1637         JUMPN ITEM,DFDO1B       ;CONTINUE IF NON-ZERO\r
1638         MOVEI TAC,NUMBIT        ;BITS/SAT BLOCK\r
1639         HRRM TAC, @SATPTR       ;MARK SAT ENTRY FULL\r
1640         JRST DFDO1A             ;TRY ANOTHER SAT BLOCK\r
1641 \r
1642 ;ERROR WHILE WRITING, IF WRITE-LOCK, FIX IT,\r
1643 \r
1644 DFDO7:  HRRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK?\r
1645         TRNN TAC,IOIMPM\r
1646         JRST DFDO2B             ;NO, TOO BAD.\r
1647 \r
1648         HLRZ TAC,DSKCNT(DEVDAT)\r
1649         PUSHJ PDP,SETWL         ;SET WRITE-LOCK BIT IN SAT ENTRY.\r
1650         \r
1651 DFDO8:  AOS TAC,-1(PDP)\r
1652         PUSHJ PDP,SETFRE\r
1653         SOSLE (PDP)\r
1654         JRST DFDO8\r
1655         SUB PDP,[XWD 2,2]\r
1656         JRST DFDO1              ;TRY AGAIN.\r
1657 \r
1658 ;WE ARE WRITING IN MIDDLE OF FILE, FREE THE OLD BLOCK.\r
1659 \r
1660 DFDO9:  HRLM ITEM,(PDP)         ;SAVE BLOCK COUNT WITH BLOCK#\r
1661         PUSH PDP,AC2            ;SAVE POINTER TO RETRIEVAL INFO IN DDB\r
1662         HRRZ TAC,-1(AC2)        ;GET OLD BLOCK# FROM DDB\r
1663         PUSHJ PDP,SETFRE\r
1664         POP PDP,AC2             ;RESTORE POINTER INTO RETRIEVAL INFO\r
1665         HLRZ ITEM,(PDP)         ;RESTORE COUNT OF BLOCKS TO WRITE THIS ITERATION\r
1666         JRST DFDO3B\r
1667 \r
1668 ;DUMP MODE INPUT.\r
1669 \r
1670 EXTERNAL COMCHK,ADRERR\r
1671 \r
1672 DFDMPI: TLNN DEVDAT,LOOKB       ;LOOKUP YET?\r
1673         JRST DFERR2             ;NO, UNDEFINED FILE\r
1674         TLNE IOS,IOEND          ;END-FILE?\r
1675         JRST DFDI1C             ;YES\r
1676         TLZ IOS,IO              ;INPUT STATUS\r
1677         MOVEM IOS,DEVIOS(DEVDAT)\r
1678         PUSHJ PDP,COMCHK        ;CHECK IOWDS\r
1679         JRST ADRERR             ;ERROR\r
1680 DFDI0:  SKIPN TAC,@UUO          ;PICK UP NEXT IOWD\r
1681         POPJ PDP,               ;NO MORE, LEAVE.\r
1682         TLNE TAC,-1             ;LH ZERO?\r
1683         JRST DFDI0A             ;NO\r
1684         HRR UUO,TAC             ;YES, ANOTHER LIST.\r
1685         JRST DFDI0\r
1686 \r
1687 DFDI0A: ADDI TAC,1              ;FROM XWD -L,FIRST-ADDRESS\r
1688         PUSH PDP,TAC\r
1689 \r
1690         HLRZ TAC1,TAC           ;GET LENGTH FROM IOWD\r
1691         CAIGE TAC1,NBLKSZ       ;LESS THAN 1 BLOCK?\r
1692         HRLI TAC,NBLKSZ         ;YES, MUST WRITE AT LEAST 1 FULL BLOCK\r
1693         PUSH PDP,TAC            ;IOWD FOR FIRST BLOCK\r
1694 \r
1695         HRRZ AC2,DEVACC(DEVDAT) ;PICK UP FIRST POINTER\r
1696         CAILE AC2,PTRN(DEVDAT)  ;ANY LEFT IN CORE?\r
1697         PUSHJ PDP,DFDI9         ;NO, GET SOME MORE\r
1698         SKIPN @AC2              ;IS A POINTER THERE?\r
1699         JRST DFDI1B             ;NO. EXIT\r
1700         PUSH PDP,@AC2           ;SAVE THE POINTER\r
1701 \r
1702         MOVE TAC,[XWD BLKSIZ,BLKSIZ] ;INCREMENT IOWD\r
1703         ADDM TAC,-2(PDP)\r
1704         AOS DEVACC(DEVDAT)      ;NEXT POINTER\r
1705         AOS SETCNT(DEVDAT)      ;NEXT RELATIVE BLOCK\r
1706 \r
1707 \r
1708 DFDI1:  SKIPGE -2(PDP)          ;MORE TO GO?\r
1709         JRST DFDI2              ;YES\r
1710 \r
1711 DFDI1A: MOVE TAC1,-1(PDP)       ;NO, PROCESS THE FIRST BLOCK\r
1712         MOVEM TAC1,DSKBUF(DEVDAT) ;SAY WHERE TO READ DATA\r
1713         MOVE TAC,(PDP)          ;GET FIRST LOGICAL BLOCK#\r
1714         PUSHJ PDP,MQIN\r
1715         JFCL                    ;ERRORS IGNORED.\r
1716 \r
1717 REPEAT  0, <    ;TEMPORARILY DELETE THIS CODE DUE TO SAVE-GET PROBLEM.\r
1718         IFG CHKCNT,<            ;COMPARE CHECKSUM\r
1719         MOVE TAC,-1(PDP)\r
1720         PUSHJ PDP,CHKSUM\r
1721         HLRZ TAC,(PDP)\r
1722         MOVEI AC1,IODTER\r
1723         CAME TAC,TAC1\r
1724         ORM AC1,DEVIOS(DEVDAT)\r
1725         MOVE IOS,DEVIOS(DEVDAT)\r
1726         >\r
1727 >\r
1728 \r
1729         SUB PDP,[XWD 3,3]       ;REMOVE INTERMEDIATE STORAGE FROM PDL\r
1730         AOJA UUO,DFDI0          ;GO BACK FOR MORE.\r
1731 \r
1732 DFDI1B: SUB PDP,[XWD 2,2]       ;BACK UP PDP, REMOVE XWD AND IOWD\r
1733 DFDI1C: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT\r
1734         ORB IOS,DEVIOS(DEVDAT)\r
1735         POPJ PDP,\r
1736 \r
1737 ;DUMP INPUT CONTINUED,\r
1738 ;FIND A SERIES OF CONSECUTIVE BLOCKS TO READ AT ONCE\r
1739 \r
1740 DFDI2:  HRRZ AC2,DEVACC(DEVDAT) ;GET NEXT POINTER\r
1741         CAILE AC2,PTRN(DEVDAT)  ;ANY MORE POINTERS IN CORE?\r
1742         PUSHJ PDP,DFDI9         ;NO GET SOME MORE\r
1743         SKIPN @AC2              ;YES\r
1744         JRST DFDI8              ;END-FILE\r
1745         PUSH PDP,AC2            ;SAVE POINTER TO POINTER\r
1746         HLRZ TAC,-3(PDP)        ;GET LENGTH OF REMAINING INPUT\r
1747         HRRZ TAC1,(AC2)         ;GET BLOCK# FROM DDB\r
1748 \r
1749 DFDI3:  ADDI TAC,BLKSIZ         ;ANY MORE TO READ?\r
1750         TLNE TAC,1\r
1751         JRST DFDI5              ;NO\r
1752         ADDI AC2,1              \r
1753         CAIG AC2,PTRN(DEVDAT)\r
1754         SKIPN AC3,@AC2          ;END-FILE\r
1755         JRST DFDI4              ;YES\r
1756 \r
1757         CAIN TAC1,-1(AC3)       ;STILL CONSECUTIVE?\r
1758         AOJA TAC1,DFDI3         ;YES, LOOP\r
1759 \r
1760 DFDI4:  MOVE TAC,(PDP)          ;COMPUTE COUNT\r
1761         SUB TAC,AC2             ;DIFFERENCE BETWEEN POINTERS IS # OF BLOCKS\r
1762         LSH TAC,BLKP2           ;COMPUTE WORDS\r
1763         JRST DFDI6\r
1764 DFDI5:  HLRE TAC,-3(PDP)        ;GET LENGTH OF INPUT\r
1765         ADDI AC2,1\r
1766 DFDI6:  HRRZ TAC1,DEVACC(DEVDAT)\r
1767         SUBI TAC1,(AC2)\r
1768         MOVMS TAC1\r
1769         ADDM TAC1,SETCNT(DEVDAT)\r
1770         HRRM AC2,DEVACC(DEVDAT) ;STORE NEW POINTER POINTER\r
1771         MOVS TAC1,@TAC\r
1772         HRLM TAC,(PDP)\r
1773         HRR TAC1,-3(PDP)\r
1774         MOVE TAC,(PDP)          ;GET POINTER TO FIRST RETRIEVAL POINTER FOR THIS INPUT\r
1775         MOVE TAC,(TAC)          ;GET FIRST LOGICAL BLOCK#\r
1776         MOVEM TAC1,DSKBUF(DEVDAT) ;STORE CONTROLLING IOWD\r
1777         PUSHJ PDP,MQIN          ;REQUEST THE INPUT\r
1778         JFCL                    ;ERRORS IGNORED\r
1779 \r
1780 ;DUMP INPUT CONTINUED.\r
1781 ;IF THERE IS CHECKSUMMING. CHECK IT, ELSE INCREMENT IOWD\r
1782 ;AND LOOP.\r
1783 \r
1784         POP PDP,AC2\r
1785         IFLE CHKCNT,<           ;NO CHECKSUMMING\r
1786         HLRS AC2\r
1787         SETCA AC2,\r
1788         AOBJN AC2,.+1\r
1789         ADDM AC2,-2(PDP)\r
1790         >\r
1791 \r
1792         IFG CHKCNT,<            ;CHECK CHECKSUMS\r
1793         HLRE TAC1,AC2           ;CHANGE WORD COUNT TO BLOCKS\r
1794         MOVMS TAC1\r
1795         ADDI TAC1,BLKSIZ-1\r
1796         LSH TAC1,-BLKP2\r
1797         MOVNS TAC1\r
1798         HRL AC2,TAC1\r
1799 DFDI7:  MOVE TAC,-2(PDP)\r
1800         PUSHJ PDP,CHKSUM\r
1801         HLRZ TAC,(AC2)\r
1802         MOVEI AC3,IODTER\r
1803         CAME TAC,TAC1\r
1804         PUSHJ PDP,CKREC2\r
1805         MOVE AC3,[XWD BLKSIZ,BLKSIZ]\r
1806         ADDM AC3,-(PDP)\r
1807         AOBJN AC2,DFDI7\r
1808         >\r
1809 \r
1810         JRST DFDI1              ;SEE IF MORE INPUT REQUIRED\r
1811 \r
1812 DFDI8:  MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT\r
1813         ORB IOS,DEVIOS(DEVDAT)\r
1814         JRST DFDI1A\r
1815 \r
1816 DFDI9:  TLNE IOS,NMP\r
1817         JRST DFDI10             ;NO\r
1818         PUSHJ PDP,SETBUF        ;GET BUFFER\r
1819         PUSHJ PDP,GETPTR        ;READ AND COPY POINTERS INTO DDB\r
1820         PUSHJ PDP,CLRBUF        ;CLEAR BUFFER\r
1821         HRRZ AC2,DEVACC(DEVDAT)\r
1822         POPJ PDP,\r
1823 \r
1824 DFDI10: MOVEI AC2,PTR1(DEVDAT)  ;NO MORE POINTERS ON DISK\r
1825         HRRM AC2,DEVACC(DEVDAT)\r
1826         SETZM @AC2\r
1827         POPJ PDP,\r
1828 \r
1829 SUBTTL USETO/USETI\r
1830 ;SETD AND SETI UUOS\r
1831 \r
1832 EXTERNAL WAIT1\r
1833 \r
1834 DFSET:  PUSHJ PDP,.+2\r
1835         POPJ PDP,\r
1836         TLNE DEVDAT,ENTRB+LOOKB ;FILE OPEN?\r
1837         TRNN UUO,-1             ;NON-ZERO BLOCK NUMBER ARGUMENT?\r
1838         JRST DFERR2             ;NO, ERROR IN EITHER CASE\r
1839         PUSHJ PDP,WAIT1         ;WAIT FOR I/O TO COMPLETE\r
1840         PUSHJ PDP,SETBF6        ;SET UP A BUFFER\r
1841         MOVE IOS,[XWD IOEND,IODEND] ;CLEAR EOF\r
1842         ANDCAB IOS,DEVIOS(DEVDAT)\r
1843 \r
1844         HRRZ TAC1,DEVACC(DEVDAT)\r
1845         HRRZ TAC,SETCNT(DEVDAT) ;C(UUO) RH > C(SETCNT) RH?\r
1846         CAIL TAC,(UUO)          ;(I.E. SHOULD WE GO FORWARD?)\r
1847         JRST DFSET6             ;NO, GO BACKWARD\r
1848 \r
1849         SUBI TAC1,PTRN(DEVDAT)  ;YES, DESIRED POINTER IN CORE?\r
1850         SUB TAC,TAC1\r
1851         CAIL TAC,(UUO)\r
1852         JRST DFSET3             ;YES\r
1853 \r
1854         HRRZ TAC1,DEVCNT(DEVDAT)\r
1855         ADDI TAC1,BLKSIZ-1\r
1856         LSH TAC1,-BLKP2\r
1857         CAMGE TAC1,TAC          ;ANY MORE POINTERS ON DISK?\r
1858         JRST DFSETX             ;NO\r
1859         HRRM TAC,SETCNT(DEVDAT)\r
1860         MOVE TAC,DEVOAD(DEVDAT) ;YES, ARE POINTERS IN CORE THE SAME\r
1861         TLNN TAC,PNTDIF         ;AS ON DISC?\r
1862         JRST DFSET1             ;YES\r
1863         TLO IOS,NMP             ;SET "DO NOT READ NEXT POINTERS"\r
1864         MOVEM IOS,DEVIOS(DEVDAT)\r
1865         PUSHJ PDP,DFO4A         ;NO, WRITE THEM OUT\r
1866         TLZA IOS,NMP            ;NO NEED TO READ\r
1867 \r
1868 DFSET1: PUSHJ PDP,RRI           ;READ THEM IN\r
1869         MOVEM IOS,DEVIOS(DEVDAT)\r
1870         PUSHJ PDP,SET176        ;IS THIS THE FIRST POINTER BLOCK?\r
1871         MOVE TAC,@TAC1\r
1872         TRNN TAC,-1\r
1873         JRST DFSETB             ;YES\r
1874         HRRZ TAC,DEVBLK(DEVDAT) ;IN BLOCK WERE CURRENT ONE.\r
1875         SUBI TAC,1\r
1876         MOVNS TAC\r
1877         ADDM TAC,SETCNT(DEVDAT)\r
1878         JRST DFSETC\r
1879 \r
1880 ;THE DESIRED POINTER MAY BE IN CORE. IF THERE ARE MORE POINTERS ON\r
1881 ;DISC, THEN CORE IS FULL, AND THE POINTER IS IN CORE, OTHERWISE\r
1882 ;A CHECK IS MADE TO INSURE THAT THE END FILE IS AFTER THE DESIRED\r
1883 ;POINTER.\r
1884 \r
1885 DFSET3:\r
1886 \r
1887 DFSETX: HRRZ TAC,DEVCNT(DEVDAT) ;C(UUO)RW > C(DEVCNT) RH?\r
1888         ADDI TAC,BLKSIZ-1       ;CONVERT TO BLOCKS\r
1889         LSH TAC,-BLKP2\r
1890         CAIL TAC,(UUO)\r
1891         JRST DFSET5             ;NO, ALL OK.\r
1892         MOVSI IOS,IOEND         ;YES, END-FILE.\r
1893         IORB IOS,DEVIOS(DEVDAT)\r
1894         AOSA TAC\r
1895 DFSET5: HRRZ TAC,UUO            ;SET NEXT BLOCK AS ONE BEYOND LAST EXISTING ONE\r
1896         HRRZ TAC1,SETCNT(DEVDAT) ;PREPARE TO RESET DEVACC\r
1897         SUBM TAC,TAC1\r
1898         ADDM TAC1,DEVACC(DEVDAT)\r
1899         HRRM TAC,SETCNT(DEVDAT) ;RESET SETCNT\r
1900         JRST CLRBUF             ;CLEAR ANY DUMP BUFFER AND LEAVE\r
1901 \r
1902 ;THE DESIRED POINTER IS BEFORE THE CURRENT ONE. SEE IF IT IS IN CORE.\r
1903 \r
1904 DFSET6: SUBI TAC1,PTR1(DEVDAT)\r
1905         SUB TAC,TAC1\r
1906         CAIG TAC,(UUO)\r
1907         JRST DFSET5             ;POINTER IS IN CORE\r
1908 \r
1909 ;THE DESIRED BLOCK IS BEFORE THE CURRENT ONE. SEARCH FROM THE BEGINNING.\r
1910 \r
1911         MOVE TAC,DEVOAD(DEVDAT) ;ARE POINTERS IN CORE SAME AS ON DISC?\r
1912         TLNE TAC,PNTDIF\r
1913         PUSHJ PDP,DFO4A         ;NO, WRITE THEM OUT\r
1914         HRRZ TAC,DEVEXT(DEVDAT) ;GET BLOCK# OF FIRST RIB\r
1915         PUSHJ PDP,SETPTR        ;READ FIRST RIB\r
1916 DFSETB: MOVEI TAC,1             ;RESET SETCNT\r
1917         HRRM TAC,SETCNT(DEVDAT) ;"POSITIONED" AT RELATIVE BLOCK 1\r
1918 \r
1919 DFSETC: HRRZ TAC,DSKBUF(DEVDAT) ;LSET TAC TO FIRST POINTER\r
1920         PUSHJ PDP,SET176        ;IS THIS THE FIRST POINTER BLOCK?\r
1921         MOVE DAT,@TAC1\r
1922         TRNN DAT,-1\r
1923         ADDI TAC,DIRSIZ         ;YES, SKIP OVER 4 WORDS\r
1924         HLRZ DAT,@TAC1          ;BLOCK FULL?\r
1925         SUBI TAC1,1\r
1926         JUMPN DAT,DFSETD        ;YES\r
1927         SKIPN @TAC1             ;NO. MOVE TAC1 TO LAST POINTER\r
1928         SOJA TAC1,.-1\r
1929 \r
1930 DFSETD: HRRZ AC1,SETCNT(DEVDAT)\r
1931         SUBI AC1,(TAC)          ;IS DESIRED POINTER HERE?\r
1932         HRRZ AC2,TAC1\r
1933         ADD AC2,AC1\r
1934         CAIL AC2,(UUO)\r
1935 \r
1936         JRST DFSET7             ;YES\r
1937         ADDI AC2,1              ;NO. GET NEXT BLOCK\r
1938         HRRM AC2,SETCNT(DEVDAT)\r
1939         JUMPE DAT,DFSET8        ;ANY MORE POINTER BLOCKS?\r
1940         MOVSM DAT,DEVBLK(DEVDAT) ;YES, SET UP TO READ NEXT BLOCK.\r
1941         PUSHJ PDP,RRI\r
1942         JRST DFSETC\r
1943 \r
1944 ;THE BLOCK CONTAINING THE POINTER IS FOUND.\r
1945 DFSET7: HRRZ TAC,UUO            ;RESET RIGHT HALF OF DEVBLK\r
1946         SUB TAC,AC1\r
1947         HRRZ TAC1,DSKBUF(DEVDAT)\r
1948         SUB TAC,TAC1\r
1949         HRRM TAC,DEVBLK(DEVDAT)\r
1950 \r
1951         HRRM UUO,SETCNT(DEVDAT) ;RESET SETCNT\r
1952         PUSHJ PDP,DFIN4         ;GET POINTERS\r
1953         JRST CLRBUF             ;CLEAR ANY DUMP BUFFER AND LEAVE\r
1954 \r
1955 ;RAN OUT OF POINTERS\r
1956 \r
1957 DFSET8: ADDI TAC1,1\r
1958         HRRZ TAC,DSKBUF(DEVDAT)\r
1959         SUB TAC1,TAC\r
1960         HRRM TAC1,DEVBLK(DEVDAT)\r
1961         TLO IOS,NMP!IOEND       ;SET END\r
1962         MOVEM IOS,DEVIOS(DEVDAT)\r
1963         PUSHJ PDP,DFO6A         ;CLEAR POINTERS\r
1964         JRST CLRBUF             ;CLEAR ANY DUMP BUFFER AND LEAVE\r
1965 \r
1966 SUBTTL INPUT/OUPUT UUO'S.  RETRIEVAL POINTER PROCESSING\r
1967 ;INPUT UUO\r
1968 ;* INDICATES INTERRUPT LEVEL\r
1969 \r
1970 EXTERNAL ADVBFF\r
1971 \r
1972 DFIN:   TLNN DEVDAT,LOOKB       ;FILE OPEN?\r
1973         JRST DFERR2             ;NO, UNDEFINED FILE\r
1974         TLZ IOS,IO              ;SET INPUT INDICATOR\r
1975 \r
1976 DFIN1:  TLNE IOS,LIR            ;*ANY MORE INPUT?\r
1977         POPJ PDP,               ;*NO, LEAVE\r
1978 \r
1979         HRRZ    TAC1,DEVACC(DEVDAT) ;*\r
1980         CAILE   TAC1,PTRN(DEVDAT) ;*POINTER LIST EMPTY?\r
1981         JRST    DFIN2           ;*YES\r
1982         SKIPN   @TAC1           ;*NO--END OF FILE?\r
1983         JRST    DFIN1E          ;*YES\r
1984 \r
1985         CAIN TAC1,PTRN(DEVDAT)  ;*NO--IS THIS THE LAST POINTER ?\r
1986         JRST DFIN1B             ;*YES\r
1987 \r
1988 DFIN1D: SKIPN 1(TAC1)           ;*NO\r
1989         TLO IOS,LIR             ;*SET LAST INPUT FLAG\r
1990 DFIN1A: MOVEM IOS,DEVIOS(DEVDAT) ;*\r
1991         JRST QIN                ;*\r
1992 \r
1993 DFIN1E: TLO     IOS,LIR         ;*EMPTY FILE\r
1994         MOVEM   IOS,DEVIOS(DEVDAT) ;*\r
1995         POPJ    PDP,            ;*\r
1996 \r
1997 DFIN1B: TLNE IOS,NMP            ;*ANY MORE POINTERS ON DISK?\r
1998         TLO IOS,LIR             ;*NO, THIS IS THE LAST READ\r
1999         JRST DFIN1A             ;*\r
2000 \r
2001 DFIN2:  MOVEM IOS,DEVIOS(DEVDAT)\r
2002         PUSHJ PDP,SETBFI        ;CHOOSE NEXT INPUT BUFFER TO HOLD RETRIEVAL POINTERS\r
2003         PUSHJ PDP,GETPTR        ;READ RIB COPY POINTERS INTO DDB\r
2004         HRRZ TAC1,DEVACC(DEVDAT)\r
2005         JRST DFIN1D\r
2006 \r
2007 ;NEED NEW POINTER FROM DISK\r
2008 \r
2009 GETPTR: MOVE AC2,DEVOAD(DEVDAT) ;POINTERS DIFFER?\r
2010         TLNE AC2,PNTDIF\r
2011         JRST DFO4A              ;YES, WRITE THEN READ AND RETURN\r
2012         PUSHJ PDP,RRI           ;NO, READ BLOCK\r
2013 \r
2014 DFIN4:  MOVEI AC2,PTR1(DEVDAT)  ;RESET DEVACC\r
2015         HRRM AC2,DEVACC(DEVDAT)\r
2016         MOVE TAC,DEVBLK(DEVDAT) ;RESET DEVBKO\r
2017         MOVEM TAC,DEVBKO(DEVDAT) ;BLOCK # WORD INDEX OF A CURRENT RETRIEVAL PACKET\r
2018 GTPTR1: PUSHJ PDP,SET000        ;SET TAC1 TO FIRST WORD OF RIB\r
2019         MOVE IOS,DEVIOS(DEVDAT) \r
2020         HRRZ AC3,DEVBLK(DEVDAT) ;WORD INDEX OF RETRIEVAL POINTER PACKET\r
2021         ADD AC3,TAC1            ;AC3 POINTS TO NEXT POINTER WITHIN RIB\r
2022         ADDI TAC1,BLKSIZ-2      ;TAC1 POINTS TO WORD 127\r
2023 \r
2024         MOVEI AC1,PTRN(DEVDAT)  ;DDB END CHECK\r
2025 DFIN5:  CAML AC3,TAC1           ;POINTER BLOCK EMPTY?\r
2026 \r
2027         JRST DFIN7              ;YES, GET SOME MORE\r
2028 \r
2029         MOVE TAC,@AC3           ;GET RETRIEVAL POINTER\r
2030         MOVEM TAC,@AC2          ;STASH IN DDB\r
2031         ADDI AC3,1\r
2032         JUMPE TAC,DFIN8A        ;0 MEANS NO MORE RETRIEVAL POINTERS\r
2033         CAIE AC1,(AC2)          ;DDB FULL?\r
2034         AOJA AC2,DFIN5          ;NO, GET ANOTHER\r
2035 \r
2036         CAML AC3,TAC1           ;YES, ANY MORE FOR NEXT TIME?\r
2037         HLLZS @AC3              ;END OF RIB REACHED.  ACE(LH) IS LINK NEXT RIB\r
2038         SKIPN @AC3              ;NEXT POINTER=0 OR LINK=0.\r
2039         TLO IOS,NMP             ;SET "NO MORE POINTER"\r
2040 \r
2041 DFIN6A: MOVEM IOS,DEVIOS(DEVDAT)\r
2042         MOVE TAC1,DSKBUF(DEVDAT);POINT TO FIRST WORD OF RIB\r
2043         SUBI AC3,(TAC1)         ;COMPUTE NEW INDEX\r
2044         HRRM AC3,DEVBLK(DEVDAT) ;STORE INDEX TO NEXT RETRIEVAL POINTER PACKET\r
2045         MOVSI AC1,PNTDIF        ;CLEAR "POINTER DIFFER"\r
2046         ANDCAM AC1,DEVOAD(DEVDAT) ;SINCE DDB IS COPY OF RETRIEVAL DATA.\r
2047         POPJ PDP,\r
2048 \r
2049 DFIN7:  HLRZ TAC,@TAC1          ;RIB LINK TO TAC RH\r
2050         JUMPE TAC,DFIN8         ;DONE IF LINK=0\r
2051         MOVSM TAC,DEVBLK(DEVDAT) ;SET BLOCK#, WORD INDE FOR NEXT PACKET\r
2052         PUSH PDP,AC2\r
2053         PUSHJ PDP,RRI           ;READ THE RIB\r
2054         POP PDP,AC2\r
2055         JRST GTPTR1\r
2056 DFIN8:  MOVEM TAC,@AC2          ;0 WOTRD IS DOB MARKS END\r
2057 DFIN8A: TLO IOS,NMP             ;NO MORE POINTERS ON DISK\r
2058         JRST DFIN6A\r
2059 \r
2060 ;ENTER HERE AT INTERRUPT LEVEL TO READ ANOTHER BLOCK\r
2061 \r
2062 DFINX:  PUSHJ PDP,ADVBFF        ;*ANY MORE EMPTY BUFFERS?\r
2063         POPJ PDP,               ;*\r
2064 \r
2065         HRRZ TAC1,DEVACC(DEVDAT) ;*POINTER LIST EMPTY?\r
2066         CAILE TAC1,PTRN(DEVDAT) ;*\r
2067         POPJ PDP,               ;*\r
2068 \r
2069         JRST DFIN1              ;*NO,FILL NEXT ONE\r
2070 \r
2071 ;OUTPUT UUO\r
2072 \r
2073 EXTERNAL WSYNC,ADVBFE\r
2074 \r
2075 DFOUT:  TLNN DEVDAT,ENTRB       ;FILE OPEN?\r
2076         JRST DFERR2             ;NO, UNDEFINED FILE\r
2077         TLO IOS,IO              ;SET OUTPUT INDICATION\r
2078         MOVEM IOS,DEVIOS(DEVDAT)\r
2079 \r
2080 DFOUT1: HRRZ DAT,DEVACC(DEVDAT) ;*GET POINTER LOC\r
2081 \r
2082         IFG CHKCNT,<\r
2083         HRRZ TAC,DEVOAD(DEVDAT) ;*\r
2084         ADD TAC,[XWD NBLKSZ,2]  ;*\r
2085         PUSHJ PDP,CHKSUM        ;*\r
2086         HRLM TAC1,@DAT          ;*\r
2087         MOVSI TAC1,PNTDIF       ;*\r
2088         ORM TAC1,DEVOAD(DEVDAT) ;*\r
2089         >\r
2090 \r
2091         HRRZ TAC,@DAT           ;*ALREADY HAVE A POINTER?\r
2092         JUMPN TAC,DFOT3A        ;*YES IF JUMP\r
2093         CAIE DAT,PTRN(DEVDAT)   ;*NO, CLEAR NEXT ONE?\r
2094         SETZM 1(DAT)            ;*YES\r
2095         TLO IOS,NMP             ;*SET "NO MORE POINTERS"\r
2096         MOVEM IOS,DEVIOS(DEVDAT) ;*\r
2097         MOVE TAC1,DEVOAD(DEVDAT) ;*POINT TO OUTPUT BUFFER\r
2098         ADDI TAC1,1             ;*NOW TO WORD COUNT\r
2099         HRRZ TAC1,@TAC1         ;*RETRIEVE WORD COUNT\r
2100         PUSHJ PDP,UPDEVC        ;*UPDATE DEVCNT\r
2101         PUSH PDP,DAT            ;*\r
2102         PUSHJ PDP,DFGETF        ;*GET A FREE BLOCK\r
2103         POP PDP,DAT             ;*\r
2104 \r
2105         IFG CHKCNT,<\r
2106                 HRRM TAC,@DAT>\r
2107         IFLE CHKCNT,<\r
2108                 MOVSI TAC1,PNTDIF\r
2109                 ORM TAC1,DEVOAD(DEVDAT)\r
2110                 MOVEM TAC,@DAT>\r
2111 \r
2112 DFOT3A: CAIE DAT,PRTN(DEVDAT)   ;*LIST FULL?\r
2113         JRST QOUT               ;*NO, WRITE AND LEAVE\r
2114 \r
2115 ;OUTPUT UUO CONTINUED.\r
2116 ;WRITE OUT POINTER LIST.\r
2117 \r
2118         PUSHJ PDP,SETBFO        ;CHOOSE AN OUTPUT BUFFER TO READ RIB INTO\r
2119         PUSHJ PDP,QOUT          ;PUT REQUEST IN QUEUE\r
2120         PUSHJ PDP,WSYNC         ;WAIT TIL DATA WRITTEN\r
2121 \r
2122 DFO4A:  MOVE TAC,DEVBKO(DEVDAT) ;RESET DEVBLK TO REFER TO RETRIEVAL POINTERS\r
2123         MOVEM TAC,DEVBLK(DEVDAT) ;NOW IN DDB\r
2124 \r
2125         MOVE TAC,DEVOAD(DEVDAT) ;ANY POINTERS BEEN WRITTEN?\r
2126         TLZE TAC,VRGPTR\r
2127         PUSHJ PDP,DFO7A         ;NO, CREATE NEW BLOCK, SKIP NEXT INSTRUCTION.\r
2128         PUSHJ PDP,RRI           ;RED RETRIEVAL BLOCK\r
2129         MOVEI AC3,PTR1(DEVDAT)\r
2130 \r
2131 DFO4B:  PUSHJ PDP,SET000        ;TAC1 POINTS TO RIB\r
2132         HRRZ AC2,DEVBLK(DEVDAT) ;INDEX INTO RIB\r
2133         ADD AC2,TAC1            ;ABSOLUTE POINTER INTO RIB\r
2134         ADDI TAC1,BLKSIZ-2      ;END OF RIB DATA\r
2135 DFOUT5: MOVE AC1,@AC3           ;GET RETRIEVAL POINTER FROM DDB\r
2136         JUMPE AC1,DFOUT6        ;0 SIGNALS END\r
2137         CAML AC2,TAC1           ;BLOCK FULL?\r
2138         JRST DFOUT7             ;YES, WRITE IT OUT\r
2139         MOVEM AC1,@AC2          ;STASH POINTER IN RIB\r
2140         ADDI AC2,1\r
2141         CAIE AC3,PTRN(DEVDAT)   ;DONE?\r
2142         AOJA AC3,DFOUT5\r
2143 \r
2144 DFOUT6: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO RIB\r
2145         SUBI AC2,(TAC1)         ;FROM INDEX\r
2146         HRRM AC2,DEVBLK(DEVDAT) ;STORE INDEX TO RETRIEVAL POINTERS\r
2147         MOVSI AC2,PNTDIF        ;CLEAR "POINTERS DIFFER"\r
2148         ANDCAM AC2,DEVOAD(DEVDAT)\r
2149         PUSHJ PDP,WRI           ;WRITE THE BLOCK\r
2150 DFO6A:  MOVEI TAC,PTR1(DEVDAT)\r
2151         HRRM TAC,DEVACC(DEVDAT) ;DEVACC NOW POINTS TO FIRST POINTER IN DDB\r
2152         SETZM @TAC              ;CLEAR FIRST POINTER\r
2153         TLNN IOS,NMP            ;MORE POINTERS?\r
2154         JRST DFIN4              ;YES, BRING THEM IN AND LEAVE\r
2155         MOVE TAC,DEVBLK(DEVDAT)\r
2156         MOVEM TAC,DEVBKO(DEVDAT) ;SAE BLOCK#,WORD INDEX OF CURRENT POINTER PACKET\r
2157         POPJ PDP,\r
2158 \r
2159 DFO7A:  MOVEM TAC,DEVOAD(DEVDAT) ;SAVE VRGPTR BIT\r
2160         PUSHJ PDP,SET177        ;SET TAC1 TO WORD 128\r
2161         SETZM @TAC1             ;CLEAR BLOCK# WORD\r
2162         AOS (PDP)               ;ALWAYS SKIP RETURN\r
2163         PUSH PDP,AC3            ;BECAUSE ENTRY FROM NEWRIB PUSHES AC3\r
2164         JRST DFOUT8\r
2165 \r
2166 DFOUT7: PUSHJ PDP,NEWRIB\r
2167         JRST DFO4B\r
2168 \r
2169 NEWRIB: PUSH PDP,AC3            ;CREATE A NEW RETRIEVAL BLOCK\r
2170         PUSHJ PDP,SET176        ;SET TAC1 TO LINK WORD\r
2171         HLLZ TAC,@TAC1          ;LINK TO NEXT POINTER BLOCK ALREADY PRESENT?\r
2172         JUMPN TAC,DFOUT9        ;YES, WRITE CURRENT ONE AND READ NEXT ONE\r
2173         PUSHJ PDP,DFGETF        ;NO, GET A BLOCK FOR POINTER IN TAC\r
2174         HLRZ AC3,DEVBLK(DEVDAT) ;BLOCK# OF CURRENT RIB\r
2175         MOVSM TAC,DEVBLK(DEVDAT) ;STORE BLOCK#, INDEX FOR NEW BLOCK\r
2176         PUSHJ PDP,SET176        ;SET TAC1 TO WORD 127 AGAIN\r
2177         HRLM TAC,@TAC1          ;LH LINKS TO NEW BLOCK\r
2178         \r
2179         MOVE TAC,AC3            ;BLOCK# OF CURRENT BLOCK\r
2180         PUSHJ PDP,WRIA          ;WRITE THE BLOCK OUT\r
2181 \r
2182 DFOUT8: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER CONTAINING RIB\r
2183         NOSCHEDULE\r
2184         TLNN IOS,UBFS           ;DUMP MODE?\r
2185         ADD TAC1,PROG           ;NO, RELOCATE\r
2186         MOVEI TAC,1(TAC1)       ;DESTINATION\r
2187         HRL TAC,TAC1            ;SOURCE\r
2188         SETZM (TAC1)\r
2189         BLT TAC,BLKSIZ-3(TAC1)  ;ZERO OUT FIRST 126 WORDS\r
2190         MOVE TAC,BLKSIZ-1(TAC1) ;BLOCK# OF CURRENT RIB\r
2191         HRRZM TAC,BLKSIZ-2(TAC1) ;SET "PREVIOUS" POINTER..CLEAR LINK TO NEXT\r
2192         SETZM BLKSIZ-1(TAC1)    ;CLEAR WORD 128.\r
2193         SCHEDULE\r
2194 DFO8A:  POP PDP,AC3\r
2195         POPJ PDP,\r
2196 \r
2197 DFOUT9: EXCH TAC,DEVBLK(DEVDAT) ;SAVE NEW BLOCK# INDEX. GET OLD BLOCK# INDEC\r
2198         HLRZS TAC               ;BLOCK# IN RH\r
2199         PUSHJ PDP,WRIA          ;WRITE THIS BLOCK OF POINTERS OUT\r
2200         PUSHJ PDP,RRI           ;READ NEXT BLOCK OF POINTERS IN\r
2201         JRST DFO8A\r
2202 \r
2203 ;ENTER HERE AT INTERRUPT LEVEL TO WRITE ANOTHER\r
2204 \r
2205         EXTERN MJOBN\r
2206 \r
2207 DFOUTX: PUSHJ PDP,ADVBFE        ;*ANY MORE TO DO?\r
2208         POPJ PDP,               ;*\r
2209         SKIPL   DAREQ           ;*DO NOT CONTINUE THIS OUTPUT AT INTERRUPT\r
2210         POPJ    PDP,            ;* LEVEL IF THE DAWAIT RTN WOULD BE CALLED.\r
2211         HRRZ TAC1,DEVACC(DEVDAT) ;*NEED TO WRITE POINTERS?\r
2212         CAIL TAC1,PTRN(DEVDAT)  ;*\r
2213         POPJ PDP,               ;*\r
2214         HRRZ TAC,@SATPTR        ;*CURRENT SAT BLOCK FULL?\r
2215         TRNN TAC,WLBIT          ;*OR WRITE-LOCKED?\r
2216         CAIL TAC,NUMBIT+MJOBN   ;*BE SURE TO LEAVE ATLEAST JOBN FREE BLOCKS\r
2217                                 ; SO THAT EACH JOB CAN HAVE ONE MORE\r
2218         POPJ PDP,               ;*\r
2219         PUSH PDP,AC1            ;*\r
2220         PUSH PDP,AC2            ;*\r
2221         PUSHJ PDP,DFOUT1        ;*\r
2222         POP PDP,AC2             ;*\r
2223         POP PDP,AC1             ;*\r
2224         POPJ PDP,               ;*\r
2225 \r
2226 SUBTTL READ/WRITE RETRIEVAL POINTERS\r
2227 ;INPUT RETRIEVAL BLOCK.\r
2228 \r
2229 RRIB:   SKIPA TAC,DEVEXT(DEVDAT) ;READ FIRST RETRIEVAL BLOCK\r
2230 RRI:    HLRZ TAC,DEVBLK(DEVDAT) ;READ NEXT RETRIEVAL BLOCK\r
2231 RRIA:   PUSHJ PDP,MQIN          ;READ RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY\r
2232         JRST RERA               ;ERRORS, YOU LOSE\r
2233         PUSHJ PDP,SET177        ;CHECK RH OF WORD 128\r
2234         HLRZ TAC,DSKCNT(DEVDAT) ;BLOCK# EXPECTED\r
2235         MOVE AC1,@TAC1          ;GET BLOCK# STORED IN RIB\r
2236         CAIE TAC,(AC1)          ;SAME?\r
2237         JRST RERA               ;IT WAS WRONG, YOU LOSE.\r
2238         POPJ PDP,               ;EVERYTHING OK.\r
2239 \r
2240 ;OUTPUT A RETRIEVAL BLOCK.\r
2241 \r
2242 WRIB:   SKIPA TAC,DEVEXT(DEVDAT) ;WRITE FIRST RETRIEVAL BLOCK\r
2243 WRI:    HLRZ TAC,DEVBLK(DEVDAT) ;WRITE NEXT RETRIEVAL BLOCK\r
2244 WRIA:   PUSHJ PDP,SET177        ;WRITE RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY\r
2245         HRRM TAC,@TAC1          ;STORE THIS BLOCK# IN WORD 128\r
2246         IFN FTRCHK,<\r
2247         SKIPN TAC               ;ATTEMPTING TO WRITE RETRIEVAL INFORMATION\r
2248                                 ; IN BLOCK NR 0 IS AN ERROR\r
2249         HALT WERA               ;CONTINUE WILL POINT ERROR MESSAGE\r
2250 >\r
2251         PUSHJ PDP,MQOUT         ;WRITE IT,\r
2252         JRST WERA               ;ERRORS\r
2253         POPJ PDP,               ;NO, RETURN.\r
2254 \r
2255 SET177: HRRZ TAC,DSKBUF(DEVDAT)\r
2256         ADDI TAC1,BLKSIZ-1\r
2257 S177A:  TLNN IOS,UBFS\r
2258         TLO TAC1,PROG\r
2259         POPJ PDP,\r
2260 \r
2261 SET176: HRRZ TAC1,DSKBUF(DEVDAT)\r
2262         ADDI TAC1,BLKSIZ-2\r
2263         JRST S177A\r
2264 \r
2265 SET000: HRRZ TAC1,DSKBUF(DEVDAT)\r
2266         JRST S177A\r
2267 \r
2268 \r
2269 ;PUT POINTER INFO IN DDB\r
2270 ;ENTER WITH TAC CONTAINING THE BLOCK NUMBER OF THE POINTERS.\r
2271 \r
2272 SETPTR: HRLZM TAC,DEVBLK(DEVDAT) ;XWD RIB#, 0...0 INDEX\r
2273         ANDCM IOS,[XWD IOEND+NMP,IODEND]\r
2274         MOVEM IOS,DEVIOS(DEVDAT)\r
2275         PUSHJ PDP,SETBUF        ;AQUIRE BUFFERE IN MONITOR STORAGE\r
2276         PUSHJ PDP,RRI           ;GET RETRIEVAL BLOCK\r
2277 \r
2278         PUSHJ PDP,DFIN4         ;COPY POINTERS TO DDB\r
2279         MOVEI AC3,FPNTR(DEVDAT) ;SET DEVACC TO SKIP FIRST 4 WORDS\r
2280         HRRM AC3,DEVACC(DEVDAT)\r
2281         POPJ PDP,\r
2282 \r
2283 ;RECLAIM STORAGE ON DISK.\r
2284 ;ENTER WITH TAC POINTING TO FIRST RETRIEVAL BLOCK OF THE FILE\r
2285 ;     TO BE DELETED.\r
2286 \r
2287 RECLAM: PUSHJ PDP,SETBUF        ;FIND SPACE IN USER AREA\r
2288         \r
2289         PUSHJ PDP,RECLM5        ;GET FIRST POINTER BLOCK\r
2290         ADDI DAT,DIRSIZ         ;SKIP OVER FIRST WORDS.\r
2291 RECLM2: CAML DAT,TAC1           ;MORE POINTERS IN BLOCK?\r
2292         PUSHJ PDP,RECLM4        ;NO. GET MORE\r
2293         HRRZ TAC,@DAT           ;FREE A DATA BLOCK\r
2294         JUMPE TAC,CLRBUF        ;EXIT  WHEN A ZERO POINTER IS ENCOUNTERED\r
2295         PUSH PDP,TAC1\r
2296         PUSHJ PDP,SETFRE        ;FREE UP SPECIFIED BLOCK\r
2297         POP PDP,TAC1\r
2298         AOJA DAT,RECLM2         ;GO BACK FOR MORE\r
2299 \r
2300 RECLM4: HLRZ TAC,@TAC1          ;PICK UP POINTER TO NEXT BLOCK\r
2301         JUMPE TAC,RECLM6        ;NO MORE, GO HOME.\r
2302 RECLM5: PUSHJ PDP,RRIA          ;READ IN A R.I. BLOCK.\r
2303 \r
2304         HLRZ TAC,DSKCNT(DEVDAT) ;FREE THAT BLOCK\r
2305         PUSHJ PDP,SETFRE\r
2306 \r
2307         PUSHJ PDP,SET000        ;SET TAC1 TO FIRST WORD\r
2308         MOVE DAT,TAC1\r
2309         ADDI TAC,BLKSIZ-2       ;SET TAC1 TO WORD 127\r
2310         POPJ PDP,\r
2311 \r
2312 RECLM6: POP PDP,TAC\r
2313         JRST CLRBUF             ;CLEAR ANY DUMP BUFFER AND LEAVE\r
2314 \r
2315 ;RELEASE UUO.\r
2316 \r
2317 EXTERNAL DAREQ,DAAVAL\r
2318 \r
2319 DFREL:  TLO     DEVDAT,DSKRLB   ;MARK RELEASE (VIA RESET UUO) IN PROGRESS.\r
2320         PUSHJ PDP,DFCLSI        ;CLOSE INPUT FIRST\r
2321         PUSHJ PDP,DFCLSO        ;THEN CLOSE OUPUT\r
2322                                 ; SAME ORDER AS CLOSE AND RELEAS IN UUOCON\r
2323         SKIPN SATCHG            ;HAS SAT BLOCK BEEN MODIFIED?\r
2324         JRST DFREL1             ;NO, SUPPRESS WRITING\r
2325         PUSHJ   PDP,UPDA        ;SET DAREQ INTERLOCK WHILE WRITING SAT BLOCK\r
2326         PUSH PDP,DSKBUF(DEVDAT)\r
2327         PUSHJ PDP,SATWRT                ;WRITE CURRENT SAT BLOCK\r
2328         POP PDP,DSKBUF(DEVDAT)\r
2329         PUSHJ   PDP,DOWNDA      ;RESET DAREQ INTERLOCK\r
2330 DFREL1: TLZ     DEVDAT,DSKRLB   ;CLEAR RELEASE MARKER.\r
2331         JRST WAIT1\r
2332 \r
2333 SUBTTL DISK SPACE ALLOCATION\r
2334 ;DFGETF: GET A FREE DISK BLOCK\r
2335 ;CALL:   PUSHJ PDP,DFGETF\r
2336 ;        ... RETURNS WITH TAC:=LOGICAL BLOCK#\r
2337 ;        MAY NOT RETURN IF DISK IS FULL OR NEARLY FULL\r
2338 \r
2339         EXTERNAL DAWAIT,DAAVAL,DAREQ,JOBN\r
2340         INTERNAL DFGETF\r
2341 \r
2342 DFGETF: PUSHJ PDP,UPDA          ;SET DISK ALLOCATION INTERLOCK\r
2343 DFGTF1: PUSHJ PDP,SATGET        ;FOCUS ON A NON-FULL SAT BLOCK\r
2344         HRRZ AC1,SATPTR         ;POINT TO 3 WORD SAT ENTRY\r
2345         MOVE AC2,SATBK2         ;XWD -L, POINTER TO SAT ENTRY\r
2346         MOVEI ITEM,1            ;REQUEST 1 BLOCK\r
2347         PUSHJ PDP,GETBIT        ;RETURNS BIT# IN TAC1 (IN RANGE 1 TO NUMBLK)\r
2348         JRST DFGTF2             ;FULL AFTER ALL\r
2349         SETOM SATCHG            ;SHOW SAT BLOCK IN CORE NOT = DISK COPY\r
2350         AOS TAC,@SATPTR         ;COUNT ANOTHER BLOCK USED\r
2351         HLRZS TAC               ;FIRST LOGICAL BLCOK# REPRESENTED BY SAT BLOCK\r
2352         ADDI TAC, -1(TAC1)      ;FORM LOGICAL BLOCK#\r
2353 DOWNDA: SOSL DAREQ              ;THIS EXITING ROUTINE TURNS OFF DAREQ INTERLOCK\r
2354                                 ; THUS MAKING NON-SHARABLE SECTIONS OF CODE\r
2355                                 ; AVAILABLE TOTHE NEXT USER IN THE QUEUE\r
2356         SETOM DAAVAL\r
2357         TLZ IOS,DAFLG\r
2358         MOVEM IOS,DEVIOS(DEVDAT)\r
2359         POPJ PDP,\r
2360 \r
2361 DFGTF2: MOVEI TAC,NUMBIT        ;BITS/SAT BLOCK\r
2362         HRRM TAC,@SATPTR        ;MARK SAT ENTRY FULL\r
2363         JRST DFGTF1\r
2364 \r
2365 ;UPDA - TURN ON THE DISK ALLOCATION INTERLOCK (DAREQ)\r
2366 ;     - A CALL TO UPDA MUST PRECEDE SAT BLOCK MANIPULATIONS\r
2367 UPDA:   AOSE DAREQ              ;INCREMENT COUNT OF USERS REQUESTING DISK ALLOCATION\r
2368         PUSHJ PDP,DAWAIT        ;WAIT UNTIL JOB REACHES TOP OF QUEUE\r
2369         TLO IOS,DAFLG\r
2370         MOVEM IOS,DEVIOS(DEVDAT) ;MAKE THIS JOB AS USING SAT BLOCK\r
2371         POPJ PDP,\r
2372 \r
2373 ;SATGET - FIND A NON-FULL SAT BLOCK FOR DFGTF OR DUMP MODE OUTPUT.\r
2374 ;         CONSIDER DISK FULL WHEN FEW BLOCKS REMAIN FREE UNLESS THE USER\r
2375 ;         IS LOGGING IN OR USING A NON-SHARABLE RESOURCE.\r
2376 \r
2377 EXTERNAL JBTSTS,HNGSTP\r
2378 \r
2379 SATGET: SETZ AC1,               ;CLEAR COUNT\r
2380         HRRZ TAC,@SATPTR        ;BLOCKS USED IN CURRENT SAT BLOCK\r
2381         TRNN TAC,WLBIT          ;WRITE LOCKED?\r
2382         PUSHJ PDP,SATCNT        ;NO. COUNT # FREE\r
2383         CAIL AC1,JOBN           ;IS THER ENOUGH SPACE?\r
2384         POPJ PDP,               ;YES - USE IT.\r
2385         SETZ AC1,               ;CLEAR COUNT\r
2386         MOVEI TAC1,SATENT       ;START WITH FIRST SAT ENTRY\r
2387 SATGT1: HRRZ TAC, 0(TAC1)       ;GET WLBIT + BLOCKS USED\r
2388         TRNN TAC,WLBIT          ;WRITE LOCKED?\r
2389         PUSHJ PDP,SATCNT        ;NO. COUNT # FREE\r
2390         ADDI TAC1,SENTSZ        ;NEXT SAT ENTRY\r
2391         CAIL AC1,JOBN           ;ENOUGH SPACE ACCUMULATED?\r
2392 \r
2393         JRST SATGT2             ;YES - READ A SAT BLOCK\r
2394         CAIGE TAC1,SATTOP       ;END OF ENTRIES?\r
2395         JRST SATGT1             ;NO. CONTINUE\r
2396         JUMPE AC1,DSKFUL        ;IF NONE FOUND DISK IS REALLY FULL\r
2397 \r
2398 ;THERE ARE JOBN OR FEWER DISK BLOCKS AVAILABLE.\r
2399 ;GIVE THEM OUT ONLY IN HARDSHIP CASES\r
2400         LDB TAC,PJOBN\r
2401         MOVE TAC,JBTSTS(TAC)\r
2402         TLNN TAC,JACCT          ;IS THIS USER LOGGING IN?\r
2403         TLNE IOS,UBFS+AUFLG     ;DOES USER HAVE MONITOR BUFFER OR IS HE ALTERING UFD?\r
2404         JRST SATGT2             ;YES TO EITHER. GIVE HIM A BLOCK ANYWAY.\r
2405 DSKFUL: TLNE IOS,UBFS+AUFLG\r
2406         JRST DFERR1             ;NON-RECOVERABLE ERROR IF USING BUFFER OR ALTERING UFD\r
2407 \r
2408         PUSHJ PDP,DOWNDA        ;RESET ALLOCATION INTERLOCK\r
2409         PUSHJ PDP,HNGSTP        ;PRINT "DSK OK?"\r
2410         PUSHJ PDP,UPDA          ;IF USER TYPE "CONT" WE TRY AGAIN\r
2411         JRST SATGET\r
2412 \r
2413 SATGT2: MOVE TAC1,SATPIK        ;POINT TO ENTRY OF NON-FULL SAT BLOCK\r
2414         JRST SATRD              ;READ IN SAT BLOCK\r
2415 \r
2416 SATCNT: CAIE TAC,NUMBIT         ;IS ENTRY FULL?\r
2417         MOVEM TAC1,SATPIK       ;NO. SAVE POINTER TO A NON-FULL ENTRY\r
2418         ADDI AC1,NUMBIT         ;MAXIMUM NUMBER\r
2419         SUB AC1,TAC             ;LESS NUMBER USED\r
2420         POPJ PDP,\r
2421 \r
2422 ;SETFRE - RETURN A DISK BLOCK TO AVAILABLE STORAGE\r
2423 ;CALL        TAC:=LOGICAL BLOCK L\r
2424 ;            PUSHJ PDP,SETFRE\r
2425 ;            ... RETURN\r
2426 \r
2427         INTERNAL SETFRE,FTRCHK\r
2428 \r
2429 SETFRE: PUSHJ PDP,UPDA          ;SET DISK ALLOCATION INTERLOCK\r
2430 IFN FTRCHK,<\r
2431         EXTERNAL LBHIGH\r
2432 \r
2433         SKIPE TAC               ;BLOCK 0 SHOULD NEVER BE CLEARED\r
2434         CAMLE TAC,LBHIGH        ;BLOCK # TOO LARGE\r
2435         HALT DOWNDA             ;YES, HALT. CONTINUE WILL COUNT DOWN DAREQ.\r
2436 >\r
2437         HLRZ AC1,@SATPTR        ;GET LOGICAL BLOCK# FOR B0 OF CURRENT SAT BLOCK\r
2438         CAML TAC,AC1            ;IS L LESS THAN FIRST BLOCK REPRESENTED?\r
2439         CAIL TAC,NUMBLK(AC1)    ;IS L LESS THAN LAST BLOCK REPRESENTED\r
2440         SKIPA                   ;OUTSIDE RANGE\r
2441         JRST SETFR2             ;IN RANGE\r
2442         MOVEI TAC1,SATENT        ;INITIALIZE POINTER\r
2443         SKIPA\r
2444 SETFR1: ADDI TAC1,SENTSZ        ;INCREMENT POINTER\r
2445         HLRZ AC1,@TAC1          ;GET LOGICAL BLOCK FOR B0 OF SAT BLOCK\r
2446         CAML TAC,AC1            ;IS L LESS THEN FIRST BLOCK?\r
2447         CAIL TAC,NUMBLK(AC1)    ;IS L LESS THEN LAST BLOCK?\r
2448         JRST SETFR1             ;OUT-OF-RANGE, TRY NEXT\r
2449         PUSH PDP,TAC            ;SAVE BLOCK#\r
2450         PUSHJ PDP,SATRD         ;READ SAT BLOCK FOR ENTRY POINTED TO BY TAC1\r
2451         POP PDP,TAC             ;RESTORE BLOCK#\r
2452         HLRZ AC1,@SATPTR\r
2453 SETFR2: SUB TAC,AC1             ;FROM BIT# (IN RANGE 0 TO NUMBLK-1)\r
2454         HRRZ AC1,SATPTR         ;POINT TO 3 WORD ENTRY\r
2455         MOVE AC2,SATBK2         ;XWD -L, POINTER TO SAT BLOCK\r
2456         MOVEI ITEM,1            ;RETURN 1 BIT\r
2457         PUSHJ PDP,CLRBIT\r
2458         SOS @SATPTR             ;DECREMENT BLOCKS USED\r
2459         SETOM SATCHG            ;SAT BLOCK IN CORE NOT = DISK COPY\r
2460         JRST DOWNDA             ;REMOVE ALLOCATION INTERLOCK AND EXIT.\r
2461 \r
2462 ;NOTE: SATRD USES TEMPORARY STORAGE LOCATIONS SATTMP AND SATTEM TO HELP AVOID\r
2463 ; A PDL OVRFLW PROBLEM.  IT CAN DO SO BECAUSE IT IS NOT RE-ENTRANT, I.E., ONLY\r
2464 ; ONE USER AT A TIME MAY PASS THROUGH HERE BECAUSE OF THE DAREQ INTERLOCK.\r
2465 \r
2466 SATRD:  MOVEM TAC1,SATTMP       ;SAVE POINTER TO DESIRED SAT ENTRY.\r
2467         MOVE TAC1,DSKBUF(DEVDAT) ;ALSO SAVE IOWD FROM THE DDB\r
2468         MOVEM TAC1,SATTEM\r
2469         SKIPE SATCHG            ;HAS COPY IN CORE BEEN MODIFIED?\r
2470         PUSHJ PDP,SATWRT        ;YES, WRITE IT.\r
2471         MOVE TAC,SATTMP         ;RETRIEVE SAT POINTER FOR SAT BLOCK TO BE READ IN.\r
2472         MOVEM TAC,SATPTR\r
2473         PUSHJ PDP,SATBLK        ;COMPUTE BLOCK#, IOWD\r
2474         TLO IOS,NORELB          ;NO RELOCATION\r
2475         PUSHJ PDP,MQIN          ;READ THE BLOCK\r
2476         JRST RERA               ;ERROR\r
2477         MOVE TAC1,SATTEM        ;RESTORE SAVED IOWD TO DDB\r
2478         MOVEM TAC1,DSKBUF(DEVDAT)\r
2479         JRST SATW1\r
2480 \r
2481 SATWRT: TLO IOS,NORELB          ;NO RELOCATION\r
2482         PUSHJ PDP,SATBLK        ;COMPUTE BLOCK# IOWD\r
2483         PUSHJ PDP,MQOUT         ;WRITE BLOCK\r
2484         JRST WERA               ;ERROR\r
2485         SETZM SATCHG            ;SHOW COPY IN CORE = BLOCK ON DISK\r
2486 SATW1:  MOVSI IOS,NORELB        ;RESET BIT\r
2487         ANDCAB IOS,DEVIOS(DEVDAT)\r
2488         POPJ PDP,\r
2489 \r
2490 ;SET UP TAC AND TAC1 FOR READ OR WRITE OF SAT BLOCK\r
2491 \r
2492 SATBLK: MOVE TAC,SATPTR\r
2493         SUBI TAC,SATENT\r
2494         IDIVI TAC,SENTSZ\r
2495         ADD TAC,SATXWD\r
2496         MOVE TAC1,SATBK2\r
2497         MOVEM TAC1,DSKBUF(DEVDAT)\r
2498         POPJ PDP,\r
2499 \r
2500 SUBTTL "FREE" CORE ALLOCATION\r
2501 ;CLEAR OUT DDB AT RELEASE TIME\r
2502 \r
2503 INTERNAL CLRDDB\r
2504 \r
2505 CLRDDB: MOVEI TAC,DSKDDB        ;POINT TO PROTOTYPE DDB\r
2506 CLRDB1: MOVE TAC1,TAC           ;COPY LINK TO TAC1\r
2507         HLRZ TAC,DEVSER(TAC1)   ;GET LINK TO NEXT DDB\r
2508         JUMPE  TAC,CPOPJ        ;0 MEANS END\r
2509         CAIE TAC,(DEVDAT)       ;OWNED BY CURRENT USER?\r
2510         JRST CLDDB1             ;NO\r
2511         NOSCHEDULE\r
2512         MOVE AC1,DEVSER(TAC)    ;GET LINK FROM THIS DDB\r
2513         HLLM AC1,DEVSER(TAC1)   ;STORE IN PREVIOUS DDB TO REMOVE THIS ONE\r
2514         HRRZ ITEM,DDBPTR        ;GET INTERRUPT LEVEL POINTER\r
2515         CAIN ITEM,0(TAC)        ;POINTED TO DISCARDED DDB?\r
2516         MOVSM AC1,DDBPTR        ;YES. BYPASS DISCARDED DDB\r
2517         SCHEDULE\r
2518         MOVEI ITEM,DSKCOR\r
2519         JRST CLCOR1             ;DELETE FREE STORAGE.\r
2520 \r
2521 ;BUILD A DISK DEVICE DATA BLOCK AND ASSIGN IF LOGICAL NAME GIVEN.\r
2522 ;THIS IS DONE AT INIT TIME.\r
2523 \r
2524 INTERNAL SETDDB\r
2525 \r
2526 SETDDB: PUSH PDP,ITEM           ;SAVE AC'S USED BY SETDDB\r
2527         PUSH PDP,TAC1\r
2528         MOVE TAC1,DEVMOD(DEVDAT)\r
2529         TRNE TAC1,ASSPRG        ;HAS AN INIT BEEN DONE?\r
2530         JRST SETDD0             ;YES.  MUST COPY PROTOTYPE DDB\r
2531         HRRZ TAC1,DEVDAT        ;GET ADDRESS OF DDB\r
2532         CAIE TAC1,DSKDDB        ;IS IT PROTOTYPE?\r
2533         JRST SETDD1             ;NO. WE ALREADY HAVE A DDB\r
2534 SETDD0: MOVEI ITEM,DSKCOR       ;GET SOME FREE CORE\r
2535         NOSCHEDULE\r
2536         PUSHJ PDP,GTCOR1        ;GET SPACE FOR DDB\r
2537         HRR DEVDAT,TAC1         ;DEVDAT POINTS TO ASSIGNED CORE\r
2538         HRLI TAC1,DSKDDB        ;SOURCE, DESTINATION\r
2539         BLT TAC1,PTR1(DEVDAT)   ;COPY PROTOTYPE DDB INTO MONITOR CORE\r
2540         MOVEI TAC1,DSKDDB       ;TAC1 POINTS TO PROTOTYPE\r
2541                                 ; LINK PROTOTYPE DDB TO COPY\r
2542                                 ; COPY ALREADY LINKS WHERE PROTOTYPE DID\r
2543         HRLM DEVDAT,DEVSER(TAC1)\r
2544         SCHEDULE\r
2545 SETDD1: POP PDP,TAC1\r
2546         POP PDP,ITEM\r
2547         POPJ PDP,\r
2548 \r
2549 ;SET TAC1 TO SOME AREA FOR BUFFER.\r
2550 ;GET BUFFER SPACE FROM USER INPUT OR OUTPUT RING IF AVAILABLE\r
2551 ;ASSIGN FROM MONITOR CORE AS A LAST RESORT.\r
2552 ;SET DSKBUF(DEVDAT) TO POINT TO BUFFER.\r
2553 \r
2554 EXTERNAL PIOMOD,UADRCK,JOBFF\r
2555 \r
2556 SETBUF: TLNE IOS,UBFS           ;HAVE ONE IN FREE STORAGE?\r
2557         POPJ PDP,               ;YES, LEAVE\r
2558         LDB TAC1,PIOMOD         ;NO. DUMP MODE?\r
2559         CAIGE   TAC1,SD\r
2560         TLNE    DEVDAT,DSKRLB   ;RESET UUO IN PROGRESS ?\r
2561         JRST SETBF6             ;YES TO EITHER QUESTION\r
2562 \r
2563         TLNN DEVDAT,INBFB       ;INBUF DONE YET?\r
2564         JRST SETBF1             ;NO\r
2565 SETBFI: HRRZ TAC1,DEVIAD(DEVDAT) ;CALL HERE FROM INPUT - RING KNOWN TO BE AVAILABLE\r
2566         JRST SETBF2\r
2567 \r
2568 SETBF1: TLNN DEVDAT,OUTBFB      ;OUTPUT DONE YET?\r
2569         JRST SETBF6             ;NO\r
2570 SETBFO: HRRZ TAC1,DEVOAD(DEVDAT) ;CALL HERE FROM OUTPUT - RING KNOWN TO BE AVAILABLE\r
2571 \r
2572 SETBF2: MOVE TAC1,2(TAC1)\r
2573         \r
2574         HRRZ AC1,TAC1           ;ADDRESS CHECK LOW END\r
2575         PUSHJ PDP,UADRCK\r
2576         MOVEI AC1,BLKSIZ-1(TAC1)\r
2577         PUSHJ PDP,UADRCK\r
2578         TLO IOS,UBFU            ;BUFFER IN USER AREA\r
2579 SETBF5: HRLI TAC1,NBLKSZ\r
2580         MOVEM TAC1,DSKBUF(DEVDAT)\r
2581         MOVEM IOS,DEVIOS(DEVDAT)\r
2582         POPJ PDP,\r
2583 ;DUMP MODE, USE AREA IN FREE STORAGE.\r
2584 \r
2585 SETBF6: AOSE MQREQ\r
2586         PUSHJ PDP,MQWAIT\r
2587         TLO IUOS,UBFU           ;BUFFER IN MONITOR CORE\r
2588         MOVEI TAC1, MONBUF      ;TAC1 POINTS TO MONITOR BUFFER\r
2589         JRST SETBF5\r
2590 \r
2591 ;CLEAR THE BUFFER IN FREE STORAGE IF THERE.\r
2592 \r
2593 EXTERNAL BUFCLR,JOBFF,IADRCK\r
2594 CLRBUF: SCHEDULE\r
2595         TLZN IOS,DAFLG          ;USING SAT BLOCK?\r
2596         JRST .+3\r
2597         SOSL DAREQ              ;YES. RELEASE\r
2598         SETOM DAAVAL\r
2599         TLZN IOS,AUFLG          ;USING UFD?\r
2600         JRST .+3\r
2601         SOSL AUREQ              ;YES. RELEASE UFD\r
2602         SETOM AUAVAL\r
2603         TLZN IOS,UBFS           ;USING MONITOR BUFFER?\r
2604         JRST .+3\r
2605         SOSL MQREQ              ;YES, RELEASE MONITOR BUFFER\r
2606         SETOM MQAVAL\r
2607         TLZ IOS,NCTRLC          ;RENABLE ^C\r
2608         TLZE IOS,UBFU           ;USING BUFFER IN USER AREA\r
2609         JRST CLRBF1             ;YES. CLEAR BUFFER\r
2610         MOVEM IOS,DEVIOS(DEVDAT)\r
2611         POPJ PDP,\r
2612 \r
2613 ;CLEAR USER BUFFER AFTER USING\r
2614 \r
2615 CLRBF1: MOVEM IOS,DEVIOS(DEVDAT)\r
2616         HRRZ TAC,DSKBUF(DEVDAT) ;GET LOC. OF BUFFER\r
2617         CAML TAC,JOBFF(JDAT)    ;ABOVE JOBFF>\r
2618         POPJ PDP,               ;NO. RETURN.\r
2619         PUSHJ PDP,IADRCK\r
2620         POPJ PDP,\r
2621         SUBI TAC,2              ;SET TAC TO 2ND BUFFER WORD\r
2622         SOS (PDP)               ;BUFCLR WILL SKIP RETURN\r
2623         JRST BUFCLR             ;CLEAR THE BUFFER\r
2624 \r
2625 ;FIND THE FIRST ZERO IN A SET OF WORDS\r
2626 ;ENTER WITH LH OF TAC SET TO NEGATIVE OF NUMBER OF WORDS.\r
2627 ;           RH OF TAC CONTAINING ADDRESS OF FIRST WORD.\r
2628 ;CALL:  PUSHJ PDP,GETZER\r
2629 ;       EXIT1           NO ZEROS\r
2630 ;       EXIT2           NORMAL\r
2631 ;NORMAL EXIT LEAVES TAG POINTING TO WORD CONTAING THE ZERO.\r
2632 ;AND TAC1 HAVING A 1-BIT IN THE POSITION OF THE ZERO.\r
2633 ;\r
2634 ;ENTER AT GETZR1 IF TAC1 IS ALL SET UP.\r
2635 ;CALLED AT UUO AND INTERRUPT LEVELS\r
2636 \r
2637 GETZER: MOVNI DAT,1\r
2638         JRST GETZ3\r
2639 \r
2640 GETZ1:  ROT TAC1,-1\r
2641         JUMPGE TAC1,GETZ3\r
2642 \r
2643 GETZ2:  AOBJP TAC,CPOPJ\r
2644         CAMN DAT,(TAC)\r
2645         JRST GETZ2\r
2646 \r
2647 GETZ3:  TONE TAC1,(TAC)\r
2648         JRST GETZ1\r
2649         JRST CPOPJ\r
2650 \r
2651 ;TIMING:        M=NUMBER OF LEADING WORDS CONTAINING NO ZEROS\r
2652 ;       M=NUMBER OF LEADING ONES IN M+1ST WORD\r
2653 \r
2654 ;       38+12,8M+17.1N  MIRCO-SECS\r
2655 \r
2656 ;WORST CASE WITH 128 WORDS = 2.3 MILS\r
2657 \r
2658 \r
2659 ;FIND THE NUMBER OF ZERO BITS TO THE RIGHT OF A WORD\r
2660 ;CONTAINING A SINGLE 1-BIT\r
2661 ;ENTER WITH BIT IN TAC1, EXIT WITH RESIDUE IN TAC1.\r
2662 ;CALLED AT UUO AND INTERRUPT LEVELS\r
2663 \r
2664 RESIDU: TLNN TAC1,777000\r
2665         JRST RESID1\r
2666         LSH TAC1,-11\r
2667         TLOA TAC1,43000\r
2668 RESID1: TLO TAC1,32000\r
2669         FAD TAC1,[0]\r
2670         LSH TAC1,-33\r
2671         POPJ PDP,\r
2672 \r
2673 \r
2674 ;FIND FOUR FREE WORDS OF CORE, RETURN AN ADDRESS IN TAC1\r
2675 ;IT IS ASSUMED THAT THE CLOCK IS OFF.\r
2676 \r
2677         INTERN GETFCR\r
2678 \r
2679 GETFCR: MOVEI ITEM,1            ;REQUEST ONE 4 WORD BLOCK\r
2680 GTCOR1: MOVEI AC1,LOCORE        ;POINT TO THREE WORD FREE CORE ENTRY\r
2681         MOVEI AC2,DDBTAB        ;POINT TO BIT TABLE\r
2682         PUSH PDP,DAT\r
2683         PUSHJ PDP,GETBIT        ;FIND A HOLE\r
2684         JRST DFERR9             ;THERE ARE NONE\r
2685         POP PDP,DAT\r
2686         LSH TAC1,2              ;MULTIPLY BIT# BY 4\r
2687         SUBI TAC1,4             ;SYNCHRNIZE\r
2688         ADD TAC1,LOCORE         ;FORM CORE ADDRESS\r
2689         POPJ PDP,\r
2690 \r
2691 INTERNAL GETBIT\r
2692 \r
2693 \r
2694 ;SEARCH THROUGH A TABLE TO FIND A SERIES OF ZERO-BITS.\r
2695 ;ENTER WITH AC1 SET UP AS IN CLRBIT ROUTINE, C(ITEM) SET TO THE\r
2696 ;   SIZE HOLD DESIRED,\r
2697 ;CALLED AT UUO AND INTERRUPT LEVELS\r
2698 ;ON UNSUCCESSFUL RETURN DAT CONTAINS THE SIZE\r
2699 ;OF LARGETS HOLE ENCOUNTERED\r
2700 \r
2701 GETBIT: PUSH PDP,[-1]           ;INITIALIZE LARGEST HOLD FOUND SO FAR\r
2702         PUSH PDP,ITEM           ;SAVE HOLD SIZE\r
2703         MOVE TAC,2(AC1)         ;TAC:=IOWD LENGTH OF TABLE,TABLE ADDRESS\r
2704         MOVE TAC1,1(AC1)\r
2705         PUSHJ PDP,GETZER        ;FIND THE FIRST ZERO\r
2706         JRST GTBIT5             ;NO ZEROS LEFT\r
2707         MOVEM TAC1,1(AC1)       ;SAVE THE SPOT\r
2708         MOVEM TAC,2(AC1)\r
2709         PUSH PDP,TAC\r
2710         \r
2711         PUSH PDP,TAC1\r
2712 \r
2713 GTBIT1: AOS DAT                 ;INCREMENT SIZE OF HOLD BY 1 (GETZER LEFT DAT=-1)\r
2714         SOJLE ITEM,GTBIT2       ;FOUND ENOUGH?\r
2715         ROT TAC1,-1             ;NO\r
2716         SKIPGE TAC1\r
2717         AOBJP TAC,GTBT1A        ;JUMP IF TABLE EXHAUSTED\r
2718         TDNN TAC1,(TAC)         ;IS NEXT BIT ZERO?\r
2719         JRST GTBIT1             ;YES, CONTINUE\r
2720 \r
2721 GTBT1A: CAMLE DAT,-3(PDP)       ;NO. LARGEST HOLE SO FAR?\r
2722         MOVEM DAT,-3(PDP)       ;YES. SAVE SIZE\r
2723         JUMPG TAC,GTBIT6        ;TABLE EXHAUSTED? IF SO, ERROR EXIT.\r
2724         PUSHJ PDP,GETZER        ;NO, TRY FURTHER ON\r
2725         JRST GTBIT6             ;NO MORE, ERROR\r
2726         MOVEM TAC1,(PDP)\r
2727         MOVEM TAC,-1(PDP)\r
2728         MOVE ITEM,-2(PDP)\r
2729         JRST GTBIT1\r
2730 \r
2731 GTBIT2: MOVE TAC1,(PDP)         ;HOLE FOUND, SET BITS TO ONES\r
2732         MOVE TAC,-1(PDP)\r
2733         MOVE ITEM,-2(PDP)\r
2734 \r
2735 GTBIT3: ORM TAC1,(TAC)\r
2736         SOJLE ITEM,GTBIT4\r
2737         ROT TAC1,1\r
2738         JUMPGE TAC1,GTBIT3\r
2739         AOBJN TAC,GTBIT3        ;THIS SHOULD ALWAYS JUMP\r
2740 \r
2741 GTBIT4: POP PDP,TAC1\r
2742         POP PDP,TAC\r
2743         AOS -2(PDP)\r
2744         HRRZS TAC\r
2745         SUBI TAC,-1(AC2)\r
2746         PUSHJ PDP,RESIDU\r
2747         IMULI TAC,^D36\r
2748         SUBM TAC,TAC1\r
2749 GTBIT5: POP PDP,ITEM\r
2750         POP PDP,DAT             ;SIZE OF LARGEST HOLD FOUND IF UNSUCCESSFUL\r
2751         POPJ PDP,\r
2752 \r
2753 GTBIT6: POP PDP,TAC\r
2754         POP PDP,TAC1\r
2755         AOS -1(PDP)             ;SIZE OF LARGEST HOLD MUST BE ADJUSTED\r
2756         JRST GTBIT5\r
2757 \r
2758 ;FREE A FOUR WORD SECTION OF CORE.\r
2759 ;ENTER WITH ADDRESS IN TAC\r
2760 \r
2761         INTERNAL CLCOR1\r
2762 \r
2763 CLRCOR: MOVEI ITEM,1\r
2764 CLCOR1: SUB TAC,LOCORE\r
2765         LSH TAC,-2\r
2766         MOVEI AC1,LOCORE\r
2767         MOVE AC2,CRINIT         ;SEARCH FROM BEGINNING\r
2768 \r
2769 ;CLEAR A SERIES OF BITS IN SOME TABLE\r
2770 ;ENTER WITH:    C(TAC) SET TO A BIT NUMBER\r
2771 ;               C(AC1) SET TO EITHER A SAT ENTRY OR FREE\r
2772 ;                       CORE ENTRY\r
2773 ;               C(AC2) SET TO BEGINNING OF TABLE (IOWD FORM)\r
2774 ;               C(ITEM) SET TO NUMBER OF BITS TO CLEAR\r
2775 ;EXIT WITH CORRECT BITS SET TO ZERO AND SET ENTRY OR FREE CORE\r
2776 ;       ENTRY UPDATED IF NECESSARY.\r
2777 \r
2778 INTERNAL CLRBIT\r
2779 \r
2780 CLRBIT: IDIVI TAC,^D36\r
2781         HRLS TAC                ;BOTH HALVES OF TAC CONTAIN\r
2782                                 ; WORD INCREMENT\r
2783         ADD TAC,AC2\r
2784         PUSH PDP,DAT\r
2785         MOVN DAT,TAC1\r
2786         MOVSI TAC1,400000\r
2787         ROT TAC1,(DAT)\r
2788         POP PDP,DAT\r
2789         PUSH PDP,TAC\r
2790         PUSH PDP,TAC1\r
2791 \r
2792 CLRB4:  ANDCAM TAC1,(TAC)       ;CLEAR A BIT\r
2793         SOJLE ITEM,CLRB5        ;IS THAT ALL?\r
2794         ROT TAC1,-1             ;NO\r
2795         JUMPGE TAC1,CLRB4\r
2796         AOBJN TAC,CLRB4         ;THIS SHOULD ALWAYS JUMP\r
2797 \r
2798 CLRB5:  POP PDP,TAC1\r
2799         POP PDP,TAC\r
2800         CAMLE TAC,2(AC1)        ;NEED TO RESET?\r
2801         POPJ PDP,               ;NO\r
2802         CAME TAC,2(AC1)\r
2803         JRST CLRB2              ;YES\r
2804         JUMPL TAC1,CLRB2\r
2805         SKIPGE 1(AC1)\r
2806         JRST CLRB3\r
2807         CAML TAC1,1(AC1)\r
2808 CLRB2:  MOVEM TAC1,1(AC1)\r
2809 CLRB3:  MOVEM TAC,2(AC1)\r
2810         POPJ PDP,\r
2811 \r
2812 SUBTTL QUEUEING AND INTERRUPT PROCESSING\r
2813 ;PUT A REQUEST IN THE USER QUEUE.\r
2814 ;ENTER AT QIN FOR INPUT. QOUT FOR OUTPUT.\r
2815 ;CALLED AT BOTH INTERRUPT AND UUO LEVELS\r
2816 \r
2817 EXTERNAL SETACT,CPOPJ\r
2818 \r
2819 QIN:    SKIPA TAC1,DEVDAT       ;*\r
2820 QOUT:   MOVEI TAC1,DEVOAD-DEVIAD(DEVDAT) ;*\r
2821 \r
2822         MOVEI TAC,TRIES         ;*INITIALIZE ERROR COUNT\r
2823         MOVEM TAC,DSKCNT(DEVDAT) ;*\r
2824         PUSHJ PDP,SETACT        ;*SET IOACT\r
2825         MOVSI TAC,W8BIT         ;*SET WAIT FLAG\r
2826         ORM TAC,DEVIAD(TAC1)\r
2827         NOSCHEDULE      ;*\r
2828         AOS USRCNT              ;*INCREMENT COUNTER OF TRANSFER REQUESTS\r
2829 \r
2830         MOVNI DAT,1             ;*\r
2831         EXCH DAT,DFBUSY         ;*\r
2832         JUMPN DAT,QIOEND        ;*JUMP IF DISK BUSY\r
2833 \r
2834         ANDCAM TAC,DEVIAD(TAC1) ;*\r
2835         CAME TAC1,DEVDAT        ;*\r
2836         MOVEI TAC,0             ;*\r
2837         PUSHJ PDP,USRGO         ;*\r
2838 \r
2839 QIOEND: SCHEDULE        ;*\r
2840         POPJ PDP,               ;*\r
2841 \r
2842 \r
2843 ;PUT A REQUEST IN THE MONITOR QUEUE.\r
2844 ;ENTER AT MQIN FOR INPUT, MQOUT FOR OUTPUT.\r
2845 ;ENTER WITH     C(TAC1 0-17) = -SIZE OF BLOCK\r
2846 ;               C(TAC1 18-35) = CORE ADDRESS\r
2847 ;               C(TAC 18-35) = LOGICAL BLOCK NUMBER\r
2848 \r
2849 INTERNAL MQIN,MQOUT\r
2850 EXTERNAL MQREQ,MQWAIT,SETACT,MQUEUE,WSYNC\r
2851 \r
2852 MQIN:   HRLZ TAC1,DEVDAT\r
2853         TLOA TAC1,400000        ;BIT 0=1 IS READ INDICATOR\r
2854 MQOUT:  HRLZ TAC1,DEVDAT\r
2855         IFN FTRCHK,<\r
2856         TRNN TAC,-1             ;WRITING OR READING BLOCK NR 0 SHOULD NEVER OCCUR HERE\r
2857 \r
2858         HALT .+1                ;CONTINUING AFTER HALT WILL YIELD INFORMATION\r
2859                                 ; LOSS ON THE DISK\r
2860 >\r
2861         HRLI TAC,TRIES\r
2862 \r
2863         MOVSM TAC,DSKCNT(DEVDAT);STASH AWAY BLOCK #, ERROR COUNT.\r
2864         PUSHJ PDP,SETACT        ;SET IOACT\r
2865         NOSCHEDULE\r
2866         TLNN IOS,UBFS+NORELB    ;USING BUFFER IN FREE STORAGE?\r
2867         HRR TAC1,PROG           ;NO, RELOCATE\r
2868         MOVEM TAC1,@MIPTR\r
2869 \r
2870         AOS AC1,MIPTR           ;RING INDEX MIPTR\r
2871         CAIL AC1,MQTOP\r
2872         MOVEI AC1,MQUEUE\r
2873         MOVEM AC1,MIPTR\r
2874 \r
2875         MOVNI AC1,1\r
2876         EXCH AC1,DFBUSY         ;FORCE DFBUSY TO-1, EXTRACT PREVIOUS CONTENTS.\r
2877         SKIPN AC1               ;ALREADY BUSY?\r
2878         PUSHJ PDP,MONGO         ;NO, START A MONITOR JOB\r
2879 \r
2880         SCHEDULE\r
2881         PUSHJ PDP,WSYNC\r
2882         HRRZ AC1,DSKCNT(DEVDAT) ;ANY ERRORS?\r
2883         TRNN AC1,IODERR!IODTER!IOIMPM\r
2884         AOS (PDP)               ;NO, SKIP RETURN\r
2885         POPJ PDP,\r
2886 \r
2887 ;*\r
2888 ;* EVERYTHING FROM HERE THRU SETDUN CALLED AT INTERRUPT LEVEL\r
2889 ;*\r
2890 ;ROUTINE CALLED BY INTERRUPT IN DISK.\r
2891 ;CHECK JOB FOR ERRORS, THEN START UP ANY WAITING JOB.\r
2892 ;UPON ENTRY, THE ACS HAVE BEEN SAVED. IOS CONTAINS ANY ERROR\r
2893 ;FLAGS.\r
2894 \r
2895 INTERNAL DFINT,FTSWAP\r
2896 EXTERNAL ADVBFE,ADVBFF,PJOBN,SETIOD,PIOMOD\r
2897 EXTERNAL MQREQ,MQAVAL,DFRED,DFWRT\r
2898 EXTERNAL JBTADR\r
2899 EXTERNAL MQTOP,MQUEUE\r
2900 \r
2901 DFINT:\r
2902         IFN FTSWAP,<\r
2903         EXTERNAL SQREQ,SERA,SOGO,SWPINT\r
2904         MOVE TAC,SERA           ;*WAS THAT A SWAPPING JOB?\r
2905         TLNE TAC,200000         ;*\r
2906         JRST SWPINT             ;*YES\r
2907         >\r
2908         SKIPN RUNUSR            ;*WAS THAT A USER JOB?\r
2909         JRST DFINT2             ;*NO, MUST HAVE BEEN MONITOR\r
2910         \r
2911         MOVS DEVDAT,RUNUSR      ;*YES\r
2912         ANDI DEVDAT,377777      ;*CLEAR READ INDICATOR BIT.\r
2913         TRNE IOS,IOIMPM         ;*WRITE-LOCK?\r
2914         PUSHJ PDP,DINT1A        ;*YES\r
2915         TRNE IOS,IODTER!IODERR  ;*ERRORS?\r
2916         JRST DFINT9             ;*ERRORS\r
2917 DFINTA: AOS DEVACC(DEVDAT)      ;INCREMENT POINTER TO RETRIEVAL POINTER\r
2918         AOS SETCNT(DEVDAT)      ;INCREMENT RELATIVE BLOCK NUMBER\r
2919         SOS USRCNT              ;*\r
2920         PUSHJ PDP,SETDUN        ;*TURN OFF I/O WAIT\r
2921         LDB TAC,PJOBN\r
2922         MOVE PROG,JBTADR(TAC)   ;*SET RELOC. AND PROT. FOR THIS JOB\r
2923 \r
2924         SKIPL RUNUSR            ;*WAS IT A READ OR A WRITE?\r
2925         JRST DFINT1             ;*WRITE\r
2926 \r
2927         MOVEI TAC,@DEVIAD(DEVDAT) ;*SET UP WORD COUNT\r
2928         ADDI TAC,1              ;*\r
2929         MOVEI TAC1,BLKSIZ\r
2930         HRRM TAC1,@TAC\r
2931 \r
2932         IFG CHKCNT,<\r
2933         MOVE TAC,DEVOAD(DEVDAT)\r
2934         TLNE TAC,CKSUPR\r
2935         JRST DINT0B\r
2936         HRRZ TAC,DEVIAD(DEVDAT)\r
2937         ADD TAC,[XWD NBLKSZ,2]\r
2938         PUSHJ PDP,CHKSUM        ;CLEAR IOACT\r
2939         MOVE TAC,DEVACC(DEVDAT)\r
2940         HLRZ TAC,-1(TAC)\r
2941         CAMN TAC,TAC1\r
2942         JRST .+3\r
2943         PUSHJ PDP,CKREC3\r
2944         MOVEM IOS,DEVIOS(DEVDAT)\r
2945         >\r
2946 DINT0B:\r
2947         PUSHJ PDP,DFINX         ;ENTER INPUT ROUTINE\r
2948         SKIPA\r
2949 DFINT1: PUSHJ PDP,DFOUTX        ;CHECK FOR MORE OUTPUT\r
2950         SETZM RUNUSR\r
2951 \r
2952         JRST DFINT4\r
2953 \r
2954 DINT1A: HRRZ TAC,DEVACC(DEVDAT) ;WRITE-LOCK FOUND, SET WLBIT\r
2955         HRRZ TAC,-1(TAC)\r
2956         JRST SETWL              ;AND RETURN\r
2957 \r
2958 DFINT2: MOVS DEVDAT,@MOPTR      ;IT WAS A MONITOR JOB\r
2959         ANDI DEVDAT,377777      ;REMOVE POSSIBLE READ INDICATOR\r
2960         TRNN IOS,IODERR!IODTER  ;ERRORS?\r
2961         JRST DFINT3             ;NO.\r
2962         SOS TAC,DSKCNT(DEVDAT)  ;YES,TRIED ENOUGH?\r
2963         TRNE TAC,-1\r
2964         JRST DINT4A             ;NO, TRY AGAIN.\r
2965 \r
2966 DFINT3: HRRM IOS,DSKCNT(DEVDAT) ;SAVE ANY ERRORS\r
2967         HLRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK ERROR?\r
2968         TRNE IOS,IOIMPM\r
2969         PUSHJ PDP,SETWL         ;YES, SET WLBIT\r
2970         PUSHJ PDP,SETDUN\r
2971         SETZM @MOPTR            ;REMOVE THIS MONITOR JOB\r
2972         AOS TAC,MOPTR           ;INCREMENT POINTER.\r
2973         CAIL TAC,MQTOP\r
2974         MOVEI TAC,MQUEUE\r
2975         MOVEM TAC,MOPTR         ;FALL THROUGH TO DFINT4\r
2976 \r
2977 ;DETERMINE NEXT TRANSFER TO MAKE ACCORDING TO PRIOROTY\r
2978 ; 1) SWAPPING  2) MQ I/O  3) BUFFERED MODE I/O\r
2979 DFINT4: MOVEM IOS,DEVIOS(DEVDAT) ;CLEAR IOACT\r
2980 DINT4A: IFN FTSWAP,<\r
2981         SKIPE SQREQ             ;SWAPPING JOB WAITING?\r
2982         JRST SOGO               ;YES,START IT\r
2983         >\r
2984 INTERNAL DINT4B\r
2985 \r
2986 DINT4B: SKIPE @MOPTR            ;MONITOR JOB WAITING?\r
2987         JRST MONGO              ;YES, START IT UP\r
2988 \r
2989         SKIPL USRCNT            ;USER WAITING?\r
2990         JRST FINDV              ;YES.\r
2991         SETZM DFBUSY            ;NO. TURN OFF BUSY FLAG\r
2992         POPJ PDP,               ;EXIT INTERRUPT\r
2993 \r
2994 ;FIND A WAITING USER\r
2995 \r
2996 FINDV:  HRRZ DEVDAT,DDBPTR\r
2997         MOVSI TAC,W8BIT         ;PREPARE TO TURN OFF WAIT INDICATOR\r
2998 \r
2999 DFINT5: HLRZ TAC1,(DEVDAT)      ;END OF DISK DDBS?\r
3000         SKIPE DEVDAT\r
3001         CAIE TAC1,(SIXBIT /DSK/)\r
3002         MOVEI DEVDAT,DSKDDB     ;YES, RESET TO TOP\r
3003 \r
3004         SKIPGE DEVIAD(DEVDAT)   ;ANY READS WAITING?\r
3005         JRST DFINT7             ;YES\r
3006         SKIPGE DEVOAD(DEVDAT)   ;ANY WRITES WAITING?\r
3007         JRST DFINT6             ;YES\r
3008         HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, TRY NEXT DDB\r
3009         JRST DFINT5\r
3010 \r
3011 ;START UP A USER WRITE\r
3012 \r
3013 DFINT6: ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAIT BIT IN DDB\r
3014         MOVEI TAC,0             ;PREPARE TO SET BIT 0=0 IN RUNUSR\r
3015         JRST USRGO\r
3016 \r
3017 ;START UP A USER READ\r
3018 \r
3019 DFINT7: ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAIT BIT IN DDB\r
3020 \r
3021 USRGO:  MOVSM DEVDAT,RUNUSR     ;SAVE DEVDAT FOR USE AT DFINT\r
3022         ORM TAC,RUNUSR          ;SET READ (B0=1) WRITE (B0=0) INDICATION\r
3023         AOS UXFERS              ;COUNT TOTAL USER TRANSFERS\r
3024         LDB PROG,PJOBN          ;SETUP RELOCATION FOR JOB\r
3025         MOVE PROG,JBTADR(PROG)\r
3026         MOVE TAC,DEVSER(DEVDAT) ;GET DDB LINK\r
3027         MOVSM TAC,DDBPTR        ;START SEARCH WITH NEXT DDB\r
3028         MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION\r
3029         HRRZ TAC,(TAC)          ;GET RETRIEVAL POINTER (XWD CHECKSUM BLOCK #)\r
3030         MOVSI TAC1,NBLKSZ\r
3031         SKIPL RUNUSR            ;READ?\r
3032         JRST USRGO3\r
3033 \r
3034         HRRI TAC1,@DEVIAD(DEVDAT) ;GET ADDRESS OF RING BUFFER\r
3035         AOJA TAC1,DFRED         ;FROM IOWD AND READ\r
3036 \r
3037 USRGO3: HRRI TAC1,@DEVOAD(DEVDAT) ;GET ADDRESS OF OUTPUT BUFFER\r
3038         AOJA TAC1,DFWRT         ;FORM IOWD AND WRITE\r
3039 \r
3040 \r
3041 ;START UP A MONITOR READ OR WRITE\r
3042 \r
3043 MONGO:  MOVS ITEM,@MOPTR        ;XWD CORE ADDRESS, SAVED DEVDAT\r
3044         ANDCMI ITEM,400000      ;CLEAR READ INDICATOR\r
3045         MOVE TAC1,DSKBUF(ITEM)  ;GET CONTROLLING IOWD\r
3046         HLRZ TAC,ITEM           ;GET CORE ADDRESS\r
3047         ADD TAC1,TAC\r
3048         HLL TAC1,DSKBUF(ITEM)           ;RESTORE LH IN CASE ADDING REL. CAUSES OVRFL IN T LH\r
3049         SUBI TAC1,1             ;FORM IOWD LENGTH ADDRESS\r
3050         HLRZ TAC,DSKCNT(ITEM)   ;GET LOGICAL BLOCK#\r
3051         SKIPL @MOPTR\r
3052         JRST DFWRT\r
3053         JRST DFRED\r
3054 \r
3055 ;ERROR ON USER JOB.\r
3056 \r
3057 DFINT9: AOS ECOUNT              ;COUNT USER HARDWARE ERRORS\r
3058         SOS TAC,DSKCNT(DEVDAT)  ;TRIED ENOUGH?>\r
3059         TRNN TAC,-1\r
3060         JRST DFINTA             ;YES.\r
3061         MOVE TAC,DEVDAT         ;NO. RESET FLAG SO IT WILL GO AGAIN.\r
3062         SKIPL RUNUSR            ;READ?\r
3063         ADDI TAC,DEVOAD-DEVIAD  ;NO.\r
3064         MOVSI TAC1,400000\r
3065         ORM TAC1,DEVIAD(TAC)    ;RESTORE WAIT BIT TO DEVIAD OR DEVOAD\r
3066         SETZM RUNUSR            ;CLEAR USER INDICATOR\r
3067         JRST DINT4A             ;DO NEXT TASK.\r
3068 \r
3069 ;CLEAR I/O DONE FLAG IF IT IS ON.\r
3070 \r
3071 SETDUN:                         ;*\r
3072         OR IOS,DEVIOS(DEVDAT)   ;*\r
3073         ANDCMI IOS,IOACT        ;*\r
3074         TLZE IOS,IOW            ;*\r
3075         JRST SETIOD             ;*\r
3076         POPJ PDP,               ;*\r
3077 \r
3078 SUBTTL ERRORS,  SUBROUTINES.\r
3079 ;ERROR ROUTINES CALLED FROM UUO LEVEL\r
3080 \r
3081 EXTERN EXCALP,ERRPTU,TPOPJ\r
3082 \r
3083 DEFINE ERRORS (X),<\r
3084         PUSHJ PDP,CLRBUF        ;CLEAR ANY DUMP BUFFER\r
3085         JSP TAC,ERRPTU          ;OUTPUT A MESSAG\r
3086         ASCIZ ^X^\r
3087         JRST EXCALP             ;TYPE "UUO FROM" MESSAGE AND QUIT\r
3088         >\r
3089 \r
3090 DFERR1: ERRORS          <DISK FULL-- YOUR JOB HAS LOST.  >\r
3091 \r
3092 DFERR2: MOVEI IOS,IOIMPM\r
3093         ORB IOS,DEVIOS(DEVDAT)\r
3094         POPJ PDP,\r
3095 \r
3096 DFERR3: ERRORS <INCORRECT RETRIEVAL INFORMATION>\r
3097 \r
3098 ;THESE ERROR ROUTINES ARE GENERALLY CALLED AFTER SETLE HENCE 0(PDP) IS XWD PROJ,PROG\r
3099 \r
3100 DFERR6: MOVEI TAC,NORITE        ;FILE ALREADY BEING ALTERED\r
3101 DFERRY: HRRZ TAC1,UUO\r
3102         ADD TAC1,[XWD PROG,ERRBIT] ;FORM POINTER TO UUO PARAMETER BLOCK\r
3103         HRRM TAC,@TAC1          ;STORE ERROR CODE\r
3104         POP PDP,TAC             ;REMOVE XWD PROJ,PROG\r
3105         JRST CLRBUF             ;RELEASE ANY RESOURCES\r
3106 \r
3107 DFERR5: MOVEI TAC,PROTF         ;PROTECTION FAILURE\r
3108         JRST DFERRY\r
3109 \r
3110 DFERR4: MOVEI TAC,NOTINM        ;USER NOT IN MFD\r
3111         JRST DFERRY\r
3112 \r
3113 DFERR7: MOVEI TAC,NOTINU        ;FILE NOT IN UFD\r
3114         JRST DFERRY\r
3115 \r
3116 DFERR8: ERRORS <LOOKUP AND ENTER HAVE DIFFERENT NAMES>\r
3117 \r
3118 DFERR9: SCHEDULE\r
3119         ERRORS <NOT ENOUGH FREE CORE IN MONITOR>\r
3120 \r
3121 DFER10: MOVEI TAC,RENFAL\r
3122         JRST DFERRY\r
3123 \r
3124 DFER11: MOVEI TAC,NOFILE\r
3125         JRST DFERRY\r
3126 \r
3127 DFER12: MOVEI   TAC,0\r
3128         PUSH    PDP,TAC         ;ADD SOMETHING TO BE REMOVED (SINCE SETLE NOT CALLED)\r
3129         JRST DFERRY\r
3130 \r
3131 WERA:   MOVSI IOS,NORELB\r
3132         ANDCAB IOS,DEVIOS(DEVDAT)\r
3133         ERRORS <NON-RECOVERABLE DISC WRITE ERROR>\r
3134 \r
3135 RERA:   MOVSI IOS,NORELB\r
3136         ANDCAB IOS,DEVIOS(DEVDAT)\r
3137         ERRORS <NON-RECOVERABLE DISC READ ERROR>\r
3138 \r
3139 ;CALLED AT BOTH INTERUPT AND UUO LEVELS\r
3140 ;COMPUTE CHECK-SUM\r
3141 ;ENTER WITH C(TAC 18-35) SET TO BUFFER ADDRESS\r
3142 ;RETURN WITH C(TAC1)SET TO ONES COMPLEMENT SUM IN RH.\r
3143 \r
3144 IFG CHKCNT,<INTERNAL CHKSUM\r
3145 CHKSUM: HLRZ TAC1,TAC           ;IS COUNT GREATER THAN CHKCNT\r
3146         CAIGE TAC1,-CHKCNT\r
3147         MOVEI TAC1,-CHKCNT      ;YES, USE CHKCNT\r
3148         MOVE IOS,[XWD UBFS,IOACT]\r
3149         ANDCM IOS,DEVIOS(DEVDAT)\r
3150         IORM IOS,DEVIOS(DEVDAT)\r
3151         TLNE IOS,UBFS\r
3152         ADDI TAC,(PROG)         ;NO. RELOCATE,\r
3153         HRL TAC,TAC1            ;RESET COUNT IN LH AFTER POSSIBLE OVERFLOW\r
3154         PUSHJ PDP,CHECK\r
3155         ANDCAB IOS,DEVIOS(DEVDAT)\r
3156         TRZ IOS,IOACT\r
3157         POPJ PDP,\r
3158 \r
3159 \r
3160 CHKSM3: AOJA TAC1,CHKSM2        ;BRING CARRY AROUND\r
3161 \r
3162 ;CHECKSUM ERROR COUNTING ROUTINE\r
3163 CKREC2: PUSH PDP,TAC\r
3164         IORM AC3,DEVIOS(DEVDAT)\r
3165         MOVEI TAC,10000\r
3166         ADDM TAC,CKSMCT\r
3167         JRST TPOPJ\r
3168 CKREC3: IORI IOS,IODTER\r
3169         AOS CKSMCT\r
3170         POPJ PDP,\r
3171         >\r
3172 \r
3173 ;TIMING OF MAIN LOOP IS 13.8 MICRO-SECS AVERGE.\r
3174 ;THIS IS 1.8 MILS OR SO FOR 128 WORDS.\r
3175 \r
3176 IFN     <IFG CHKCNT, <CHKCNT+>>FTCHECK+FTMONP+FTSWAP, <\r
3177 \r
3178         INTERNAL CHECK\r
3179 CHECK:  MOVEI TAC,0             ;CLEAR SUM\r
3180         JFCL 4,.+1              ;CLEAR CARRY0 FLAG\r
3181 \r
3182 CHKSM1: ADD TAC1(TAC)           ;ADD NEXT WORD\r
3183         JFCL 4,CHKSM3           ;JUMP IF CARRY 0\r
3184 CHKSM2: AOBJN TAC,CHKSM1        ;LOOP UNTIL DONE\r
3185         HLRZ TAC,TAC1           ;ADD HALVES\r
3186         HRRZS TAC1\r
3187         ADD TAC1,TAC\r
3188         TLZE TAC1,1             ;CARRY INTO LH?\r
3189         ADDI TAC1,1             ;YES BRING IT AROUND\r
3190         POPJ PDP,\r
3191 >\r
3192 \r
3193 ;UPDATE DEVCNT IF NECESSARY. DEVCNT HAS SIZE OF FILE IN R.H. (IN WORDS IF POSSIBLE,\r
3194 ; OTHERWISE NEGATIVE BLOCK COUNT).\r
3195 ; ENTER WITH SIZE OF CURRENT BLOCK IN TAC1\r
3196 UPDEVC: HRRZ TAC,SETCNT(DEVDAT) ;*CONVERT CURRENT RELATIVE BLOCK NUMBER TO WORDS\r
3197         SUBI TAC,1              ;*\r
3198         LSH TAC,BLKP2           ;*\r
3199         ADD TAC,TAC1            ;*ADD IN THE ADDITIONAL WORDS IN THIS NEXT\r
3200                                 ; OUTPUT COMMAND.\r
3201         HRRZ TAC1,DEVCNT(DEVDAT) ;*PICK UP PREVIOUS MAXIMUM FILE SIZE OF COMPARISON.\r
3202         TRNE TAC1,400000        ;*PREVIOUS MAXIMUM SIZE GREATER THAN 2 EXP 17 WORDS?\r
3203         JRST UPDVC2             ;*YES, THEN COMPARE AND SAVE NEGATIVE BLOCK COUNTS\r
3204         TLNN TAC,-1             ;*NO, DOES THE NEWLY COMPUTED CURRENT FILE SIZE EXCEED\r
3205 \r
3206                                 ;* 2EXP17 WORDS?\r
3207         TRNE TAC,40000          ;*\r
3208         JRST UPDVC1             ;*YES, GO SAVE NEGATIVE BLOCK COUNT.\r
3209         CAMLE TAC,TAC1          ;*NO, COMPARE POSITIVE WORD COUNTS\r
3210         HRRM TAC,DEVCNT(DEVDAT) ;*UPDATE MAXIMUM FILE SIZE ONLY IF PREVIOUS\r
3211                                 ; MAXIMUM EXCEEDED\r
3212         POPJ PDP,               ;*\r
3213 UPDVC1: TRO TAC1,-1             ;*SET PREVIOUS MAXIMUM AS ONLY ONE \r
3214                                 ;* (THUS FORCING CURRENT BLOCK COUNT TO BE STORED).\r
3215 UPDVC2: ADDI TAC,BLKSIZ-1       ;*CONVERT POSITIVE WORD COUNT TO NEGATIVE\r
3216                                 ; BLOCK COUNT.\r
3217         LSH TAC,-BLKP2          ;*\r
3218         MOVNS TAC               ;*\r
3219         TRON TAC,400000         ;*MORE THAN 2EXP17 BLOCKS (16,777,216 WORDS)\r
3220                                 ; IN THIS FILE?\r
3221         TROA IOS,IOBKTL         ;*YES, (PREPOSTEROUS) SET ERROR BIT AND STORE\r
3222                                 ; BLOCK COUNT WODULO 2EXP17\r
3223         CAILE TAC1,(TAC)        ;*NO, COMPARE PREVIOUS MAXIMUM VERSUS PRESENT\r
3224                                 ; FILE SIZE.\r
3225         HRRM TAC,DEVCNT(DEVDAT) ;*STORE NEW MAXIMUM FILES SIZE ONLY IF PREVIOUS\r
3226                                 ;* MAXIMUM EXEEDED.\r
3227         POPJ PDP,               ;*\r
3228 \r
3229 ;OUTPUT WRITE-LOCK ERROR. FREE THE BLOCK AND GET NEW ONE.\r
3230 \r
3231 WLERA:  HLR TAC,DSKCNT(DEVDAT)  ;PICK UP BLOCK NUMBER.\r
3232         PUSHJ PDP,SETFRE        ;FREE THE BLOCK\r
3233         JRST DFGETF             ;GET ANOTHER.\r
3234 \r
3235 ;SET WRITE-LOCK INDICATION IN A SAT ENTRY.\r
3236 ;ENTER WITH A BLOCK NUMBER IN TAC.\r
3237 \r
3238 SETWL:  MOVEI TAC1,SETENT       ;*\r
3239         JRST .+2                ;*\r
3240 SETWL1: ADDI TAC1,SENTSZ        ;*\r
3241         HLRZ ITEM,@TAC1         ;*IS THE BLOCK IN THIS SAT ENTRY?\r
3242         CAML TAC,ITEM           ;*\r
3243         CAIL TAC,NUMBLK(ITEM)   ;*\r
3244         JRST SETWL1             ;*NO, LOOP.\r
3245         MOVEI ITEM,WLBIT        ;*\r
3246         ORM ITEM,@TAC1          ;*\r
3247         POPJ PDP,               ;*\r
3248 \r
3249 DSKSR:  END\r
3250 \f\r