<<=========================================================             00010000
=                                                         =             00012000
=                  INCLVMC - A1                           =             00014000
=                                                         =             00016000
=========================================================>>             00018000
                                                                        00020000
                                                                        00022000
$PAGE "VIRTUAL DISC SPACE MANAGEMENT : CHANGE STRING IN MAP"            00024000
PROCEDURE CHANGESTRINGINMAP(BITMAPABSBASE,STARTINGPAGE,LENGTH,          00026000
   OFFONFLAG);                                                          00028000
VALUE BITMAPABSBASE,STARTINGPAGE,LENGTH,OFFONFLAG;                      00030000
LOGICAL BITMAPABSBASE,STARTINGPAGE,LENGTH;                              00032000
LOGICAL OFFONFLAG;                                                      00034000
OPTION PRIVILEGED,UNCALLABLE;                                           00036000
                                                                        00038000
COMMENT                                                                 00040000
                                                                        00042000
TURNS A STRING OF LENGTH BITS ON OR OFF IN THE BIT MAP BEGINNING AT     00044000
ABSOLUTE LOCATION BITMAPABSBASE.  OFFONFLAG TRUE ==> TURN ON BITS.      00046000
                                                                        00048000
IF A BIT TO BE CHANGED IS FOUND ALREADY TO BE IN THE CHANGED STATE      00050000
A CONDITION CODE OF CCL IS RETURNED.  IF ALL OK, CC:=CCE.               00052000
                                                                        00054000
;                                                                       00056000
                                                                        00058000
BEGIN                                                                   00060000
EQUATE TSBCINSTRUCTION=%17400,                                          00062000
       TRBCINSTRUCTION=%17300;                                          00064000
                                                                        00066000
LOGICAL CURRENTWORDABSADDR,                                             00068000
        FIRSTBITINWORD,                                                 00070000
        BITSCHANGED;                                                    00072000
                                                                        00074000
LOGICAL CONDCODE:=CCE;                                                  00076000
                                                                        00078000
                                                                        00080000
CURRENTWORDABSADDR:=STARTINGPAGE&LSR(4)+BITMAPABSBASE;                  00082000
FIRSTBITINWORD:=STARTINGPAGE.(12:4);                                    00084000
BITSCHANGED:=0;                                                         00086000
                                                                        00088000
IF OFFONFLAG THEN TOS:=TSBCINSTRUCTION ELSE TOS:=TRBCINSTRUCTION;       00090000
                                                                        00092000
CHANGETHISWORD :                                                        00094000
                                                                        00096000
TOS:=ABSOLUTE(X:=CURRENTWORDABSADDR);                                   00098000
X:=FIRSTBITINWORD;                                                      00100000
WHILE X <= 15 AND BITSCHANGED < LENGTH DO                               00102000
   BEGIN                                                                00104000
   ASMB(XEQ 1);                                                         00106000
   <<BC>>                                                               00108000
   IF <> AND OFFONFLAG THEN CONDCODE:=CCL;                              00110000
   X:=X+1;                                                              00112000
   BITSCHANGED:=BITSCHANGED+1;                                          00114000
   END;                                                                 00116000
ABSOLUTE(CURRENTWORDABSADDR):=TOS;                                      00118000
IF BITSCHANGED < LENGTH THEN                                            00120000
   BEGIN                                                                00122000
   FIRSTBITINWORD:=0;                                                   00124000
   CURRENTWORDABSADDR:=CURRENTWORDABSADDR+1;                            00126000
   GO TO CHANGETHISWORD;                                                00128000
   END;                                                                 00130000
STATUS.CCFLD:=CONDCODE;                                                 00132000
END <<CHANGESTRINGINMAP>>;                                              00134000
                                                                        00136000
                                                                        00138000
$PAGE "VIRTUAL DISC SPACE MANAGEMENT : RELEASE SWAP REGION"             00140000
PROCEDURE RELEASESWAPREGION(DSTENTRYNUMBER);                            00142000
VALUE DSTENTRYNUMBER;                                                   00144000
LOGICAL DSTENTRYNUMBER;                                                 00146000
OPTION PRIVILEGED,UNCALLABLE;                                           00148000
                                                                        00150000
COMMENT                                                                 00152000
                                                                        00154000
RELEASES THE DISC DOMAIN ASSOCIATED WITH THE SWAPSEGMENT WHOSE          00156000
DST ENTRY NUMBER HAS BEEN PASSED AS CALLING PARAMETER BY SETTING        00158000
THE CORRESPONDING BITS IN THE DEVICE'S VIRTUAL DISC SPACE BITMAP.       00160000
                                                                        00162000
