IFN FTRA10, < TITLE DSKSER -- DEVICE-INDEPENDENT DISK SERVICE ROUTINES. > IFE FTRA10, < IFN FTRC10,< TITLE DSKSRB - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (BURROUGHS) >> IFE FTRC10,< TITLE DSKSRD - ALMOST DEVICE INDEPENDENT DISK SERVICE ROUTINES (DATA PRODUCTS) > SUBTTL A, BLACKINGTOM/CMF/TH/CHW/RCC/AF TS 02 JUN 69 V424 XP VDSKSR,424 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP INTERNAL FTRA10 ;TO ASSEMBLE DSKSER AS A ; DEVICE INDEPENDENT ROUTINE SET ; THIS SWITCH TO -1, NOTE THAT MDFINT (THE BRYANT ; DSKINT) WAS WRITTEN SO AS TO KEEP DSKSER DEVICE-INDEPENDENT ; THIS SWITCH AND CODE ENCLOSED IN ITS IFE'S WILL ULTIMATELY ; BE REMOVED FROM DSKSER. INTERNAL FTRC10 ;TO ASSEMBLE DSKSER FOR THE PDP-10 DISK ; (MODEL RC-10), SET THIS SWITCH TO -1, ; FOR OLD (270) DISK SET IT = 0. IFN FTRA10, < ENTRY DSKSER DSKSER: > IFE FTRA10, < IFN FTRC10, < ENTRY DSKSRB ;THIS SYMBOL IS TO PERMIT SYSTEM DSKSRB: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE, > IFE FTRC10, < ENTRY DSKSRD ;THIS ENTRY FOR SELECTIVE LOAD BY BUILD DSKSRD: >> EXTERNAL JIFMIN INTERNAL WLBIT,DSKFGS,CHKCNT TA=BUFPNT ;USED BY RENAME TB=BUFWRD ;USED BY RENAME IFE FTRA10, < INTERNAL MFDBLK,SATXWD IFN FTRC10, < MFDBLK: 66 ;ON PDD-10 DISK, MFD RETRIEVAL INFORMATION AND SAT SATXWD: XWD -NUMSAT,67 ;BLOCKS GO AT THESE ABSOLUTE ADDRESSES ; UNLESS USER SPECIFIES OTHERWISE DURING "ONCE". > IFE FTRC10, < MFDBLK: 13000 ;THIS BLOCK CONTAINS RETRIEVAL INFO, OF MFD SATXWD: XWD -NUMSAT,13001 ;LH=NUMBER OF SAT BLOCKS. ;RH=FIRST SAT BLOCK NUMBER. >> CHKCNT=200 ;NUMBER OF WORDS TO CHECK-SUM W8BIT=400000 ;WAIT INDICATION FOR DDB ; BITS IN LH OF IOS NMP=100 ;NO MORE INPUT POINTERS (LH OF IOS) UBFS=200 ;USING BUFFER IN FREE STORAGE (LH OF IOS) NORELB=400 ;DO NOT RELOCATE BUFFER ON I/O (LH IOS) UBFU=1000 ;USING BUFFER IN USER AREA NCTRLC=2000 ;DISABLE ^C DURING CRUCIAL SEQUENCES OF NON- ; INTERRUPTABLE OPERATIONS DAFLG=4000 AUFLG=10000 DSKFGS=AUFLG+DAFLG+UBFS+NCTRLC ;USED TO SUPPRESS ACTION OF ^C, SEE STOPCK PRCHG=20000 ;PROTECTION CHANGED LIR=IOEND ;LAST INPUT REQUESTED ;MISCELLANEOUS CONSTANTS TRIES=3 ;NUMBER OF TIMES TO READ OR WRITE BAD BLOCK BLKSIZ=200 ;SIZE OF DATA BLOCK. DUMP MODE REQUIRES THIS NBLKSZ=-BLKSIZ ;TO BE A POWER OF 2. BLKP2=7 ;BLKSIZ = 2^BLKP2 ;TEST BITS PUT IN LH OF DEVOAD PNTDIF=200000 ;POINTERS IN CORE DO NOT MATCH POINTERS ON DISC VRGPTR=100000 ;FLAG TO SIGNAL THAT POINTERS HAVE NEVER BEEN WRITTEN RENBIT=20000 ;"RENAMING" INDICATION FOR SETLE ROUTINE WPRO=40000 ;LOOKUP DONE, FILE IS IN WRITE PROTTECT CKSUPR=10000 ;FLAG SET IF READING DUMP FILES IN NON-DUMP MODE ;CONSTANTS USED IN CONNECTION WITH ACCESS TABLE ENTRIES ATPP=0 ;PROJECT,PROGRAMMER NUMBERS ATNAME=1 ;OWNER NAME ATEXT=2 ;EXTENSION TBITS=2 ;TEST BITS AND RCOUNT ATBLOK=3 ;BLOCK NUMBER OF RETRIEVL INFO OF UFD IN LH ATLINK=3 ;LINK TO NEXT ENTRY IN RH WTBIT=400000 ;FILE IS BEING CREATED DTBIT=200000 ;DELETE WHEN THRU READING RTBIT=100000 ;FILE HAS BEEN RENAMED ATBITS=500000 ;WTBIT+RTBIT ATIND=40000 ;NAME IS ALREADY IN DIRECTORY ATCLO=20000 ;OUTPUT CLOSE TO BE DONE RWTBIT=10000 ;FILE BEING READ AND WRITTEN, BUT NOT CREATED, RCOUNT=7777 ;MASK FOR THE COUNT OF READERS ;CONSTANTS USED IN CONNECTION WITH SAT BLOCKS XP NUMBIT,^D36*BLKSIZ ;NUMBER OF BITS IN ONE BLOCK IFE FTRA10, < IFN FTRC10, < XP NUMSAT,4 ;ONLY FOUR SAT BLOCK ON PDP-10 DISK, > IFE FTRC10, < XP NUMSAT,16 ;NUMBER OF SAT BLOCKS FOR 5.76 MILLION ;WORD DATA PRODUCTS MODEL 270 DISK, >> XP WLBIT,400000 ;IF BIT IS ON IN FIRST SATENT ENTRY ;WORD, THE DISK IS WRITE-LOCKED. EXTERNAL DSKOFF DEFINE NOSCHEDULE < CONO PI,DSKOFF > EXTERNAL DSKON DEFINE SCHEDULE < CONO PI,DSKON > INTERNAL FTCHECK,FTMONP IFN FTCHECK+FTMONP,< EXTERNAL DDBPTR,DSKCOR,PTRN,MOPTR,MIPTR,RUNUSR,SAVPRG,USRCNT EXTERNAL SATPTR,SAT,SATBK2,DIRSIZ EXTERNAL DSKDDB,DEVACC,DEVCNT,DEVBLK,DEVBKO,DSKBUF EXTERNAL DSKCNT,SETCNT,PTR1,FPNTR,FPNTR1,FAT,DFBUSY,LOCORE,GTCOR3 EXTERNAL GTCOR2,CORBIT,CKSMCT,DSKSIZ,DSKACC,DSKAPP,CORBSZ,MONBUF > IFE FTCHECK+FTMONP,< ;DISK DEVICE DATA BLOCKS & MISCELLANEOUS CONSTANTS, WORKING STORAGE DDBPTR: Z ;LOCATION OF NEXT DDB TO LOOK AT ;DURING DISK INTERRUPT ;MORE MISCELLANEOUS FOR DISK INTERNAL SATPTR,SAT,SATBK2,REFLAG,DFBUSY,CKSMCT MOPTR: BLOCK 1 ;POINTER TO NEXT TASK TO DO MIPTR: BLOCK 1 ;POINTER TO NEXT FREE QUEUE ENTRY RUNUSR: BLOCK 1 ;LH=DEVDAT OF USER JOB RUNNING ;RH= UNUSED USRCNT: BLOCK 1 ;COUNT OF WAITING USER JOBS DFBUSY: 0 ;-1 IF DISK CONTROL IN USE, 0 IF FREE FAT: 0 ;POINTER TO FIRST ACCESS TABLE ENTRY CKSMCT: 0 ;COUNT OF VARIOUS CHECKSUM ERRORS REFLAG: 0 ;CONTAINS A PPN TO ALLOW LOGIN AFTER REFRESH UXFERS: 0 ;TOTAL USER TRANSFER ATTEMPTED ECOUNT: 0 ;TOTAL HARDWARE ERRORS ON USER TRANSFERS ;DISK STORAGE ALLOCATION CONTROL SATPTR: BLOCK 1 ;POINTER TO CURRENT SATENT ENTRY SATPIK: BLOCK 1 ;POINTER TO NON-FULL SAT ENTRY SATCHG: BLOCK 1 ;0 IF SAT BLOCK IN CORE=BLOCK ON DISK, -1 OTHERWISE SATTEM: BLOCK 1 ;TEMPORARY SAVE LOCATIONS USED DURING SAT READ SATTMP: BLOCK 1 ; ROUTINE TO AVOID PUSH-DOWN LIST OVERFLOW. IFN FTRA10, < EXTERNAL MFDBLK,SATXWD,NUMBLK,SATENT,SENTSZ,SATTOP > IFE FTRA10, < INTERNAL SATENT IFN FTRC10, < XP NUMBLK,^D4000 ;NUMBER OF DATA BLOCKS PER SAT BLOCK ON THE ; PDP-10 MODEL RC-10 DISK FILE. > IFE FTRC10, < XP NUMBLK,5400 ;NUMBER OF DATA BLOCKS REPRESENTED BY ;ONE SAT BLOCK ON THE DATA PRODUCTS 270 DISK. > XP SENTSZ,3 ;SIZE OF EACH SATENT ENTRY IFN FTRC10, < DSKXDB=0 ;ON PDP-10 DISK FILE STORAGE BEGINS IN LOGICAL ; BLOCK NO. 0, > IFE FTRC10, < DSKXDB=5400 ;FILE STORAGE BEGINS ON SECOND DISK OF OLD (MOD 270) ; DISK FILE SINCE FIRST DISK IS ALLOCATED ; TO SWAPPING. > SATENT: REPEAT NUMSAT,< XWD DSKXDB,0 ;RH CONTAINS WLBIT AND COUNT OF BLOCK USED BLOCK 1 ;BIT MASK, SINGLE ROTATING BIT BLOCK 1 ;XWD LENGTH OF SAT TABLE POINTER WORD ; IN SAT BLOCK DSKXDB=DSKXDB+NUMBLK> XP SATTOP,SATENT+SENTSZ*NUMSAT-SENTSZ >;END OF FTRA100 CONDITIONAL SAT: BLOCK 200 ;CURRENT SAT BLOCK XP SATM2,SAT-2 ;LOWEST ABS, ADR-1 ALLOWED IN CHANNEL COMMAND ; LIST - USED TO KEEP FROM WIPING OUT MONITOR. SATBK2: XWD -200,SAT XP DIRSIZ,4 ;NO. OF WORDS OF RET. INFO WHICH ARE ;NOT POINTERS. ;THE DUMMY DEVICE DATA BLOCK DSKCOR=10 DSKSIZ=4*DSKCOR ;NUMBER OF WORDS ALLOCATED FOR DDB ;MUST BE A MULTIPLE OF FOR (SEE GETCOR) INTERN DSKDDB DSKDDB: SIXBIT /DSK/ XWD ^D5*HUNGST,201 Z EXP DSKDSP XWD DVOUT+DVIN+DVDIR+DVDSK+DVLNG,154403 Z Z XWD PROG, XWD PROG, XP DEVFIL,.-DSKDDB ;FILE NAME Z ;SIXBIT/FILE? - FILE NAME XP DEVEXT,.-DSKDDB ;FILE EXTENSION Z ;XWD SIXBIT/EXT/,BLOCK# OF THE RIB XP DEVPPN,.-DSKDDB ;PROJ,PROGRAMMER FOR CURRENT ; (OR MOST RECENT) LOOKUP,ENTER,RENAME Z XP DEVACC,.-DSKDDB ;C(LH)=LOCATION OF CCESS TABLE ENTRY Z ;C(LH)=ADDRESS OF ACCESS TABLE ENTRY ;C(RH)=ADDRESS OF CURRENT POINTER IN DDB XP DEVCNT,.-DSKDDB ;C(LH)USED DURING LOOKUP,ENTER Z ;C(LH)=RELATIVE BLOCK# WITHIN UFD OPTIMIZE UFD SEARCHES) ;C(RH)=COUNT OF BLOCKS IN FILE XP DEVBLK,.-DSKDDB ;C(LH)=BLOCK NUMBER OF CURRENT POINTER Z ;C(LH)=LOGICAL BLOCK# OF RIB ;C(RH)=RELATIVE LOC. OF RIB ;POINTER IN THAT BLOCK XP DEVBKO,.-DSKDDB ;LIKE DEVBLK, BUT FOR BEGINNING Z ;SIMILAR TO DEVBLK - SAY WHERE CURRENT ; POINTER COME FROM XP DSKBUF,.-DSKDDB ;C(LH)=-SIZE OF MONITOR READ/WRITE Z ;C(LH)=-SZIE OF READ/WRITE ;C(RH)=BUFFER IN USER AREA XP DSKCNT,.-DSKDDB ;C(LH)=BLOCK NUMBER TO READ/WRITE Z ;C(LH)=LOGICAL BLOCK@ FOR READ OR WRITE ;C(RH)=ERROR COUNT OR ERROR BITS XP SETCNT,.-DSKDDB ;LH CONTAINS POINTER TO R.I. OF ;C(LH)=BLOCK# OF UFD RIB Z ;UFD, RH IS SETO, SETI COUNTER. XP PTR1,.-DSKDDB ;RETRIEVAL INFO STARTS HERE ; DEFINE THE AREA CONTAINING RETRIEVAL; POINTERS XP FPNTR,PTR1+DIRSIZ ;LOC. OF FIRST POINTER TO RET. INFO. XP FPNTR1,FPNTR-1 XP PTRN,DSKSIZ-1 ;DEFINE 3 WORD ENTRY CONTROLLING BIT SEARCH IN DDBTAB INTERNAL LOCORE,CRINIT EXTERNAL DDBTAB LOCORE: EXP 0 ;ADDRESS OF FIRST 4 WORD BLOCK IN FREE CORE AREA ; SET BY LINKDB CORBIT: 0 ;FLOATING 1 BIT USED IN SEARCHES CORIWD: XWD 0,0 ;AOBJN POINTER TO FIRST WORD IN DDBTAB CONTAINING A 0 CRINIT: XWD 0,DDBTAB ;INITIAL AOBJN POINTER FOR CORIWD ; LH SET BY LINKDB MONBUF: BLOCK 200 ;MONITOR BUFFER, USED TO READ RETRIEVAL POINTERS, ETC. > ;ERROR CODES FOR LOOKUP, RENAME AND/OR ENTER NOTINU=0 ;NO SUCH FILE NOTINM=1 ;NO SUCH USER PROTF=2 ;PROTECTION FAILURE NORITE=3 ;MORE THAN 1 WRITE TO A FILE RENFAL=4 ;TRIED TO RENAME FILE TO EXISTING NAME OR ENTER ; A NULL FILE NAMES NOFILE=5 ;TRIED TO RENAME WITH NO FILE SELECTED ERRBIT=1 ;BITS GO IN WORD 1 OF THE ENTRY ;DISK DISPATCH TABLE INTERNAL DSKDSP JRST DSKINI ;INITILIZE JRST CPOPJ1 ;DSK HUNG TIMEOUT, NO ERROR MESSAGE DSKDSP: JRST DFREL ;RELEASE JRST DFCLSO ;CLOSE OUTPUT JRST DFOUT ;OUTPUT JRST DFIN ;INPUT JRST DFENTR ;ENTER JRST DFLOOK ;LOOKUP JRST DFDMPO ;DUMP OUTPUT JRST DFDMPI ;DUMP INPUT JRST DFSET ;USETO JRST DFSET ;USETI POPJ PDP, ;UGETF JRST DFREN ;RENAME JRST DFCLSI ;CLOSE INPUT POPJ PDP, ;UTPCLR POPJ PDP, ;MTAPE ;ACCINI - CALLED AT 140 START, 143 RESTART ; RESTORE DEVICE DATA BLOCK CHAIN ; INITIALIZE DDBTAB BIT SEARCHING ENTRY INTERNAL ACCINI ACCINI: MOVSI TAC,(SIXBIT /DSK/) MOVEI DEVDAT,DSKDDB ;POINT TO PROTOTYPE DDB ACCIN1: HLRZ DEVDAT,DEVSER(DEVDAT) JUMPE DEVDAT,ACCIN2 CAMN TAC,DEVNAM(DEVDAT) JRST ACCIN1 ACCIN2: MOVEI TAC,DSKDDB HRLM DEVDAT,DEVSER(TAC) ;LINK PROTOTYPE TO FIRST NON DSK DDB MOVSI TAC,400000 MOVEM TAC,CORBIT ;INITIALIZE FLOATING 1 BIT MOVE TAC,CRINIT MOVEM TAC,CORIWD ;RESET AOBJN WORD POPJ PDP, ;DSKINI - CALLED AT 140 START, RESTART, 143 RESTART ; REMOVE ACCESS ENTRIES, REMOVE DDB'S NOT ASSIGNED BY CONSOLE. CLEAR THE MONITOR QUEUE. INTERNAL DSKINI, SETSAT EXTERNAL DISKUP,DFWUNS DSKINI: IFN FTSWAP, < SETZM SQREQ ;NO SWAPPING REQUEST SETZM SERA > IFE FTRA10, < EXTERNAL DSKCON HLLZS DSKCON ;CLEAR INTERRUPT FLAGS FOR CONSO > SETZM DFBUSY ;DISK CONTROL AVAILABLE SETZM RUNUSR ;NO USER I/O IN PROGRESSS SETOM USRCNT ;NO USER TRANSFERS WAITING SETZB DDBPTR ;NO NEXT DDB ; CLEAR IOS (SUPERSTITIOUS, BUT POSSIBLY NECESSARY) MOVEI DEVDAT,DSKDDB ;PREPARE TO RELEASE DISK DDB'S DSKIN0: HLRZ DEVDAT,DEVSER(DEVDAT) ;GET DDB LINK JUMPE DEVDAT,DSKIN1 ;JUMP IF END REACHED MOVSI TAC, (SIXBIT /DSK/) ;DEVICE NAME CAME TAC,DEVNAM(DEVDAT) ;IS THIS A DISK DDB? JRST DSKIN1 ;NO. DONE HLRZ TAC, DEVACC(DEVDAT) ; GET POINTER TO ACCESS ENTRY SKIPE TAC ;ACCESS ENTRY EXIST? PUSHJ PDP,CLRAT ;YES. REMOVE IT MOVSI TAC,W8BIT ;PREPARE TO CLEAR "TRANSFER WAITING" BIT ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAITING ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAITING MOVE TAC,DEVMOD(DEVDAT) TRNN TAC,ASSCON ;DDB ASSIGNED BY ASSIGN COMMAND? PUSHJ PDP,CLRDDB ;NO. REMOVE DDB JRST DSKIN0 ;CONTINUE DSKIN1: SETZM FAT ;NO ACCESS ENTRIES MOVEI TAC,MQUEUE+1 ;DESTINATION FOR BLT MOVEM TAC,MIPTR MOVEM TAC,MOPTR ;RESET IN AND OUT POINTERS HRLI TAC,MQUEUE SETZM MQUEUE ;SOURCE FOR BLT BLT TAC,MQTOP-1 ;CELAR THE MONITOR QUEUE PUSHJ PDP,DISKUP ;DETERMINE IF DISK IS FUNCTIONING SETSAT: AOSE STARTS ;SKIP FIRST TIEM ONLY JRST SAT01 ;WRITE SAT BLOCK IN CORE JRST DFWUNS ;SCAN ALL SAT BLOCKS STARTS: -1 ;COUNT STARTS, RESTARTS ;WRITE OUT SAT BLOCK, ENTER AT DSKSTP WITH FIXED START 147, ;AT SAT01 UPON RE-ENTRY OF INITIALIZATION. INTERN DSKSTP,SAT05,JSAT06 EXTERNAL DSKBIT,WSYNC,STOIOS,DCBBIT DSKSTP: HRRZI TAC,DSKBIT IORI TAC,DCBBIT ;DCBBIT NON-ZERO ONLY FOR DATA-PRODUCTS N$1K IORI TAC,2200 ;CLEAR PI SYSTEM CONO PI,10000(TAC) SKIPL STARTS ;HAS A SAT BLOCK BEEN READ IN? PUSHJ PDP,SAT01 ;YES, WRITE IT OUT CONO PI,10000 POPJ PDP, ;YOU ARE SAFELY DONE. SAT01: MOVEI DEVDAT,DSKDDB SETZB IOS,DEVIOS(DEVDAT) MOVEI PROG,0 PUSH PDP,WSYNC ;CHANGE WSYNC ROUTINE MOVE TAC,JSAT06 MOVEM TAC,WSYNC SAT05: MOVEI ITEM,TRIES ;SET UP COUNT FOR ERRORS SAT02: PUSHJ PDP,SATBLK ;SET UP TAC,TAC1 PUSHJ PDP,MQOUT ;WRITE IT. JRST SAT04 ;ERROR SETZM SATCHG ;SHOW SAT BLOCK IN CORE = BLOCK ON DISK. POP PDP,WSYNC ;NO ERRORS, SO RETURN. SETZM DEVIOS(DEVDAT) POPJ PDP, SAT04: SOJG ITEM,SAT02 ;ERRORS, SO TRY AGAIN POP PDP,WSYNC ;RESTORE WSYNC ROUTINE JRST 4,SAT01 SAT06: MOVEI TAC,IOACT ;THIS IS SUBSTITUE FOR WSYNC TDNE TAC,DEVIOS(DEVDAT) JRST .-1 POPJ PDP, JSAT06: JRST SAT06 SUBTTL ENTER, LOOKUP, RENAME, CLOSE ;ENTER UUO EXTERNAL TIME,PRJPRG,CPOPJ, THSDAT DFENTR: SKIPN @UUO ;ZERO FILE NAME ? JRST DFER12 PUSHJ PDP,ALTMFD ;ENTER TO MFD? TLNE DEVDAT,LOOKB ;NO, HAS LOOKUP BEEN DONE? JRST DFENT5 ;YES TLO IOS,IO PUSHJ PDP,SETLE ;RETURNS WITH PP ON PDL JRST DFERR4 ;NO UFD, CLOCK ON JRST DFENT2 ;NO FILE, CLOCK ON. JRST DFERR6 ;FILE BEING WRITTEN JRST DFENT7 ;FILE BEING READ,CHECK FOR WRITERS DFENT1: SCHEDULE HRRZ TAC,DEVEXT(DEVDAT) ;BLOCK# OF FIRST RIB PUSHJ PDP,SETPTR ;READ FIRST RETRIEVAL POINTERS TO DDB MOVSI DAT,100000 ;WRITE PROTECTION BIT PUSHJ PDP,PROTEK ;WRITE PROTECTED? JRST DFERR3 ;NAME WRONG JRST DFERR5 ;PROTECTION FAILURE. MOVEI TAC1,WTBIT+ATIND+ATCLO ;BITS FOR ACCESS ENTRY-FILE EXISTS TLZA IOS,PRCHG ;PREPARE FOR PROTECTION CHECK DFENT2: MOVEI TAC1,WTBIT+ATCLO ;BITS FOR ACCESS ENTRRY - FILE CREATION HLLZS DEVEXT(DEVDAT) ;SET TO 0 RIB BLOCK# NOSCHEDULE PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING JRST DFENT3 ;NOT THERE DFEN2A: MOVE DAT,TBITS(TAC) ;WRITE BIT ON? TRNE DAT,WTBIT JRST DFERR6 ;YES,ERROR PUSHJ PDP,SCNAT2 JRST DFENT3 JRST DFEN2A DFENT3: TLZE IOS,PRCHG ;PROTECTION FAILURE? JRST DFERR5 ;YES. GIVE ERROR RETURN. SCHEDULE PUSH PDP,TAC1 ;SAVE ACCESS BITS PUSHJ PDP,DFGETF ;GET A BLOCK FOR RETRIEVAL POINTERS. # IN TAC POP PDP,TAC1 ;RESTORE ACCESS BITS HRLZM TAC,DEVBLK(DEVDAT) ;SET CURRENT RIB# AND INDEX IN DDB HRLZM TAC,DEVBKO(DEVDAT) HRRM TAC,DEVEXT(DEVDAT) ;STORE FIRST RIB# NOSCHEDULE MOVE DAT,TAC1 ;ACCESS ENTRY BITS PUSHJ PDP,SETAT ;CREATE ACCESS ENTRY. RETURN POINTER IN TAC1 HRLM TAC1,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY MOVEI DAT,PTR1(DEVDAT) ;SET UP RETRIEVAL INFO MOVE TAC,DAT ;DESTINATION (DDB) HRLI TAC,@UUO ;SOURCE (UUO PARAMETER BLOCK) BLT TAC,2(DAT) ;NAME & EXTENSION SCHEDULE MOVE TAC1,THSDAT ORI TAC1,400000 ;MAKE SURE ACCESS DATE NON-ZERO, HRRM TAC1,1(DAT) ;STORE THSDAT AS ACCESS DATE MOVE TAC1,2(DAT) TLZ TAC1,777740 ;IS THERE A DATE ALREADY? JUMPN TAC1,DFENT4 ;YES IF JUMP. MOVE TAC,TIME ;NO, GET TIME. IDIVI TAC,JIFMIN HRRZ TAC1,THSDAT ;AND DATE. DPB TAC,[POINT 11,TAC1,23] DFENT4: TLO TAC1,55000 ;PROTECTION DPB IOS,[POINT 4,TAC1,12] ;MODE MOVEM TAC1,2(DAT) ;STORE PROTECTION MODE TIME DATE IN DDB MOVE ITEM,JOB MOVE TAC,PRJPRG(ITEM) MOVEM TAC,3(DAT) ;STORE PROGRAMMER# IN DDB SETZM 4(DAT) ;CLEAR FIRST POINTER MOVSI IOS,NMP ;SET "NO MORE POINTERS" ORB IOS,DEVIOS(DEVDAT) TLZ DEVDAT,OCLOSB HLLZS DEVCNT(DEVDAT) ;CLEAR FILE SIZE MOVSI TAC,VRGPTR ;SET "VIRGIN POINTER" FLAG (O DFO4A SUBROUTINE IORM TAC,DEVOAD(DEVDAT) ;WILL CREATE A NEW RIB WHEN JUST CALLED JRST ALLOK ;AN ENTER AFTER A LOOKUP, SET "RWTBIT" FLAG IN ACCESS ENTRY DFENT5: MOVE TAC,DEVOAD(DEVDAT) ;CHECK PROTECTION TLNE TAC,WPRO PUSHJ PDP,DFERR5 ;FAILURE, THIS WILL NOT RETURN HERE HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY NOSCHEDULE MOVE TAC1,TBITS(TAC) ;GET ACCESS BITS TROE TAC1,RWTBIT ;FILE BEING READN AND WRITTEN ALREADY? PUSHJ PDP,DFERR6 ;YES, THIS WILL NOT RETURN HERE MOVEM TAC1,TBITS(TAC) ;NO, SET IT SCHEDULE MOVE TAC,@UUO ;SAME FILE? CAME TAC,DEVFIL(DEVDAT) JRST DFERR8 ;NO, NAME WRONG ADDI UUO,1 HLLZ TAC,@UUO ;PICKUP EXTENSION FROM USER ENTER BLOCK XOR TAC,DEVEXT(DEVDAT) ;COMPARE WITH LOOKUP EXTENSIONS(AND PICKUP ; RETRIEVAL INFORMATION TLNE TAC,-1 ;EXTENSION THE SAME? JRST DFERR8 ;NO, EXTENSION WRONG SOS UUO ;YES, RETRIEVE LATEST RETRIEVAL INFORMATION AND PUSHJ PDP,SETPTR ;STORE CURRENT SIZE IN THE 4TH WORD OF THE 4-WORD PUSHJ PDP,DFLUK4 ;ENTER BLOCK (IN CASE SOME OTHER USER HAS APPENDED ; DATA TO THIS FILE BETWEEN THE TIME THIS USER DID ; HIS LOOK-UP AND THIS ENTER.) NOTE: THIS LAST ; PUSHJ WILL EXIT TO UUOCON--NOT RETURN HERE! ;FILE IS BEING READ DFENT7: PUSHJ PDP,SCNAT2 ;FIND ANOTHER JRST DFENT1 ;NO WRITERS, PERMIT THIS ENTER JRST DFERR6 ;MUST BE BEING WRITTEN OR RENAMED ;LOOKUP UUO EXTERNAL UDLKC,TPOPJ DFLOOK: SKIPN @UUO ;ZERO FILE NAME ? JRST DFER12 ;IF SO, ERROR. MOVEI TAC,CLSIN ;SUPPRESS INPUT CLOSE IF UDLKC IS CALLED TLNE DEVDAT,ENTRB ;ENTER DONE YET? PUSHJ PDP,UDLKC ;CLOSE OUTPUT TLZ IOS,IO ;INPUT STATE PUSHJ PDP,SETLE ;RETURNS WITH PP ON PDL JRST DFERR4 ;NO UFD, CLOCK ON JRST DFERR7 ;NO FILE, CLOCK ON. JRST DFLUK8 ;FILE BEING WRITTEN JRST DFLUK3 ;FILE BEING READ DFLUK2: MOVEI DAT,0 PUSHJ PDP,SETAT ;BUILD AN ACCESS ENTRY MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY DFLUK3: AOS TBITS(TAC) ;INCREMENT RCOUNT HRLM TAC,DEVACC(DEVDAT) ;STORE POINTER TO ACCESS ENTRY SCHEDULE MOVE TAC,DEVEXT(DEVDAT) ;FIRST RIB# PUSHJ PDP,SETPTR ;GET IN THE RETRIEVAL INFO TLZE IOS,PRCHG ;PROTECTION CHANGE FAILURE? JRST DFLUK7 ;YES. ERROR RETURN MOVSI DAT,200000 ;READ PROTECTION BIT PUSHJ PDP,PROTEK ;READ PROTECTED? JRST DFERR3 ;NAME WRONG JRST DFLUK7 ;PROTECTION FAILURE MOVE TAC1,DEVOAD(DEVDAT) ;CHECK WRITE PROTECTION FOR MOVSI DAT,100000 ;POSSIBLE SUBSEQUENT ENTER PUSHJ PDP,PROTKX TLOA TAC1,WPRO ;WRITE PROTECTED. SET FLAG TLZ TAC1,WPRO ;WRITE OK--RESET FLAG IORM TAC1,DEVOAD(DEVDAT) DFLUK4: MOVSI TAC,PTR1(DEVDAT) ;COPY INFO TO LOOKUP PARAMETER BLOCK NOSCHEDULE HRRI TAC,@UUO ;DESTINATION IS UUO PARAMETER BLOCK MOVE TAC1,TAC BLT TAC,2(TAC1) ;BLT NAME. EXT. PROTECTION, ETC FROM DDB TO USER SCHEDULE HLRE TAC,FPNTR1(DEVDAT) ;FILE LENGTH (USUALLY -WORDS) ADD UUO,3 HRLZM TAC,@UUO ;SET UP 4TH WORD OF DIRECTORY HDR. SUBI UUO,3 ;RESET UUO MOVMS TAC ;SET FILE SIZE (WORDS) IN DDB HRRM TAC,DEVCNT(DEVDAT) TLZ DEVDAT,ICLOSB MOVSI TAC,VRGPTR ;POINTERS DO EXIST ON THE DISK SO ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR THE VIRGIN POINTERS FLAG. ALLOK: MOVEI DAT,FPNTR(DEVDAT) ;SKIP FILE INFO IN FIRST RIB HRRM DAT,DEVACC(DEVDAT) ;SET VERTICAL POINTER POINTER MOVEI TAC,1 HRRM TAC,SETCNT(DEVDAT) ;"POISITONED" AT RELATIVE BLOCK 1 OF FILE MOVSI TAC,777760-WPRO-VRGPTR ;CLEAR FLAGS ANDCAM TAC,DEVOAD(DEVDAT) IFG CHKCNT,< ;TO GET AROUND CHECKSUM FAILURE WHILE READING DUMP FILES IN NON-DUMP MODE LDB TAC1,[POINT 4,-2(DAT),12] CAIGE TAC1,15 ;IS FILE IN DUMP MODE? JRST ALLXIT ;NO LDB TAC1,[POINT 4,DEVIOS(DEVDAT),35] MOVSI TAC,CKSUPR CAIGE TAC1,15 ;IS CURRENT MODE DUMP? IORM TAC,DEVOAD(DEVDAT) ;NO. SUPPRESS CHECKSUM > ALLXIT: POP PDP,TAC ;REMEMBER 0(PDP) WASS XWD PROJ,PROG AOS (PDP) ;RETURN TO CALL+2 JRST CLRBUF ;RELEASE MONITOR BUFFER DFLUK7: PUSHJ PDP,DFCL21 ;PROTECTION FAILURE,CLEAR ACCESS JRST DFERR5 ;FILE IS BEING WRITTEN DFLUK8: PUSHJ PDP,SCNAT2 ;LOOK FOR ANOTHER JRST DFLUK2 ;NO MORE JRST DFLUK3 ;FOUND WHAT MUST BE READ ;TEST FOR MFD ALTERAION EXTERNAL SYSPP,JOB,PRJPRG ALTMFD: MOVEI TAC,3(UUO) ;IS PROJ, PROG. = 1,1? TLO TAC,PROG ;RELOCATE MOVE TAC,@TAC ;XWD PROJ,PROG CAME TAC,SYSPP POPJ PDP, ;NO,RETURN MOVE ITEM,JOB XOR TAC,PRJPRG(ITEM) TLNN TAC,-1 ;PRIVILEGED USER? POPJ PDP, ;YES, RETURN JRST DFERR5 ;RENAME UUO EXTERNAL CPOPJ1 EXTERNAL THSDAT DFREN: PUSHJ PDP,DFRENX POPJ PDP, JRST CPOPJ1 DFRENX: SKIPN DEVFIL(DEVDAT) ;IS THERE AN OLD FILE? JRST DFER11 ;NO, UNDEFINED FILE TLO IOS,IO ;YES, LOOK FOR THE FILE MOVSI TAC,RENBIT ;RESET BIT ANDCAM TAC,DEVOAD(DEVDAT) ADDI UUO,3 ;POINT TO XWD PROJ,PROG PUSHJ PDP,SETLE9 ;RETURNS WITH PP ON PDL JRST DFERR4 ;NO UFD, CLOCK ON JRST DFERR7 ;NO SUCH FILE, CLOCK ON. JRST DFERR6 ;FILE BEING WRITTEN JRST DFREN1 ;ALREADY HAS ACCESS ENTRY MOVEI DAT,0 ;BUILD ACCESS ENTRY PUSHJ PDP,SETAT MOVE TAC,TAC1 ;TAC,TAC1 POINT TO ACCESS ENTRY DFREN1: AOS TBITS(TAC) ;INCREMENT RCOUNT HRLM TAC,DEVACC(DEVDAT) ;SAVE POINTER TO ACCESS ENTRY SCHEDULE HRRZ TAC,DEVEXT(DEVDAT) ;CAN THIS FILE BE RENAMED? PUSHJ PDP,SETPTR ;READ IN FIRST SET OF RETRIEVAL POINTERS MOVEI AC1,@UUO ;IS THE PROTECTION TO BE CHANGED ? MOVEI TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO IN DDB MOVE AC1,2(AC1) ;USER SPECIFIED PROTECTION XOR AC1,2(TAC) ;COMPARE WITH STORED PROTECTION TLZ IOS,PRCHG TLNN AC1,777000 ;ANY DIFFERENCES? JRST DFRN2A MOVSI DAT,400000 ;YES, CAN IT BE? PUSHJ PDP,PROTKX JRST DFREN8 ;NO, ERROR TLO IOS,PRCHG ;YES DFRN2A: MOVSI DAT,100000 ;CAN THIS BE RE-WRITTEN? PUSHJ PDP,PROTEK JRST DFERR3 ;BAD RETREIVAL INFO JRST DFRN8A ;WRITE PROTECTED TLZ IOS,PRCHG ;ARBITRARY CHANGE OK. DFREN2: NOSCHEDULE PUSHJ PDP,SCANAT ;SCAN ACCESS TABLE FROM BEGINNING JRST DFRN1B ;NO DFRN1A: MOVE DAT,TBITS(TAC) ;YES, BEING ALTERED? TRNE DAT,ATBITS ;FILE BEING CREATED OR RENAMED? JRST DFREN9 ;YES, YOU LOSE. PUSHJ PDP,SCNAT2 ;NO, CONTINUE SCANNING JRST DFRN1B JRST DFRN1A ;FOUND ANOTHER DFRN1B: HLRZ TAC,DEVACC(DEVDAT) ;SET RENAME FLAG IN FIRST ENCOUNTERED ACCESS ENTRY MOVEI AC1,RTBIT ;RENAME BIT ORM AC1,TBITS(TAC) SCHEDULE MOVE TAC,@UUO ;GET NEW FILENAME CAME TAC,DEVFIL(DEVDAT) ;SAVE AS DDB? JRST DFREN3 ;NO ADDI UUO,1 ;YES, SAME EXTENSION? MOVE TAC,@UUO ;NEW EXTENSION XOR TAC,DEVEXT(DEVDAT) ;COMPARE WITH DDB? TLNE TAC,-1 ;SAME? SOJA UUO,DFREN3 ;NO ;FILENAME AND EXTENSION ARE IDENTICAL. CHANGE ONLY PROTECTION TLZ IOS,PRCHG ;CLEAR PRTOECTION CHANGE FLAG ADDI UUO,1 ;YES, CHANGE PROTECTION LDB AC1,[POINT 9,@UUO,8] ;NEW PROTECTION HRRZ TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER,CONTAINING RETRIEVAL INFO ADDI TAC1,2 ;POINT TO PROTECTION TLNN IOS,UBFS ;BUFFER IN MONITOR CORE? TLO TAC1,PROG ;NO, RELOCATION. DPB AC1,[POINT 9,@TAC1,8] ;STORE NEW PROTECTION IN RIB PUSHJ PDP,WRI ;RE-WRITE THE BLOCK DFREXT: AOS -1(PDP) ;LEAVE POP PDP,TAC PUSHJ PDP,CLRBUF ;CLEAR NAY DUMP BUFFER JRST DFCL21 ;CLEAR ACCESS ENRTY AND EXIT DFREN3: TLZE IOS,PRCHG ;IS ONLY PROTECTION CHANGE PERMITTED? JRST DFREN8 ;YES. ERROR SINCE TRYING TO CHANGE NAME.EXT POP PDP,TAC ;BACK UP PDP PUSHJ PDP,ALTMFD ;ALTERING MFD? SKIPN @UUO ;RENAMING TO 0 (I.E. DELETING)? JRST DFREN7 ;YES MOVE TAC,DEVACC(DEVDAT) ;SAVE INFO ON OLD FILE THAT WILL BE CHANGED BY SETLE HLR TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB PUSH PDP,TAC ;SAVE XWD ACCESS POINTER, BLOCK# MOVE TA,DEVEXT(DEVDAT) ;BLOCK# OF FIRST FILE RIB HLL TA,DEVCNT(DEVDAT) ;RELATIVE TO UFD BLOCK# MOVE TB,DEVFIL(DEVDAT) ;HOLD FILE NAME MOVSI TAC,RENBIT ORM TAC,DEVOAD(DEVDAT) ;FOR "SETLE" PUSHJ PDP,SETLE0 ;LOOK FOR THIS NEW FILE NAME JRST DFERR4 ;NO UFD (SHOULD NOT HAPPEN) JRST DFREN5 ;NEW FILE NOT THERE JFCL ;NEW NAME ALREADY THERE, ERROR JFCL POP PDP,TAC SCHEDULE PUSHJ PDP,DFCL21 JRST DFER10 ;ALTER RETRIEVAL INFORMATION DFREN5: POP PDP,DAT ;BACK UP PDP MOVEM TB,DEVFIL(DEVDAT) ;RESTORE OLD FILE NAME TO DDB HRRM TA,DEVEXT(DEVDAT) ;RESTORE BLOCK# OF RIB HLLM TA,DEVCNT(DEVDAT) ;RESTORE UFD RELATIVE BLOCK MOVE TAC,(PDP) ;XWD ACCESS POINTER, BLOCK# HLLM TAC,DEVACC(DEVDAT) ;RESTORE POINTER TO ACCESS ENTRY HRLM TAC,SETCNT(DEVDAT) ;RESTORE BLOCK# OF UFD RIB HRRZ TAC,TA MOVSM TAC,DEVBLK(DEVDAT) ;RESET BLOCK#, INDEX TO RETRIEVAL POINTERS PUSHJ PDP,RRIA ;GET RETRIEVAL INFO BLOCK PUSHJ PDP,SET000 ;POINT TAC1 TO WORD 0 MOVE TAC,@UUO ;GET NEW NAME MOVEM TAC,@TAC1 ;STORE IN RIB ADDI TAC1,1 ;CHANGE EXTENSION ADDI UUO,1 MOVE TAC,@TAC1 ;GET OLD EXTENSION HLLM TAC,DEVEXT(DEVDAT) ;RESET EXTENSION IN DDB MOVE TAC,@UUO ;NEW EXTENSION HRR TAC,THSDAT ;AND ACCESS DATE ORI TAC,400000 ;INSURE IT IS NON-ZERO MOVEM TAC,@TAC1 ;STORE IN RIB ADDI TAC1,1 ;CHANGE PROTECTION ADDI UUO,1 LDB TAC,[POINT 9,@UUO,8] ;GET NEW PROTECTION DPB TAC,[POINT 9,@TAC1,8] ;STORE IN RIB PUSHJ PDP,WRI ;RE-WRITE RIB ;ALTER UFD BLOCK PUSHJ PDP,FINDE ;BRING IN CORRECT BLOCK SUBI UUO,1 ;REPLACE EXTENSION IN UFD MOVE TAC,@UUO HLLM TAC,@TAC1 SUBI UUO,1 ;AND NAME SUBI TAC1,1 MOVE TAC,@UUO MOVEM TAC,@TAC1 PUSHJ PDP,WUFD ;RE-WRITE THE BLOCK JRST DFREXT ;LEAVE ;FILE COULD NOT BE RENAMED BECAUSE OF PROTECTION DFRN8A: TLNE IOS,PRCHG ;PROTECTION CHANGE? JRST DFREN2 ;YES DFREN8: PUSHJ PDP,DFCL21 ;TAKE OUT ACCESS ENTRY JRST DFERR5 ;AND LEAVE ;FILE COULD NOT BE RENAMED BECAUSE IT WAS BEING CREATED. DFREN9: SCHEDULE PUSHJ PDP,DFCL21 ;TEAKE OUT ACCESS ENTRY JRST DFERR6 ;DELETE A FILE FROM A UFD DFREN7: PUSHJ PDP,FINDE ;FIND THE CORRECT BLOCK NOSCHEDULE MOVEI TAC1,@TAC1 SUBI TAC1,1 ;DESTINATION HRLI TAC1,2(TAC1) ;SOURCE IS ENTRY BEYOND DESTINATION HRRZ AC2,DSKBUF(DEVDAT) ADDI AC2,BLKSIZ-2 ;SET LIMIT OF BLT TLNN IOS,UBFS ;BUFFER IN MONITOR ONE? ADDI AC2,(PROG) ;NO. RELOCATE BLT TAC1,(AC2) ;MOVE SOME WORDS UP (ONE TOO MANY BECAUSE ; COULD BE DELETING 64TH ENTRY IN UFD BLOCK) SETZM @AC2 ;MAKE SURE OF ZERO SETZM 1(AC2) SCHEDULE PUSHJ PDP,WUFD ;RE-WRITE AOS (PDP) ;SKIP RETURN HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY MOVEI TAC1,DTBIT IORM TAC1,TBITS(TAC) ;SET TO DELETE WHEN THROUGH READIN JRST DFCL21 ;CLOSE ACCESS ENTRY AND LEAVE ;SET UP ARGUMENT LIST FOR LOOKUP, ENTER, AND RENAME ;SEARCH THRU MFD AND UFD FOR THE FILE-NAME, ;EXIT TO CALL+1 IF A UFD CANNOT BE FOUND. ;EXIT TO CALL+2 IF THE FILE IS NOT FOUND. ;EXIT TO CALL+3 IF FILE IS BEING WRITTEN ;EXIT TO CALL+4 IF FILE IS BEING READ ;EXIT TO CALL+5 IF THE FILE DOES NOT HAVE ACCESS ENTRY. ;UPON EXIT, (PDP) = OWNER PROJ,-PROG. NUMBER EXTERNAL SYSPP,JOB,PRJPRG,CPOPJ2,CPOPJ1 SETLE: MOVSI TAC,RENBIT ;TURN OFF THE FLAG ANDCAM TAC,DEVOAD(DEVDAT) SETLE0: MOVEM IOS,DEVIOS(DEVDAT) TLO UUO,PROG MOVE AC1,@UUO ;PICK UP FILE NAME MOVEM AC1,DEVFIL(DEVDAT) ;STORE FILE NAME AND EXT IN DDB ADDI UUO,1 HLLZ AC1,@UUO MOVEM AC1,DEVEXT(DEVDAT) ADDI UUO,2 ;UUO POINTS TO PP SETLE9: MOVE ITEM,JOB ;TRY CURRENT JOB PP. SKIPG DAT,@UUO ;IS IT A PP? MOVE DAT,PRJPRG(ITEM) ;NO. GET PP FROM TABLE. TLNE DEVDAT,SYSDEV ;SYSTEM DEVICE? MOVE DAT,SYSPP ;YES, USE SYSTEM (CUSP) PROJ,PROG # MOVEM DAT,@UUO MOVEM DAT,DEVPPN(DEVDAT) ;SAVE PRJ,PRG FOR USE BY UUOCON SUBI UUO,3 ;UUO POINTS TO FILE NAME EXCH DAT,(PDP) ;PUT PP-NUMBER IN PD LIST PUSH PDP,DAT ;PDP POINTS TO CALL+1 ;SEARCH MFD FOR THE OWNER OF THE FILE MOVE DAT,-1(PDP) ;XWD PROJ,PROG MOVSI AC1,(SIXBIT /UFD/) ;EXTENSION "UFD" MOVE TAC,MFDBLK ;BLOCK# OF MFD RIB PUSHJ PDP,DIRSRC POPJ PDP, ;UFD NOT THERE ;SEARCH UFD FOR THE FILE AOS (PDP) ;PDP POITNS TO CALL+2 ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK# HRRZ TAC,@TAC ;BLOCK# OF UFD RIB HRLM TAC,SETCNT(DEVDAT) ;SAVE BLOCK# SETZM DEVCNT(DEVDAT) ;LH WILL BE USED TO COUNT UFD BLOCKS MOVE AC1,DEVEXT(DEVDAT) PUSHJ PDP,DSRC10 ;SEARCH UFD POPJ PDP, ;FILE NOT THERE ADDI TAC,1 ;POINT TO XWD SIXBIT/EXT/,BLOCK# MOVE AC3,@TAC HRRM AC3,DEVEXT(DEVDAT) ;SAVE BLOCK# OF FIRST RIB AOS (PDP) ;PDP POINTS TO CALL+3 MOVE AC2,-1(PDP) ;XWD PROJ,PROG NOSCHEDULE PUSHJ PDP,SCNAT0 ;LOOK IN ACCESS TABLE JRST CPOPJ2 ;NOT THERE. RETURN TO CALL+5 MOVE DAT,TBITS(TAC) ;RENAMING? TRNE DAT,WTBIT ;BEING WRITTEN? POPJ PDP, ;YES. RETURN TO CALL+3 TRNN DAT,RTBIT JRST CPOPJ1 ;NO, ALL OK, RETURN TO CALL+4 MOVE TAC,DEVOAD(DEVDAT) ;ARE WE RENAMING? TLNE TAC,RENBIT POP PDP,TAC ;YES POP PDP,TAC JRST DFERR6 ;CHECK RETRIEVAL INFO FOR ELIGIBILITY ;ENTER WITH C(DAT) = PROTECTION TO CHECK IN BITS 0-2 ;EXIT TO CALL+1 IF NAME OR EXTENSION WRONG ;EXIT TO CALL+2 IF PROTECTION WRONG ;EXIT TO CALL+3 IF ALL OK EXTERNAL JOB,PRJPRG,CPOPJ1,DUMPPP PROTEK: MOVEI TAC,PTR1(DEVDAT) ;POINT TO RETRIEVAL INFO MOVE AC1,@TAC ;NAME OK? CAME AC1,DEVFIL(DEVDAT) POPJ PDP, ;NO HLLZ AC2,DEVEXT(DEVDAT) HLLZ AC1,1(TAC) ;EXTENSION FROM RIB CAM AC1,AC2 POPJ PDP, ;EXTENSION NOT RIGHT AOS (PDP) PROTKX: MOVE AC1,-1(PDP) PROTKY: MOVE ITEM,JOB XOR AC1,PRJPRG(ITEM) TRNN AC1,-1 ;SAVEM PROGRAMMER? JRST PROT1 ;YES ROT DAT,-3 ;ROTATE TO PROJECT FIELD TLNE AC1,-1 ;NO, SAME PROJECT? ROT DAT,-3 ;NO, ROTATE TO UNIVERAL FIELD PROT1: TLZ DAT,60000 ;DO NOT TEST OWNER READ OR PROTECT PROTECTION TDNN DAT,2(TAC) JRST CPOPJ1 ;PROTECTION O.K. MOVE AC1,PRJPRG(ITEM) CAMN AC1,DUMPPP ;EQUAL TO DUMPPER PROJECT ;PROGRAMMER NUMBER? AOS(PDP) ;YES, ALL FILES AVAILABLE POPJ PDP, ;CLOSE UUO ;CLOSE AN OUTPUT FILE EXTERNAL PIOMOD,WAIT1,OUT DFCLSO: TLNN DEVDAT,ENTRB ;ENTER DONE YET? POPJ PDP, ;NO, FORGET IT HLRZ TAC,DEVACC(DEVDAT) ;SHOULD WE CLOSE? (POINT TO ACCESS ENTRY) IFN FTRCHK,< SKIPN TAC ;ACCESS TABLE POINTER EXISTS? HALT . ;IF NOT, HALT, NO RE-START POSSIBLE. > MOVE TAC,TBITS(TAC) IFN FTRCHK, < TRNN TAC,ATCLO+RWTBIT ;CREATION OR UPDATE OF FILE IN PROGRESS? HALT . ;NO, ERROR. CAN'T CONTINUE > LDB TAC,PIOMOD CAIGE TAC,DR ;DUMP MODE? TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS? JRST DFCL2 ;YES TO EITHER QUESTION HLRZ TAC,DEVBUF(DEVDAT) ;NO. GET ADDRESS OF OUTPUT ; BUFFER HEADER BLOCK. TLO TAC,PROG ;RELOCATE SKIPG TAC1,@TAC ;VIRGIN BUFFERS (NO RING SET-UP) ? JRST DFCL2 ;YES, DON'T OUTPUT AOS TAC ;TAC POINTS TO OUTPUT BYTE POINTER ADD TAC1,[XWD PROG,1] ;TAC1 POINTS TO WORD COUNT PRECEDING ; USER DATA BUFFER HRRZ AC1,@TAC ;PICK UP OUTPUT BYTE POINTER SKIPE AC1 ;DON'T CALCULATE WORD COUNT IF BYTE POINTER ; NOT SET UP SUBI AC1,(TAC1) ;CALCULATE NUMBER OF WORDS USER HAS FILLED TRNE IOS,IOWC ;USER KEEPING HIS OWN WORD COUNT ? HRRZ AC1,@TAC1 ;YES, SUBSTITUTE HIS COUNT FOR ; COMPUTED WORD COUNT SKIPN AC1 ;WORD COUNT EQUAL TO 0? JRST DFCL2 ;YES, DON'T OUTPUT 0-WORD FINAL BLOCK. PUSHJ PDP,OUT ;NO, GO WRITE LAST PARTIAL BUFFER PUSHJ PDP,WAIT1 ;WAIT FOR IT TO FINISH DFCL2: PUSHJ PDP,SETBUF ;CHOOSE A BUFFER AREA FOR RETRIEVAL POINTERS TLO IOS,NMP!NCTRLC ;SET NMP, MUST NOT INTERRUPT POINTER WRITING MOVEM IOS,DEVIOS(DEVDAT) ;DO DFO4A WON'T READ NEW POINTERS IN PUSHJ PDP,DFO4A ;WRITE OUT LAST BLOCK OF POINTERS HLRZ AC1,DEVBLK(DEVDAT) XOR AC1,DEVEXT(DEVDAT) TRNE AC1,-1 ;ONLY ONE BLOCK OF POINTERS? PUSHJ PDP,RRIB ;NO. READ FIRST BLOCK INTO BUFFER PUSHJ PDP,SET000 ADDI TAC1,3 ;SET TAC1 TO POINT TO 4TH WORD OF BUFFER MOVN AC1,DEVCNT(DEVDAT) ;PICK UP AND NEGATE SIZE OF FILE HRLM AC1,@TAC1 ;NEGATIVE WORD COUNT INTO FOURTH WORD OF FIRST RIB PUSHJ PDP,WRIB ;WRITE OUT FIRST BLOCK OF RETRIEVAL INFORMATION ;CLOSE UUO CONTINUED. ;THE FILE AND ALL ITS POINTERS HAVE BEEN PUT ON DISK. ;NOW PUT ENTRY IN DIRECTORY. TLZ DEVDAT,ENTRB HLRZ TAC,DEVACC(DEVDAT) ;PICK UP ACCESS TABLE POINTER MOVE DAT,TBITS(TAC) ;GET STATUS BITS AND READ COUNT TRZE DAT,RWTBIT ;CLOSING AND UPDATED FILE? JRST DFCLU1 ;YES TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS? JRST DFC16A ;YES TRNN DAT,ATIND ;IS NAME ALREADY IN DIRECTORY? JRST DFCL20 ;NO. INSERT IT MOVEM IOS,DEVIOS(DEVDAT) PUSHJ PDP,FINDE ;BRING IN BLOCK WITH THIS ENTRY. MOVE TAC,DEVEXT(DEVDAT) ;CHANGE BLOCK POINTER EXCH TAC,@TAC1 ;TAC1 POINTS TO ENTRY IN UFD BLOCK MOVEM TAC,DEVEXT(DEVDAT);SAVE POINTER TO RIB OF OLD VERSION FOR RECLAM PUSHJ PDP,WUFD ;WRITE THE BLOCK BACK OUT HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER NOSCHEDULE PUSH PDP,ATPP(TAC) ;SAVE XWD PROJ,PROG PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY POP PDP,AC2 ;XWD PROJ,PROG PUSHJ PDP,SCNAT0 ;SCAN FOR ANY OTHERS READING OLD VERSION JRST DFCL17 ;NONE DFCL16: MOVEI AC1,DTBIT ;DELETE WHEN THRU READING SINCE IT WAS JUST UPDATED IORM AC1,TBITS(TAC) PUSHJ PDP,SCNAT2 ;LOOK FOR MORE JRST CLRBUF ;NO MORE JRST DFCL16 DFC16A: PUSHJ PDP,CLRAT ;UPON RESET UUO WITH PARTIALLY WRITTEN FILE. ; CLEAR ACCESS TABLE ENTRY RECLAIM DISK SPACE. DFCL17: SCHEDULE HRRZ TAC,DEVEXT(DEVDAT) ;RIB# OF FILE JRST RECLAM DFCL20: PUSHJ PDP,INSDIR ;INSERT THE NAME HLRZ TAC,DEVACC(DEVDAT) ;ACCESS TABLE POINTER NOSCHEDULE PUSHJ PDP,CLRAT ;REMOVE THE ACCESS ENTRY JRST CLRBUF ;CLEAR ANY BUFFER IN FREE STORAGE DFCLU1: MOVEM DAT,TBITS(TAC) ;STORE STATUS BITS (WITH UPDATE MARKER CLEARED) TLN DEVDAT,LOOKB ;WAS IUNPUT SIDE OF FILE ALSO CLOSED? POPJ PDP, ;NO, LET THE USER KEEP READING IT TRNE DAT, RCOUNT ;YES, ANYBODY ELSE STILL READING IT? JRST DFCLU2 ;YES TRNE DAT,DTBIT ;NO, WAS IT MARKED FOR DELETION? JRST DFC16A ;YES, GO DELETE IT AND RECLAIM DISK SPACE PUSHJ PDP,CLRAT ;NO, CLEAR ACCESS TABLE ENTRY DFCLU2: HRRZS DEVACC(DEVDAT) ;CLEAR POINTER TO ACCESS TABLE JRST CLRBUF ;CLEAR ANY BUFFER AREA AND EXIT., ;CLOSE UUO CONTINUED. ;CLOSE AN INPUT FILE. DFCLSI: TLZN DEVDAT,LOOKB POPJ PDP, DFCL21: HLRZ TAC,DEVACC(DEVDAT) ;POINT TO ACCESS ENTRY JUMPE TAC,CPOPJ ;EXIT IF ACCESS TABLE ALREADY CLOSED ; (PROBABLY ^C DURING EARLIER ATTEMPT) MOVE TAC1,TBITS(TAC) ;GET STATUS BITS IFN FTRCHK,< TRNE TAC1,ATCLO ;IS THIS FILE SIMPLY BEING CREATED (NOT UPDATED)? HALT CPOPJ ;IF SO, SOMEBODY IS VERY CONFUSED. > NOSCHEDULE SOS TAC1,TBITS(TAC) ;DECREMENT RCOUNT TRNE TAC1,RCOUNT+RWTBIT ;ANY MORE READS? OR OUTPUT CLOSE TO DO? JRST DFCL23 ;YES, LEAVE TRNE TAC1,DTBIT ;TO BE DELETED? JRST DFC16A ;YES PUSHJ PDP,CLRAT ;CLEAR THE ENTRY AND EXIT DFCL23: SCHEDULE TLZN DEVDAT,INPB ;ANY INPUT UUO' JRST CLRBUF ;NO, JUST EXIT, RETURNING MON BUF PUSHJ PDP,SETBUF ;YES, UPDATE ACCESS DATE AS FOLLOWS: PUSHJ PDP,RRIB ;READ IN JUST BLOCK OF RETRIEVAL INFORMATION. SUBI TAC1,BLKSIZ-2 ;SET TAC1 TO 2ND WORD OF BLOCK LDB AC1,[POINT 17,@TAC1,35] ;GET PREVIOUS ACCESS DATA. CAMN AC1,THSDAT ;ALREADY ACCESSED EARLIER TODAY? JRST CLRBUF ;YES, JUST CLEAR BUFFER AND EXIT. MOVE AC1,THSDAT ;NO, STORE TODAY(S DATE AS NEW ACCESS DATE. DPB AC1,[POINT 17,@TAC1,35] ; PUSHJ PDP,WRIB ;REWRITE FIRST BLOCK OF RETRIEVAL INFORMATION. JRST CLRBUF ;CLEAR BUFFER AND EXIT. SUBTTL DIRECTORY SEARCHING ;SEARCH DIRECTORY FOR A PARTICULAR ENTRY. ;ENTRY BY: MOVE DAT,NAME ; HLLZ AC1,EXTENSION ; HRRZ TAC,BLOCK NUMBER FOR POINTERS ; PUSHJ PDP,DIRSRC ; EXIT1 NAME NOT FOUND ; EXIT2 NAME FOUND, TAC POINTS TO ENTRY DIRSRC: PUSH PDP,AC1 PUSH PDP,DAT ;0(PDP) IS FILENAME,-1(PDP) IS EXTENSION PUSHJ PDP,SETPTR ;READ UFD RETRIEVAL POINTERS DRSRC0: HRRZ TAC,DEVACC(DEVDAT) CAILE TAC,PTRN(DEVDAT) ;MORE POINTERS IN CORE? JRST DRSRC7 ;NO, GET MORE. HRRZ TAC,(TAC) JUMPE TAC,DRSRC6 ;0 SIGNALS END OF POINTERS AOS DEVACC(DEVDAT) ;NEXT POINTER AOS DEVCNT(DEVDAT) ;COUNT UFD BLOCKS SEARCHED PUSHJ PDP,MQIN ;READ IN DATA BLOCK JRST RERA ;ERROR, YOU LOSE. MOVE TAC1,DSKBUF(DEVDAT) ;XWD-L,POINTER HRRZ TAC,TAC1 TLNN IOS,UBFS ;DUMP MODE? HRLI TAC,PROG ;NO. RELOCATE. HLLZ AC1,-1(PDP) ;SIXBIT/EXT/ DRSR3A: SKIPN AC3,@TAC ;BLOCK ENTIRELY SEARCHED? JRST DRSRC0 ;YES ADDI TAC,1 CAMN AC3,(PDP) ;NAMES MATCH? JRST DRSRC8 ;YES DRSRC4: ADDI TAC,1 HRRZ AC3,TAC CAIE AC3,BLKSIZ(TAC1) ;IS BLOCK ENTIRELY SEARCHED? JRST DRSR3A ;NO JRST DRSRC0 DRSRC7: TLNE IOS,NMP ;ANY MORE POINTERS ON DISK? JRST DRSRC6 ;NO PUSHJ PDP,GETPTR ;YES, GET SOME JRST DRSRC0 DRSRC8: HLLZ AC3,@TAC ;DOES EXTENSION MATCH CAME AC3,AC1 JRST DRSRC4 ;NO SUBI TAC,1 ;POINT TO FIRST WORD OF ENTRY AOS -2(PDP) ;YES, ENTRY IS FOUND MOVSS DEVCNT(DEVDAT) ;SAVE COUNT OF UFD BLOCKS FOR USE AT CLOSE ;EXIT DRSRC6: POP PDP,DAT POP PDP,AC1 POPJ PDP, ;"FILE" NOT FOUND ;CHECK PROTECTION ON UFD DSRC10: PUSH PDP,AC1 ;PUSH EXTENSION PUSHJ PDP,SETPTR MOVSI DAT,200000 ;SET UP TO TEST READ BIT TLNE IOS,10 ;IS IT LOOKUP? ROT DAT,-1 ;NO,TEST WRITE PROTECTION MOVEI TAC,PTR1(DEVDAT) HRRZ AC1,-3(PDP) ;XWD PROJ,PROG TLZ IOS,PRCHG PUSHJ PDP,PROTKY TLO IOS,PRCHG ;FLAG PROTECTION CHANGE PUSH PDP,DEVFIL(DEVDAT) ;PUSH FILENAME TO MAKE PDL LOOK LIKE DIRSRC JRST DRSRC0 ;FIND A UFD ENTRY, IT MUST BE THERE. EXTERNAL AUREQ,AUWAIT FINDE: AOSE AUREQ PUSHJ PDP,AUWAIT TLO IOS,AUFLG HLRZ TAC,SETCNT(DEVDAT) ;SET TAC TO UFD POINTERS HLRZ DAT,DEVCNT(DEVDAT) ;SET DAT TO COUNT COMPUTED BY DIRSRC ADDI DAT,DIRSIZ FINDE1: MOVSM TAC,DEVBLK(DEVDAT);READ A POINTER BLOCK PUSHJ PDP,RRIA CAILE DAT,BLKSIZ-2 ;POINTER IN THIS BLOCK? JRST FINDE2 ;NO, GET NEXT ONE SUBI DAT,1 ;YES, BRING THEM IN HRRM DAT,DEVBLK(DEVDAT) ;SET INDEX INTO RIB PUSHJ PDP,DFIN4 ;COPY POINTERS INTO DDB HRRZ TAC,PTR1(DEVDAT) ;GET RETRIEVAL POINTER FOR UFD BLOCK PUSHJ PDP,MQIN ;READ THE UFD BLOCK JRST RERA ;ERROR PUSHJ PDP,SET000 ;FIND THE ENTRY HLLZ AC1,DEVEXT(DEVDAT) ;GET EXTENSION FROM DDB SRCU1: MOVE TAC,@TAC1 ;GET FILE NAME FROM UFD ADDI TAC1,1 CAME TAC,DEVFIL(DEVDAT) ;SAME? AOJA TAC1,SRCU1 ;NAMES DO NOT MATCH HLLZ TAC,@TAC1 ;GET EXTENSION FROM UFD CAME TAC,AC1 ;SAME? AOJA TAC1,SRCU1 ;EXTENSIONS DO NOT MATCH POPJ PDP, ;FOUND IT FINDE2: PUSHJ PDP,SET176 ;GET THE NEXT POINTER BLOCK HLRZ TAC,@TAC1 SUBI DAT,BLKSIZ-2 ;BACK UP DAT JRST FINDE1 ;INSERT AN ENTRY IN A DIRECTORY. EXTERNAL AUREQ,AUWAIT,AUAVAL INSDIR: AOSE AUREQ PUSHJ PDP,AUWAIT TLO IOS,AUFLG SETZM DEVCNT(DEVDAT) ;CLEAR BEFORE COUNTING BLOCK OF UFD HLRZ TAC,SETCNT(DEVDAT) ;BLOCK# OF UFD RIB PUSHJ PDP,SETPTR ;SET UP FIRST POINTERS,. SOS DEVACC(DEVDAT) ;SYNC INSD1: AOS TAC,DEVACC(DEVDAT) ;GET NEXT POINTER, HRRZS TAC AOS DEVCNT(DEVDAT) ;COUNT EACH UFD BLOCK CAILE TAC,PTRN(DEVDAT) ;ANY MORE IN CORE? JRST INSD10 ;NO, GET SOME MORE INSD2: HRRZ TAC,(TAC) ;GET RETRIEVAL POINTER JUMPE TAC,INSD5 ;0 SIGNALS END OF POINTERS PUSHJ PDP,MQIN ;READ UFD BLOCK JRST RERA ;ERROR. PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127 SKIPE @TAC1 ;IS IT ZERO? JRST INSD1 ;NO, BLOCK FULL. MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE# OF BLOCK CONTAINING NEW ENTRY PUSHJ PDP,INSD3 ;INSERT ENTRY. JRST WUFD ;WRITE BLOCK AND LEAVE ;INSERT THE ENTRY. INSD3: HRRZ AC1,DSKBUF(DEVDAT) INSD3B: CAIN AC1,(TAC1) ;BEGINNING OF BLOCK? JRST INSD3A ;YES SUBI TAC1,2 SKIPN @TAC1 ;SEARCH UFD BLOCK BACKWARDS ; FOR LAST NON-ZERO FILENAME. JRST INSD3B ADDI TAC1,2 ;MOVE IN NAME. INSD3A: MOVE TAC,DEVFIL(DEVDAT) MOVEM TAC,@TAC1 ADDI TAC1,1 ;MOVE IN EXTENSION & POINTER. MOVE TAC,DEVEXT(DEVDAT) IFN FTRCHK,< TRNN TAC,-1 ;POINTER TO BLOCK 0 HALT .+1 ;FOR RETRIEVAL INFO ; CONTINUE-GET BAD INFO MESSAGE > MOVEM TAC,@TAC1 POPJ PDP, ;CREATE NEW UFD BLOCK AND ADD ENTRY. THEN FIND THE LAST OR ONLY ;POINTER BLOCK, ADD POINTER IF POSSIBLE. IF NOT POSSIBLE. ;CREATE NEW POINTER BLOCK AND PUT THE POINTER IN IT. INSD5: PUSHJ PDP,SET000 ;@TAC1 POINTS TO WORD 0 OF BUFFER NOSCHEDULE MOVEI TAC,@TAC1 ;POINT TO WORD 0 OF BUFFER SETZM 2(TAC) ;CLEAR FOR BLT MOVSI DAT,2(TAC) ;SOURCE HRRI DAT,3(TAC) ;DESTINATION BLT DAT,BLKSIZ-1(TAC) ;CLEAR WORDS 2.-127. SCHEDULE PUSHJ PDP,INSD3A ;INSERT ENTRY IN WORDS 0,1 MOVSS DEVCNT(DEVDAT) ;SAVE RELATIVE BLOCK# OF THIS UFD BLOCK PUSHJ PDP,DFGETF ;GET A FREE BLOCK MOVEM TAC,SETCNT(DEVDAT) ;SAVE IT IFG CHKCNT,< MOVE TAC,DSKBUF(DEVDAT) PUSHJ PDP,CHKSUM HRLM TAC1,SETCNT(DEVDAT) MOVE TAC,SETCNT(DEVDAT) > INSD5A: PUSHJ PDP,MQOUT ;WRITE THE UFD BLOCK OUT JRST INSD11 ;ERROR PUSHJ PDP,RRI ;READ POINTER BACK IN. INSD6: PUSHJ PDP,SET176 HLRZ TAC,@TAC1 ;LAST OR ONLY BLOCK? JUMPE TAC,INSD7 PUSHJ PDP,RRIA ;NO, READ NEXT ONE. JRST INSD6 INSD7: SUBI TAC1,1 ;YES, ROOM FOR ANOTHER POINTER? SKIPN @TAC1 SOJA TAC1,INSD8 PUSHJ PDP,NEWRIB ;CREATE NEW POINTER BLOCK. PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD INSD7A: MOVE TAC,SETCNT(DEVDAT) ;GET POINT SAVED ABOVE MOVEM TAC,@TAC1 ;STORE POINTER TO NEW UFD BLOCK PUSHJ PDP,WRI ;WRITE BLOCK SOSL AUREQ ;RELEASE UFD RESOURCE SETOM AUAVAL TLZ IOS,AUFLG MOVEM IOS,DEVIOS(DEVDAT) POPJ PDP, ;ROOM FOR ANOTHER POINTER IN THIS BLOCK. FIND LAST POINTER. ;INSERT NEW ONE, AND WRITE BLOCK OUT. INSD8: SKIPN @TAC1 SOJA TAC1,INSD8 ;SCAN BACKWARDS FOR LAST POINTER AOJA TAC1,INSD7A ;FOUND IT. ADD NEW ONE. ;GET MORE POINTERS INTO CORE. INSD10: TLNE IOS,NMP ;ANY MORE ON DISC? JRST INSD5 ;NO PUSHJ PDP,GETPTR MOVE TAC,DEVACC(DEVDAT) JRST INSD2 ;WRITE ERROR. IF WRITE-LOCK. FIX IT. INSD11: TRNN IOS,IOIMPM JRST WERA ;IT WAS NOT, YOU LOSE. PUSHJ PDP,WLERA ;GET ANOTHER BLOCK HRRM TAC,SETCNT(DEVDAT) JRST INSD5A ;OUTPUT A UFD BLOCK, PERFORM CHECKSUM IF NEEDED, WRITE THE BLOCK OUT. ;IF WRITE-LOCK ERROR, TRY ANOTHER BLOCK. FINALLY, IF POINTERS WERE ;ALTERED, WRITE THEM OUT. EXTERNAL AUREQ,AUAVAL WUFD: IFG CHKCNT,< MOVE TAC,DSKBUF(DEVDAT) ;POINTER TO BUFFER PUSHJ PDP,CHKSUM ;RETURN CHECKSUM IN TAC1 > MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION IFG CHKCNT,< HRLM TAC1,(TAC) ;STORE CHECKSUM IN RETRIEVAL POINTER MOVSI TAC1,PNTDIF ORM TAC1,DEVOAD(DEVDAT) ;NOTE THAT POINTERS IUN DDB NOT=DISK > IFLE CHKCNT,< MOVE TAC1,DEVOAD(DEVDAT) TLO TAC1,PRTOUT TLZ TAC1,PNTDIF MOVEM TAC1,DEVOAD(DEVDAT) > HRRZ TAC,(TAC) ;GET BLOCK# FROM RETRIEVAL POINTER WUFD1: PUSHJ PDP,MQOUT ;WRITE UFD BLOCK JRST WUFD3 ;WRITE ERROR MOVE TAC,DEVOAD(DEVDAT) TLO IOS,NMP ;SET NMP MOVEM IOS,DEVIOS(DEVDAT) ;SO WON'T READ POINTERS TLN TAC,PNTDIF ;WERE POINTERS CHANGED? PUSHJ PDP,DFO4A ;YES, WRITE THEM OUT. SOSL AUREQ ;RELEASE UFD RESOURCE SETOM AUAVAL TLZ IOS,AUFLG ;NOTE THAT UFD RELEASED MOVEM IOS,DEVIOS(DEVDAT) POPJ PDP, WUFD3: MOVE TAC1,DSKCNT(DEVDAT);WAS ERROR WRITE-LOCK? TRNN TAC1,IOIMPM JRST WERA TRZ IOS,IOIMPM ;YES MOVEM IOS,DEVIOS(DEVDAT) MOVSI TAC1,PNTDIF ORM TAC1,DEVOAD(DEVDAT) PUSHJ PDP,WLERA ;FREE CURRENT ASSIGNED BLOCK AND GET A NEW ONE MOVE TAC1,DEVACC(DEVDAT) HRRM TAC,(TAC1) JRST WUFD1 SUBTTL ACCESS TABLE PROCESSING ;SCAN ACCESS TABLE. ;EXIT TO CALL+1 WITH TAC SET TO THE LAST ENTRY IF NOT THERE. ;EXIT TO CALL+2 WITH TAC SET TO CORRECT ENTRY IF THERE. EXTERNAL CPOPJ1,CPOPJ SCANAT: MOVE AC2,-1(PDP) SCNAT0: SKIPN TAC,FAT ;ANY AT ALL? SCNHLT: POPJ PDP, ;NO, LEAVE (HALT PC HERE IF ATTEMPT ; TO CLEAR NON-EXISTANT ACCESS TABLE) SCNAT1: CAME AC2,ATPP(TAC) ;PROJ,-PROG. THE SAME? JRST SCNAT2 ;NO MOVE DAT,DEVFIL(DEVDAT) ;NAMES THE SAME? CAME DAT,ATNAME(TAC) JRST SCNAT2 HLLZ DAT,ATEXT(TAC) ;EXTENSION THE SAME? HLLZ AC3,DEVEXT(DEVDAT) CAMN DAT,AC3 JRST CPOPJ1 ;YES ;CONTINUE SCAN FROM CURRENT ENTRY SCNAT2: HRRZ DAT,ATLINK(TAC) ;ANY MORE ENTRIES? JUMPE DAT,CPOPJ ;NO MOVE TAC,DAT ;YES, GO TO THE NEXT ONE JRST SCNAT1 ;CLEAR AN ACCESS ENTRY. ;IT IS ASSUMED THAT NO SCHEDULING WILL TAKE PLACE. ;ENTER WITH TAC POINTING TO THE ENTRY TO WIPE OUT. CLRAT: IFN FTRCHK,< SKIPN TAC ;ATTEMPT TO CLEAR NON EXISTENT ACCESS TABLE IS AN ERROR HALT SCNHLT ;CONTINUE WILL POPJ AND EXIT. > HRRZS DEVACC(DEVDAT) ;CLEAR ACCESS TABLE POINTER IN DEVICE DATA BLOCK MOVEI AC2,FAT ;START AT BEGINNING OF LINKED ACCESS TABLE ENTRIES SUBI AC2,ATLINK CLRAT1: MOVE AC1,AC2 ;PICKUP THE NEXT ACCESS TABLE HRRZ AC2,ATLINK(AC1) IFN FTRCHK,< SKIPN AC2 ;ZERO LINK INDICATES END OF TABLE WITHOUT ;FINDING ENTRY TO BE CLEARED HALT SETHLT ;CONTINUING AFTER THIS ERROR WILL CONTINUE ; NORMALLY (IE POPJ) > CAME AC2,TAC ;DOES THIS ENTRY LINK TO THE ONE TO BE CLOBBERED? JRST CLRAT1 ;NO,CONTINUE SERACH MOVE AC2,ATLINK(TAC) ;YES, FOUND IT HRRM AC2,ATLINK(AC1) ;LINK AROUND IT JRST CLRCOR ;CLEAR THE CORE ;FIND A HOLD FOR ACCESS TABLE ENTRY AND SET A LINK. ;BUILD UP THE ENTRY ;UPON ENTRY, DAT SHOULD CONTAIN TEST BITS TO SET SETAT: PUSHJ PDP,GETFCR ;TAC1 POINTS TO 4 WORD BLOCK HLL DAT,DEVEXT(DEVDAT) MOVEM DAT,ATEXT(TAC1) ;STORE EXTENSION MOVE DAT,DEVFIL(DEVDAT) MOVEM DAT,ATNAME(TAC1) ;STORE FILE NAME MOVE DAT,-1(PDP) ;XWD PROJ,PROG MOVEM DAT,ATPP(TAC1) ;STORE XWD PROJ,PROG HLL DAT,SETCNT(DEVDAT) ;LOGICAL BLOCK# OF UFD RIB HRR DAT,FAT ;POINTER TO NEXT ENTRY MOVEM DAT,ATLINK(TAC1) ;STORE LINKE HRRZM TAC1,FAT ;POINT FAT TO THIS NEW ENTRY SETHLT: POPJ PDP, ;HALT PC HERE IF END OF TABLE WITHOUT FINDING ; ENTRY TO BE CLEARED SUBTTL DUMP INPUT/OUTPUT ;DUMP MODE OUTPUT EXTERNAL COMCHK,ADRERR,SAVDDL DFDMPO: TLNN DEVDAT,ENTRB ;ENTER YET? JRST DFERR2 ;NO, UNDEFINED FILE TLO IOS,10 ;OUTPUT STATUS MOVEM IOS,DEVIOS(DEVDAT) PUSHJ PDP,COMCHK ;CHECK IOWDS JRST ADRERR ;ERROR DFDO0: SKIPN TAC,@UUO ;PICK UP NEXT IOWD POPJ PDP, ;IT WAS ZERO, LEAVE TLNE TAC,-1 ;LH ZERO? JRST DFDO0A ;NO HRR UUO,TAC ;YES, ANOTHER TABLE JRST DFDO0 DFDO0A: ADDI TAC,1 ;FORM XWD - LENGTH, FIRST-ADDRESS PUSH PDP,TAC ;SAVE IT DFDO1: PUSHJ PDP,UPDA ;SET DAREQ INTERLOCK (SAT BLOCKS MAY ONLY ; BE MANIPULATED BY ONE USER AT A TIME!) DFDO1A: PUSHJ PDP,SATGET ;AQUIRE A NON-FULL SAT BLOCK ; ITEM IS DESTROYED IF SATGET CALLS MQIN,MQOUT HLRE ITEM(PDP) ;ITEM < [LH OF IOWD]/200 MOVMS ITEM ADDI ITEM,BLKSIZ-1 ;MAKE E.G. 129 WORDS USE 2 DISK BLOCK ASH ITEM,-BLKP2 ;NUMBER OF BLOCK REQUIRED FOR THIS WRITE DFD02A: HRRZ AC1,SATPTR MOVE AC2,SATBK2 DFDO1B: PUSHJ PDP,GETBIT ;ASK FOR C(ITEM BITS) JRST DFDO6 ;NOT AVAILABLE ADDM ITEM,@SATPTR ;INCREMENT COUNT SETOM SATCHG ;SAT BLOCK HAS BEEN CHANGED HLRZ DAT,@SATPTR ;COMPUTE BLOCK NUMBER LESS 1. SCHEDULE PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK. ADDI DAT,-2(TAC1) PUSH PDP,DAT ;AND SAVE BLOCK NUMBER LESS 1 PUSH PDP,ITEM ;SAVE COUNT OF BLOCKS WRITTEN MOVE TAC1,-2(PDP) ;SET UP AN IOWD (SAVED AT DFDO0A) MOVEM TAC1,DSKBUF(DEVDAT) MOVN TAC,ITEM LSH TAC,BLKP2 HLRES TAC1 CAML TAC,TAC1 HRLM TAC,DSKBUF(DEVDAT) ;ONLY A PARTIAL WRITE HLRE TAC1,DSKBUF(DEVDAT) MOVMS TAC1 PUSHJ PDP,UPDEVC ;UPDATE SIZE OF FILE ADDM ITEM,SETCNT(DEVDAT) ;NON UPDATE RELATIVE BLOCK# WITHIN THE FILE MOVE TAC1,DSKBUF(DEVDAT) ;PICK UP ADDRESS AND WORD COUNT TLZN TAC1,BLKSIZ-1 ;AN EVEN NUMBER OF DISK BLOCKS TO BE WRITTEN? JRST DFDO2G ;YES, DON'T WORRY ABOUT PARTIAL BLOCK ;HANDLING PROBLEMS PUSH PDP,TAC1 ;NO, SAVE ADDRESS WITH COUNT OF FULL BLOCKS-1 ; TO BE WRITTEN PUSH PDP,DSKBUF(DEVDAT) ;SAVE,ORIGINAL ADDRESS ;EXACT WORD COUNT ALSO PUSHJ PDP,SETBUF ;GET MONITOR BUFFER MOVE TAC1,DSKBUF(DEVDAT) ;TAC1 GETS ADDRESS OF MONITOR BUFFER ; (RELOCATION NOT NECESSARY) POP PDP,TAC ;USER'S INITIAL ADDR AND WC PUSHJ PDP,SAVDDL ;ADJUST IN CASE THIS IS A SAVE OF A ; HIGH SEGMENT, WHICH WAS MOVED IN CORE ; DURING I/O WAIT. MOVE AC1,TAC HRRZ TAC,-2(PDP) ;GET INITIAL BLOCK NUMBER-1 DFDO2C: ADD AC1,[XWD BLKSIZ,BLKSIZ] ;SET UP ADDRESS, WORD COUNT, AND LOGICAL AOS TAC ;BLOCK NUMBER FOR LAST (PARTIAL) BLOCK JUMPL AC1,DFDO2C ;OF THIS DUMP MODE OUTPUT REQUEST. SUB AC1,[XWD BLKSIZ,BLKSIZ] HLL AC2,AC1 ;SAVE LH ADDI AC1,(PROG) ;RELOCATE USER'S ADDRESS HLL AC1,AC2 ;IN CASE OF OVERFLOW INTO LH(2 SEG SAVE) DFDO2D: MOVE AC2,(AC1) ;MOVE DATA FROM END OF USER'S MOVEM AC2,(TAC1) ;OUTPUT AREA DT MONITOR BUFFER AOBJP TAC1,. AOBJP AC1,DFDO2D DFDO2E: SETZM (TAC1) ;ZERO OUT THE REMAINDER OF THE MONTOR BUFFER AOBJN TAC1,DFDO2E PUSHJ PDP,MQOUT ;WRITE OUT THE PARTIAL FULL MONITOR BUFFER ; WHICH CONTAINS THE LAST BLOCK OF THE DUMP MODE ; MODE OUTPUT REQUEST JFCL ;IGNORE ERROR RETURN PUSHJ PDP,CLRBUF ;RELINQUISH THE MONTOR BUFFER POP PDP,DSKBUF(DEVDAT) ;RETRIEVE ORIGINAL ADDRESS MOVSI TAC1,BLKSIZ ;WITH WORD COUNT THSAT HAS LOW-ORDER BITS CLEARED ADDB TAC1,DSKBUF(DEVDAT) ;ADD IN BLOCK SIZE TO DETERMINE NUMBER ; NUMBER OF FULL BLOCKS YET TO BE WRITTEN JUMPG TAC1,DFDO2B ;IF NO FULL BLOCKS TO BE WRITTEN SKIP OVER ; OUTPUT SEQUENCE DFDO2G: MOVE TAC,DSKBUF(DEVDAT) ;ORIGINAL ADDRESS AND WORD COUNT PUSHJ PDP,SAVDDL ;AJDUST IN CASE OF SAVE OF HIGH SEG ; WHICH HAS MOVED DURING IO WAIT MOVEM TAC,DSKBUF(DEVDAT) ;STORE BACK IN DDB MOVE TAC,-1(PDP) ;WRITE THE BLOCKS ADDI TAC,1 PUSHJ PDP,MQOUT JRST DFDO7 ;ERROR DFDO2B: POP PDP,ITEM ;RESTORE COUNT ;TOSS OUT A SERIES OF CONSECUTIVE POINTERS HRRZ AC2,DEVACC(DEVDAT) ;GET RETRIEVAL POINTER POINTER DFDO3A: MOVE AC1,@AC2 ;IS POINTER ALREADY THERE? ADDI AC2,1 TRNE AC1,-1 JRST DFDO9 ;YES CAIG AC2,PTRN(DEVDAT) ;NO, IS THERE A NEXT ONE? SETZM @AC2 ;CLEAR NEXT POINTER TLO IOS,NMP ;FLAG END OF POINTERS MOVEM IOS,DEVIOS(DEVDAT) DFDO3B: AOS DAT,(PDP) ;PUT A POINTER IN CORE HRRZM DAT,-1(AC2) ;STORE NEW POINTER IN DDB MOVSI DAT,PNTDIF ORM DAT,DEVOAD(DEVDAT) ;SHOW THAT POINTERS IN DDB NOT=DISK IFG CHKCNT,< ;GET CHECKSUM MOVE TAC,-1(PDP) PUSHJ PDP,SAVDDL ;ADJUST ADR IN CASE OF HIGH SEG SAVE PUSHJ PDP,CHKSUM HRLM TAC1,-1(AC2) > CAILE AC2,PTRN(DEVDAT) ;MORE POINTERS? JRST DFDO4 ;LAST POINTER IN CORE DFDO3C: MOVE TAC1,[XWD BLKSIZ,BLKSIZ];INCREMENT IOWD ADDM TAC1,-1(PDP) SOJG ITEM,DFDO3A ;ANY MORE? POP PDP,DAT HRRM AC2,DEVACC(DEVDAT) SKIPGE (PDP) JRST DFDO1 ;NOT FINISHED, GET NEXT SET POP PDP,TAC ;BACK UP PDP AOJA UUO,DFDO0 ;GO BAK FOR MORE ;WRITE POINTERS ONTO DISK DFDO4: HRLM ITEM,(PDP) ;SAVE COUNT OF BLOCKS TO WRITE PUSHJ PDP,SETBUF ;FIND SOME 200 WORD AREA PUSHJ PDP,DFO4A ;WRITE THEM PUSHJ PDP,CLRBUF ;CLEAR THE AREA MOVEI AC2,PTR1(DEVDAT) ;RESET AC2 TO FIRST POINTER HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE JRST DFDO3C DFDO6: LSH ITEM,-1 ;TRY FOR 1/2 EARLIER REQUEST JUMPN ITEM,DFDO1B ;CONTINUE IF NON-ZERO MOVEI TAC,NUMBIT ;BITS/SAT BLOCK HRRM TAC, @SATPTR ;MARK SAT ENTRY FULL JRST DFDO1A ;TRY ANOTHER SAT BLOCK ;ERROR WHILE WRITING, IF WRITE-LOCK, FIX IT, DFDO7: HRRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK? TRNN TAC,IOIMPM JRST DFDO2B ;NO, TOO BAD. HLRZ TAC,DSKCNT(DEVDAT) PUSHJ PDP,SETWL ;SET WRITE-LOCK BIT IN SAT ENTRY. DFDO8: AOS TAC,-1(PDP) PUSHJ PDP,SETFRE SOSLE (PDP) JRST DFDO8 SUB PDP,[XWD 2,2] JRST DFDO1 ;TRY AGAIN. ;WE ARE WRITING IN MIDDLE OF FILE, FREE THE OLD BLOCK. DFDO9: HRLM ITEM,(PDP) ;SAVE BLOCK COUNT WITH BLOCK# PUSH PDP,AC2 ;SAVE POINTER TO RETRIEVAL INFO IN DDB HRRZ TAC,-1(AC2) ;GET OLD BLOCK# FROM DDB PUSHJ PDP,SETFRE POP PDP,AC2 ;RESTORE POINTER INTO RETRIEVAL INFO HLRZ ITEM,(PDP) ;RESTORE COUNT OF BLOCKS TO WRITE THIS ITERATION JRST DFDO3B ;DUMP MODE INPUT. EXTERNAL COMCHK,ADRERR DFDMPI: TLNN DEVDAT,LOOKB ;LOOKUP YET? JRST DFERR2 ;NO, UNDEFINED FILE TLNE IOS,IOEND ;END-FILE? JRST DFDI1C ;YES TLZ IOS,IO ;INPUT STATUS MOVEM IOS,DEVIOS(DEVDAT) PUSHJ PDP,COMCHK ;CHECK IOWDS JRST ADRERR ;ERROR DFDI0: SKIPN TAC,@UUO ;PICK UP NEXT IOWD POPJ PDP, ;NO MORE, LEAVE. TLNE TAC,-1 ;LH ZERO? JRST DFDI0A ;NO HRR UUO,TAC ;YES, ANOTHER LIST. JRST DFDI0 DFDI0A: ADDI TAC,1 ;FROM XWD -L,FIRST-ADDRESS PUSH PDP,TAC HLRZ TAC1,TAC ;GET LENGTH FROM IOWD CAIGE TAC1,NBLKSZ ;LESS THAN 1 BLOCK? HRLI TAC,NBLKSZ ;YES, MUST WRITE AT LEAST 1 FULL BLOCK PUSH PDP,TAC ;IOWD FOR FIRST BLOCK HRRZ AC2,DEVACC(DEVDAT) ;PICK UP FIRST POINTER CAILE AC2,PTRN(DEVDAT) ;ANY LEFT IN CORE? PUSHJ PDP,DFDI9 ;NO, GET SOME MORE SKIPN @AC2 ;IS A POINTER THERE? JRST DFDI1B ;NO. EXIT PUSH PDP,@AC2 ;SAVE THE POINTER MOVE TAC,[XWD BLKSIZ,BLKSIZ] ;INCREMENT IOWD ADDM TAC,-2(PDP) AOS DEVACC(DEVDAT) ;NEXT POINTER AOS SETCNT(DEVDAT) ;NEXT RELATIVE BLOCK DFDI1: SKIPGE -2(PDP) ;MORE TO GO? JRST DFDI2 ;YES DFDI1A: MOVE TAC1,-1(PDP) ;NO, PROCESS THE FIRST BLOCK MOVEM TAC1,DSKBUF(DEVDAT) ;SAY WHERE TO READ DATA MOVE TAC,(PDP) ;GET FIRST LOGICAL BLOCK# PUSHJ PDP,MQIN JFCL ;ERRORS IGNORED. REPEAT 0, < ;TEMPORARILY DELETE THIS CODE DUE TO SAVE-GET PROBLEM. IFG CHKCNT,< ;COMPARE CHECKSUM MOVE TAC,-1(PDP) PUSHJ PDP,CHKSUM HLRZ TAC,(PDP) MOVEI AC1,IODTER CAME TAC,TAC1 ORM AC1,DEVIOS(DEVDAT) MOVE IOS,DEVIOS(DEVDAT) > > SUB PDP,[XWD 3,3] ;REMOVE INTERMEDIATE STORAGE FROM PDL AOJA UUO,DFDI0 ;GO BACK FOR MORE. DFDI1B: SUB PDP,[XWD 2,2] ;BACK UP PDP, REMOVE XWD AND IOWD DFDI1C: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT ORB IOS,DEVIOS(DEVDAT) POPJ PDP, ;DUMP INPUT CONTINUED, ;FIND A SERIES OF CONSECUTIVE BLOCKS TO READ AT ONCE DFDI2: HRRZ AC2,DEVACC(DEVDAT) ;GET NEXT POINTER CAILE AC2,PTRN(DEVDAT) ;ANY MORE POINTERS IN CORE? PUSHJ PDP,DFDI9 ;NO GET SOME MORE SKIPN @AC2 ;YES JRST DFDI8 ;END-FILE PUSH PDP,AC2 ;SAVE POINTER TO POINTER HLRZ TAC,-3(PDP) ;GET LENGTH OF REMAINING INPUT HRRZ TAC1,(AC2) ;GET BLOCK# FROM DDB DFDI3: ADDI TAC,BLKSIZ ;ANY MORE TO READ? TLNE TAC,1 JRST DFDI5 ;NO ADDI AC2,1 CAIG AC2,PTRN(DEVDAT) SKIPN AC3,@AC2 ;END-FILE JRST DFDI4 ;YES CAIN TAC1,-1(AC3) ;STILL CONSECUTIVE? AOJA TAC1,DFDI3 ;YES, LOOP DFDI4: MOVE TAC,(PDP) ;COMPUTE COUNT SUB TAC,AC2 ;DIFFERENCE BETWEEN POINTERS IS # OF BLOCKS LSH TAC,BLKP2 ;COMPUTE WORDS JRST DFDI6 DFDI5: HLRE TAC,-3(PDP) ;GET LENGTH OF INPUT ADDI AC2,1 DFDI6: HRRZ TAC1,DEVACC(DEVDAT) SUBI TAC1,(AC2) MOVMS TAC1 ADDM TAC1,SETCNT(DEVDAT) HRRM AC2,DEVACC(DEVDAT) ;STORE NEW POINTER POINTER MOVS TAC1,@TAC HRLM TAC,(PDP) HRR TAC1,-3(PDP) MOVE TAC,(PDP) ;GET POINTER TO FIRST RETRIEVAL POINTER FOR THIS INPUT MOVE TAC,(TAC) ;GET FIRST LOGICAL BLOCK# MOVEM TAC1,DSKBUF(DEVDAT) ;STORE CONTROLLING IOWD PUSHJ PDP,MQIN ;REQUEST THE INPUT JFCL ;ERRORS IGNORED ;DUMP INPUT CONTINUED. ;IF THERE IS CHECKSUMMING. CHECK IT, ELSE INCREMENT IOWD ;AND LOOP. POP PDP,AC2 IFLE CHKCNT,< ;NO CHECKSUMMING HLRS AC2 SETCA AC2, AOBJN AC2,.+1 ADDM AC2,-2(PDP) > IFG CHKCNT,< ;CHECK CHECKSUMS HLRE TAC1,AC2 ;CHANGE WORD COUNT TO BLOCKS MOVMS TAC1 ADDI TAC1,BLKSIZ-1 LSH TAC1,-BLKP2 MOVNS TAC1 HRL AC2,TAC1 DFDI7: MOVE TAC,-2(PDP) PUSHJ PDP,CHKSUM HLRZ TAC,(AC2) MOVEI AC3,IODTER CAME TAC,TAC1 PUSHJ PDP,CKREC2 MOVE AC3,[XWD BLKSIZ,BLKSIZ] ADDM AC3,-(PDP) AOBJN AC2,DFDI7 > JRST DFDI1 ;SEE IF MORE INPUT REQUIRED DFDI8: MOVE IOS,[XWD IOEND,IODEND] ;NO MORE INPUT ORB IOS,DEVIOS(DEVDAT) JRST DFDI1A DFDI9: TLNE IOS,NMP JRST DFDI10 ;NO PUSHJ PDP,SETBUF ;GET BUFFER PUSHJ PDP,GETPTR ;READ AND COPY POINTERS INTO DDB PUSHJ PDP,CLRBUF ;CLEAR BUFFER HRRZ AC2,DEVACC(DEVDAT) POPJ PDP, DFDI10: MOVEI AC2,PTR1(DEVDAT) ;NO MORE POINTERS ON DISK HRRM AC2,DEVACC(DEVDAT) SETZM @AC2 POPJ PDP, SUBTTL USETO/USETI ;SETD AND SETI UUOS EXTERNAL WAIT1 DFSET: PUSHJ PDP,.+2 POPJ PDP, TLNE DEVDAT,ENTRB+LOOKB ;FILE OPEN? TRNN UUO,-1 ;NON-ZERO BLOCK NUMBER ARGUMENT? JRST DFERR2 ;NO, ERROR IN EITHER CASE PUSHJ PDP,WAIT1 ;WAIT FOR I/O TO COMPLETE PUSHJ PDP,SETBF6 ;SET UP A BUFFER MOVE IOS,[XWD IOEND,IODEND] ;CLEAR EOF ANDCAB IOS,DEVIOS(DEVDAT) HRRZ TAC1,DEVACC(DEVDAT) HRRZ TAC,SETCNT(DEVDAT) ;C(UUO) RH > C(SETCNT) RH? CAIL TAC,(UUO) ;(I.E. SHOULD WE GO FORWARD?) JRST DFSET6 ;NO, GO BACKWARD SUBI TAC1,PTRN(DEVDAT) ;YES, DESIRED POINTER IN CORE? SUB TAC,TAC1 CAIL TAC,(UUO) JRST DFSET3 ;YES HRRZ TAC1,DEVCNT(DEVDAT) ADDI TAC1,BLKSIZ-1 LSH TAC1,-BLKP2 CAMGE TAC1,TAC ;ANY MORE POINTERS ON DISK? JRST DFSETX ;NO HRRM TAC,SETCNT(DEVDAT) MOVE TAC,DEVOAD(DEVDAT) ;YES, ARE POINTERS IN CORE THE SAME TLNN TAC,PNTDIF ;AS ON DISC? JRST DFSET1 ;YES TLO IOS,NMP ;SET "DO NOT READ NEXT POINTERS" MOVEM IOS,DEVIOS(DEVDAT) PUSHJ PDP,DFO4A ;NO, WRITE THEM OUT TLZA IOS,NMP ;NO NEED TO READ DFSET1: PUSHJ PDP,RRI ;READ THEM IN MOVEM IOS,DEVIOS(DEVDAT) PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK? MOVE TAC,@TAC1 TRNN TAC,-1 JRST DFSETB ;YES HRRZ TAC,DEVBLK(DEVDAT) ;IN BLOCK WERE CURRENT ONE. SUBI TAC,1 MOVNS TAC ADDM TAC,SETCNT(DEVDAT) JRST DFSETC ;THE DESIRED POINTER MAY BE IN CORE. IF THERE ARE MORE POINTERS ON ;DISC, THEN CORE IS FULL, AND THE POINTER IS IN CORE, OTHERWISE ;A CHECK IS MADE TO INSURE THAT THE END FILE IS AFTER THE DESIRED ;POINTER. DFSET3: DFSETX: HRRZ TAC,DEVCNT(DEVDAT) ;C(UUO)RW > C(DEVCNT) RH? ADDI TAC,BLKSIZ-1 ;CONVERT TO BLOCKS LSH TAC,-BLKP2 CAIL TAC,(UUO) JRST DFSET5 ;NO, ALL OK. MOVSI IOS,IOEND ;YES, END-FILE. IORB IOS,DEVIOS(DEVDAT) AOSA TAC DFSET5: HRRZ TAC,UUO ;SET NEXT BLOCK AS ONE BEYOND LAST EXISTING ONE HRRZ TAC1,SETCNT(DEVDAT) ;PREPARE TO RESET DEVACC SUBM TAC,TAC1 ADDM TAC1,DEVACC(DEVDAT) HRRM TAC,SETCNT(DEVDAT) ;RESET SETCNT JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE ;THE DESIRED POINTER IS BEFORE THE CURRENT ONE. SEE IF IT IS IN CORE. DFSET6: SUBI TAC1,PTR1(DEVDAT) SUB TAC,TAC1 CAIG TAC,(UUO) JRST DFSET5 ;POINTER IS IN CORE ;THE DESIRED BLOCK IS BEFORE THE CURRENT ONE. SEARCH FROM THE BEGINNING. MOVE TAC,DEVOAD(DEVDAT) ;ARE POINTERS IN CORE SAME AS ON DISC? TLNE TAC,PNTDIF PUSHJ PDP,DFO4A ;NO, WRITE THEM OUT HRRZ TAC,DEVEXT(DEVDAT) ;GET BLOCK# OF FIRST RIB PUSHJ PDP,SETPTR ;READ FIRST RIB DFSETB: MOVEI TAC,1 ;RESET SETCNT HRRM TAC,SETCNT(DEVDAT) ;"POSITIONED" AT RELATIVE BLOCK 1 DFSETC: HRRZ TAC,DSKBUF(DEVDAT) ;LSET TAC TO FIRST POINTER PUSHJ PDP,SET176 ;IS THIS THE FIRST POINTER BLOCK? MOVE DAT,@TAC1 TRNN DAT,-1 ADDI TAC,DIRSIZ ;YES, SKIP OVER 4 WORDS HLRZ DAT,@TAC1 ;BLOCK FULL? SUBI TAC1,1 JUMPN DAT,DFSETD ;YES SKIPN @TAC1 ;NO. MOVE TAC1 TO LAST POINTER SOJA TAC1,.-1 DFSETD: HRRZ AC1,SETCNT(DEVDAT) SUBI AC1,(TAC) ;IS DESIRED POINTER HERE? HRRZ AC2,TAC1 ADD AC2,AC1 CAIL AC2,(UUO) JRST DFSET7 ;YES ADDI AC2,1 ;NO. GET NEXT BLOCK HRRM AC2,SETCNT(DEVDAT) JUMPE DAT,DFSET8 ;ANY MORE POINTER BLOCKS? MOVSM DAT,DEVBLK(DEVDAT) ;YES, SET UP TO READ NEXT BLOCK. PUSHJ PDP,RRI JRST DFSETC ;THE BLOCK CONTAINING THE POINTER IS FOUND. DFSET7: HRRZ TAC,UUO ;RESET RIGHT HALF OF DEVBLK SUB TAC,AC1 HRRZ TAC1,DSKBUF(DEVDAT) SUB TAC,TAC1 HRRM TAC,DEVBLK(DEVDAT) HRRM UUO,SETCNT(DEVDAT) ;RESET SETCNT PUSHJ PDP,DFIN4 ;GET POINTERS JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE ;RAN OUT OF POINTERS DFSET8: ADDI TAC1,1 HRRZ TAC,DSKBUF(DEVDAT) SUB TAC1,TAC HRRM TAC1,DEVBLK(DEVDAT) TLO IOS,NMP!IOEND ;SET END MOVEM IOS,DEVIOS(DEVDAT) PUSHJ PDP,DFO6A ;CLEAR POINTERS JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE SUBTTL INPUT/OUPUT UUO'S. RETRIEVAL POINTER PROCESSING ;INPUT UUO ;* INDICATES INTERRUPT LEVEL EXTERNAL ADVBFF DFIN: TLNN DEVDAT,LOOKB ;FILE OPEN? JRST DFERR2 ;NO, UNDEFINED FILE TLZ IOS,IO ;SET INPUT INDICATOR DFIN1: TLNE IOS,LIR ;*ANY MORE INPUT? POPJ PDP, ;*NO, LEAVE HRRZ TAC1,DEVACC(DEVDAT) ;* CAILE TAC1,PTRN(DEVDAT) ;*POINTER LIST EMPTY? JRST DFIN2 ;*YES SKIPN @TAC1 ;*NO--END OF FILE? JRST DFIN1E ;*YES CAIN TAC1,PTRN(DEVDAT) ;*NO--IS THIS THE LAST POINTER ? JRST DFIN1B ;*YES DFIN1D: SKIPN 1(TAC1) ;*NO TLO IOS,LIR ;*SET LAST INPUT FLAG DFIN1A: MOVEM IOS,DEVIOS(DEVDAT) ;* JRST QIN ;* DFIN1E: TLO IOS,LIR ;*EMPTY FILE MOVEM IOS,DEVIOS(DEVDAT) ;* POPJ PDP, ;* DFIN1B: TLNE IOS,NMP ;*ANY MORE POINTERS ON DISK? TLO IOS,LIR ;*NO, THIS IS THE LAST READ JRST DFIN1A ;* DFIN2: MOVEM IOS,DEVIOS(DEVDAT) PUSHJ PDP,SETBFI ;CHOOSE NEXT INPUT BUFFER TO HOLD RETRIEVAL POINTERS PUSHJ PDP,GETPTR ;READ RIB COPY POINTERS INTO DDB HRRZ TAC1,DEVACC(DEVDAT) JRST DFIN1D ;NEED NEW POINTER FROM DISK GETPTR: MOVE AC2,DEVOAD(DEVDAT) ;POINTERS DIFFER? TLNE AC2,PNTDIF JRST DFO4A ;YES, WRITE THEN READ AND RETURN PUSHJ PDP,RRI ;NO, READ BLOCK DFIN4: MOVEI AC2,PTR1(DEVDAT) ;RESET DEVACC HRRM AC2,DEVACC(DEVDAT) MOVE TAC,DEVBLK(DEVDAT) ;RESET DEVBKO MOVEM TAC,DEVBKO(DEVDAT) ;BLOCK # WORD INDEX OF A CURRENT RETRIEVAL PACKET GTPTR1: PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD OF RIB MOVE IOS,DEVIOS(DEVDAT) HRRZ AC3,DEVBLK(DEVDAT) ;WORD INDEX OF RETRIEVAL POINTER PACKET ADD AC3,TAC1 ;AC3 POINTS TO NEXT POINTER WITHIN RIB ADDI TAC1,BLKSIZ-2 ;TAC1 POINTS TO WORD 127 MOVEI AC1,PTRN(DEVDAT) ;DDB END CHECK DFIN5: CAML AC3,TAC1 ;POINTER BLOCK EMPTY? JRST DFIN7 ;YES, GET SOME MORE MOVE TAC,@AC3 ;GET RETRIEVAL POINTER MOVEM TAC,@AC2 ;STASH IN DDB ADDI AC3,1 JUMPE TAC,DFIN8A ;0 MEANS NO MORE RETRIEVAL POINTERS CAIE AC1,(AC2) ;DDB FULL? AOJA AC2,DFIN5 ;NO, GET ANOTHER CAML AC3,TAC1 ;YES, ANY MORE FOR NEXT TIME? HLLZS @AC3 ;END OF RIB REACHED. ACE(LH) IS LINK NEXT RIB SKIPN @AC3 ;NEXT POINTER=0 OR LINK=0. TLO IOS,NMP ;SET "NO MORE POINTER" DFIN6A: MOVEM IOS,DEVIOS(DEVDAT) MOVE TAC1,DSKBUF(DEVDAT);POINT TO FIRST WORD OF RIB SUBI AC3,(TAC1) ;COMPUTE NEW INDEX HRRM AC3,DEVBLK(DEVDAT) ;STORE INDEX TO NEXT RETRIEVAL POINTER PACKET MOVSI AC1,PNTDIF ;CLEAR "POINTER DIFFER" ANDCAM AC1,DEVOAD(DEVDAT) ;SINCE DDB IS COPY OF RETRIEVAL DATA. POPJ PDP, DFIN7: HLRZ TAC,@TAC1 ;RIB LINK TO TAC RH JUMPE TAC,DFIN8 ;DONE IF LINK=0 MOVSM TAC,DEVBLK(DEVDAT) ;SET BLOCK#, WORD INDE FOR NEXT PACKET PUSH PDP,AC2 PUSHJ PDP,RRI ;READ THE RIB POP PDP,AC2 JRST GTPTR1 DFIN8: MOVEM TAC,@AC2 ;0 WOTRD IS DOB MARKS END DFIN8A: TLO IOS,NMP ;NO MORE POINTERS ON DISK JRST DFIN6A ;ENTER HERE AT INTERRUPT LEVEL TO READ ANOTHER BLOCK DFINX: PUSHJ PDP,ADVBFF ;*ANY MORE EMPTY BUFFERS? POPJ PDP, ;* HRRZ TAC1,DEVACC(DEVDAT) ;*POINTER LIST EMPTY? CAILE TAC1,PTRN(DEVDAT) ;* POPJ PDP, ;* JRST DFIN1 ;*NO,FILL NEXT ONE ;OUTPUT UUO EXTERNAL WSYNC,ADVBFE DFOUT: TLNN DEVDAT,ENTRB ;FILE OPEN? JRST DFERR2 ;NO, UNDEFINED FILE TLO IOS,IO ;SET OUTPUT INDICATION MOVEM IOS,DEVIOS(DEVDAT) DFOUT1: HRRZ DAT,DEVACC(DEVDAT) ;*GET POINTER LOC IFG CHKCNT,< HRRZ TAC,DEVOAD(DEVDAT) ;* ADD TAC,[XWD NBLKSZ,2] ;* PUSHJ PDP,CHKSUM ;* HRLM TAC1,@DAT ;* MOVSI TAC1,PNTDIF ;* ORM TAC1,DEVOAD(DEVDAT) ;* > HRRZ TAC,@DAT ;*ALREADY HAVE A POINTER? JUMPN TAC,DFOT3A ;*YES IF JUMP CAIE DAT,PTRN(DEVDAT) ;*NO, CLEAR NEXT ONE? SETZM 1(DAT) ;*YES TLO IOS,NMP ;*SET "NO MORE POINTERS" MOVEM IOS,DEVIOS(DEVDAT) ;* MOVE TAC1,DEVOAD(DEVDAT) ;*POINT TO OUTPUT BUFFER ADDI TAC1,1 ;*NOW TO WORD COUNT HRRZ TAC1,@TAC1 ;*RETRIEVE WORD COUNT PUSHJ PDP,UPDEVC ;*UPDATE DEVCNT PUSH PDP,DAT ;* PUSHJ PDP,DFGETF ;*GET A FREE BLOCK POP PDP,DAT ;* IFG CHKCNT,< HRRM TAC,@DAT> IFLE CHKCNT,< MOVSI TAC1,PNTDIF ORM TAC1,DEVOAD(DEVDAT) MOVEM TAC,@DAT> DFOT3A: CAIE DAT,PTRN(DEVDAT) ;*LIST FULL? JRST QOUT ;*NO, WRITE AND LEAVE ;OUTPUT UUO CONTINUED. ;WRITE OUT POINTER LIST. PUSHJ PDP,SETBFO ;CHOOSE AN OUTPUT BUFFER TO READ RIB INTO PUSHJ PDP,QOUT ;PUT REQUEST IN QUEUE PUSHJ PDP,WSYNC ;WAIT TIL DATA WRITTEN DFO4A: MOVE TAC,DEVBKO(DEVDAT) ;RESET DEVBLK TO REFER TO RETRIEVAL POINTERS MOVEM TAC,DEVBLK(DEVDAT) ;NOW IN DDB MOVE TAC,DEVOAD(DEVDAT) ;ANY POINTERS BEEN WRITTEN? TLZE TAC,VRGPTR PUSHJ PDP,DFO7A ;NO, CREATE NEW BLOCK, SKIP NEXT INSTRUCTION. PUSHJ PDP,RRI ;RED RETRIEVAL BLOCK MOVEI AC3,PTR1(DEVDAT) DFO4B: PUSHJ PDP,SET000 ;TAC1 POINTS TO RIB HRRZ AC2,DEVBLK(DEVDAT) ;INDEX INTO RIB ADD AC2,TAC1 ;ABSOLUTE POINTER INTO RIB ADDI TAC1,BLKSIZ-2 ;END OF RIB DATA DFOUT5: MOVE AC1,@AC3 ;GET RETRIEVAL POINTER FROM DDB JUMPE AC1,DFOUT6 ;0 SIGNALS END CAML AC2,TAC1 ;BLOCK FULL? JRST DFOUT7 ;YES, WRITE IT OUT MOVEM AC1,@AC2 ;STASH POINTER IN RIB ADDI AC2,1 CAIE AC3,PTRN(DEVDAT) ;DONE? AOJA AC3,DFOUT5 DFOUT6: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO RIB SUBI AC2,(TAC1) ;FROM INDEX HRRM AC2,DEVBLK(DEVDAT) ;STORE INDEX TO RETRIEVAL POINTERS MOVSI AC2,PNTDIF ;CLEAR "POINTERS DIFFER" ANDCAM AC2,DEVOAD(DEVDAT) PUSHJ PDP,WRI ;WRITE THE BLOCK DFO6A: MOVEI TAC,PTR1(DEVDAT) HRRM TAC,DEVACC(DEVDAT) ;DEVACC NOW POINTS TO FIRST POINTER IN DDB SETZM @TAC ;CLEAR FIRST POINTER TLNN IOS,NMP ;MORE POINTERS? JRST DFIN4 ;YES, BRING THEM IN AND LEAVE MOVE TAC,DEVBLK(DEVDAT) MOVEM TAC,DEVBKO(DEVDAT) ;SAE BLOCK#,WORD INDEX OF CURRENT POINTER PACKET POPJ PDP, DFO7A: MOVEM TAC,DEVOAD(DEVDAT) ;SAVE VRGPTR BIT PUSHJ PDP,SET177 ;SET TAC1 TO WORD 128 SETZM @TAC1 ;CLEAR BLOCK# WORD AOS (PDP) ;ALWAYS SKIP RETURN PUSH PDP,AC3 ;BECAUSE ENTRY FROM NEWRIB PUSHES AC3 JRST DFOUT8 DFOUT7: PUSHJ PDP,NEWRIB JRST DFO4B NEWRIB: PUSH PDP,AC3 ;CREATE A NEW RETRIEVAL BLOCK PUSHJ PDP,SET176 ;SET TAC1 TO LINK WORD HLLZ TAC,@TAC1 ;LINK TO NEXT POINTER BLOCK ALREADY PRESENT? JUMPN TAC,DFOUT9 ;YES, WRITE CURRENT ONE AND READ NEXT ONE PUSHJ PDP,DFGETF ;NO, GET A BLOCK FOR POINTER IN TAC HLRZ AC3,DEVBLK(DEVDAT) ;BLOCK# OF CURRENT RIB MOVSM TAC,DEVBLK(DEVDAT) ;STORE BLOCK#, INDEX FOR NEW BLOCK PUSHJ PDP,SET176 ;SET TAC1 TO WORD 127 AGAIN HRLM TAC,@TAC1 ;LH LINKS TO NEW BLOCK MOVE TAC,AC3 ;BLOCK# OF CURRENT BLOCK PUSHJ PDP,WRIA ;WRITE THE BLOCK OUT DFOUT8: MOVE TAC1,DSKBUF(DEVDAT) ;POINT TO BUFFER CONTAINING RIB NOSCHEDULE TLNN IOS,UBFS ;DUMP MODE? ADD TAC1,PROG ;NO, RELOCATE MOVEI TAC,1(TAC1) ;DESTINATION HRL TAC,TAC1 ;SOURCE SETZM (TAC1) BLT TAC,BLKSIZ-3(TAC1) ;ZERO OUT FIRST 126 WORDS MOVE TAC,BLKSIZ-1(TAC1) ;BLOCK# OF CURRENT RIB HRRZM TAC,BLKSIZ-2(TAC1) ;SET "PREVIOUS" POINTER..CLEAR LINK TO NEXT SETZM BLKSIZ-1(TAC1) ;CLEAR WORD 128. SCHEDULE DFO8A: POP PDP,AC3 POPJ PDP, DFOUT9: EXCH TAC,DEVBLK(DEVDAT) ;SAVE NEW BLOCK# INDEX. GET OLD BLOCK# INDEC HLRZS TAC ;BLOCK# IN RH PUSHJ PDP,WRIA ;WRITE THIS BLOCK OF POINTERS OUT PUSHJ PDP,RRI ;READ NEXT BLOCK OF POINTERS IN JRST DFO8A ;ENTER HERE AT INTERRUPT LEVEL TO WRITE ANOTHER EXTERN MJOBN DFOUTX: PUSHJ PDP,ADVBFE ;*ANY MORE TO DO? POPJ PDP, ;* SKIPL DAREQ ;*DO NOT CONTINUE THIS OUTPUT AT INTERRUPT POPJ PDP, ;* LEVEL IF THE DAWAIT RTN WOULD BE CALLED. HRRZ TAC1,DEVACC(DEVDAT) ;*NEED TO WRITE POINTERS? CAIL TAC1,PTRN(DEVDAT) ;* POPJ PDP, ;* HRRZ TAC,@SATPTR ;*CURRENT SAT BLOCK FULL? TRNN TAC,WLBIT ;*OR WRITE-LOCKED? CAIL TAC,NUMBIT+MJOBN ;*BE SURE TO LEAVE ATLEAST JOBN FREE BLOCKS ; SO THAT EACH JOB CAN HAVE ONE MORE POPJ PDP, ;* PUSH PDP,AC1 ;* PUSH PDP,AC2 ;* PUSHJ PDP,DFOUT1 ;* POP PDP,AC2 ;* POP PDP,AC1 ;* POPJ PDP, ;* SUBTTL READ/WRITE RETRIEVAL POINTERS ;INPUT RETRIEVAL BLOCK. RRIB: SKIPA TAC,DEVEXT(DEVDAT) ;READ FIRST RETRIEVAL BLOCK RRI: HLRZ TAC,DEVBLK(DEVDAT) ;READ NEXT RETRIEVAL BLOCK RRIA: PUSHJ PDP,MQIN ;READ RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY JRST RERA ;ERRORS, YOU LOSE PUSHJ PDP,SET177 ;CHECK RH OF WORD 128 HLRZ TAC,DSKCNT(DEVDAT) ;BLOCK# EXPECTED MOVE AC1,@TAC1 ;GET BLOCK# STORED IN RIB CAIE TAC,(AC1) ;SAME? JRST RERA ;IT WAS WRONG, YOU LOSE. POPJ PDP, ;EVERYTHING OK. ;OUTPUT A RETRIEVAL BLOCK. WRIB: SKIPA TAC,DEVEXT(DEVDAT) ;WRITE FIRST RETRIEVAL BLOCK WRI: HLRZ TAC,DEVBLK(DEVDAT) ;WRITE NEXT RETRIEVAL BLOCK WRIA: PUSHJ PDP,SET177 ;WRITE RETRIEVAL BLOCK SPECIFIED BY TAC ON ENTRY HRRM TAC,@TAC1 ;STORE THIS BLOCK# IN WORD 128 IFN FTRCHK,< SKIPN TAC ;ATTEMPTING TO WRITE RETRIEVAL INFORMATION ; IN BLOCK NR 0 IS AN ERROR HALT WERA ;CONTINUE WILL POINT ERROR MESSAGE > PUSHJ PDP,MQOUT ;WRITE IT, JRST WERA ;ERRORS POPJ PDP, ;NO, RETURN. SET177: HRRZ TAC,DSKBUF(DEVDAT) ADDI TAC1,BLKSIZ-1 S177A: TLNN IOS,UBFS TLO TAC1,PROG POPJ PDP, SET176: HRRZ TAC1,DSKBUF(DEVDAT) ADDI TAC1,BLKSIZ-2 JRST S177A SET000: HRRZ TAC1,DSKBUF(DEVDAT) JRST S177A ;PUT POINTER INFO IN DDB ;ENTER WITH TAC CONTAINING THE BLOCK NUMBER OF THE POINTERS. SETPTR: HRLZM TAC,DEVBLK(DEVDAT) ;XWD RIB#, 0...0 INDEX ANDCM IOS,[XWD IOEND+NMP,IODEND] MOVEM IOS,DEVIOS(DEVDAT) PUSHJ PDP,SETBUF ;AQUIRE BUFFERE IN MONITOR STORAGE PUSHJ PDP,RRI ;GET RETRIEVAL BLOCK PUSHJ PDP,DFIN4 ;COPY POINTERS TO DDB MOVEI AC3,FPNTR(DEVDAT) ;SET DEVACC TO SKIP FIRST 4 WORDS HRRM AC3,DEVACC(DEVDAT) POPJ PDP, ;RECLAIM STORAGE ON DISK. ;ENTER WITH TAC POINTING TO FIRST RETRIEVAL BLOCK OF THE FILE ; TO BE DELETED. RECLAM: PUSHJ PDP,SETBUF ;FIND SPACE IN USER AREA PUSHJ PDP,RECLM5 ;GET FIRST POINTER BLOCK ADDI DAT,DIRSIZ ;SKIP OVER FIRST WORDS. RECLM2: CAML DAT,TAC1 ;MORE POINTERS IN BLOCK? PUSHJ PDP,RECLM4 ;NO. GET MORE HRRZ TAC,@DAT ;FREE A DATA BLOCK JUMPE TAC,CLRBUF ;EXIT WHEN A ZERO POINTER IS ENCOUNTERED PUSH PDP,TAC1 PUSHJ PDP,SETFRE ;FREE UP SPECIFIED BLOCK POP PDP,TAC1 AOJA DAT,RECLM2 ;GO BACK FOR MORE RECLM4: HLRZ TAC,@TAC1 ;PICK UP POINTER TO NEXT BLOCK JUMPE TAC,RECLM6 ;NO MORE, GO HOME. RECLM5: PUSHJ PDP,RRIA ;READ IN A R.I. BLOCK. HLRZ TAC,DSKCNT(DEVDAT) ;FREE THAT BLOCK PUSHJ PDP,SETFRE PUSHJ PDP,SET000 ;SET TAC1 TO FIRST WORD MOVE DAT,TAC1 ADDI TAC,BLKSIZ-2 ;SET TAC1 TO WORD 127 POPJ PDP, RECLM6: POP PDP,TAC JRST CLRBUF ;CLEAR ANY DUMP BUFFER AND LEAVE ;RELEASE UUO. EXTERNAL DAREQ,DAAVAL DFREL: TLO DEVDAT,DSKRLB ;MARK RELEASE (VIA RESET UUO) IN PROGRESS. PUSHJ PDP,DFCLSI ;CLOSE INPUT FIRST PUSHJ PDP,DFCLSO ;THEN CLOSE OUPUT ; SAME ORDER AS CLOSE AND RELEAS IN UUOCON SKIPN SATCHG ;HAS SAT BLOCK BEEN MODIFIED? JRST DFREL1 ;NO, SUPPRESS WRITING PUSHJ PDP,UPDA ;SET DAREQ INTERLOCK WHILE WRITING SAT BLOCK PUSH PDP,DSKBUF(DEVDAT) PUSHJ PDP,SATWRT ;WRITE CURRENT SAT BLOCK POP PDP,DSKBUF(DEVDAT) PUSHJ PDP,DOWNDA ;RESET DAREQ INTERLOCK DFREL1: TLZ DEVDAT,DSKRLB ;CLEAR RELEASE MARKER. JRST WAIT1 SUBTTL DISK SPACE ALLOCATION ;DFGETF: GET A FREE DISK BLOCK ;CALL: PUSHJ PDP,DFGETF ; ... RETURNS WITH TAC:=LOGICAL BLOCK# ; MAY NOT RETURN IF DISK IS FULL OR NEARLY FULL EXTERNAL DAWAIT,DAAVAL,DAREQ,JOBN INTERNAL DFGETF DFGETF: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK DFGTF1: PUSHJ PDP,SATGET ;FOCUS ON A NON-FULL SAT BLOCK HRRZ AC1,SATPTR ;POINT TO 3 WORD SAT ENTRY MOVE AC2,SATBK2 ;XWD -L, POINTER TO SAT ENTRY MOVEI ITEM,1 ;REQUEST 1 BLOCK PUSHJ PDP,GETBIT ;RETURNS BIT# IN TAC1 (IN RANGE 1 TO NUMBLK) JRST DFGTF2 ;FULL AFTER ALL SETOM SATCHG ;SHOW SAT BLOCK IN CORE NOT = DISK COPY AOS TAC,@SATPTR ;COUNT ANOTHER BLOCK USED HLRZS TAC ;FIRST LOGICAL BLCOK# REPRESENTED BY SAT BLOCK ADDI TAC, -1(TAC1) ;FORM LOGICAL BLOCK# DOWNDA: SOSL DAREQ ;THIS EXITING ROUTINE TURNS OFF DAREQ INTERLOCK ; THUS MAKING NON-SHARABLE SECTIONS OF CODE ; AVAILABLE TOTHE NEXT USER IN THE QUEUE SETOM DAAVAL TLZ IOS,DAFLG MOVEM IOS,DEVIOS(DEVDAT) POPJ PDP, DFGTF2: MOVEI TAC,NUMBIT ;BITS/SAT BLOCK HRRM TAC,@SATPTR ;MARK SAT ENTRY FULL JRST DFGTF1 ;UPDA - TURN ON THE DISK ALLOCATION INTERLOCK (DAREQ) ; - A CALL TO UPDA MUST PRECEDE SAT BLOCK MANIPULATIONS UPDA: AOSE DAREQ ;INCREMENT COUNT OF USERS REQUESTING DISK ALLOCATION PUSHJ PDP,DAWAIT ;WAIT UNTIL JOB REACHES TOP OF QUEUE TLO IOS,DAFLG MOVEM IOS,DEVIOS(DEVDAT) ;MAKE THIS JOB AS USING SAT BLOCK POPJ PDP, ;SATGET - FIND A NON-FULL SAT BLOCK FOR DFGTF OR DUMP MODE OUTPUT. ; CONSIDER DISK FULL WHEN FEW BLOCKS REMAIN FREE UNLESS THE USER ; IS LOGGING IN OR USING A NON-SHARABLE RESOURCE. EXTERNAL JBTSTS,HNGSTP SATGET: SETZ AC1, ;CLEAR COUNT HRRZ TAC,@SATPTR ;BLOCKS USED IN CURRENT SAT BLOCK TRNN TAC,WLBIT ;WRITE LOCKED? PUSHJ PDP,SATCNT ;NO. COUNT # FREE CAIL AC1,JOBN ;IS THER ENOUGH SPACE? POPJ PDP, ;YES - USE IT. SETZ AC1, ;CLEAR COUNT MOVEI TAC1,SATENT ;START WITH FIRST SAT ENTRY SATGT1: HRRZ TAC, 0(TAC1) ;GET WLBIT + BLOCKS USED TRNN TAC,WLBIT ;WRITE LOCKED? PUSHJ PDP,SATCNT ;NO. COUNT # FREE ADDI TAC1,SENTSZ ;NEXT SAT ENTRY CAIL AC1,JOBN ;ENOUGH SPACE ACCUMULATED? JRST SATGT2 ;YES - READ A SAT BLOCK CAIGE TAC1,SATTOP ;END OF ENTRIES? JRST SATGT1 ;NO. CONTINUE JUMPE AC1,DSKFUL ;IF NONE FOUND DISK IS REALLY FULL ;THERE ARE JOBN OR FEWER DISK BLOCKS AVAILABLE. ;GIVE THEM OUT ONLY IN HARDSHIP CASES LDB TAC,PJOBN MOVE TAC,JBTSTS(TAC) TLNN TAC,JACCT ;IS THIS USER LOGGING IN? TLNE IOS,UBFS+AUFLG ;DOES USER HAVE MONITOR BUFFER OR IS HE ALTERING UFD? JRST SATGT2 ;YES TO EITHER. GIVE HIM A BLOCK ANYWAY. DSKFUL: TLNE IOS,UBFS+AUFLG JRST DFERR1 ;NON-RECOVERABLE ERROR IF USING BUFFER OR ALTERING UFD PUSHJ PDP,DOWNDA ;RESET ALLOCATION INTERLOCK PUSHJ PDP,HNGSTP ;PRINT "DSK OK?" PUSHJ PDP,UPDA ;IF USER TYPE "CONT" WE TRY AGAIN JRST SATGET SATGT2: MOVE TAC1,SATPIK ;POINT TO ENTRY OF NON-FULL SAT BLOCK JRST SATRD ;READ IN SAT BLOCK SATCNT: CAIE TAC,NUMBIT ;IS ENTRY FULL? MOVEM TAC1,SATPIK ;NO. SAVE POINTER TO A NON-FULL ENTRY ADDI AC1,NUMBIT ;MAXIMUM NUMBER SUB AC1,TAC ;LESS NUMBER USED POPJ PDP, ;SETFRE - RETURN A DISK BLOCK TO AVAILABLE STORAGE ;CALL TAC:=LOGICAL BLOCK L ; PUSHJ PDP,SETFRE ; ... RETURN INTERNAL SETFRE,FTRCHK SETFRE: PUSHJ PDP,UPDA ;SET DISK ALLOCATION INTERLOCK IFN FTRCHK,< EXTERNAL LBHIGH SKIPE TAC ;BLOCK 0 SHOULD NEVER BE CLEARED CAMLE TAC,LBHIGH ;BLOCK # TOO LARGE HALT DOWNDA ;YES, HALT. CONTINUE WILL COUNT DOWN DAREQ. > HLRZ AC1,@SATPTR ;GET LOGICAL BLOCK# FOR B0 OF CURRENT SAT BLOCK CAML TAC,AC1 ;IS L LESS THAN FIRST BLOCK REPRESENTED? CAIL TAC,NUMBLK(AC1) ;IS L LESS THAN LAST BLOCK REPRESENTED SKIPA ;OUTSIDE RANGE JRST SETFR2 ;IN RANGE MOVEI TAC1,SATENT ;INITIALIZE POINTER SKIPA SETFR1: ADDI TAC1,SENTSZ ;INCREMENT POINTER HLRZ AC1,@TAC1 ;GET LOGICAL BLOCK FOR B0 OF SAT BLOCK CAML TAC,AC1 ;IS L LESS THEN FIRST BLOCK? CAIL TAC,NUMBLK(AC1) ;IS L LESS THEN LAST BLOCK? JRST SETFR1 ;OUT-OF-RANGE, TRY NEXT PUSH PDP,TAC ;SAVE BLOCK# PUSHJ PDP,SATRD ;READ SAT BLOCK FOR ENTRY POINTED TO BY TAC1 POP PDP,TAC ;RESTORE BLOCK# HLRZ AC1,@SATPTR SETFR2: SUB TAC,AC1 ;FROM BIT# (IN RANGE 0 TO NUMBLK-1) HRRZ AC1,SATPTR ;POINT TO 3 WORD ENTRY MOVE AC2,SATBK2 ;XWD -L, POINTER TO SAT BLOCK MOVEI ITEM,1 ;RETURN 1 BIT PUSHJ PDP,CLRBIT SOS @SATPTR ;DECREMENT BLOCKS USED SETOM SATCHG ;SAT BLOCK IN CORE NOT = DISK COPY JRST DOWNDA ;REMOVE ALLOCATION INTERLOCK AND EXIT. ;NOTE: SATRD USES TEMPORARY STORAGE LOCATIONS SATTMP AND SATTEM TO HELP AVOID ; A PDL OVRFLW PROBLEM. IT CAN DO SO BECAUSE IT IS NOT RE-ENTRANT, I.E., ONLY ; ONE USER AT A TIME MAY PASS THROUGH HERE BECAUSE OF THE DAREQ INTERLOCK. SATRD: MOVEM TAC1,SATTMP ;SAVE POINTER TO DESIRED SAT ENTRY. MOVE TAC1,DSKBUF(DEVDAT) ;ALSO SAVE IOWD FROM THE DDB MOVEM TAC1,SATTEM SKIPE SATCHG ;HAS COPY IN CORE BEEN MODIFIED? PUSHJ PDP,SATWRT ;YES, WRITE IT. MOVE TAC,SATTMP ;RETRIEVE SAT POINTER FOR SAT BLOCK TO BE READ IN. MOVEM TAC,SATPTR PUSHJ PDP,SATBLK ;COMPUTE BLOCK#, IOWD TLO IOS,NORELB ;NO RELOCATION PUSHJ PDP,MQIN ;READ THE BLOCK JRST RERA ;ERROR MOVE TAC1,SATTEM ;RESTORE SAVED IOWD TO DDB MOVEM TAC1,DSKBUF(DEVDAT) JRST SATW1 SATWRT: TLO IOS,NORELB ;NO RELOCATION PUSHJ PDP,SATBLK ;COMPUTE BLOCK# IOWD PUSHJ PDP,MQOUT ;WRITE BLOCK JRST WERA ;ERROR SETZM SATCHG ;SHOW COPY IN CORE = BLOCK ON DISK SATW1: MOVSI IOS,NORELB ;RESET BIT ANDCAB IOS,DEVIOS(DEVDAT) POPJ PDP, ;SET UP TAC AND TAC1 FOR READ OR WRITE OF SAT BLOCK SATBLK: MOVE TAC,SATPTR SUBI TAC,SATENT IDIVI TAC,SENTSZ ADD TAC,SATXWD MOVE TAC1,SATBK2 MOVEM TAC1,DSKBUF(DEVDAT) POPJ PDP, SUBTTL "FREE" CORE ALLOCATION ;CLEAR OUT DDB AT RELEASE TIME INTERNAL CLRDDB CLRDDB: MOVEI TAC,DSKDDB ;POINT TO PROTOTYPE DDB CLDDB1: MOVE TAC1,TAC ;COPY LINK TO TAC1 HLRZ TAC,DEVSER(TAC1) ;GET LINK TO NEXT DDB JUMPE TAC,CPOPJ ;0 MEANS END CAIE TAC,(DEVDAT) ;OWNED BY CURRENT USER? JRST CLDDB1 ;NO NOSCHEDULE MOVE AC1,DEVSER(TAC) ;GET LINK FROM THIS DDB HLLM AC1,DEVSER(TAC1) ;STORE IN PREVIOUS DDB TO REMOVE THIS ONE HRRZ ITEM,DDBPTR ;GET INTERRUPT LEVEL POINTER CAIN ITEM,0(TAC) ;POINTED TO DISCARDED DDB? MOVSM AC1,DDBPTR ;YES. BYPASS DISCARDED DDB SCHEDULE MOVEI ITEM,DSKCOR JRST CLCOR1 ;DELETE FREE STORAGE. ;BUILD A DISK DEVICE DATA BLOCK AND ASSIGN IF LOGICAL NAME GIVEN. ;THIS IS DONE AT INIT TIME. INTERNAL SETDDB SETDDB: PUSH PDP,ITEM ;SAVE AC'S USED BY SETDDB PUSH PDP,TAC1 MOVE TAC1,DEVMOD(DEVDAT) TRNE TAC1,ASSPRG ;HAS AN INIT BEEN DONE? JRST SETDD0 ;YES. MUST COPY PROTOTYPE DDB HRRZ TAC1,DEVDAT ;GET ADDRESS OF DDB CAIE TAC1,DSKDDB ;IS IT PROTOTYPE? JRST SETDD1 ;NO. WE ALREADY HAVE A DDB SETDD0: MOVEI ITEM,DSKCOR ;GET SOME FREE CORE NOSCHEDULE PUSHJ PDP,GTCOR1 ;GET SPACE FOR DDB HRR DEVDAT,TAC1 ;DEVDAT POINTS TO ASSIGNED CORE HRLI TAC1,DSKDDB ;SOURCE, DESTINATION BLT TAC1,PTR1(DEVDAT) ;COPY PROTOTYPE DDB INTO MONITOR CORE MOVEI TAC1,DSKDDB ;TAC1 POINTS TO PROTOTYPE ; LINK PROTOTYPE DDB TO COPY ; COPY ALREADY LINKS WHERE PROTOTYPE DID HRLM DEVDAT,DEVSER(TAC1) SCHEDULE SETDD1: POP PDP,TAC1 POP PDP,ITEM POPJ PDP, ;SET TAC1 TO SOME AREA FOR BUFFER. ;GET BUFFER SPACE FROM USER INPUT OR OUTPUT RING IF AVAILABLE ;ASSIGN FROM MONITOR CORE AS A LAST RESORT. ;SET DSKBUF(DEVDAT) TO POINT TO BUFFER. EXTERNAL PIOMOD,UADRCK,JOBFF SETBUF: TLNE IOS,UBFS ;HAVE ONE IN FREE STORAGE? POPJ PDP, ;YES, LEAVE LDB TAC1,PIOMOD ;NO. DUMP MODE? CAIGE TAC1,SD TLNE DEVDAT,DSKRLB ;RESET UUO IN PROGRESS ? JRST SETBF6 ;YES TO EITHER QUESTION TLNN DEVDAT,INBFB ;INBUF DONE YET? JRST SETBF1 ;NO SETBFI: HRRZ TAC1,DEVIAD(DEVDAT) ;CALL HERE FROM INPUT - RING KNOWN TO BE AVAILABLE JRST SETBF2 SETBF1: TLNN DEVDAT,OUTBFB ;OUTPUT DONE YET? JRST SETBF6 ;NO SETBFO: HRRZ TAC1,DEVOAD(DEVDAT) ;CALL HERE FROM OUTPUT - RING KNOWN TO BE AVAILABLE SETBF2: MOVE TAC1,2(TAC1) HRRZ AC1,TAC1 ;ADDRESS CHECK LOW END PUSHJ PDP,UADRCK MOVEI AC1,BLKSIZ-1(TAC1) PUSHJ PDP,UADRCK TLO IOS,UBFU ;BUFFER IN USER AREA SETBF5: HRLI TAC1,NBLKSZ MOVEM TAC1,DSKBUF(DEVDAT) MOVEM IOS,DEVIOS(DEVDAT) POPJ PDP, ;DUMP MODE, USE AREA IN FREE STORAGE. SETBF6: AOSE MQREQ PUSHJ PDP,MQWAIT TLO IOS,UBFU ;BUFFER IN MONITOR CORE MOVEI TAC1, MONBUF ;TAC1 POINTS TO MONITOR BUFFER JRST SETBF5 ;CLEAR THE BUFFER IN FREE STORAGE IF THERE. EXTERNAL BUFCLR,JOBFF,IADRCK CLRBUF: SCHEDULE TLZN IOS,DAFLG ;USING SAT BLOCK? JRST .+3 SOSL DAREQ ;YES. RELEASE SETOM DAAVAL TLZN IOS,AUFLG ;USING UFD? JRST .+3 SOSL AUREQ ;YES. RELEASE UFD SETOM AUAVAL TLZN IOS,UBFS ;USING MONITOR BUFFER? JRST .+3 SOSL MQREQ ;YES, RELEASE MONITOR BUFFER SETOM MQAVAL TLZ IOS,NCTRLC ;RENABLE ^C TLZE IOS,UBFU ;USING BUFFER IN USER AREA JRST CLRBF1 ;YES. CLEAR BUFFER MOVEM IOS,DEVIOS(DEVDAT) POPJ PDP, ;CLEAR USER BUFFER AFTER USING CLRBF1: MOVEM IOS,DEVIOS(DEVDAT) HRRZ TAC,DSKBUF(DEVDAT) ;GET LOC. OF BUFFER CAML TAC,JOBFF(JDAT) ;ABOVE JOBFF> POPJ PDP, ;NO. RETURN. PUSHJ PDP,IADRCK POPJ PDP, SUBI TAC,2 ;SET TAC TO 2ND BUFFER WORD SOS (PDP) ;BUFCLR WILL SKIP RETURN JRST BUFCLR ;CLEAR THE BUFFER ;FIND THE FIRST ZERO IN A SET OF WORDS ;ENTER WITH LH OF TAC SET TO NEGATIVE OF NUMBER OF WORDS. ; RH OF TAC CONTAINING ADDRESS OF FIRST WORD. ;CALL: PUSHJ PDP,GETZER ; EXIT1 NO ZEROS ; EXIT2 NORMAL ;NORMAL EXIT LEAVES TAG POINTING TO WORD CONTAING THE ZERO. ;AND TAC1 HAVING A 1-BIT IN THE POSITION OF THE ZERO. ; ;ENTER AT GETZR1 IF TAC1 IS ALL SET UP. ;CALLED AT UUO AND INTERRUPT LEVELS GETZER: MOVNI DAT,1 JRST GETZ3 GETZ1: ROT TAC1,-1 JUMPGE TAC1,GETZ3 GETZ2: AOBJP TAC,CPOPJ CAMN DAT,(TAC) JRST GETZ2 GETZ3: TDNE TAC1,(TAC) JRST GETZ1 JRST CPOPJ ;TIMING: M=NUMBER OF LEADING WORDS CONTAINING NO ZEROS ; M=NUMBER OF LEADING ONES IN M+1ST WORD ; 38+12,8M+17.1N MIRCO-SECS ;WORST CASE WITH 128 WORDS = 2.3 MILS ;FIND THE NUMBER OF ZERO BITS TO THE RIGHT OF A WORD ;CONTAINING A SINGLE 1-BIT ;ENTER WITH BIT IN TAC1, EXIT WITH RESIDUE IN TAC1. ;CALLED AT UUO AND INTERRUPT LEVELS RESIDU: TLNN TAC1,777000 JRST RESID1 LSH TAC1,-11 TLOA TAC1,43000 RESID1: TLO TAC1,32000 FAD TAC1,[0] LSH TAC1,-33 POPJ PDP, ;FIND FOUR FREE WORDS OF CORE, RETURN AN ADDRESS IN TAC1 ;IT IS ASSUMED THAT THE CLOCK IS OFF. INTERN GETFCR GETFCR: MOVEI ITEM,1 ;REQUEST ONE 4 WORD BLOCK GTCOR1: MOVEI AC1,LOCORE ;POINT TO THREE WORD FREE CORE ENTRY MOVEI AC2,DDBTAB ;POINT TO BIT TABLE PUSH PDP,DAT PUSHJ PDP,GETBIT ;FIND A HOLE JRST DFERR9 ;THERE ARE NONE POP PDP,DAT LSH TAC1,2 ;MULTIPLY BIT# BY 4 SUBI TAC1,4 ;SYNCHRNIZE ADD TAC1,LOCORE ;FORM CORE ADDRESS POPJ PDP, INTERNAL GETBIT ;SEARCH THROUGH A TABLE TO FIND A SERIES OF ZERO-BITS. ;ENTER WITH AC1 SET UP AS IN CLRBIT ROUTINE, C(ITEM) SET TO THE ; SIZE HOLD DESIRED, ;CALLED AT UUO AND INTERRUPT LEVELS ;ON UNSUCCESSFUL RETURN DAT CONTAINS THE SIZE ;OF LARGETS HOLE ENCOUNTERED GETBIT: PUSH PDP,[-1] ;INITIALIZE LARGEST HOLD FOUND SO FAR PUSH PDP,ITEM ;SAVE HOLD SIZE MOVE TAC,2(AC1) ;TAC:=IOWD LENGTH OF TABLE,TABLE ADDRESS MOVE TAC1,1(AC1) PUSHJ PDP,GETZER ;FIND THE FIRST ZERO JRST GTBIT5 ;NO ZEROS LEFT MOVEM TAC1,1(AC1) ;SAVE THE SPOT MOVEM TAC,2(AC1) PUSH PDP,TAC PUSH PDP,TAC1 GTBIT1: AOS DAT ;INCREMENT SIZE OF HOLD BY 1 (GETZER LEFT DAT=-1) SOJLE ITEM,GTBIT2 ;FOUND ENOUGH? ROT TAC1,-1 ;NO SKIPGE TAC1 AOBJP TAC,GTBT1A ;JUMP IF TABLE EXHAUSTED TDNN TAC1,(TAC) ;IS NEXT BIT ZERO? JRST GTBIT1 ;YES, CONTINUE GTBT1A: CAMLE DAT,-3(PDP) ;NO. LARGEST HOLE SO FAR? MOVEM DAT,-3(PDP) ;YES. SAVE SIZE JUMPG TAC,GTBIT6 ;TABLE EXHAUSTED? IF SO, ERROR EXIT. PUSHJ PDP,GETZER ;NO, TRY FURTHER ON JRST GTBIT6 ;NO MORE, ERROR MOVEM TAC1,(PDP) MOVEM TAC,-1(PDP) MOVE ITEM,-2(PDP) JRST GTBIT1 GTBIT2: MOVE TAC1,(PDP) ;HOLE FOUND, SET BITS TO ONES MOVE TAC,-1(PDP) MOVE ITEM,-2(PDP) GTBIT3: ORM TAC1,(TAC) SOJLE ITEM,GTBIT4 ROT TAC1,1 JUMPGE TAC1,GTBIT3 AOBJN TAC,GTBIT3 ;THIS SHOULD ALWAYS JUMP GTBIT4: POP PDP,TAC1 POP PDP,TAC AOS -2(PDP) HRRZS TAC SUBI TAC,-1(AC2) PUSHJ PDP,RESIDU IMULI TAC,^D36 SUBM TAC,TAC1 GTBIT5: POP PDP,ITEM POP PDP,DAT ;SIZE OF LARGEST HOLD FOUND IF UNSUCCESSFUL POPJ PDP, GTBIT6: POP PDP,TAC POP PDP,TAC1 AOS -1(PDP) ;SIZE OF LARGEST HOLD MUST BE ADJUSTED JRST GTBIT5 ;FREE A FOUR WORD SECTION OF CORE. ;ENTER WITH ADDRESS IN TAC INTERNAL CLCOR1 CLRCOR: MOVEI ITEM,1 CLCOR1: SUB TAC,LOCORE LSH TAC,-2 MOVEI AC1,LOCORE MOVE AC2,CRINIT ;SEARCH FROM BEGINNING ;CLEAR A SERIES OF BITS IN SOME TABLE ;ENTER WITH: C(TAC) SET TO A BIT NUMBER ; C(AC1) SET TO EITHER A SAT ENTRY OR FREE ; CORE ENTRY ; C(AC2) SET TO BEGINNING OF TABLE (IOWD FORM) ; C(ITEM) SET TO NUMBER OF BITS TO CLEAR ;EXIT WITH CORRECT BITS SET TO ZERO AND SET ENTRY OR FREE CORE ; ENTRY UPDATED IF NECESSARY. INTERNAL CLRBIT CLRBIT: IDIVI TAC,^D36 HRLS TAC ;BOTH HALVES OF TAC CONTAIN ; WORD INCREMENT ADD TAC,AC2 PUSH PDP,DAT MOVN DAT,TAC1 MOVSI TAC1,400000 ROT TAC1,(DAT) POP PDP,DAT PUSH PDP,TAC PUSH PDP,TAC1 CLRB4: ANDCAM TAC1,(TAC) ;CLEAR A BIT SOJLE ITEM,CLRB5 ;IS THAT ALL? ROT TAC1,-1 ;NO JUMPGE TAC1,CLRB4 AOBJN TAC,CLRB4 ;THIS SHOULD ALWAYS JUMP CLRB5: POP PDP,TAC1 POP PDP,TAC CAMLE TAC,2(AC1) ;NEED TO RESET? POPJ PDP, ;NO CAME TAC,2(AC1) JRST CLRB2 ;YES JUMPL TAC1,CLRB2 SKIPGE 1(AC1) JRST CLRB3 CAML TAC1,1(AC1) CLRB2: MOVEM TAC1,1(AC1) CLRB3: MOVEM TAC,2(AC1) POPJ PDP, SUBTTL QUEUEING AND INTERRUPT PROCESSING ;PUT A REQUEST IN THE USER QUEUE. ;ENTER AT QIN FOR INPUT. QOUT FOR OUTPUT. ;CALLED AT BOTH INTERRUPT AND UUO LEVELS EXTERNAL SETACT,CPOPJ QIN: SKIPA TAC1,DEVDAT ;* QOUT: MOVEI TAC1,DEVOAD-DEVIAD(DEVDAT) ;* MOVEI TAC,TRIES ;*INITIALIZE ERROR COUNT MOVEM TAC,DSKCNT(DEVDAT) ;* PUSHJ PDP,SETACT ;*SET IOACT MOVSI TAC,W8BIT ;*SET WAIT FLAG ORM TAC,DEVIAD(TAC1) NOSCHEDULE ;* AOS USRCNT ;*INCREMENT COUNTER OF TRANSFER REQUESTS MOVNI DAT,1 ;* EXCH DAT,DFBUSY ;* JUMPN DAT,QIOEND ;*JUMP IF DISK BUSY ANDCAM TAC,DEVIAD(TAC1) ;* CAME TAC1,DEVDAT ;* MOVEI TAC,0 ;* PUSHJ PDP,USRGO ;* QIOEND: SCHEDULE ;* POPJ PDP, ;* ;PUT A REQUEST IN THE MONITOR QUEUE. ;ENTER AT MQIN FOR INPUT, MQOUT FOR OUTPUT. ;ENTER WITH C(TAC1 0-17) = -SIZE OF BLOCK ; C(TAC1 18-35) = CORE ADDRESS ; C(TAC 18-35) = LOGICAL BLOCK NUMBER INTERNAL MQIN,MQOUT EXTERNAL MQREQ,MQWAIT,SETACT,MQUEUE,WSYNC MQIN: HRLZ TAC1,DEVDAT TLOA TAC1,400000 ;BIT 0=1 IS READ INDICATOR MQOUT: HRLZ TAC1,DEVDAT IFN FTRCHK,< TRNN TAC,-1 ;WRITING OR READING BLOCK NR 0 SHOULD NEVER OCCUR HERE HALT .+1 ;CONTINUING AFTER HALT WILL YIELD INFORMATION ; LOSS ON THE DISK > HRLI TAC,TRIES MOVSM TAC,DSKCNT(DEVDAT);STASH AWAY BLOCK #, ERROR COUNT. PUSHJ PDP,SETACT ;SET IOACT NOSCHEDULE TLNN IOS,UBFS+NORELB ;USING BUFFER IN FREE STORAGE? HRR TAC1,PROG ;NO, RELOCATE MOVEM TAC1,@MIPTR AOS AC1,MIPTR ;RING INDEX MIPTR CAIL AC1,MQTOP MOVEI AC1,MQUEUE MOVEM AC1,MIPTR MOVNI AC1,1 EXCH AC1,DFBUSY ;FORCE DFBUSY TO-1, EXTRACT PREVIOUS CONTENTS. SKIPN AC1 ;ALREADY BUSY? PUSHJ PDP,MONGO ;NO, START A MONITOR JOB SCHEDULE PUSHJ PDP,WSYNC HRRZ AC1,DSKCNT(DEVDAT) ;ANY ERRORS? TRNN AC1,IODERR!IODTER!IOIMPM AOS (PDP) ;NO, SKIP RETURN POPJ PDP, ;* ;* EVERYTHING FROM HERE THRU SETDUN CALLED AT INTERRUPT LEVEL ;* ;ROUTINE CALLED BY INTERRUPT IN DISK. ;CHECK JOB FOR ERRORS, THEN START UP ANY WAITING JOB. ;UPON ENTRY, THE ACS HAVE BEEN SAVED. IOS CONTAINS ANY ERROR ;FLAGS. INTERNAL DFINT,FTSWAP EXTERNAL ADVBFE,ADVBFF,PJOBN,SETIOD,PIOMOD EXTERNAL MQREQ,MQAVAL,DFRED,DFWRT EXTERNAL JBTADR EXTERNAL MQTOP,MQUEUE DFINT: IFN FTSWAP,< EXTERNAL SQREQ,SERA,SQGO,SWPINT MOVE TAC,SERA ;*WAS THAT A SWAPPING JOB? TLNE TAC,200000 ;* JRST SWPINT ;*YES > SKIPN RUNUSR ;*WAS THAT A USER JOB? JRST DFINT2 ;*NO, MUST HAVE BEEN MONITOR MOVS DEVDAT,RUNUSR ;*YES ANDI DEVDAT,377777 ;*CLEAR READ INDICATOR BIT. TRNE IOS,IOIMPM ;*WRITE-LOCK? PUSHJ PDP,DINT1A ;*YES TRNE IOS,IODTER!IODERR ;*ERRORS? JRST DFINT9 ;*ERRORS DFINTA: AOS DEVACC(DEVDAT) ;INCREMENT POINTER TO RETRIEVAL POINTER AOS SETCNT(DEVDAT) ;INCREMENT RELATIVE BLOCK NUMBER SOS USRCNT ;* PUSHJ PDP,SETDUN ;*TURN OFF I/O WAIT LDB TAC,PJOBN MOVE PROG,JBTADR(TAC) ;*SET RELOC. AND PROT. FOR THIS JOB SKIPL RUNUSR ;*WAS IT A READ OR A WRITE? JRST DFINT1 ;*WRITE MOVEI TAC,@DEVIAD(DEVDAT) ;*SET UP WORD COUNT ADDI TAC,1 ;* MOVEI TAC1,BLKSIZ HRRM TAC1,@TAC IFG CHKCNT,< MOVE TAC,DEVOAD(DEVDAT) TLNE TAC,CKSUPR JRST DINT0B HRRZ TAC,DEVIAD(DEVDAT) ADD TAC,[XWD NBLKSZ,2] PUSHJ PDP,CHKSUM ;CLEAR IOACT MOVE TAC,DEVACC(DEVDAT) HLRZ TAC,-1(TAC) CAMN TAC,TAC1 JRST .+3 PUSHJ PDP,CKREC3 MOVEM IOS,DEVIOS(DEVDAT) > DINT0B: PUSHJ PDP,DFINX ;ENTER INPUT ROUTINE SKIPA DFINT1: PUSHJ PDP,DFOUTX ;CHECK FOR MORE OUTPUT SETZM RUNUSR JRST DFINT4 DINT1A: HRRZ TAC,DEVACC(DEVDAT) ;WRITE-LOCK FOUND, SET WLBIT HRRZ TAC,-1(TAC) JRST SETWL ;AND RETURN DFINT2: MOVS DEVDAT,@MOPTR ;IT WAS A MONITOR JOB ANDI DEVDAT,377777 ;REMOVE POSSIBLE READ INDICATOR TRNN IOS,IODERR!IODTER ;ERRORS? JRST DFINT3 ;NO. SOS TAC,DSKCNT(DEVDAT) ;YES,TRIED ENOUGH? TRNE TAC,-1 JRST DINT4A ;NO, TRY AGAIN. DFINT3: HRRM IOS,DSKCNT(DEVDAT) ;SAVE ANY ERRORS HLRZ TAC,DSKCNT(DEVDAT) ;WRITE-LOCK ERROR? TRNE IOS,IOIMPM PUSHJ PDP,SETWL ;YES, SET WLBIT PUSHJ PDP,SETDUN SETZM @MOPTR ;REMOVE THIS MONITOR JOB AOS TAC,MOPTR ;INCREMENT POINTER. CAIL TAC,MQTOP MOVEI TAC,MQUEUE MOVEM TAC,MOPTR ;FALL THROUGH TO DFINT4 ;DETERMINE NEXT TRANSFER TO MAKE ACCORDING TO PRIOROTY ; 1) SWAPPING 2) MQ I/O 3) BUFFERED MODE I/O DFINT4: MOVEM IOS,DEVIOS(DEVDAT) ;CLEAR IOACT DINT4A: IFN FTSWAP,< SKIPE SQREQ ;SWAPPING JOB WAITING? JRST SQGO ;YES,START IT > INTERNAL DINT4B DINT4B: SKIPE @MOPTR ;MONITOR JOB WAITING? JRST MONGO ;YES, START IT UP SKIPL USRCNT ;USER WAITING? JRST FINDV ;YES. SETZM DFBUSY ;NO. TURN OFF BUSY FLAG POPJ PDP, ;EXIT INTERRUPT ;FIND A WAITING USER FINDV: HRRZ DEVDAT,DDBPTR MOVSI TAC,W8BIT ;PREPARE TO TURN OFF WAIT INDICATOR DFINT5: HLRZ TAC1,(DEVDAT) ;END OF DISK DDBS? SKIPE DEVDAT CAIE TAC1,(SIXBIT /DSK/) MOVEI DEVDAT,DSKDDB ;YES, RESET TO TOP SKIPGE DEVIAD(DEVDAT) ;ANY READS WAITING? JRST DFINT7 ;YES SKIPGE DEVOAD(DEVDAT) ;ANY WRITES WAITING? JRST DFINT6 ;YES HLRZ DEVDAT,DEVSER(DEVDAT) ;NO, TRY NEXT DDB JRST DFINT5 ;START UP A USER WRITE DFINT6: ANDCAM TAC,DEVOAD(DEVDAT) ;CLEAR OUTPUT WAIT BIT IN DDB MOVEI TAC,0 ;PREPARE TO SET BIT 0=0 IN RUNUSR JRST USRGO ;START UP A USER READ DFINT7: ANDCAM TAC,DEVIAD(DEVDAT) ;CLEAR INPUT WAIT BIT IN DDB USRGO: MOVSM DEVDAT,RUNUSR ;SAVE DEVDAT FOR USE AT DFINT ORM TAC,RUNUSR ;SET READ (B0=1) WRITE (B0=0) INDICATION AOS UXFERS ;COUNT TOTAL USER TRANSFERS LDB PROG,PJOBN ;SETUP RELOCATION FOR JOB MOVE PROG,JBTADR(PROG) MOVE TAC,DEVSER(DEVDAT) ;GET DDB LINK MOVSM TAC,DDBPTR ;START SEARCH WITH NEXT DDB MOVE TAC,DEVACC(DEVDAT) ;GET POINTER LOCATION HRRZ TAC,(TAC) ;GET RETRIEVAL POINTER (XWD CHECKSUM BLOCK #) MOVSI TAC1,NBLKSZ SKIPL RUNUSR ;READ? JRST USRGO3 HRRI TAC1,@DEVIAD(DEVDAT) ;GET ADDRESS OF RING BUFFER AOJA TAC1,DFRED ;FROM IOWD AND READ USRGO3: HRRI TAC1,@DEVOAD(DEVDAT) ;GET ADDRESS OF OUTPUT BUFFER AOJA TAC1,DFWRT ;FORM IOWD AND WRITE ;START UP A MONITOR READ OR WRITE MONGO: MOVS ITEM,@MOPTR ;XWD CORE ADDRESS, SAVED DEVDAT ANDCMI ITEM,400000 ;CLEAR READ INDICATOR MOVE TAC1,DSKBUF(ITEM) ;GET CONTROLLING IOWD HLRZ TAC,ITEM ;GET CORE ADDRESS ADD TAC1,TAC HLL TAC1,DSKBUF(ITEM) ;RESTORE LH IN CASE ADDING REL. CAUSES OVRFL IN T LH SUBI TAC1,1 ;FORM IOWD LENGTH ADDRESS HLRZ TAC,DSKCNT(ITEM) ;GET LOGICAL BLOCK# SKIPL @MOPTR JRST DFWRT JRST DFRED ;ERROR ON USER JOB. DFINT9: AOS ECOUNT ;COUNT USER HARDWARE ERRORS SOS TAC,DSKCNT(DEVDAT) ;TRIED ENOUGH?> TRNN TAC,-1 JRST DFINTA ;YES. MOVE TAC,DEVDAT ;NO. RESET FLAG SO IT WILL GO AGAIN. SKIPL RUNUSR ;READ? ADDI TAC,DEVOAD-DEVIAD ;NO. MOVSI TAC1,400000 ORM TAC1,DEVIAD(TAC) ;RESTORE WAIT BIT TO DEVIAD OR DEVOAD SETZM RUNUSR ;CLEAR USER INDICATOR JRST DINT4A ;DO NEXT TASK. ;CLEAR I/O DONE FLAG IF IT IS ON. SETDUN: ;* OR IOS,DEVIOS(DEVDAT) ;* ANDCMI IOS,IOACT ;* TLZE IOS,IOW ;* JRST SETIOD ;* POPJ PDP, ;* SUBTTL ERRORS, SUBROUTINES. ;ERROR ROUTINES CALLED FROM UUO LEVEL EXTERN EXCALP,ERRPTU,TPOPJ DEFINE ERRORS (X),< PUSHJ PDP,CLRBUF ;CLEAR ANY DUMP BUFFER JSP TAC,ERRPTU ;OUTPUT A MESSAG ASCIZ ^X^ JRST EXCALP ;TYPE "UUO FROM" MESSAGE AND QUIT > DFERR1: ERRORS DFERR2: MOVEI IOS,IOIMPM ORB IOS,DEVIOS(DEVDAT) POPJ PDP, DFERR3: ERRORS ;THESE ERROR ROUTINES ARE GENERALLY CALLED AFTER SETLE HENCE 0(PDP) IS XWD PROJ,PROG DFERR6: MOVEI TAC,NORITE ;FILE ALREADY BEING ALTERED DFERRY: HRRZ TAC1,UUO ADD TAC1,[XWD PROG,ERRBIT] ;FORM POINTER TO UUO PARAMETER BLOCK HRRM TAC,@TAC1 ;STORE ERROR CODE POP PDP,TAC ;REMOVE XWD PROJ,PROG JRST CLRBUF ;RELEASE ANY RESOURCES DFERR5: MOVEI TAC,PROTF ;PROTECTION FAILURE JRST DFERRY DFERR4: MOVEI TAC,NOTINM ;USER NOT IN MFD JRST DFERRY DFERR7: MOVEI TAC,NOTINU ;FILE NOT IN UFD JRST DFERRY DFERR8: ERRORS DFERR9: SCHEDULE ERRORS DFER10: MOVEI TAC,RENFAL JRST DFERRY DFER11: MOVEI TAC,NOFILE JRST DFERRY DFER12: MOVEI TAC,0 PUSH PDP,TAC ;ADD SOMETHING TO BE REMOVED (SINCE SETLE NOT CALLED) JRST DFERRY WERA: MOVSI IOS,NORELB ANDCAB IOS,DEVIOS(DEVDAT) ERRORS RERA: MOVSI IOS,NORELB ANDCAB IOS,DEVIOS(DEVDAT) ERRORS ;CALLED AT BOTH INTERUPT AND UUO LEVELS ;COMPUTE CHECK-SUM ;ENTER WITH C(TAC 18-35) SET TO BUFFER ADDRESS ;RETURN WITH C(TAC1)SET TO ONES COMPLEMENT SUM IN RH. IFG CHKCNT, ;TIMING OF MAIN LOOP IS 13.8 MICRO-SECS AVERGE. ;THIS IS 1.8 MILS OR SO FOR 128 WORDS. IFN >FTCHECK+FTMONP+FTSWAP, < INTERNAL CHECK CHECK: MOVEI TAC,0 ;CLEAR SUM JFCL 4,.+1 ;CLEAR CARRY0 FLAG CHKSM1: ADD TAC1(TAC) ;ADD NEXT WORD JFCL 4,CHKSM3 ;JUMP IF CARRY 0 CHKSM2: AOBJN TAC,CHKSM1 ;LOOP UNTIL DONE HLRZ TAC,TAC1 ;ADD HALVES HRRZS TAC1 ADD TAC1,TAC TLZE TAC1,1 ;CARRY INTO LH? ADDI TAC1,1 ;YES BRING IT AROUND POPJ PDP, > ;UPDATE DEVCNT IF NECESSARY. DEVCNT HAS SIZE OF FILE IN R.H. (IN WORDS IF POSSIBLE, ; OTHERWISE NEGATIVE BLOCK COUNT). ; ENTER WITH SIZE OF CURRENT BLOCK IN TAC1 UPDEVC: HRRZ TAC,SETCNT(DEVDAT) ;*CONVERT CURRENT RELATIVE BLOCK NUMBER TO WORDS SUBI TAC,1 ;* LSH TAC,BLKP2 ;* ADD TAC,TAC1 ;*ADD IN THE ADDITIONAL WORDS IN THIS NEXT ; OUTPUT COMMAND. HRRZ TAC1,DEVCNT(DEVDAT) ;*PICK UP PREVIOUS MAXIMUM FILE SIZE OF COMPARISON. TRNE TAC1,400000 ;*PREVIOUS MAXIMUM SIZE GREATER THAN 2 EXP 17 WORDS? JRST UPDVC2 ;*YES, THEN COMPARE AND SAVE NEGATIVE BLOCK COUNTS TLNN TAC,-1 ;*NO, DOES THE NEWLY COMPUTED CURRENT FILE SIZE EXCEED ;* 2EXP17 WORDS? TRNE TAC,40000 ;* JRST UPDVC1 ;*YES, GO SAVE NEGATIVE BLOCK COUNT. CAMLE TAC,TAC1 ;*NO, COMPARE POSITIVE WORD COUNTS HRRM TAC,DEVCNT(DEVDAT) ;*UPDATE MAXIMUM FILE SIZE ONLY IF PREVIOUS ; MAXIMUM EXCEEDED POPJ PDP, ;* UPDVC1: TRO TAC1,-1 ;*SET PREVIOUS MAXIMUM AS ONLY ONE ;* (THUS FORCING CURRENT BLOCK COUNT TO BE STORED). UPDVC2: ADDI TAC,BLKSIZ-1 ;*CONVERT POSITIVE WORD COUNT TO NEGATIVE ; BLOCK COUNT. LSH TAC,-BLKP2 ;* MOVNS TAC ;* TRON TAC,400000 ;*MORE THAN 2EXP17 BLOCKS (16,777,216 WORDS) ; IN THIS FILE? TROA IOS,IOBKTL ;*YES, (PREPOSTEROUS) SET ERROR BIT AND STORE ; BLOCK COUNT WODULO 2EXP17 CAILE TAC1,(TAC) ;*NO, COMPARE PREVIOUS MAXIMUM VERSUS PRESENT ; FILE SIZE. HRRM TAC,DEVCNT(DEVDAT) ;*STORE NEW MAXIMUM FILES SIZE ONLY IF PREVIOUS ;* MAXIMUM EXEEDED. POPJ PDP, ;* ;OUTPUT WRITE-LOCK ERROR. FREE THE BLOCK AND GET NEW ONE. WLERA: HLR TAC,DSKCNT(DEVDAT) ;PICK UP BLOCK NUMBER. PUSHJ PDP,SETFRE ;FREE THE BLOCK JRST DFGETF ;GET ANOTHER. ;SET WRITE-LOCK INDICATION IN A SAT ENTRY. ;ENTER WITH A BLOCK NUMBER IN TAC. SETWL: MOVEI TAC1,SATENT ;* JRST .+2 ;* SETWL1: ADDI TAC1,SENTSZ ;* HLRZ ITEM,@TAC1 ;*IS THE BLOCK IN THIS SAT ENTRY? CAML TAC,ITEM ;* CAIL TAC,NUMBLK(ITEM) ;* JRST SETWL1 ;*NO, LOOP. MOVEI ITEM,WLBIT ;* ORM ITEM,@TAC1 ;* POPJ PDP, ;* DSKSR: END