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 MDFBLK: 13000 ;THIS BLOCK CONTAINS RETRIEVAL INFO, OF MFD
\r
58 SATXWD: XWD -NUMSAT,13001 ;LH=NUMBER OF SAT BLOCKS.
\r
59 ;RH=FIRST SAT BLOCK NUMBER.
\r
62 CHKCNT=200 ;NUMBER OF WORDS TO CHECK-SUM
\r
63 W8BIT=400000 ;WAIT INDICATION FOR DDB
\r
67 NMP=100 ;NO MORE INPUT POINTERS (LH OF IOS)
\r
68 UBFS=200 ;USING BUFFER IN FREE STORAGE (LH OF IOS)
\r
69 NORELB=400 ;DO NOT RELOCATE BUFFER ON I/O (LH IOS)
\r
70 UBFU=1000 ;USING BUFFER IN USER AREA
\r
71 NCTRLC=2000 ;DISABLE ^C DURING CRUCIAL SEQUENCES OF NON-
\r
72 ; INTERRUPTABLE OPERATIONS
\r
75 DSKFGS=AUFLG+DAFLG+UBFS+NCTRLC ;USED TO SUPPRESS ACTION OF ^C, SEE STOPCK
\r
76 PRCHG=20000 ;PROTECTION CHANGED
\r
77 LIR=IOEND ;LAST INPUT REQUESTED
\r
79 ;MISCELLANEOUS CONSTANTS
\r
80 TRIES=3 ;NUMBER OF TIMES TO READ OR WRITE BAD BLOCK
\r
81 BLKSIZ=200 ;SIZE OF DATA BLOCK. DUMP MODE REQUIRES THIS
\r
82 NBLKSZ=-BLKSIZ ;TO BE A POWER OF 2.
\r
83 BLKP2=7 ;BLKSIZ = 2^BLKP2
\r
85 ;TEST BITS PUT IN LH OF DEVOAD
\r
87 PNTDIF=200000 ;POINTERS IN CORE DO NOT MATCH POINTERS ON DISC
\r
88 VRGPTR=100000 ;FLAG TO SIGNAL THAT POINTERS HAVE NEVER BEEN WRITTEN
\r
89 RENBIT=20000 ;"RENAMING" INDICATION FOR SETLE ROUTINE
\r
90 WPRO=40000 ;LOOKUP DONE, FILE IS IN WRITE PROTTECT
\r
91 CKSUPR=10000 ;FLAG SET IF READING DUMP FILES IN NON-DUMP MODE
\r
93 ;CONSTANTS USED IN CONNECTION WITH ACCESS TABLE ENTRIES
\r
95 ATPP=0 ;PROJECT,PROGRAMMER NUMBERS
\r
96 ATNAME=1 ;OWNER NAME
\r
98 TBITS=2 ;TEST BITS AND RCOUNT
\r
99 ATBLOK=3 ;BLOCK NUMBER OF RETRIEVL INFO OF UFD IN LH
\r
100 ATLINK=3 ;LINK TO NEXT ENTRY IN RH
\r
102 WTBIT=400000 ;FILE IS BEING CREATED
\r
103 DTBIT=200000 ;DELETE WHEN THRU READING
\r
104 RTBIT=100000 ;FILE HAS BEEN RENAMED
\r
105 ATBITS=500000 ;WTBIT+RTBIT
\r
106 ATIND=40000 ;NAME IS ALREADY IN DIRECTORY
\r
107 ATCLO=20000 ;OUTPUT CLOSE TO BE DONE
\r
108 RWTBIT=10000 ;FILE BEING READ AND WRITTEN, BUT NOT CREATED,
\r
109 RCOUNT=7777 ;MASK FOR THE COUNT OF READERS
\r
111 ;CONSTANTS USED IN CONNECTION WITH SAT BLOCKS
\r
113 XP NUMBIT,^D36*BLKSIZ ;NUMBER OF BITS IN ONE BLOCK
\r
117 XP NUMSAT,4 ;ONLY FOUR SAT BLOCK ON PDP-10 DISK,
\r
120 XP NUMSAT,16 ;NUMBER OF SAT BLOCKS FOR 5.76 MILLION
\r
121 ;WORD DATA PRODUCTS MODEL 270 DISK,
\r
123 XP WLBIT,400000 ;IF BIT IS ON IN FIRST SATENT ENTRY
\r
124 ;WORD, THE DISK IS WRITE-LOCKED.
\r
128 DEFINE NOSCHEDULE <
\r
137 INTERNAL FTCHECK,FTMONP
\r
138 IFN FTCHECK+FTMONP,<
\r
139 EXTERNAL DDBPTR,DSKCOR,PTRN,MOPTR,MIPTR,RUNUSR,SAVPRG,USRCNT
\r
140 EXTERNAL SATPTR,SAT,SATBK2,DIRSIZ
\r
141 EXTERNAL DSKDDB,DEVACC,DEVCNT,DEVBLK,DEVBKO,DSKBUF
\r
142 EXTERNAL DSKCNT,SETCNT,PTR1,FPNTR,FPNTR1,FAT,DFBUSY,LOCORE,GTCOR3
\r
143 EXTERNAL GTCOR2,CORBIT,CKSMCT,DSKSIZ,DSKACC,DSKAPP,CORBSZ,MONBUF
\r
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
157 RUNUSR: BLOCK 1 ;LH=DEVDAT OF USER JOB RUNNING
\r
159 USRCNT: BLOCK 1 ;COUNT OF WAITING USER JOBS
\r
160 DFBUSY: 0 ;-1 IF DISK CONTROL IN USE, 0 IF FREE
\r
161 FAT: 0 ;POINTER TO FIRST ACCESS TABLE ENTRY
\r
162 DKSMOT: 0 ;COUNT OF VARIOUS CHECKSUM ERRORS
\r
163 REFLAG: 0 ;CONTAINS A PPN TO ALLOW LOGIN AFTER REFRESH
\r
164 UXFERS: 0 ;TOTAL USER TRANSFER ATTEMPTED
\r
165 ECOUNT: 0 ;TOTAL HARDWARE ERRORS ON USER TRANSFERS
\r
166 ;DISK STORAGE ALLOCATION CONTROL
\r
168 SATPTR: BLOCK 1 ;POINTER TO CURRENT SATENT ENTRY
\r
169 SATPIK: BLOCK 1 ;POINTER TO NON-FULL SAT ENTRY
\r
170 SATCHG: BLOCK 1 ;0 IF SAT BLOCK IN CORE=BLOCK ON DISK, -1 OTHERWISE
\r
171 SATTEM: BLOCK 1 ;TEMPORARY SAVE LOCATIONS USED DURING SAT READ
\r
172 SATTMP: BLOCK 1 ; ROUTINE TO AVOID PUSH-DOWN LIST OVERFLOW.
\r
175 EXTERNAL MFDBLK,SATXWD,NUMBLK,SATENT,SENTSZ,SATTOP
\r
181 XP NUMBLK,^D4000 ;NUMBER OF DATA BLOCKS PER SAT BLOCK ON THE
\r
182 ; PDP-10 MODEL RC-10 DISK FILE.
\r
185 XP NUMBLK,5400 ;NUMBER OF DATA BLOCKS REPRESENTED BY
\r
186 ;ONE SAT BLOCK ON THE DATA PRODUCTS 270 DISK.
\r
188 XP SENTSZ,3 ;SIZE OF EACH SATENT ENTRY
\r
190 DSKXDB=0 ;ON PDP-10 DISK FILE STORAGE BEGINS IN LOGICAL
\r
194 DSKXDB=5400 ;FILE STORAGE BEGINS ON SECOND DISK OF OLD (MOD 270)
\r
195 ; DISK FILE SINCE FIRST DISK IS ALLOCATED
\r
199 SATENT: REPEAT NUMSAT,<
\r
200 XWD DSKXDB,0 ;RH CONTAINS WLBIT AND COUNT OF BLOCK USED
\r
201 BLOCK 1 ;BIT MASK, SINGLE ROTATING BIT
\r
202 BLOCK 1 ;XWD LENGTH OF SAT TABLE POINTER WORD
\r
204 DSKXDB=DSKXDB+NUMBLK>
\r
206 XP SATTOP,SATENT*SENTSZ*NUMSAT-SENTSZ
\r
207 >;END OF FTRA100 CONDITIONAL
\r
209 SAT: BLOCK 200 ;CURRENT SAT BLOCK
\r
211 XP SAATM2,SAT-2 ;LOWEST ABS, ADR-1 ALLOWED IN CHANNEL COMMAND
\r
212 ; LIST - USED TO KEEP FROM WIPING OUT MONITOR.
\r
213 SATBK2: XWD -200,SAT
\r
215 XP DIRSIZ,4 ;NO. OF WORDS OF RET. INFO WHICH ARE
\r
218 ;THE DUMMY DEVICE DATA BLOCK
\r
220 DSKSIZ=4*DSKCOR ;NUMBER OF WORDS ALLOCATED FOR DDB
\r
221 ;MUST BE A MULTIPLE OF FOR (SEE GETCOR)
\r
224 DSKDDB: SIXBIT /DSK/
\r
228 XWD DVOUT+DVIN+DVDIR+DVDSK+DVLNG,154403
\r
233 XP DEVFIL,.-DSKDDB ;FILE NAME
\r
234 Z ;SIXBIT/FILE? - FILE NAME
\r
235 XP DEVEXT,.-DSKDDB ;FILE EXTENSION
\r
236 Z ;XWD SIXBIT/EXT/,BLOCK# OF THE RIB
\r
237 XP DEVPPN,.-DSKDDB ;PROJ,PROGRAMMER FOR CURRENT
\r
238 ; (OR MOST RECENT) LOOKUP,ENTER,RENAME
\r
240 XP DEVACC,.-DSKDDB ;C(LH)=LOCATION OF CCESS TABLE ENTRY
\r
241 Z ;C(LH)=ADDRESS OF ACCESS TABLE ENTRY
\r
242 ;C(RH)=ADDRESS OF CURRENT POINTER IN DDB
\r
243 XP DEVCNT,.-DSKDDB ;C(LH)USED DURING LOOKUP,ENTER
\r
244 Z ;C(LH)==RELATIVE BLOCK# WITHIN UFD OPTIMIZE UFD SEARCHES)
\r
245 ;C(RH)=COUNT OF BLOCKS IN FILE
\r
246 XP DEVBLK,.-DSKDDB ;C(LH)=BLOCK NUMBER OF CURRENT POINTER
\r
247 Z ;C(LH)=LOGICAL BLOCK# OF RIB
\r
248 ;C(RH)=RELATIVE LOC. OF RIB
\r
249 ;POINTER IN THAT BLOCK
\r
250 XP DEVBKO,.-DSKDDB ;LIKE DEVBLK, BUT FOR BEGINNING
\r
251 Z ;SIMILAR TO DEVBLK - SAY WHERE CURRENT
\r
252 ; POINTER COME FROM
\r
253 XP DSKBUF,.-DSKDDB ;C(LH)=-SIZE OF MONITOR READ/WRITE
\r
254 Z ;C(LH)=-SZIE OF READ/WRITE
\r
255 ;C(RH)=BUFFER IN USER AREA
\r
256 XP DSKCNT,.-DSKDDB ;C(LH)=BLOCK NUMBER TO READ/WRITE
\r
257 Z ;C(LH)=LOGICAL BLOCK@ FOR READ OR WRITE
\r
258 ;C(RH)=ERROR COUNT OR ERROR BITS
\r
259 XP SETCNT,.-DSKDDB ;LH CONTAINS POINTER TO R.I. OF
\r
260 ;C(LH)=BLOCK# OF UFD RIB
\r
261 Z ;UFD, RH IS SETO, SETI COUNTER.
\r
262 XP PTR1,.-DSKDDB ;RETRIEVAL INFO STARTS HERE
\r
263 ; DEFINE THE AREA CONTAINING RETRIEVAL; POINTERS
\r
264 XP FPNTR,PTR1+DIRSIZ ;LOC. OF FIRST POINTER TO RET. INFO.
\r
268 ;DEFINE 3 WORD ENTRY CONTROLLING BIT SEARCH IN DDBTAB
\r
270 INTERNAL LOCORE,CRINIT
\r
273 LOCORE: EXP 0 ;ADDRESS OF FIRST 4 WORD BLOCK IN FREE CORE AREA
\r
275 CORBIT: 0 ;FLOATING 1 BIT USED IN SEARCHES
\r
276 CORIWD: XWD 0,0 ;AOBJN POINTER TO FIRST WORD IN DDBTAB CONTAINING A 0
\r
277 CRINIT: XWD 0,DDBTAB ;INITIAL AOBJN POINTER FOR CORIWD
\r
279 MONBUF: BLOCK 200 ;MONITOR BUFFER, USED TO READ RETRIEVAL POINTERS, ETC.
\r
281 ;ERROR CODES FOR LOOKUP, RENAME AND/OR ENTER
\r
283 NOTINU=0 ;NO SUCH FILE
\r
284 NOTINM=1 ;NO SUCH USER
\r
285 PHOTF=2 ;PROTECTION FAILURE
\r
286 NORITE=3 ;MORE THAN 1 WRITE TO A FILE
\r
287 RENFAL=4 ;TRIED TO RENAME FILE TO EXISTING NAME OR ENTER
\r
288 ; A NULL FILE NAMES
\r
289 NOFILE=5 ;TRIED TO RENAME WITH NO FILE SELECTED
\r
290 ERRBIT=1 ;BITS GO IN WORD 1 OF THE ENTRY
\r
292 ;DISK DISPATCH TABLE
\r
296 JRST DSKINI ;INITILIZE
\r
297 JRST CPOPJ1 ;DSK HUNG TIMEOUT, NO ERROR MESSAGE
\r
298 DSKDSP: JRST DFREL ;RELEASE
\r
299 JRST DFCLSO ;CLOSE OUTPUT
\r
303 JRST DFLOOK ;LOOKUP
\r
304 JRST DFDMPO ;DUMP OUTPUT
\r
305 JRST DFDMPI ;DUMP INPUT
\r
310 JRST DFCLSI ;CLOSE INPUT
\r
314 ;ACCINI - CALLED AT 140 START, 143 RESTART
\r
315 ; RESTORE DEVICE DATA BLOCK CHAIN
\r
316 ; INITIALIZE DDBTAB BIT SEARCHING ENTRY
\r
320 ACCINI: MOVSI TAC,(SIXBIT /DSK/)
\r
321 MOVEI DEVDAT,DSKDDB ;POINT TO PROTOTYPE DDB
\r
322 ACCIN1: HLRZ DEVDAT,DEVSER(DEVDAT)
\r
323 JUMPE DEVDAT,ACCIN2
\r
324 CAMN TAC,DEVNAM(DEVDAT)
\r
326 ACCIN2: MOVEI TAC,DSKDDB
\r
327 HRLM DEVDAT,DEVSER(TAC) ;LINK PROTOTYPE TO FIRST NON DSK DDB
\r
329 MOVEM TAC,CORBIT ;INITIALIZE FLOATING 1 BIT
\r
331 MOVEM TAC,CORIWD ;RESET AOBJN WORD
\r
335 ;DSKINI - CALLED AT START, RESTART, 143 RESTART
\r
336 ; REMOVE ACCESS ENTRIES, REMOVE DDB'S NOT ASSIGNED BY CONSOLE. CLEAR THE MONITOR QUEUE
\r
337 INTERNAL DSKINI, SETSAT
\r
338 EXTERNAL DISKUP,DFWUNS
\r
340 DSKINI: IFN FTSWAP, <
\r
341 SETZM SQREQ ;NO SWAPPING REQUEST
\r
346 HLLZS DSKCON ;CLEAR INTERRUPT FLAGS FOR CONSO
\r
348 SETZM DFBUSY ;DISK CONTROL AVAILABLE
\r
349 SETZM RUNUSR ;NO USER I/O IN PROGRESSS
\r
350 SETOM USRCNT ;NO USER TRANSFERS WAITING
\r
351 SETZB DDBPTR ;NO NEXT DDB
\r
352 ; CLEAR IOS (SUPERSTITIOUS, BUT POSSIBLY NECESSARY)
\r
353 MOVEI DEVDAT,DSKDDB ;PREPARE TO RELEASE DISK DDB'S
\r
354 DSKIN0: HLRZ DEVDAT,DEVSER(DEVDAT) ;GET DDB LINK
\r
355 JUMPE DEVDAT,DSKIN1 ;JUMP IF END REACHED
\r
356 MOVSI TAC, (SIXBIT /DSK/) ;DEVICE NAME
\r
357 CAME TAC,DEVNAM(DEVDAT) ;IS THIS A DISK DDB?
\r
358 JRST DSKIN1 ;NO. DONE
\r
359 HLRZ TAC, DEVACC(DEVDAT) ; GET POINTER TO ACCESS ENTRY
\r
360 SKIPE TAC ;ACCESS ENTRY EXIST?
\r
361 PUSHJ PDP,CLRAT ;YES. REMOVE IT
\r
362 MOVSI TAC,W8BIT ;PREPARE TO CLEAR "TRANSFER WAITING" BIT
\r
363 ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAITING
\r
364 ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAITING
\r
365 MOVE TAC,DEVMOD(DEVDAT)
\r
366 TRNN TAC,ASSCON ;DDB ASSIGNED BY ASSIGN COMMAND?
\r
367 PUSHJ PDP,CLRDDB ;NO. REMOVE DDB
\r
368 JRST DSKIN0 ;CONTINUE
\r
370 DSKIN1: SETZM FAT ;NO ACCESS ENTRIES
\r
371 MOVEI TAC,MQUEUE+1 ;DESTINATION FOR BLT
\r
373 MOVEM TAC,MOPTR ;RESET IN AND OUT POINTERS
\r
375 SETZM MQUEUE ;SOURCE FOR BLT
\r
376 BLT TAC,MQTOP-1 ;CELAR THE MONITOR QUEUE
\r
377 PUSHJ PDP,DISKUP ;DETERMINE IF DISK IS FUNCTIONING
\r
378 SETSAT: AOSE STARTS ;SKIP FIRST TIEM ONLY
\r
379 JRST SAT01 ;WRITE SAT BLOCK IN CORE
\r
380 JRST DFWUNS ;SCAN ALL SAT BLOCKS
\r
381 STARTS: -1 ;COUNT STARTS, RESTARTS
\r
383 ;WRITE OUT SAT BLOCK, ENTER AT DSKSTP WITH FIXED START 147,
\r
384 ;AT SAT01 UPON RE-ENTRY OF INITIALIZATION.
\r
386 INTERN DSKSTP,SAT05,JSAT06
\r
388 EXTERNAL DSKBIT,WSYNC,STOIOS,DCBBIT
\r
390 DSKSTP: HRRZI TAC,DSKBIT
\r
391 IORI TAC,DCBBIT ;DCBBIT NON-ZERO ONLY FOR DATA-PRODUCTS N$1K
\r
392 IORI TAC,2200 ;CLEAR PI SYSTEM
\r
394 SKIPL STARTS ;HAS A SAT BLOCK BEEN READ IN?
\r
395 PUSHJ PDP,SAT01 ;YES, WRITE IT OUT
\r
397 POPJ PDP, ;YOU ARE SAFELY DONE.
\r
399 SAT01: MOVEI DEVDAT,DSKDDB
\r
400 SETZB IOS,DEVIOS(DEVDAT)
\r
402 PUSH PDP,WSYNC ;CHANGE WSYNC ROUTINE
\r
405 SAT05: MOVEI ITEM,TRIES ;SET UP COUNT FOR ERRORS
\r
406 SAT02: PUSHJ PDP,SATBLK ;SET UP TAC,TAC1
\r
407 PUSHJ PDP,MQOUT ;WRITE IT.
\r
409 SETZM SATCHG ;SHOW SAT BLOCK IN CORE = BLOCK ON DISK.
\r
411 POP PDP,WSYNC ;NO ERRORS, SO RETURN.
\r
412 SETZM DEVIOS(DEVDAT)
\r
415 SAT04: SOJG ITEM,SAT02 ;ERRORS, SO TRY AGAIN
\r
416 POP PDP,WSYNC ;RESTORE WSYNC ROUTINE
\r
419 SAT06: MOVEI TAC,IOACT ;THIS IS SUBSTITUE FOR WSYNC
\r
420 TDNE TAC,DEVIOS(DEVDAT)
\r
426 SUBTTL ENTER, LOOKUP, RENAME, CLOSE
\r
429 EXTERNAL TIME,PRJPRG,CPOPJ, THSDAT
\r
431 DFENTR: SKIPN @UUO ;ZERO FILE NAME ?
\r
433 PUSHJ PDP,ALTMFD ;ENTER TO MFD?
\r
434 TLNE DEVDAT,LOOKB ;NO, HAS LOOKUP BEEN DONE?
\r
437 PUSHJ PDP,SETLE ;RETURNS WITH PP ON PDL
\r
438 JRST DFERR4 ;NO UFD, CLOCK ON
\r
439 JRST DFENT2 ;NO FILE, CLOCK ON.
\r
440 JRST DFERR6 ;FILE BEING WRITTEN
\r
441 JRST DFENT7 ;FILE BEING READ,CHECK FOR WRITERS
\r
444 HRRZ TAC,DEVEXT(DEVDAT) ;BLOCK# OF FIRST RIB
\r
445 PUSHJ PDP,SETPTR ;READ FIRST RETRIEVAL POINTERS TO DDB
\r
446 MOVSI DAT,100000 ;WRITE PROTECTION BIT
\r
447 PUSHJ PDP,PROTEK ;WRITE PROTECTED?
\r
448 JRST DFERR3 ;NAME WRONG
\r
449 JRST DFERR5 ;PROTECTION FAILURE.
\r
450 MOVEI TAC1,WTBIT+ATIND+ATCLO ;BITS FOR ACCESS ENTRY-FILE EXISTS
\r
451 TLZA IOS,PRCHG ;PREPARE FOR PROTECTION CHECK
\r
452 DFENT2: MOVEI TAC1,WTBIT+ATCLO ;BITS FOR ACCESS ENTRRY - FILE CREATION
\r
453 HLLZS DEVEXT(DEVDAT) ;SET TO 0 RIB BLOCK#
\r
455 PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING
\r
456 JRST DFENT3 ;NOT THERE
\r
458 DFEN2A: MOVE DAT,TBITS(TAC) ;WRITE BIT ON?
\r
460 JRST DFERR6 ;YES,ERROR
\r
465 DFENT3: TLZE IOS,PRCHG ;PROTECTION FAILURE?
\r
466 JRST DFERR5 ;YES. GIVE ERROR RETURN.
\r
468 PUSH PDP,TAC1 ;SAVE ACCESS BITS
\r
469 PUSHJ PDP,DFGETF ;GET A BLOCK FOR RETRIEVAL POINTERS. # IN TAC
\r
470 POP PDP,TAC1 ;RESTORE ACCESS BITS
\r
471 HRLZM TAC,DEVBLK(DEVDAT) ;SET CURRENT RIB# AND INDEX IN DDB
\r
472 HRLZM TAC,DEVBKO(DEVDAT)
\r
473 HRRM TAC,DEVEXT(DEVDAT) ;STORE FIRST RIB#
\r
476 MOVE DAT,TAC1 ;ACCESS ENTRY BITS
\r
477 PUSHJ PDP,SETAT ;CREATE ACCESS ENTRY. RETURN POINTER IN TAC1
\r
478 HRLM TAC1,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY
\r
479 MOVEI DAT,PTR1(DEVDAT) ;SET UP RETRIEVAL INFO
\r
480 MOVE TAC,DAT ;DESTINATION (DDB)
\r
481 HRLI TAC,@UUO ;SOURCE (UUO PARAMETER BLOCK)
\r
482 BLT TAC,2(DAT) ;NAME & EXTENSION
\r
485 ORI TAC1,400000 ;MAKE SURE ACCESS DATE NON-ZERO,
\r
486 HRRM TAC1,1(DAT) ;STORE THSDAT AS ACCESS DATE
\r
488 TLZ TAC1,777740 ;IS THERE A DATE ALREADY?
\r
489 JUMPN TAC1,DFENT4 ;YES IF JUMP.
\r
490 MOVE TAC,TIME ;NO, GET TIME.
\r
492 HRRZ TAC1,THSDAT ;AND DATE.
\r
493 DPB TAC,[POINT 11,TAC1,23]
\r
494 DFENT4: TLO TAC1,55000 ;PROTECTION
\r
495 DPB IOS,[POINT 4,TAC1,12] ;MODE
\r
496 MOVEM TAC1,2(DAT) ;STORE PROTECTION MODE TIME DATE IN DDB
\r
498 MOVE TAC,PRJPRG(ITEM)
\r
499 MOVEM TAC,3(DAT) ;STORE PROGRAMMER# IN DDB
\r
500 SETZM 4(DAT) ;CLEAR FIRST POINTER
\r
501 MOVSI IOS,NMP ;SET "NO MORE POINTERS"
\r
502 ORB IOS,DEVIOS(DEVDAT)
\r
504 HLLZS DEVCNT(DEVDAT) ;CLEAR FILE SIZE
\r
505 MOVSI TAC,VRGPTR ;SET "VIRGIN POINTER" FLAG (O DFO4A SUBROUTINE
\r
506 IORM TAC,DEVOAD(DEVDAT) ;WILL CREATE A NEW RIB WHEN JUST CALLED
\r
509 ;AN ENTER AFTER A LOOKUP, SET "RWTBIT" FLAG IN ACCESS ENTRY
\r
511 DFENT5: MOVE TAC,DEVOAD(DEVDAT) ;CHECK PROTECTION
\r
513 PUSHJ PDP,DFERR5 ;FAILURE, THIS WILL NOT RETURN HERE
\r
514 HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY
\r
516 MOVE TAC1,TBITS(TAC) ;GET ACCESS BITS
\r
517 TROE TAC1,RWTBIT ;FILE BEING READN AND WRITTEN ALREADY?
\r
518 PUSHJ PDP,DFERR6 ;YES, THIS WILL NOT RETURN HERE
\r
519 MOVEM TAC1,TBITS(TAC) ;NO, SET IT
\r
523 MOVE TAC,@UUO ;SAVE FILE?
\r
524 CAME TAC,DEVFIL(DEVDAT)
\r
525 JRST DFERR8 ;NO, NAME WRONG
\r
527 HLLZ TAC,@UUO ;PICKUP EXTENSION FROM USER ENTER BLOCK
\r
528 XOR TAC,DEVEXT(DEVDAT) ;COMPARE WITH LOOKUP EXTENSIONS(AND PICKUP
\r
529 ; RETRIEVAL INFORMATION
\r
530 TLNE TAC,-1 ;EXTENSION THE SAME?
\r
531 JRST DFERR8 ;NO, EXTENSION WRONG
\r
532 SOS UUO ;YES, RETRIEVE LATEST RETRIEVAL INFORMATION AND
\r
533 PUSHJ PDP,SETPTR ;STORE CURRENT SIZE IN THE 4TH WORD OF THE 4-WORD
\r
534 PUSHJ PDP,DFLUK4 ;ENTER BLOCK (IN CASE SOME OTHER USER HAS APPENDED
\r
535 ; DATA TO THIS FILE BETWEEN THE TIME THIS USER DID
\r
536 ; HIS LOOK-UP AND THIS ENTER.) NOTE: THIS LAST
\r
537 ; PUSHJ WILL EXIT TO UUOCON--NOT RETURN HERE!
\r
539 ;FILE IS BEING READ
\r
541 DFENT7: PUSHJ PDP,SCNAT2 ;FIND ANOTHER
\r
542 JRST DFENT1 ;NO WRITERS, PERMIT THIS ENTER
\r
543 JRST DFERR6 ;MUST BE BEING WRITTEN OR RENAMED
\r
547 EXTERNAL UDLKC,TPOPJ
\r
549 DFLOOK: SKIPN @UUO ;ZERO FILE NAME ?
\r
550 JRST DFER12 ;IF SO, ERROR.
\r
551 MOVEI TAC,CLSIN ;SUPPRESS INPUT CLOSE IF UDLKC IS CALLED
\r
552 TLNE DEVDAT,ENTRB ;ENTER DONE YET?
\r
553 PUSHJ PDP,UDLKC ;CLOSE OUTPUT
\r
554 TLZ IOS,IO ;INPUT STATE
\r
555 PUSHJ PDP,SETLE ;RETURNS WITH PP ON PDL
\r
556 JRST DFERR4 ;NO UFD, CLOCK ON
\r
557 JRST DFERR7 ;NO FILE, CLOCK ON.
\r
558 JRST DFLUK8 ;FILE BEING WRITTEN
\r
559 JRST DFLUK3 ;FILE BEING READ
\r
561 DFLUK2: MOVEI DAT,0
\r
562 PUSHJ PDP,SETAT ;BUILD AN ACCESS ENTRY
\r
563 MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY
\r
565 DFLUK3: AOS TBITS(TAC) ;INCREMENT RCOUNT
\r
566 HRLM TAC,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY
\r
568 MOVE TAC,DEVEXT(DEVDAT) ;FIRST RIB#
\r
569 PUSHJ PDP,SETPTR ;GET IN THE RETRIEVAL INFO
\r
571 TLZE IOS,PRCHG ;PROTECTION CHANGE FAILURE?
\r
572 JRST DFLUK7 ;YES. ERROR RETURN
\r
573 MOVSI DAT,200000 ;READ PROTECTION BIT
\r
574 PUSH J PDP,PROTEK ;READ PROTECTED?
\r
575 JRST DFERR3 ;NAME WRONG
\r
576 JRST DFLUK7 ;PROTECTION FAILURE
\r
578 MOVE TAC1,DEVOAD(DEVDAT) ;CHECK WRITE PROTECTION FOR
\r
579 MOVSI DAT,100000 ;POSSIBLE SUBSEQUENT ENTER
\r
581 TLOA TAC1,WPRO ;WRITE PROTECTED. SET FLAG
\r
582 TLZ TAC1,WPRO ;WRITE OK--RESET FLAG
\r
583 IORM TAC1,DEVOAD(DEVDAT)
\r
585 DFLUK4: MOVSI TAC,PTR1(DEVDAT) ;COPY INFO TO LOOKUP PARAMETER BLOCK
\r
587 HRRI TAC,@UUO ;DESTINATION IS UUO PARAMETER BLOCK
\r
589 BLT TAC,2(TAC1) ;BLT NAME. EXT. PROTECTION, ETC FROM DDB TO USER
\r
591 HLRE TAC,FPNTR1(DEVDAT) ;FILE LENGTH (USUALLY -WORDS)
\r
593 HRLZM TAC,@UUO ;SET UP 4TH WORD OF DIRECTORY HDR.
\r
594 SUBI UUO,3 ;RESET UUO
\r
595 MOVMS TAC ;SET FILE SIZE (WORDS) IN DDB
\r
596 HRRM TAC,DEVCNT(DEVDAT)
\r
598 MOVSI TAC,VRGPTR ;POINTERS DO EXIST ON THE DISK SO
\r
599 ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR THE VIRGIN POINTERS FLAG.
\r
601 ALLOK: MOVEI DAT,FPNTR(DEVDAT) ;SKIP FILE INFO IN FIRST RIB
\r
602 HRRM DAT,DEVACC(DEVDAT) ;SET VERTICAL POINTER POINTER
\r
604 HRRM TAC,SETCNT(DEVDAT) ;"POISITONED" AT RELATIVE BLOCK 1 OF FILE
\r
605 MOVSI TAC,777760-WPRO-VRGPTR ;CLEAR FLAGS
\r
606 ANDCAM TAC,DEVOAD(DEVDAT)
\r
609 ;TO GET AROUND CHECKSUM FAILURE WHILE READING DUMP FILES IN NON-DUMP MODE
\r
611 LDB TAC1,[POINT 4,-2(DAT),12]
\r
612 CAIGE TAC1,15 ;IS FILE IN DUMP MODE?
\r
614 LDB TAC1,[POINT 4,DEVIOS(DEVDAT),35]
\r
616 CAIGE TAC1,15 ;IS CURRENT MODE DUMP?
\r
617 IORM TAC,DEVOAD(DEVDAT) ;NO. SUPPRESS CHECKSUM
\r
619 ALLXIT: POP PDP,TAC ;REMEMBER 0(PDP) WASS XWD PROJ,PROG
\r
621 AOS (PDP) ;RETURN TO CALL+2
\r
622 JRST CLRBUF ;RELEASE MONITOR BUFFER
\r
624 DFLUK7: PUSHJ PDP,DFCL21 ;PROTECTION FAILURE,CLEAR ACCESS
\r
627 ;FILE IS BEING WRITTEN
\r
629 DFLUK8: PUSHJ PDP,SCNAT2 ;LOOK FOR ANOTHER
\r
630 JRST DFLUK2 ;NO MORE
\r
631 JRST DFLUK3 ;FOUND WHAT MUST BE READ
\r
633 ;TEST FOR MFD ALTERAION
\r
635 EXTERNAL SYSPP,JOB,PRJPRG
\r
637 ALTMFD: MOVEI TAC,3(UUO) ;IS PROJ, PROG. = 1,1?
\r
638 TLO TAC,PROG ;RELOCATE
\r
639 MOVE TAC,@TAC ;XWD PROJ,PROG
\r
641 POPJ PDP, ;NO,RETURN
\r
644 XOR TAC,PRJPRG(ITEM)
\r
645 TLNN TAC,-1 ;PRIVILEGED USER?
\r
646 POPJ PDP, ;YES, RETURN
\r
654 DFREN: PUSHJ PDP,DFRENX
\r
658 DFRENX: SKIPN DEVFIL(DEVDAT) ;IS THERE AN OLD FILE?
\r
659 JRST DFER11 ;NO, UNDEFINED FILE
\r
660 TLO IOS,IO ;YES, LOOK FOR THE FILE
\r
661 MOVSI TAC,RENBIT ;RESET BIT
\r
662 ANDCAM TAC,DEVOAD(DEVDAT)
\r
663 ADDI UUO,3 ;POINT TO XWD PROJ,PROG
\r
664 PUSHJ PDP,SETLE9 ;RETURNS WITH PP ON PDL
\r
665 JRST DFERR4 ;NO UFD, CLOCK ON
\r
666 JRST DFERR7 ;NO SUCH FILE, CLOCK ON.
\r
667 JRST DFERR6 ;FILE BEING WRITTEN
\r
668 JRST DFREN1 ;ALREADY HAS ACCESS ENTRY
\r
670 MOVEI DAT,0 ;BUILD ACCESS ENTRY
\r
672 MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY
\r
674 DFREN1: AOS TBITS(TAC) ;INCREMENT RCOUNT
\r
675 HRLM TAC,DEVACC(DEVDAT) ;SAVE POINTER TO ACCESS ENTRY
\r
677 HRRZ TAC,DEVEXT(DEVDAT) ;CAN THIS FILE BE RENAMED?
\r
678 PUSHJ PDP,SETPTR ;READ IN FIRST SET OF RETRIEVAL POINTERS
\r
679 MOVEI AC1,@UUO ;IS THE PROTECTION TO BE CHANGED ?
\r
680 MOVEI TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO IN DDB
\r
681 MOVE AC1,2(AC1) ;USER SPECIFIED PROTECTION
\r
682 XOR AC1,2(TAC) ;COMPARE WITH STORED PROTECTION
\r
684 TLNN AC1,777000 ;ANY DIFFERENCES?
\r
686 MOVSI DAT,400000 ;YES, CAN IT BE?
\r
688 JRST DFREN8 ;NO, ERROR
\r
690 DFRN2A: MOVSI DAT,100000 ;CAN THIS BE RE-WRITTEN?
\r
692 JRST DFERR3 ;BAD RETREIVAL INFO
\r
693 JRST DFRN8A ;WRITE PROTECTED
\r
694 TLZ IOS,PRCHG ;ARBITRARY CHANGE OK.
\r
697 PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING
\r
700 DFRN1A: MOVE DAT,TBITS(TAC) ;YES, BEING ALTERED?
\r
701 TRNE DAT,ATBITS ;FILE BEING CREATED OR RENAMED?
\r
702 JRST DFREN9 ;YES, YOU LOSE.
\r
703 PUSHJ PDP,SCNAT2 ;NO, CONTINUE SCANNING
\r
705 JRST DFRN1A ;FOUND ANOTHER
\r
707 DFRN1B: HLRZ TAC,DEVACC(DEVDAT) ;SET RENAME FLAG IN FIRST ENCOUNTERED ACCESS ENTRY
\r
708 MOVEI AC1,RTBIT ;RENAME BIT
\r
712 MOVE TAC,@UUO ;GET NEW FILENAME
\r
713 CAME TAC,DEVFIL(DEVDAT) ;SAVE AS DDB?
\r
715 ADDI UUO,1 ;YES, SAME EXTENSION?
\r
716 MOVE TAC,@UUO ;NEW EXTENSION
\r
717 XOR TAC,DEVEXT(DEVDAT) ;COMPARE WITH DDB?
\r
719 SOJA UUO,DFREN3 ;NO
\r
721 ;FILENAME AND EXTENSION ARE IDENTICAL. CHANGE ONLY PROTECTION
\r
723 TLZ IOS,PRCHG ;CLEAR PRTOECTION CHANGE FLAG
\r
724 ADDI UUO,1 ;YES, CHANGE PROTECTION
\r
725 LDB AC1,[POINT 9,@UUO,8] ;NEW PROTECTION
\r
726 HRRZ TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER,CONTAINING RETRIEVAL INFO
\r
727 ADDI TAC1,2 ;POINT TO PROTECTION
\r
728 TLNN IOS,UBFS ;BUFFER IN MONITOR CORE?
\r
729 TLO TAC1,PROG ;NO, RELOCATION.
\r
730 DPB AC1,[POINT 9,@TAC1,8] ;STORE NEW PROTECTION IN RIB
\r
732 PUSHJ PDP,WRI ;RE-WRITE THE BLOCK
\r
734 DFREXT: AOS -1(PDP) ;LEAVE
\r
736 PUSHJ PDP,CLRBUF ;CLEAR NAY DUMP BUFFER
\r
737 JRST DFCL21 ;CLEAR ACCESS ENRTY AND EXIT
\r
739 DFREN3: TLZE IOS,PRCHG ;IS ONLY PROTECTION CHANGE PERMITTED?
\r
740 JRST DFREN8 ;YES. ERROR SINCE TRYING TO CHANGE NAME.EXT
\r
741 POP PDP,TAC ;BACK UP PDP
\r
742 PUSHJ PDP,ALTMFD ;ALTERING MFD?
\r
743 SKIPN @UUO ;RENAMING TO 0 (I.E. DELETING)?
\r
746 MOVE TAC,DEVACC(DEVDAT) ;SAVE INFO ON OLD FILE THAT WILL BE CHANGED BY SETLE
\r
747 HLR TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB
\r
748 PUSH PDP,TAC ;SAVE XWD ACCESS POINTER, BLOCK#
\r
749 MOVE TA,DEVEXT(DEVDAT) ;BLOCK# OF FIRST FILE RIB
\r
750 HLL TA,DEVCNT(DEVDAT) ;RELATIVE TO UFD BLOCK#
\r
751 MOVE TB,DEVFIL(DEVDAT) ;HOLD FILE NAME
\r
754 ORM TAC,DEVOAD(DEVDAT) ;FOR "SETLE"
\r
755 PUSHJ PDP,SETLE0 ;LOOK FOR THIS NEW FILE NAME
\r
756 JRST DFERR4 ;NO UFD (SHOULD NOT HAPPEN)
\r
757 JRST DFREN5 ;NEW FILE NOT THERE
\r
758 JFCL ;NEW NAME ALREADY THERE, ERROR
\r
765 ;ALTER RETRIEVAL INFORMATION
\r
767 DFREN5: POP PDP,DAT ;BACK UP PDP
\r
769 MOVEM TB,DEVFIL(DEVDAT) ;RESTORE OLD FILE NAME TO DDB
\r
770 HRRM TA,DEVEXT(DEVDAT) ;RESTORE BLOCK# OF RIB
\r
771 HLLM TA,DEVCNT(DEVDAT) ;RESTORE UFD RELATIVE BLOCK
\r
773 MOVE TAC,(PDP) ;XWD ACCESS POINTER, BLOCK#
\r
774 HLLM TAC,DEVACC(DEVDAT) ;RESTORE POINTER TO ACCESS ENTRY
\r
775 HRLM TAC,SETCNT(DEVDAT) ;RESTORE BLOCK# OF UFD RIB
\r
777 MOVSM TAC,DEVBLK(DEVDAT) ;RESET BLOCK#, INDEX TO RETRIEVAL POINTERS
\r
778 PUSHJ PDP,RRIA ;GET RETRIEVAL INFO BLOCK
\r
779 PUSHJ PDP,SET000 ;POINT TAC1 TO WORD 0
\r
781 MOVE TAC,@UUO ;GET NEW NAME
\r
782 MOVEM TAC,@TAC1 ;STORE IN RIB
\r
783 ADDI TAC1,1 ;CHANGE EXTENSION
\r
785 MOVE TAC,@TAC1 ;GET OLD EXTENSION
\r
786 HLLM TAC,DEVEXT(DEVDAT) ;RESET EXTENSION IN DDB
\r
787 MOVE TAC,@UUO ;NEW EXTENSION
\r
788 HRR TAC,THSDAT ;AND ACCESS DATE
\r
789 ORI TAC,400000 ;INSURE IT IS NON-ZERO
\r
790 MOVEM TAC,@TAC1 ;STORE IN RIB
\r
791 ADDI TAC1,1 ;CHANGE PROTECTION
\r
793 LDB TAC,[POINT 9,@UUO,8] ;GET NEW PROTECTION
\r
794 DPB TAC,[POINT 9,@TAC1,8] ;STORE IN RIB
\r
796 PUSHJ PDP,WRI ;RE-WRITE RIB
\r
800 PUSHJ PDP,FINDE ;BRING IN CORRECT BLOCK
\r
802 SUBI UUO,1 ;REPLACE EXTENSION IN UFD
\r
805 SUBI UUO,1 ;AND NAME
\r
810 PUSHJ PDP,WUFD ;RE-WRITE THE BLOCK
\r
813 ;FILE COULD NOT BE RENAMED BECAUSE OF PROTECTION
\r
815 DFRN8A: TLNE IOS,PRCHG ;PROTECTION CHANGE?
\r
818 DFREN8: PUSHJ PDP,DFCL21 ;TAKE OUT ACCESS ENTRY
\r
819 JRST DFERR5 ;AND LEAVE
\r
821 ;FILE COULD NOT BE RENAMED BECAUSE IT WAS BEING CREATED.
\r
824 PUSHJ PDP,DFCL21 ;TEAKE OUT ACCESS ENTRY
\r
827 ;DELETE A FILE FROM A UFD
\r
829 DFREN7: PUSHJ PDP,FINDE ;FIND THE CORRECT BLOCK
\r
833 SUBI TAC1,1 ;DESTINATION
\r
834 HRLI TAC1,2(TAC1) ;SOURCE IS ENTRY BEYOND DESTINATION
\r
836 HRRZ AC2,DSKBUF(DEVDAT)
\r
837 ADDI AC2,BLKSIZ-2 ;SET LIMIT OF BLT
\r
838 TLNN IOS,UBFS ;BUFFER IN MONITOR ONE?
\r
839 ADDI AC2,(PROG) ;NO. RELOCATE
\r
841 BLT TAC1,(AC2) ;MOVE SOME WORDS UP (ONE TOO MANY BECAUSE
\r
842 ; COULD BE DELETING 64TH ENTRY IN UFD BLOCK)
\r
844 SETZM @AC2 ;MAKE SURE OF ZERO
\r
848 PUSHJ PDP,WUFD ;RE-WRITE
\r
849 AOS (PDP) ;SKIP RETURN
\r
850 HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY
\r
852 IORM TAC1,TBITS(TAC) ;SET TO DELETE WHEN THROUGH READIN
\r
853 JRST DFCL21 ;CLOSE ACCESS ENTRY AND LEAVE
\r
855 ;SET UP ARGUMENT LIST FOR LOOKUP, ENTER, AND RENAME
\r
856 ;SEARCH THRU MFD AND UFD FOR THE FILE-NAME,
\r
857 ;EXIT TO CALL+1 IF A UFD CANNOT BE FOUND.
\r
858 ;EXIT TO CALL+2 IF THE FILE IS NOT FOUND.
\r
859 ;EXIT TO CALL+3 IF FILE IS BEING WRITTEN
\r
860 ;EXIT TO CALL+4 IF FILE IS BEING READ
\r
861 ;EXIT TO CALL+5 IF THE FILE DOES NOT HAVE ACCESS ENTRY.
\r
863 ;UPON EXIT, (PDP) = OWNER PROJ,-PROG. NUMBER
\r
865 EXTERNAL SYSPP,JOB,PRJPRG,CPOPJ2,CPOPJ1
\r
867 SETLE: MOVSI TAC,RENBIT ;TURN OFF THE FLAG
\r
868 ANDCAM TAC,DEVOAD(DEVDAT)
\r
870 SETLE0: MOVEM IOS,DEVIOS(DEVDAT)
\r
872 MOVE AC1,@UUO ;PICK UP FILE NAME
\r
873 MOVEM AC1,DEVFIL(DEVDAT) ;STORE FILE NAME AND EXT IN DDB
\r
877 MOVEM AC1,DEVEXT(DEVDAT)
\r
878 ADDI UUO,2 ;UUO POINTS TO PP
\r
879 SETLE9: MOVE ITEM,JOB ;TRY CURRENT JOB PP.
\r
880 SKIPG DAT,@UUO ;IS IT A PP?
\r
881 MOVE DAT,PRJPRG(ITEM) ;NO. GET PP FROM TABLE.
\r
882 TLNE DEVDAT,SYSDEV ;SYSTEM DEVICE?
\r
883 MOVE DAT,SYSPP ;YES, USE SYSTEM (CUSP) PROJ,PROG #
\r
885 MOVEM DAT,DEVPPN(DEVDAT) ;SAVE PRJ,PRG FOR USE BY UUOCON
\r
886 SUBI UUO,3 ;UUO POINTS TO FILE NAME
\r
887 EXCH DAT,(PDP) ;PUT PP-NUMBER IN PD LIST
\r
888 PUSH PDP,DAT ;PDP POINTS TO CALL+1
\r
890 ;SEARCH MFD FOR THE OWNER OF THE FILE
\r
892 MOVE DAT,-1(PDP) ;XWD PROJ,PROG
\r
893 MOVSI AC1,(SIXBIT /UFD/) ;EXTENSION "UFD"
\r
894 MOVE TAC,MFDBLK ;BLOCK# OF MFD RIB
\r
896 POPJ PDP, ;UFD NOT THERE
\r
898 ;SEARCH UFD FOR THE FILE
\r
900 AOS (PDP) ;PDP POITNS TO CALL+2
\r
901 ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK#
\r
902 HRRZ TAC,@TAC ;BLOCK# OF UFD RIB
\r
903 HRLM TAC,SETCNT(DEVDAT) ;SAVE BLOCK#
\r
904 SETZM DEVCNT(DEVDAT) ;LH WILL BE USED TO COUNT UFD BLOCKS
\r
905 MOVE AC1,DEVEXT(DEVDAT)
\r
906 PUSHJ PDP,DSRC10 ;SEARCH UFD
\r
907 POPJ PDP, ;FILE NOT THERE
\r
909 ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK#
\r
911 HRRM AC3,DEVEXT(DEVDAT) ;SAVE BLOCK# OF FIRST RIB
\r
912 AOS (PDP) ;PDP POINTS TO CALL+3
\r
913 MOVE AC2,-1(PDP) ;XWD PROJ,PROG
\r
915 PUSHJ PDP,SCNAT0 ;LOOK IN ACCESS TABLE
\r
916 JRST CPOPJ2 ;NOT THERE. RETURN TO CALL+5
\r
917 MOVE DAT,TBITS(TAC) ;RENAMING?
\r
918 TRNE DAT,WTBIT ;BEING WRITTEN?
\r
919 POPJ PDP, ;YES. RETURN TO CALL+3
\r
921 JRST CPOPJ1 ;NO, ALL OK, RETURN TO CALL+4
\r
922 MOVE TAC,DEVOAD(DEVDAT) ;ARE WE RENAMING?
\r
928 ;CHECK RETRIEVAL INFO FOR ELIGIBILITY
\r
929 ;ENTER WITH C(DAT) = PROTECTION TO CHECK IN BITS 0-2
\r
930 ;EXIT TO CALL+1 IF NAME OR EXTENSION WRONG
\r
931 ;EXIT TO CALL+2 IF PROTECTION WRONG
\r
932 ;EXIT TO CALL+3 IF ALL OK
\r
934 EXTERNAL JOB,PRJPRG,CPOPJ1,DUMPPP
\r
936 PROTEK: MOVEI TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO
\r
937 MOVE AC1,@TAC ;NAME OK?
\r
938 CAME AC1,DEVFIL(DEVDAT)
\r
940 HLLZ AC2,DEVEXT(DEVDAT)
\r
941 HLLZ AC1,1(TAC) ;EXTENSION FROM RIB
\r
943 POPJ PDP, ;EXTENSION NOT RIGHT
\r
946 PROTKX: MOVE AC1,-1(PDP)
\r
948 PROTKY: MOVE ITEM,JOB
\r
949 XOR AC1,PRJPRG(ITEM)
\r
950 TRNN AC1,-1 ;SAVEM PROGRAMMER?
\r
953 ROT DAT,-3 ;ROTATE TO PROJECT FIELD
\r
954 TLNE AC1,-1 ;NO, SAME PROJECT?
\r
955 ROT DAT,-3 ;NO, ROTATE TO UNIVERAL FIELD
\r
957 PROT1: TLZ DAT,60000 ;DO NOT TEST OWNER READ OR PROTECT PROTECTION
\r
959 JRST CPOPJ1 ;PROTECTION O.K.
\r
960 MOVE AC1,PRJPRG(ITEM)
\r
961 CAMN AC1,DUMPPP ;EQUAL TO DUMPPER PROJECT
\r
962 ;PROGRAMMER NUMBER?
\r
963 AOS(PDP) ;YES, ALL FILES AVAILABLE
\r
967 ;CLOSE AN OUTPUT FILE
\r
969 EXTERNAL PIOMOD,WAIT1,OUT
\r
971 DFCLSO: TLNN DEVDAT,ENTRB ;ENTER DONE YET?
\r
972 POPJ PDP, ;NO, FORGET IT
\r
973 HLRZ TAC,DEVACC(DEVDAT) ;SHOULD WE CLOSE? (POINT TO ACCESS ENTRY)
\r
975 SKIPN TAC ;ACCESS TABLE POINTER EXISTS?
\r
976 HALT . ;IF NOT, HALT, NO RE-START POSSIBLE.
\r
978 MOVE TAC,TBITS(TAC)
\r
980 TRNN TAC,ATCLO+RWTBIT ;CREATION OR UPDATE OF FILE IN PROGRESS?
\r
981 HALT . ;NO, ERROR. CAN'T CONTINUE
\r
984 CAIGE TAC,DR ;DUMP MODE?
\r
985 TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS?
\r
986 JRST DFCL2 ;YES TO EITHER QUESTION
\r
987 HLRZ TAC,DEVBUF(DEVDAT) ;NO. GET ADDRESS OF OUTPUT
\r
988 ; BUFFER HEADER BLOCK.
\r
989 TLO TAC,PROG ;RELOCATE
\r
990 SKIPG TAC1,@TAC ;VIRGIN BUFFERS (NO RING SET-UP) ?
\r
991 JRST DFCL2 ;YES, DON'T OUTPUT
\r
992 AOS TAC ;TAC POINTS TO OUTPUT BYTE POINTER
\r
993 ADD TAC1,[XWD PROG,1] ;TAC1 POINTS TO WORD COUNT PRECEDING
\r
995 HRRZ AC1,@TAC ;PICK UP OUTPUT BYTE POINTER
\r
996 SKIPE AC1 ;DON'T CALCULATE WORD COUNT IF BYTE POINTER
\r
998 SUBI AC1,(TAC1) ;CALCULATE NUMBER OF WORDS USER HAS FILLED
\r
999 TRNE IOS,IOWC ;USER KEEPING HIS OWN WORD COUNT ?
\r
1000 HRRZ AC1,@TAC1 ;YES, SUBSTITUTE HIS COUNT FOR
\r
1001 ; COMPUTED WORD COUNT
\r
1002 SKIPN AC1 ;WORD COUNT EQUAL TO 0?
\r
1003 JRST DFCL2 ;YES, DON'T OUTPUT 0-WORD FINAL BLOCK.
\r
1004 PUSHJ PDP,OUT ;NO, GO WRITE LAST PARTIAL BUFFER
\r
1005 PUSHJ PDP,WAIT1 ;WAIT FOR IT TO FINISH
\r
1007 DFCL2: PUSHJ PDP,SETBUF ;CHOOSE A BUFFER AREA FOR RETRIEVAL POINTERS
\r
1008 TLO IOS,NMP!NCTRLC ;SET NMP, MUST NOT INTERRUPT POINTER WRITING
\r
1009 MOVEM IOS,DEVIOS(DEVDAT) ;DO DFO4A WON'T READ NEW POINTERS IN
\r
1010 PUSHJ PDP,DFO4A ;WRITE OUT LAST BLOCK OF POINTERS
\r
1011 HLRZ AC1,DEVBLK(DEVDAT)
\r
1012 XOR AC1,DEVEXT(DEVDAT)
\r
1013 TRNE AC1,-1 ;ONLY ONE BLOCK OF POINTERS?
\r
1014 PUSHJ PDP,RRIB ;NO. READ FIRST BLOCK INTO BUFFER
\r
1016 ADDI TAC1,3 ;SET TAC1 TO POINT TO 4TH WORD OF BUFFER
\r
1017 MOVN AC1,DEVCNT(DEVDAT) ;PICK UP AND NEGATE SIZE OF FILE
\r
1018 HRLM AC1,@TAC1 ;NEGATIVE WORD COUNT INTO FOURTH WORD OF FIRST RIB
\r
1019 PUSHJ PDP,WRIB ;WRITE OUT FIRST BLOCK OF RETRIEVAL INFORMATION
\r
1021 ;CLOSE UUO CONTINUED.
\r
1022 ;THE FILE AND ALL ITS POINTERS HAVE BEEN PUT ON DISK.
\r
1023 ;NOW PUT ENTRY IN DIRECTORY.
\r
1025 HLRZ TAC,DEVACC(DEVDAT) ;PICK UP ACCESS TABLE POINTER
\r
1026 MOVE DAT,TBITS(TAC) ;GET STATUS BITS AND READ COUNT
\r
1027 TRZE DAT,RWTBIT ;CLOSING AND UPDATED FILE?
\r
1029 TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS?
\r
1031 TRNN DAT,ATIND ;IUS NAME ALREADY IN DIRECTORY?
\r
1032 JRST DFCL20 ;NO. INSERT IT
\r
1033 MOVEM IOS,DEVIOS(DEVDAT)
\r
1034 PUSHJ PDP,FINDE ;BRING IN BLOCK WITH THIS ENTRY.
\r
1035 MOVE TAC,DEVEXT(DEVDAT) ;CHANGE BLOCK POINTER
\r
1036 EXCH TAC,@TAC1 ;TAC1 POINTS TO ENTRY IN UFD BLOCK
\r
1037 MOVEM TAC,DEVEXT(DEVDAT);SAVE POINTER TO RIB OF OLD VERSION FOR RECLAM
\r
1038 PUSHJ PDP,WUFD ;WRITE THE BLOCK BACK OUT
\r
1039 HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER
\r
1041 PUSH PDP,ATPP(TAC) ;SAVE XWD PROJ,PROG
\r
1042 PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY
\r
1043 POP PDP,AC2 ;XWD PROJ,PROG
\r
1044 PUSHJ PDP,SCNAT0 ;SCAN FOR ANY OTHERS READING OLD VERSION
\r
1047 DFCL16: MOVEI AC1,DTBIT ;DELETE WHEN THRU READING SINCE IT WAS JUST UPDATED
\r
1048 IORM AC1,TBITS(TAC)
\r
1049 PUSHJ PDP,SCNAT2 ;LOOK FOR MORE
\r
1050 JRST CLRBUF ;NO MORE
\r
1052 DFC16A: PUSHJ PDP,CLRAT ;UPON RESET UUO WITH PARTIALLY WRITTEN FILE.
\r
1053 ; CLEAR ACCESS TABLE ENTRY RECLAIM DISK SPACE.
\r
1056 HRRZ TAC,DEVEXT(DEVDAT) ;RIB# OF FILE
\r
1059 DFCL20: PUSHJ PDP,INSDIR ;INSERT THE NAME
\r
1060 HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER
\r
1062 PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY
\r
1063 JRST CLRBUF ;CLEAR ANY BUFFER IN FREE STORAGE
\r
1064 DFCLU1: MOVEM DAT,TBITS(TAC) ;STORE STATUS BITS (WITH UPDATE MARKER CLEARED)
\r
1065 TLN DEVDAT,LOOKB ;WAS IUNPUT SIDE OF FILE ALSO CLOSED?
\r
1066 POPJ PDP, ;NO, LET THE USER KEEP READING IT
\r
1067 TRNE DAT, RCOUNT ;YES, ANYBODY ELSE STILL READING IT?
\r
1069 TRNE DAT,DTBIT ;NO, WAS IT MARKED FOR DELETION?
\r
1070 JRST DFC16A ;YES, GO DELETE IT AND RECLAIM DISK SPACE
\r
1071 PUSHJ PDP,CLRAT ;NO, CLEAR ACCESS TABLE ENTRY
\r
1072 DFCLU2: HRRZS DEVACC(DEVDAT) ;CLEAR POINTER TO ACCESS TABLE
\r
1073 JRST CLRBUF ;CLEAR ANY BUFFER AREA AND EXIT.,
\r
1076 ;CLOSE UUO CONTINUED.
\r
1077 ;CLOSE AN INPUT FILE.
\r
1079 DFCLSI: TLZN DEVDAT,LOOKB
\r
1081 DFCL21: HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY
\r
1082 JUMPE TAC,CPOPJ ;EXIT IF ACCESS TABLE ALREADY CLOSED
\r
1083 ; (PROBABLY ^C DURING EARLIER ATTEMPT)
\r
1084 MOVE TAC1,TBITS(TAC) ;GET STATUS BITS
\r
1086 TRNE TAC1,ATCLO ;IS THIS FILE SIMPLY BEING CREATED (NOT UPDATED)?
\r
1087 HALT CPOPJ ;IF SO, SOMEBODY IS VERY CONFUSED.
\r
1090 SOS TAC1,TBITS(TAC) ;DECREMENT RCOUNT
\r
1091 TRNE TAC1,RCOUNT+RWTBIT ;ANY MORE READS? OR OUTPUT CLOSE TO DO?
\r
1092 JRST DFCL23 ;YES, LEAVE
\r
1094 TRNE TAC1,DTBIT ;TO BE DELETED?
\r
1096 PUSHJ PDP,CLRAT ;CLEAR THE ENTRY AND EXIT
\r
1098 TLZN DEVDAT,INPB ;ANY INPUT UUO'
\r
1099 JRST CLRBUF ;NO, JUST EXIT, RETURNING MON BUF
\r
1100 PUSHJ PDP,SETBUF ;YES, UPDATE ACCESS DATE AS FOLLOWS:
\r
1101 PUSHJ PDP,RRIB ;READ IN JUST BLOCK OF RETRIEVAL INFORMATION.
\r
1102 SUBI TAC1,BLKSIZ-2 ;SET TAC1 TO 2ND WORD OF BLOCK
\r
1103 LDB AC1,[POINT 17,@TAC1,35] ;GET PREVIOUS ACCESS DATA.
\r
1104 CAMN AC1,THSDAT ;ALREADY ACCESSED EARLIER TODAY?
\r
1105 JRST CLRBUF ;YES, JUST CLEAR BUFFER AND EXIT.
\r
1106 MOVE AC1,THSDAT ;NO, STORE TODAY(S DATE AS NEW ACCESS DATE.
\r
1107 DPB AC1,[POINT 17,@TAC1,35] ;
\r
1108 PUSHJ PDP,WRIB ;REWRITE FIRST BLOCK OF RETRIEVAL INFORMATION.
\r
1109 JRST CLRBUF ;CLEAR BUFFER AND EXIT.
\r
1111 SUBTTL DIRECTORY SEARCHING
\r
1112 ;SEARCH DIRECTORY FOR A PARTICULAR ENTRY.
\r
1113 ;ENTRY BY: MOVE DAT,NAME
\r
1114 ; HLLZ AC1,EXTENSION
\r
1115 ; HRRZ TAC,BLOCK NUMBER FOR POINTERS
\r
1116 ; PUSHJ PDP,DIRSRC
\r
1117 ; EXIT1 NAME NOT FOUND
\r
1118 ; EXIT2 NAME FOUND, TAC POINTS TO ENTRY
\r
1120 DIRSRC: PUSH PDP,AC1
\r
1121 PUSH PDP,DAT ;0(PDP) IS FILENAME,-1(PDP) IS EXTENSION
\r
1122 PUSHJ PDP,SETPTR ;READ UFD RETRIEVAL POINTERS
\r
1123 DRSRC0: HRRZ TAC,DEVACC(DEVDAT)
\r
1124 CAILE TAC,PTRN(DEVDAT) ;MORE POINTERS IN CORE?
\r
1125 JRST DRSRC7 ;NO, GET MORE.
\r
1127 JUMPE TAC,DRSRC6 ;0 SIGNALS END OF POINTERS
\r
1128 AOS DEVACC(DEVDAT) ;NEXT POINTER
\r
1130 AOS DEVCNT(DEVDAT) ;COUNT UFD BLOCKS SEARCHED
\r
1131 PUSHJ PDP,MQIN ;READ IN DATA BLOCK
\r
1132 JRST RERA ;ERROR, YOU LOSE.
\r
1134 MOVE TAC1,DSKBUF(DEVDAT) ;XWD-L,POINTER
\r
1136 TLNN IOS,UBFS ;DUMP MODE?
\r
1137 HRLI TAC,PROG ;NO. RELOCATE.
\r
1138 HLLZ AC1,-1(PDP) ;SIXBIT/EXT/
\r
1139 DRSR3A: SKIPN AC3,@TAC ;BLOCK ENTIRELY SEARCHED?
\r
1142 CAMN AC3,(PDP) ;NAMES MATCH?
\r
1145 DRSRC4: ADDI TAC,1
\r
1147 CAIE AC3,BLKSIZ(TAC1) ;IS BLOCK ENTIRELY SEARCHED?
\r
1151 DRSRC7: TLNE IOS,NMP ;ANY MORE POINTERS ON DISK?
\r
1153 PUSHJ PDP,GETPTR ;YES, GET SOME
\r
1156 DRSRC8: HLLZ AC3,@TAC ;DOES EXTENSION MATCH
\r
1159 SUBI TAC,1 ;POINT TO FIRST WORD OF ENTRY
\r
1161 AOS -2(PDP) ;YES, ENTRY IS FOUND
\r
1162 MOVSS DEVCNT(DEVDAT) ;SAVE COUNT OF UFD BLOCKS FOR USE AT CLOSE
\r
1165 DRSRC6: POP PDP,DAT
\r
1167 POPJ PDP, ;"FILE" NOT FOUND
\r
1168 ;CHECK PROTECTION ON UFD
\r
1170 DSRC10: PUSH PDP,AC1 ;PUSH EXTENSION
\r
1172 MOVSI DAT,200000 ;SET UP TO TEST READ BIT
\r
1173 TLNE IOS,10 ;IS IT LOOKUP>
\r
1174 ROT DAT,-1 ;NO,TEST WRITE PROTECTION
\r
1175 MOVEI TAC,PTR1(DEVDAT)
\r
1176 HRRZ AC1,-3(PDP) ;XWD PROJ,PROG
\r
1179 TLO IOS,PRCHG ;FLAG PROTECTION CHANGE
\r
1180 PUSH PDP,DEVFIL(DEVDAT) ;PUSH FILENAME TO MAKE PDL LOOK LIKE DIRSRC
\r
1184 ;FIND A UFD ENTRY, IT MUST BE THERE.
\r
1186 EXTERNAL AUREQ,AUWAIT
\r
1191 HLRZ TAC,SETCNT(DEVDAT) ;SET TAC TO UFD POINTERS
\r
1192 HLRZ DAT,DEVCNT(DEVDAT) ;SET DAT TO COUNT COMPUTED BY DIRSRC
\r
1195 FINDE1: MOVSM TAC,DEVBLK(DEVDAT);READ A POINTER BLOCK
\r
1197 CAILE DAT,BLKSIZ-2 ;POINTER IN THIS BLOCK?
\r
1198 JRST FINDE2 ;NO, GET NEXT ONE
\r
1199 SUBI DAT,1 ;YES, BRING THEM IN
\r
1200 HRRM DAT,DEVBLK(DEVDAT) ;SET INDEX INTO RIB
\r
1201 PUSHJ PDP,DFIN4 ;COPY POINTERS INTO DDB
\r
1202 HRRZ TAC,PTR1(DEVDAT) ;GET RETRIEVAL POINTER FOR UFD BLOCK
\r
1204 PUSHJ PDP,MQIN ;READ THE UFD BLOCK
\r
1206 PUSHJ PDP,SET000 ;FIND THE ENTRY
\r
1207 HLLZ AC1,DEVEXT(DEVDAT) ;GET EXTENSION FROM DDB
\r
1209 SRCU1: MOVE TAC,@TAC1 ;GET FILE NAME FROM UFD
\r
1211 CAME TAC,DEVFIL(DEVDAT) ;SAME?
\r
1212 AOJA TAC1,SRCU1 ;NAMES DO NOT MATCH
\r
1213 HLLZ TAC,@TAC1 ;GET EXTENSION FROM UFD
\r
1214 CAME TAC,AC1 ;SAME?
\r
1215 AOJA TAC1,SRCU1 ;EXTENSIONS DO NOT MATCH
\r
1216 POPJ PDP, ;FOUND IT
\r
1218 FINDE2: PUSHJ PDP,SET176 ;GET THE NEXT POINTER BLOCK
\r
1220 SUBI DAT,BLKSIZ-2 ;BACK UP DAT
\r
1223 ;INSERT AN ENTRY IN A DIRECTORY.
\r
1225 EXTERNAL AUREQ,AUWAIT,AUAVAL
\r
1227 INSDIR: AOSE AUREQ
\r
1230 SETZM DEVCNT(DEVDAT) ;CLEAR BEFORE COUNTING BLOCK OF UFD
\r
1231 HLRZ TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB
\r
1232 PUSHJ PDP,SETPTR ;SET UP FIRST POINTERS,.
\r
1233 SOS DEVACC(DEVDAT) ;SYNC
\r
1235 INSD1: AOS TAC,DEVACC(DEVDAT) ;GET NEXT POINTER,
\r
1237 AOS DEVCNT(DEVDAT) ;COUNT EACH UFD BLOCK
\r
1238 CAILE TAC,PTRN(DEVDAT) ;ANY MORE IN CORE?
\r
1239 JRST INSD10 ;NO, GET SOME MORE
\r
1241 INSD2: HRRZ TAC,(TAC) ;GET RETRIEVAL POINTER
\r
1242 JUMPE TAC,INSD5 ;0 SIGNALS END OF POINTERS
\r
1243 PUSHJ PDP,MQIN ;READ UFD BLOCK
\r
1246 PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127
\r
1247 SKIPE @TAC1 ;IS IT ZERO?
\r
1248 JRST INSD1 ;NO, BLOCK FULL.
\r
1250 MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE# OF BLOCK CONTAINING NEW ENTRY
\r
1251 PUSHJ PDP,INSD3 ;INSERT ENTRY.
\r
1253 JRST WUFD ;WRITE BLOCK AND LEAVE
\r
1255 ;INSERT THE ENTRY.
\r
1257 INSD3: HRRZ AC1,DSKBUF(DEVDAT)
\r
1258 INSD3B: CAIN AC1,(TAC1) ;BEGINNING OF BLOCK?
\r
1261 SKIPN @TAC1 ;SEARCH UFD BLOCK BACKWARDS
\r
1262 ; FOR LAST NON-ZERO FILENAME.
\r
1266 ADDI TAC1,2 ;MOVE IN NAME.
\r
1267 INSD3A: MOVE TAC,DEVFIL(DEVDAT)
\r
1269 ADDI TAC1,1 ;MOVE IN EXTENSION & POINTER.
\r
1270 MOVE TAC,DEVEXT(DEVDAT)
\r
1272 TRNN TAC,-1 ;POINTER TO BLOCK 0
\r
1274 HALT .+1 ;FOR RETRIEVAL INFO
\r
1275 ; CONTINUE-GET BAD INFO MESSAGE
\r
1280 ;CREATE NEW UFD BLOCK AND ADD ENTRY. THEN FIND THE LAST OR ONLY
\r
1281 ;POINTER BLOCK, ADD POINTER IF POSSIBLE. IF NOT POSSIBLE.
\r
1282 ;CREATE NEW POINTER BLOCK AND PUT THE POINTER IN IT.
\r
1284 INSD5: PUSHJ PDP,SET000 ;@TAC1 POINTS TO WORD 0 OF BUFFER
\r
1286 MOVEI TAC,@TAC1 ;POINT TO WORD 0 OF BUFFER
\r
1287 SETZM 2(TAC) ;CLEAR FOR BLT
\r
1288 MOVSI DAT,2(TAC) ;SOURCE
\r
1289 HRRI DAT,3(TAC) ;DESTINATION
\r
1290 BLT DAT,BLKSIZ-1(TAC) ;CLEAR WORDS 2.-127.
\r
1293 PUSHJ PDP,INSD3A ;INSERT ENTRY IN WORDS 0,1
\r
1294 MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE BLOCK# OF THIS UFD BLOCK
\r
1295 PUSHJ PDP,DFGETF ;GET A FREE BLOCK
\r
1296 MOVEM TAC,SETCNT(DEVDAT) ;SAVE IT
\r
1299 MOVE TAC,DSKBUF(DEVDAT)
\r
1301 HRLM TAC1,SETCNT(DEVDAT)
\r
1302 MOVE TAC,SETCNT(DEVDAT)
\r
1305 INSD5A: PUSHJ PDP,MQOUT ;WRITE THE UFD BLOCK OUT
\r
1306 JRST INSD11 ;ERROR
\r
1308 PUSHJ PDP,RRI ;READ POINTER BACK IN.
\r
1309 INSD6: PUSHJ PDP,SET176
\r
1310 HLRZ TAC,@TAC1 ;LAST OR ONLY BLOCK?
\r
1313 PUSHJ PDP,RRIA ;NO, READ NEXT ONE.
\r
1316 INSD7: SUBI TAC1,1 ;YES, ROOM FOR ANOTHER POINTER?
\r
1320 PUSHJ PDP,NEWRIB ;CREATE NEW POINTER BLOCK.
\r
1321 PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD
\r
1322 INSD7A: MOVE TAC,SETCNT(DEVDAT) ;GET POINT SAVED ABOVE
\r
1323 MOVEM TAC,@TAC1 ;STORE POINTER TO NEW UFD BLOCK
\r
1324 PUSHJ PDP,WRI ;WRITE BLOCK
\r
1325 SOSL AUREQ ;RELEASE UFD RESOURCE
\r
1328 MOVEM IOS,DEVIOS(DEVDAT)
\r
1331 ;ROOM FOR ANOTHER POINTER IN THIS BLOCK. FIND LAST POINTER.
\r
1332 ;INSERT NEW ONE, AND WRITE BLOCK OUT.
\r
1334 INSD8: SKIPN @TAC1
\r
1335 SOJA TAC1,INSD8 ;SCAN BACKWARDS FOR LAST POINTER
\r
1336 AOJA TAC1,INSD7A ;FOUND IT. ADD NEW ONE.
\r
1338 ;GET MORE POINTERS INTO CORE.
\r
1340 INSD10: TLNE IOS,NMP ;ANY MORE ON DISC?
\r
1343 MOVE TAC,DEVACC(DEVDAT)
\r
1346 ;WRITE ERROR. IF WRITE-LOCK. FIX IT.
\r
1348 INSD11: TRNN IOS,IOIMPM
\r
1349 JRST WERA ;IT WAS NOT, YOU LOSE.
\r
1351 PUSHJ PDP,WLERA ;GET ANOTHER BLOCK
\r
1352 HRRM TAC,SETCNT(DEVDAT)
\r
1356 ;OUTPUT A UFD BLOCK, PERFORM CHECKSUM IF NEEDED, WRITE THE BLOCK OUT.
\r
1357 ;IF WRITE-LOCK ERROR, TRY ANOTHER BLOCK. FINALLY, IF POINTERS WERE
\r
1358 ;ALTERED, WRITE THEM OUT.
\r
1360 EXTERNAL AUREQ,AUAVAL
\r
1362 WUFD: IFG CHKCNT,<
\r
1363 MOVE TAC,DSKBUF(DEVDAT) ;POINTER TO BUFFER
\r
1364 PUSHJ PDP,CHKSUM ;RETURN CHECKSUM IN TAC1
\r
1366 MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION
\r
1368 HRLM TAC1,(TAC) ;STORE CHECKSUM IN RETRIEVAL POINTER
\r
1370 ORM TAC1,DEVOAD(DEVDAT) ;NOTE THAT POINTERS IUN DDB NOT=DISK
\r
1373 MOVE TAC1,DEVOAD(DEVDAT)
\r
1376 MOVEM TAC1,DEVOAD(DEVDAT)
\r
1378 HRRZ TAC,(TAC) ;GET BLOCK# FROM RETRIEVAL POINTER
\r
1380 WUFD1: PUSHJ PDP,MQOUT ;WRITE UFD BLOCK
\r
1381 JRST WUFD3 ;WRITE ERROR
\r
1382 MOVE TAC,DEVOAD(DEVDAT)
\r
1383 TLO IOS,NMP ;SET NMP
\r
1384 MOVEM IOS,DEVIOS(DEVDAT) ;SO DFO4A WON'T READ POINTERS
\r
1385 TLN TAC,PNTDIF ;WERE POINTERS CHANGED?
\r
1386 PUSHJ PDP,DFO4A ;YES, WRITE THEM OUT.
\r
1387 SOSL AUREQ ;RELEASE UFD RESOURCE
\r
1389 TLZ IOS,AUFLG ;NOTE THAT UFD RELEASED
\r
1390 MOVEM IOS,DEVIOS(DEVDAT)
\r
1393 WUFD3: MOVE TAC1,DSKCNT(DEVDAT);WAS ERROR WRITE-LOCK?
\r
1396 TRZ IOS,IOIMPM ;YES
\r
1397 MOVEM IOS,DEVIOS(DEVDAT)
\r
1399 ORM TAC1,DEVOAD(DEVDAT)
\r
1400 PUSHJ PDP,WLERA ;FREE CURRENT ASSIGNED BLOCK AND GET A NEW ONE
\r
1401 MOVE TAC1,DEVACC(DEVDAT)
\r
1405 SUBTTL ACCESS TABLE PROCESSING
\r
1406 ;SCAN ACCESS TABLE.
\r
1407 ;EXIT TO CALL+1 WITH TAC SET TO THE LAST ENTRY IF NOT THERE.
\r
1408 ;EXIT TO CALL+2 WITH TAC SET TO CORRECT ENTRY IF THERE.
\r
1410 EXTERNAL CPOPJ1,CPOPJ
\r
1412 SCANAT: MOVE AC2,-1(PDP)
\r
1413 SCNAT0: SKIPN TAC,FAT ;ANY AT ALL?
\r
1414 SCNHLT: POPJ PDP, ;NO, LEAVE (HALT PC HERE IF ATTEMPT
\r
1415 ; TO CLEAR NON-EXISTANT ACCESS TABLE)
\r
1417 SCNAT1: CAME AC2,ATPP(TAC) ;PROJ,-PROG. THE SAME?
\r
1420 MOVE DAT,DEVFIL(DEVDAT) ;NAMES THE SAME?
\r
1421 CAME DAT,ATNAME(TAC)
\r
1424 HLLZ DAT,ATEXT(TAC) ;EXTENSION THE SAME?
\r
1425 HLLZ AC3,DEVEXT(DEVDAT)
\r
1429 ;CONTINUE SCAN FROM CURRENT ENTRY
\r
1431 SCNAT2: HRRZ DAT,ATLINK(TAC) ;ANY MORE ENTRIES?
\r
1432 JUMPE DAT,CPOPJ ;NO
\r
1433 MOVE TAC,DAT ;YES, GO TO THE NEXT ONE
\r
1436 ;CLEAR AN ACCESS ENTRY.
\r
1437 ;IT IS ASSUMED THAT NO SCHEDULING WILL TAKE PLACE.
\r
1438 ;ENTER WITH TAC POINTING TO THE ENTRY TO WIPE OUT.
\r
1440 CLRAT: IFN FTRCHK,<
\r
1441 SKIPN TAC ;ATTEMPT TO CLEAR NON EXISTENT ACCESS TABLE IS AN ERROR
\r
1443 HALT SCNHLT ;CONTINUE WILL POPJ AND EXIT.
\r
1445 HRRZS DEVACC(DEVDAT) ;CLEAR ACCESS TABLE POINTER IN DEVICE DATA BLOCK
\r
1446 MOVEI AC2,FAT ;START AT BEGINNING OF LINKED ACCESS TABLE ENTRIES
\r
1449 CLRAT1: MOVE AC1,AC2 ;PICKUP THE NEXT ACCESS TABLE
\r
1450 HRRZ AC2,ATLINK(AC1)
\r
1452 SKIPN AC2 ;ZERO LINK INDICATES END OF TABLE WITHOUT
\r
1453 ;FINDING ENTRY TO BE CLEARED
\r
1454 HALT SETHLT ;CONTINUING AFTER THIS ERROR WILL CONTINUE
\r
1455 ; NORMALLY (IE POPJ)
\r
1457 CAME AC2,TAC ;DOES THIS ENTRY LINK TO THE ONE TO BE CLOBBERED?
\r
1458 JRST CLRAT1 ;NO,CONTINUE SERACH
\r
1460 MOVE AC2,ATLINK(TAC) ;YES, FOUND IT
\r
1461 HRRM AC2,ATLINK(AC1) ;LINK AROUND IT
\r
1462 JRST CLRCOR ;CLEAR THE CORE
\r
1464 ;FIND A HOLD FOR ACCESS TABLE ENTRY AND SET A LINK.
\r
1465 ;BUILD UP THE ENTRY
\r
1466 ;UPON ENTRY, DAT SHOULD CONTAIN TEST BITS TO SET
\r
1469 SETAT: PUSHJ PDP,GETFCR ;TAC1 POINTS TO 4 WORD BLOCK
\r
1470 HLL DAT,DEVEXT(DEVDAT)
\r
1471 MOVEM DAT,ATEXT(TAC1) ;STORE EXTENSION
\r
1472 MOVE DAT,DEVFIL(DEVDAT)
\r
1473 MOVEM DAT,ATNAME(TAC1) ;STORE FILE NAME
\r
1474 MOVE DAT,-1(PDP) ;XWD PROJ,PROG
\r
1475 MOVEM DAT,ATPP(TAC1) ;STORE XWD PROJ,PROG
\r
1476 HLL DAT,SETCNT(DEVDAT) ;LOGICAL BLOCK# OF UFD RIB
\r
1477 HRR DAT,FAT ;POINTER TO NEXT ENTRY
\r
1478 MOVEM DAT,ATLINK(TAC1) ;STORE LINKE
\r
1479 HRRZM TAC1,FAT ;POINT FAT TO THIS NEW ENTRY
\r
1480 SETHLT: POPJ PDP, ;HALT PC HERE IF END OF TABLE WITHOUT FINDING
\r
1481 ; ENTRY TO BE CLEARED
\r
1483 SUBTTL DUMP INPUT/OUTPUT
\r
1486 EXTERNAL COMCHK,ADRERR,SAVDDL
\r
1488 DFDMPO: TLNN DEVDAT,ENTRB ;ENTER YET?
\r
1489 JRST DFERR2 ;NO, UNDEFINED FILE
\r
1491 TLO IOS,10 ;OUTPUT STATUS
\r
1492 MOVEM IOS,DEVIOS(DEVDAT)
\r
1493 PUSHJ PDP,COMCHK ;CHECK IOWDS
\r
1494 JRST ADRERR ;ERROR
\r
1496 DFDO0: SKIPN TAC,@UUO ;PICK UP NEXT IOWD
\r
1497 POPJ PDP, ;IT WAS ZERO, LEAVE
\r
1498 TLNE TAC,-1 ;LH ZERO?
\r
1500 HRR UUO,TAC ;YES, ANOTHER TABLE
\r
1503 DFDO0A: ADDI TAC,1 ;FORM XWD - LENGTH, FIRST-ADDRESS
\r
1504 PUSH PDP,TAC ;SAVE IT
\r
1506 DFDO1: PUSHJ PDP,UPDA ;SET DAREQ INTERLOCK (SAT BLOCKS MAY ONLY
\r
1507 ; BE MANIPULATED BY ONE USER AT A TIME!)
\r
1508 DFDO1A: PUSHJ PDP,SATGET ;AQUIRE A NON-FULL SAT BLOCK
\r
1509 ; ITEM IS DESTROYED IF SATGET CALLS MQIN,MQOUT
\r
1510 HLRE ITEM(PDP) ;ITEM < [LH OF IOWD]/200
\r
1512 ADDI ITEM,BLKSIZ-1 ;MAKE E.G. 129 WORDS USE 2 DISK BLOCK
\r
1513 ASH ITEM,-BLKP2 ;NUMBER OF BLOCK REQUIRED FOR THIS WRITE
\r
1514 DFDO2A: HRRZ AC1,SATPTR
\r
1516 DFDO1B: PUSHJ PDP,GETBIT ;ASK FOR C(ITEM BITS)
\r
1517 JRST DFDO6 ;NOT AVAILABLE
\r
1519 ADDM ITEM,@SATPTR ;INCREMENT COUNT
\r
1520 SETOM SATCHG ;SAT BLOCK HAS BEEN CHANGED
\r
1521 HLRZ DAT,@SATPTR ;COMPUTE BLOCK NUMBER LESS 1.
\r
1523 PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK.
\r
1525 PUSH PDP,DAT ;AND SAVE BLOCK NUMBER LESS 1
\r
1526 PUSH PDP,ITEM ;SAVE COUNT OF BLOCKS WRITTEN
\r
1527 MOVE TAC1,-2(PDP) ;SET UP AN IOWD (SAVED AT DFDO0A)
\r
1528 MOVEM TAC1,DSKBUF(DEVDAT)
\r
1534 HRLM TAC,DSKBUF(DEVDAT) ;ONLY A PARTIAL WRITE
\r
1535 HLRE TAC1,DSKBUF(DEVDAT)
\r
1537 PUSHJ PDP,UPDEVC ;UPDATE SIZE OF FILE
\r
1538 ADDM ITEM,SETCNT(DEVDAT) ;NON UPDATE RELATIVE BLOCK# WITHIN THE FILE
\r
1540 MOVE TAC1,DSKBUF(DEVDAT) ;PICK UP ADDRESS AND WORD COUNT
\r
1541 TLZN TAC1,BLKSIZ-1 ;AN EVEN NUMBER OF DISK BLOCKS TO BE WRITTEN?
\r
1542 JRST DFDO2G ;YES, DON'T WORRY ABOUT PARTIAL BLOCK
\r
1543 ;HANDLING PROBLEMS
\r
1544 PUSH PDP,TAC1 ;NO, SAVE ADDRESS WITH COUNT OF FULL BLOCKS-1
\r
1546 PUSH PDP,DSKBUF(DEVDAT) ;SAVE,ORIGINAL ADDRESS ;EXACT WORD COUNT ALSO
\r
1547 PUSHJ PDP,SETBUF ;GET MONITOR BUFFER
\r
1548 MOVE TAC1,DSKBUF(DEVDAT) ;TAC1 GETS ADDRESS OF MONITOR BUFFER
\r
1549 ; (RELOCATION NOT NECESSARY)
\r
1550 POP PDP,TAC ;USER'S INITIAL ADDR AND WC
\r
1551 PUSHJ PDP,SAVDDL ;ADJUST IN CASE THIS IS A SAVE OF A
\r
1552 ; HIGH SEGMENT, WHICH WAS MOVED IN CORE
\r
1553 ; DURING I/O WAIT.
\r
1555 HRRZ TAC,-2(PDP) ;GET INITIAL BLOCK NUMBER-1
\r
1556 DFDO2C: ADD AC1,[XWD BLKSIZ,BLKSIZ] ;SET UP ADDRESS, WORD COUNT, AND LOGICAL
\r
1557 AOS TAC ;BLOCK NUMBER FOR LAST (PARTIAL) BLOCK
\r
1558 JUMPL AC1,DFDO2C ;OF THIS DUMP MODE OUTPUT REQUEST.
\r
1559 SUB AC1,[XWD BLKSIZ,BLKSIZ]
\r
1560 HLL AC2,AC1 ;SAVE LH
\r
1561 DFDO2D: MOVE AC2,(AC1) ;MOVE DATA FROM END OF USER'S
\r
1562 MOVEM AC2,(TAC1) ;OUTPUT AREA DT MONITOR BUFFER
\r
1565 DFDO2E: SETZM (TAC1) ;ZERO OUT THE REMAINDER OF THE MONTOR BUFFER
\r
1567 PUSHJ PDP,MQOUT ;WRITE OUT THE PARTIAL FULL MONITOR BUFFER
\r
1568 ; WHICH CONTAINS THE LAST BLOCK OF THE DUMP MODE
\r
1569 ; MODE OUTPUT REQUEST
\r
1570 JFCL ;IGNORE ERROR RETURN
\r
1571 PUSHJ PDP,CLRBUF ;RELINQUISH THE MONTOR BUFFER
\r
1572 POP PDP,DSKBUF(DEVDAT) ;RETRIEVE ORIGINAL ADDRESS
\r
1573 MOVSI TAC1,BLKSIZ ;WITH WORD COUNT THSAT HAS LOW-ORDER BITS CLEARED
\r
1574 ADDB TAC1,DSKBUF(DEVDAT) ;ADD IN BLOCK SIZE TO DETERMINE NUMBER
\r
1575 ; NUMBER OF FULL BLOCKS YET TO BE WRITTEN
\r
1576 JUMPG TAC1,DFDO2B ;IF NO FULL BLOCKS TO BE WRITTEN SKIP OVER
\r
1578 DFDO2G: MOVE TAC,DSKBUF(DEVDAT) ;ORIGINAL ADDRESS AND WORD COUNT
\r
1579 PUSHJ PDP,SAVDDL ;AJDUST IN CASE OF SAVE OF HIGH SEG
\r
1580 ; WHICH HAS MOVED DURING IO WAIT
\r
1581 MOVEM TAC,DSKBUF(DEVDAT) ;STORE BACK IN DDB
\r
1582 MOVE TAC,-1(PDP) ;WRITE THE BLOCKS
\r
1586 DFDO2B: POP PDP,ITEM ;RESTORE COUNT
\r
1588 ;TOSS OUT A SERIES OF CONSECUTIVE POINTERS
\r
1590 HRRZ AC2,DEVACC(DEVDAT) ;GET RETRIEVAL POINTER POINTER
\r
1591 DFDO3A: MOVE AC1,@AC2 ;IS POINTER ALREADY THERE?
\r
1596 CAIG AC2,PTRN(DEVDAT) ;NO, IS THERE A NEXT ONE?
\r
1597 SETZM @AC2 ;CLEAR NEXT POINTER
\r
1598 TLO IOS,NMP ;FLAG END OF POINTERS
\r
1599 MOVEM IOS,DEVIOS(DEVDAT)
\r
1600 DFDO3B: AOS DAT,(PDP) ;PUT A POINTER IN CORE
\r
1601 HRRZM DAT,-1(AC2) ;STORE NEW POINTER IN DDB
\r
1603 ORM DAT,DEVOAD(DEVDAT) ;SHOW THAT POINTERS IN DDB NOT=DISK
\r
1605 IFG CHKCNT,< ;GET CHECKSUM
\r
1607 PUSHJ PDP,SAVDDL ;ADJUST ADR IN CASE OF HIGH SEG SAVE
\r
1613 CAILE AC2,PTRN(DEVDAT) ;MORE POINTERS?
\r
1614 JRST DFDO4 ;LAST POINTER IN CORE
\r
1616 DFDO3C: MOVE TAC1,[XWD BLKSIZ,BLKSIZ];INCREMENT IOWD
\r
1618 SOJG ITEM,DFDO3A ;ANY MORE?
\r
1620 HRRM AC2,DEVACC(DEVDAT)
\r
1622 JRST DFDO1 ;NOT FINISHED, GET NEXT SET
\r
1623 POP PDP,TAC ;BACK UP PDP
\r
1624 AOJA UUO,DFDO0 ;GO BAK FOR MORE
\r
1626 ;WRITE POINTERS ONTO DISK
\r
1628 DFDO4: HRLM ITEM,(PDP) ;SAVE COUNT OF BLOCKS TO WRITE
\r
1629 PUSHJ PDP,SETBUF ;FIND SOME 200 WORD AREA
\r
1630 PUSHJ PDP,DFO4A ;WRITE THEM
\r
1631 PUSHJ PDP,CLRBUF ;CLEAR THE AREA
\r
1632 MOVEI AC2,PTR1(DEVDAT) ;RESET AC2 TO FIRST POINTER
\r
1633 HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE
\r
1636 DFDO6: LSH ITEM,-1 ;TRY FOR 1/2 EARLIER REQUEST
\r
1637 JUMPN ITEM,DFDO1B ;CONTINUE IF NON-ZERO
\r
1638 MOVEI TAC,NUMBIT ;BITS/SAT BLOCK
\r
1639 HRRM TAC, @SATPTR ;MARK SAT ENTRY FULL
\r
1640 JRST DFDO1A ;TRY ANOTHER SAT BLOCK
\r
1642 ;ERROR WHILE WRITING, IF WRITE-LOCK, FIX IT,
\r
1644 DFDO7: HRRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK?
\r
1646 JRST DFDO2B ;NO, TOO BAD.
\r
1648 HLRZ TAC,DSKCNT(DEVDAT)
\r
1649 PUSHJ PDP,SETWL ;SET WRITE-LOCK BIT IN SAT ENTRY.
\r
1651 DFDO8: AOS TAC,-1(PDP)
\r
1656 JRST DFDO1 ;TRY AGAIN.
\r
1658 ;WE ARE WRITING IN MIDDLE OF FILE, FREE THE OLD BLOCK.
\r
1660 DFDO9: HRLM ITEM,(PDP) ;SAVE BLOCK COUNT WITH BLOCK#
\r
1661 PUSH PDP,AC2 ;SAVE POINTER TO RETRIEVAL INFO IN DDB
\r
1662 HRRZ TAC,-1(AC2) ;GET OLD BLOCK# FROM DDB
\r
1664 POP PDP,AC2 ;RESTORE POINTER INTO RETRIEVAL INFO
\r
1665 HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE THIS ITERATION
\r
1670 EXTERNAL COMCHK,ADRERR
\r
1672 DFDMPI: TLNN DEVDAT,LOOKB ;LOOKUP YET?
\r
1673 JRST DFERR2 ;NO, UNDEFINED FILE
\r
1674 TLNE IOS,IOEND ;END-FILE?
\r
1676 TLZ IOS,IO ;INPUT STATUS
\r
1677 MOVEM IOS,DEVIOS(DEVDAT)
\r
1678 PUSHJ PDP,COMCHK ;CHECK IOWDS
\r
1679 JRST ADRERR ;ERROR
\r
1680 DFDI0: SKIPN TAC,@UUO ;PICK UP NEXT IOWD
\r
1681 POPJ PDP, ;NO MORE, LEAVE.
\r
1682 TLNE TAC,-1 ;LH ZERO?
\r
1684 HRR UUO,TAC ;YES, ANOTHER LIST.
\r
1687 DFDI0A: ADDI TAC,1 ;FROM XWD -L,FIRST-ADDRESS
\r
1690 HLRZ TAC1,TAC ;GET LENGTH FROM IOWD
\r
1691 CAIGE TAC1,NBLKSZ ;LESS THAN 1 BLOCK?
\r
1692 HRLI TAC,NBLKSZ ;YES, MUST WRITE AT LEAST 1 FULL BLOCK
\r
1693 PUSH PDP,TAC ;IOWD FOR FIRST BLOCK
\r
1695 HRRZ AC2,DEVACC(DEVDAT) ;PICK UP FIRST POINTER
\r
1696 CAILE AC2,PTRN(DEVDAT) ;ANY LEFT IN CORE?
\r
1697 PUSHJ PDP,DFDI9 ;NO, GET SOME MORE
\r
1698 SKIPN @AC2 ;IS A POINTER THERE?
\r
1699 JRST DFDI1B ;NO. EXIT
\r
1700 PUSH PDP,@AC2 ;SAVE THE POINTER
\r
1702 MOVE TAC,[XWD BLKSIZ,BLKSIZ] ;INCREMENT IOWD
\r
1704 AOS DEVACC(DEVDAT) ;NEXT POINTER
\r
1705 AOS SETCNT(DEVDAT) ;NEXT RELATIVE BLOCK
\r
1708 DFDI1: SKIPGE -2(PDP) ;MORE TO GO?
\r
1711 DFDI1A: MOVE TAC1,-1(PDP) ;NO, PROCESS THE FIRST BLOCK
\r
1712 MOVEM TAC1,DSKBUF(DEVDAT) ;SAY WHERE TO READ DATA
\r
1713 MOVE TAC,(PDP) ;GET FIRST LOGICAL BLOCK#
\r
1715 JFCL ;ERRORS IGNORED.
\r
1717 REPEAT 0, < ;TEMPORARILY DELETE THIS CODE DUE TO SAVE-GET PROBLEM.
\r
1718 IFG CHKCNT,< ;COMPARE CHECKSUM
\r
1724 ORM AC1,DEVIOS(DEVDAT)
\r
1725 MOVE IOS,DEVIOS(DEVDAT)
\r
1729 SUB PDP,[XWD 3,3] ;REMOVE INTERMEDIATE STORAGE FROM PDL
\r
1730 AOJA UUO,DFDI0 ;GO BACK FOR MORE.
\r
1732 DFDI1B: SUB PDP,[XWD 2,2] ;BACK UP PDP, REMOVE XWD AND IOWD
\r
1733 DFDI1C: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT
\r
1734 ORB IOS,DEVIOS(DEVDAT)
\r
1737 ;DUMP INPUT CONTINUED,
\r
1738 ;FIND A SERIES OF CONSECUTIVE BLOCKS TO READ AT ONCE
\r
1740 DFDI2: HRRZ AC2,DEVACC(DEVDAT) ;GET NEXT POINTER
\r
1741 CAILE AC2,PTRN(DEVDAT) ;ANY MORE POINTERS IN CORE?
\r
1742 PUSHJ PDP,DFDI9 ;NO GET SOME MORE
\r
1744 JRST DFDI8 ;END-FILE
\r
1745 PUSH PDP,AC2 ;SAVE POINTER TO POINTER
\r
1746 HLRZ TAC,-3(PDP) ;GET LENGTH OF REMAINING INPUT
\r
1747 HRRZ TAC1,(AC2) ;GET BLOCK# FROM DDB
\r
1749 DFDI3: ADDI TAC,BLKSIZ ;ANY MORE TO READ?
\r
1753 CAIG AC2,PTRN(DEVDAT)
\r
1754 SKIPN AC3,@AC2 ;END-FILE
\r
1757 CAIN TAC1,-1(AC3) ;STILL CONSECUTIVE?
\r
1758 AOJA TAC1,DFDI3 ;YES, LOOP
\r
1760 DFDI4: MOVE TAC,(PDP) ;COMPUTE COUNT
\r
1761 SUB TAC,AC2 ;DIFFERENCE BETWEEN POINTERS IS # OF BLOCKS
\r
1762 LSH TAC,BLKP2 ;COMPUTE WORDS
\r
1764 DFDI5: HLRE TAC,-3(PDP) ;GET LENGTH OF INPUT
\r
1766 DFDI6: HRRZ TAC1,DEVACC(DEVDAT)
\r
1769 ADDM TAC1,SETCNT(DEVDAT)
\r
1770 HRRM AC2,DEVACC(DEVDAT) ;STORE NEW POINTER POINTER
\r
1774 MOVE TAC,(PDP) ;GET POINTER TO FIRST RETRIEVAL POINTER FOR THIS INPUT
\r
1775 MOVE TAC,(TAC) ;GET FIRST LOGICAL BLOCK#
\r
1776 MOVEM TAC1,DSKBUF(DEVDAT) ;STORE CONTROLLING IOWD
\r
1777 PUSHJ PDP,MQIN ;REQUEST THE INPUT
\r
1778 JFCL ;ERRORS IGNORED
\r
1780 ;DUMP INPUT CONTINUED.
\r
1781 ;IF THERE IS CHECKSUMMING. CHECK IT, ELSE INCREMENT IOWD
\r
1785 IFLE CHKCNT,< ;NO CHECKSUMMING
\r
1792 IFG CHKCNT,< ;CHECK CHECKSUMS
\r
1793 HLRE TAC1,AC2 ;CHANGE WORD COUNT TO BLOCKS
\r
1795 ADDI TAC1,BLKSIZ-1
\r
1799 DFDI7: MOVE TAC,-2(PDP)
\r
1805 MOVE AC3,[XWD BLKSIZ,BLKSIZ]
\r
1810 JRST DFDI1 ;SEE IF MORE INPUT REQUIRED
\r
1812 DFDI8: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT
\r
1813 ORB IOS,DEVIOS(DEVDAT)
\r
1816 DFDI9: TLNE IOS,NMP
\r
1818 PUSHJ PDP,SETBUF ;GET BUFFER
\r
1819 PUSHJ PDP,GETPTR ;READ AND COPY POINTERS INTO DDB
\r
1820 PUSHJ PDP,CLRBUF ;CLEAR BUFFER
\r
1821 HRRZ AC2,DEVACC(DEVDAT)
\r
1824 DFDI10: MOVEI AC2,PTR1(DEVDAT) ;NO MORE POINTERS ON DISK
\r
1825 HRRM AC2,DEVACC(DEVDAT)
\r
1829 SUBTTL USETO/USETI
\r
1830 ;SETD AND SETI UUOS
\r
1834 DFSET: PUSHJ PDP,.+2
\r
1836 TLNE DEVDAT,ENTRB+LOOKB ;FILE OPEN?
\r
1837 TRNN UUO,-1 ;NON-ZERO BLOCK NUMBER ARGUMENT?
\r
1838 JRST DFERR2 ;NO, ERROR IN EITHER CASE
\r
1839 PUSHJ PDP,WAIT1 ;WAIT FOR I/O TO COMPLETE
\r
1840 PUSHJ PDP,SETBF6 ;SET UP A BUFFER
\r
1841 MOVE IOS,[XWD IOEND,IODEND] ;CLEAR EOF
\r
1842 ANDCAB IOS,DEVIOS(DEVDAT)
\r
1844 HRRZ TAC1,DEVACC(DEVDAT)
\r
1845 HRRZ TAC,SETCNT(DEVDAT) ;C(UUO) RH > C(SETCNT) RH?
\r
1846 CAIL TAC,(UUO) ;(I.E. SHOULD WE GO FORWARD?)
\r
1847 JRST DFSET6 ;NO, GO BACKWARD
\r
1849 SUBI TAC1,PTRN(DEVDAT) ;YES, DESIRED POINTER IN CORE?
\r
1854 HRRZ TAC1,DEVCNT(DEVDAT)
\r
1855 ADDI TAC1,BLKSIZ-1
\r
1857 CAMGE TAC1,TAC ;ANY MORE POINTERS ON DISK?
\r
1859 HRRM TAC,SETCNT(DEVDAT)
\r
1860 MOVE TAC,DEVOAD(DEVDAT) ;YES, ARE POINTERS IN CORE THE SAME
\r
1861 TLNN TAC,PNTDIF ;AS ON DISC?
\r
1863 TLO IOS,NMP ;SET "DO NOT READ NEXT POINTERS"
\r
1864 MOVEM IOS,DEVIOS(DEVDAT)
\r
1865 PUSHJ PDP,DFO4A ;NO, WRITE THEM OUT
\r
1866 TLZA IOS,NMP ;NO NEED TO READ
\r
1868 DFSET1: PUSHJ PDP,RRI ;READ THEM IN
\r
1869 MOVEM IOS,DEVIOS(DEVDAT)
\r
1870 PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK?
\r
1874 HRRZ TAC,DEVBLK(DEVDAT) ;IN BLOCK WERE CURRENT ONE.
\r
1877 ADDM TAC,SETCNT(DEVDAT)
\r
1880 ;THE DESIRED POINTER MAY BE IN CORE. IF THERE ARE MORE POINTERS ON
\r
1881 ;DISC, THEN CORE IS FULL, AND THE POINTER IS IN CORE, OTHERWISE
\r
1882 ;A CHECK IS MADE TO INSURE THAT THE END FILE IS AFTER THE DESIRED
\r
1887 DFSETX: HRRZ TAC,DEVCNT(DEVDAT) ;C(UUO)RW > C(DEVCNT) RH?
\r
1888 ADDI TAC,BLKSIZ-1 ;CONVERT TO BLOCKS
\r
1891 JRST DFSET5 ;NO, ALL OK.
\r
1892 MOVSI IOS,IOEND ;YES, END-FILE.
\r
1893 IORB IOS,DEVIOS(DEVDAT)
\r
1895 DFSET5: HRRZ TAC,UUO ;SET NEXT BLOCK AS ONE BEYOND LAST EXISTING ONE
\r
1896 HRRZ TAC1,SETCNT(DEVDAT) ;PREPARE TO RESET DEVACC
\r
1898 ADDM TAC1,DEVACC(DEVDAT)
\r
1899 HRRM TAC,SETCNT(DEVDAT) ;RESET SETCNT
\r
1900 JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE
\r
1902 ;THE DESIRED POINTER IS BEFORE THE CURRENT ONE. SEE IF IT IS IN CORE.
\r
1904 DFSET6: SUBI TAC1,PTR1(DEVDAT)
\r
1907 JRST DFSET5 ;POINTER IS IN CORE
\r
1909 ;THE DESIRED BLOCK IS BEFORE THE CURRENT ONE. SEARCH FROM THE BEGINNING.
\r
1911 MOVE TAC,DEVOAD(DEVDAT) ;ARE POINTERS IN CORE SAME AS ON DISC?
\r
1913 PUSHJ PDP,DFO4A ;NO, WRITE THEM OUT
\r
1914 HRRZ TAC,DEVEXT(DEVDAT) ;GET BLOCK# OF FIRST RIB
\r
1915 PUSHJ PDP,SETPTR ;READ FIRST RIB
\r
1916 DFSETB: MOVEI TAC,1 ;RESET SETCNT
\r
1917 HRRM TAC,SETCNT(DEVDAT) ;"POSITIONED" AT RELATIVE BLOCK 1
\r
1919 DFSETC: HRRZ TAC,DSKBUF(DEVDAT) ;LSET TAC TO FIRST POINTER
\r
1920 PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK?
\r
1923 ADDI TAC,DIRSIZ ;YES, SKIP OVER 4 WORDS
\r
1924 HLRZ DAT,@TAC1 ;BLOCK FULL?
\r
1926 JUMPN DAT,DFSETD ;YES
\r
1927 SKIPN @TAC1 ;NO. MOVE TAC1 TO LAST POINTER
\r
1930 DFSETD: HRRZ AC1,SETCNT(DEVDAT)
\r
1931 SUBI AC1,(TAC) ;IS DESIRED POINTER HERE?
\r
1937 ADDI AC2,1 ;NO. GET NEXT BLOCK
\r
1938 HRRM AC2,SETCNT(DEVDAT)
\r
1939 JUMPE DAT,DFSET8 ;ANY MORE POINTER BLOCKS?
\r
1940 MOVSM DAT,DEVBLK(DEVDAT) ;YES, SET UP TO READ NEXT BLOCK.
\r
1944 ;THE BLOCK CONTAINING THE POINTER IS FOUND.
\r
1945 DFSET7: HRRZ TAC,UUO ;RESET RIGHT HALF OF DEVBLK
\r
1947 HRRZ TAC1,DSKBUF(DEVDAT)
\r
1949 HRRM TAC,DEVBLK(DEVDAT)
\r
1951 HRRM UUO,SETCNT(DEVDAT) ;RESET SETCNT
\r
1952 PUSHJ PDP,DFIN4 ;GET POINTERS
\r
1953 JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE
\r
1955 ;RAN OUT OF POINTERS
\r
1957 DFSET8: ADDI TAC1,1
\r
1958 HRRZ TAC,DSKBUF(DEVDAT)
\r
1960 HRRM TAC1,DEVBLK(DEVDAT)
\r
1961 TLO IOS,NMP!IOEND ;SET END
\r
1962 MOVEM IOS,DEVIOS(DEVDAT)
\r
1963 PUSHJ PDP,DFO6A ;CLEAR POINTERS
\r
1964 JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE
\r
1966 SUBTTL INPUT/OUPUT UUO'S. RETRIEVAL POINTER PROCESSING
\r
1968 ;* INDICATES INTERRUPT LEVEL
\r
1972 DFIN: TLNN DEVDAT,LOOKB ;FILE OPEN?
\r
1973 JRST DFERR2 ;NO, UNDEFINED FILE
\r
1974 TLZ IOS,IO ;SET INPUT INDICATOR
\r
1976 DFIN1: TLNE IOS,LIR ;*ANY MORE INPUT?
\r
1977 POPJ PDP, ;*NO, LEAVE
\r
1979 HRRZ TAC1,DEVACC(DEVDAT) ;*
\r
1980 CAILE TAC1,PTRN(DEVDAT) ;*POINTER LIST EMPTY?
\r
1982 SKIPN @TAC1 ;*NO--END OF FILE?
\r
1985 CAIN TAC1,PTRN(DEVDAT) ;*NO--IS THIS THE LAST POINTER ?
\r
1988 DFIN1D: SKIPN 1(TAC1) ;*NO
\r
1989 TLO IOS,LIR ;*SET LAST INPUT FLAG
\r
1990 DFIN1A: MOVEM IOS,DEVIOS(DEVDAT) ;*
\r
1993 DFIN1E: TLO IOS,LIR ;*EMPTY FILE
\r
1994 MOVEM IOS,DEVIOS(DEVDAT) ;*
\r
1997 DFIN1B: TLNE IOS,NMP ;*ANY MORE POINTERS ON DISK?
\r
1998 TLO IOS,LIR ;*NO, THIS IS THE LAST READ
\r
2001 DFIN2: MOVEM IOS,DEVIOS(DEVDAT)
\r
2002 PUSHJ PDP,SETBFI ;CHOOSE NEXT INPUT BUFFER TO HOLD RETRIEVAL POINTERS
\r
2003 PUSHJ PDP,GETPTR ;READ RIB COPY POINTERS INTO DDB
\r
2004 HRRZ TAC1,DEVACC(DEVDAT)
\r
2007 ;NEED NEW POINTER FROM DISK
\r
2009 GETPTR: MOVE AC2,DEVOAD(DEVDAT) ;POINTERS DIFFER?
\r
2011 JRST DFO4A ;YES, WRITE THEN READ AND RETURN
\r
2012 PUSHJ PDP,RRI ;NO, READ BLOCK
\r
2014 DFIN4: MOVEI AC2,PTR1(DEVDAT) ;RESET DEVACC
\r
2015 HRRM AC2,DEVACC(DEVDAT)
\r
2016 MOVE TAC,DEVBLK(DEVDAT) ;RESET DEVBKO
\r
2017 MOVEM TAC,DEVBKO(DEVDAT) ;BLOCK # WORD INDEX OF A CURRENT RETRIEVAL PACKET
\r
2018 GTPTR1: PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD OF RIB
\r
2019 MOVE IOS,DEVIOS(DEVDAT)
\r
2020 HRRZ AC3,DEVBLK(DEVDAT) ;WORD INDEX OF RETRIEVAL POINTER PACKET
\r
2021 ADD AC3,TAC1 ;AC3 POINTS TO NEXT POINTER WITHIN RIB
\r
2022 ADDI TAC1,BLKSIZ-2 ;TAC1 POINTS TO WORD 127
\r
2024 MOVEI AC1,PTRN(DEVDAT) ;DDB END CHECK
\r
2025 DFIN5: CAML AC3,TAC1 ;POINTER BLOCK EMPTY?
\r
2027 JRST DFIN7 ;YES, GET SOME MORE
\r
2029 MOVE TAC,@AC3 ;GET RETRIEVAL POINTER
\r
2030 MOVEM TAC,@AC2 ;STASH IN DDB
\r
2032 JUMPE TAC,DFIN8A ;0 MEANS NO MORE RETRIEVAL POINTERS
\r
2033 CAIE AC1,(AC2) ;DDB FULL?
\r
2034 AOJA AC2,DFIN5 ;NO, GET ANOTHER
\r
2036 CAML AC3,TAC1 ;YES, ANY MORE FOR NEXT TIME?
\r
2037 HLLZS @AC3 ;END OF RIB REACHED. ACE(LH) IS LINK NEXT RIB
\r
2038 SKIPN @AC3 ;NEXT POINTER=0 OR LINK=0.
\r
2039 TLO IOS,NMP ;SET "NO MORE POINTER"
\r
2041 DFIN6A: MOVEM IOS,DEVIOS(DEVDAT)
\r
2042 MOVE TAC1,DSKBUF(DEVDAT);POINT TO FIRST WORD OF RIB
\r
2043 SUBI AC3,(TAC1) ;COMPUTE NEW INDEX
\r
2044 HRRM AC3,DEVBLK(DEVDAT) ;STORE INDEX TO NEXT RETRIEVAL POINTER PACKET
\r
2045 MOVSI AC1,PNTDIF ;CLEAR "POINTER DIFFER"
\r
2046 ANDCAM AC1,DEVOAD(DEVDAT) ;SINCE DDB IS COPY OF RETRIEVAL DATA.
\r
2049 DFIN7: HLRZ TAC,@TAC1 ;RIB LINK TO TAC RH
\r
2050 JUMPE TAC,DFIN8 ;DONE IF LINK=0
\r
2051 MOVSM TAC,DEVBLK(DEVDAT) ;SET BLOCK#, WORD INDE FOR NEXT PACKET
\r
2053 PUSHJ PDP,RRI ;READ THE RIB
\r
2056 DFIN8: MOVEM TAC,@AC2 ;0 WOTRD IS DOB MARKS END
\r
2057 DFIN8A: TLO IOS,NMP ;NO MORE POINTERS ON DISK
\r
2060 ;ENTER HERE AT INTERRUPT LEVEL TO READ ANOTHER BLOCK
\r
2062 DFINX: PUSHJ PDP,ADVBFF ;*ANY MORE EMPTY BUFFERS?
\r
2065 HRRZ TAC1,DEVACC(DEVDAT) ;*POINTER LIST EMPTY?
\r
2066 CAILE TAC1,PTRN(DEVDAT) ;*
\r
2069 JRST DFIN1 ;*NO,FILL NEXT ONE
\r
2073 EXTERNAL WSYNC,ADVBFE
\r
2075 DFOUT: TLNN DEVDAT,ENTRB ;FILE OPEN?
\r
2076 JRST DFERR2 ;NO, UNDEFINED FILE
\r
2077 TLO IOS,IO ;SET OUTPUT INDICATION
\r
2078 MOVEM IOS,DEVIOS(DEVDAT)
\r
2080 DFOUT1: HRRZ DAT,DEVACC(DEVDAT) ;*GET POINTER LOC
\r
2083 HRRZ TAC,DEVOAD(DEVDAT) ;*
\r
2084 ADD TAC,[XWD NBLKSZ,2] ;*
\r
2085 PUSHJ PDP,CHKSUM ;*
\r
2087 MOVSI TAC1,PNTDIF ;*
\r
2088 ORM TAC1,DEVOAD(DEVDAT) ;*
\r
2091 HRRZ TAC,@DAT ;*ALREADY HAVE A POINTER?
\r
2092 JUMPN TAC,DFOT3A ;*YES IF JUMP
\r
2093 CAIE DAT,PTRN(DEVDAT) ;*NO, CLEAR NEXT ONE?
\r
2094 SETZM 1(DAT) ;*YES
\r
2095 TLO IOS,NMP ;*SET "NO MORE POINTERS"
\r
2096 MOVEM IOS,DEVIOS(DEVDAT) ;*
\r
2097 MOVE TAC1,DEVOAD(DEVDAT) ;*POINT TO OUTPUT BUFFER
\r
2098 ADDI TAC1,1 ;*NOW TO WORD COUNT
\r
2099 HRRZ TAC1,@TAC1 ;*RETRIEVE WORD COUNT
\r
2100 PUSHJ PDP,UPDEVC ;*UPDATE DEVCNT
\r
2102 PUSHJ PDP,DFGETF ;*GET A FREE BLOCK
\r
2109 ORM TAC1,DEVOAD(DEVDAT)
\r
2112 DFOT3A: CAIE DAT,PRTN(DEVDAT) ;*LIST FULL?
\r
2113 JRST QOUT ;*NO, WRITE AND LEAVE
\r
2115 ;OUTPUT UUO CONTINUED.
\r
2116 ;WRITE OUT POINTER LIST.
\r
2118 PUSHJ PDP,SETBFO ;CHOOSE AN OUTPUT BUFFER TO READ RIB INTO
\r
2119 PUSHJ PDP,QOUT ;PUT REQUEST IN QUEUE
\r
2120 PUSHJ PDP,WSYNC ;WAIT TIL DATA WRITTEN
\r
2122 DFO4A: MOVE TAC,DEVBKO(DEVDAT) ;RESET DEVBLK TO REFER TO RETRIEVAL POINTERS
\r
2123 MOVEM TAC,DEVBLK(DEVDAT) ;NOW IN DDB
\r
2125 MOVE TAC,DEVOAD(DEVDAT) ;ANY POINTERS BEEN WRITTEN?
\r
2127 PUSHJ PDP,DFO7A ;NO, CREATE NEW BLOCK, SKIP NEXT INSTRUCTION.
\r
2128 PUSHJ PDP,RRI ;RED RETRIEVAL BLOCK
\r
2129 MOVEI AC3,PTR1(DEVDAT)
\r
2131 DFO4B: PUSHJ PDP,SET000 ;TAC1 POINTS TO RIB
\r
2132 HRRZ AC2,DEVBLK(DEVDAT) ;INDEX INTO RIB
\r
2133 ADD AC2,TAC1 ;ABSOLUTE POINTER INTO RIB
\r
2134 ADDI TAC1,BLKSIZ-2 ;END OF RIB DATA
\r
2135 DFOUT5: MOVE AC1,@AC3 ;GET RETRIEVAL POINTER FROM DDB
\r
2136 JUMPE AC1,DFOUT6 ;0 SIGNALS END
\r
2137 CAML AC2,TAC1 ;BLOCK FULL?
\r
2138 JRST DFOUT7 ;YES, WRITE IT OUT
\r
2139 MOVEM AC1,@AC2 ;STASH POINTER IN RIB
\r
2141 CAIE AC3,PTRN(DEVDAT) ;DONE?
\r
2144 DFOUT6: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO RIB
\r
2145 SUBI AC2,(TAC1) ;FROM INDEX
\r
2146 HRRM AC2,DEVBLK(DEVDAT) ;STORE INDEX TO RETRIEVAL POINTERS
\r
2147 MOVSI AC2,PNTDIF ;CLEAR "POINTERS DIFFER"
\r
2148 ANDCAM AC2,DEVOAD(DEVDAT)
\r
2149 PUSHJ PDP,WRI ;WRITE THE BLOCK
\r
2150 DFO6A: MOVEI TAC,PTR1(DEVDAT)
\r
2151 HRRM TAC,DEVACC(DEVDAT) ;DEVACC NOW POINTS TO FIRST POINTER IN DDB
\r
2152 SETZM @TAC ;CLEAR FIRST POINTER
\r
2153 TLNN IOS,NMP ;MORE POINTERS?
\r
2154 JRST DFIN4 ;YES, BRING THEM IN AND LEAVE
\r
2155 MOVE TAC,DEVBLK(DEVDAT)
\r
2156 MOVEM TAC,DEVBKO(DEVDAT) ;SAE BLOCK#,WORD INDEX OF CURRENT POINTER PACKET
\r
2159 DFO7A: MOVEM TAC,DEVOAD(DEVDAT) ;SAVE VRGPTR BIT
\r
2160 PUSHJ PDP,SET177 ;SET TAC1 TO WORD 128
\r
2161 SETZM @TAC1 ;CLEAR BLOCK# WORD
\r
2162 AOS (PDP) ;ALWAYS SKIP RETURN
\r
2163 PUSH PDP,AC3 ;BECAUSE ENTRY FROM NEWRIB PUSHES AC3
\r
2166 DFOUT7: PUSHJ PDP,NEWRIB
\r
2169 NEWRIB: PUSH PDP,AC3 ;CREATE A NEW RETRIEVAL BLOCK
\r
2170 PUSHJ PDP,SET176 ;SET TAC1 TO LINK WORD
\r
2171 HLLZ TAC,@TAC1 ;LINK TO NEXT POINTER BLOCK ALREADY PRESENT?
\r
2172 JUMPN TAC,DFOUT9 ;YES, WRITE CURRENT ONE AND READ NEXT ONE
\r
2173 PUSHJ PDP,DFGETF ;NO, GET A BLOCK FOR POINTER IN TAC
\r
2174 HLRZ AC3,DEVBLK(DEVDAT) ;BLOCK# OF CURRENT RIB
\r
2175 MOVSM TAC,DEVBLK(DEVDAT) ;STORE BLOCK#, INDEX FOR NEW BLOCK
\r
2176 PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127 AGAIN
\r
2177 HRLM TAC,@TAC1 ;LH LINKS TO NEW BLOCK
\r
2179 MOVE TAC,AC3 ;BLOCK# OF CURRENT BLOCK
\r
2180 PUSHJ PDP,WRIA ;WRITE THE BLOCK OUT
\r
2182 DFOUT8: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER CONTAINING RIB
\r
2184 TLNN IOS,UBFS ;DUMP MODE?
\r
2185 ADD TAC1,PROG ;NO, RELOCATE
\r
2186 MOVEI TAC,1(TAC1) ;DESTINATION
\r
2187 HRL TAC,TAC1 ;SOURCE
\r
2189 BLT TAC,BLKSIZ-3(TAC1) ;ZERO OUT FIRST 126 WORDS
\r
2190 MOVE TAC,BLKSIZ-1(TAC1) ;BLOCK# OF CURRENT RIB
\r
2191 HRRZM TAC,BLKSIZ-2(TAC1) ;SET "PREVIOUS" POINTER..CLEAR LINK TO NEXT
\r
2192 SETZM BLKSIZ-1(TAC1) ;CLEAR WORD 128.
\r
2194 DFO8A: POP PDP,AC3
\r
2197 DFOUT9: EXCH TAC,DEVBLK(DEVDAT) ;SAVE NEW BLOCK# INDEX. GET OLD BLOCK# INDEC
\r
2198 HLRZS TAC ;BLOCK# IN RH
\r
2199 PUSHJ PDP,WRIA ;WRITE THIS BLOCK OF POINTERS OUT
\r
2200 PUSHJ PDP,RRI ;READ NEXT BLOCK OF POINTERS IN
\r
2203 ;ENTER HERE AT INTERRUPT LEVEL TO WRITE ANOTHER
\r
2207 DFOUTX: PUSHJ PDP,ADVBFE ;*ANY MORE TO DO?
\r
2209 SKIPL DAREQ ;*DO NOT CONTINUE THIS OUTPUT AT INTERRUPT
\r
2210 POPJ PDP, ;* LEVEL IF THE DAWAIT RTN WOULD BE CALLED.
\r
2211 HRRZ TAC1,DEVACC(DEVDAT) ;*NEED TO WRITE POINTERS?
\r
2212 CAIL TAC1,PTRN(DEVDAT) ;*
\r
2214 HRRZ TAC,@SATPTR ;*CURRENT SAT BLOCK FULL?
\r
2215 TRNN TAC,WLBIT ;*OR WRITE-LOCKED?
\r
2216 CAIL TAC,NUMBIT+MJOBN ;*BE SURE TO LEAVE ATLEAST JOBN FREE BLOCKS
\r
2217 ; SO THAT EACH JOB CAN HAVE ONE MORE
\r
2221 PUSHJ PDP,DFOUT1 ;*
\r
2226 SUBTTL READ/WRITE RETRIEVAL POINTERS
\r
2227 ;INPUT RETRIEVAL BLOCK.
\r
2229 RRIB: SKIPA TAC,DEVEXT(DEVDAT) ;READ FIRST RETRIEVAL BLOCK
\r
2230 RRI: HLRZ TAC,DEVBLK(DEVDAT) ;READ NEXT RETRIEVAL BLOCK
\r
2231 RRIA: PUSHJ PDP,MQIN ;READ RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY
\r
2232 JRST RERA ;ERRORS, YOU LOSE
\r
2233 PUSHJ PDP,SET177 ;CHECK RH OF WORD 128
\r
2234 HLRZ TAC,DSKCNT(DEVDAT) ;BLOCK# EXPECTED
\r
2235 MOVE AC1,@TAC1 ;GET BLOCK# STORED IN RIB
\r
2236 CAIE TAC,(AC1) ;SAME?
\r
2237 JRST RERA ;IT WAS WRONG, YOU LOSE.
\r
2238 POPJ PDP, ;EVERYTHING OK.
\r
2240 ;OUTPUT A RETRIEVAL BLOCK.
\r
2242 WRIB: SKIPA TAC,DEVEXT(DEVDAT) ;WRITE FIRST RETRIEVAL BLOCK
\r
2243 WRI: HLRZ TAC,DEVBLK(DEVDAT) ;WRITE NEXT RETRIEVAL BLOCK
\r
2244 WRIA: PUSHJ PDP,SET177 ;WRITE RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY
\r
2245 HRRM TAC,@TAC1 ;STORE THIS BLOCK# IN WORD 128
\r
2247 SKIPN TAC ;ATTEMPTING TO WRITE RETRIEVAL INFORMATION
\r
2248 ; IN BLOCK NR 0 IS AN ERROR
\r
2249 HALT WERA ;CONTINUE WILL POINT ERROR MESSAGE
\r
2251 PUSHJ PDP,MQOUT ;WRITE IT,
\r
2253 POPJ PDP, ;NO, RETURN.
\r
2255 SET177: HRRZ TAC,DSKBUF(DEVDAT)
\r
2256 ADDI TAC1,BLKSIZ-1
\r
2257 S177A: TLNN IOS,UBFS
\r
2261 SET176: HRRZ TAC1,DSKBUF(DEVDAT)
\r
2262 ADDI TAC1,BLKSIZ-2
\r
2265 SET000: HRRZ TAC1,DSKBUF(DEVDAT)
\r
2269 ;PUT POINTER INFO IN DDB
\r
2270 ;ENTER WITH TAC CONTAINING THE BLOCK NUMBER OF THE POINTERS.
\r
2272 SETPTR: HRLZM TAC,DEVBLK(DEVDAT) ;XWD RIB#, 0...0 INDEX
\r
2273 ANDCM IOS,[XWD IOEND+NMP,IODEND]
\r
2274 MOVEM IOS,DEVIOS(DEVDAT)
\r
2275 PUSHJ PDP,SETBUF ;AQUIRE BUFFERE IN MONITOR STORAGE
\r
2276 PUSHJ PDP,RRI ;GET RETRIEVAL BLOCK
\r
2278 PUSHJ PDP,DFIN4 ;COPY POINTERS TO DDB
\r
2279 MOVEI AC3,FPNTR(DEVDAT) ;SET DEVACC TO SKIP FIRST 4 WORDS
\r
2280 HRRM AC3,DEVACC(DEVDAT)
\r
2283 ;RECLAIM STORAGE ON DISK.
\r
2284 ;ENTER WITH TAC POINTING TO FIRST RETRIEVAL BLOCK OF THE FILE
\r
2287 RECLAM: PUSHJ PDP,SETBUF ;FIND SPACE IN USER AREA
\r
2289 PUSHJ PDP,RECLM5 ;GET FIRST POINTER BLOCK
\r
2290 ADDI DAT,DIRSIZ ;SKIP OVER FIRST WORDS.
\r
2291 RECLM2: CAML DAT,TAC1 ;MORE POINTERS IN BLOCK?
\r
2292 PUSHJ PDP,RECLM4 ;NO. GET MORE
\r
2293 HRRZ TAC,@DAT ;FREE A DATA BLOCK
\r
2294 JUMPE TAC,CLRBUF ;EXIT WHEN A ZERO POINTER IS ENCOUNTERED
\r
2296 PUSHJ PDP,SETFRE ;FREE UP SPECIFIED BLOCK
\r
2298 AOJA DAT,RECLM2 ;GO BACK FOR MORE
\r
2300 RECLM4: HLRZ TAC,@TAC1 ;PICK UP POINTER TO NEXT BLOCK
\r
2301 JUMPE TAC,RECLM6 ;NO MORE, GO HOME.
\r
2302 RECLM5: PUSHJ PDP,RRIA ;READ IN A R.I. BLOCK.
\r
2304 HLRZ TAC,DSKCNT(DEVDAT) ;FREE THAT BLOCK
\r
2307 PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD
\r
2309 ADDI TAC,BLKSIZ-2 ;SET TAC1 TO WORD 127
\r
2312 RECLM6: POP PDP,TAC
\r
2313 JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE
\r
2317 EXTERNAL DAREQ,DAAVAL
\r
2319 DFREL: TLO DEVDAT,DSKRLB ;MARK RELEASE (VIA RESET UUO) IN PROGRESS.
\r
2320 PUSHJ PDP,DFCLSI ;CLOSE INPUT FIRST
\r
2321 PUSHJ PDP,DFCLSO ;THEN CLOSE OUPUT
\r
2322 ; SAME ORDER AS CLOSE AND RELEAS IN UUOCON
\r
2323 SKIPN SATCHG ;HAS SAT BLOCK BEEN MODIFIED?
\r
2324 JRST DFREL1 ;NO, SUPPRESS WRITING
\r
2325 PUSHJ PDP,UPDA ;SET DAREQ INTERLOCK WHILE WRITING SAT BLOCK
\r
2326 PUSH PDP,DSKBUF(DEVDAT)
\r
2327 PUSHJ PDP,SATWRT ;WRITE CURRENT SAT BLOCK
\r
2328 POP PDP,DSKBUF(DEVDAT)
\r
2329 PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK
\r
2330 DFREL1: TLZ DEVDAT,DSKRLB ;CLEAR RELEASE MARKER.
\r
2333 SUBTTL DISK SPACE ALLOCATION
\r
2334 ;DFGETF: GET A FREE DISK BLOCK
\r
2335 ;CALL: PUSHJ PDP,DFGETF
\r
2336 ; ... RETURNS WITH TAC:=LOGICAL BLOCK#
\r
2337 ; MAY NOT RETURN IF DISK IS FULL OR NEARLY FULL
\r
2339 EXTERNAL DAWAIT,DAAVAL,DAREQ,JOBN
\r
2342 DFGETF: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK
\r
2343 DFGTF1: PUSHJ PDP,SATGET ;FOCUS ON A NON-FULL SAT BLOCK
\r
2344 HRRZ AC1,SATPTR ;POINT TO 3 WORD SAT ENTRY
\r
2345 MOVE AC2,SATBK2 ;XWD -L, POINTER TO SAT ENTRY
\r
2346 MOVEI ITEM,1 ;REQUEST 1 BLOCK
\r
2347 PUSHJ PDP,GETBIT ;RETURNS BIT# IN TAC1 (IN RANGE 1 TO NUMBLK)
\r
2348 JRST DFGTF2 ;FULL AFTER ALL
\r
2349 SETOM SATCHG ;SHOW SAT BLOCK IN CORE NOT = DISK COPY
\r
2350 AOS TAC,@SATPTR ;COUNT ANOTHER BLOCK USED
\r
2351 HLRZS TAC ;FIRST LOGICAL BLCOK# REPRESENTED BY SAT BLOCK
\r
2352 ADDI TAC, -1(TAC1) ;FORM LOGICAL BLOCK#
\r
2353 DOWNDA: SOSL DAREQ ;THIS EXITING ROUTINE TURNS OFF DAREQ INTERLOCK
\r
2354 ; THUS MAKING NON-SHARABLE SECTIONS OF CODE
\r
2355 ; AVAILABLE TOTHE NEXT USER IN THE QUEUE
\r
2358 MOVEM IOS,DEVIOS(DEVDAT)
\r
2361 DFGTF2: MOVEI TAC,NUMBIT ;BITS/SAT BLOCK
\r
2362 HRRM TAC,@SATPTR ;MARK SAT ENTRY FULL
\r
2365 ;UPDA - TURN ON THE DISK ALLOCATION INTERLOCK (DAREQ)
\r
2366 ; - A CALL TO UPDA MUST PRECEDE SAT BLOCK MANIPULATIONS
\r
2367 UPDA: AOSE DAREQ ;INCREMENT COUNT OF USERS REQUESTING DISK ALLOCATION
\r
2368 PUSHJ PDP,DAWAIT ;WAIT UNTIL JOB REACHES TOP OF QUEUE
\r
2370 MOVEM IOS,DEVIOS(DEVDAT) ;MAKE THIS JOB AS USING SAT BLOCK
\r
2373 ;SATGET - FIND A NON-FULL SAT BLOCK FOR DFGTF OR DUMP MODE OUTPUT.
\r
2374 ; CONSIDER DISK FULL WHEN FEW BLOCKS REMAIN FREE UNLESS THE USER
\r
2375 ; IS LOGGING IN OR USING A NON-SHARABLE RESOURCE.
\r
2377 EXTERNAL JBTSTS,HNGSTP
\r
2379 SATGET: SETZ AC1, ;CLEAR COUNT
\r
2380 HRRZ TAC,@SATPTR ;BLOCKS USED IN CURRENT SAT BLOCK
\r
2381 TRNN TAC,WLBIT ;WRITE LOCKED?
\r
2382 PUSHJ PDP,SATCNT ;NO. COUNT # FREE
\r
2383 CAIL AC1,JOBN ;IS THER ENOUGH SPACE?
\r
2384 POPJ PDP, ;YES - USE IT.
\r
2385 SETZ AC1, ;CLEAR COUNT
\r
2386 MOVEI TAC1,SATENT ;START WITH FIRST SAT ENTRY
\r
2387 SATGT1: HRRZ TAC, 0(TAC1) ;GET WLBIT + BLOCKS USED
\r
2388 TRNN TAC,WLBIT ;WRITE LOCKED?
\r
2389 PUSHJ PDP,SATCNT ;NO. COUNT # FREE
\r
2390 ADDI TAC1,SENTSZ ;NEXT SAT ENTRY
\r
2391 CAIL AC1,JOBN ;ENOUGH SPACE ACCUMULATED?
\r
2393 JRST SATGT2 ;YES - READ A SAT BLOCK
\r
2394 CAIGE TAC1,SATTOP ;END OF ENTRIES?
\r
2395 JRST SATGT1 ;NO. CONTINUE
\r
2396 JUMPE AC1,DSKFUL ;IF NONE FOUND DISK IS REALLY FULL
\r
2398 ;THERE ARE JOBN OR FEWER DISK BLOCKS AVAILABLE.
\r
2399 ;GIVE THEM OUT ONLY IN HARDSHIP CASES
\r
2401 MOVE TAC,JBTSTS(TAC)
\r
2402 TLNN TAC,JACCT ;IS THIS USER LOGGING IN?
\r
2403 TLNE IOS,UBFS+AUFLG ;DOES USER HAVE MONITOR BUFFER OR IS HE ALTERING UFD?
\r
2404 JRST SATGT2 ;YES TO EITHER. GIVE HIM A BLOCK ANYWAY.
\r
2405 DSKFUL: TLNE IOS,UBFS+AUFLG
\r
2406 JRST DFERR1 ;NON-RECOVERABLE ERROR IF USING BUFFER OR ALTERING UFD
\r
2408 PUSHJ PDP,DOWNDA ;RESET ALLOCATION INTERLOCK
\r
2409 PUSHJ PDP,HNGSTP ;PRINT "DSK OK?"
\r
2410 PUSHJ PDP,UPDA ;IF USER TYPE "CONT" WE TRY AGAIN
\r
2413 SATGT2: MOVE TAC1,SATPIK ;POINT TO ENTRY OF NON-FULL SAT BLOCK
\r
2414 JRST SATRD ;READ IN SAT BLOCK
\r
2416 SATCNT: CAIE TAC,NUMBIT ;IS ENTRY FULL?
\r
2417 MOVEM TAC1,SATPIK ;NO. SAVE POINTER TO A NON-FULL ENTRY
\r
2418 ADDI AC1,NUMBIT ;MAXIMUM NUMBER
\r
2419 SUB AC1,TAC ;LESS NUMBER USED
\r
2422 ;SETFRE - RETURN A DISK BLOCK TO AVAILABLE STORAGE
\r
2423 ;CALL TAC:=LOGICAL BLOCK L
\r
2424 ; PUSHJ PDP,SETFRE
\r
2427 INTERNAL SETFRE,FTRCHK
\r
2429 SETFRE: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK
\r
2433 SKIPE TAC ;BLOCK 0 SHOULD NEVER BE CLEARED
\r
2434 CAMLE TAC,LBHIGH ;BLOCK # TOO LARGE
\r
2435 HALT DOWNDA ;YES, HALT. CONTINUE WILL COUNT DOWN DAREQ.
\r
2437 HLRZ AC1,@SATPTR ;GET LOGICAL BLOCK# FOR B0 OF CURRENT SAT BLOCK
\r
2438 CAML TAC,AC1 ;IS L LESS THAN FIRST BLOCK REPRESENTED?
\r
2439 CAIL TAC,NUMBLK(AC1) ;IS L LESS THAN LAST BLOCK REPRESENTED
\r
2440 SKIPA ;OUTSIDE RANGE
\r
2441 JRST SETFR2 ;IN RANGE
\r
2442 MOVEI TAC1,SATENT ;INITIALIZE POINTER
\r
2444 SETFR1: ADDI TAC1,SENTSZ ;INCREMENT POINTER
\r
2445 HLRZ AC1,@TAC1 ;GET LOGICAL BLOCK FOR B0 OF SAT BLOCK
\r
2446 CAML TAC,AC1 ;IS L LESS THEN FIRST BLOCK?
\r
2447 CAIL TAC,NUMBLK(AC1) ;IS L LESS THEN LAST BLOCK?
\r
2448 JRST SETFR1 ;OUT-OF-RANGE, TRY NEXT
\r
2449 PUSH PDP,TAC ;SAVE BLOCK#
\r
2450 PUSHJ PDP,SATRD ;READ SAT BLOCK FOR ENTRY POINTED TO BY TAC1
\r
2451 POP PDP,TAC ;RESTORE BLOCK#
\r
2453 SETFR2: SUB TAC,AC1 ;FROM BIT# (IN RANGE 0 TO NUMBLK-1)
\r
2454 HRRZ AC1,SATPTR ;POINT TO 3 WORD ENTRY
\r
2455 MOVE AC2,SATBK2 ;XWD -L, POINTER TO SAT BLOCK
\r
2456 MOVEI ITEM,1 ;RETURN 1 BIT
\r
2458 SOS @SATPTR ;DECREMENT BLOCKS USED
\r
2459 SETOM SATCHG ;SAT BLOCK IN CORE NOT = DISK COPY
\r
2460 JRST DOWNDA ;REMOVE ALLOCATION INTERLOCK AND EXIT.
\r
2462 ;NOTE: SATRD USES TEMPORARY STORAGE LOCATIONS SATTMP AND SATTEM TO HELP AVOID
\r
2463 ; A PDL OVRFLW PROBLEM. IT CAN DO SO BECAUSE IT IS NOT RE-ENTRANT, I.E., ONLY
\r
2464 ; ONE USER AT A TIME MAY PASS THROUGH HERE BECAUSE OF THE DAREQ INTERLOCK.
\r
2466 SATRD: MOVEM TAC1,SATTMP ;SAVE POINTER TO DESIRED SAT ENTRY.
\r
2467 MOVE TAC1,DSKBUF(DEVDAT) ;ALSO SAVE IOWD FROM THE DDB
\r
2469 SKIPE SATCHG ;HAS COPY IN CORE BEEN MODIFIED?
\r
2470 PUSHJ PDP,SATWRT ;YES, WRITE IT.
\r
2471 MOVE TAC,SATTMP ;RETRIEVE SAT POINTER FOR SAT BLOCK TO BE READ IN.
\r
2473 PUSHJ PDP,SATBLK ;COMPUTE BLOCK#, IOWD
\r
2474 TLO IOS,NORELB ;NO RELOCATION
\r
2475 PUSHJ PDP,MQIN ;READ THE BLOCK
\r
2477 MOVE TAC1,SATTEM ;RESTORE SAVED IOWD TO DDB
\r
2478 MOVEM TAC1,DSKBUF(DEVDAT)
\r
2481 SATWRT: TLO IOS,NORELB ;NO RELOCATION
\r
2482 PUSHJ PDP,SATBLK ;COMPUTE BLOCK# IOWD
\r
2483 PUSHJ PDP,MQOUT ;WRITE BLOCK
\r
2485 SETZM SATCHG ;SHOW COPY IN CORE = BLOCK ON DISK
\r
2486 SATW1: MOVSI IOS,NORELB ;RESET BIT
\r
2487 ANDCAB IOS,DEVIOS(DEVDAT)
\r
2490 ;SET UP TAC AND TAC1 FOR READ OR WRITE OF SAT BLOCK
\r
2492 SATBLK: MOVE TAC,SATPTR
\r
2497 MOVEM TAC1,DSKBUF(DEVDAT)
\r
2500 SUBTTL "FREE" CORE ALLOCATION
\r
2501 ;CLEAR OUT DDB AT RELEASE TIME
\r
2505 CLRDDB: MOVEI TAC,DSKDDB ;POINT TO PROTOTYPE DDB
\r
2506 CLRDB1: MOVE TAC1,TAC ;COPY LINK TO TAC1
\r
2507 HLRZ TAC,DEVSER(TAC1) ;GET LINK TO NEXT DDB
\r
2508 JUMPE TAC,CPOPJ ;0 MEANS END
\r
2509 CAIE TAC,(DEVDAT) ;OWNED BY CURRENT USER?
\r
2512 MOVE AC1,DEVSER(TAC) ;GET LINK FROM THIS DDB
\r
2513 HLLM AC1,DEVSER(TAC1) ;STORE IN PREVIOUS DDB TO REMOVE THIS ONE
\r
2514 HRRZ ITEM,DDBPTR ;GET INTERRUPT LEVEL POINTER
\r
2515 CAIN ITEM,0(TAC) ;POINTED TO DISCARDED DDB?
\r
2516 MOVSM AC1,DDBPTR ;YES. BYPASS DISCARDED DDB
\r
2519 JRST CLCOR1 ;DELETE FREE STORAGE.
\r
2521 ;BUILD A DISK DEVICE DATA BLOCK AND ASSIGN IF LOGICAL NAME GIVEN.
\r
2522 ;THIS IS DONE AT INIT TIME.
\r
2526 SETDDB: PUSH PDP,ITEM ;SAVE AC'S USED BY SETDDB
\r
2528 MOVE TAC1,DEVMOD(DEVDAT)
\r
2529 TRNE TAC1,ASSPRG ;HAS AN INIT BEEN DONE?
\r
2530 JRST SETDD0 ;YES. MUST COPY PROTOTYPE DDB
\r
2531 HRRZ TAC1,DEVDAT ;GET ADDRESS OF DDB
\r
2532 CAIE TAC1,DSKDDB ;IS IT PROTOTYPE?
\r
2533 JRST SETDD1 ;NO. WE ALREADY HAVE A DDB
\r
2534 SETDD0: MOVEI ITEM,DSKCOR ;GET SOME FREE CORE
\r
2536 PUSHJ PDP,GTCOR1 ;GET SPACE FOR DDB
\r
2537 HRR DEVDAT,TAC1 ;DEVDAT POINTS TO ASSIGNED CORE
\r
2538 HRLI TAC1,DSKDDB ;SOURCE, DESTINATION
\r
2539 BLT TAC1,PTR1(DEVDAT) ;COPY PROTOTYPE DDB INTO MONITOR CORE
\r
2540 MOVEI TAC1,DSKDDB ;TAC1 POINTS TO PROTOTYPE
\r
2541 ; LINK PROTOTYPE DDB TO COPY
\r
2542 ; COPY ALREADY LINKS WHERE PROTOTYPE DID
\r
2543 HRLM DEVDAT,DEVSER(TAC1)
\r
2545 SETDD1: POP PDP,TAC1
\r
2549 ;SET TAC1 TO SOME AREA FOR BUFFER.
\r
2550 ;GET BUFFER SPACE FROM USER INPUT OR OUTPUT RING IF AVAILABLE
\r
2551 ;ASSIGN FROM MONITOR CORE AS A LAST RESORT.
\r
2552 ;SET DSKBUF(DEVDAT) TO POINT TO BUFFER.
\r
2554 EXTERNAL PIOMOD,UADRCK,JOBFF
\r
2556 SETBUF: TLNE IOS,UBFS ;HAVE ONE IN FREE STORAGE?
\r
2557 POPJ PDP, ;YES, LEAVE
\r
2558 LDB TAC1,PIOMOD ;NO. DUMP MODE?
\r
2560 TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS ?
\r
2561 JRST SETBF6 ;YES TO EITHER QUESTION
\r
2563 TLNN DEVDAT,INBFB ;INBUF DONE YET?
\r
2565 SETBFI: HRRZ TAC1,DEVIAD(DEVDAT) ;CALL HERE FROM INPUT - RING KNOWN TO BE AVAILABLE
\r
2568 SETBF1: TLNN DEVDAT,OUTBFB ;OUTPUT DONE YET?
\r
2570 SETBFO: HRRZ TAC1,DEVOAD(DEVDAT) ;CALL HERE FROM OUTPUT - RING KNOWN TO BE AVAILABLE
\r
2572 SETBF2: MOVE TAC1,2(TAC1)
\r
2574 HRRZ AC1,TAC1 ;ADDRESS CHECK LOW END
\r
2576 MOVEI AC1,BLKSIZ-1(TAC1)
\r
2578 TLO IOS,UBFU ;BUFFER IN USER AREA
\r
2579 SETBF5: HRLI TAC1,NBLKSZ
\r
2580 MOVEM TAC1,DSKBUF(DEVDAT)
\r
2581 MOVEM IOS,DEVIOS(DEVDAT)
\r
2583 ;DUMP MODE, USE AREA IN FREE STORAGE.
\r
2585 SETBF6: AOSE MQREQ
\r
2587 TLO IUOS,UBFU ;BUFFER IN MONITOR CORE
\r
2588 MOVEI TAC1, MONBUF ;TAC1 POINTS TO MONITOR BUFFER
\r
2591 ;CLEAR THE BUFFER IN FREE STORAGE IF THERE.
\r
2593 EXTERNAL BUFCLR,JOBFF,IADRCK
\r
2595 TLZN IOS,DAFLG ;USING SAT BLOCK?
\r
2597 SOSL DAREQ ;YES. RELEASE
\r
2599 TLZN IOS,AUFLG ;USING UFD?
\r
2601 SOSL AUREQ ;YES. RELEASE UFD
\r
2603 TLZN IOS,UBFS ;USING MONITOR BUFFER?
\r
2605 SOSL MQREQ ;YES, RELEASE MONITOR BUFFER
\r
2607 TLZ IOS,NCTRLC ;RENABLE ^C
\r
2608 TLZE IOS,UBFU ;USING BUFFER IN USER AREA
\r
2609 JRST CLRBF1 ;YES. CLEAR BUFFER
\r
2610 MOVEM IOS,DEVIOS(DEVDAT)
\r
2613 ;CLEAR USER BUFFER AFTER USING
\r
2615 CLRBF1: MOVEM IOS,DEVIOS(DEVDAT)
\r
2616 HRRZ TAC,DSKBUF(DEVDAT) ;GET LOC. OF BUFFER
\r
2617 CAML TAC,JOBFF(JDAT) ;ABOVE JOBFF>
\r
2618 POPJ PDP, ;NO. RETURN.
\r
2621 SUBI TAC,2 ;SET TAC TO 2ND BUFFER WORD
\r
2622 SOS (PDP) ;BUFCLR WILL SKIP RETURN
\r
2623 JRST BUFCLR ;CLEAR THE BUFFER
\r
2625 ;FIND THE FIRST ZERO IN A SET OF WORDS
\r
2626 ;ENTER WITH LH OF TAC SET TO NEGATIVE OF NUMBER OF WORDS.
\r
2627 ; RH OF TAC CONTAINING ADDRESS OF FIRST WORD.
\r
2628 ;CALL: PUSHJ PDP,GETZER
\r
2631 ;NORMAL EXIT LEAVES TAG POINTING TO WORD CONTAING THE ZERO.
\r
2632 ;AND TAC1 HAVING A 1-BIT IN THE POSITION OF THE ZERO.
\r
2634 ;ENTER AT GETZR1 IF TAC1 IS ALL SET UP.
\r
2635 ;CALLED AT UUO AND INTERRUPT LEVELS
\r
2637 GETZER: MOVNI DAT,1
\r
2640 GETZ1: ROT TAC1,-1
\r
2643 GETZ2: AOBJP TAC,CPOPJ
\r
2647 GETZ3: TONE TAC1,(TAC)
\r
2651 ;TIMING: M=NUMBER OF LEADING WORDS CONTAINING NO ZEROS
\r
2652 ; M=NUMBER OF LEADING ONES IN M+1ST WORD
\r
2654 ; 38+12,8M+17.1N MIRCO-SECS
\r
2656 ;WORST CASE WITH 128 WORDS = 2.3 MILS
\r
2659 ;FIND THE NUMBER OF ZERO BITS TO THE RIGHT OF A WORD
\r
2660 ;CONTAINING A SINGLE 1-BIT
\r
2661 ;ENTER WITH BIT IN TAC1, EXIT WITH RESIDUE IN TAC1.
\r
2662 ;CALLED AT UUO AND INTERRUPT LEVELS
\r
2664 RESIDU: TLNN TAC1,777000
\r
2668 RESID1: TLO TAC1,32000
\r
2674 ;FIND FOUR FREE WORDS OF CORE, RETURN AN ADDRESS IN TAC1
\r
2675 ;IT IS ASSUMED THAT THE CLOCK IS OFF.
\r
2679 GETFCR: MOVEI ITEM,1 ;REQUEST ONE 4 WORD BLOCK
\r
2680 GTCOR1: MOVEI AC1,LOCORE ;POINT TO THREE WORD FREE CORE ENTRY
\r
2681 MOVEI AC2,DDBTAB ;POINT TO BIT TABLE
\r
2683 PUSHJ PDP,GETBIT ;FIND A HOLE
\r
2684 JRST DFERR9 ;THERE ARE NONE
\r
2686 LSH TAC1,2 ;MULTIPLY BIT# BY 4
\r
2687 SUBI TAC1,4 ;SYNCHRNIZE
\r
2688 ADD TAC1,LOCORE ;FORM CORE ADDRESS
\r
2694 ;SEARCH THROUGH A TABLE TO FIND A SERIES OF ZERO-BITS.
\r
2695 ;ENTER WITH AC1 SET UP AS IN CLRBIT ROUTINE, C(ITEM) SET TO THE
\r
2696 ; SIZE HOLD DESIRED,
\r
2697 ;CALLED AT UUO AND INTERRUPT LEVELS
\r
2698 ;ON UNSUCCESSFUL RETURN DAT CONTAINS THE SIZE
\r
2699 ;OF LARGETS HOLE ENCOUNTERED
\r
2701 GETBIT: PUSH PDP,[-1] ;INITIALIZE LARGEST HOLD FOUND SO FAR
\r
2702 PUSH PDP,ITEM ;SAVE HOLD SIZE
\r
2703 MOVE TAC,2(AC1) ;TAC:=IOWD LENGTH OF TABLE,TABLE ADDRESS
\r
2705 PUSHJ PDP,GETZER ;FIND THE FIRST ZERO
\r
2706 JRST GTBIT5 ;NO ZEROS LEFT
\r
2707 MOVEM TAC1,1(AC1) ;SAVE THE SPOT
\r
2713 GTBIT1: AOS DAT ;INCREMENT SIZE OF HOLD BY 1 (GETZER LEFT DAT=-1)
\r
2714 SOJLE ITEM,GTBIT2 ;FOUND ENOUGH?
\r
2717 AOBJP TAC,GTBT1A ;JUMP IF TABLE EXHAUSTED
\r
2718 TDNN TAC1,(TAC) ;IS NEXT BIT ZERO?
\r
2719 JRST GTBIT1 ;YES, CONTINUE
\r
2721 GTBT1A: CAMLE DAT,-3(PDP) ;NO. LARGEST HOLE SO FAR?
\r
2722 MOVEM DAT,-3(PDP) ;YES. SAVE SIZE
\r
2723 JUMPG TAC,GTBIT6 ;TABLE EXHAUSTED? IF SO, ERROR EXIT.
\r
2724 PUSHJ PDP,GETZER ;NO, TRY FURTHER ON
\r
2725 JRST GTBIT6 ;NO MORE, ERROR
\r
2731 GTBIT2: MOVE TAC1,(PDP) ;HOLE FOUND, SET BITS TO ONES
\r
2735 GTBIT3: ORM TAC1,(TAC)
\r
2738 JUMPGE TAC1,GTBIT3
\r
2739 AOBJN TAC,GTBIT3 ;THIS SHOULD ALWAYS JUMP
\r
2741 GTBIT4: POP PDP,TAC1
\r
2749 GTBIT5: POP PDP,ITEM
\r
2750 POP PDP,DAT ;SIZE OF LARGEST HOLD FOUND IF UNSUCCESSFUL
\r
2753 GTBIT6: POP PDP,TAC
\r
2755 AOS -1(PDP) ;SIZE OF LARGEST HOLD MUST BE ADJUSTED
\r
2758 ;FREE A FOUR WORD SECTION OF CORE.
\r
2759 ;ENTER WITH ADDRESS IN TAC
\r
2763 CLRCOR: MOVEI ITEM,1
\r
2764 CLCOR1: SUB TAC,LOCORE
\r
2767 MOVE AC2,CRINIT ;SEARCH FROM BEGINNING
\r
2769 ;CLEAR A SERIES OF BITS IN SOME TABLE
\r
2770 ;ENTER WITH: C(TAC) SET TO A BIT NUMBER
\r
2771 ; C(AC1) SET TO EITHER A SAT ENTRY OR FREE
\r
2773 ; C(AC2) SET TO BEGINNING OF TABLE (IOWD FORM)
\r
2774 ; C(ITEM) SET TO NUMBER OF BITS TO CLEAR
\r
2775 ;EXIT WITH CORRECT BITS SET TO ZERO AND SET ENTRY OR FREE CORE
\r
2776 ; ENTRY UPDATED IF NECESSARY.
\r
2780 CLRBIT: IDIVI TAC,^D36
\r
2781 HRLS TAC ;BOTH HALVES OF TAC CONTAIN
\r
2792 CLRB4: ANDCAM TAC1,(TAC) ;CLEAR A BIT
\r
2793 SOJLE ITEM,CLRB5 ;IS THAT ALL?
\r
2796 AOBJN TAC,CLRB4 ;THIS SHOULD ALWAYS JUMP
\r
2798 CLRB5: POP PDP,TAC1
\r
2800 CAMLE TAC,2(AC1) ;NEED TO RESET?
\r
2808 CLRB2: MOVEM TAC1,1(AC1)
\r
2809 CLRB3: MOVEM TAC,2(AC1)
\r
2812 SUBTTL QUEUEING AND INTERRUPT PROCESSING
\r
2813 ;PUT A REQUEST IN THE USER QUEUE.
\r
2814 ;ENTER AT QIN FOR INPUT. QOUT FOR OUTPUT.
\r
2815 ;CALLED AT BOTH INTERRUPT AND UUO LEVELS
\r
2817 EXTERNAL SETACT,CPOPJ
\r
2819 QIN: SKIPA TAC1,DEVDAT ;*
\r
2820 QOUT: MOVEI TAC1,DEVOAD-DEVIAD(DEVDAT) ;*
\r
2822 MOVEI TAC,TRIES ;*INITIALIZE ERROR COUNT
\r
2823 MOVEM TAC,DSKCNT(DEVDAT) ;*
\r
2824 PUSHJ PDP,SETACT ;*SET IOACT
\r
2825 MOVSI TAC,W8BIT ;*SET WAIT FLAG
\r
2826 ORM TAC,DEVIAD(TAC1)
\r
2828 AOS USRCNT ;*INCREMENT COUNTER OF TRANSFER REQUESTS
\r
2831 EXCH DAT,DFBUSY ;*
\r
2832 JUMPN DAT,QIOEND ;*JUMP IF DISK BUSY
\r
2834 ANDCAM TAC,DEVIAD(TAC1) ;*
\r
2835 CAME TAC1,DEVDAT ;*
\r
2837 PUSHJ PDP,USRGO ;*
\r
2839 QIOEND: SCHEDULE ;*
\r
2843 ;PUT A REQUEST IN THE MONITOR QUEUE.
\r
2844 ;ENTER AT MQIN FOR INPUT, MQOUT FOR OUTPUT.
\r
2845 ;ENTER WITH C(TAC1 0-17) = -SIZE OF BLOCK
\r
2846 ; C(TAC1 18-35) = CORE ADDRESS
\r
2847 ; C(TAC 18-35) = LOGICAL BLOCK NUMBER
\r
2849 INTERNAL MQIN,MQOUT
\r
2850 EXTERNAL MQREQ,MQWAIT,SETACT,MQUEUE,WSYNC
\r
2852 MQIN: HRLZ TAC1,DEVDAT
\r
2853 TLOA TAC1,400000 ;BIT 0=1 IS READ INDICATOR
\r
2854 MQOUT: HRLZ TAC1,DEVDAT
\r
2856 TRNN TAC,-1 ;WRITING OR READING BLOCK NR 0 SHOULD NEVER OCCUR HERE
\r
2858 HALT .+1 ;CONTINUING AFTER HALT WILL YIELD INFORMATION
\r
2859 ; LOSS ON THE DISK
\r
2863 MOVSM TAC,DSKCNT(DEVDAT);STASH AWAY BLOCK #, ERROR COUNT.
\r
2864 PUSHJ PDP,SETACT ;SET IOACT
\r
2866 TLNN IOS,UBFS+NORELB ;USING BUFFER IN FREE STORAGE?
\r
2867 HRR TAC1,PROG ;NO, RELOCATE
\r
2870 AOS AC1,MIPTR ;RING INDEX MIPTR
\r
2876 EXCH AC1,DFBUSY ;FORCE DFBUSY TO-1, EXTRACT PREVIOUS CONTENTS.
\r
2877 SKIPN AC1 ;ALREADY BUSY?
\r
2878 PUSHJ PDP,MONGO ;NO, START A MONITOR JOB
\r
2882 HRRZ AC1,DSKCNT(DEVDAT) ;ANY ERRORS?
\r
2883 TRNN AC1,IODERR!IODTER!IOIMPM
\r
2884 AOS (PDP) ;NO, SKIP RETURN
\r
2888 ;* EVERYTHING FROM HERE THRU SETDUN CALLED AT INTERRUPT LEVEL
\r
2890 ;ROUTINE CALLED BY INTERRUPT IN DISK.
\r
2891 ;CHECK JOB FOR ERRORS, THEN START UP ANY WAITING JOB.
\r
2892 ;UPON ENTRY, THE ACS HAVE BEEN SAVED. IOS CONTAINS ANY ERROR
\r
2895 INTERNAL DFINT,FTSWAP
\r
2896 EXTERNAL ADVBFE,ADVBFF,PJOBN,SETIOD,PIOMOD
\r
2897 EXTERNAL MQREQ,MQAVAL,DFRED,DFWRT
\r
2899 EXTERNAL MQTOP,MQUEUE
\r
2903 EXTERNAL SQREQ,SERA,SOGO,SWPINT
\r
2904 MOVE TAC,SERA ;*WAS THAT A SWAPPING JOB?
\r
2905 TLNE TAC,200000 ;*
\r
2908 SKIPN RUNUSR ;*WAS THAT A USER JOB?
\r
2909 JRST DFINT2 ;*NO, MUST HAVE BEEN MONITOR
\r
2911 MOVS DEVDAT,RUNUSR ;*YES
\r
2912 ANDI DEVDAT,377777 ;*CLEAR READ INDICATOR BIT.
\r
2913 TRNE IOS,IOIMPM ;*WRITE-LOCK?
\r
2914 PUSHJ PDP,DINT1A ;*YES
\r
2915 TRNE IOS,IODTER!IODERR ;*ERRORS?
\r
2916 JRST DFINT9 ;*ERRORS
\r
2917 DFINTA: AOS DEVACC(DEVDAT) ;INCREMENT POINTER TO RETRIEVAL POINTER
\r
2918 AOS SETCNT(DEVDAT) ;INCREMENT RELATIVE BLOCK NUMBER
\r
2920 PUSHJ PDP,SETDUN ;*TURN OFF I/O WAIT
\r
2922 MOVE PROG,JBTADR(TAC) ;*SET RELOC. AND PROT. FOR THIS JOB
\r
2924 SKIPL RUNUSR ;*WAS IT A READ OR A WRITE?
\r
2925 JRST DFINT1 ;*WRITE
\r
2927 MOVEI TAC,@DEVIAD(DEVDAT) ;*SET UP WORD COUNT
\r
2933 MOVE TAC,DEVOAD(DEVDAT)
\r
2936 HRRZ TAC,DEVIAD(DEVDAT)
\r
2937 ADD TAC,[XWD NBLKSZ,2]
\r
2938 PUSHJ PDP,CHKSUM ;CLEAR IOACT
\r
2939 MOVE TAC,DEVACC(DEVDAT)
\r
2944 MOVEM IOS,DEVIOS(DEVDAT)
\r
2947 PUSHJ PDP,DFINX ;ENTER INPUT ROUTINE
\r
2949 DFINT1: PUSHJ PDP,DFOUTX ;CHECK FOR MORE OUTPUT
\r
2954 DINT1A: HRRZ TAC,DEVACC(DEVDAT) ;WRITE-LOCK FOUND, SET WLBIT
\r
2956 JRST SETWL ;AND RETURN
\r
2958 DFINT2: MOVS DEVDAT,@MOPTR ;IT WAS A MONITOR JOB
\r
2959 ANDI DEVDAT,377777 ;REMOVE POSSIBLE READ INDICATOR
\r
2960 TRNN IOS,IODERR!IODTER ;ERRORS?
\r
2962 SOS TAC,DSKCNT(DEVDAT) ;YES,TRIED ENOUGH?
\r
2964 JRST DINT4A ;NO, TRY AGAIN.
\r
2966 DFINT3: HRRM IOS,DSKCNT(DEVDAT) ;SAVE ANY ERRORS
\r
2967 HLRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK ERROR?
\r
2969 PUSHJ PDP,SETWL ;YES, SET WLBIT
\r
2971 SETZM @MOPTR ;REMOVE THIS MONITOR JOB
\r
2972 AOS TAC,MOPTR ;INCREMENT POINTER.
\r
2975 MOVEM TAC,MOPTR ;FALL THROUGH TO DFINT4
\r
2977 ;DETERMINE NEXT TRANSFER TO MAKE ACCORDING TO PRIOROTY
\r
2978 ; 1) SWAPPING 2) MQ I/O 3) BUFFERED MODE I/O
\r
2979 DFINT4: MOVEM IOS,DEVIOS(DEVDAT) ;CLEAR IOACT
\r
2980 DINT4A: IFN FTSWAP,<
\r
2981 SKIPE SQREQ ;SWAPPING JOB WAITING?
\r
2982 JRST SOGO ;YES,START IT
\r
2986 DINT4B: SKIPE @MOPTR ;MONITOR JOB WAITING?
\r
2987 JRST MONGO ;YES, START IT UP
\r
2989 SKIPL USRCNT ;USER WAITING?
\r
2991 SETZM DFBUSY ;NO. TURN OFF BUSY FLAG
\r
2992 POPJ PDP, ;EXIT INTERRUPT
\r
2994 ;FIND A WAITING USER
\r
2996 FINDV: HRRZ DEVDAT,DDBPTR
\r
2997 MOVSI TAC,W8BIT ;PREPARE TO TURN OFF WAIT INDICATOR
\r
2999 DFINT5: HLRZ TAC1,(DEVDAT) ;END OF DISK DDBS?
\r
3001 CAIE TAC1,(SIXBIT /DSK/)
\r
3002 MOVEI DEVDAT,DSKDDB ;YES, RESET TO TOP
\r
3004 SKIPGE DEVIAD(DEVDAT) ;ANY READS WAITING?
\r
3006 SKIPGE DEVOAD(DEVDAT) ;ANY WRITES WAITING?
\r
3008 HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, TRY NEXT DDB
\r
3011 ;START UP A USER WRITE
\r
3013 DFINT6: ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAIT BIT IN DDB
\r
3014 MOVEI TAC,0 ;PREPARE TO SET BIT 0=0 IN RUNUSR
\r
3017 ;START UP A USER READ
\r
3019 DFINT7: ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAIT BIT IN DDB
\r
3021 USRGO: MOVSM DEVDAT,RUNUSR ;SAVE DEVDAT FOR USE AT DFINT
\r
3022 ORM TAC,RUNUSR ;SET READ (B0=1) WRITE (B0=0) INDICATION
\r
3023 AOS UXFERS ;COUNT TOTAL USER TRANSFERS
\r
3024 LDB PROG,PJOBN ;SETUP RELOCATION FOR JOB
\r
3025 MOVE PROG,JBTADR(PROG)
\r
3026 MOVE TAC,DEVSER(DEVDAT) ;GET DDB LINK
\r
3027 MOVSM TAC,DDBPTR ;START SEARCH WITH NEXT DDB
\r
3028 MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION
\r
3029 HRRZ TAC,(TAC) ;GET RETRIEVAL POINTER (XWD CHECKSUM BLOCK #)
\r
3031 SKIPL RUNUSR ;READ?
\r
3034 HRRI TAC1,@DEVIAD(DEVDAT) ;GET ADDRESS OF RING BUFFER
\r
3035 AOJA TAC1,DFRED ;FROM IOWD AND READ
\r
3037 USRGO3: HRRI TAC1,@DEVOAD(DEVDAT) ;GET ADDRESS OF OUTPUT BUFFER
\r
3038 AOJA TAC1,DFWRT ;FORM IOWD AND WRITE
\r
3041 ;START UP A MONITOR READ OR WRITE
\r
3043 MONGO: MOVS ITEM,@MOPTR ;XWD CORE ADDRESS, SAVED DEVDAT
\r
3044 ANDCMI ITEM,400000 ;CLEAR READ INDICATOR
\r
3045 MOVE TAC1,DSKBUF(ITEM) ;GET CONTROLLING IOWD
\r
3046 HLRZ TAC,ITEM ;GET CORE ADDRESS
\r
3048 HLL TAC1,DSKBUF(ITEM) ;RESTORE LH IN CASE ADDING REL. CAUSES OVRFL IN T LH
\r
3049 SUBI TAC1,1 ;FORM IOWD LENGTH ADDRESS
\r
3050 HLRZ TAC,DSKCNT(ITEM) ;GET LOGICAL BLOCK#
\r
3055 ;ERROR ON USER JOB.
\r
3057 DFINT9: AOS ECOUNT ;COUNT USER HARDWARE ERRORS
\r
3058 SOS TAC,DSKCNT(DEVDAT) ;TRIED ENOUGH?>
\r
3061 MOVE TAC,DEVDAT ;NO. RESET FLAG SO IT WILL GO AGAIN.
\r
3062 SKIPL RUNUSR ;READ?
\r
3063 ADDI TAC,DEVOAD-DEVIAD ;NO.
\r
3065 ORM TAC1,DEVIAD(TAC) ;RESTORE WAIT BIT TO DEVIAD OR DEVOAD
\r
3066 SETZM RUNUSR ;CLEAR USER INDICATOR
\r
3067 JRST DINT4A ;DO NEXT TASK.
\r
3069 ;CLEAR I/O DONE FLAG IF IT IS ON.
\r
3072 OR IOS,DEVIOS(DEVDAT) ;*
\r
3073 ANDCMI IOS,IOACT ;*
\r
3078 SUBTTL ERRORS, SUBROUTINES.
\r
3079 ;ERROR ROUTINES CALLED FROM UUO LEVEL
\r
3081 EXTERN EXCALP,ERRPTU,TPOPJ
\r
3083 DEFINE ERRORS (X),<
\r
3084 PUSHJ PDP,CLRBUF ;CLEAR ANY DUMP BUFFER
\r
3085 JSP TAC,ERRPTU ;OUTPUT A MESSAG
\r
3087 JRST EXCALP ;TYPE "UUO FROM" MESSAGE AND QUIT
\r
3090 DFERR1: ERRORS <DISK FULL-- YOUR JOB HAS LOST. >
\r
3092 DFERR2: MOVEI IOS,IOIMPM
\r
3093 ORB IOS,DEVIOS(DEVDAT)
\r
3096 DFERR3: ERRORS <INCORRECT RETRIEVAL INFORMATION>
\r
3098 ;THESE ERROR ROUTINES ARE GENERALLY CALLED AFTER SETLE HENCE 0(PDP) IS XWD PROJ,PROG
\r
3100 DFERR6: MOVEI TAC,NORITE ;FILE ALREADY BEING ALTERED
\r
3101 DFERRY: HRRZ TAC1,UUO
\r
3102 ADD TAC1,[XWD PROG,ERRBIT] ;FORM POINTER TO UUO PARAMETER BLOCK
\r
3103 HRRM TAC,@TAC1 ;STORE ERROR CODE
\r
3104 POP PDP,TAC ;REMOVE XWD PROJ,PROG
\r
3105 JRST CLRBUF ;RELEASE ANY RESOURCES
\r
3107 DFERR5: MOVEI TAC,PROTF ;PROTECTION FAILURE
\r
3110 DFERR4: MOVEI TAC,NOTINM ;USER NOT IN MFD
\r
3113 DFERR7: MOVEI TAC,NOTINU ;FILE NOT IN UFD
\r
3116 DFERR8: ERRORS <LOOKUP AND ENTER HAVE DIFFERENT NAMES>
\r
3119 ERRORS <NOT ENOUGH FREE CORE IN MONITOR>
\r
3121 DFER10: MOVEI TAC,RENFAL
\r
3124 DFER11: MOVEI TAC,NOFILE
\r
3127 DFER12: MOVEI TAC,0
\r
3128 PUSH PDP,TAC ;ADD SOMETHING TO BE REMOVED (SINCE SETLE NOT CALLED)
\r
3131 WERA: MOVSI IOS,NORELB
\r
3132 ANDCAB IOS,DEVIOS(DEVDAT)
\r
3133 ERRORS <NON-RECOVERABLE DISC WRITE ERROR>
\r
3135 RERA: MOVSI IOS,NORELB
\r
3136 ANDCAB IOS,DEVIOS(DEVDAT)
\r
3137 ERRORS <NON-RECOVERABLE DISC READ ERROR>
\r
3139 ;CALLED AT BOTH INTERUPT AND UUO LEVELS
\r
3140 ;COMPUTE CHECK-SUM
\r
3141 ;ENTER WITH C(TAC 18-35) SET TO BUFFER ADDRESS
\r
3142 ;RETURN WITH C(TAC1)SET TO ONES COMPLEMENT SUM IN RH.
\r
3144 IFG CHKCNT,<INTERNAL CHKSUM
\r
3145 CHKSUM: HLRZ TAC1,TAC ;IS COUNT GREATER THAN CHKCNT
\r
3146 CAIGE TAC1,-CHKCNT
\r
3147 MOVEI TAC1,-CHKCNT ;YES, USE CHKCNT
\r
3148 MOVE IOS,[XWD UBFS,IOACT]
\r
3149 ANDCM IOS,DEVIOS(DEVDAT)
\r
3150 IORM IOS,DEVIOS(DEVDAT)
\r
3152 ADDI TAC,(PROG) ;NO. RELOCATE,
\r
3153 HRL TAC,TAC1 ;RESET COUNT IN LH AFTER POSSIBLE OVERFLOW
\r
3155 ANDCAB IOS,DEVIOS(DEVDAT)
\r
3160 CHKSM3: AOJA TAC1,CHKSM2 ;BRING CARRY AROUND
\r
3162 ;CHECKSUM ERROR COUNTING ROUTINE
\r
3163 CKREC2: PUSH PDP,TAC
\r
3164 IORM AC3,DEVIOS(DEVDAT)
\r
3168 CKREC3: IORI IOS,IODTER
\r
3173 ;TIMING OF MAIN LOOP IS 13.8 MICRO-SECS AVERGE.
\r
3174 ;THIS IS 1.8 MILS OR SO FOR 128 WORDS.
\r
3176 IFN <IFG CHKCNT, <CHKCNT+>>FTCHECK+FTMONP+FTSWAP, <
\r
3179 CHECK: MOVEI TAC,0 ;CLEAR SUM
\r
3180 JFCL 4,.+1 ;CLEAR CARRY0 FLAG
\r
3182 CHKSM1: ADD TAC1(TAC) ;ADD NEXT WORD
\r
3183 JFCL 4,CHKSM3 ;JUMP IF CARRY 0
\r
3184 CHKSM2: AOBJN TAC,CHKSM1 ;LOOP UNTIL DONE
\r
3185 HLRZ TAC,TAC1 ;ADD HALVES
\r
3188 TLZE TAC1,1 ;CARRY INTO LH?
\r
3189 ADDI TAC1,1 ;YES BRING IT AROUND
\r
3193 ;UPDATE DEVCNT IF NECESSARY. DEVCNT HAS SIZE OF FILE IN R.H. (IN WORDS IF POSSIBLE,
\r
3194 ; OTHERWISE NEGATIVE BLOCK COUNT).
\r
3195 ; ENTER WITH SIZE OF CURRENT BLOCK IN TAC1
\r
3196 UPDEVC: HRRZ TAC,SETCNT(DEVDAT) ;*CONVERT CURRENT RELATIVE BLOCK NUMBER TO WORDS
\r
3199 ADD TAC,TAC1 ;*ADD IN THE ADDITIONAL WORDS IN THIS NEXT
\r
3201 HRRZ TAC1,DEVCNT(DEVDAT) ;*PICK UP PREVIOUS MAXIMUM FILE SIZE OF COMPARISON.
\r
3202 TRNE TAC1,400000 ;*PREVIOUS MAXIMUM SIZE GREATER THAN 2 EXP 17 WORDS?
\r
3203 JRST UPDVC2 ;*YES, THEN COMPARE AND SAVE NEGATIVE BLOCK COUNTS
\r
3204 TLNN TAC,-1 ;*NO, DOES THE NEWLY COMPUTED CURRENT FILE SIZE EXCEED
\r
3208 JRST UPDVC1 ;*YES, GO SAVE NEGATIVE BLOCK COUNT.
\r
3209 CAMLE TAC,TAC1 ;*NO, COMPARE POSITIVE WORD COUNTS
\r
3210 HRRM TAC,DEVCNT(DEVDAT) ;*UPDATE MAXIMUM FILE SIZE ONLY IF PREVIOUS
\r
3211 ; MAXIMUM EXCEEDED
\r
3213 UPDVC1: TRO TAC1,-1 ;*SET PREVIOUS MAXIMUM AS ONLY ONE
\r
3214 ;* (THUS FORCING CURRENT BLOCK COUNT TO BE STORED).
\r
3215 UPDVC2: ADDI TAC,BLKSIZ-1 ;*CONVERT POSITIVE WORD COUNT TO NEGATIVE
\r
3219 TRON TAC,400000 ;*MORE THAN 2EXP17 BLOCKS (16,777,216 WORDS)
\r
3221 TROA IOS,IOBKTL ;*YES, (PREPOSTEROUS) SET ERROR BIT AND STORE
\r
3222 ; BLOCK COUNT WODULO 2EXP17
\r
3223 CAILE TAC1,(TAC) ;*NO, COMPARE PREVIOUS MAXIMUM VERSUS PRESENT
\r
3225 HRRM TAC,DEVCNT(DEVDAT) ;*STORE NEW MAXIMUM FILES SIZE ONLY IF PREVIOUS
\r
3226 ;* MAXIMUM EXEEDED.
\r
3229 ;OUTPUT WRITE-LOCK ERROR. FREE THE BLOCK AND GET NEW ONE.
\r
3231 WLERA: HLR TAC,DSKCNT(DEVDAT) ;PICK UP BLOCK NUMBER.
\r
3232 PUSHJ PDP,SETFRE ;FREE THE BLOCK
\r
3233 JRST DFGETF ;GET ANOTHER.
\r
3235 ;SET WRITE-LOCK INDICATION IN A SAT ENTRY.
\r
3236 ;ENTER WITH A BLOCK NUMBER IN TAC.
\r
3238 SETWL: MOVEI TAC1,SETENT ;*
\r
3240 SETWL1: ADDI TAC1,SENTSZ ;*
\r
3241 HLRZ ITEM,@TAC1 ;*IS THE BLOCK IN THIS SAT ENTRY?
\r
3243 CAIL TAC,NUMBLK(ITEM) ;*
\r
3244 JRST SETWL1 ;*NO, LOOP.
\r
3245 MOVEI ITEM,WLBIT ;*
\r