IF THE DISC ADDRESS IS BAD OR ONE OF THE BITS WAS ON, THE               00164000
CONDITION CODE IS SET TO CCL.  IF ALL OK, CC:=CCE.                      00166000
                                                                        00168000
;                                                                       00170000
                                                                        00172000
BEGIN                                                                   00174000
LOGICAL THISENTRYINDEX,                                                 00176000
        NUMBERTRIED,                                                    00178000
        ENTRYCOUNT,                                                     00180000
        NEXTENTRYINDEX,                                                 00182000
        VMPAGESALLOCATED,                                               00184000
        BITMAPABSBASE,                                                  00186000
        STARTINGPAGE;                                                   00188000
                                                                        00190000
DOUBLE SECTADDR;                                                        00192000
LOGICAL LDEV;                                                           00194000
                                                                        00196000
LOGICAL CONDCODE:=CCE;                                                  00198000
LOGICAL NOTTHISENTRY:=TRUE;                                             00200000
                                                                        00202000
PDISABLE;                                                               00204000
TOS:=DST(DSTENTRYNUMBER&LSL(2)+2);                                      00206000
LDEV:=LS0.(0:8);                                                        00208000
TOS:=TOS.(8:8);  <<HODA>>                                               00210000
TOS:=DST(X:=X+1);  <<LODA>>                                             00212000
SECTADDR:=TOS;                                                          00214000
VMPAGESALLOCATED:=DST(DSTENTRYNUMBER&LSL(2)+1).VMALLOC;                 00216000
                                                                        00218000
THISENTRYINDEX:=VDSMTAB(STARTENTRYINXWORD);                             00220000
ENTRYCOUNT:=VDSMTAB(VMSVOLUMECNTWORD);                                  00222000
NUMBERTRIED:=0;                                                         00224000
WHILE NUMBERTRIED <> ENTRYCOUNT AND NOTTHISENTRY DO                     00226000
   BEGIN                                                                00228000
   NUMBERTRIED:=NUMBERTRIED+1;                                          00230000
   IF VDSMTAB(THISENTRYINDEX+LDEVWORD) = LDEV THEN NOTTHISENTRY:=FALSE  00232000
   ELSE THISENTRYINDEX:=VDSMTAB(THISENTRYINDEX+NEXTINLISTWORD);         00234000
   END;                                                                 00236000
                                                                        00238000
IF VDSMTAB(THISENTRYINDEX+LDEVWORD) <> LDEV THEN CONDCODE:=CCL ELSE     00240000
   BEGIN <<FOUND VDSMTAB ENTRY FOR DEVICE>>                             00242000
   TOS:=SECTADDR;                                                       00244000
   TOS:=VDSMTAB(THISENTRYINDEX+HOSTARTSECTORWORD);                      00246000
   TOS:=VDSMTAB(THISENTRYINDEX+LOSTARTSECTORWORD);                      00248000
   ASMB(DSUB);                                                          00250000
   IF < THEN CONDCODE:=CCL ELSE                                         00252000
      BEGIN                                                             00254000
      STARTINGPAGE:=LS0/SECTORSPERVMPAGE;                               00256000
      IF STARTINGPAGE+VMPAGESALLOCATED > VDSMTAB(THISENTRYINDEX+        00258000
         TOTALPAGESWORD) THEN CONDCODE:=CCL ELSE                        00260000
         BEGIN                                                          00262000
         BITMAPABSBASE:=SYSBASE+ABSOLUTE(SYSVDSMTAB)                    00264000
                        +THISENTRYINDEX+OFFSETTOVDSBITMAP;              00266000
         CHANGESTRINGINMAP(BITMAPABSBASE,STARTINGPAGE,VMPAGESALLOCATED, 00268000
            TURNON);                                                    00270000
         IF < THEN CONDCODE:=CCL ELSE                                   00272000
            BEGIN <<PAGES PROPERLY DEALLOCATED>>                        00274000
            X:=TOTALVMPAGESWORD;                                        00276000
            VDSMTAB(X):=VDSMTAB(X)+VMPAGESALLOCATED; <<GLOBAL CNT>>     00278000
            TOS:=VDSMTAB(THISENTRYINDEX+AVAILPAGESWORD);                00280000
            TOS:=TOS+VMPAGESALLOCATED;                                  00282000
            VDSMTAB(X):=LS0;                                            00284000
            VDSMTAB(THISENTRYINDEX+SMALLESTMISSWORD):=TOS;              00286000
            END;                                                        00288000
         END;                                                           00290000
      END;                                                              00292000
   END;                                                                 00294000
