.TITLE *** AUTO-REMOVE *** / / COPYRIGHT (C) 1976 / DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. / / THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY / ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH / THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS / SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO- / VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON / EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO / THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE / SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. / / THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE / WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM- / MITMENT BY DIGITAL EQUIPMENT CORPORATION. / / DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY / OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY / DEC. / .EJECT / EDIT #6 / / EDIT #16 MAY-11-76 (SCR) ATTEMPT SAVE-REMOVE-INSTALL FIX / EDIT #17 MAY-12-76 (SCR) IDENTIFY ON DISK BLOCK NOT NAME / EDIT #18 MAY-13-76 (SCR) FURTHER CLEANUP / EDIT #19 MAY-17-76 (SCR) MISMATCHED JMP* / EDIT #20 MAY-17-76 (SCR) LOST LINK IN SLEIGHT OF HAND / EDIT #21 MAY-18-76 (SCR) BOUNDARY BUG / EDIT #22 MAY-18-76 (SCR) INIT PROBLEM / / / THIS TASK IS USED TO IMPLEMENT THE 'EXECUTE' CAL OR DIRECTIVE. / / AUTORM REMOVES TASKS IN THE STL WHICH MEET THE FOLLOWING REQUIREMENTS / 1. THE TASK MUST HAVE THE 'DONE' BIT SET / 2. THE TASK MUST HAVE THE 'REMOVE ON EXIT' BIT SET / 3. THE TASK MUST NOT BE ACTIVE / .TITLE *** AUTO-REMOVE TASK *** / MCRRI=171 DEBUG=156 /(017)DEBUG FLAG IN .SCOM FAC=174 SNAM=123 .ENB=705521 .INH=705522 POOL=240 NADD=107 NDEL=112 R1=101 R2=102 STKL=242 X10=10 P.TC=47 REMBLK=311 /FIRST BLOCK FOR REMOVE CHAIN IDX=ISZ ECLA=641000 / BEGIN LAC (START /GET THE XR ADJUSTMENT AND (070000 DAC XRPAGE TCA DAC XRADJ START LAC (STKL /PREPARE TO SCAN THE STL JMS SETXR DZM REMNAM+2 /ZERO THE TASK NAME DZM REMNAM+3 NEXTN LAC 0,X /END OF STL? SAD (STKL JMP EXIT /YES -- EXIT JMS SETXR /NO -- ACCESS NEXT NODE LAC 4,X /GET THE FLAGS WORD SPA /IS THE TASK ACTIVE? JMP NEXTN /YES -- CONSIDER NEXT NODE AND (204000 /NO -- SAD (204000 /ARE THE ROE AND DONE BITS SET? SKP JMP NEXTN /NO -- EXAMINE NEXT NODE LAC 2,X /YES -- SET THE NAME UP FOR REMOVEAL DAC REMNAM+2 LAC 3,X DAC REMNAM+3 PXA /GET THE ADDRESS OF THE NODE TAD XRPAGE JMP REM /GO REMOVE THE TASK IF IT'S NOT ACTIVE / EXIT CAL (10 /EXIT XRPAGE 0 XRADJ 0 / / SUBROUTINE SETXR -- ADJUST THE INDEX REGISTER / / CONTENTS OF THE AC AND XR ARE LOST / SETXR 0 TAD XRADJ PAX JMP* SETXR / REM DAC STLNOD /SAVE STKL NODE ADDRESS AAC 4 /ADD 4 TO PICK UP FLAGS DAC FLAGS /SAVE POINTER TO FLAGS IAC DAC PARBA /PARTITION BLOCK ADDRESS IAC DAC CNT /SAVE DISK ADDRESS POINTER LAC (400002) /RAISE TO LEVEL 6 TO PREVENT EXIT ISA /DURING CANCEL .INH /INHIBIT INTERRUPTS WHILE MODIFYING FLAGS LAC* FLAGS /PICK UP FLAGS .ENB /ENABLE INTERRUPTS AND (040000) /MASK OFF FIXED IN CORE BITS SNA /IS IT FIXED IN CORE? JMP NOTFIX /NO DON'T FREE PARTITION LAC* PARBA /PICK UP THE PARTITION BLOCK POINTER AAC P.TC /MOVE POINTER TO THE PARTITION BUSY FLAG DAC PARBA LAC* PARBA /PICK UP THE FLAGS WORD AAC -1 /FREE PARTITION DAC* PARBA NOTFIX CAL REMNAM /ISSUE CANCEL DIRECTIVE LAC STLNOD /NO -- DELETE NODE FROM STKL DAC* (R1) JMS* (NDEL) /DELETE NODE LAC* FLAGS /IS TASK BUFY DBK LAC* CNT /PICK UP DISK ADDRESS ADD (400\777777) /SUBTRACT 400 IN ONE'S COMP. ARITHMETIC AND (000377) /MASK OFF UNIT NUMBER DAC CNTRLU /SAVE IT IN CPB LAC* CNT /PICK UP DISK ADDRESS AGAIN ADD (400\777777) /SUBTRACT AGAIN AND (777400) /MASK OFF ADDRESS DAC CNTRLA /SAVE IT IN CPB FOR DEALLOCATE CAL GETSIZ /PICK UP THE SIZE OF THE STORAGE CAL WAITEV LAC EV /CHECK TO SEE IF OK SPA JMP DSKERR /NOT OK DISK ERROR CAL DEALOC /DEALLOCATE DISK SPACE CAL WAITEV /WAIT FOR DEALLOCATE TO COMPLETE LAC EV /CHECK TO SEE IF OK SPA JMP DSKERR /NO OK DISK ERRROR .TITLE SAVE-REMOVE-INSTALL BLOCK CHAIN UPDATE / / (THE CODE BETWEEN THE ****'S IS EDIT #16, MODIFIED FROM / EDIT #6,15) / ********************* / / / THE FOLLOWING CODE IS USED TO UPDATE THE INSTALL/REMOVE / CHAIN OF BLOCKS IN ORDER TO FIX THE SAVE-REMOVE-INSTALL / GLITCH. THE IDEA IS THAT EACH TIME THE STL IN CORE IS CHANGED, / THIS CHAIN OF DISK BLOCKS MUST ALSO CHANGE. WHENEVER A TASK IS / REMOVED, THE TASKS NAME IS ENTERED INTO THE CHAIN. WHENEVER A / TASK IS INSTALLED, A COPY OF ITS STL NODE (LESS POINTERS) IS / ENTERED INTO THE CHAIN ALONG WITH THE TASKS PBDL DATA. / WHEN THE SYSTEM IS BOOTSTAPPED THE COPY OF SAVE WHICH IS / IN CORE READS THE CHAIN OF BLOCKS AND RECONSTRUCTS THE / STL FROM THE DATA FOUND IN THE BLOCKS. / WHENEVER A SAVE IS DONE (STL IN CORE MATCHES STL ON DISK) / THIS CHAIN OF BLOCKS IS PURGED. / / THE STRUCTURE OF EACH BLOCK IS: / / WORDS 0-375 USED FOR DATA ENTRIES / WORD 376 IS A POINTER TO 1ST FREE WORD IN BLOCK / WORD 376 IS COMPLEMENTED TO SHOW LOGICAL EOF / WORD 377 IS A POINTER TO NEXT BLOCK OR -1 / / THE STRUCTURE OF A REMOVE ENTRY IS: / / NTRY+0 -1 (FLAG SAYING THIS ENTRY IS A REMOVE) / NTRY+1 DISK ADDRESS FROM STL / / THE STRUCTURE OF AN INSTALL ENTRY IS: / / NTRY+0 +1 (FLAG SAYING THIS ENTRY IS AN INSTALL) / NTRY+1 TASK NAME IN SIXBT 1ST HALF / NTRY+2 TASK NAME IN SIXBT 2ND HALF / NTRY+3 STL NODE WORD 4 / NTRY+4 STL NODE WORD 5 / NTRY+5 STL NODE WORD 6 / NTRY+6 STL NODE WORD 7 / NTRY+7 STL NODE WORD 10 / NTRY+10 STL NODE WORD 11 / NTRY+11 PARTITION NAME IN SIXBT 1ST HALF / NTRY+12 PARTITION NAME IN SIXBT 2ND HALF / NTRY+13 PARTITION BASE ADDRESS / / NOTE THAT IT IS EXTREMELY IMPORTANT TO FILL UP DATA / ENTRIES IN THE REMOVE CHAIN IN THE ORDER THAT EACH / STL MODIFICATION WAS MADE. / / NOTE ALSO THAT ALL TASKS WHICH ACCESS THIS CHAIN OF / BLOCKS MUST RESIDE IN THE SAME PARTITION. / THOSE TASKS ARE: SAVE,TDV REM, MCR REM, TDV INS, MCR INS, / FININS, AND AUTORM. / / THE REMOVE CODE CHECKS FOR A MATCHING INSTALL. / IFPRESENT, THE INSTALL IS REMOVED, THE REMOVE IS NEVER / PLACED, AND THE DATA IS MOVED UP IN THE DISK / BLOCKS TO MINIMIZE THE SPACE USED. / .EJECT / / START TO PROCESS THE REMOVE CHAIN OF BLOCKS / INSSZ=14 /SIZE OF AN INSTALL ENTRY REMSZ=2 /SIZE OF A REMOVE ENTRY / LAC (BUFF /READ TO FIRST BUFFER FIRST DAC REMCTA+2 LAC* (REMBLK /SCAN BLOCK LIST SKP REM0 LAC BUFF+377 /FETCH NEXT BLOCK DAC CURBLK /CURRECT BLOCK IN ACTION JMS GETBLK /FETCH BLOCK WHOSE # IN AC / REM1 LAC BUFF+376 /FREE LENGTH POINTER SPA /DOUBLES ASLOGICAL EOF CMA /IS LAST ACTIVE BLOCK, MAKE + PAL /LOOP CONTROL CLX /START AT BUFF SNA /(022) SKIP IF SOME DATA IN BLOCK JMP REM1J /(022) NONE, CHECK LOGICAL EOF. REM11 LAC BUFF,X /SCAN FOR MATCHING INSTALL SPA /SKIP IF INSTALL ENTRY JMP REM1R /IS REMOVE ENTRY GO TO NEXT LAC* CNT /CHECK OUT DISK ADDRESS SAD BUFF+5,X / WITH THAN IN INSTALL JMP SQUNCH /SAME, GO GARBAGE COLLECT REM1I AXS INSSZ /THRU WITH THIS BLOCK? JMP REM11 /NOPE JMP REM1J /YUP, JOIN UP WITH OTHER AXS / REM1R AXS REMSZ /MOVE TO NEXT ENTRY JMP REM11 /MORE TO DO IN BLOCK / REM1J LAC BUFF+376 /IS THIS THE LAST BLOCK WITH ENTRIES SMA /SKIP IF LOGICAL END JMP REM0 /GO GET THE NEXT BLOCK XCT* (DEBUG /(017) 'IMPOSSIBLE' TO GET HERE; MESSAGE? JMP REM1K /(017) NO JMS SAVE /(017) CAL WILL ZAP XR LAC (MES3 /(017) PRINT MESSAGE ON SWITCH = SKIP DAC TYPCPB+4 /(017) PLACE IN CAL CAL TYPCPB /(017) MMESSAGE CAL WAITEV /(017) WAIT JMS RESTOR /(017) GET BACK XR LAC BUFF+376 /(017) RESTORE AC REM1K AAC 377-REMSZ /CAN IT FIT SPA /SKIP IF YES JMP GETSOM /NO, EITHER MT BLOCK AT CHAIN END, OR GET NEW ONE AAC -377 /MAKE NEW POINTER DAC BUFF+376 LAW -1 /REMOVE ENTRY ON LIST END DAC BUFF,X LAC* CNT /(018) DISK ADDR DAC BUFF+1,X JMS PUTBLK /REWRITE THE UPDATED BLOCK JMP REMNOD /THAT'S ALL / GETSOM LAC BUFF+376 /COMPLEMENT POINTER (TO +) CMA /AS THIS IS NO LONGER THE LAST ACTIVE BLOCK DAC BUFF+376 LAC BUFF+377 /IS THERE ALREADY A NEXT BLOCK SAD (-1 /IF NOT, THIS IS -1 JMP NEWGET /ALLOCATE A NEW BLOCK DAC CURBLK /READ EMPTY BLOCK FROM END JMS PUTBLK /(018)PLACE PRESENT BLOCK LAC CURBLK /(018) READ IN THE NEXT JMS GETBLK /THERE IS, FETCH IT REM1L LAW -1 /JOIN UP MAIN CODE TO PLACE ENTRY CLX /0 RELATIVE POSITION JMP REM1K / / ALLOCATE A NEW BLOCK FOR THE REM CHAIN / NEWGET CAL ALLO /ALLOCATE A BLOCK CAL WAITEV LAC EV /ANY ERRORS? SPA JMP FILERR /YES LAC ALLCTA+2 /NO -- GET THE BLK NUMBER LMQ /CONVERT PLATTER AND ADDR LAC ALLCTA+1 /TO A DISK BLOCK NUMBER AND (7777 LRSS 10 LACQ DAC NEWBLK /SAVE THE BLOCK NUMBER / / TRY TO WRITE ON THE NEW BLOCK, IF IT FAILS, THE PREVIOUS / BLOCK ON DISK DOES NOT YET POINT AT THE BAD BLOCK / JMS CONVRT JMS PUTBLK /WRITE OUT THE NEW BLOCK / / OK, SO WRITE OUT THE CURRENT DISK BLOCK / LAC CURBLK /GET CURRENT BLOCK NUMBER JMS CONVRT /PREPARE TO WRITE IT OUT LAC NEWBLK /SET UP BLK FORWARD PTR DAC BUFF+377 JMS PUTBLK /WRITE OUT THE OLD BLOCK / / INIT THE NEW DATA BLOCK BUFFER / LAC NEWBLK /SET NEWLY ALLO'D BLK TO CURRENT BLK DAC CURBLK JMS CONVRT /PREP TO WRITE OUT THIS BLOCK LAW -1 /(018)STOPPER DAC BUFF+377 JMP REM1L /JOIN UP TO PLACE ENTRY / SQUNCH PXA /MOVE DOWN ENTRIES IN PRESENT BLOCK TAD (BUFF-1 DAC* (X10 /AUTO INCR FOR PLACEMENT AXS INSSZ /MOVE XR FOR FETCH, SKIP IF IT WAS SKP /NOT LAST ENTRY JMP SQ01 /THE LAST ENTRY, DON'T MOVE ANYTHING NOW SQ0 LAC BUFF,X /IF ALREADY DONE, ONE PLACE TO SELF, OK. DAC* X10 AXS 1 JMP SQ0 /KEEP GOING / SQ01 LAC BUFF+376 /IS THIS THE LAST BLOCK ALREADY? SQ1 SPA /SKIP IF NOT JMP SQ8 JMS SAVE /SAVE XR,LR X10 LAC (BUFF+400 DAC REMCTA+2 /SET TO READ TO SECOND BUFF LAC BUFF+377 /NEXT BLOCK # DAC NEWBLK JMS GETBLK JMS RESTOR LAC BUFF+776 /END POINTER FOR NEW BLOCK SPA CMA PAL CLX JMP SQ31 /(021) CHECK IF NO MORE NOW! / / FILL UP, IF POSSIBLE, HOLE AT END OF LAST BLOCK / SQ2 LAC BUFF+400,X /-1 OR +1 FOR TYPE SPA!CLL /SKIP IF INS ENTRY LAW -INSSZ+REMSZ+1 /(020) ADJUST LENGTH; LINK SET NEXT INST. TAD* (X10 /THE WHERE ARE WE NOW POINTER CMA!IAC TAD (BUFF+376-INSSZ /ROOM, FLIPS LINK IF YES! SPA /SKIP IF YES JMP SQ4 /NOPE, NEED ANOTHER BLOCK LAW -REMSZ /LOOP CONTROL FOR ENTRY MOVE SZL /SKIP IF REM, ALL SET LAW -INSSZ /INS, SET IT UP DAC COUNT SQ3 LAC BUFF+400,X DAC* X10 AXR 1 /KEEP UP WITH XR ISZ COUNT /DONE JMP SQ3 SQ31 AXS 0 /(021)OUT OF ENTRIES IN NEW BLOCK JMP SQ2 /NOPE, TRY ANOTHQR MOVE LAC BUFF+776 /HAVE WE MOVD ALL SMA /SKIP IF YES JMP SQ4 /THIS IS A FUNNY, BUT POSSIBL CASE / / THE AMOUNT TO BE MOVED UP TO THE PREVIOUS DISK BLOCK / HAS GROWN TO A WHOLE BLOCK. JUST MOVE UP THE WHOLE BLOCK / DON'T RY TO COMPRESS ANY FURTHER. / SQ8 CLL!CML /MAKE UP BUFF+376 POINTER AS EOF JMS SQ376 /FROM POSITION OF X10 LAC (BUFF /WRITE OUT FROM BUFF #1 DAC REMCTA+2 LAC CURBLK /WRITE THE CURRENT BLOCK JMS CONVRT JMS PUTBLK JMP REMNOD /THAT'S ALL WHEW! / SQ4 JMS SAVE CLL JMS SQ376 /ESTABLISH (+) LENGTH POINTER IN BUFF LAC (BUFF DAC REMCTA+2 /SET TO WRITE OLD BLOCK LAC CURBLK JMS CONVRT JMS PUTBLK JMS RESTOR LAC (BUFF-1 /X10 TO PUSH #2 DOWN TO #1 DAC* (X10 AXS 0 /SKIP IF NONE TO MOVE DOWN SKP /SOME TO MOVE JMP SQ6 /NO DATA TO MOVE, BUT MOVE POINTERS SQ5 LAC BUFF+400,X DAC* X10 AXS 1 /REMEMBER LR LIMIT ON #2 JMP SQ5 SQ6 LAC NEWBLK /UPDATE POINTERS DAC CURBLK LAC BUFF+777 /MOVE DOWN END OF BUFFER DATA DAC BUFF+377 LAC BUFF+776 DAC BUFF+376 JMP SQ1 /UP TO TOP OF LOOP / SAVE 0 LAC* (X10 DAC SAV10 PXA DAC SAVX PLA DAC SAVL JMP* SAVE / RESTOR 0 LAC SAV10 DAC* (X10 LAC SAVX PAX LAC SAVL PAL JMP* RESTOR / SAV10 0 SAVX 0 SAVL 0 COUNT 0 / GETBLK 0 JMS CONVRT /CALL WITH AC HAVING #, SET UP CAL CAL GETREM /FETCH DISK BLOCK CAL WAITEV /WAIT LAC EV /OK SPA JMP DSKERR JMP* GETBLK / / / SUBROUTINE SQ376 / / MAKE UP FREE CORE POINTER FROM CONTENTS OF X10 / WHICH HAS BEEN USED TO PLACED DATA IN BUFF #1 / / CALL WITH LINK =0 IF POINTER TO BE POSITIVE / CALL WITH LINK =1 IF POINTER TO BE COMPLEMENTED, / TO SHOW EOF / SQ376 0 LAC (BUFF-1 /X10 VALUE IF NOTHING PLACED CMA!IAC TAD* (X10 /COMPLEMENT LINK, MAKE POINTER SNL /SKIP TO KEEP POINTER POSITIVE CMA DAC BUFF+376 /PLACE THE POINTER JMP* SQ376 / / / SUBROUTINE CONVRT -- CHANGE BLK NUMBER IN AC TO / PLATTER AND ADDRESS AND ENTER INTO GET/PUT CTA / CONVRT 0 /(MJH-15) LMQ /(MJH-15) LLSS!ECLA 10 /(MJH-15) DAC REMCTA /(MJH-15) LACQ /(MJH-15) DAC REMCTA+1 /(MJH-15) JMP* CONVRT /(MJH-15) / / SUBROUTINE PUTBLK -- WRITE OUT A DISK BLOCK / PUTBLK 0 /(MJH-15) CAL PUTREM /ISSUE PUT /(MJH-15) CAL WAITEV /WAIT FOR COMPLETE/(MJH-15) LAC EV /ANY ERRORS? /(MJH-15) SPA /(MJH-15) JMP DSKERR /YES /(MJH-15) JMP* PUTBLK /(019) RETURN CURBLK 0 /CURRENT BLK NO. FOR SRI CHAIN (MJH-15) NEWBLK 0 /NEWLY ALLO'D BLK IN CHAIN (MJH-15) OLDPTR 0 /OLD BLKS FREE WD PTR (MJH-15) REMNOD=. / ******************** LAC STLNOD /ADD NODE TO EMPTY POOL DAC* (R2) LAC (POOL) DAC* (R1) JMS* (NADD) /ADD NODE TO EMPTY POOL JMP START /SCAN THE STL AGAIN TO SEE IF THERE'S MORE TO DO. ERRTY CAL TYPCPB /MAKE TYPE CPB REQUEST CAL WAITEV /WAIT FOR ERROR MESSAGE TO BE PRINTED JMP REMNOD /FINISHED WITH THIS TASK -- LOOK FOR ANOTHER / DSKERR LAC (MES4) DAC TYPCPB+4 /PUT MESSAGE IN BUFFER POINTER JMP ERRTY /AND TYPE MESSAGE / FILERR LAC (MES6 DAC TYPCPB+4 CAL TYPCPB CAL WAITEV JMP REMNOD / REMNAM 4 /CANCEL DIRECTIVE EV /EVENT VARIABLE ADDRESS 0 /TASK NAME (FIRST HALF) 0 /TASK NAME (SECOND HALF) .BLOCK 3 FLAGS 0 PARBA 0 STLNOD 0 / DEALOC 1600 /DEALLOCATE CPB EV /EVENT VARIABLE ADDRESS 1 /LOGICAL UNIT NUMBER CNTRLT /CONTROL TABLE ADDRESS / GETSIZ 3000 /GET A WORD FROM THE DISK EV /EVENT VARIABLE ADDRESS 1 /LUN NUMBER CNTRLU /CONTROL TABLE ADDRESS / GETREM 3000 EV 1 REMCTA / PUTREM 3100 EV 1 REMCTA / REMCTA 0 0 BUFF 400 / ALLO 1500 EV 1 ALLCTA / ALLCTA 400 XX XX / CNTRLT 0 /NUMBER OF WORDS TO BE DELETED CNTRLU 0 /UNIT NUMBER CNTRLA 0 /DISK ADDRESS CNTCD CNTRLT /CORE ADDRESS FOR GET 1 /WORD COUNT FOR GET / TYPCPB 2700 EV 3 2 XX EV 0 / WAITEV 20 /WAIT FOR EV /EVENT VARIABLE ADDRESS / MES3 MES4-MES3/2*1000+2 0 .ASCII "AUTORM-SRI-NO MATCHING INSTALL ENTRY"<15> MES4 MES6-MES4/2*1000+2 0 .ASCII 'REM-DISK ERR'<15> MES6 MES7-MES6/2*1000 0 .ASCII "ALLOCATE ERROR"<15> MES7=. / / / SVBKCH 0 CNT 0 TEMP 0 BUFF .BLOCK 1000 .END BEGIN