/17 SWAPPER TASK FOR RTS8 V3 / / / /EDIT HISTORY: / 2-APR-75 CHANGE: FORCE OFF SWPWT AND FORCE ON NONRWT / 18-JUN-75 FIX GROSS BUG IN NON-CHECKPOINTING VERSION / 19-JUN-75 FIX BUG IN CHECKPOINTING VERSION / 08-OCT-76 MOVED TABLES TO EXEC / #10 V2B CONVERSION TO MACREL / #11-15 REWORK / #16 RTFLD TO RTS8 / #17 OVERLAY MSGTBL ONTO INIT CODE / VERS=17. / / / / / / / / /COPYRIGHT (C) 1974,1975,1976,1977,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. / / / / / / / / / / XLIST 0 /LIST TASK .RSECT SWAPT, LEVEL=0 FIELD RTS8 .TASK SWAP .EXTERNAL TFTABL,RESTBL .GLOBAL TRANVC,PARTAB /FAKE OUT LINKER, KEEP OLD NAME .GLOBAL SWINIT,MSGTBL /INIT CODE, MESSAGE TABLE NRTASK=SWAP+1 LOOPNX, IFZERO HGHFLD ISZ NXTFLG /BUMP TFTABL POINTER ISZ NFLAGS /AND TASK COUNTER JMP LOOPON /CONTINUE IF ANY TASKS LEFT START,SWAPEX, CAL SUSPND SWAPON, TAD (NRTASK+TFTABL DCA NXTFLG /POINTS TO NEXT TFTABL ENTRY TAD (SWAP-NTASKS DCA NFLAGS /TFTABL ENTRY OVERFLOW COUNT LOOPON, TAD I NXTFLG /GET A FLAG WORD AND KSWPWT /KEEP ONLY THE SWPWT BIT SNA /THIS TASK IN SWPWT? JMP LOOPNX /NO: TRY NEXT TASK IFZERO HGHFLD IFNZRO HGHFLD CIA /MAKE LITERAL -400 FOR TEST TAD I NXTFLG /GET THE FLAG WORD SNA /TASK RUNABLE NOW? JMP GOTONE /YES: RESIDENCY CANDIDATE TAD KNRWT /NO: FLAG HIM NONRESIDENT DCA I NXTFLG /AND TRY SOMEONE ELSE JMP LOOPNX GOTONE, IFZERO HGHFLD TAD NFLAGS /CONTROL COUNT, NUMBER LEFT TO DO CLL RAL / TIMES TWO TO SUBTRACT FROM END OF RESTBL TAD (RESTBL+NTASKS+NTASKS-SWAP-SWAP DCA PTR2 /POINTS TO RESTBL WORD 1 UNBUSY, TAD I PTR2 AND (7774 DCA PTR3 /POINTS TO PARTBL WORD 1 TAD I PTR3 RAR /PARTITION BUSY BIT TO LINK SZL /PARTITION BUSY? JMP CHKPT /YES: CHECKPOINT RAL DCA LEVEL /SAVE IO DRIVER ARG2 ISZ PTR2 /POINTS TO RESTBL WORD 2 ISZ I PTR3 /FLAG PARTITION BUSY ISZ PTR3 /POINTS TO PARTBL WORD 2 TAD I PTR3 /GET PARTITION ADDRESS DCA CORADR ISZ PTR3 /POINTS TO PARTBL WORD 3 TAD I PTR3 SNA /ANYONE HOME? JMP NORITE DCA PTR4 /POINTS TO RESTBL WORD 1 TAD PTR4 CMA /COMPARE WITH SAME POINTER TAD PTR2 /FOR NEW RESIDENT SNA CLA /SAME TASK? JMP NOREAD /YES: NO TASK IO TAD I PTR4 RAR /"WRITE ME" BIT TO LINK SNL CLA /NEED TO WRITE CURRENT OCCUPANT? JMP NORITE /NO: READ IN NEW OCCUPANT ISZ PTR4 /POINTS TO RESTBL WORD 2 TAD I PTR4 /AC=DISK ADDRESS FOR WRITE TAD LIMIT /HAS THIS OVERLAY BEEN MOVED? SMA CLA /SKIP IF NOT JMP ALLSET /YES, POINTER THERE TO USED COPY TAD I PTR4 /UPDATE DISK POINTER TO WORKING AREA TAD MOVER /BY SAME OFFSET FOR ALL DCA I PTR4 /THIS IS NEVER AGAIN CHANGED ALLSET, TAD I PTR4 /GET DISK BLOCK DCA DSKADR JMS SENDIT NORITE, CLL CMA RAR /AC3777 AND LEVEL DCA LEVEL /CLEAR THE WRITE BIT TAD I PTR2 DCA DSKADR JMS SENDIT NOREAD, CLA CMA TAD PTR2 DCA I PTR3 TAD I PTR3 TAD LIT2 CLL RAR CAL /CLEAR HIS SWAP WAIT UNBARG KSWPWT, SWPWT JMP SWAPON /RESCAN FROM THE TOP //// IFDEF CHECKPT < CHKPT, STL CLA RTL /AC0002 TAD PTR3 DCA PTR4 TAD I PTR4 DCA PTR1 /POINTS TO OWNER'S RESTBL WORD 1 TAD I PTR1 RTR /"CHECKPOINTABLE" BIT TO LINK SNL CLA /IS HE CHECKPOINTABLE? JMP LOOPNX /NO: NEXT REQUEST TAD PTR1 CLL CMA TAD PTR2 /COMPARE RESTBL POINTERS SZL CLA /NEWCOMER HIGHER PRIORITY? JMP LOOPNX /NO: NEXT REQUEST TAD PTR1 TAD LIT2 CLL RAR CAL BLKARG //// > KNRWT, NONRWT //// IFDEF CHECKPT < STA /FLAG PARTITION "FREE" TAD I PTR3 DCA I PTR3 JMP UNBUSY //// > //// IFNDEF CHECKPT < ////CHKPT, CLA //// JMP LOOPNX //// > NXTFLG, 0 NFLAGS, 0 PTR2, 0 PTR3, 0 PTR4, 0 SYSMSG, ZBLOCK 3 UNIT, SUNIT TRANVC, /DUMMY LABEL TO KEEP LINK HAPPY LEVEL, . CORADR, . DSKADR, . ERRORS, . PTR1, 0 LIT2, NRTASK+NRTASK-RESTBL LIMIT, -1 /SET AT INIT TIME, DISK BLOCK LESS THAN THIS / /HAS NOT BEEN MOVED TO WRLING AREA MOVER, 0 /SET AT INIT TIME, ADD THIS AMOUNT TO DISK BLOCK PAGE .RSECT SWPTAB, LEVEL=0 FIELD RTS8 PARTAB, /OLD LABEL FOR COMPATIBILITY / *40 / /SWPTAB MUST START AT A MULTIPLE OF FOUR!! / / / CODE TO ZERO MSGTBL / ZERO, ISZ ZEROER /MOVE ZERO FILLER ZEROER, DCA SWINIT /START AFTER ENTRY POINT ISZ (-131 /MAKE THIS LAST LITERAL ON PAGE JMP ZERO /MORE TO DO MSGTBL, JMP I SWINIT /RETURN TO CALLER, EXEC / /MSGTBL HAS TWO DUMMY'S FIRST / / ONCE ONLY CODE TO SET UP PARTBL, SWPTAB / / THIS CODE MUST!! NOT!! LOSE CONTROL, NO WAITS ETC. / / / FORMAT OF TABLES COMING IN: / / SWPTAB / / FIELD OF PARTITION (ABCDE FORMAT) / ADDRESS / RELATIVE BLOCK # WITHIN IMAGE / # OF PAGES IN PARTITION / / RESTAB / / POINT TO PARTAB,,CHK,,WRT IN BITS 10,1,1 / -OVRLAY-1 / / FORMAT OF TABLES GOING OUT: / / PARTAB (MOVED TO START AT A MULTIPLE OF FOUR / / RTS8 I/O WORD WRT,,PAGES,,FIELD IN BITS 1,5,5 (LEFT) / ADDRESS / 0 / ?? / / RESTAB / / POINT TO PARTAB,,CHK,,WRT IN BITS 10,1,1 / DISK BLOCK # / / / SOME CODE FOR SWAPPER INIT / / / / / NOTE THAT THIS CODE IS TRULY ONCE-ONLY, SO INITIAL PARTS GET / REUSED AS TEMPORARY LOCATIONS / / / / SWINIT, 0 /CALL FROM EXEC TO INIT IFNZRO RTS8 < CDF 0 > TAD I (7747 IFNZRO RTS8 < CDF RTS8 > DCA SWPTAB /SAFE TEMPORARY TEMP1, TAD SWPTAB+6 /GET LOWEST BLOCK # IN OVERLAY AREA TAD SWPTAB /ADDING IN BASE TEMP2, DCA MOVER /SAVE IT FOR NOW / / LOOP TO REMAKE RESTAB / RESLOO, TAD I FETCH1 / GRAB PARTITION ADDR ISZ FETCH1 /MOVE TO SECOND WORD OF PAIR SNA /SKIP IF REALLY A SWAPPED TASK JMP NOPE /NO, A REGULAR ONE CLL RTR /AND WITH 7774 THEN ADD 2 STL RAL CLL RAL DCA TEMP2 /SAVE POINTER TO THIRD OF GROUP OF FOUR TAD I TEMP2 /FETCH BASE BLOCK # ISZ TEMP2 /MOVE TO # OF PAGES IN PARTITION TAD SWPTAB /SAVED BASE OF SAVE IMAGE DCA TEMP1 /HOLD THIS FOR NOW TAD I TEMP2 /GET # OF PAGES IN PARTITION IAC /CONVERT TO # OF BLOCKS FOR DISK READ CLL RAR DCA TEMP2 /SAVE FOR MULTIPLY LOOP SKP /INITIAL ISZ TO COVER OVERLAY 0 CASE TAD TEMP2 /ADD IT IN ANOTHER TIME ISZ I FETCH1 /RESTAB HAS -OVRLAY-1 IN THIS POSITION!! JMP .-2 TAD TEMP1 /ADD IN THE BASE DCA I FETCH1 /PLACE BLOCK # TO RESTAB TAD I FETCH1 /BRING BACK DISK BLOCK OF BASE OF TASK TAD TEMP2 /FIRST BLOCK BEYOND TASK CLL TAD LIMIT /CHECK IF NEW MAXIMUM BLOCK NUMBER SNL /SKIP IF YES, TO SAVE NEW MAX CLA /NOT NEW MAX, FALL THRU TO REPLICATE OLD MAX CIA TAD LIMIT DCA LIMIT TAD I LTFTBL /GET NEXT FLAGS TABLE ENTRY AND (-NONRWT-SWPWT-1 /REMOVE SWAP, NONRWT BITS TAD (NONRWT /ADD IN NONRWT DCA I LTFTBL /REPLACE NOPE, ISZ LTFTBL /MOVE TO NEXT TABLE ENTRY L100, 100 /COULD CONCIEVABLY SKIP ISZ FETCH1 /MOVE TO NEXT ENTRY L200, 200 /SAFE NO-OP TO COVER POSSIBLE SKP ISZ COUNT1 /DONE WITH RESTAB JMP RESLOO /NO / / LOOP TO DO FINAL CLEANUP ON PARTAB / FINLP, AC0002 /MOVE TO THIRD ENTRY OF FOUR TAD PLACE2 DCA FETCH /SECOND POINTER WITHIN GROUN DCA I FETCH /CLEAR IN USE POINTER ISZ FETCH /MOVE TO # OF BLOCKS IN OVERLAY IFZERO KT8A < TAD I FETCH /NUMBER OF PAGES, RIGHT JUSTIFIED CLL RTL /MOVE UP THREE TO FIT IN FIELD TAD L200 /EVENTUAL 4000 WRITE BIT RAL TAD I PLACE2 /BRING IN RIGHT JUSTIFIED FIELD RAL RTL > IFNZRO KT8A < TAD I PLACE2 /FIELD RIGHT-JUSTIFIED IN NORMAL ORDER ABCDE CMA BSW /MUST BE LEGAL ON KT8A MACHINE TAD (7774 /THESE INSTRUCTIONS DELIVER CLL CMA RTL / BIT A IN LINK, AC = BCDE00010000 SPA /SKIP IF NOT A B BIT TAD L200 /PUT INTO NEW PLACE SZL /SKIP IF NOT AN A BIT TAD L100 /AND PLACE IT ALSO CLL RAL / AC HAS CDEBA0100000 TAD I FETCH /ADDING IN NUMBER OF PAGES BSW /RTS8 I/O CALL FORMAT FOR WRITE; 1PPPPPCDEBA0 > DCA I PLACE2 /PUT BACK TO FIRST OF GROUP OF FOUR TAD FETCH /MAKE PLACE FOR NEXT GROUP OF FOUR IAC DCA PLACE2 ISZ COUNT2 /ANOTHER GROUP JMP FINLP /YUP TAD LIMIT /CONSTRUCT NUMBER OF DISK BLOCKS TO MOVE TAD MOVER /TO REACH SECOND AREA FOR IMAGES CIA /SO ORIGINAL IMIAGES UNCHANGED DCA MOVER JMP ZERO /ZERO MSGTBL AND GO BACK TO EXEC / / ONE-SHOT LITERALS / PLACE2, SWPTAB+4 COUNT2, -7 COUNT1, SWAP-NTASKS FETCH, LTFTBL, TFTABL+SWAP+1 FETCH1, RESTBL / PAGE / IFZERO NTASKS-55&4000 < ZBLOCK NTASKS-54^2 /REST OF MESSAGE TABLE > / .FSECT SFREE, LEVEL=0 FIELD RTS8 / .ZTERNAL TASKX,T .GLOBAL XFREE / /THE FOLLOWING CODE IS ACTUALLY PART OF THE EXECUTIVE /HOWEVER, IT RESIDES HERE FOR COMPATIBILITY WITH VERSION 1. /ENTER WITH ION, AC=0, LINK=DON'T CARE, SAVE STATE ON INTERRUPTS / XFREE, 0 /FREE UP A PARTITION TAD TASKX TAD (-NRTASK SPA /THIS TASK LOWER PRIORITY THAN SWAPPER? JMP I XFREE /NO: BAD FREE COMMAND CLL RAL TAD (RESTBL DCA T /POINTS TO RESTBL WORD 1 TAD I T SNA /IS TASK REALLY NONRES? JMP I XFREE /NO: RETURN AND (7774 /YES: ERASE FLAG BITS DCA T /POINTS TO PARTBL WORD 1 AC7776 AND I T DCA I T /FLAG PARTITION "FREE" TAD TASKX TAD (TFTABL DCA T /POINTS TO TASK'S FLAG WORD IFNZRO HGHFLD IFZERO HGHFLD STL RAR TAD I T DCA I T /FLAG TASK NONRESIDENT TAD (-RUNWT-1 AND I (SWAP+TFTABL DCA I (SWAP+TFTABL /CANCEL SWAPPER RUN WAIT IFZERO HGHFLD /BE NICE SINCE SPACE IS NO PROBLEM JMP I XFREE /FIND NEXT TASK TO RUN / / SUBROUTINE SENDIT TO DO I/O / / REFUGEE FROM OTHER PAGE / SENDIT, 0 RETRY, CAL SENDW SYS SYSMSG TAD ERRORS SNA CLA JMP I SENDIT JMP RETRY