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