STATUS.CCFLD:=CONDCODE;                                                 00296000
PENABLE;                                                                00298000
END  <<RELEASESWAPREGION>>;                                             00300000
                                                                        00302000
                                                                        00304000
                                                                        00306000
                                                                        00308000
$PAGE "VIRTUAL DISC SPACE MANAGEMENT : GET SWAP REGION"                 00310000
DOUBLE PROCEDURE GETSWAPREGION(DSTENTRYNUMBER,NUMBEROFWORDS,LDEV);      00312000
VALUE DSTENTRYNUMBER,NUMBEROFWORDS,LDEV;                                00314000
LOGICAL DSTENTRYNUMBER,NUMBEROFWORDS,LDEV;                              00316000
OPTION PRIVILEGED,UNCALLABLE;                                           00318000
                                                                        00320000
BEGIN                                                                   00322000
                                                                        00324000
COMMENT                                                                 00326000
                                                                        00328000
GETSWAPREGION ALLOCATES A REGION OF VIRTUAL DISC SPACE FROM A           00330000
VIRTUAL MEMORY SUPPORTING (VMS) DEVICE.  THE CALLER HAS ACQUIRED AN     00332000
ENTRY FROM THE DST WHICH IS TO BE ASSOCIATED WITH THE SWAP REGION,      00334000
AND PASSES THIS ENTRY NUMBER, ALONG WITH THE NUMBER OF WORDS OF         00336000
SWAP REGION REQUIRED, AS CALLING PARAMETERS.  THE CALLER MAY ALSO       00338000
SPECIFY THE LDEV # ON WHICH THE DOMAIN IS TO RESIDE.                    00340000
                                                                        00342000
GETSWAPREGION CHECKS THE BITMAP OF THE AVAILABLE VIRTUAL MEMORY         00344000
SPACE ON THE SPECIFIED DEVICE OR ON THE NEXT DEVICE IN THE CIRCULAR     00346000
LIST OF VMS DEVICES FOR A SET OF CONTIGUOUS FREE PAGES WHICH WILL       00348000
SATISFY THE REQUEST.  IF NONE IS AVAILABLE AND NO DEVICE WAS            00350000
SPECIFIED, THE NEXT DEVICE IN THE LIST IS CHECKED.  IF THE REQUEST      00352000
CANNOT BE SATISFIED, 0D IS RETURNED.  OTHERWISE, THE LDEV # AND         00354000
DISC ADDRESS ARE RETURNED, AND THE NUMBER OF PAGES ALLOCATED FOR        00356000
THE DST IS RECORDED IN THE DST ENTRY WORD 1.                            00358000
                                                                        00360000
;                                                                       00362000
                                                                        00364000
LOGICAL GOTIT:=FALSE,                                                   00366000
        GIVEUP:=FALSE;                                                  00368000
                                                                        00370000
LOGICAL BITMAPABSBASE,                                                  00372000
        THISENTRYINX,                                                   00374000
        WORDINMAP,                                                      00376000
        TOTALWORDSINMAP,                                                00378000
        NUMBERTRIED,                                                    00380000
        ENTRYCOUNT,                                                     00382000
        BITINWORD,                                                      00384000
        THISDEVICENUMBER,                                               00386000
        STARTINGPAGE,                                                   00388000
        STRINGLENGTH,                                                   00390000
        SWAPPAGESREQ;                                                   00392000
                                                                        00394000
SUBROUTINE LOCATESTRINGOFONES;                                          00396000
                                                                        00398000
COMMENT                                                                 00400000
                                                                        00402000
SCANS THE BITMAP WHICH BEGINS AT ABSOLUTE CELL = BITMAPABSBASE          00404000
STARTING AT BIT 0 FOR A STRING OF SWAPPAGESREQ CONTIGUOUS BITS          00406000
WHICH ARE ON. IF SUCH A STRING IS FOUND, GOTIT IS SET                   00408000
TO TRUE, THE BITS ARE TURNED OFF, AND THE STARTING BIT NUMBER           00410000
OF THE FIRST ALLOCATED BIT IS RECORDED.                                 00412000
                                                                        00414000
;                                                                       00416000
                                                                        00418000
BEGIN                                                                   00420000
                                                                        00422000
GOTIT:=FALSE;                                                           00424000
WORDINMAP:=0;                                                           00426000
                                                                        00428000
TOS:=ABSOLUTE(BITMAPABSBASE+WORDINMAP);                                 00430000
                                                                        00432000
LOCATENEXTONBIT:                                                        00434000
                                                                        00436000
