/48 OS/8 FILE SUPPORT TASK / / / / / / / / / / /COPYRIGHT (C) 1978,1979 BY DIGITAL EQUIPMENT CORPORATION / / / / / / / / / / /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. / /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. / /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY /DIGITAL. / / / / / / / / / / /PROVIDES RTS-8 TASKS WITH THE FACILITY TO LOOKUP, ENTER /AND DELETE FILES IN OS/8 DIRECTORIES. /THE FORMAT OF A MESSAGE TO THIS TASK IS: /WORD 1 MESSAGE EVENT FLAG /WORDS 2&3 RESERVED FOR RTS-8 /WORD 4 TASK WORD /WORD 5 FUNCTION WORD / BITS 0-1 00=LOOKUP,10=DELETE,01=11=ENTER / BITS 7-11 UNIT NUMBER /WORD 6 POINTER TO FILE NAME /WORD 7 GETS A 0 IF SUCCESSFUL, ERROR CODE IF NOT /WORD 8 GETS BLOCK NUMBER AFTER SUCCESSFUL LOOKUP OR ENTER /WORD 9 GETS FILE LENGTH AFTER LOOKUP / SPECIFIES DESIRED FILE LENGTH ON ENTER / / LINKAGE TO OS8 TASK (WHEN PRESENT) / IFDEF OS8 < .EXTERNAL INTLOK,HNDTAB,LOKTAB > OS8DCB=7760 /PAGE 0 LOCATIONS: .XSECT OS8FX, LEVEL=0 FIELD RTFLD XR, 0 .ZSECT OS8FZ, LEVEL=0 FIELD OS8FX BLOCK, 0 /CURRENT BLOCK NUMBER LENGTH, 0 /CURRENT LENGTH PTNAME, 0 /POINTER TO FILE NAME NFILES, 0 /NUMBER OF FILES IN THIS SEGMENT ETMP, 0 /TEMPORARIES FOR "ENTER" EPTR, 0 .RSECT OS8FT, LEVEL=0 FIELD OS8FX .ZTERNAL DATE .TASK OS8F START, CAL RECEIVE /WAIT FOR A MESSAGE AND PULL IT IN MADDR, 0 DCA MSGCDF JMS MCDF /SET DF TO MESSAGE FIELD TAD I MADDR DCA IOTASK /SAVE TASK NUMBER ISZ MADDR TAD I MADDR DCA FN /SAVE FUNCTION ISZ MADDR TAD I MADDR DCA PTNAME /SAVE PTR TO FILE NAME ISZ MADDR CDF .FLD TAD FN AND (37 DCA UNIT /UNIT NUMBER IN BITS 9-11 OF FUNCTION WORD RENTER, TAD FN CLL RAL SPA CLA /FUNCTIONS ARE: JMP GETLEN /2000=ENTER, 6000=CLOSE SNL CLA JMP LOOKUP /0000=LOOKUP DELETE, JMS I (PURGE /4000=DELETE - PURGE FILE NAME FROM OS/8 DIRECTORY NOFILE, CLA CLL IAC /ERROR RETURN - SET STATUS CODE FINI, JMS MCDF DCA I MADDR /STORE STATUS CODE ISZ MADDR TAD BLOCK DCA I MADDR ISZ MADDR TAD LENGTH /STORE BLOCK NUMBER AND LENGTH IN MESSAGE DCA I MADDR IFDEF OS8 < TAD (OS8 CAL /RESUME OS/8 EXECUTION RUN > TAD MSGCDF DCA MEFCDF TAD MADDR TAD (-10 CAL POST FN, MEFCDF, 0 /POST MESSAGE EVENT FLAG JMP START /GET NEXT MESSAGE / ENTERR, AC0002 /ENTER ERROR, SET CODE JMP FINI /FINISH UP MCDF, 0 MSGCDF, HLT JMP I MCDF LOOKUP, JMS I (MDSRCH /FIND FILE NAME IN DIRECTORY JMP NOFILE /NOT FOUND CIA /RETURN POSITIVE SIZE DCA LENGTH /SAVE OBTAINED LENGTH JMP FINI /FOUND. GETLEN, AC0002 TAD MADDR DCA LENGTH JMS MCDF TAD I LENGTH /GET DESIRED LENGTH CDF .FLD DCA LENGTH /SAVE IT LOCALLY TAD FN /SPLIT ENTER AND CLOSE L7700, SMA CLA JMP ENTER TAD LENGTH /CHECK FOR ZERO LENGTH CLOSE SNA CLA JMP DELETE /YES, ZERO, WHICH IS REALLY A DELETE JMS INTERL /CHECK INTERLOCK (HERE FOR PAGE FIT) JMP CLOSE /REGULAR CLOSE, GO DO IT MRDCAT, 0 /DIRECTORY READ ROUTINE DCA DBLOCK /ENTER WITH BLOCK NUMBER IN AC JMS MREADC /READ DIR BLK TAD I (DSTBLK DCA BLOCK /INITIALIZE BLOCK NUMBER FROM DIRECTORY HEADER TAD I PDCNT DCA NFILES /INITIALIZE FILE COUNT TAD (DBODY-1 DCA XR /INITIALIZE DIRECTORY FILE PTR JMP I MRDCAT MREADC, 0 /LOW LEVEL DIRECTORY READ-WRITE TAD CMREAD DCA IOCTLW /STORE READ OR WRITE CONTROL WORD CAL SENDW IOTASK, 0 IOMSG TAD IOSTAT SZA JMP FINI /I/O ERROR - RETURN I/O STATUS AS ERROR TAD I PDCNT /QUICKIE VERIFY TEST FOR A DIRECTORY CMA CLL /# OF FILES + BLOCK LINKED TO NOT >100 OCTAL TAD I (DLINK SNL /SKIP IF ALREADY TOO BIG TAD L7700 /TESTING AGAINST 100 SNL CLA /SKIP IF TOO BIG JMP I MREADC AC4000 JMP FINI /ERROR 4000 - BAD OS/8 DIRECTORY BLOCK CMREAD, 200+ /IO REQUEST TO OUR FIELD IOMSG, ZBLOCK 3 UNIT, 0 /UNIT NUMBER IOCTLW, 0 /I/O CONTROL WORD PDCNT, DBUF /BUFFER PTR DBLOCK, 0 /BLOCK NUMBER IOSTAT, 0 /COMPLETION STATUS MEOVLS, ZBLOCK 10 /TEMPORARY STORAGE FOR DIRECTORY EXPANDER PAGE / / NEW CODE FOR CLOSE / CLOSE, JMS MDSRCH /SEARCH FOR FILE-NAME JMP NOFILE /CAN'T FIND IT TAD LENGTH /COME HERE WITH FOUND LENGTH IN AC, LINK=1 SNA /SKIP IF NOT SAME JMP FINI /SAME, WE'RE ALL SET LSNL, SNL /SKIP IF IT REALLY CAN FIT JMP ENTERR /NO, THAT IS A DIRECTORY BOMB-OUT DCA SAVSIZ /SAVE SIZE OF NEW EMPTY TAD XR /SAVE COPY OF WHERE WE ARE DCA EPTR JMS MSKIPF TAD XR DCA ETMP /AND COPY OF END TAD DEXTRA CMA JMS ENTR3 ISZ XR JMP ENTR1 /JOIN WITH ENTER CODE / / ENTER CODE / ENTER, JMS PURGE /DELETE PREVIOUS COPY OF FILE L10, 10 /FALL THRU, KEEP AC=0 TAD LENGTH /WHICH KIND OF ENTER SNA CLA /SKIP IF REGULAR STA /FIND BIGGEST, INIT BLOCK WITH -1 DCA SAVSIZ /COMPARE HERE WHEN GO THRU DIRECTORY TAD SAVSIZ /SET UP CORRECT SKIP TEST AND L10 TAD LSNL DCA XSXL /IN EMPFND ROUTINE DCA SAVBLK /FLAG 0=NONE FOUND TAD LVAR10 /JMS TO ERTNAD IS A FLAG JMS MDSRCH /LOOK THRU DIRECTORY FOR EMPTY TAD SAVBLK /DID WE GET ONE SNA /SKIP IF YES JMP ENTERR JMS MRDCAT /REINIT THAT DIRECTORY BLOCK TAD SAVFND /REMEMBER WHICH BLOCK WE FOUND IT AT DCA BLOCK TAD LENGTH /WHICH KIND OF ENTER SZA CLA /SKIP IF SPECIAL JMP REGSET /REGULAR ENTER ALREADY SET TO GO TAD SAVSIZ /BIGGEST SIZE BECOMES LENGTH CIA /BUT IT WAS MINUS IN SAVSIZ! DCA LENGTH DCA SAVSIZ /AND THERE IS NO REMAINDER REGSET, TAD SAVXR /SAVED POINTER DCA EPTR /HERE FOR REST OF CLEANUP LOGIC JMS MSKIPF /FIND END OF SEGMENT TAD XR /SAVE POINTER VALUE DCA ETMP / EINRTS, TAD SAVSIZ /LENGTH OF GOOD EMPTY SNA CLA /CHECKING FOR EXACT FIT AC0002 /YES, EMPTY WILL GO AWAY TAD (-4 JMS ENTR3 TAD (-4 DCA ETMP NMOVLP, JMS MCDF /MOVE NEW NAME TO DIRECT. TAD I PTNAME ISZ PTNAME CDF .FLD DCA I XR ISZ ETMP JMP NMOVLP CDF RTS8 TAD I (DATE CDF .FLD DCA I XR CLA IAC JMS BUMPXR ENTR1, TAD LENGTH CIA DCA I XR /NEW LENGTH TAD SAVSIZ /EMPTY LENGTH SNA CLA JMP ENTR2 /=0, SKIP SOME WORK DCA I XR /CLEAR FIRST WORD OF EMPTY TAD SAVSIZ DCA I XR /AND HERE IS THE EMPTY VALUE STA TAD DBUF /INCREMENT FILE COUNT DCA DBUF TAD FN /CHECK FOR CLOSE SPA CLA JMS CONSUL /CLEAN UP DIRECT FOR CLOSE ENTR2, AC4000 JMS MREADC /WRITE IT OUT JMP FINI LVAR10, ERTNAD&177+4600 ENTR3, 0 JMS BUMPXR JMS CKOVFL JMS MOVEUP STA TAD ETMP DCA XR JMP I ENTR3 CKOVFL, 0 /CHECK DIRECTORY SEGMENT OVERFLOW TAD I (DEXTRA CIA TAD XR /MUST BE ROOM FOR 1 DUMMY ENTRY TAD LVAR3 SMA CLA JMP I (NOROOM /THERE ISN'T - MUST ADJUST SEGMENTS JMP I CKOVFL LVAR3, -DBUF-372 PAGE / / SEARCH DIRECTORY / / CALL WITH AC=0 TO SEARCH FOR NAME MATCH / CALL WITH AC JMS I ERTNAD TO SCAN FOR EMPTY / / ON NAME MATCH: / NO FIND: IMMEDIATE RETURN, AC=0 / FIND: SKIP RETURN, AC=SIZE (-), LINK=1 / / / ON EMPTY SCAN: / ALWAYS TAKES IMMEDIATE RETURN / MDSRCH, 0 /DIRECTORY SEARCH ROUTINE DCA ENTRTN /AC=0 OR JMS ERTNAD CLA IAC SRSEGL, JMS I (MRDCAT MDSRCL, TAD PTNAME DCA PTN /GET POINTER TO FILE NAME WORD 1 TAD (-4 DCA CT TAD I XR SZA /CHECK ENTRY TYPE JMP SRCWDM /JOIN SEARCH LOOP ENTRTN, HLT /PLACED CODE CLL CLA /MAY RETURN WITH JUNK IN AC JMP SKPMTF /EMPTY SRCWDL, TAD I XR SRCWDM, CIA JMS I (MCDF TAD I PTN ISZ PTN CDF .FLD SZA CLA /COMPARE FILE NAME AGAINST DIRECTORY ENTRY JMP NXTFIL ISZ CT JMP SRCWDL JMS BUMPXR /SUCCESSFUL MATCH TAD I XR /GET LENGTH WORD SNA JMP SKPTMP /LENGTH 0 FILES ARE TENTATIVES ISZ MDSRCH STL /CONVENIENCE FOR CALLER TO DO COMPARE JMP I MDSRCH /TAKE SKIP RETURN IF SUCCESS NXTFIL, TAD CT IAC JMS BUMPXR /SKIP TO END OF FILE NAME IN SEGMENT SKPMTF, TAD I XR CIA TAD BLOCK /UPDATE BLOCK NUMBER DCA BLOCK SKPTMP, ISZ NFILES JMP MDSRCL TAD I (DLINK /SEGMENT EXHAUSTED - ON TO NEXT SEGMENT SNA SHUNT, JMP I MDSRCH /NO NEXT SEGMENT - TAKE ERROR EXIT JMP SRSEGL CT, 0 ERTNAD, EMPFND /INDIRECT ADDR PURGE, 0 /ROUTINE TO PURGE A FILE FROM THE DIRECTORY JMS INTERL /CHECK INTERLOCK JMS MDSRCH /SEARCH DIRECTORY FOR FILE NAME JMP I PURGE /NO SUCH FILE - ERROR EXIT ISZ PURGE AC7776 TAD XR DCA XR /POINT XR AT LENGTH WORD - 1 TAD XR DCA SQP ISZ SQP DCA I SQP /ZERO LENGTH WORD -1 AC7775 TAD I (DEXTRA JMS SQUISH /SQUISH OUT FILE NAME, LEAVING EMPTY JMS CONSUL /ELIMINATE PAIRS OF EMPTIES AC4000 JMS I (MREADC /WRITE OUT THIS SEGMENT JMP I PURGE /AND RETURN PTN, SQP, INTERL, 0 IFDEF OS8 < JMS CKINTL TAD (OS8 /MADE IT! - SUSPEND OS/8 CAL /SO WE WON'T HAVE ANY TROUBLE SUSPND > JMP I INTERL / CONSUL, 0 /ROUTINE TO CONSOLIDATE A DIRECTORY TAD (DBODY-1 DCA XR TAD I (DBUF DCA CT CONLP, TAD I XR SNA CLA JMP PEMPTY /GOT AN EMPTY - CHECK FOR 2 PSKIPF, TAD (-4 JMS BUMPXR /SKIP PAST FILE NAMES ISZ CT JMP CONLP JMP I CONSUL /DONE - RETURN PEMPTY, ISZ XR TAD XR DCA SQUISH /SAVE POINTER TO FIRST LENGTH WORD ISZ CT SKP JMP I CONSUL /LAST ENTRY WAS EMPTY - WE'RE DONE TAD I XR SZA CLA JMP PSKIPF /NON-EMPTY - NO SQUISH TAD I XR TAD I SQUISH DCA I SQUISH AC7776 JMS SQUISH /SQUISH OUT REDUNDANT EMPTY ISZ I (DBUF JMP CONSUL+1 /START ALL OVER AGAIN SQUISH, 0 /LOW LEVEL COMPRESS ROUTINE TAD XR DCA SQP SQLOOP, TAD I XR ISZ SQP DCA I SQP TAD XR TAD LVAR4 SZA CLA JMP SQLOOP JMP I SQUISH LVAR4, -DBUF-377 PAGE NOROOM, TAD I (DLINK SNA CLA /LAST SEGMENT? JMP MELAST /YES - SPECIAL PROCEDURE ISZ I (DBUF /DECREASE ENTRY COUNT BY 1 AC4000 JMS I (MREADC /WRITE OUT THIS SEGMENT JMS MSKIPF /FIND END OF SHORT SEGMENT DCA MEFCNT /INITIALIZE LENGTH COUNTER TAD (MEOVLS-1 DCA EPTR MVLP1, TAD I XR ISZ EPTR DCA I EPTR ISZ MEFCNT TAD XR CIA TAD ETMP /MOVE LAST FILE NAME TO SAFE PLACE SZA CLA JMP MVLP1 TAD I ETMP DCA MEOCNT /SAVE LENGTH OF LAST ENTRY TAD I (DLINK JMS I (MRDCAT JMS I (CONSUL /PRE-SQUISH NEW SEGMENT TAD I (DSTBLK TAD MEOCNT /BUMP DOWN FILE ORIGIN DCA I (DSTBLK JMS MSKIPF /FIND END OF SEGMENT TAD XR DCA ETMP STA TAD MEFCNT TAD XR DCA XR /BUMP XR BACK BY NEW FILE ENTRY LENGTH TAD (DBODY+1 DCA EPTR JMS I (MOVEUP TAD (MEOVLS-1 DCA XR STA TAD I (DBUF DCA I (DBUF /INCREASE ENTRY COUNT TAD MEFCNT CIA JMP MECOMN MELAST, TAD (7 /MOVE 7 FILES INTO BRAND NEW SEGMENT TAD I (DBUF DCA I (DBUF /DECREASE ENTRY COUNT BY 7 JMS MSKIPF /FIND NEW END OF SEGMENT TAD I (DBLOCK AND (7 IAC DCA I (DLINK /LINK THIS SEGMENT TO NEW ONE TAD I (DLINK TAD (-7 SMA CLA /HAVE WE RUN OUT OF SEGMENTS? JMP I (ENTERR /YES AC4000 JMS I (MREADC /WRITE OUT TRUNCATED BLOCK ISZ I (DBLOCK /SET UP TO WRITE NEW BLOCK TAD (-7 DCA I (DBUF TAD MEOCNT CIA TAD I (DSTBLK /NEW START BLOCK = OLD START BLOCK DCA I (DSTBLK /PLUS LENGTH OF OLD SEGMENT DCA I (DLINK /MARK AS NEW LAST SEGMENT TAD XR TAD LVAR5 /MOVE TOP OF DIRECTORY DOWN MECOMN, DCA MEFCNT TAD (DBODY-1 DCA EPTR MVLP2, TAD I XR ISZ EPTR DCA I EPTR /COPY NEW FILE INTO NEW SEGMENT ISZ MEFCNT JMP MVLP2 JMS MSKIPF /SKIP TO END OF SEGMENT TAD XR DCA ETMP /SAVE FOR POSSIBLE ITERATION JMS I (CKOVFL /CHECK FOR NEW SEGMENT OVERFLOW AC4000 JMS I (MREADC /WRITE OUT SEGMENT JMP I (RENTER /START ENTER OVER AGAIN LVAR5, -DBUF-377 MSKIPF, 0 /ROUTINE TO SKIP TO END OF SEGMENT TAD I (DBUF DCA MNOFIL TAD (DBODY-1 DCA XR DCA MEOCNT /KEEP RUNNING LENGTH ON THE WAY MSKPLP, TAD I XR SNA CLA JMP MEOMTY AC7775 JMS I (BUMPXR /BUMP PAST FILE NAME MEOMTY, TAD I XR TAD MEOCNT DCA MEOCNT /UPDATE LENGTH ISZ MNOFIL JMP MSKPLP JMP I MSKIPF MNOFIL, 0 MEFCNT, 0 MEOCNT, 0 / BUMPXR, 0 TAD DEXTRA /# OF EXTRA INFO WORDS CIA TAD XR DCA XR JMP I BUMPXR / PAGE DBUF, 0 /DIRECTORY BUFFER - FIRST WD IF FILE CT DSTBLK, 0 /STARTING BLOCK FOR FILES IN THIS SEGMENT DLINK, 0 /LINK TO NEXT SEGMENT DOPTR, 0 DEXTRA, 0 /NUMBER OF EXTRA WORDS PER FILE ENTRY DBODY, ZBLOCK 373 /BODY OF DIRECTORY .FSECT OSCK, LEVEL=0 FIELD OS8FX IFDEF OS8 < FLDTMP=OSBASE+1 OS8F1=++ CKINTL, 0 WTINTL, TAD (HNDTAB /INIT XR AND LENGTH FOR SCAN LOOP DCA XR /PREVIOUSLY INIT'ED IN 'PURGE' TAD (-17 DCA ETMP /WHICH WAS INCORRECT HNDLP, TAD I (FN AND (1777 /SEE IF OUR DEVICE IS IN THE OS/8 SYSTEM CIA TAD I XR /BY SEARCHING THE OS8 SUPPORT TASK'S SNA CLA /TABLES FOR IT JMP FNDOSD /FOUND IT ISZ ETMP JMP HNDLP /KEEP LOOKING JMP I CKINTL /NOT THERE - NO INTERLOCK FNDOSD, TAD XR TAD LVAR2 DCA ETMP /GET POINTER INTO THE DCB ENTRY FOR THE CDF OS8F1 /DEVICE INVOLVED TAD I ETMP AND (7 /CHECK FOR OPEN OUTPUT FILE ON THE DEVICE CDF .FLD SZA CLA JMP INTWAT /LOCKED UP ON FILE TAD XR /NOW CHECK FOR DIRECTORY LOCK-UP TAD LVAR6 DCA ETMP TAD I ETMP SNA CLA /SKIP IF DIRECTORY LOCK-UP JMP I CKINTL /NEITHER LOCKED INTWAT, ISZ I PINTLK /FLAG TO PENDING STAT CAL WAITE PINTLK, INTLOK JMP WTINTL LVAR2, OS8DCB-1-HNDTAB LVAR6, LOKTAB-1-HNDTAB > / / COMPUTE CORRECT EMPTY CODE / EMPFND, 0 CLA IAC /MAKE POINTER TO LENGTH OF EMPTY WORD TAD XR DCA EPTR CLL STA /BIG ENOUGH? TAD I EPTR TAD LENGTH SNL /SKIP IF YES (ALWAYS FOR FIND-BIGGEST SEARCH) JMP I EMPFND /MISSED CMA /MAKE MINUS (NO IAC SINCE STA ABOVE!) TO CHECK TAD SAVSIZ /BETTER THAN PREVIOUS ONE? XSXL, HLT /SNL FOR REGULAR, SZL FOR FIND BIGGEST JMP I EMPFND /PREVIOUS ONE BETTER CIA /NEW ONE BETTER!! TAD SAVSIZ /UPDATE SAVSIZ DCA SAVSIZ TAD DBLOCK /SAVE DIRECTORY BLOCK WE FOUND IT IN DCA SAVBLK TAD EPTR /AND SAVE WHERE IN BLOCK DCA SAVXR TAD BLOCK /WHICH BLOCK ON DISK IS THE FILE DCA SAVFND TAD SAVSIZ /PATCH! DID WE JUST PLACE A 0 IN SAVSIZ SZA CLA /SKIP IF YES, WE'RE DONE, TAKE EARLY EXIT JMP I EMPFND JMP SHUNT SAVFND, 0 /SAVE FOUND DISK BLOCK SAVXR, 0 /SAVE POINTER TO EMPTY FIND SAVSIZ, 0 /SAVE LENGTH-SIZE, WHICH IS NEGATIVE OF LEFT OVER SIZE SAVBLK, 0 /BLOCK # IN WHICH WE SCORED / / DIRECTORY MOVER / MOVEUP, 0 /ROUTINE USED BY ENTER AND "NOROOM" TAD I ETMP DCA I XR /TRANSFER A WORD TAD ETMP CMA TAD EPTR SNA CLA JMP I MOVEUP /ENOUGH WORDS - DONE STA TAD ETMP DCA ETMP AC7776 TAD XR DCA XR JMP MOVEUP+1