15 22FL #SEG BMINDEX [JUDY BIDGOOD 17 22_= #OPT K0BMINDEX=K0FILESTORE>K0BMAP>K0RESTORE>K0ALLGEO 7 23DW #LIS K0BMINDEX 17 23YG #OPT K6BMINDEX=K6FILESTORE>K6BMAP>K6RESTORE>K6ALLGEO 7 24D6 8HBMINDEX 11 24XQ SEGENTRY K1BMINDEX,TGRINP 11 25CB SEGENTRY K2BMINDEX,TBMIN 11 25X2 SEGENTRY K3BMINDEX,TMAS 11 26BL ... SEGENTRY K4BMINDEX,REINDEX 11 26W= SEGENTRY K11BMINDEX,TGRIN 4 27*W # 20 27TG # THIS SEGMENT IS THE EARLY MORNING START ROUTINE RESPONSIBLE 20 28*6 # FOR CREATING AND/OR CHECKING THE INDICES OF FILES THAT HAVE 12 28SQ # A BUILT-IN OR SYSTEM INDEX. 16 29#B # THE FILE IS OPEN AT THE TOP LEVEL THROUGHOUT. 4 29S2 # 12 2=?L # INDEXED FILES CURRENTLY ARE:- 16 2=R= # 1) DIRECTORIES - INDEX NUMBER 1 16 2?=W # 2) :MASTER.DICTIONARY - INDEX NUMBER 2 16 2?QG # 3) :SYSTEM.SERIAL - INDEX NUMBER 3 19 2#=6 # 4) :SYSTEM.INCINDEX - INDEX NUMBER 4 (PERHAPS). 18 2#PQ # 5) :SYSTEM.OUTPUT - INDEX NUMBER 5 (PERHAPS) 16 2*9B # 6) :SYSTEM.JOBLIST - INDEX NUMBER 6 16 2*P2 # 7) USER JOBLIST - INDEX NUMBER 7 4 2B8L # 12 2BN= # THERE ARE 2 MAIN ROUTINES. 4 2C7W # 15 2CMG # THE FIRST IMPLEMENTS THE GRINDEX MACRO. 19 2D76 # THIS IS USED BY GENERAL RESTORE TO CREATE THE INDEX FOR A 13 2DLQ # DIRECTORY JUST BEFORE CLOSING IT. 20 2DRY ...# THIS ROUTINE HAS BEEN MODIFIED TO AVOID SETTING UP A FI+FSORT 18 2D_6 ...# BLOCK UNLESS THE FILE IS UNORDERED (TO AVOID COREJAMS) 19 2F6B # IT IS ALSO ENTERED BY BACKMAP TO INDEX THE DICTIONARY,ETC. 4 2FL2 # 20 2G5L # THERE IS A SPECIAL ENTRY TO INDEX :MASTER FOR GENERAL RESTORE 4 2GK= # 19 2H4W # THE SECOND ROUTINE STEPS THROUGH THE FILE OPEN AT THE TOP 16 2HJG # LEVEL CHECKING THAT THE INDEXING IS CORRECT. 4 2J46 # 4 2JHQ # 9 2K3B # USE OF REGISTERS 4 2KH2 # 12 2L2L # AWORK1 (A) LATEST SUB-KEY 12 2LG= # (B) CT. OF ENTRIES X5 4 2L_W # 11 2MFG # AWORK2 (A) LATEST KEY 14 2M_6 # (B) (NO.OF ELEMENTS-MESH)X5 4 2NDQ # 13 2NYB # AWORK3 (A) LATEST SUB-SUB-KEY 9 2PD2 # (B) MESH 11 2PXL # (C) OLD FBLMOD 4 2QC= # 14 2QWW # AWORK4 B0 : :MASTER BEING INDEXED 12 2RBG # B1 : BMINDEX ENTRY 19 2RW6 # B2 : FILE NOT (RPT. NOT )TRANSCRIBED TO NEW COPY 14 2S*Q # B3 : CAREFULLY OPENED FILE 12 2STB # B6 : OUT OF ORDER 4 2T*2 # 12 2TSL # B18-23 = INDEX NUMBER 4 2W#= # 4 2WRW # 7 2X?G # PRESETS 4 2XR6 # 5 2Y=Q ZGEOER1 19 2YQB GEOERR 1,WRNGFILE [WRONG FILE OPEN TO BMINDEX 5 2_=2 ZGEOER2 20 2_PL GEOERR 1,SUMS ??? [GRINDEX'S ARITHMETIC GONE WRONG 5 329= ZGEOER3 20 32NW GEOERR 1,INDEX??? [FILE OR INDEX RECORD CORRUPT. 5 3572 ZGEOER6 17 35LL GEOERR 1,NO FILE? [ NEXT FCA NOT THERE 5 35MW ...SFACTOR 20 35P6 ...[ THIS TABLE IS USED TO ESTIMATE THE SIZE OF THE FSORT BLOCK NEEDED. 21 35QB ...[ (EACH ENTRY IN THE FSORT IS 5 WORDS LONG). THESE NUMBERS ARE,RESPECTIV 21 35RL ...[ 5X THE AVERAGE NUMBER OF ENTRIES IN A) DIRECTORIES B)DICTIONARY C)SERI 21 35SW ...[ D)INCINDEX E) OUTPUT F)SYSTEM.JOBLIST G6USER.JOBLIST. THE FILES INDEX 21 35W6 ...[ NUMBER IS USED AS A MODIFIER TO PICK UP THE APPROPRIATE FACTOR. WE THE 19 35XB ...[ MULTIPLY BY THE FILE'S SIZE IN 1/2K WORDS TO GET THE INITIAL 10 35YL ...[ SIZE OF THE FSORT BLOCK. 4 35_W ...[ 12 3636 ...[ FORMAT OF ENTRY IN FSORT BLOCK. 4 364B ...[ 8 365L ...[ WORD 0 KEY 10 366W ...[ WORD 1 BLOCK POINTER 11 3686 ...[ WORD 2 RECORD POINTER 15 369B ...[ WORD 3 DESCENDING SUB-KEY.(ZERO IF NONE) 15 36=L ...[ WORD 4 ASCENDING SUB-KEY.(ZERO IF NONE) 6 36?W ... +40 6 36*6 ... +80 6 36BB ... +425 6 36CL ... +110 6 36DW ... +125 6 36G6 ... +50 6 36L_ ... +35 5 36RS ...MASKCOMM 10 36YM ... #70201041 5 375G MASKFCOM 19 37K6 #02042353 [BITS FOR FCOMM IN NEW FCB. 5 384Q MASKFG1 20 38JB #77452000 [ BITS FOR FGENERAL1 IN NEW FCA 20 3942 MASKFG2 [ BITS FOR FGENERAL2 IN NEW FCA. 7 39HL #00000014 4 3=3= XIX 7 3=GW +IDENTITEX 20 3?_Q XENTABLE [TABLE OF WORDS,ONE FOR EACH TYPE OF INDEXED FILE,IN 20 3#FB [INDEX NUMBER ORDER.SET =1 IF THAT TYPE OF FILE HAS 12 3#_2 [MULTI-RECORD ENTRIES 8 3*DL +1 [DIR. 9 3*Y= +0 [DICT. 9 3BCW +0 [SERIAL. 10 3BXG +0 [INCINDEX. 9 3CC6 +1 [SYSOUT. 11 3CWQ +1 [SYSTEM JOBLIST 10 3DBB +1 [USER JOBLIST 4 3DW2 # 8 3F*L # SUBROUTINES 4 3FT= # 5 3G#W SKEYREC 20 3GSG [ THIS SUBROUTINE CALCULATES THE KEY OF THE RECORD POINTED TO 20 3H#6 [ BY [X3],AND LEAVES THE KEY IN X5. [X2] -> FCB. EXITS+1 IF OK, 18 3HRQ [ OTHERWISE EXITS. CALLED BY X1,OVERWRITES GEN0,GEN1. 9 3J?B [ X0,X1,CORRUPTED 16 3JR2 STO 1 GEN1 [PRESERVE LINK 20 3K=L KEYREC 2,,3,(GEN1),5 [CALCULATE KEY,EXIT IF NOT KEYED 9 3KQ= #SKI K6BMINDEX>699$699 9 3L9W TRACE 5,BM KEY 8 3LPG LDX 1 GEN1 7 3M96 EXIT 1 1 4 3MNQ # 6 3N8B SETUPFINDEX 4 3NN2 [ 18 3P7L [ THIS S/R SETS UP AND INITIALISES THE FINDEXF BLOCK. 18 3PM= [ IT EXPECTS [X3] = THE NUMBER OF BLOCKS IN THE FILE. 8 3Q6W [ X6=INDEXNO. 4 3QLG [ 8 3R66 SBX 7 FX1 14 3RKQ SETNCORE INDEXREC-A1(3),1,FI,FINDEXF 9 3S5B #SKI K6BMINDEX>299$299 10 3SK2 TRACE 3,NO.ENTRS 13 3T4L LDN 0 INDEXREC-A1(3) [R.H. 8 3TJ= STO 0 A1(1) 7 3TWM ... LDEX 0 6 18 3W94 ... STO 0 INDEXNO(1) [ INDEX NUMBER OF FILE 8 3WHG LDCT 0 #200 17 3X36 STO 0 INDEXID(1) [ IDENTITY OF RECORD 8 3XGQ ADX 7 FX1 7 3Y2B EXIT 7 0 4 3YG2 [ 13 3Y_L [ QUICK REWIND NOT DISCARDING BLOCKS 4 3_F= [ 6 3_YW SFASTREWIND 8 42DG FASTREWIND 2 7 42Y6 EXIT 7 0 4 43CQ # 4 43XB # 5 44C2 SFBLOCK 4 44WL [ 21 45B= [ CALLED BY X0,X2-> AN FCB, ON EXIT X2-> BLOCK OF TYPE JUST AFTER 19 45TW [ LINK,IF EXIT +2;IF EXIT +1,NO SUCH BLOCK;GEN0 CORRUPTED 4 46*G [ 14 46T6 STO 0 GEN0 [ LINK 6 46Y=P...#SKI IFS 11 473BP... SFIBLK 2,2,XPLEJ,GEN0 7 476GP...#SKI IFS<1$1 4 479LP...( 5 47#Q XFLPJ 9 47SB LDX 2 FPTR(2) 10 48#2 BXE 2 CXFI,XFPLEJ 9 48RL LDX 0 ATYPE(2) 12 49?= BXE 0 FILEPLUSFCB,XFPLEJ 8 49QW SMO GEN0 19 4==G BXU 0 0,XFLPJ [ J.BACK IF NOT RIGHT BLOCK. 8 4=Q6 LDX 0 GEN0 7 4?9Q EXIT 0 2 5 4?PB XFPLEJ 4 4?_8P...) 8 4#92 LDX 0 GEN0 7 4#NL EXIT 0 1 4 4*8= # 5 4*MW NXFCB 4 4B7G [ 9 4BM6 [ SET X2 -> 2ND FCB 4 4C6Q [ 8 4CLB STO 0 GEN6 17 4D62 FCBNO2 2,2,ZGEOER6 [ ERROI IF NO 2ND FC 9 4DKL BRN (GEN6) 4 4F5= # 21 4FJW # THIS ENTRY POINT IS FOR BACKMAP TO CHECK THE INDEXING OF A FILE 9 4G4G # OPEN @ TOP LEVEL. 17 4GJ6 # IF THE FILE IS UNINDEXED,ENTRY IS MADE TO GRINDEX. 20 4H3Q # IF THE WRONG FILE IS OPEN,OR THE INDEX,OR FILE,IS CORRUPT, A 10 4HHB # NON-OK REPLY IS GEVEN 4 4J32 # 4 4JGL [ 5 4K2= TBMIN 4 4KFW [ 9 4K_G #SKI K6BMINDEX>99$99 12 4LF6 TRACE ACOMMUNE9(2),BMINDEXE 15 4LYQ LDX 6 ACOMMUNE9(2) [PARAMETER 7 4MDB ... TOPFCB2 1 16 4MY2 ... BXU 1 BFILE,NOTMA [J IF NOT MASTER 15 4NCL ... ORX 6 GSIGN [SET SWITCH 5 4QB6 NOTMA 8 4RT2 LDN 0 #77 16 4S#L ANDX 0 FINFC(1) [ INDEX NUMBER 18 4SS= BZE 0 MERGEA [ IF NONE ENTER GRINDEX 12 4T?W ... BXU 0 ACOMMUNE9(2),ZGEOER1 17 4TRG ... LDCT 0 #200 [SET BMINDEX MARKER 7 4W?6 ... ORX 6 0 9 4WQQ ... BRN MERGEA 4 4X=B ...[ 5 5GRB XERUP 10 5GWG ... SEGENTRY K60BMINDEX 20 5G_L ... BRN NOQUERY [NULLED BY RTM PRQUERY SO THAT 19 5H4Q ... DOWN BMQUESTB,5 [WE ASK ^DO YOU WANT A PM^ 5 5H7W ...NOQUERY 9 5H?2 SETREP UNORDERD 5 5HQL ... UP 4 5H_# ...[ 21 5J82 ...[ THIS ENTRY POINT IS FOR THE REINDEX MACRO WHICH PRODUCES A CORRECT 21 5JBN ...[ INDEX RECORD IN THE ACTIVITY CHAIN IN A FI/FINDEXF BLOCK. IF THE 21 5JKB ...[ FILE NEEDS SORTED,THE REPLY 'UNORDERED IS GIVEN & NO BLOCK IS LEFT 4 5JS4 ...[ 5 5K2Q ...REINDEX 4 5K9D ...[ 8 5KD6 ... LDCT 6 #20 18 5KLS ... ORX 6 ACOMMUNE9(2) [B4=>REINDEX/INDEX NO. 7 5KTG ... TOPFCB2 1 9 5L48 ... BRN MERGEA 4 5L=W ...[ 16 5LFJ ...# THESE ENTRY POINTS ARE FOR THE GRINDEX MACRO. 20 5LNB # THIS SORTS THE TOP FILE OPEN,REWRITES THE DIRECTORY ENTRY NAME 14 5M82 # RECORD AND INSERTS THE INDEX RECORD. 4 5MML # 17 5N7= # THE ROUTINE BREAKS DOWN NATURALLY INTO 5 STAGES. 4 5N9F ...[ 19 5N?N ...[ 0) TO AVOID SETTING UP A FSORT BLOCK WE ASSUME THE FILE TO 19 5N*X ...[ BE CORRECTLY ORDERED UNTIL PROVED OTHERWISE & SET UP 20 5ND6 ...[ THE FINDEXF DIRECTLY. IF THIS FAILS WE PROCEED AS DESCRIBED 7 5NG* ...[ BELOW 4 5NJJ ...[ 4 5NLW # 20 5P6G # 1) FIRSTLY WE MAKE A PASS THROUGH THE FILE REMEMBERING THE KEY 21 5PL6 # AND POSITION OF EVERY ENTRY IN A THREE WORD ENTRY IN A FI/FSORT 7 5Q5Q # BLOCK 4 5QKB # 19 5R52 # 2) THE NEXT STAGE IS TO SORT THESE THREE WORD ENTRIES INTO 21 5RJL # ASCENDING KEY ORDER.THIS IS DONE USING THE SO-CALLED ^SHELLSORT 21 5S4= # ALGORITHM DESCRIBED BY D.L.SHELL,IN THE A.C.M. COMMUNICATIONS 21 5SHW # VOL.2 NO.7 (1959). THIS ISSUE IS AVAILABLE FROM H.O.L.I.S. THE 21 5T3G # NOTATION USED IN THE COMMENTS WILL FOLLOW THAT USED IN THE 8 5TH6 # ARTICLE. 4 5W2Q # 21 5WGB # 3) THE NEXT STAGE IS TO SET UP A NEW FCB AND FSTACK FOR THE FILE 21 5X22 # AT THE TOP LEVEL.WE HAVE TO BE CAREFUL ABOUT B.S. ALLOCATION 21 5XFL # FOR THESE FILES.THE B.S.ALLOCATION ALGORITHM CURRENTLY ALLOWS 20 5X_= # US TO USE THE UNJAMMER'S ^WELL^ IF THE TOP FILE IS OPEN IN 20 5YDW # GENERAL+CAREFUL MODES. WE DO AN OPTIONAL GETBAX,AND HOPE WE 21 5YYG # CAN GET ENOUGH B.S. IF WE CAN'T WE GET LESS AND GIVE UP WHEN 20 5_D6 # THE FILE IS FULL. IN PRACTICE,WE CAN PROBABLY GET BY,BUT WE 18 5_XQ # WILL EVENTUALLY HAVE TO COPE WITH THIS PROPERLY. 4 62CB # 21 62X2 # 4) WE NOW MOVE ALL THE ENTRIES IN THE OLD FILE INTO THE NEW FILE 20 63BL # IN THE ORDER IN WHICH THEY OCCUR IN THE FSORT BLOCK, AT THE 20 63W= # SAME TIME SETTING UP THE INDEX RECORD IN A FINDEXB BLOCK. 4 64*W # 21 64TG # 5) THIS HAVING BEEN DONE THE OLD FCB,FSTACK,FMAPP ETC ARE FREED 20 65*6 # AND ITS B.S. FREEBAXED.THE DIR.ENT.IS REWRITTEN,THE FINDEXB 20 65SQ # INSERTED INTO THE ENTRY AND CHAINED AFTER THE NEW FSTACK. 10 66#B # THE ROUTINE EXITS. 4 66S2 # 4 67?L [ 18 67R= TMAS [ENTRY TO CHECK :MASTER. 4 68=W [ 9 68QG LDN 6 INDEXDIR 18 69=6 ORX 6 GSIGN [ SET B0 OF AWK4 & X6. 8 69PQ BRN MERGE 4 6=9B [ 18 6=P2 TGRIN [ENTRY WITH NO PARAMETER. 4 6?8L [ 9 6?N= LDN 6 INDEXDIR 8 6#7W BRN MERGE 4 6#MG [ 18 6*76 TGRINP [ENTRY WITH A PARAMETER. 4 6*LQ [ 10 6B6B LDX 6 ACOMMUNE9(2) 5 6BL2 MERGE 15 6C5L TOPFCB2 1 [ X1 -> FCB 7 6CK= #SKI K6BMINDEX 4 6D4W ( 8 6DJG LDN 0 #77 9 6F46 ANDX 0 FINFC(1) 19 6FHQ BNZ 0 ZGEOER1 [ERROR IF ALREADY INDEXED. 4 6G3B ) 5 6GH2 MERGEA 9 6H2L #SKI K6BMINDEX>199$199 9 6HG= TRACE 6,GRINDEX 18 6JFG STO 6 AWORK4(2) [ PRESERVE INDEX NUMBER 6 6JP# ...STARTAGAIN 19 6KDQ STOZ AWORK2(2) [ LATEST KEY FOUND REGISTER. 7 6KKY ... NGN 0 1 16 6KR6 ... STO 0 AWORK1(2) [LATEST SUB-KEY 17 6KY# ... STO 0 AWORK3(2) [LATEST SUB-SUB-KEY 9 6L5G ... LDX 0 FINFC(1) 9 6L=N ... LDX 6 AWORK4(2) 8 6LCW ... ANDN 6 #77 7 6LK4 ... DCH 6 0 17 6LQ= ... STO 0 FINFC(1) [PUT INDEX NO. IN. 7 6LXL LDN 0 4 21 6MC= ... ANDX 0 FCOMM(1) [ B3 OF AWK4 SET IF FILE ORIGINALLY 17 6MWW SRC 0 6 [OPENED CAREFULLY. 9 6NBG ORS 0 AWORK4(2) 9 6NW6 LDX 3 FBLMOD(1) 17 6P*Q SBN 3 FBLKS-A1 [ X3=NO. KLOX IN FILE 19 6PF2 ... BBS 6,AWORK4(2),NEEDFSORT[J IF GRINDEX & UNORDERED 20 6PJ= ... LDN 4 FBLKS [INITIALIZE FREADBLOCK POINTER 19 6PMG ... BBS 1,AWORK4(2),MPTYBMCH [J IF BMINDEX CHECK ONLY 10 6PQQ ... CALL 7 SETUPFINDEX 15 6PW2 ... BZE 3 ZENDX [J IF EMPTY 9 6P_= ... BRN MERGEB 5 6P_W ...MPTYBMCH 9 6Q2G ... BNZ 3 MERGEB 8 6Q36 ... SETREP2 OK 5 6Q3Q ... UP 6 6Q4G ...NEEDFSORT 8 6Q7R ... LDX 1 FX1 21 6QG8 ... SMO 6 [INDEX NUMBER OF FILE. MULTIPLY THE 21 6QSK ... MPY 3 SFACTOR-1(1) [SIZE OF FILE BY APPROPRIATE FACTOR 21 6R72 ... ADN 4 1 [TO GET APPROX. SIZE OF FSORT BLOCK. 18 6RFC ... SETUPCOR 4,1,FI,FSORT [THIS CAN BE ALTLEN'ED IF 9 6RRW #SKI K6BMINDEX>99-99 10 6S?G TRACE 4,FSORTSZE 15 6SR6 LDN 0 1 [ NECESSARY 16 6T=Q STO 0 A1(1) [ RECORD HEADER 5 6TGJ ...MERGEB 14 6TQB CALL 7 SFASTREWIND [ REWIND FILE 5 6W=2 NEXREC 19 6W?7 ...[ GET PTR TO NEXT RECORD - USE QSTEPC RATHER THAN STEP SO THAT 18 6W## ...[ BACKMAP CAN INITIATE ITS OWN BACKING STORE TRANSFERS, AND 16 6W*F ...[ TAKE ITS OWN ACTION ON READ FAILS AND CORRUPTION. 4 6WBL ...[ 19 6WCR ... QSTEPC ,XBACKREAD [_ IF B.S. TRANSFER REQUIRED 9 6WDY ... BRN NEXRECGOT 6 6WG5 ...XBACKREAD 17 6WH= ... DOWN BMCNTRL,5 [INITIATE TRANSFER 18 6WJC ... BRN NEXREC [OKAY - GET RECORD PTR 17 6WKJ ... BRN XERUP [CORRUPTION DETECTED 15 6WLP ... BRN XEOF [END OF FILE 15 6WMW ... BRN XERUP [READ FAIL 8 6WP3 ...XEOF STOZ 3 6 6WQ8 ...NEXRECGOT 21 6WRQ ... BBS 6,AWORK4(2),NOFINDEXUPD [J IF GRINDEX & UNORDERED 7 6WTW ... TOPFCA2 1 12 6WY2 ... BZE 3 NDFILE [ 21 6X26 ... BXE 4 FREADBLOCK(1),MERGEC[J IF NOT END OF FILE OR NEW BLOCK 5 6X4= ...NDFILE 18 6X6B ... ADN 4 1 [INCREMENT BLOCK POINTER 16 6X8G ... TRACEIF K6BMINDEX,99,299,AWORK2(2),BLOCKKEY 18 6X=L ... BBS 1,AWORK4(2),SFINDEXB [J IF BMINDEX CHECK ONLY 10 6X#Q ... MHUNTW 1,FI,FINDEXF 19 6XBW ... SBN 1 FBLKS [COS X4 IS RELATIVE TO FBLKS 9 6XF2 ... LDX 0 AWORK2(2) 7 6XH6 ... SMO 4 21 6XK= ... STO 0 INDEXREC-1(1) [STORE PREVIOUS KEY IN PREVIOUS INDEX 9 6XMB ... BNZ 3 MERGEC 17 6XPG ... SETBIT 2,AWORK4(2) [FILE NOT TRANSCRIBED 8 6XRL ... BRN ZENDX 5 6XTQ ...SFINDEXB 8 6XXW ... FFINDEXB 1,1 8 6Y22 ... SBN 1 FBLKS 7 6Y46 ... SMO 4 10 6Y6= ... LDX 0 INDEXREC-1(1) 17 6Y8B ... BXU 0 AWORK2(2),XERUP [KEY WRONG ERROR EXIT 9 6Y=G ... BNZ 3 MERGEC 8 6Y#L ...OKUP SETREP2 OK 8 6YBQ ... BRN UP 6 6YDW ...NOFINDEXUPD 17 6YH2 ... BZE 3 SORT [SORT UNORDERED FILE 5 6YK6 ...MERGEC 19 6YN6 BRINDEX AWORK4(2),ZGEOER3,XIDIR,XNO,XNO,XNO,XIOUT,XNO,XNO 5 6_7Q XIDIR 19 6_MB LDX 6 EGENN(3) [CALCULATE SUBKEYS,IF ANY. 9 7272 LDX 7 EREELN(3) 9 72LL BRN XIMERGE 5 736= XIOUT 11 73KW LDX 7 GOUTKEY2-A1(3) 9 745G BRN XJMERGE 4 74K6 XNO 7 754Q LDN 7 0 5 75JB XJMERGE 7 7642 LDN 6 0 5 76HL XIMERGE 15 773= TOPFCB2 2 [ X2 -> FCB 18 77GW CALL 1 SKEYREC [ X5 =KEY, X0,1 CORRUPT. 14 782G BRN NEXREC [ GO FOR 8 787N ... LDX 2 FX2 21 78#W ... BBUS 6,AWORK4(2),NOFSORTUPD [J UNLESS GRINDEX & OOO 10 78G6 MHUNTW 1,FI,FSORT 15 78_Q LDN 0 5 [ UPDATE R.H. 8 79FB ADS 0 A1(1) 21 79_2 BXGE 4 A1(1),NOALTFSORT [ J IF ROOM IN FSORT FOR NEXT ENTRY 9 7=DL #SKI K6BMINDEX>99-99 10 7=Y= TRACE 4,TOOSMALL 20 7?CW ... ADN 4 400 [ ALTLEN BY 400 EACH TIME -IT'S 16 7?XG LDX 3 1 [ MORE EFFICIENT. 16 7#C6 ALTLEN 3,4,FI,FSORT [ LENGTHEN BLOCK. 10 7#WQ MHUNTW 1,FI,FSORT 6 7*BB NOALTFSORT 15 7*W2 TOPFCA 2 [X2 -> FCA 15 7B*L ADN 2 FREADBLOCK [-> READ PTRS 12 7BT= SMO A1(1) [ 21 7C#W LDN 3 A1-5(1) [ -> START OF 3WD ELEMENT IN FSORT 16 7CSG STO 5 0(3) [ STORE KEY IN 18 7D#6 ADN 3 1 [ -> AREA FOR READ PTRS 15 7DRQ MOVE 2 2 [ MOVE IT IN. 7 7F?B LDN 0 5 8 7FR2 LDX 2 FX2 16 7G=L STO 6 2(3) [ STORE SUB-KEYS 8 7GQ= STO 7 3(3) 9 7GXD ... BRN NEXREC 6 7H4L ...NOFSORTUPD 18 7H9W BXGE 5 AWORK2(2),UPDATLAT [ J IF KEYS ASCENDING. 5 7HPG NOTORDX 20 7J96 ... BBS 1,AWORK4(2),XERUP [ERROR EXIT IF BMINDEX CHECK ONLY 20 7JNQ ... MFREEW FI,FINDEXF [FILE UNORDERED - SCRAP FINDEXF & 20 7JYJ ... BBS 4,AWORK4(2),XERUP [ERROR EXIT IF REINDEX & UNSORTED 15 7K8B ... SETBIT 6,AWORK4(2) [UNORDERED 7 7KN2 ... TOPFCB2 1 18 7L7L ... BRN STARTAGAIN [ START AGAIN TO DO SORT 5 7MLG UPDATLAT 17 7N66 BXU 5 AWORK2(2),STOAW31 [J IF KEYS UNEQUAL 14 7NKQ LDX 1 AWORK1(2) [LAST S/K 17 7P5B BXL 1 6,NOTORDX [J IF LESS THAN NEXT 15 7PK2 BXU 6 1,STOAW31 [J IF UNEQUAL 19 7Q4L BXL 7 AWORK3(2),NOTORDX [J IF NEW SS/K LESS THAN OLD 5 7QJ= STOAW31 19 7R3W STO 6 AWORK1(2) [UPDATE S/K & SS/K REGISTERS 9 7RHG STO 7 AWORK3(2) 9 7S36 #SKI K6BMINDEX>699-699 10 7SGQ TRACE 5,UPDATLAT 21 7T2B STO 5 AWORK2(2) [ AWK2 CONTAINS HIGHEST KEY TO DATE 9 7TG2 BRN NEXREC 4 7T_L # 19 8SQ2 # LAST STAGE : UPDATE DIR.ENT WITH ALL THE NEW INFORMATION 4 8T9L # 4 8TP= # 4 8W8W # 4 8WNG ZEND 9 8X86 MFREEW FI,FSORT 5 8XMQ ZENDX 16 8XXJ ... BBS 4,AWORK4(2),OKUP [EXIT IF REINDEX 9 8Y7B ACROSS BMXEND,1 4 8YM2 UP 10 8_6L CALL 7 SFASTREWIND 4 8_L= UP1 5 925W UP 4 92KG # 4 9D?2 SORT 4 9DQL # 21 9F== # THIS SECTION OF CODE SORTS THE FSORT BLOCK INTO ORDER BY ASCENDING 8 9FPW # KEY NUMBER. 4 9G9G # 20 9GP6 # THE METHOD USED IS A ^SHELL-SORT^ (SEE THE REFERENCE QUOTED AT 11 9H8Q # THE HEAD OF THE CHAPTER). 4 9HNB # 21 9J82 # IT IS A CROSS BETWEEN SIFTING AND MERGING BY PAIRS. IT USES LITTLE 21 9JML # CORE(JUST THE FSORT BLOCK),WHICH IS A CHARACTERISTIC OF SIFTING, 21 9K7= # AND THE TIME TAKEN TO DO THE SORTING IS PROPORTIONAL(BY EXPERIM- 20 9KLW # ENTAL RESULTS) TO N**1.226(I.E.N RAISED TO THE POWER OF 1.226) 20 9L6G # WHERE N IS THE NUMBER OF ELEMENTS TO BE SORTED.THIS SPEED IS 21 9LL6 # CHARACTERISTIC OF MERGING BY PAIRS.WHERE THE TIME TAKEN IS PRO- 20 9M5Q # PORTIONAL TO N.LOG(N).ALL OTHER SORTING METHODS TAKE A TIME 21 9MKB # PROPORTIONAL TO N SQUARED OR N.LOG(R) WHERE R IS THE HIGHEST KEY 14 9N52 # USED.THESE ARE TOO INEFFICIENT FOR US 4 9NJL # 21 9P4= # WE SORT THE LIST OF ELEMENTS IN THE FSORT BLOCK IN P PASSES,WHERE 17 9PHW # P IS THE SMALLEST NUMBER SUCH THAT 2**P > OR = N 4 9Q3G # 21 9QH6 # IN THE QTH PASS,WE DIVIDE THE SET OF ELEMENTS INTO Q SUBSETS EACH 20 9R2Q # WITH [N/2**Q] ELEMENTS,EXCEPT FOR UP-TO-Q-1 MORE,WHICH HAVE 7 9RGB # ANOTHER 1. 20 9S22 # THE U'TH SUBSET CONSISTS OF THE U'TH,U+Q'TH,U+2Q'TH,... ETC 19 9SFL # ELEMENTS. WE SORT THESE INTO KEY ORDER WITHIN THE SUBSET. 21 9S_= # HAVING SORTED EACH SUBSET,WE GO TO THE NEXT STEP-SETTING Q TO Q/2 14 9TDW # AND REPEATING THE PROCESS UNTIL Q=1. 4 9TYG # 4 9WD6 # 9 9WXQ #SKI K6BMINDEX>99$99 11 9XCB TRACE JTIME,START IX 9 9XX2 #SKI K6BMINDEX<100$100 11 9YBL TRACEVER JTIME,START IX 10 9YW= MHUNTW 3,FI,FSORT 8 9_*W STO 3 GEN6 8 9_TG LDX 2 FX2 8 =2*6 LDX 5 A1(3) 7 =2SQ SBN 5 1 9 =3#B STO 5 AWORK1(2) 7 =3S2 LDN 4 5 7 =4?L DVS 4 4 19 =4R= LDX 4 5 [ IN X4 (& ALSO IN AWORK3) 6 =5=W XFINERMESH 16 =5QG SRL 4 1 [ FINER MESH = M 9 =6=6 #SKI K6BMINDEX>299$299 9 =6PQ TRACE 4,MESH = 19 =79B BZE 4 SORTED [ EXIT WHEN PASS COMPLETED. 16 =7P2 STO 4 AWORK3(2) [ PRESERVE MESH 7 =88L SLL 4 2 16 =8N= ADX 4 AWORK3(2) [MULTIPLY BY 5 17 =97W LDX 0 AWORK1(2) [ NO. OF ENTRIES =N 7 =9MG SBX 0 4 13 ==76 STO 0 AWORK2(2) [ =K 17 ==LQ LDN 6 0 [ INITIAL VALUE OF J 5 =?6B SETITOJ 9 =?L2 #SKI K6BMINDEX>299$299 9 =#5L TRACE 6,J IS 15 =#K= LDX 5 6 [ SET I = J 6 =*4W PICKITHENT 9 =*JG #SKI K6BMINDEX>299$299 9 =B46 TRACE 5,I IS 8 =BHQ LDX 3 GEN6 20 =C3B ADX 3 5 [ (NEARLY) POINTS TO I'TH ENTRY 7 =CH2 SMO 4 17 =D2L LDX 0 A1+1(3) [ KEY OF I+M'TH ENTRY 9 =DG= #SKI K6BMINDEX>699$699 4 =D_W ( 11 =FFG TRACE A1+1(3),I'TH KEY 9 =F_6 TRACE 0,I+M'TH 4 =GDQ ) 18 =GYB BXL 0 A1+1(3),XCIANGE [ JIF NEYS OUT OF ORDER 17 =HD2 BXU 0 A1+1(3),STEPJ [ J IF KEYS NOT EQUAL 21 =HXL SMO 4 [ IF THEX ARE , CF DESCENDING SUB-KEY 9 =JC= LDX 0 A1+1+3(3) 18 =JWW BXL 0 A1+1+3(3),STEPJ [ JIF LESS IE ORDERED 21 =KBG BXU 0 A1+1+3(3),XCIANGE [ IF EQUAL,CF ASCENDING SUB-SUB-KEYS. 7 =KW6 SMO 4 9 =L*Q LDX 0 A1+1+4(3) 11 =LTB BXGE 0 A1+1+4(3),STEPJ 5 =M*2 XCIANGE 12 =MSL # NOW INTERCHANGE THE TWO ENTRIES. 16 =N#= LDN 7 A1+1(3) [ -> I'TH ENTRY 9 =NRW LDN 0 A1+1(3) 16 =P?G ADX 0 4 [ -> I+M'TH ENTRY 15 =PR6 LDN 1 GEN0 [ DUMP AREA 16 =Q=Q LDN 2 A1+1(3) [ -> I'TH ENTRY. 16 =QQB MOVE 0 5 [ PRESERVE I+M'TH 18 =R=2 MOVE 7 5 [ CHANGE I'TH TO I+M'TH 21 =RPL MOVE 1 5 [ MOVE OLD I+M'TH TO I'TH POSITION. 9 =S9= #SKI K6BMINDEX>699$699 4 =SNW ( 10 =T8G TRACE 2(2),NEW I'TH 7 =TN6 LDX 2 0 10 =W7Q TRACE 2(2),NEWI+MTH 4 =WMB ) 16 =X72 SBX 5 4 [ RESET I TO I-M 20 =XLL BPZ 5 PICKITHENT [ JUMP IF'NEW' I NOT NEGATIVE. 5 =Y6= STEPJ 14 =YKW ADN 6 5 [ STEP J 8 =_5G LDX 2 FX2 16 =_K6 BXL 6 AWORK2(2),SETITOJ [ JUMP IF J < K 16 ?24Q LDX 4 AWORK3(2) [ PICK UP MESH 10 ?2JB BRN XFINERMESH 5 ?342 SORTED 4 ?3HL # 21 ?43= # WE NOW SET UP A DUMMY FILE IDENTICAL TO THE ONE WE ARE INDEXING 21 ?4GW # EXCEPT FOR THE 'CAREFUL' BIT AND THE FILE & BLOCKS ALTERED BITS. 4 ?52G # 9 ?5G6 #SKI K6BMINDEX>99$99 10 ?5_Q TRACE JTIME,END IX 9 ?6FB #SKI K6BMINDEX<100$100 10 ?6_2 TRACEVER JTIME,END IX 15 ?7DL TOPFCB2 2 [ X2 -> FCB 20 ?7Y= LDX 7 BSPRE(2) [ WE GET SOME BLOCKS FOR THE FILE 20 ?8CW LDX 4 FBLMOD(2) [ ON THE SAME RESIDENCE AS IT IS 21 ?8XG LDX 6 4 [ CURRENTLY. IF THERE ISN'T ENOUGH 21 ?9C6 SBN 6 FBLKS-A1-2 [ WE TRY TO GET 1 LESS BLOCK,AND SO 9 ?=BB #SKI K6BMINDEX>199-199 9 ?=W2 TRACE 6,NO.BLOX 21 ??*L SETUPCORE 6,3,BSTB,EMPTYB [ THIS IS NECESSARY AS WE HAVE TO PUT 21 ??T= STO 6 A1(3) [ THE FILE ON THE SAME RESIDENCE AS 21 ?##W STO 7 A1+1(3) [ IT MAY BE A SPECIALLY ALLOCATED FIL 6 ?#SG ... GETBAX 11 ?*#6 ... SETUPCOR 4,3,FILE,FCB,,1 15 ?CQ= LDEX 5 AWORK4(2) [ INDEX NO. 21 ?D9W TOPFCB2 2 [ FUL.WE SET UP AN FCB NEXT LOOKING 21 ?DPG ... STOZ FBLMOD(3) [ NEARLY IDENTICAL TO THE OTHER O 9 ?F96 NGS 7 CMOD(3) 9 ?FNQ ... LDN 7 FBLMOD(3) 10 ?G8B ... LDN 0 FBLMOD+1(3) 11 ?GN2 ... MOVE 7 BSPRE-FBLMOD-1 9 ?H7L ADN 3 FUSER1 9 ?HM= ADN 2 FUSER1 17 ?J6W MOVE 2 1+FVERSION-FUSER1 [ MOVE IN NAME ETC 16 ?JLG SBN 3 FUSER1 [ X3 -> NEW FCB 17 ?K66 SBN 2 FUSER1 [ X2 -> THE OLD FCB 9 ?KKQ LDN 0 FBLKS-A1 14 ?L5B STO 0 FBLMOD(3) [ EMPTY. 21 ?LK2 LDX 0 BACK1(2) [ TRANSFER BS HOME(FCB IDENTIFIER). 9 ?M4L STO 0 BACK1(3) 9 ?MJ= LDX 0 BACK2(2) 9 ?N3W STO 0 BACK2(3) 19 ?NHG STO 4 FUSEBL(3) [ BUT BLOX ALLOCATED TO IT. 16 ?P36 ORS 5 FINFC(3) [ SET INDEX NO. 19 ?PGQ LDX 0 MASKCOMM(1) [ TRANSFER VITAL BITS OF COMM 9 ?Q2B ANDX 0 COMM(2) 9 ?QG2 STO 0 COMM(3) 20 ?Q_L LDX 0 MASKFCOM(1) [ TRANSFER VITAL BITS OF FCOMM 9 ?RF= ANDX 0 FCOMM(2) 9 ?RYW STO 0 FCOMM(3) 18 ?SDG ADN 3 BSPRE [ MOVE THE BLOCK NOS. IN 16 ?SY6 MHUNTW 2,BSTB,FULLB [ FROM THE FULLB. 8 ?TCQ ADN 2 A1+1 7 ?TXB SMO 6 17 ?WC2 MOVE 2 511 [ & THE B.S.PREFIX. 15 ?WWL SETNCORE FELLEN,3,FILE,FSTACK,,1,FELLEN 20 ?XB= ADN 3 A1 [ SET UP AND INITIALISE A FSTACK 17 ?XTW NGS 3 FREADWORD(3) [ BLOCK AND ELEMENT 10 ?Y*G NGS 3 FREADBLOCK(3) 8 ?YT6 LDN 0 A1 10 ?_#Q NGS 0 FBACKPOINT(3) 20 ?_SB TOPFCA2 2 [ OLD FCA; TRANSFER APPROPRIATE 17 #2#2 LDX 0 FGENERAL1(2) [ BITS IN FG1 & FG2. 10 #2RL ANDX 0 MASKFG1(1) 10 #3?= STO 0 FGENERAL1(3) 10 #3QW LDX 0 FGENERAL2(2) 10 #4=G ANDX 0 MASKFG2(1) 10 #4Q6 STO 0 FGENERAL2(3) 18 #59Q RINGFILE 3 [ FCA -> TOP OF FILERING 8 #5PB SBN 3 A1 8 #5_8 ... PSTAC 2,2 7 #692P...#SKI IFS<1$1 4 #6DSP...( 5 #6NL XFLPK 19 #78= LDX 2 FPTR(2) [ SET X2 -> NEXT FCB OR BASE 16 #7MW BXE 2 CXFI,XEK [ OF FILE CHAIN 9 #87G LDX 0 ATYPE(2) 11 #8M6 BXU 0 FILEPLUSFCB,XFLPK 4 #96Q XEK 9 #9LB #SKI K6BMINDEX>299$299 9 #=62 TRACE 2,NXFCB 10 #=KL MHUNTW 1,FILE,FCB 7 #?5= STO 1 4 9 #?CM ... LDX 2 BPTR(2) 20 #?Q4 ... TRANSFCB 4,ACT,FILE,2 [X2 GIVES THE POSITION IN FILE CHAIN 21 ##4G CHAIN 3,4 [ AFTE_GINVIOUS FCB & ITS FLOTILLA 4 ##5XP...) 6 ##7#P...#SKI IFS 4 ##8PP...( 8 ##=6P... BFCBX 2,2 9 ##?HP...#SKI K6BMINDEX>299$299 9 ###YP... TRACE 2,NXFCB 7 ##B*P... STO 3 4 21 ##CQP... MHUNTW 3,FILE,FCB [RING IN FCB,DECHAIN FROM ACT. CHAIN 20 ##F7P... FILECHAIN 4,3,2 [& CHAIN FCB AND FSTACK TOGETHER. 4 ##GJP...) 4 ##J6 # 19 #*3Q # WE NOW SET UP A FI/FINDEXF BLOCK TO PUT THE INDEX IN AS WE 8 #*HB # CALCULATE IT 4 #B32 # 7 #BGL LDX 3 6 18 #C2= SBN 3 2 [ NO. OF BLOX IN FILE. 14 #CFW LDEX 6 AWORK4(2) [ INDEXNO 17 #C_G CALL 7 SETUPFINDEX [ SET UP THE FINDEXF 9 #DF6 LDN 0 FBLKS-A1 16 #DYQ STO 0 AWORK3(2) [ ^ OLD FBLMOD^. 10 #FDB LDN 0 INDEXREC-A1 18 #FY2 STO 0 A1(1) [ FILE CURRENTLY EMPTY 16 #GCL NGN 4 4 [ PTR IN FSORT 6 #GX= NEXTFSORT 16 #HBW ADN 4 5 [ STEP FSORT PTR. 5 #HWG XIRSTFS 8 #JB6 LDX 2 FX2 16 #JTQ MHUNTW 1,FI,FSORT [ X1 -> FSORT. 17 #K*B BXE 4 A1(1),NEWFILE [ J IF REACHED END 9 #KT2 #SKI K6BMINDEX>299$299 10 #L#L TRACE 4,FSORTPTR 17 #LS= ADX 1 4 [ +A1 -> NEXT ENTRY. 13 #M?W TOPFCA2 2 [ FCA 18 #MRG NXFCA 2,2,ZGEOER6 [ FCA OF F_E & DEPTH 1 19 #N?6 LDX 0 A1+1(1) [ TABULATE IN THE INPUT FILE 19 #NQQ STO 0 FREADBLOCK(2) [ TO THE POSITION OF THE NEXT 20 #P=B LDX 0 A1+2(1) [ ENTRY TO GO TO THE OUTPUT FILE. 14 #PQ2 STO 0 FREADWORD(2) [ FILE. 13 #Q9L LDX 5 A1(1) [ KEY 4 #QP= SAG1 7 #Q_4 ... PHOTO 7 17 #R8W STEPAGAIN 1 [ GET PTR. TO RECORD 6 #RNG ...NXTAPPEND 16 #S86 LDX 6 3 [ PRESERVE PTR. 9 #SMQ #SKI K6BMINDEX>699$699 11 #T7B TRACE FRH(3),OUT RECH 9 #W6L LDEX 1 FRH(3) 17 #WL= STEP ,0(1) [ GET APPEND POINTER. 9 #X5W ... TESTMOVE 7,NXAP 8 #XKG ... BRN SAG1 7 #Y56 ...NXAP LDX 7 3 19 *2H= LDEX 1 FRH(3) [ DOESN'T MATTER WHICH X3 PTR 21 *32W MOVE 6 0(1) [ BOTH HAVE R.H. IN BOTTOM 9 BITS. 15 *3GG TOPFCB2 1 [ X1 -[ FCB 9 *426 #SKI K6BMINDEX>299$299 11 *4FQ TRACE CMOD(1),END ENT 16 *4_B MHUNTW 3,FI,FINDEXF [ X3 -> FINDEXF 18 *5F2 LDX 0 FBLMOD(1) [ HAS FBLMOD CHANGED ? 16 *5YL SBX 0 AWORK3(2) [ (OLD FBLMOD) 16 *6D= BZE 0 NOALTFX1 [ NO.THEN JUMP 18 *6XW ADS 0 AWORK3(2) [ UPDATE PREVIOUS FBLMOD. 7 *7CG #SKI K6BMINDEX 18 *7X6 BCT 0 ZGEOER2 [ ERROR IF CHANGED BY > 1 8 *8BQ LDX 6 A1(3) 18 *8WB BXL 6 ALOGLEN(3),NOALTFX [ J IF BLOCK LONG ENOUGH 7 *9B2 #SKI K6BMINDEX 19 *9TL BXU 6 ALOGLEN(3),ZGEOER2 [ ERROR IF NOT LONG ENOUGH 16 *=*= ADN 6 8 [ ALTLEN BY A LOT 9 *=SW #SKI K6BMINDEX>99$99 9 *?#G TRACE 6,ALT FXB 8 *?S6 ALTLEN 3,6 16 *#?Q MHUNTW 3,FI,FINDEXF [ X3 -> FINDEXF 5 *#RB NOALTFX 18 **?2 LDN 0 1 [UPDATE RECORD HEADER. 8 **QL ADS 0 A1(3) 5 *B== NOALTFX1 8 *BPW SMO A1(3) 17 *C9G STO 5 A1-1(3) [ UPDATE INDEX NO. 9 *CP6 #SKI K6BMINDEX>199$199 9 *D8Q TRACE 5,BLOCKEY 6 *DNB XISITKEYED 21 *F82 STEP [ STEP TO LAST RECORD IN O/P FILE. 15 *FML TOPFCB2 2 [ X2 -> FCB. 20 *G7= CALL 1 SKEYREC [ SET X5 = KEY OF LATEST RECORD 17 *GLW BRN NXINREC [ J IF NOT INDEXED. 8 *H6G LDN 0 #77 9 *HL6 ANDX 0 FINFC(2) 7 *J5Q ADX 1 0 21 *JKB LDX 0 XENTABLE(1) [ PICK UP TABLE THAT TELLS US WHICH 20 *K52 BZE 0 NEXTFSORT [ TYPES HAVE MULTIRECORD ENTRIES 20 *KJL NXINREC [ AND JUMP IF THIS FILE HASN'T 19 *L4= STEP 1 [ NEXT RECORD IN INPUT FILE 15 *LHW BZE 3 NEXTFSORT [ J IF E.O.F. 15 *M3G TOPFCB2 2 [ X2 -> FCB 7 *M*X ... PHOTO 7 21 *MN# ... KEYREC 2,,3,NXTAPPEND [IF NOT KEYED REC,EXIT TO APPEND THIS 21 *N2Q BRN NEXTFSORT [ RECORD,O/W TRY NEXT ENTRY IN FSORT. 18 *NGB # WE NOW HAVE AN INDEXED FILE AT TOP LEVEL AND AN OLD FILE 10 *P22 # TO GET RID OF AT LEVEL 1. 5 *PFL NEWFILE 10 *P_= MHUNTW 3,BSTB,FULLB 5 *QDW MHUFUL 16 *QYG CALL 0 NXFCB [ X2 -> NOXT FCB 9 *RD6 LDX 1 FUSEBL(2) 21 *RXQ SBN 1 FBLKS-A1-2 [ X1 = TOTAL NUMBER OF BLOCK TO BE 21 *SCB [ FREED.NB NOT NECESS SAME PREFIX. 19 *SX2 BXE 1 A1(3),XFULLBIG [ FCB MAY CONTARE UNUSED BLOX 9 *TBL #SKI K6BMINDEX>99$99 9 *TW= TRACE 1,BL USED 7 *W*W LDX 4 1 11 *WTG ALTLEN 3,4,BSTB,FULLB 10 *X*6 MHUNTW 3,BSTB,FULLB 8 *XSQ STO 4 A1(3) 9 *Y#B BRN MHUFUL 5 *YS2 XFULLBIG 8 *_?L ADN 3 A1+1 8 *_R= ADN 2 BSPRE 16 B2=W MOVE 2 511(1) [ MOVE + BSPRE 8 B2QG SBN 2 BSPRE 17 B3=6 SBN 3 A1+1 [ REDATUMISE PTRS. 14 B3PQ LDX 4 2 [ SAVE 10 B49B LDX 5 FWAITCOUNT(2) 18 B4P2 ... LF 2,FFAUTCLCT,6 [X6= COUNT OF AUTOCLOSES 20 B58L LDN 7 1 [ CT.OF FULLB'S TO BE FREEBAXED 8 B5N= LDCT 0 #40 19 B67W SMO FX2 [ J IF FILE WASN'T ORIGINALLY 17 B6MG ANDX 0 AWORK4 [ CAREFULLY OPENED 8 B776 BZE 0 XLFPM 21 B7LQ CALL 0 SFBLOCK [ IS THERE ANOTHER FULLB IN THE FILE 8 B86B #HAL BSTB+FULLB,0 17 B8L2 BRN NOFULLB [ CHAIN? J IF NOT. 9 B95L #SKI K6BMINDEX>199$199 11 B9K= TRACE A1(2),FULLB IS 15 B=4W ADN 7 1 [ 2 FULLB'S 17 B=JG CHAIN 2,FX2 [ CHAIN IN ACT. CHAIN 5 B?46 NOFULLB 15 B?HQ LDX 2 4 [ X2 -> FCB 9 B#3B CALL 0 SFBLOCK 8 B#H2 #HAL FILE+FMAPP,0 19 B*2L BRN ZGEOER1 [ ERROR IF NO FMAPP & CAREFUL 5 B*G= YESMAP 9 B*_W #SKI K6BMINDEX>199$199 12 BBFG TRACE FBITMOD(2),FMAPP IS 20 BB_6 CHAIN 2,FX2 [ CHAIN FMAPP INTO ACTIVITY CHAIN 16 BCDQ LDX 3 FPTR(2) [ -> FMAPP 5 BCYB SETMAP 17 BDD2 LDX 0 ALOGLEN(3) [ INITIALISE OMAPP 9 BDXL SBN 0 FBITS-A1 7 BFC= #SKI K6BMINDEX 17 BFWW BZE 0 ZGEOER2 [ J IF EMPTY TO ERROR 9 BGBG LDN 1 FBITS(3) 5 BGW6 XFLPL 16 BH*Q STOZ 0(1) [ ZEROISING LOOP 7 BHTB ADN 1 1 8 BJ*2 BCT 0 XFLPL 16 BJSL LDN 0 3 [ UPDATE FBCOMM 9 BK#= ORS 0 FBCOMM(3) 14 BKRW LDX 2 4 [ -> FCB 16 BL?G FREECORE FPTR(2) [ FREE FSTACK. 5 BLR6 XLFPM 14 BM=Q LDX 2 4 [ -> FCB 17 BMQB LDX 2 FPTR(2) [ BLOCK NEXT TO FCB 20 BN=2 BXE 2 CXFI,XSEARCHND [ EXIT FROM LOOP IF END OF CHAIN 15 BNPL LDX 0 ATYPE(2) [ OR FCB MET 12 BP9= BXE 0 FILEPLUSFCB,XSEARCHND 9 BPNW #SKI K6BMINDEX>199$199 11 BQ8G TRACE ATYPE(2),FREE BLK 15 BQN6 FREECORE 2 [ FREE BLOCK 8 BR7Q BRN XLFPM 6 BRMB XSEARCHND 8 BS72 ... DELFCB 4,FILE 8 BSLL LDCT 0 #40 17 BT6= ANDX 0 AWORK4(2) [ J IF NOT CAREFUL 9 BTKW BZE 0 XFREEBU 17 BW5G TOPFCB2 2 [ NEW FCB FOR FILE 10 BWK6 STO 5 FWAITCOUNT(2) 19 BX4Q ... STF 2,FFAUTCLCT,6 [INSERT COUNT OF AUTOCLOSES 21 BXJB MBS 2,BFALTB,BFALTR [SET 'FILE AND BLK NOS ALTERED' BITS. 16 BY42 BS 2,BFCARE [SET CAREFUL BIT 5 BYHL XLOADFP 14 B_3= LDX 4 2 [ -> FCB 16 B_GW CALL 0 SFBLOCK [ FREE ALL FURBS 8 C22G #HAL FILE+FURB,0 16 C2G6 BRN TRYFUWB1 [ J IF NONE LEFT 7 C2_Q FREECORE 2 9 C3FB BRN XLOADFP 5 C3_2 TRYFUWB1 15 C4DL LDX 2 4 [ X2 ->FCB 5 C4Y= TRYFUWB 18 C5CW CALL 0 SFBLOCK [ WRITE AWAY ALL FUWBS 8 C5XG #HAL FILE+FUWB,0 15 C6C6 BRN TRYFMAP [ J IF NONE 8 C6WQ CHAIN 2,FX2 11 C7BB WRITEAUT FAIL+FREE,BSBS 15 C7W2 TOPFCB2 2 [ X2 ->FCB 15 C8*L LDX 4 2 [ X4 -> FCB 9 C8T= BRN TRYFUWB 5 C9#W TRYFMAP 15 C9SG LDX 2 4 [ X2 -> FCB 10 C=#6 MHUNTW 3,FILE,FMAPP 19 C=RQ CHAIN 3,FPTR(2) [ CHAIN FMAPP INTO FILE CHAIN 5 C??B XFRLP 19 C?R2 MHUNTW 2,BSTB,FULLB [ CHAIN FULLB(S) INTO F.C. 8 C#=L CHAIN 2,3 8 C#Q= BCT 7 XFRLP 17 C*9W BRN ZEND [ GO TO FINAL STEP. 5 C*PG XFREEBU 7 CB96 FREEBAX 10 CBNQ MFREE BSTB,EMPTYB 8 CC8B BRN ZEND 12 CCN2 MENDAREA 1000-0?,K99BMINDEX 4 CD7L #END 8 ____ ...76520710000100000000