. . PACK COMMAND PROCESS . . THIS ROUTINE PROVIDES A SEMI-SAFE PACK, USING THE ALGORITHM FIRST . IMPLEMENTED BY BERT HYMAN OF THE UNIVERSITY OF MARYLAND. . IF THE SYSTEM CRASHES WHILE A PACK IS IN PROGRESS, THE WORST THAT . CAN HAPPEN IS THAT ONE ELEMENT WILL BE LOST, AND ALL PROCS WILL . HAVE TO BE RE-PDP'D. THE ONLY WAY TO PROVIDE A COMPLETELY SAFE . PACK WOULD BE TO COPY TO A HIGHER F-CYCLE, AND THIS, WE FEEL, GOES . BEYOND THE MANDATE OF THE PACK COMMAND. . . . (C) Copyright 1972-1978 John Walker . . This software is in the public domain . AXR$ DEFUNCT$ FANG PROCROUTINES . RELLEN EQU (0177777/(28*64))*28*64 LARGEST TRACK MULTIPLE IN 65K . . POINTER REGISTER ASSIGNMENTS . . R7 POINTER TO LAST ELEMENT PROC NAME FOUND IN . R8 ORIGINAL FTI . R9 PROC ENCOUNTERED SELECTION BITS . R10 OUTPUT FCT POINTER . R11 INPUT FCT POINTER . R12 NONZERO IF RELOCATABLE PREAMBLE OPTIMISED OUT . R13 ELEMENT TABLE BUFFER, BUFFER LENGTH . R14 CHAIN OF SELECT ITEMS FOR PROC TYPE ELEMENTS . . PACK* LX X9,CDBPC,X8 LOAD LINK TO ELEMENT CLASS PARAMETER DSZ R10 MARK NO INPUT AND OUTPUT FCT'S * LNA,U A7 SET NOT TO SELECT DELETED ELEMENTS . MUST USE LENGTH OF ENTIRE ELEMENT TABLE LMJ X11,FILESCAN PREPARE LIST OF ELEMENTS TO BE SAVED J BSPER PROCESS BSP ERROR IN PACK SETUP LMJ X11,ELTREL RELEASE ELEMENT TABLE BUFFER JZ A8,PCKEMT NO ELEMENTS SELECTED: HAVE MERCY BGETL FTIL ALLOCATE A DUMMY FTI FOR OUTPUT LA A1,A14 LOAD ADDRESS OF ORIGINAL FTI DL A2,FTIFN,A1 LOAD FILE NAME FROM OLD FTI DS A2,FTIFN,A0 COPY FILE NAME TO NEW FTI SA A14,R8 STORE ORIGINAL FTI IN R8 SA A0,A14 SET A14 TO OUTPUT FTI ADDRESS LR,U R1,FTIL-2 LOAD FTI LENGTH MINUS TWO WORDS LA,U A2,(0) GET ADDRESS OF A ZERO LXI,U A0,1 LOAD INCREMENT TO CLEAR FTI AA,U A0,2 DON'T CLEAR THE FILE NAME BT A0,,*A2 CLEAR THE FTI TO NULL FILE STATE LA A0,A14 RELOAD FTI ADDRESS LA A2,('**PF**') LOAD PROGRAM FILE SENTINEL SA A2,FTIPF,A0 SET SENTINEL IN PROGRAM FILE LA,U A2,1792 LOAD FIRST TEXT ADDRESS TO USE SA A2,FTIWL,A0 UPDATE NEXT WRITE ADDRESS sa a2,032,a0 ****** set magic cell ??? ****** LA A0,R8 LOAD ORIGINAL FTI ADDRESS AA,U A0,FTIET ADVANCE TO ELEMENT TABLE LMJ X11,PFTLEN COMPUTE BUFFER SIZE TG,U A0,BUFELTT+1 LARGER THAN CONFIGURED MAX ? LA,U A0,BUFELTT YES. FORCE PAGING SA A0,A1 SAVE LENGTH OF ELEMENT TABLE BUFFER BGETL . ALLOCATE AN ELEMENT TABLE BUFFER LXI,U A1,,A0 LOAD ADDRESS OF ALLOCATED BUFFER SA A1,R13 SAVE FOR SUBSEQUENT REFERENCES LA A0,A14 LOAD OUTPUT FTI ADDRESS rpfet . MARK A DUMMY ELEMENT TABLE IN CORE IERR . ERROR READING DUMMY ELEMENT TABLE ?? . . STEP 1. EACH ELEMENT SELECTED BY THE ELEMENT CLASS SPECIFICATION . IS ENTERED IN THE NEW ELEMENT TABLE. THE TEXT AND . PREAMBLE ADDRESSES ARE NOT CHANGED IN THE NEW TABLE OF . CONTENTS. . LR,U R9 CLEAR PROC SELECT BITS LR,U R14 CLEAR LINK TO PROC SAVE BUFFERS ETCBGN REMOVE CDELTQ,X8 REMOVE AN ELEMENT TO PROCESS TNE,U A1,CDELTQ,X8 IS THIS THE END OF THE QUEUE ? J ETCDONE YES. DONE REWRITING ELEMENT TABLE ANA,U A1,EIFQ BACK UP TO START OF ELEMENT ITEM LR R3,EISEQ,A1 LOAD SEQUENCE NUMBER IN ORIGINAL FILE LX,U X6,,A1 SAVE FIND PACKET ADDRESS LA A0,A14 LOAD FTI ADDRESS etia . ADD ELEMENT TO NEW ELEMENT TABLE J BSPER BSP ERROR. TERMINATE LA A0,EITYP,X6 LOAD ELEMENT TYPE TE,U A0,TY$SYM SYMBOLIC ELEMENT ? TG,U A0,TY$REL NO. IS IT A PROC ? J ETCRELB NO. DONE WITH ELEMENT TABLE ENTRY SA A1,EINSEQ,X6 SET NEW SEQUENCE NUMBER IN FILE SR R3,EISEQ,X6 RESTORE OLD SEQUENCE NUMBER IN LINK WORD SR R14,EIVER,X6 CHAIN PROCS PROCESSED TO THIS ELEMENT SX X6,R14 SET THIS ELEMENT AS HEAD OF LIST LA A1,EITXTA,X6 LOAD ORIGINAL TEXT ADDRESS SA A1,EIVER+1,X6 SET NEW TEXT ADDRESS INITIALLY SAME LA,U A1,1 LOAD A ONE BIT LSSL A1,,A0 SHIFT BIT BY ELEMENT TYPE OR A1,R9 UPDATE PROC SELECTION BITS SA A2,R9 STORE NEW PROC SELECTION BITS J ETCBGN PROCESS NEXT SELECTED ELEMENT ETCRELB BRELR X6 RELEASE ELEMENT SELECTION ITEM J ETCBGN RETURN TO PROCESS NEXT ELEMENT ETCDONE LA A0,A14 LOAD FTI ADDRESS wpfet . REWRITE ELEMENT TABLE TO FILE J BSPER BSP ERROR. LA A0,A14 RELOAD FTI ADDRESS wfti . REWRITE FILE TABLE INDEX J BSPER BSP ERROR. . . STEP 2. COPY ELEMENTS ONE BY ONE DOWN FROM THEIR ORIGINAL . ADDRESSES TO THEIR NEW LOCATIONS. REWRITE EACH ELEMENT . TABLE ENTRY USING PTEWT AS THE ELEMENT IS COMPLETED. . LA A1,ELFDT,X9 LOAD FDT ADDRESS FOR SOURCE FILE LMJ A2,IOGET BUILD AN INPUT FCT SA A0,R11 SAVE IN INPUT FCT REGISTER LA A1,ELFDT,X9 GET POINTER TO SAME FILE LMJ A2,IOGET ALLOCATE FDT TO WRITE INTO FILE SA A0,R10 SAVE OUTPUT FCT ADDRESS LX X9,R10 LOAD OUTPUT FCT POINTER LX X10,R11 LOAD INPUT FCT ADDRESS LA,U A0,R$ LOAD READ FUNCTION SA A0,IOFUNC,X10 SET FUNCTION FOR READ FCT LA,U A0,'D' GET I/O OPTION (DUPLICATE ADDRESS) SA A0,IOOPT,X9 SET OUTPUT MODE IN FCT LMJ A2,OUTPUT CREATE AN OUTPUT WRITER ACTIVITY LA A0,A14 LOAD FTI ADDRESS rfti . READ IN UPDATED FTI J BSPER BSP ERROR. la a0,a14 reload FCT address LA A1,R13 LOAD ELEMENT TABLE BUFFER AND LENGTH rpfet . READ IN ELEMENT TABLE J BSPER BSP ERROR. LA,U A12,1792 LOAD FIRST WRITE ADDRESS FOR FILE LA,U A13 CLEAR SEQUENCE NUMBER TO SCAN FILE . PTXBGN AA,U A13,1 INCREMENT SEQUENCE NUMBER LA A1,A13 LOAD SEQUENCE NUMBER LA A0,A14 LOAD FTI ADDRESS etnl . GET NEXT ELEMENT IN FILE J PTXDONE ERROR. PROBABLY END OF FILE LX,U X1,,A0 SAVE FIND ITEM ADDRESS LA A6,EITYP,X1 LOAD ELEMENT TYPE . . SEE IF ELEMENT TEXT NEEDS TO BE MOVED . TNE A12,EITXTA,X1 HAS TEXT ADDRESS CHANGED ? J PTXNMT NO. CHECK PREAMBLE LA A11,EITXTL,X1 LOAD LENGTH OF ELEMENT TEXT TE,U A6,TY$REL IS ELEMENT RELOCATABLE ? J PTXMVT NO. SKIP OPTIMISATION TEST . . MOST RELOCATABLE GENERATING PROCESSORS WRITE THE PREAMBLE . IMMEDIATELY AFTER THE TEXT. IF THIS IS THE CASE, WE OPTIMISE AND . MOVE BOTH THE PREAMBLE AND THE TEXT IN ONE OPERATION. . LR,U R12 CLEAR PREAMBLE OPTIMISED LA A0,EITXTA,X1 LOAD ORIGINAL TEXT ADDRESS AA A0,A11 COMPUTE END OF TEXT ADDRESS TE A0,EIPREA,X1 PREAMBLE CONTIGUOUS WITH TEXT ? J PTXMVT NO. GO MOVE THE TEXT LR,U R12,1 SET PREAMBLE OPTIMISED OUT LA A0,A12 LOAD NEW TEXT ADDRESS AA A0,A11 ADD TEXT LENGTH SA A0,EIPREA,X1 SET PREAMBLE ADDRESS IN PACKED FILE AA A11,EIPREL,X1 ADD PREAMBLE LENGTH TO ACCESS LENGTH PTXMVT LA A9,EITXTA,X1 LOAD SOURCE TEXT ADDRESS SA A12,EITXTA,X1 STORE NEW TEXT ADDRESS IN ITEM LMJ X7,MOVEIT COPY TEXT AND POSSIBLY PREAMBLE TE,U A6,TY$SYM IS ELEMENT SYMBOLIC ? TG,U A6,TY$REL NO. IS IT A PROC ? J PTXUAD NO. GO UPDATE NEXT WRITE ADDRESS LA A0,R14 LOAD LINK TO FIRST PROC FIND ITEM PTXFPR . ON DEBUG TNZ A0 MISSING PROC ? IERR . PROC FOUND IN PHASE 2, NOT IN PHASE 1 OFF DEBUG TNE A13,EINSEQ,A0 IS THIS THE CURRENT PROC ? J PTXSTA YES. STORE NEW ADDRESS IN ITEM LA A0,EIVER,A0 NO. LOAD LINK TO NEXT PROC J PTXFPR KEEP LOOKING FOR PROC PTXSTA SA A12,EIVER+1,A0 STORE UPDATED ADDRESS IN ELEMENT ITEM PTXUAD AA A12,EITXTL,X1 INCREMENT NEXT WRITE ADDRESS TE,U A6,TY$REL WAS ELEMENT RELOCATABLE ? J PTXTUP NO. UPDATE TOC ENTRY TZ R12 YES. WAS PREAMBLE OPTIMISED ? J PTXTUR YES. JUST ADD THE LENGTH PTXPCP LA A9,EIPREA,X1 LOAD ORIGINAL PREAMBLE ADDRESS FOR MOVE SA A12,EIPREA,X1 STORE NEW PREAMBLE ADDRESS FOR ELEMENT LA A11,EIPREL,X1 LOAD LENGTH OF PREAMBLE LMJ X7,MOVEIT COPY PREAMBLE TO NEW ADDRESS PTXTUR AA A12,EIPREL,X1 ADD PREAMBLE LENGTH TO NEXT WRITE ADDRES PTXTUP LA A0,A14 LOAD FTI ADDRESS ptewt . REWRITE THIS ELEMENT TABLE ENTRY J BSPER BSP ERROR. J PTXBGN GO PROCESS NEXT ELEMENT . PTXNMT AA A12,EITXTL,X1 INCREMENT TO FIRST ADDRESS AFTER TEXT TE,U A6,TY$REL RELOCATABLE ELEMENT ? J PTXBGN NO. DONE WITH THIS ELEMENT TE A12,EIPREA,X1 IS PREAMBLE ADDRESS CURRENTLY RIGHT ? J PTXPCP NO. GO COPY THE PREAMBLE AA A12,EIPREL,X1 YES. ADD THE PREAMBLE LENGTH J PTXBGN PROCEED WITH NEXT ELEMENT . PTXDONE TE,U A0,014 VALID END-OF-TABLE STATUS ? J BSPER NO. REAL BSP ERROR LA A0,A14 LOAD FTI ADDRESS SA A12,FTIWL,A0 UPDATE NEXT WRITE ADDRESS IN FTI BGET IBDATA ALLOCATE A DATA BUFFER TO STOP OUTPUT SNONZ IBLAST,A0 MARK THIS AS THE LAST BUFFER LA,U A1,STERM LOAD SOFTWARE TERMINATION STATUS SA A1,IBSTAT,A0 SET TERMINATION STATUS IN BUFFER LA,U A1,,A0 LOAD ADDRESS OF DATA ITEM PUT IOBB,X10 PUT ITEM ON INPUT BOUNDED BUFFER LA A0,A14 LOAD FTI ADDRESS wpfet . WRITE OUT ELEMENT TABLE J BSPER BSP ERROR. LA A0,R13 LOAD ELEMENT TABLE BUFFER ADDRESS SSL A0,18 SHIFT DOWN BUFFER ADDRESS TO H2 BRELR A0 RELEASE ELEMENT TABLE BUFFER P IOBB+QL,X9 WAIT FOR OUTPUT TO TERMINATE BRELP X9 RELEASE OUTPUT FCT SZ R10 MARK OUTPUT FCT RELEASED * . . STEP 3. FOR EACH TYPE OF PROC ELEMENT ENCOUNTERED WHILE PROCESSING, . SCAN THE PROC TABLE AND CHANGE THE ELEMENT SEQUENCE NUMBERS . AND FILE ADDRESSES FOR EACH PROC ENTRY. THE ELEMENT TABLE . ENTRIES FOR THE COPIED PROCS ARE USED AS MAPPING BUFFERS . TO SUPPLY THE OLD AND NEW SEQUENCE NUMBERS AND ADDRESSES. . TNZ R9 ANY PROCS ENCOUNTERED ? J PRFNONE NO. SKIP ALL THIS STUFF LR,U R4,TY$FORP-TY$ASMP LOAD LOOP COUNT FOR THREE TYPES OF PROCS LX X9,R8 LOAD ADDRESS OF ORIGINAL FTI AX,U X9,FTIAPT POINT TO FIRST PROC TABLE ENTRY LX,U X7,TY$ASMP LOAD LOWEST PROC TYPE . PRFBGN TNZ 0,X9 DOES THIS PROC TYPE EXIST IN FILE ? J PRFSKP NO. SKIP ENTRY UPDATE FOR THIS TYPE LA A0,R9 LOAD PROC SELECTION BITS SSL A0,,X7 MOVE SELECT BIT FOR THIS TYPE TO LOW BIT JNB A0,PRFSKP SKIP IF NO PROCS OF THIS TYPE SAVED LA,U A0,,X9 LOAD START OF FTI ENTRY FOR THIS TYPE LMJ X11,PFTLEN COMPUTE BUFFER SIZE REQUIRED TG,U A0,BUFPRCT+1 LARGER THAN CONFIGURED PROC TABLE MAX ? LA,U A0,BUFPRCT YES. USE MAX SIZE, REQUIRING PAGING SA A0,A1 SAVE LENGTH OF PROC BUFFERS LSSL A0,1 ALLOCATE TWO OF 'EM BGETL . ...FOR PROC INPUT AND OUTPUT LXI,U A1,,A0 LOAD BUFFER ADDRESS FOR FIRST BUFFER SA A1,R13 SAVE ADDRESS AND LENGTH FOR FIRST BUFFER LA A0,R8 LOAD ORIGINAL FTI ADDRESS pircall RPFxPT,x7 READ IN ORIGINAL PROC TABLE J bspero BSP ERROR. LA A0,A14 LOAD NEW FTI ADDRESS LA A1,R13 LOAD BUFFER LENGTH AND ADDRESS LA,U A2,,A1 LOAD LENGTH OF TABLE LSSL A2,18 MOVE LENGTH TO H1 AH A1,A2 POINT TO SECOND BUFFER pircall RPFxPT,x7 READ DUMMY NEW TABLE INTO ELT BUFFER IERR . ERROR BUILDING DUMMY EMPTY TABLE ? LA,U A13 CLEAR TABLE SEQUENCE NUMBER LR,U R7 CLEAR CURRENT ITEM POINTER PRFLUP AA,U A13,1 INCREMENT SEQUENCE NUMBER LA A1,A13 LOAD CURRENT SEQUENCE NUMBER LA A0,R8 LOAD OLD FTI ADDRESS pircall xPTNL,x7 READ IN NEXT PROC TABLE ENTRY J PRFDONE ERROR. PROBABLY END OF TABLE LX,U X6,,A0 SAVE ENTRY ADDRESS IN X6 LA,H1 A1,2,X6 LOAD OLD SEQUENCE NUMBER OF THIS ENTRY TNZ R7 LAST ITEM POINTER SET UP ? J PRFNOP NO. SEARCH FROM START LA A0,R7 GET POINTER TO ELEMENT LAST PROC WAS IN TNE A1,EISEQ,A0 IS THIS ENTRY IN THE SAME PROC ? J PRFFN1 YES. SKIP THE SEARCH MECHANISM PRFNOP LA A0,R14 LOAD LINK TO FIRST PROC ELEMENT SAVED PRFFPR JZ A0,PRFLUP IF ELEMENT WAS NOT SAVED IN PACK, . DELETE THE PROC ENTRIES FOR THAT ELEMENT TNE A1,EISEQ,A0 IS CURRENT PROC ENTRY IN THIS ELEMENT ? J PRFFND YES. UPDATE SEQUENCE AND ADDRESS LA A0,EIVER,A0 NO. LOAD LINK TO NEXT COPIED PROC ELT J PRFFPR KEEP ON LOOKING . PRFFND SA A0,R7 SAVE ELEMENT LAST PROC FOUND IN PRFFN1 LA A1,EINSEQ,A0 LOAD NEW SEQUENCE NUMBER FOR ELT SA,H1 A1,2,X6 UPDATE ELEMENT LINK IN PROC ENTRY LA A1,EITXTA,A0 LOAD ORIGINAL TEXT ADDRESS FOR ELEMENT ANA A1,EIVER+1,A0 SUBTRACT NEW ADDRESS OF ELEMENT MSI,U A1,28 COMPUTE ADDRESS DIFFERENCE IN WORDS LA A2,3,X6 LOAD ORIGINAL ADDRESS OF PROC ENTRY ANA A2,A1 SUBTRACT DIFFERENCE IN ADDRESS SA A2,3,X6 STORE ENTRY ADDRESS BACK IN ITEM LA,U A1,,X6 GET ADDRESS OF ADD ITEM LA A0,A14 LOAD NEW FTI ADDRESS pircall xPTIA,x7 ADD THE PROC ENTRY TO THE FILE J BSPER BSP ERROR. J PRFLUP CONTINUE WITH NEXT PROC IN TABLE . PRFDONE TE,U A0,014 NORMAL END OF TABLE STATUS ? J bspero NO. REAL BSP ERROR LA A0,A14 LOAD FTI ADDRESS pircall WPFxPT,x7 WRITE TABLE BACK TO FILE J BSPER BSP ERROR. LA A0,R13 LOAD TABLE ADDRESS AND LENGTH SSL A0,18 SHIFT ADDRESS TO H2 BRELR A0 RELEASE PROC TABLE BUFFERS PRFSKP AX,U X9,FTICPT-FTIAPT INCREMENT TO NEXT PROC TYPE AX,U X7,1 INCREMENT PROC TYPE JGD R4,PRFBGN LOOP FOR NEXT PROC TYPE PRFNONE LA A0,A14 LOAD FTI ADDRESS wfti . UPDATE PROC TABLES, NEXT WRITE ADDRESS J BSPER BSP ERROR. . . STEP 4. NOW THAT THE FILE IS SAFELY PACKED, AND ALL PRESERVED . PROC ENTRY POINTS HAVE BEEN CONVERTED TO THE STANDARDS . OF THE PACKED FILE, WE RELEASE ALL SPACE FROM THE NEXT . GRANULE ABOVE THE NEXT WRITE ADDRESS TO THE END OF THE . FILE. . LA A8,CDOPTS,X8 LOAD COMMAND OPTIONS LA A0,IOFDT,X10 GET POINTER TO FDT FOR FILE LA,U A1,077 GET ROUND-UP FACTOR FOR TRACK FILE TZ FDPOSF,A0 POSITION GRANULARITY FILE ? LA,U A1,07777 YES. ROUND TO POSITION BOUNDARY AA A12,A1 ROUND UP TO NEXT GRANULE LNA A1,A1 INVERT MASK TO COMPUT FIRST ADDRESS AND A12,A1 A13 = FIRST ADDRESS TO RELEASE LA A1,FDHITRK,A0 A1 = HIGHEST TRACK REFERENCED AA,U A1,1 ROUND UP TO NEXT TRACK LSSL A1,6 CONVERT TO SECTOR ADDRESS ANA A1,A13 COMPUTE SECTORS TO BE RELEASED JN A1,RLSDONE SKIP IF NEGATIVE RELEASE JZ A1,RLSDONE ...OR NULL RELEASE MSI,U A1,28 CHANGE TO WORDS TO BE RELEASED LA A0,('SECRET') GET DATA TO OBSCURE FILE SA A0,IOBB,X10 PUT IN BOUNDED BUFFER WORD OF FCT LA,U A0,IOBB,X10 GET ADDRESS OF DATA BUFFER SA,H2 A0,IOACW,X10 SET UP ACCESS WORD TO LEGAL ADDRESS RLSBGN LA,U A0,RELLEN LOAD MAXIMUM RELEASE IN 65K WORDS SA A13,IODRAD,X10 SET NEXT RELEASE ADDRESS IN FCT TG A0,A1 MORE THAN RELLEN TO RELEASE ? LA A0,A1 NO. ONLY RELEASE AMOUNT REQUIRED SA,H1 A0,IOACW,X10 SET LENGTH IN ACCESS WORD ANA A1,A0 COMPUTE WORDS LEFT TO GO TOP,U A8,OPTION('W') OVERWRITE TRACKS BEING RELEASED ? J RLSNSC NO. JUST RELEASE SPACE TO SYSTEM LA,H1 A2,IOACW,X10 LOAD LENGTH PORTION OF ACW OR,U A2,BIT(16) ADD IN INHIBIT BIT SA,H1 A3,IOACW,X10 REPLACE COUNT IN ACCESS WORD LA,U A2,W$ LOAD WRITE FUNCTION SA A2,IOFUNC,X10 SET FUNCTION IN PACKET IOW$ IOPKT,X10 OVERWRITE DATA IN AREA TO BE RELEASED TZ IOSTATUS,X10 NORMAL STATUS ? J RLSERR NO. EDIT I/O STATUS FOR ERROR LA,H1 A2,IOACW,X10 LOAD COUNT FROM ACCESS WORD AND,U A2,-BIT(16) REMOVE INHIBIT BIT SA,H1 A3,IOACW,X10 REPLACE COUNT IN ACCESS WORD RLSNSC LA,U A0,REL$ LOAD RELEASE FUNCTION SA A0,IOFUNC,X10 PLACE FUNCTION IN PACKET IOW$ IOPKT,X10 RELEASE SPACE FROM THE FILE TZ IOSTATUS,X10 NORMAL STATUS ON THE RELEASE ? J RLSERR NO. EDIT ERROR MESSAGE AA,U A13,RELLEN/28 INCREMENT FILE ADDRESS FOR NEXT RELEASE JNZ A1,RLSBGN LOOP FOR NEXT BATCH OF GRANULES RLSDONE . . . STEP 5. RELEASE BUFFERS AND TERMINATE. . PCKOUT BRELA . RELEASE ALL BUFFERS ALLOCATED BY COMMAND LA A0,R10 LOAD INPUT FCT ADDRESS TZ A0 WAS INPUT FCT ALLOCATED ? BRELP A0 YES. RELEASE IT LA A0,R11 LOAD OUTPUT FCT ADDRESS TZ A0 WAS OUTPUT FCT ALLOCATED ? BRELP A0 YES. RELEASE IT COMPLETE . TERMINATE . . MOVEIT - ROUTINE TO COPY TEXT AREAS OF ELEMENTS . . . LA A9,(<INPUT ADDRESS>) . LA A11,(<LENGTH IN SECTORS>) . LA A12,(<OUTPUT ADDRESS>) . LMJ X7,MOVEIT . <RETURN> . MOVEIT MSI,U A11,28 COMPUTE LENGTH TO MOVE IN WORDS JZ A11,,X7 PROTECT AGAINST ZERO LENGTH MOVEIT SA A9,IODRAD,X10 SET UP INITIAL READ ADDRESS MOVELOOP LA,U A1,BUFTEXT LOAD MAXIMUM TEXT BUFFER LENGTH TG A1,A11 WILL REST OF ELEMENT FIT IN BUFFER ? LA A1,A11 YES. SET LENGTH TO LENGTH REMAINING ANA A11,A1 UPDATE LENGTH REMAINING SA,H1 A1,IOACW,X10 PUT READ LENGTH IN PACKET LA,U A0,IBDATA,A1 COMPUTE LENGTH OF DATA BUFFER NEEDED BGET . ALLOCATE A DATA BUFFER FOR READING SZ IBSTAT,A0 SET STATUS NORMAL SZ IBLAST,A0 SET NOT LAST BUFFER SA A1,IBLEN,A0 STORE ANTICIPATED LENGTH IN BUFFER LA A1,IODRAD,X10 LOAD CURRENT READ ADDRESS ANA A1,A9 COMPUTE OFFSET INTO ELEMENT AA A1,A12 ADD DESTINATION BASE ADDRESS SA A1,IBMSAD,A0 PUT DESTINATION ADDRESS IN BLOCK SX X10,IBIOP,A0 PUT POINTER BACK TO I/O FCT IN BLOCK LA,U A1,,A0 GET BLOCK ADDRESS IN A1 FOR PUT AA,U A0,IBDATA POINT TO DATA AREA SA,H2 A0,IOACW,X10 PUT DATA AREA ADDRESS IN ACW IOW$ IOPKT,X10 READ NEXT BLOCK OF TEXT FROM FILE TZ IOSTATUS,X10 NORMAL STATUS ? J MOVERR NO. EDIT ERROR MESSAGE PUT IOBB,X10 PASS BLOCK THROUGH BOUNDED BUF TO OUTPUT JZ A11,,X7 QUIT IF WHOLE ELEMENT MOVED LA,H1 A0,IOACW,X10 LOAD LENGTH FROM ACCESS WORD DSL A0,36 MOVE TO A1 DI,U A0,28 COMPUTE LENGTH IN SECTORS AA A0,IODRAD,X10 UPDATE NEXT READ ADDRESS SA A0,IODRAD,X10 STORE BACK IN I/O PACKET J MOVELOOP LOOP FOR NEXT BLOCK . . EDIT ERROR MESSAGE FOR ERROR IN MOVEIT . MOVERR ZAP . MARK COMMAND AS HAVING ERRORED LA,U A0,STERM LOAD SOFTWARE TERMINATION STATUS SA A0,IBSTAT,A1 SET STATUS OF BLOCK TO TERMINATE SNONZ IBLAST,A1 MARK THIS AS THE LAST BUFFER PUT IOBB,X10 TERMINATE OUTPUT PROCESS P IOBB+QL,X9 WAIT FOR OUTPUT TO TERMINATE P PRINTER INVOKE LOCK ON PRINTER LA,U A0,IOPKT,X10 LOAD I/O PACKET ADDRESS BACK LMJ X11,IOSEDT EDIT I/O STATUS RETURNED ON READ SX X1,X9 SAVE ELEMENT ITEM BEING PROCESSED IN X9 R$DIT . ENTER EDIT MODE LA A10,A13 LOAD SEQUENCE NUMBER OF ELEMENT LA,U A8,OPTION('L') ALWAYS USE LONG FORMAT FOR SAD STORY LMJ X5,TOCLE PRINT TOC ENTRY FOR DESTROYED ELEMENT E$MSG ELTDM EDIT MESSAGE ABOUT DESTROYED ELEMENT LA A0,IOFDT,X10 LOAD FDT ADDRESS FOR THE FILE LMJ X11,FIST APPEND FILE AND STATEMENT V PRINTER RELEASE PRINTER LOCK J PCKOUT GET OUT OF PACK COMMAND . . EDIT MESSAGE FOR I/O ERROR DURING RELEASE . RLSERR LA A0,IOPKT,X10 LOAD PACKET ADDRESS LMJ X11,IOSEDT EDIT I/O STATUS ZAP . MARK COMMAND HAS HAVING ERRORED R$DIT . ENTER EDIT MODE E$MSG FIOK COPY REASSURING MESSAGE LA A0,IOFDT,X10 LOAD FDT ADDRESS LMJ X11,FIST APPEND FILE AND STATEMENT J PCKOUT GET OUT . . NO ELEMENTS SELECTED FOR PACK . . THIS CODE IS INVOKED WHENEVER FILESCAN FINDS NO ELEMENTS TO BE . SAVED IN THE FILE TO BE PACKED. IF THE FILE IS EMPTY OR ALL . ELEMENTS IN THE FILE ARE DELETED, THE FILE WILL BE ERASED. IF . THE USER'S ELEMENT CLASS SPECIFIES NO ELEMENTS TO BE SAVED, HOWEVER, . WE DON'T DO THE PACK, AS HE CAN ACHIEVE THE DESIRED EFFECT WITH . ERASE, AND THE ODDS ARE THAT WASN'T WHAT HE HAD IN MIND. . THIS PROTECTS THE USER WHO MISTYPES AN ELEMENT CLASS SPECIFICATION . FROM ZAPPING HIS FILE IN MOST CASES. . PCKEMT JZ A10,ERSSET NO ELEMENTS IN FILE. ERASE IT TNE A9,A10 ARE ALL ELEMENTS DELETED ? J ERSSET YES. ERASE THE FILE R$DIT . ENTER EDITING MODE E$MSG PCKEMM EDIT MESSAGE WARNING ABOUT ZAPPO PACK LA A0,ELFDT,X9 LOAD FDT FOR PARAMETER FILE LMJ X11,FIST APPEND FILE AND STATEMENT. PRINT BRELA . RELEASE BUFFERS COMPLETE . COMPLETE THE COMMAND . . IF THE FILE IS ALL DELETED ELEMENTS, OR THE FILE CONTAINS NO . ELEMENTS, WE ERASE IT RATHER THAN GOING THROUGH THE MOTIONS OF . PACKING. THIS IS NOT ONLY FASTER, BUT GETS RID OF TABLE OF . CONTENTS TRACKS ALSO. . ERSSET BRELA . RELEASE ALL BUFFERS ALLOCATED BY PACK LA A2,PBLINK,X9 LOAD LINK TO SECOND PARAMETER (FILE) BRELP X9 RELEASE THE ELEMENT CLASS PARAMETER SA A2,CDBPC,X8 ATTACH FILE AS FIRST PARAMETER J ERASE BECOME THE ERASE COMMAND FOR THIS FILE . . BSP ERROR. GIVE MESSAGE AND TERMINATE . bspero la a2,r8 load old file FCT address j bsperc enter common BSP error code . bsper la a2,a14 load FCT address for new file toc bsperc LMJ X11,BSPERP EDIT ERROR MESSAGE FOR BAD BSP STATUS ZAP . ERROR THE COMMAND J PCKOUT EXIT THE PACK COMMAND . PURE DATA . ELTDM 'ABOVE ELEMENT DESTROYED BY I/O ERROR DURING PACK OF !' FIOK 'FILE SHOULD NOT HAVE BEEN BY DAMAGED BY ERROR DURING RELEASE OF !' PCKEMM 'PACK IGNORED. NO ELEMENTS SELECTED FROM !' END