2 TITLE DSKSER -- DEVICE-INDEPENDENT DISK SERVICE ROUTINES.
\r
6 TITLE DSKSRB - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (BURROUGHS)
\r
9 TITLE DSKSRD - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (DATA PRODUCTS)
\r
11 SUBTTL A, BLACKINGTOM/CMF/TH/CHW/RCC/AF TS 02 JUN 69 V424
\r
14 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
\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
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
34 ENTRY DSKSRB ;THIS SYMBOL IS TO PERMIT SYSTEM
\r
35 DSKSRB: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE,
\r
38 ENTRY DSKSRD ;THIS ENTRY FOR SELECTIVE LOAD BY BUILD
\r
44 INTERNAL WLBIT,DSKFGS,CHKCNT
\r
46 TA=BUFPNT ;USED BY RENAME
\r
47 TB=BUFWRD ;USED BY RENAME
\r
50 INTERNAL MFDBLK,SATXWD
\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
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
61 \fCHKCNT=200 ;NUMBER OF WORDS TO CHECK-SUM
\r
62 W8BIT=400000 ;WAIT INDICATION FOR DDB
\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
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
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
84 ;TEST BITS PUT IN LH OF DEVOAD
\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
94 \f;CONSTANTS USED IN CONNECTION WITH ACCESS TABLE ENTRIES
\r
96 ATPP=0 ;PROJECT,PROGRAMMER NUMBERS
\r
97 ATNAME=1 ;OWNER NAME
\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
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
112 ;CONSTANTS USED IN CONNECTION WITH SAT BLOCKS
\r
114 XP NUMBIT,^D36*BLKSIZ ;NUMBER OF BITS IN ONE BLOCK
\r
118 XP NUMSAT,4 ;ONLY FOUR SAT BLOCK ON PDP-10 DISK,
\r
121 XP NUMSAT,16 ;NUMBER OF SAT BLOCKS FOR 5.76 MILLION
\r
122 ;WORD DATA PRODUCTS MODEL 270 DISK,
\r
124 XP WLBIT,400000 ;IF BIT IS ON IN FIRST SATENT ENTRY
\r
125 ;WORD, THE DISK IS WRITE-LOCKED.
\r
128 DEFINE NOSCHEDULE <
\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
145 IFE FTCHECK+FTMONP,<
\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
151 ;MORE MISCELLANEOUS FOR DISK
\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
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
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
174 EXTERNAL MFDBLK,SATXWD,NUMBLK,SATENT,SENTSZ,SATTOP
\r
180 XP NUMBLK,^D4000 ;NUMBER OF DATA BLOCKS PER SAT BLOCK ON THE
\r
181 ; PDP-10 MODEL RC-10 DISK FILE.
\r
184 XP NUMBLK,5400 ;NUMBER OF DATA BLOCKS REPRESENTED BY
\r
185 ;ONE SAT BLOCK ON THE DATA PRODUCTS 270 DISK.
\r
187 XP SENTSZ,3 ;SIZE OF EACH SATENT ENTRY
\r
189 DSKXDB=0 ;ON PDP-10 DISK FILE STORAGE BEGINS IN LOGICAL
\r
193 DSKXDB=5400 ;FILE STORAGE BEGINS ON SECOND DISK OF OLD (MOD 270)
\r
194 ; DISK FILE SINCE FIRST DISK IS ALLOCATED
\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
202 DSKXDB=DSKXDB+NUMBLK>
\r
204 XP SATTOP,SATENT+SENTSZ*NUMSAT-SENTSZ
\r
206 >;END OF FTRA100 CONDITIONAL
\r
209 SAT: BLOCK 200 ;CURRENT SAT BLOCK
\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
217 ;THE DUMMY DEVICE DATA BLOCK
\r
219 DSKSIZ=4*DSKCOR ;NUMBER OF WORDS ALLOCATED FOR DDB
\r
220 ;MUST BE A MULTIPLE OF FOR (SEE GETCOR)
\r
222 DSKDDB: SIXBIT /DSK/
\r
226 XWD DVOUT+DVIN+DVDIR+DVDSK+DVLNG,154403
\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
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
265 \f;DEFINE 3 WORD ENTRY CONTROLLING BIT SEARCH IN DDBTAB
\r
266 INTERNAL LOCORE,CRINIT
\r
269 LOCORE: EXP 0 ;ADDRESS OF FIRST 4 WORD BLOCK IN FREE CORE AREA
\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
275 MONBUF: BLOCK 200 ;MONITOR BUFFER, USED TO READ RETRIEVAL POINTERS, ETC.
\r
277 \f;ERROR CODES FOR LOOKUP, RENAME AND/OR ENTER
\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
289 ;DISK DISPATCH TABLE
\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
300 JRST DFLOOK ;LOOKUP
\r
301 JRST DFDMPO ;DUMP OUTPUT
\r
302 JRST DFDMPI ;DUMP INPUT
\r
307 JRST DFCLSI ;CLOSE INPUT
\r
311 ;ACCINI - CALLED AT 140 START, 143 RESTART
\r
312 ; RESTORE DEVICE DATA BLOCK CHAIN
\r
313 ; INITIALIZE DDBTAB BIT SEARCHING ENTRY
\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
323 ACCIN2: MOVEI TAC,DSKDDB
\r
324 HRLM DEVDAT,DEVSER(TAC) ;LINK PROTOTYPE TO FIRST NON DSK DDB
\r
326 MOVEM TAC,CORBIT ;INITIALIZE FLOATING 1 BIT
\r
328 MOVEM TAC,CORIWD ;RESET AOBJN WORD
\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
337 DSKINI: IFN FTSWAP, <
\r
338 SETZM SQREQ ;NO SWAPPING REQUEST
\r
343 HLLZS DSKCON ;CLEAR INTERRUPT FLAGS FOR CONSO
\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
367 DSKIN1: SETZM FAT ;NO ACCESS ENTRIES
\r
368 MOVEI TAC,MQUEUE+1 ;DESTINATION FOR BLT
\r
370 MOVEM TAC,MOPTR ;RESET IN AND OUT POINTERS
\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
382 INTERN DSKSTP,SAT05,JSAT06
\r
384 EXTERNAL DSKBIT,WSYNC,STOIOS,DCBBIT
\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
390 SKIPL STARTS ;HAS A SAT BLOCK BEEN READ IN?
\r
391 PUSHJ PDP,SAT01 ;YES, WRITE IT OUT
\r
393 POPJ PDP, ;YOU ARE SAFELY DONE.
\r
395 SAT01: MOVEI DEVDAT,DSKDDB
\r
396 SETZB IOS,DEVIOS(DEVDAT)
\r
398 PUSH PDP,WSYNC ;CHANGE WSYNC ROUTINE
\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
405 SETZM SATCHG ;SHOW SAT BLOCK IN CORE = BLOCK ON DISK.
\r
407 POP PDP,WSYNC ;NO ERRORS, SO RETURN.
\r
408 SETZM DEVIOS(DEVDAT)
\r
411 SAT04: SOJG ITEM,SAT02 ;ERRORS, SO TRY AGAIN
\r
412 POP PDP,WSYNC ;RESTORE WSYNC ROUTINE
\r
415 SAT06: MOVEI TAC,IOACT ;THIS IS SUBSTITUE FOR WSYNC
\r
416 TDNE TAC,DEVIOS(DEVDAT)
\r
422 SUBTTL ENTER, LOOKUP, RENAME, CLOSE
\r
425 EXTERNAL TIME,PRJPRG,CPOPJ, THSDAT
\r
427 DFENTR: SKIPN @UUO ;ZERO FILE NAME ?
\r
429 PUSHJ PDP,ALTMFD ;ENTER TO MFD?
\r
430 TLNE DEVDAT,LOOKB ;NO, HAS LOOKUP BEEN DONE?
\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
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
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
455 JRST DFERR6 ;YES,ERROR
\r
460 DFENT3: TLZE IOS,PRCHG ;PROTECTION FAILURE?
\r
461 JRST DFERR5 ;YES. GIVE ERROR RETURN.
\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
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
479 ORI TAC1,400000 ;MAKE SURE ACCESS DATE NON-ZERO,
\r
480 HRRM TAC1,1(DAT) ;STORE THSDAT AS ACCESS DATE
\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
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
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
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
502 \f;AN ENTER AFTER A LOOKUP, SET "RWTBIT" FLAG IN ACCESS ENTRY
\r
504 DFENT5: MOVE TAC,DEVOAD(DEVDAT) ;CHECK PROTECTION
\r
506 PUSHJ PDP,DFERR5 ;FAILURE, THIS WILL NOT RETURN HERE
\r
507 HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY
\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
515 MOVE TAC,@UUO ;SAME FILE?
\r
516 CAME TAC,DEVFIL(DEVDAT)
\r
517 JRST DFERR8 ;NO, NAME WRONG
\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
531 ;FILE IS BEING READ
\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
539 EXTERNAL UDLKC,TPOPJ
\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
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
557 DFLUK3: AOS TBITS(TAC) ;INCREMENT RCOUNT
\r
558 HRLM TAC,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY
\r
560 MOVE TAC,DEVEXT(DEVDAT) ;FIRST RIB#
\r
561 PUSHJ PDP,SETPTR ;GET IN THE RETRIEVAL INFO
\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
570 MOVE TAC1,DEVOAD(DEVDAT) ;CHECK WRITE PROTECTION FOR
\r
571 MOVSI DAT,100000 ;POSSIBLE SUBSEQUENT ENTER
\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
577 \fDFLUK4: MOVSI TAC,PTR1(DEVDAT) ;COPY INFO TO LOOKUP PARAMETER BLOCK
\r
579 HRRI TAC,@UUO ;DESTINATION IS UUO PARAMETER BLOCK
\r
581 BLT TAC,2(TAC1) ;BLT NAME. EXT. PROTECTION, ETC FROM DDB TO USER
\r
583 HLRE TAC,FPNTR1(DEVDAT) ;FILE LENGTH (USUALLY -WORDS)
\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
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
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
600 ;TO GET AROUND CHECKSUM FAILURE WHILE READING DUMP FILES IN NON-DUMP MODE
\r
602 LDB TAC1,[POINT 4,-2(DAT),12]
\r
603 CAIGE TAC1,15 ;IS FILE IN DUMP MODE?
\r
605 LDB TAC1,[POINT 4,DEVIOS(DEVDAT),35]
\r
607 CAIGE TAC1,15 ;IS CURRENT MODE DUMP?
\r
608 IORM TAC,DEVOAD(DEVDAT) ;NO. SUPPRESS CHECKSUM
\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
614 DFLUK7: PUSHJ PDP,DFCL21 ;PROTECTION FAILURE,CLEAR ACCESS
\r
617 ;FILE IS BEING WRITTEN
\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
623 ;TEST FOR MFD ALTERAION
\r
625 EXTERNAL SYSPP,JOB,PRJPRG
\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
631 POPJ PDP, ;NO,RETURN
\r
634 XOR TAC,PRJPRG(ITEM)
\r
635 TLNN TAC,-1 ;PRIVILEGED USER?
\r
636 POPJ PDP, ;YES, RETURN
\r
643 DFREN: PUSHJ PDP,DFRENX
\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
659 MOVEI DAT,0 ;BUILD ACCESS ENTRY
\r
661 MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY
\r
663 DFREN1: AOS TBITS(TAC) ;INCREMENT RCOUNT
\r
664 HRLM TAC,DEVACC(DEVDAT) ;SAVE POINTER TO ACCESS ENTRY
\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
674 TLNN AC1,777000 ;ANY DIFFERENCES?
\r
676 MOVSI DAT,400000 ;YES, CAN IT BE?
\r
678 JRST DFREN8 ;NO, ERROR
\r
680 DFRN2A: MOVSI DAT,100000 ;CAN THIS BE RE-WRITTEN?
\r
682 JRST DFERR3 ;BAD RETREIVAL INFO
\r
683 JRST DFRN8A ;WRITE PROTECTED
\r
684 TLZ IOS,PRCHG ;ARBITRARY CHANGE OK.
\r
686 \fDFREN2: NOSCHEDULE
\r
687 PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING
\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
695 JRST DFRN1A ;FOUND ANOTHER
\r
697 DFRN1B: HLRZ TAC,DEVACC(DEVDAT) ;SET RENAME FLAG IN FIRST ENCOUNTERED ACCESS ENTRY
\r
698 MOVEI AC1,RTBIT ;RENAME BIT
\r
701 \f MOVE TAC,@UUO ;GET NEW FILENAME
\r
702 CAME TAC,DEVFIL(DEVDAT) ;SAVE AS DDB?
\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
708 SOJA UUO,DFREN3 ;NO
\r
711 ;FILENAME AND EXTENSION ARE IDENTICAL. CHANGE ONLY PROTECTION
\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
722 PUSHJ PDP,WRI ;RE-WRITE THE BLOCK
\r
724 DFREXT: AOS -1(PDP) ;LEAVE
\r
726 PUSHJ PDP,CLRBUF ;CLEAR NAY DUMP BUFFER
\r
727 JRST DFCL21 ;CLEAR ACCESS ENRTY AND EXIT
\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
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
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
754 \f;ALTER RETRIEVAL INFORMATION
\r
756 DFREN5: POP PDP,DAT ;BACK UP PDP
\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
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
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
770 MOVE TAC,@UUO ;GET NEW NAME
\r
771 MOVEM TAC,@TAC1 ;STORE IN RIB
\r
772 ADDI TAC1,1 ;CHANGE EXTENSION
\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
782 LDB TAC,[POINT 9,@UUO,8] ;GET NEW PROTECTION
\r
783 DPB TAC,[POINT 9,@TAC1,8] ;STORE IN RIB
\r
785 PUSHJ PDP,WRI ;RE-WRITE RIB
\r
788 PUSHJ PDP,FINDE ;BRING IN CORRECT BLOCK
\r
790 SUBI UUO,1 ;REPLACE EXTENSION IN UFD
\r
793 SUBI UUO,1 ;AND NAME
\r
798 PUSHJ PDP,WUFD ;RE-WRITE THE BLOCK
\r
801 ;FILE COULD NOT BE RENAMED BECAUSE OF PROTECTION
\r
803 DFRN8A: TLNE IOS,PRCHG ;PROTECTION CHANGE?
\r
805 DFREN8: PUSHJ PDP,DFCL21 ;TAKE OUT ACCESS ENTRY
\r
806 JRST DFERR5 ;AND LEAVE
\r
808 ;FILE COULD NOT BE RENAMED BECAUSE IT WAS BEING CREATED.
\r
811 PUSHJ PDP,DFCL21 ;TEAKE OUT ACCESS ENTRY
\r
813 \f;DELETE A FILE FROM A UFD
\r
815 DFREN7: PUSHJ PDP,FINDE ;FIND THE CORRECT BLOCK
\r
819 SUBI TAC1,1 ;DESTINATION
\r
820 HRLI TAC1,2(TAC1) ;SOURCE IS ENTRY BEYOND DESTINATION
\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
827 BLT TAC1,(AC2) ;MOVE SOME WORDS UP (ONE TOO MANY BECAUSE
\r
828 ; COULD BE DELETING 64TH ENTRY IN UFD BLOCK)
\r
830 SETZM @AC2 ;MAKE SURE OF ZERO
\r
834 PUSHJ PDP,WUFD ;RE-WRITE
\r
835 AOS (PDP) ;SKIP RETURN
\r
836 HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY
\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
848 ;UPON EXIT, (PDP) = OWNER PROJ,-PROG. NUMBER
\r
850 EXTERNAL SYSPP,JOB,PRJPRG,CPOPJ2,CPOPJ1
\r
852 SETLE: MOVSI TAC,RENBIT ;TURN OFF THE FLAG
\r
853 ANDCAM TAC,DEVOAD(DEVDAT)
\r
855 SETLE0: MOVEM IOS,DEVIOS(DEVDAT)
\r
857 MOVE AC1,@UUO ;PICK UP FILE NAME
\r
858 MOVEM AC1,DEVFIL(DEVDAT) ;STORE FILE NAME AND EXT IN DDB
\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
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
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
879 POPJ PDP, ;UFD NOT THERE
\r
881 ;SEARCH UFD FOR THE FILE
\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
892 ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK#
\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
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
904 JRST CPOPJ1 ;NO, ALL OK, RETURN TO CALL+4
\r
905 MOVE TAC,DEVOAD(DEVDAT) ;ARE WE RENAMING?
\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
916 EXTERNAL JOB,PRJPRG,CPOPJ1,DUMPPP
\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
922 HLLZ AC2,DEVEXT(DEVDAT)
\r
923 HLLZ AC1,1(TAC) ;EXTENSION FROM RIB
\r
925 POPJ PDP, ;EXTENSION NOT RIGHT
\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
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
938 PROT1: TLZ DAT,60000 ;DO NOT TEST OWNER READ OR PROTECT PROTECTION
\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
947 ;CLOSE AN OUTPUT FILE
\r
949 EXTERNAL PIOMOD,WAIT1,OUT
\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
955 SKIPN TAC ;ACCESS TABLE POINTER EXISTS?
\r
956 HALT . ;IF NOT, HALT, NO RE-START POSSIBLE.
\r
958 MOVE TAC,TBITS(TAC)
\r
960 TRNN TAC,ATCLO+RWTBIT ;CREATION OR UPDATE OF FILE IN PROGRESS?
\r
961 HALT . ;NO, ERROR. CAN'T CONTINUE
\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
975 HRRZ AC1,@TAC ;PICK UP OUTPUT BYTE POINTER
\r
976 SKIPE AC1 ;DON'T CALCULATE WORD COUNT IF BYTE POINTER
\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
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
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
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
1009 TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS?
\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
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
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
1032 DFC16A: PUSHJ PDP,CLRAT ;UPON RESET UUO WITH PARTIALLY WRITTEN FILE.
\r
1033 ; CLEAR ACCESS TABLE ENTRY RECLAIM DISK SPACE.
\r
1036 HRRZ TAC,DEVEXT(DEVDAT) ;RIB# OF FILE
\r
1039 DFCL20: PUSHJ PDP,INSDIR ;INSERT THE NAME
\r
1040 HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER
\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
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
1057 DFCLSI: TLZN DEVDAT,LOOKB
\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
1064 TRNE TAC1,ATCLO ;IS THIS FILE SIMPLY BEING CREATED (NOT UPDATED)?
\r
1065 HALT CPOPJ ;IF SO, SOMEBODY IS VERY CONFUSED.
\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
1072 TRNE TAC1,DTBIT ;TO BE DELETED?
\r
1074 PUSHJ PDP,CLRAT ;CLEAR THE ENTRY AND EXIT
\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
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
1104 JUMPE TAC,DRSRC6 ;0 SIGNALS END OF POINTERS
\r
1105 AOS DEVACC(DEVDAT) ;NEXT POINTER
\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
1111 MOVE TAC1,DSKBUF(DEVDAT) ;XWD-L,POINTER
\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
1119 CAMN AC3,(PDP) ;NAMES MATCH?
\r
1122 DRSRC4: ADDI TAC,1
\r
1124 CAIE AC3,BLKSIZ(TAC1) ;IS BLOCK ENTIRELY SEARCHED?
\r
1128 DRSRC7: TLNE IOS,NMP ;ANY MORE POINTERS ON DISK?
\r
1130 PUSHJ PDP,GETPTR ;YES, GET SOME
\r
1133 DRSRC8: HLLZ AC3,@TAC ;DOES EXTENSION MATCH
\r
1136 SUBI TAC,1 ;POINT TO FIRST WORD OF ENTRY
\r
1138 AOS -2(PDP) ;YES, ENTRY IS FOUND
\r
1139 MOVSS DEVCNT(DEVDAT) ;SAVE COUNT OF UFD BLOCKS FOR USE AT CLOSE
\r
1143 DRSRC6: POP PDP,DAT
\r
1145 POPJ PDP, ;"FILE" NOT FOUND
\r
1146 ;CHECK PROTECTION ON UFD
\r
1148 DSRC10: PUSH PDP,AC1 ;PUSH EXTENSION
\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
1157 TLO IOS,PRCHG ;FLAG PROTECTION CHANGE
\r
1158 PUSH PDP,DEVFIL(DEVDAT) ;PUSH FILENAME TO MAKE PDL LOOK LIKE DIRSRC
\r
1160 \f;FIND A UFD ENTRY, IT MUST BE THERE.
\r
1162 EXTERNAL AUREQ,AUWAIT
\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
1171 FINDE1: MOVSM TAC,DEVBLK(DEVDAT);READ A POINTER BLOCK
\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
1181 PUSHJ PDP,SET000 ;FIND THE ENTRY
\r
1182 HLLZ AC1,DEVEXT(DEVDAT) ;GET EXTENSION FROM DDB
\r
1184 SRCU1: MOVE TAC,@TAC1 ;GET FILE NAME FROM UFD
\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
1194 FINDE2: PUSHJ PDP,SET176 ;GET THE NEXT POINTER BLOCK
\r
1196 SUBI DAT,BLKSIZ-2 ;BACK UP DAT
\r
1198 \f;INSERT AN ENTRY IN A DIRECTORY.
\r
1200 EXTERNAL AUREQ,AUWAIT,AUAVAL
\r
1202 INSDIR: AOSE AUREQ
\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
1210 INSD1: AOS TAC,DEVACC(DEVDAT) ;GET NEXT POINTER,
\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
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
1221 PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127
\r
1222 SKIPE @TAC1 ;IS IT ZERO?
\r
1223 JRST INSD1 ;NO, BLOCK FULL.
\r
1225 MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE# OF BLOCK CONTAINING NEW ENTRY
\r
1226 PUSHJ PDP,INSD3 ;INSERT ENTRY.
\r
1228 JRST WUFD ;WRITE BLOCK AND LEAVE
\r
1229 \f;INSERT THE ENTRY.
\r
1231 INSD3: HRRZ AC1,DSKBUF(DEVDAT)
\r
1232 INSD3B: CAIN AC1,(TAC1) ;BEGINNING OF BLOCK?
\r
1235 SKIPN @TAC1 ;SEARCH UFD BLOCK BACKWARDS
\r
1236 ; FOR LAST NON-ZERO FILENAME.
\r
1240 ADDI TAC1,2 ;MOVE IN NAME.
\r
1241 INSD3A: MOVE TAC,DEVFIL(DEVDAT)
\r
1243 ADDI TAC1,1 ;MOVE IN EXTENSION & POINTER.
\r
1244 MOVE TAC,DEVEXT(DEVDAT)
\r
1246 TRNN TAC,-1 ;POINTER TO BLOCK 0
\r
1248 HALT .+1 ;FOR RETRIEVAL INFO
\r
1249 ; CONTINUE-GET BAD INFO MESSAGE
\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
1257 INSD5: PUSHJ PDP,SET000 ;@TAC1 POINTS TO WORD 0 OF BUFFER
\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
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
1272 MOVE TAC,DSKBUF(DEVDAT)
\r
1274 HRLM TAC1,SETCNT(DEVDAT)
\r
1275 MOVE TAC,SETCNT(DEVDAT)
\r
1278 INSD5A: PUSHJ PDP,MQOUT ;WRITE THE UFD BLOCK OUT
\r
1279 JRST INSD11 ;ERROR
\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
1286 PUSHJ PDP,RRIA ;NO, READ NEXT ONE.
\r
1289 INSD7: SUBI TAC1,1 ;YES, ROOM FOR ANOTHER POINTER?
\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
1301 MOVEM IOS,DEVIOS(DEVDAT)
\r
1303 \f;ROOM FOR ANOTHER POINTER IN THIS BLOCK. FIND LAST POINTER.
\r
1304 ;INSERT NEW ONE, AND WRITE BLOCK OUT.
\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
1310 ;GET MORE POINTERS INTO CORE.
\r
1312 INSD10: TLNE IOS,NMP ;ANY MORE ON DISC?
\r
1315 MOVE TAC,DEVACC(DEVDAT)
\r
1318 ;WRITE ERROR. IF WRITE-LOCK. FIX IT.
\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
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
1329 EXTERNAL AUREQ,AUAVAL
\r
1331 WUFD: IFG CHKCNT,<
\r
1332 MOVE TAC,DSKBUF(DEVDAT) ;POINTER TO BUFFER
\r
1333 PUSHJ PDP,CHKSUM ;RETURN CHECKSUM IN TAC1
\r
1335 MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION
\r
1337 HRLM TAC1,(TAC) ;STORE CHECKSUM IN RETRIEVAL POINTER
\r
1339 ORM TAC1,DEVOAD(DEVDAT) ;NOTE THAT POINTERS IUN DDB NOT=DISK
\r
1342 MOVE TAC1,DEVOAD(DEVDAT)
\r
1345 MOVEM TAC1,DEVOAD(DEVDAT)
\r
1347 HRRZ TAC,(TAC) ;GET BLOCK# FROM RETRIEVAL POINTER
\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
1358 TLZ IOS,AUFLG ;NOTE THAT UFD RELEASED
\r
1359 MOVEM IOS,DEVIOS(DEVDAT)
\r
1362 WUFD3: MOVE TAC1,DSKCNT(DEVDAT);WAS ERROR WRITE-LOCK?
\r
1365 TRZ IOS,IOIMPM ;YES
\r
1366 MOVEM IOS,DEVIOS(DEVDAT)
\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
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
1378 EXTERNAL CPOPJ1,CPOPJ
\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
1385 SCNAT1: CAME AC2,ATPP(TAC) ;PROJ,-PROG. THE SAME?
\r
1388 MOVE DAT,DEVFIL(DEVDAT) ;NAMES THE SAME?
\r
1389 CAME DAT,ATNAME(TAC)
\r
1392 HLLZ DAT,ATEXT(TAC) ;EXTENSION THE SAME?
\r
1393 HLLZ AC3,DEVEXT(DEVDAT)
\r
1397 ;CONTINUE SCAN FROM CURRENT ENTRY
\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
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
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
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
1418 CLRAT1: MOVE AC1,AC2 ;PICKUP THE NEXT ACCESS TABLE
\r
1419 HRRZ AC2,ATLINK(AC1)
\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
1426 CAME AC2,TAC ;DOES THIS ENTRY LINK TO THE ONE TO BE CLOBBERED?
\r
1427 JRST CLRAT1 ;NO,CONTINUE SERACH
\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
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
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
1455 EXTERNAL COMCHK,ADRERR,SAVDDL
\r
1457 DFDMPO: TLNN DEVDAT,ENTRB ;ENTER YET?
\r
1458 JRST DFERR2 ;NO, UNDEFINED FILE
\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
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
1469 HRR UUO,TAC ;YES, ANOTHER TABLE
\r
1472 DFDO0A: ADDI TAC,1 ;FORM XWD - LENGTH, FIRST-ADDRESS
\r
1473 PUSH PDP,TAC ;SAVE IT
\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
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
1485 DFDO1B: PUSHJ PDP,GETBIT ;ASK FOR C(ITEM BITS)
\r
1486 JRST DFDO6 ;NOT AVAILABLE
\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
1492 PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK.
\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
1502 HRLM TAC,DSKBUF(DEVDAT) ;ONLY A PARTIAL WRITE
\r
1503 HLRE TAC1,DSKBUF(DEVDAT)
\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
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
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
1534 DFDO2E: SETZM (TAC1) ;ZERO OUT THE REMAINDER OF THE MONTOR BUFFER
\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
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
1555 DFDO2B: POP PDP,ITEM ;RESTORE COUNT
\r
1557 ;TOSS OUT A SERIES OF CONSECUTIVE POINTERS
\r
1559 HRRZ AC2,DEVACC(DEVDAT) ;GET RETRIEVAL POINTER POINTER
\r
1561 DFDO3A: MOVE AC1,@AC2 ;IS POINTER ALREADY THERE?
\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
1573 ORM DAT,DEVOAD(DEVDAT) ;SHOW THAT POINTERS IN DDB NOT=DISK
\r
1575 IFG CHKCNT,< ;GET CHECKSUM
\r
1577 PUSHJ PDP,SAVDDL ;ADJUST ADR IN CASE OF HIGH SEG SAVE
\r
1582 CAILE AC2,PTRN(DEVDAT) ;MORE POINTERS?
\r
1583 JRST DFDO4 ;LAST POINTER IN CORE
\r
1585 DFDO3C: MOVE TAC1,[XWD BLKSIZ,BLKSIZ];INCREMENT IOWD
\r
1587 SOJG ITEM,DFDO3A ;ANY MORE?
\r
1589 HRRM AC2,DEVACC(DEVDAT)
\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
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
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
1610 ;ERROR WHILE WRITING, IF WRITE-LOCK, FIX IT,
\r
1612 DFDO7: HRRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK?
\r
1614 JRST DFDO2B ;NO, TOO BAD.
\r
1616 HLRZ TAC,DSKCNT(DEVDAT)
\r
1617 PUSHJ PDP,SETWL ;SET WRITE-LOCK BIT IN SAT ENTRY.
\r
1619 DFDO8: AOS TAC,-1(PDP)
\r
1624 JRST DFDO1 ;TRY AGAIN.
\r
1626 ;WE ARE WRITING IN MIDDLE OF FILE, FREE THE OLD BLOCK.
\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
1632 POP PDP,AC2 ;RESTORE POINTER INTO RETRIEVAL INFO
\r
1633 HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE THIS ITERATION
\r
1635 \f;DUMP MODE INPUT.
\r
1637 EXTERNAL COMCHK,ADRERR
\r
1639 DFDMPI: TLNN DEVDAT,LOOKB ;LOOKUP YET?
\r
1640 JRST DFERR2 ;NO, UNDEFINED FILE
\r
1641 TLNE IOS,IOEND ;END-FILE?
\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
1651 HRR UUO,TAC ;YES, ANOTHER LIST.
\r
1654 DFDI0A: ADDI TAC,1 ;FROM XWD -L,FIRST-ADDRESS
\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
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
1669 MOVE TAC,[XWD BLKSIZ,BLKSIZ] ;INCREMENT IOWD
\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
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
1680 JFCL ;ERRORS IGNORED.
\r
1682 REPEAT 0, < ;TEMPORARILY DELETE THIS CODE DUE TO SAVE-GET PROBLEM.
\r
1683 IFG CHKCNT,< ;COMPARE CHECKSUM
\r
1689 ORM AC1,DEVIOS(DEVDAT)
\r
1690 MOVE IOS,DEVIOS(DEVDAT)
\r
1694 SUB PDP,[XWD 3,3] ;REMOVE INTERMEDIATE STORAGE FROM PDL
\r
1695 AOJA UUO,DFDI0 ;GO BACK FOR MORE.
\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
1701 \f;DUMP INPUT CONTINUED,
\r
1702 ;FIND A SERIES OF CONSECUTIVE BLOCKS TO READ AT ONCE
\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
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
1713 DFDI3: ADDI TAC,BLKSIZ ;ANY MORE TO READ?
\r
1717 CAIG AC2,PTRN(DEVDAT)
\r
1718 SKIPN AC3,@AC2 ;END-FILE
\r
1720 CAIN TAC1,-1(AC3) ;STILL CONSECUTIVE?
\r
1721 AOJA TAC1,DFDI3 ;YES, LOOP
\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
1727 DFDI5: HLRE TAC,-3(PDP) ;GET LENGTH OF INPUT
\r
1729 DFDI6: HRRZ TAC1,DEVACC(DEVDAT)
\r
1732 ADDM TAC1,SETCNT(DEVDAT)
\r
1733 HRRM AC2,DEVACC(DEVDAT) ;STORE NEW POINTER POINTER
\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
1747 IFLE CHKCNT,< ;NO CHECKSUMMING
\r
1754 IFG CHKCNT,< ;CHECK CHECKSUMS
\r
1755 HLRE TAC1,AC2 ;CHANGE WORD COUNT TO BLOCKS
\r
1757 ADDI TAC1,BLKSIZ-1
\r
1761 DFDI7: MOVE TAC,-2(PDP)
\r
1767 MOVE AC3,[XWD BLKSIZ,BLKSIZ]
\r
1772 JRST DFDI1 ;SEE IF MORE INPUT REQUIRED
\r
1774 DFDI8: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT
\r
1775 ORB IOS,DEVIOS(DEVDAT)
\r
1778 DFDI9: TLNE IOS,NMP
\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
1786 DFDI10: MOVEI AC2,PTR1(DEVDAT) ;NO MORE POINTERS ON DISK
\r
1787 HRRM AC2,DEVACC(DEVDAT)
\r
1790 \fSUBTTL USETO/USETI
\r
1791 ;SETD AND SETI UUOS
\r
1795 DFSET: PUSHJ PDP,.+2
\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
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
1810 SUBI TAC1,PTRN(DEVDAT) ;YES, DESIRED POINTER IN CORE?
\r
1815 HRRZ TAC1,DEVCNT(DEVDAT)
\r
1816 ADDI TAC1,BLKSIZ-1
\r
1818 CAMGE TAC1,TAC ;ANY MORE POINTERS ON DISK?
\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
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
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
1835 HRRZ TAC,DEVBLK(DEVDAT) ;IN BLOCK WERE CURRENT ONE.
\r
1838 ADDM TAC,SETCNT(DEVDAT)
\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
1847 DFSETX: HRRZ TAC,DEVCNT(DEVDAT) ;C(UUO)RW > C(DEVCNT) RH?
\r
1848 ADDI TAC,BLKSIZ-1 ;CONVERT TO BLOCKS
\r
1851 JRST DFSET5 ;NO, ALL OK.
\r
1852 MOVSI IOS,IOEND ;YES, END-FILE.
\r
1853 IORB IOS,DEVIOS(DEVDAT)
\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
1858 ADDM TAC1,DEVACC(DEVDAT)
\r
1859 HRRM TAC,SETCNT(DEVDAT) ;RESET SETCNT
\r
1860 JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE
\r
1862 ;THE DESIRED POINTER IS BEFORE THE CURRENT ONE. SEE IF IT IS IN CORE.
\r
1864 DFSET6: SUBI TAC1,PTR1(DEVDAT)
\r
1867 JRST DFSET5 ;POINTER IS IN CORE
\r
1869 ;THE DESIRED BLOCK IS BEFORE THE CURRENT ONE. SEARCH FROM THE BEGINNING.
\r
1871 MOVE TAC,DEVOAD(DEVDAT) ;ARE POINTERS IN CORE SAME AS ON DISC?
\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
1879 DFSETC: HRRZ TAC,DSKBUF(DEVDAT) ;LSET TAC TO FIRST POINTER
\r
1880 PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK?
\r
1883 ADDI TAC,DIRSIZ ;YES, SKIP OVER 4 WORDS
\r
1884 HLRZ DAT,@TAC1 ;BLOCK FULL?
\r
1886 JUMPN DAT,DFSETD ;YES
\r
1887 SKIPN @TAC1 ;NO. MOVE TAC1 TO LAST POINTER
\r
1890 DFSETD: HRRZ AC1,SETCNT(DEVDAT)
\r
1891 SUBI AC1,(TAC) ;IS DESIRED POINTER HERE?
\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
1903 ;THE BLOCK CONTAINING THE POINTER IS FOUND.
\r
1904 DFSET7: HRRZ TAC,UUO ;RESET RIGHT HALF OF DEVBLK
\r
1906 HRRZ TAC1,DSKBUF(DEVDAT)
\r
1908 HRRM TAC,DEVBLK(DEVDAT)
\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
1914 ;RAN OUT OF POINTERS
\r
1916 DFSET8: ADDI TAC1,1
\r
1917 HRRZ TAC,DSKBUF(DEVDAT)
\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
1926 ;* INDICATES INTERRUPT LEVEL
\r
1931 DFIN: TLNN DEVDAT,LOOKB ;FILE OPEN?
\r
1932 JRST DFERR2 ;NO, UNDEFINED FILE
\r
1933 TLZ IOS,IO ;SET INPUT INDICATOR
\r
1935 DFIN1: TLNE IOS,LIR ;*ANY MORE INPUT?
\r
1936 POPJ PDP, ;*NO, LEAVE
\r
1938 HRRZ TAC1,DEVACC(DEVDAT) ;*
\r
1939 CAILE TAC1,PTRN(DEVDAT) ;*POINTER LIST EMPTY?
\r
1941 SKIPN @TAC1 ;*NO--END OF FILE?
\r
1944 CAIN TAC1,PTRN(DEVDAT) ;*NO--IS THIS THE LAST POINTER ?
\r
1947 DFIN1D: SKIPN 1(TAC1) ;*NO
\r
1948 TLO IOS,LIR ;*SET LAST INPUT FLAG
\r
1949 DFIN1A: MOVEM IOS,DEVIOS(DEVDAT) ;*
\r
1952 DFIN1E: TLO IOS,LIR ;*EMPTY FILE
\r
1953 MOVEM IOS,DEVIOS(DEVDAT) ;*
\r
1957 DFIN1B: TLNE IOS,NMP ;*ANY MORE POINTERS ON DISK?
\r
1958 TLO IOS,LIR ;*NO, THIS IS THE LAST READ
\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
1966 \f;NEED NEW POINTER FROM DISK
\r
1968 GETPTR: MOVE AC2,DEVOAD(DEVDAT) ;POINTERS DIFFER?
\r
1970 JRST DFO4A ;YES, WRITE THEN READ AND RETURN
\r
1971 PUSHJ PDP,RRI ;NO, READ BLOCK
\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
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
1987 MOVE TAC,@AC3 ;GET RETRIEVAL POINTER
\r
1988 MOVEM TAC,@AC2 ;STASH IN DDB
\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
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
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
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
2010 PUSHJ PDP,RRI ;READ THE RIB
\r
2013 DFIN8: MOVEM TAC,@AC2 ;0 WOTRD IS DOB MARKS END
\r
2014 DFIN8A: TLO IOS,NMP ;NO MORE POINTERS ON DISK
\r
2017 ;ENTER HERE AT INTERRUPT LEVEL TO READ ANOTHER BLOCK
\r
2019 DFINX: PUSHJ PDP,ADVBFF ;*ANY MORE EMPTY BUFFERS?
\r
2022 HRRZ TAC1,DEVACC(DEVDAT) ;*POINTER LIST EMPTY?
\r
2023 CAILE TAC1,PTRN(DEVDAT) ;*
\r
2026 JRST DFIN1 ;*NO,FILL NEXT ONE
\r
2029 EXTERNAL WSYNC,ADVBFE
\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
2036 DFOUT1: HRRZ DAT,DEVACC(DEVDAT) ;*GET POINTER LOC
\r
2039 HRRZ TAC,DEVOAD(DEVDAT) ;*
\r
2040 ADD TAC,[XWD NBLKSZ,2] ;*
\r
2041 PUSHJ PDP,CHKSUM ;*
\r
2043 MOVSI TAC1,PNTDIF ;*
\r
2044 ORM TAC1,DEVOAD(DEVDAT) ;*
\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
2057 PUSHJ PDP,DFGETF ;*GET A FREE BLOCK
\r
2064 ORM TAC1,DEVOAD(DEVDAT)
\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
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
2076 DFO4A: MOVE TAC,DEVBKO(DEVDAT) ;RESET DEVBLK TO REFER TO RETRIEVAL POINTERS
\r
2077 MOVEM TAC,DEVBLK(DEVDAT) ;NOW IN DDB
\r
2079 MOVE TAC,DEVOAD(DEVDAT) ;ANY POINTERS BEEN WRITTEN?
\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
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
2095 CAIE AC3,PTRN(DEVDAT) ;DONE?
\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
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
2119 DFOUT7: PUSHJ PDP,NEWRIB
\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
2134 DFOUT8: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER CONTAINING RIB
\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
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
2146 DFO8A: POP PDP,AC3
\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
2154 \f;ENTER HERE AT INTERRUPT LEVEL TO WRITE ANOTHER
\r
2158 DFOUTX: PUSHJ PDP,ADVBFE ;*ANY MORE TO DO?
\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
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
2172 PUSHJ PDP,DFOUT1 ;*
\r
2176 \fSUBTTL READ/WRITE RETRIEVAL POINTERS
\r
2177 ;INPUT RETRIEVAL BLOCK.
\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
2190 ;OUTPUT A RETRIEVAL BLOCK.
\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
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
2201 PUSHJ PDP,MQOUT ;WRITE IT,
\r
2203 POPJ PDP, ;NO, RETURN.
\r
2205 SET177: HRRZ TAC,DSKBUF(DEVDAT)
\r
2206 ADDI TAC1,BLKSIZ-1
\r
2207 S177A: TLNN IOS,UBFS
\r
2211 SET176: HRRZ TAC1,DSKBUF(DEVDAT)
\r
2212 ADDI TAC1,BLKSIZ-2
\r
2215 SET000: HRRZ TAC1,DSKBUF(DEVDAT)
\r
2218 ;PUT POINTER INFO IN DDB
\r
2219 ;ENTER WITH TAC CONTAINING THE BLOCK NUMBER OF THE POINTERS.
\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
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
2232 ;RECLAIM STORAGE ON DISK.
\r
2233 ;ENTER WITH TAC POINTING TO FIRST RETRIEVAL BLOCK OF THE FILE
\r
2237 RECLAM: PUSHJ PDP,SETBUF ;FIND SPACE IN USER AREA
\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
2246 PUSHJ PDP,SETFRE ;FREE UP SPECIFIED BLOCK
\r
2248 AOJA DAT,RECLM2 ;GO BACK FOR MORE
\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
2255 HLRZ TAC,DSKCNT(DEVDAT) ;FREE THAT BLOCK
\r
2258 PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD
\r
2260 ADDI TAC,BLKSIZ-2 ;SET TAC1 TO WORD 127
\r
2263 RECLM6: POP PDP,TAC
\r
2264 JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE
\r
2267 EXTERNAL DAREQ,DAAVAL
\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
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
2288 EXTERNAL DAWAIT,DAAVAL,DAREQ,JOBN
\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
2307 MOVEM IOS,DEVIOS(DEVDAT)
\r
2310 DFGTF2: MOVEI TAC,NUMBIT ;BITS/SAT BLOCK
\r
2311 HRRM TAC,@SATPTR ;MARK SAT ENTRY FULL
\r
2315 ;UPDA - TURN ON THE DISK ALLOCATION INTERLOCK (DAREQ)
\r
2316 ; - A CALL TO UPDA MUST PRECEDE SAT BLOCK MANIPULATIONS
\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
2321 MOVEM IOS,DEVIOS(DEVDAT) ;MAKE THIS JOB AS USING SAT BLOCK
\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
2327 EXTERNAL JBTSTS,HNGSTP
\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
2348 ;THERE ARE JOBN OR FEWER DISK BLOCKS AVAILABLE.
\r
2349 ;GIVE THEM OUT ONLY IN HARDSHIP CASES
\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
2362 SATGT2: MOVE TAC1,SATPIK ;POINT TO ENTRY OF NON-FULL SAT BLOCK
\r
2363 JRST SATRD ;READ IN SAT BLOCK
\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
2370 \f;SETFRE - RETURN A DISK BLOCK TO AVAILABLE STORAGE
\r
2371 ;CALL TAC:=LOGICAL BLOCK L
\r
2372 ; PUSHJ PDP,SETFRE
\r
2375 INTERNAL SETFRE,FTRCHK
\r
2377 SETFRE: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK
\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
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
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
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
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
2413 SATRD: MOVEM TAC1,SATTMP ;SAVE POINTER TO DESIRED SAT ENTRY.
\r
2414 MOVE TAC1,DSKBUF(DEVDAT) ;ALSO SAVE IOWD FROM THE DDB
\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
2420 PUSHJ PDP,SATBLK ;COMPUTE BLOCK#, IOWD
\r
2421 TLO IOS,NORELB ;NO RELOCATION
\r
2422 PUSHJ PDP,MQIN ;READ THE BLOCK
\r
2424 MOVE TAC1,SATTEM ;RESTORE SAVED IOWD TO DDB
\r
2425 MOVEM TAC1,DSKBUF(DEVDAT)
\r
2428 SATWRT: TLO IOS,NORELB ;NO RELOCATION
\r
2429 PUSHJ PDP,SATBLK ;COMPUTE BLOCK# IOWD
\r
2430 PUSHJ PDP,MQOUT ;WRITE BLOCK
\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
2438 ;SET UP TAC AND TAC1 FOR READ OR WRITE OF SAT BLOCK
\r
2440 SATBLK: MOVE TAC,SATPTR
\r
2445 MOVEM TAC1,DSKBUF(DEVDAT)
\r
2447 \fSUBTTL "FREE" CORE ALLOCATION
\r
2448 ;CLEAR OUT DDB AT RELEASE TIME
\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
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
2466 JRST CLCOR1 ;DELETE FREE STORAGE.
\r
2468 ;BUILD A DISK DEVICE DATA BLOCK AND ASSIGN IF LOGICAL NAME GIVEN.
\r
2469 ;THIS IS DONE AT INIT TIME.
\r
2473 SETDDB: PUSH PDP,ITEM ;SAVE AC'S USED BY SETDDB
\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
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
2492 SETDD1: POP PDP,TAC1
\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
2500 EXTERNAL PIOMOD,UADRCK,JOBFF
\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
2506 TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS ?
\r
2507 JRST SETBF6 ;YES TO EITHER QUESTION
\r
2509 TLNN DEVDAT,INBFB ;INBUF DONE YET?
\r
2511 SETBFI: HRRZ TAC1,DEVIAD(DEVDAT) ;CALL HERE FROM INPUT - RING KNOWN TO BE AVAILABLE
\r
2514 SETBF1: TLNN DEVDAT,OUTBFB ;OUTPUT DONE YET?
\r
2516 SETBFO: HRRZ TAC1,DEVOAD(DEVDAT) ;CALL HERE FROM OUTPUT - RING KNOWN TO BE AVAILABLE
\r
2518 SETBF2: MOVE TAC1,2(TAC1)
\r
2520 HRRZ AC1,TAC1 ;ADDRESS CHECK LOW END
\r
2522 MOVEI AC1,BLKSIZ-1(TAC1)
\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
2529 ;DUMP MODE, USE AREA IN FREE STORAGE.
\r
2531 SETBF6: AOSE MQREQ
\r
2533 TLO IOS,UBFU ;BUFFER IN MONITOR CORE
\r
2534 MOVEI TAC1, MONBUF ;TAC1 POINTS TO MONITOR BUFFER
\r
2536 \f;CLEAR THE BUFFER IN FREE STORAGE IF THERE.
\r
2538 EXTERNAL BUFCLR,JOBFF,IADRCK
\r
2540 TLZN IOS,DAFLG ;USING SAT BLOCK?
\r
2542 SOSL DAREQ ;YES. RELEASE
\r
2544 TLZN IOS,AUFLG ;USING UFD?
\r
2546 SOSL AUREQ ;YES. RELEASE UFD
\r
2548 TLZN IOS,UBFS ;USING MONITOR BUFFER?
\r
2550 SOSL MQREQ ;YES, RELEASE MONITOR BUFFER
\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
2558 ;CLEAR USER BUFFER AFTER USING
\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
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
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
2578 ;ENTER AT GETZR1 IF TAC1 IS ALL SET UP.
\r
2579 ;CALLED AT UUO AND INTERRUPT LEVELS
\r
2581 GETZER: MOVNI DAT,1
\r
2584 GETZ1: ROT TAC1,-1
\r
2587 GETZ2: AOBJP TAC,CPOPJ
\r
2591 GETZ3: TDNE TAC1,(TAC)
\r
2595 ;TIMING: M=NUMBER OF LEADING WORDS CONTAINING NO ZEROS
\r
2596 ; M=NUMBER OF LEADING ONES IN M+1ST WORD
\r
2598 ; 38+12,8M+17.1N MIRCO-SECS
\r
2600 ;WORST CASE WITH 128 WORDS = 2.3 MILS
\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
2608 RESIDU: TLNN TAC1,777000
\r
2612 RESID1: TLO TAC1,32000
\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
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
2625 PUSHJ PDP,GETBIT ;FIND A HOLE
\r
2626 JRST DFERR9 ;THERE ARE NONE
\r
2628 LSH TAC1,2 ;MULTIPLY BIT# BY 4
\r
2629 SUBI TAC1,4 ;SYNCHRNIZE
\r
2630 ADD TAC1,LOCORE ;FORM CORE ADDRESS
\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
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
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
2653 GTBIT1: AOS DAT ;INCREMENT SIZE OF HOLD BY 1 (GETZER LEFT DAT=-1)
\r
2654 SOJLE ITEM,GTBIT2 ;FOUND ENOUGH?
\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
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
2671 GTBIT2: MOVE TAC1,(PDP) ;HOLE FOUND, SET BITS TO ONES
\r
2675 GTBIT3: ORM TAC1,(TAC)
\r
2678 JUMPGE TAC1,GTBIT3
\r
2679 AOBJN TAC,GTBIT3 ;THIS SHOULD ALWAYS JUMP
\r
2681 GTBIT4: POP PDP,TAC1
\r
2690 GTBIT5: POP PDP,ITEM
\r
2691 POP PDP,DAT ;SIZE OF LARGEST HOLD FOUND IF UNSUCCESSFUL
\r
2694 GTBIT6: POP PDP,TAC
\r
2696 AOS -1(PDP) ;SIZE OF LARGEST HOLD MUST BE ADJUSTED
\r
2698 \f;FREE A FOUR WORD SECTION OF CORE.
\r
2699 ;ENTER WITH ADDRESS IN TAC
\r
2703 CLRCOR: MOVEI ITEM,1
\r
2704 CLCOR1: SUB TAC,LOCORE
\r
2707 MOVE AC2,CRINIT ;SEARCH FROM BEGINNING
\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
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
2720 CLRBIT: IDIVI TAC,^D36
\r
2721 HRLS TAC ;BOTH HALVES OF TAC CONTAIN
\r
2732 CLRB4: ANDCAM TAC1,(TAC) ;CLEAR A BIT
\r
2733 SOJLE ITEM,CLRB5 ;IS THAT ALL?
\r
2736 AOBJN TAC,CLRB4 ;THIS SHOULD ALWAYS JUMP
\r
2738 CLRB5: POP PDP,TAC1
\r
2740 CAMLE TAC,2(AC1) ;NEED TO RESET?
\r
2748 CLRB2: MOVEM TAC1,1(AC1)
\r
2749 CLRB3: MOVEM TAC,2(AC1)
\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
2756 EXTERNAL SETACT,CPOPJ
\r
2758 QIN: SKIPA TAC1,DEVDAT ;*
\r
2759 QOUT: MOVEI TAC1,DEVOAD-DEVIAD(DEVDAT) ;*
\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
2767 AOS USRCNT ;*INCREMENT COUNTER OF TRANSFER REQUESTS
\r
2770 EXCH DAT,DFBUSY ;*
\r
2771 JUMPN DAT,QIOEND ;*JUMP IF DISK BUSY
\r
2773 ANDCAM TAC,DEVIAD(TAC1) ;*
\r
2774 CAME TAC1,DEVDAT ;*
\r
2776 PUSHJ PDP,USRGO ;*
\r
2778 QIOEND: SCHEDULE ;*
\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
2786 INTERNAL MQIN,MQOUT
\r
2787 EXTERNAL MQREQ,MQWAIT,SETACT,MQUEUE,WSYNC
\r
2789 MQIN: HRLZ TAC1,DEVDAT
\r
2790 TLOA TAC1,400000 ;BIT 0=1 IS READ INDICATOR
\r
2791 MQOUT: HRLZ TAC1,DEVDAT
\r
2793 TRNN TAC,-1 ;WRITING OR READING BLOCK NR 0 SHOULD NEVER OCCUR HERE
\r
2795 HALT .+1 ;CONTINUING AFTER HALT WILL YIELD INFORMATION
\r
2796 ; LOSS ON THE DISK
\r
2799 MOVSM TAC,DSKCNT(DEVDAT);STASH AWAY BLOCK #, ERROR COUNT.
\r
2800 PUSHJ PDP,SETACT ;SET IOACT
\r
2802 TLNN IOS,UBFS+NORELB ;USING BUFFER IN FREE STORAGE?
\r
2803 HRR TAC1,PROG ;NO, RELOCATE
\r
2806 AOS AC1,MIPTR ;RING INDEX MIPTR
\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
2818 HRRZ AC1,DSKCNT(DEVDAT) ;ANY ERRORS?
\r
2819 TRNN AC1,IODERR!IODTER!IOIMPM
\r
2820 AOS (PDP) ;NO, SKIP RETURN
\r
2823 ;* EVERYTHING FROM HERE THRU SETDUN CALLED AT INTERRUPT LEVEL
\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
2830 INTERNAL DFINT,FTSWAP
\r
2831 EXTERNAL ADVBFE,ADVBFF,PJOBN,SETIOD,PIOMOD
\r
2832 EXTERNAL MQREQ,MQAVAL,DFRED,DFWRT
\r
2834 EXTERNAL MQTOP,MQUEUE
\r
2839 EXTERNAL SQREQ,SERA,SQGO,SWPINT
\r
2840 MOVE TAC,SERA ;*WAS THAT A SWAPPING JOB?
\r
2841 TLNE TAC,200000 ;*
\r
2844 SKIPN RUNUSR ;*WAS THAT A USER JOB?
\r
2845 JRST DFINT2 ;*NO, MUST HAVE BEEN MONITOR
\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
2856 PUSHJ PDP,SETDUN ;*TURN OFF I/O WAIT
\r
2858 MOVE PROG,JBTADR(TAC) ;*SET RELOC. AND PROT. FOR THIS JOB
\r
2860 SKIPL RUNUSR ;*WAS IT A READ OR A WRITE?
\r
2861 JRST DFINT1 ;*WRITE
\r
2863 MOVEI TAC,@DEVIAD(DEVDAT) ;*SET UP WORD COUNT
\r
2869 MOVE TAC,DEVOAD(DEVDAT)
\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
2880 MOVEM IOS,DEVIOS(DEVDAT)
\r
2883 PUSHJ PDP,DFINX ;ENTER INPUT ROUTINE
\r
2885 DFINT1: PUSHJ PDP,DFOUTX ;CHECK FOR MORE OUTPUT
\r
2889 DINT1A: HRRZ TAC,DEVACC(DEVDAT) ;WRITE-LOCK FOUND, SET WLBIT
\r
2891 JRST SETWL ;AND RETURN
\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
2897 SOS TAC,DSKCNT(DEVDAT) ;YES,TRIED ENOUGH?
\r
2899 JRST DINT4A ;NO, TRY AGAIN.
\r
2901 DFINT3: HRRM IOS,DSKCNT(DEVDAT) ;SAVE ANY ERRORS
\r
2902 HLRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK ERROR?
\r
2904 PUSHJ PDP,SETWL ;YES, SET WLBIT
\r
2906 SETZM @MOPTR ;REMOVE THIS MONITOR JOB
\r
2907 AOS TAC,MOPTR ;INCREMENT POINTER.
\r
2910 MOVEM TAC,MOPTR ;FALL THROUGH TO DFINT4
\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
2921 DINT4B: SKIPE @MOPTR ;MONITOR JOB WAITING?
\r
2922 JRST MONGO ;YES, START IT UP
\r
2924 SKIPL USRCNT ;USER WAITING?
\r
2926 SETZM DFBUSY ;NO. TURN OFF BUSY FLAG
\r
2927 POPJ PDP, ;EXIT INTERRUPT
\r
2929 ;FIND A WAITING USER
\r
2931 FINDV: HRRZ DEVDAT,DDBPTR
\r
2932 MOVSI TAC,W8BIT ;PREPARE TO TURN OFF WAIT INDICATOR
\r
2934 DFINT5: HLRZ TAC1,(DEVDAT) ;END OF DISK DDBS?
\r
2936 CAIE TAC1,(SIXBIT /DSK/)
\r
2937 MOVEI DEVDAT,DSKDDB ;YES, RESET TO TOP
\r
2939 SKIPGE DEVIAD(DEVDAT) ;ANY READS WAITING?
\r
2941 SKIPGE DEVOAD(DEVDAT) ;ANY WRITES WAITING?
\r
2943 HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, TRY NEXT DDB
\r
2946 ;START UP A USER WRITE
\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
2952 ;START UP A USER READ
\r
2954 DFINT7: ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAIT BIT IN DDB
\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
2966 SKIPL RUNUSR ;READ?
\r
2969 HRRI TAC1,@DEVIAD(DEVDAT) ;GET ADDRESS OF RING BUFFER
\r
2970 AOJA TAC1,DFRED ;FROM IOWD AND READ
\r
2972 USRGO3: HRRI TAC1,@DEVOAD(DEVDAT) ;GET ADDRESS OF OUTPUT BUFFER
\r
2973 AOJA TAC1,DFWRT ;FORM IOWD AND WRITE
\r
2975 ;START UP A MONITOR READ OR WRITE
\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
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
2989 ;ERROR ON USER JOB.
\r
2991 DFINT9: AOS ECOUNT ;COUNT USER HARDWARE ERRORS
\r
2992 SOS TAC,DSKCNT(DEVDAT) ;TRIED ENOUGH?>
\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
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
3003 ;CLEAR I/O DONE FLAG IF IT IS ON.
\r
3006 OR IOS,DEVIOS(DEVDAT) ;*
\r
3007 ANDCMI IOS,IOACT ;*
\r
3011 \fSUBTTL ERRORS, SUBROUTINES.
\r
3012 ;ERROR ROUTINES CALLED FROM UUO LEVEL
\r
3014 EXTERN EXCALP,ERRPTU,TPOPJ
\r
3016 DEFINE ERRORS (X),<
\r
3017 PUSHJ PDP,CLRBUF ;CLEAR ANY DUMP BUFFER
\r
3018 JSP TAC,ERRPTU ;OUTPUT A MESSAG
\r
3020 JRST EXCALP ;TYPE "UUO FROM" MESSAGE AND QUIT
\r
3023 DFERR1: ERRORS <DISK FULL-- YOUR JOB HAS LOST. >
\r
3025 DFERR2: MOVEI IOS,IOIMPM
\r
3026 ORB IOS,DEVIOS(DEVDAT)
\r
3029 DFERR3: ERRORS <INCORRECT RETRIEVAL INFORMATION>
\r
3031 ;THESE ERROR ROUTINES ARE GENERALLY CALLED AFTER SETLE HENCE 0(PDP) IS XWD PROJ,PROG
\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
3040 DFERR5: MOVEI TAC,PROTF ;PROTECTION FAILURE
\r
3043 DFERR4: MOVEI TAC,NOTINM ;USER NOT IN MFD
\r
3046 DFERR7: MOVEI TAC,NOTINU ;FILE NOT IN UFD
\r
3049 DFERR8: ERRORS <LOOKUP AND ENTER HAVE DIFFERENT NAMES>
\r
3052 ERRORS <NOT ENOUGH FREE CORE IN MONITOR>
\r
3054 DFER10: MOVEI TAC,RENFAL
\r
3057 DFER11: MOVEI TAC,NOFILE
\r
3060 DFER12: MOVEI TAC,0
\r
3061 PUSH PDP,TAC ;ADD SOMETHING TO BE REMOVED (SINCE SETLE NOT CALLED)
\r
3063 \fWERA: MOVSI IOS,NORELB
\r
3064 ANDCAB IOS,DEVIOS(DEVDAT)
\r
3065 ERRORS <NON-RECOVERABLE DISC WRITE ERROR>
\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
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
3084 ADDI TAC,(PROG) ;NO. RELOCATE,
\r
3085 HRL TAC,TAC1 ;RESET COUNT IN LH AFTER POSSIBLE OVERFLOW
\r
3087 ANDCAB IOS,DEVIOS(DEVDAT)
\r
3092 CHKSM3: AOJA TAC1,CHKSM2 ;BRING CARRY AROUND
\r
3094 ;CHECKSUM ERROR COUNTING ROUTINE
\r
3095 CKREC2: PUSH PDP,TAC
\r
3096 IORM AC3,DEVIOS(DEVDAT)
\r
3100 CKREC3: IORI IOS,IODTER
\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
3108 IFN <IFG CHKCNT, <CHKCNT+>>FTCHECK+FTMONP+FTSWAP, <
\r
3111 CHECK: MOVEI TAC,0 ;CLEAR SUM
\r
3112 JFCL 4,.+1 ;CLEAR CARRY0 FLAG
\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
3120 TLZE TAC1,1 ;CARRY INTO LH?
\r
3121 ADDI TAC1,1 ;YES BRING IT AROUND
\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
3130 ADD TAC,TAC1 ;*ADD IN THE ADDITIONAL WORDS IN THIS NEXT
\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
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
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
3149 TRON TAC,400000 ;*MORE THAN 2EXP17 BLOCKS (16,777,216 WORDS)
\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
3155 HRRM TAC,DEVCNT(DEVDAT) ;*STORE NEW MAXIMUM FILES SIZE ONLY IF PREVIOUS
\r
3156 ;* MAXIMUM EXEEDED.
\r
3158 \f;OUTPUT WRITE-LOCK ERROR. FREE THE BLOCK AND GET NEW ONE.
\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
3165 ;SET WRITE-LOCK INDICATION IN A SAT ENTRY.
\r
3166 ;ENTER WITH A BLOCK NUMBER IN TAC.
\r
3169 SETWL: MOVEI TAC1,SATENT ;*
\r
3171 SETWL1: ADDI TAC1,SENTSZ ;*
\r
3172 HLRZ ITEM,@TAC1 ;*IS THE BLOCK IN THIS SAT ENTRY?
\r
3174 CAIL TAC,NUMBLK(ITEM) ;*
\r
3175 JRST SETWL1 ;*NO, LOOP.
\r
3176 MOVEI ITEM,WLBIT ;*
\r