ASMB(TEST);                                                             00438000
WHILE = AND WORDINMAP < TOTALWORDSINMAP DO                              00440000
   BEGIN                                                                00442000
   WORDINMAP:=WORDINMAP+1;                                              00444000
   ASMB(DEL);                                                           00446000
   TOS:=ABSOLUTE(X:=BITMAPABSBASE+WORDINMAP);                           00448000
   END;                                                                 00450000
                                                                        00452000
IF WORDINMAP >= TOTALWORDSINMAP THEN ASMB(DEL) ELSE                     00454000
   BEGIN <<THIS WORD HAS SOME AVAILABLE PAGES>>                         00456000
   ASMB(SCAN);                                                          00458000
   STARTINGPAGE:=LOGICAL(X)+WORDINMAP&LSL(4);                           00460000
   STRINGLENGTH:=1;                                                     00462000
   BITINWORD:=X:=X+1;                                                   00464000
   TOS:=TOS&LSR(X);                                                     00466000
                                                                        00468000
   SCANONES :                                                           00470000
                                                                        00472000
   X:=BITINWORD;                                                        00474000
   ASMB(TRBC 0,X);                                                      00476000
   WHILE <> AND STRINGLENGTH < SWAPPAGESREQ AND X <= 15                 00478000
   DO                                                                   00480000
      BEGIN                                                             00482000
      STRINGLENGTH:=STRINGLENGTH+1;                                     00484000
      X:=X+1;                                                           00486000
      ASMB(TRBC 0,X);                                                   00488000
      END;                                                              00490000
   IF STRINGLENGTH = SWAPPAGESREQ THEN                                  00492000
      BEGIN                                                             00494000
      ASMB(DEL);                                                        00496000
      CHANGESTRINGINMAP(BITMAPABSBASE,STARTINGPAGE,SWAPPAGESREQ,        00498000
        TURNOFF);                                                       00500000
IF <> THEN SUDDENDEATH(632);                                   <<04293>>00502000
      GOTIT:=TRUE;                                                      00504000
      END                                                               00506000
   ELSE IF X<>16 OR ABSOLUTE(BITMAPABSBASE+WORDINMAP).(15:1)<>1         00508000
   THEN GO LOCATENEXTONBIT <<HIT END OF STRING>> ELSE                   00510000
      BEGIN  <<END OF WORD>>                                            00512000
      ASMB(DEL);                                                        00514000
      WORDINMAP:=WORDINMAP+1;                                           00516000
      IF WORDINMAP < TOTALWORDSINMAP THEN                               00518000
         BEGIN <<CONTINUE SCAN>>                                        00520000
         TOS:=ABSOLUTE(BITMAPABSBASE+WORDINMAP);                        00522000
         BITINWORD:=0;                                                  00524000
         GO TO SCANONES;                                                00526000
         END;                                                           00528000
      END;                                                              00530000
   END;                                                                 00532000
END <<SUBROUTINE LOCATESTRINGOFONES>>;                                  00534000
                                                                        00536000
PDISABLE;                                                               00538000
                                                                        00540000
SWAPPAGESREQ:=(NUMBEROFWORDS-1)/VMPAGESIZE+1;                           00542000
ENTRYCOUNT:=VDSMTAB(VMSVOLUMECNTWORD);                                  00544000
THISENTRYINX:=VDSMTAB(STARTENTRYINXWORD);                               00546000
NUMBERTRIED:=0;                                                         00548000
DO                                                                      00550000
   BEGIN <<TRY TO GET A REGION OF SUFFICIENT SIZE OFF THIS DEVICE>>     00552000
   NUMBERTRIED:=NUMBERTRIED+1;                                          00554000
   THISDEVICENUMBER:=VDSMTAB(THISENTRYINX+LDEVWORD);                    00556000
   IF LDEV <> 0 AND LDEV <> THISDEVICENUMBER THEN                       00558000
      BEGIN <<SKIP THIS ENTRY>>                                         00560000
      IF NUMBERTRIED=ENTRYCOUNT THEN GIVEUP:=TRUE                       00562000
      ELSE THISENTRYINX:=VDSMTAB(THISENTRYINX+NEXTINLISTWORD);          00564000
      END                                                               00566000
   ELSE                                                                 00568000
      BEGIN                                                             00570000
      IF VDSMTAB(THISENTRYINX+AVAILPAGESWORD) < SWAPPAGESREQ            00572000
      OR VDSMTAB(THISENTRYINX+SMALLESTMISSWORD) <= SWAPPAGESREQ THEN    00574000
         BEGIN <<THIS DEVICE IS NO GOOD>>                               00576000
         THISENTRYINX:=VDSMTAB(THISENTRYINX+NEXTINLISTWORD);            00578000
         IF LDEV <> 0 AND LDEV = THISDEVICENUMBER THEN GIVEUP:=TRUE;    00580000
         END                                                            00582000
      ELSE                                                              00584000
         BEGIN <<GOT A CHANCE WITH THIS DEVICE>>                        00586000
         BITMAPABSBASE:=ABSOLUTE(SYSVDSMTAB)+SYSBASE                    00588000
            +THISENTRYINX+OFFSETTOVDSBITMAP;                            00590000
         TOTALWORDSINMAP:=VDSMTAB(THISENTRYINX+WORDSINBITMAPWORD);      00592000
         LOCATESTRINGOFONES;                                            00594000
         IF NOT GOTIT THEN                                              00596000
            BEGIN <<FAILED>>                                            00598000
            VDSMTAB(THISENTRYINX+SMALLESTMISSWORD):=SWAPPAGESREQ;       00600000
            THISENTRYINX:=VDSMTAB(THISENTRYINX+NEXTINLISTWORD); <<NEXT>>00602000
            END;                                                        00604000
         END;                                                           00606000
      END;                                                              00608000
   END                                                                  00610000
UNTIL GIVEUP OR GOTIT OR NUMBERTRIED=ENTRYCOUNT;                        00612000
                                                                        00614000
IF GOTIT THEN                                                           00616000
   BEGIN <<SUCCESSFULLY ALLOCATED A SWAP DOMAIN>>                       00618000
                                                                        00620000
   <<UPDATE NUMBER OF PAGES AVAILABLE GLOBALLY AND ON DEVICE>>          00622000
                                                                        00624000
   VDSMTAB(TOTALVMPAGESWORD):=VDSMTAB(TOTALVMPAGESWORD)-SWAPPAGESREQ;   00626000
   IF VDSMTAB(TOTALVMPAGESWORD) < VDSMTAB(GLOBLEASTAVAILPAGESWORD)      00628000
   THEN VDSMTAB(GLOBLEASTAVAILPAGESWORD):=VDSMTAB(TOTALVMPAGESWORD);    00630000
   X:=THISENTRYINX+AVAILPAGESWORD;                                      00632000
   VDSMTAB(X):=VDSMTAB(X)-SWAPPAGESREQ;                                 00634000
IF < THEN SUDDENDEATH(632);                                    <<04293>>00636000
   IF VDSMTAB(THISENTRYINX+AVAILPAGESWORD) < VDSMTAB(THISENTRYINX+      00638000
   DEVLEASTAVAILPAGESWORD)                                     <<JB.19>>00640000
   THEN VDSMTAB(THISENTRYINX+DEVLEASTAVAILPAGESWORD)           <<JB.19>>00642000
      :=VDSMTAB(THISENTRYINX+AVAILPAGESWORD);                           00644000
                                                                        00646000
   <<ADVANCE THE CYCLIC POINTER FOR VM DEVICE SELECTION>>               00648000
                                                                        00650000
   VDSMTAB(STARTENTRYINXWORD):=VDSMTAB(THISENTRYINX+NEXTINLISTWORD);    00652000
                                                                        00654000
   <<CALCULATE AND RETURN DISC ADDRESS>>                                00656000
                                                                        00658000
   TOS:=VDSMTAB(THISENTRYINX+HOSTARTSECTORWORD);                        00660000
   TOS:=VDSMTAB(THISENTRYINX+LOSTARTSECTORWORD);                        00662000
   TOS:=0;                                                              00664000
   TOS:=STARTINGPAGE;                                                   00666000
   TOS:=0;                                                              00668000
   TOS:=SECTORSPERVMPAGE;                                               00670000
   ASMB(DMUL;DADD); <<STARTING SECTOR>>                                 00672000
   LS1.(0:8):=THISDEVICENUMBER;                                         00674000
   GETSWAPREGION:=TOS;                                                  00676000
   DST(DSTENTRYNUMBER&LSL(2)+1).VMALLOC:=SWAPPAGESREQ;                  00678000
   END                                                                  00680000
ELSE GETSWAPREGION:=0D;                                                 00682000
PENABLE;                                                                00684000
END  <<GETSWAPREGION>>;                                                 00686000
                                                                        00688000
                                                                        00690000
<<=========================================================             00692000
=                                                         =             00694000
=                  END INCLVMC                            =             00696000
=                                                         =             00698000
=========================================================>>             00700000
