22FL #SEG INSERTWO6 [ JUDY BIDGOOD 22^= #OPT K0INSERTWO=K0INSERT>K0ACCESS>K0FILESTORE>K0ALLGEO 23DW #LIS K0INSERTWO 23YG 8HINSERTWO 24D6 [ 24XQ SEGENTRY K1INSERTWO,X1INSERTWO 25CB [ 25X2 # 26BL # THIS SEGMENT IMPLEMENTS THE FOLLOWING PARTS OF THE INSERT & REPLAC 26W= # MACROS. 27*W # 27TG # (NOT MARK 6) 28*6 # A) CALCULATES WHICH DIRECTION WE SHOULD TAKE OVERFLOW. 28SQ # 29#B # B) CALCULATES IF OVERFLOW SHOULD BE FITTED INTO AN ADJACENT BLOCK 29S2 # IN THE APPROPRIATE DIRECTION. IF SO READS IT DOWN. IF NOT,GOES TO 2=?L # (E) 2=R= # 2?=W # C) IF RECORD FITS, CALCULATES IF IT IS WORTH"SMOOTHING" THE CONTENTS 2?QG # OF THE 2 BLOX, & RECALCULATES OVERFLOW,& GOES TO (F) 2#=6 # 2#PQ # D) IF RECORD DOESN'T FIT,GOES ACROSS TO INSERTHR CHAPTER. 2*9B # 2*P2 # E) SETS UP A USAGE BLOCK & INSERTS A BLOCK NUMBER IN THE FCB.CALCULAT 2B8L # OVERFLOW INTO NEW BLOCK,SMOOTHING THE CONTENTS. 2BN= # 2C7W # F) MOVES ACROSS OVERFLOW & INSERTS RECORD 2CMG # 2D76 # ERRORS 2DLQ ZGEOER1 2F6B GEOERR 1,NOFULLB [FULLB HAS DISAPPEARED FROM FILE CHAIN. 2FL2 ZGEOER2 2G5L GEOERR 1,OVERFLOW [INSERT:OVERFLOW MISCALCULATED 2GK= ZGEOER4 2H4W GEOERR 1,BIT NSET [EXPECTED SWITCHES NOT SET 2HJG ZGEOER5 2J46 GEOERR 1,SHARE ? [MORE THAN 2X GSBS IN 2 FILESTORE BLO 2JHQ ZGEOER6 2K3B GEOERR 1,MOVEZERO [UNEXPECTED ZERO MOVE IN INSERT 2KH2 ZGEOER7 2L2L GEOERR 1,STO ZERO [MOVE OR LESS AS ABOVE 2LG= ZGEOER8 2L^W GEOERR 1,WILL GO! [INSERT HAS MISCALCULATED 2MFG ZGEOER9 2M^6 GEOERR 1,NO BLOCK [ERROR IN SFINDFURB S/R. 2NDQ ZGEOER10 2NYB GEOERR 1,BLOKRONG [USAGE BLOCK IN FIXED CORE ! 2PD2 ZGEOER11 2PXL GEOERR 1,ENDBLOCK [INSERT REACHED E.O.B. UNEXPECTEDLY. 2QC= ZGEOER12 2QWW GEOERR 1,TOPHALF [MISCALCULATION IN INSERT MACRO 2RBG ZGEOER13 2RW6 GEOERR 1,OTHER1/2 [MISCALCULATROE IN INSERT MACRO 2S*Q # 2STB SFULLB 2T*2 #HAL BSTB+FULLB,0 2TSL KXINSERTWO 2W#= X 2WRW +GSBS/4 [THISPARAMETER DECIDES THE MAXIMUM AMOUNT OF OEVRFLOW 2X?G [WE TRY TO FIT INTO AN ADJACENT BLOLK 2XR6 KPINSERTWO 2Y=Q PERCENT 2YQB +GSBS*3/10 [THIS PARAMEJER DETERMINES THE MINIMUM'FULLNESS' 2^=2 [BEYOND WHICH WE DON'T "SHARE" BLOCKS. 2^PL # USES OF AWORK WORDS 329= # 32NW # AWORK1 : B0 : REPLACE 338G # B1 : REPLACING LAST RECORD IN BLOCK 33N6 # B2 : CAREFUL FILE 347Q # B3 : OVERFLOW FORWARD BIT 34MB # B4 : "RECORD IN NEXT BLOCK"(R.I.N.B.) BIT. 3572 # B5 : AN EMPTY BLOCK HAS BEEN SET UP 35LL # B6 : AN EMPTY BLOCK AT E.O.F.HAS BEEN SET UP. 366= # B7 : INSERT3 BLOCK A RE-NAMED FUWB. 36KW # 375G # B15-B23: SIZE EXTRA REQUIRED 37K6 # AWORK2 : FILE DEPTH 384Q # 38JB # AWORK3 : TOP 9 BITS:- SIZE OF NEW RECORD 3942 # : BOTTOM 10 BITS:- VOLUME USED IN INSERT1 BLOCK. 39HL # 3=3= # AWORK4 : OVERFLOW (B3 OF AWORK1 INDICATES WHICH DIRECTION) 3=GW # 3?2G # USES OF ACOMMUNE WORDS 3?G6 # 3?^Q # ACOMMUNE4 : AMOUNT USED IN INSERT3 BLOCK(OR PTR TO SAME);PTR TO 3#FB # INSERT1 BLOCK 3#^2 # ACOMMUNE5 : POINTS TO FCA 3*DL # 3*Y= # ACOMMUNE2 : PTR TO INSERT3 BLOCK(RENAMED A FUWB) 3BCW # 3BXG # 3CC6 # 3CWQ # SUBROUTINES 3DBB # 3DW2 # 3F*L # 3FT= SFCB3 [SET X3-> FCB 3G#W SMO FX2 3GSG LDX 0 AWORK2 3H#6 SFSTACK 0,3 [X3 -> FCA 3HRQ SMO FX2 3J?B STO 3 ACOMMUNE5 [STORE 3JR2 PSTAC 3,3 3K=L BFCBX 3,3 [X3 -> FCB 3KQ= EXIT 6 0 3L9W # 3LPG SENDBLOCK 3M96 #SKI K6INSERT>699-699 3MNQ TRACE 3,SENDBL. 3N8B LDX 1 3 [X3 &X1 -> NEXT RECORD 3NN2 SEBLP 3P7L LDEX 0 FRH(1) [NEXT R.H 3PM= ADS 0 1 [ADD INTO PTR 3Q6W BNZ 0 SEBLP [J BACK IF NON ZERO 3QLG #SKI K6INSERT>699-699 3R66 TRACE 1,SENDIS 3RKQ EXIT 7 0 [EXIT 3S5B # 3SK2 SFURB 3T4L SMO FX2 3TJ= LDX 0 AWORK2 [SET X2 - > FSTACK 3W3W SFSTACK 0,2 [X2 -> FCA 3WHG SMO FX2 3X36 STO 2 ACOMMUNE5 [STORE 3XGQ SFFURB 3Y2B PSTAC 2,2 [X2 -> STACK BLOCK 3YG2 BRN SFFULP 3Y^L SFINDFURB 3^F= # CALLED BY X1.THE WORD AFTER THE CALL CONTAINS THE TYPE/SUBTYPE 3^YW # WANTED.X3 ->FCB,X2 WILL POINT ON EXIT TO THE BLOCK REQUIRED. 42DG LDX 2 FPTR(3) [J OVER FSTACK BLOCK 42Y6 SFFULP 43CQ BXE 2 CXFI,ZGEOER9 [ERROR IF END OF FILE CHAIN. 43XB LDX 2 FPTR(2) [NEXT BLOCK 44C2 LDX 0 ATYPE(2) 44WL #SKI K6INSERT 45B= BXE 0 FILEPLUSFCB,ZGEOER9 [ERROR IF END OF FILE CHAIN. 45TW BXU 0 0(1),SFFULP [J IF WRONG TYPE 46*G EXIT 1 1 [EXIT ROUND TYPE-WORD 46T6 # 47#Q SEEKFURB 47SB LDX 2 ACOMMUNE5(2) [-> FCA 48#2 SEEKFURB2 48RL PSTAC 1,2 49?= BFCBX 1,1 [X1 -> FCB 49QW SMO FREADBLOCK(2) [B.N. WANTED 4==G LDX 7 0(1) 4=Q6 # 4?9Q SFUB 4?PB # THIS ROUTINE LOOKS FOR THE USAGE BLOCK WHOSE B.N. IS IN X7. 4#92 # X1 -> FCB ON ENTRY,X3 -> USAGE BLOCK ON NORMAL EXIT, EXIT +1 4#NL # MEANS IT'S NOT THERE. IF IT'S A FUWB, B7 OF AWORK1 IS SET. 4*8= LDX 3 FPTR(1) [J OVER FSTACK 4*MW SLPY 4B7G LDX 3 FPTR(3) [NEXT BLOCK 4BM6 BXE 3 CXFI,SIXET [EXIT IF END OF FILE CHAIN 4C6Q LDX 0 ATYPE(3) 4CLB BXE 0 FILEPLUSFCB,SIXET [EXIT IF NEXT FCB 4D62 BXU 7 BACK2(3),SLPY [LOOP BACK IF WRONG B.S.H. 4DKL BXE 0 FFSFURB,(6) [EXIT OK IF FURB 4F5= BXU 0 FFSFUWB,SLPY [LOOP BACK IF NOT FUWB 4FJW LDCT 0 2 4G4G SMO FX2 4GJ6 ORS 0 AWORK1 [SET BIT 4H3Q EXIT 6 0 4HHB SIXET EXIT 6 1 4J32 # 4JGL # 4K2= OFLOWFOR 4KFW # THIS SUBROUTINE CALCULATES HOW MUCH OVERFLOW WILL RESULT FROM 4K^G # INSERTING OR REPLACING A RECORD AND PUSHING EXTRA DATA THAT WON'T 4LF6 # FIT OFF THE BOTTOM END.I.E. FORWARD OVERFLOW. 4LYQ # 4MDB # ENVIRONMENT ON ENTRY 4MY2 # X3 -> RECORD 4NCL # X5 CONTAINS VOLUME WE HAVE TO FIT IN. 4NX= # X2-> FCA 4PBW # 4PWG # USE OF ACCUMULATORS 4QB6 # X4 - RELATIVE PTR FROM START OF BLOCK TO RECORD WE'VE STEPPED TO. 4QTQ # X1 -> RECORD WE'VE STEPPED TO 4R*B # X3 -> RECORD INDICATER BY READ PTRS. 4RT2 # 4S#L # ON EXIT 4SS= # AWORK4 CONTAINS THE AMOUNT AFTER THE RECORD WHICH IS TO BE LEFT IN 4T?W # THE BLOCK 4TRG # 4W?6 LDX 4 FREADWORD(2) 4WQQ LDX 1 3 [WE USE X1 TO POINT TO THE RECORDS 4X=B [CONTAINS A RELATIVE PTR INCLUDING 4XQ2 [ALL THE EXTRA WORDS(=[X47) WE HAVE 4Y9L [TO FIND ROOM FOR 4YP= ADX 4 5 [ADD ON EXTRA AREA REQUIRED 4^8W SMO FX2 4^NG LDX 0 AWORK1 5286 BPZ 0 NREP8 [J IF NOT REPLACE 52MQ LDEX 0 FRH(3) [SKIP OVER RECORD. 537B ADX 4 0 53M2 ADX 1 0 546L NREP8 54L= BXGE 4 BSBSA1,NUFPH [J IF ALREADY TOO MUCH,I.E THE REPLAC 555W [OR INSERTED RECORD WILL HAVE TO GO 55KG XLP [INTO A NEW BLOCK 5656 LDEX 0 FRH(1) [NEXT R.H 56JQ #SKI K6INSERT 574B BZE 0 ZGEOER8 [SO IT DOES FRT AFTER ALL! 57J2 ADX 4 0 [RELATIVE PTR,TO TELL US WHEN WE'VE 583L [REACHED THE END OF THE BLOCK. 58H= BXL 4 BSBSA1,NOTENUF [J IF NOT OVERFLOWED YET. 592W SBX 4 0 [STEP BACK. 59GG BRN NUF 5=26 NOTENUF 5=FQ ADX 1 0 [O/W,INCREMENT X1 & CARRY ON 5=^B BRN XLP 5?F2 NUFPH 5?YL LDCT 0 #20 [THE BIT WHICH INDICATES THAT 5#D= SMO FX2 [THE "OPERATED ON" RECORD(REPLACED OR 5#XW ORS 0 AWORK1 [INSERTED)GFES INTO THE NEXT BLOCK. 5*CG NUF 5*X6 SMO FX2 5BBQ LDX 0 AWORK3 [A1 + AREA USED IN INSERT1 BLOCK 5BWB ANDN 0 -1 5CB2 SBX 0 4 [LESS (A1 + AMOUNT OF BLOCK 5CTL ADX 0 5 [ TO BE LEFT IN INSERT1 BLOCK) 5D*= SMO FX2 5DSW STO 0 AWORK4 [STORE 5F#G #SKI K6INSERT>99-99 5FS6 TRACE 0,OVERFLOW 5G?Q EXIT 7 0 5GRB # 5H?2 #SKI INSB 5HQL ( 5J== OFLOWBAC 5JPW # THIS ROUTINE CALCULATES THE AMOUNT OF OVERFLOW INCURRED BY PUSHING 5K9G # THE DATA UP THE BLOCK,AND OFF THE TOP. 5KP6 # 5L8Q # USE OF ACCUMULATORS 5LNB # X4 CONTAINS OVERFLOW EVENTUALLY 5M82 # X5 CONTAINS AMOUNT TO FIT IN 5MML # X1 -> RECORD WE HAVE STEPPED TO. 5N7= # X3 -> RECORD INDICATED BY THE READ PTRS. 5NLW # 5P6G # ON EXIT 5PL6 # X3 UNCHANGED 5Q5Q # X5 CONTAINS O'FLOW 5QKB # 5R52 LDN 4 0 [USED TO KEEP AMOUNT OF OVERFLOW. 5RJL LDX 1 3 [ -> CURRENT REC. 5S4= SBX 1 FREADWORD(2) [-> FURB 5SHW ADN 1 A1 [-> 1ST RECORD 5T3G ZLP 5TH6 BXE 1 3,RECNEXTB [J IF "OPERATED ON" RECORD GOES INTO 5W2Q [PREVIOUS BLOCK 5WGB LDEX 0 FRH(1) [NEXT RECORD 5X22 #SKI K6INSERT 5XFL BZE 0 ZGEOER8 [ERROR 5X^= ADS 0 4 [CT OF OVERFLOW. 5YDW ADX 1 0 5YYG BXL 4 5,ZLP [J BACK IF TOTAL IS STILL LESS THAN 5^D6 [512+A1 5^XQ #SKI K6INSERT>199-199 62CB TRACE 4,OFLOW B2 62X2 EXIT 7 0 63BL RECNEXTB 63W= LDCT 0 #20 [SET THE "R.I.N.B" 64*W SMO FX2 [BIT 64TG ORS 0 AWORK1 65*6 ADX 4 5 65SQ EXIT 7 0 66#B ) 66S2 # 67?L SFINDFULLB [SET X3 ->FCB,X2-> APPROPRIATE FULLB 67R= # CALLED BY X6,OVERWRITES X2,WHICH POINTS TO AN APPROPRIATE FULLB 68=W # FOR THIS FILE ON SUCCESSFUL EXIT (+1) 68QG # EXIT +0 => NO FULLB 69=6 # X3 POINTS TO FCB. 69PQ SMO FX2 6=9B LDX 0 AWORK2 6=P2 SFSTACK 0,2,2 [FIND X2 -> FSTACK 6?8L BFCBX 3,2 [X3 -> FCB 6?N= SFLP 6#7W LDX 2 FPTR(2) [NEXT BLOCK. 6#MG BXE 2 CXFI,(6) [J IF END OF FILE CHAIN 6*76 LDX 0 ATYPE(2) [TYPE 6*LQ BXE 0 FILEPLUSFCB,(6) [EXIT FCB, SEARCH UNSUCCESSFUL 6B6B SMO FX1 6BL2 BXU 0 SFULLB,SFLP [J IF NOT BSTB/FULLB 6C5L LDX 0 A1+1(2) 6CK= BXU 0 BSPRE(3),SFLP [J IF WRONG B.S.PREFIX. 6D4W EXIT 6 1 6DJG # 6F46 SFCA2 6FHQ SMO FX2 6G3B LDX 0 AWORK2 [DEPTH 6GH2 SFSTACK 0,2 [X2 -> FCA 6H2L SMO FX2 6HG= STO 2 ACOMMUNE5 6H^W EXIT 6 0 6JFG # 6J^6 # 6KDQ SCAREFULA 6KYB # THIS ROUTINE DOES ALL THE CAREFUL UPDATING FOR 1 BLOCK HAVING 6LD2 # BEEN CHANGED. IF NECESSARY A BSTR/FULLB IS SET UP,OR ALTLEN'ED, 6LXL # AND THE BLOCK NO. IS SWAPPED OVER 6MC= # 6MWW # OVERWRITES X1,2,3,6, CALLED BY X7 6NBG # X4 THROUGHOUT INDICATES WHICH BLOCK NUMBER TO CHANGE (A FREADBLOCK 6NW6 # TYPE PTR REL. TO AD OF THE FCB); 6P*Q # ON EXIT X2 -> THE USAGE BLOCK; THIS IS ASSUMED TO BE A 6PTB # FI/INSERT4 BLOCK 6Q*2 # 6QSL LDX 2 FX2 6R#= LDX 2 ACOMMUNE5(2) 6RRW PSTAC 2,2 6S?G BFCBX 3,2 [SET X3-> FCB. 6SR6 #SKI K6INSERT>199$199 6T=Q TRACE 4,CAREFUL 6TQB JBC STEND,3,BFCARE [EXIT IF NOT CAREFUL 6W=2 LDX 0 4 [BLOCK WE'RE INTERESTED IN 6WPL SBN 0 FBLKS-1 [DATUMISE 6X9= MAPBCH 0,3 [CHECK IF BIT SET IN FMAPP BLOCK. 6XNW BNZ 0 STEND [EXIT IF IT IS 6Y8G SBX 7 FX1 [DATUMISE LINK 6YN6 JBC NEWFULLB,3,BFALTR [IF FILE NOT ALTERED,SET UP A FULLB 6^7Q CALL 6 SFINDFULLB [X2-> FULLB,X3-> FCB 6^MB BRN NEWFULLB [J IF FULLB NOT PRESENT 7272 LDX 6 ALOGLEN(2) [NOW ALTLEN FULLB 72LL ADN 6 1 736= LDX 3 2 73KW ALTLEN 3,6 [BY ONE WORD 745G CALL 6 SFINDFULLB [X2-> FULLB,X3->FCB 74K6 BRN ZGEOER1 [ERROR IF NO FULLB 754Q BRN SFULONG [WHENCE WE CAME FOR GEOERR. 75JB NEWFULLB 7642 SETNCORE 3,1,BSTB,FULLB [SET UP FUUB,X1 -> IF 76HL CALL 6 SFCB3 [X3 ->FCB 773= LDX 2 3 [X1 -> FCB 77GW XLPA 782G LDX 2 FPTR(2) [NEXT BLOCK IN FILE CHAIN. 78G6 BXE 2 CXFI,SCHAIN [J IF END OF FILE CHAIN. 78^Q LDX 0 ATYPE(2) 79FB BXE 0 FILEPLUSFCB,SCHAIN [J IF WE'VE REACHED FCB 79^2 SMO FX1 [O/W SEARCH FOR FULLB. 7=DL BXU 0 SFULLB,XLPA 7=Y= SCHAIN 7?CW STO 1 6 [PRESERVE FULLB PTR 7?XG CHAIN 1,BPTR(2) [CHAI> IN FRONT OF NEXT FCB 7#C6 LDX 2 6 [PICK UP FULLB PTR. 7#WQ LDX 0 BSPRE(3) [B.S. PREFIX OF FULLB 7*BB STO 0 A1+1(2) 7*W2 LDN 0 2 [R.H.OF FULLS 7B*L STO 0 A1(2) 7BT= SFULONG 7C#W SGETBAC 7CSG LDX 3 BSPRE(3) [SAVE BSPRE OVER COOR. 7D#6 GETBACK 3 [GET ONE BLOCK. 7DRQ ADDSKIP I516A,BSGET 7F?B LDX 1 3 [SAVE OVER NEXT S/R 7FR2 CALL 6 SFCB3 [X3->FCB 7G=L BXE 1 BSPRE(3),SBLOKOK [JIF BSPRE HASN'T CHANGED OVER COOR 7GQ= LDX 2 ACOMMUNE7(2) 7H9W FREEBACK 1,2 [FREE BLOCK 7HPG ADDSKIP I516A,ADLFBL 7J96 CALL 6 SFCB3 7JNQ BRN SGETBAC 7K8B SBLOKOK 7KN2 LDX 2 FPTR(3) 7L7L CALL 6 SFLP [X2 -> FULLB 7LM= CALL 0 ZGEOER5 7M6W SMO 4 7MLG LDX 0 0(3) 7N66 SMO A1(2) [OLD BLOCK IN FULLB 7NKQ STO 0 A1(2) 7P5B LDN 0 1 [UPDATE R.H 7PK2 ADS 0 A1(2) 7Q4L SMO FX2 7QJ= LDX 6 ACOMMUNE7 [NEW BLOCK 7R3W SMO 4 7RHG STO 6 0(3) [NGN BLOCK IN FCB 7S36 CALL 1 SFINDFURB [FIND USAGE BLOCK 7SGQ #HAL FI+INSERT4,0 7T2B STO 6 BACK2(2) [BLOCK NUMBER 7TG2 LDX 0 BSPRE(3) [ 7T^L STO 0 BACK1(2) [B.S.PREFIX. 7WF= MBS 3,BFALTR,BFALTB [INDICATE FILE & BLOCK NOS. ALTERED 7WYW STO 2 6 [PTR TO FURB 7XDG SBN 4 FBLKS-1 [RELATIVISE PTR 7XY6 MAPBSE 4,3 [SET BIT IN FMAPP BLOCK 7YCQ LDX 2 6 [PTR 7YXB ADN 4 FBLKS-1 7^C2 ADX 7 FX1 7^WL EXIT 7 0 82B= STEND 82TW CALL 1 SFINDFURB [X2 ->INSERT4 BLOCK 83*G #HAL FI+INSERT4,0 83T6 EXIT 7 0 84#Q # 84SB # 85#2 # THIS S/R DOES THE CAREFUL UPDATING FOR A NEW BLOCK; A BIT HAS TO 85RL # BE INSERTED IN THE FMAP BLOCK,AND A BLOCK NO. INSERTED IN THE 86?= # FCB 86QW # 87=G # OVERWRITES X1,2,3,6; X4 -> BLOCK NO. BEFORE WHICH THE 87Q6 # BLOCK IS TO BE INSERTED. IN THE CASE OF NON-CAREFUL FILES,WE 889Q # CAN USE AN UNUSED BL.NO., IF ANY;O/W WE MUST GET A NEW ONE. 88PB # X2 ON EXIT -> USAGE BLOCK 8992 SINSERT 89NL SINSERT1 8=8= SBX 7 FX1 8=MW DOWN INSERTBL,2 [INSERT BLOCK 8?7G TESTREP FILEFULL,SFULL 8?M6 ADX 7 FX1 8#6Q CALL 1 SFURB [X2 -> INSERT 8#LB #HAL FI+INSERT3,0 8*62 EXIT 7 0 8*KL # 8B5= # THIS S/R MOVES DOWN AN AMOUNT OF CORE(IN AN USAIE BLOCK),OF SIZE 8BJW # [X0] DOWN THE USAGE BLOCK BY [X1] 8C4G # [X3] IS THE START OF THE AREA TO BE MOVED,& X2 -> FX2 8CJ6 # 8D3Q MOVEDOWNB 8DHB #SKI K6INSERT>199-199 8F32 ( 8FGL TRACE 0,SIZEDOWN 8G2= TRACE 1,BY 8GFW ) 8G^G #SKI K6INSERT 8HF6 ( 8HYQ BZE 1 ZGEOER6 8JDB BZE 0 ZGEOER1 8JY2 BXGE 1 BSBS,ZGEOER6 8KCL BXGE 0 BSBS,ZGEOER7 8KX= LDN 4 -1 8LBW BXL 3 4,ZGEOER10 8LWG ) 8MB6 LDX 4 1 [SIZE OF SPACE TO BE CREATED 8MTQ [THIS IS THE AMOUNT WE HAVE TO 8N*B LDX 5 0 [MOVE DOWN THE BLOCK 8NT2 ADX 5 3 [X5 POINTS TO THE BOTTOM OF THE 8P#L LDX 6 5 [AREA TO BE MOVED,X6 POINTS TO THE 8PS= ADX 6 1 8Q?W SMO 6 [BOTTOM OF THE AREA TO BE MOVED INTO. 8QRG STOZ 0 [ZEROISE WORD AT END OF BLOCK 8R?6 MOVELOOP [ WE CAN ONLY MOVE DOWN [X4]=[X1] WORDS AT A TIME(OR 8RQQ [LESS,OF COURSE),FOR FEAR OF OVERWRITING WE START AT THE 8S=B BXL 0 4,MOVELAST [BOTTOM.J IF AMOUNT LEFT TO MOVE IS 8SQ2 [NOW LESS THAN MAXIMUM. 8T9L #SKI K6INSERT>399-399 8TP= TRACE 5,NEXTDOWN 8W8W SBX 5 4 [MOVE POINTERS UP TO POINT TO NEXT 8WNG SBX 6 4 [AREAS TO BE MOVED TO & FROM. 8X86 MOVE 5 0(1) 8XMQ BXE 5 3,(7) [EXIT IF AREA TO BE MOVED IS AN EXACT 8Y7B [MULTIPLE OF [X4]. 8YM2 SBX 0 4 [DECREMENT SIZE OF AREA LEFT TO 8^6L BRN MOVELOOP [MOVE AND JUMP BACK TO START OF LOOP 8^L= MOVELAST [THIS CODE MOVES THE'REMAINDER' DOWN 925W LDX 1 0 [SIZE OF LAST MOVE 92KG #SKI K6INSERT>399-399 9356 TRACE 0,LASTDOWN 93JQ LDX 5 3 [FROM HERE 944B LDX 6 3 94J2 ADX 6 4 [TO HERE 953L MOVE 5 0(1) 95H= EXIT 7 0 962W # 96GG # 9726 # 97FQ # ENTRY POINT FROM INSERT. 97^B # 98F2 # BOTTOM 1/2 OF AWORK1 = EXTRA REQUIRED 98YL # 99D= # AWORK3 = AMOUNT USED IN INSERT1 BLOCK(WHICH IS IN THE FILE CH.) 99XW # 9=CG X1INSERTWO 9=X6 #SKI K6INSERT>699-699 9?BQ TRACE FX2,INSERTWO 9?WB ADDSKIP I516A,INSE2 9#B2 CALL 1 SFURB [X2 -> INSERT1 BLOCK 9#TL #HAL FI+INSERT1,0 9**= LDX 3 2 [X3 -> INSERT1 BLOCK 9*SW SMO FX2 9B#G LDX 2 ACOMMUNE5 [X2 -> FCA 9BS6 PSTAC 1,2 9C?Q BFCBX 1,1 [X1 -> FCB 9CRB ADX 3 FREADWORD(2) [X3 -> CURRENT RECORD 9D?2 #SKI INSB 9DQL ( 9F== LDX 0 FBLMOD(1) 9FPW SBN 0 FBLKS-A1 9G9G BZE 0 SONEBLOK [J IF ONLY ONE BLOCK IN FILE 9GP6 ADN 0 FBLKS-2 [J IF OVERFLOW IS FROM PENULTIMATE 9H8Q BXE 0 FREADBLOCK(2),SFORCALC [BLOCK 9HNB BXL 0 FREADBLOCK(2),SBAKCALC [J IF FROM LAST BLOCK 9J82 LDN 0 FBLKS [J IF FROM FIRST BLOCK. 9JML BXE 0 FREADBLOCK(2),SFORCALC 9K7= SMO FREADBLOCK(2) 9KLW LDX 7 1(1) [SUCCEEDING B.N. 9L6G CALL 6 SFUB 9LL6 BRN SFORCALC [J IF BLOCK FOUND 9M5Q LDX 0 FREADBLOCK(2) 9MKB SBN 0 1 9N52 SMO 0 9NJL LDX 7 0(1) [PRECEEDING BLOCK NO. 9P4= CALL 6 SFUB 9PHW BRN SBAKCALC [J IF BL.FOUND 9Q3G CALL 7 OFLOWFOR [CALCULATE OVERFLOW FORWARDS 9QH6 [AND LEAVE IN AWORK4 9R2Q CALL 7 OFLOWBAC [CALCULATE OVERFLOW BACKWARDS 9RGB LDX 2 FX2 [& LEAVE IN X4 9S22 BXGE 4 AWORK4(2),TRYFOR [TRY FORWARDS,IF F'WARDS OVERFLOW IS 9SFL BRN TRYBAC [LESS THAN OR EQUAL TO B'WARDS. 9S^= SBAKCALC 9TDW #SKI K6INSERT>199-199 9TYG TRACE FREADWORD(2),BACKWARD 9WD6 CALL 7 OFLOWBAC [CALCULATE B'WARDS O'FLOW. 9WXQ LDX 2 FX2 9XCB TRYBAC 9XX2 STO 4 AWORK4(2) [STORE OVERFLOW. 9YBL NGN 5 1 [BLOCK MODIFIER 9YW= BRN TRYMERJ 9^*W ) 9^TG #SKI INSB<1$1 =2*6 ( =2SQ LDX 4 FBLMOD(1) [J IF NOT LAST BLOCK =3#B ADN 4 A1-1 =3S2 BXU 4 FREADBLOCK(2),SFORCALC =4?L ) =4R= SONEBLOK =5=W ADN 4 1 [BLOCK =5QG #SKI K6INSERT>199$199 =6=6 TRACE 4,ONEBLOCK =6PQ SETNCORE GSBS,1,FI,INSERT3 =79B STOZ A1(1) [ZEROISE BLOCK FOR TIME BEING =7P2 CALL 6 SFCB3 [-> FCB =88L LDX 2 FPTR(3) [-> FSTACK =8N= CHAIN 1,2 [CHAIN IN FILE CHAIN. =97W LDCT 0 #14 [EMPTY BLOCK & ... =9MG ORS 0 AWORK1(2) [SET "EMPTY BLOCK @ E.O.F" BIT. ==76 CALL 7 SINSERT1 [INSERT BLOCK ( @ END OF FILE ) ==LQ SMO FX2 =?6B STO 2 ACOMMUNE4 [PRESERVE PTR TO INSERT3 BLOCK =?L2 LDX 2 FX2 =#5L LDX 2 ACOMMUNE5(2) =#K= CALL 1 SFFURB =*4W #HAL FI+INSERT1,0 [-> INSERT1 =*JG LDX 3 2 =B46 CALL 6 SFCA2 [-> FCA =BHQ ADX 3 FREADWORD(2) [-> RECORD =C3B SFORCALC =CH2 #SKI K6INSERT>199$199 =D2L TRACE FREADWORD(2),FORWARD =DG= CALL 7 OFLOWFOR [CALCULATE FORWARDS OVERFLOW =D^W LDX 2 FX2 =FFG TRYFOR =F^6 LDCT 0 #40 [SET THE "OVERFLOWING =GDQ ORS 0 AWORK1(2) =GYB LDX 4 AWORK4(2) [X4 = SIZE OF OVERFLOW =HD2 LDN 5 1 [MARKER - GET NEXT BLOCK =HXL # =JC= # HAVING CALCULATED OVERFLOW & DIRECTION WE WANT TO GO, WE NOW =JWW # LOOK TO SEE IF WE WANT TO FIT EXTRA INTO THE CONTIGUOUS BLOCK. =KBG # =KW6 TRYMERJ =L*Q LDCT 0 #20 [IF THE"RINB" IS SET, =LTB ANDX 0 AWORK1(2) [ADD IN THE SIZE OF THE NEW RECORD =M*2 BZE 0 NONEXTB [& IF THE OVERFLOW( + NEW RECORD IF BEING =MSL LDX 0 AWORK3(2) [PUT IN NEXT BLOCK) IS GREATER THAN =N#= SRL 0 15 [THE PARAMETER "X" WE DON'T ATTEMPT TO =NRW ADX 4 0 [READ DOWN THE CONTIGUOUS BLOCK & SHARE I =P?G NONEXTB =PR6 BXGE 4 BSBS,TWONEWBLOX [GO TO INSERTFR IF O'FLOW > GSBS-1 =Q=Q SMO ACOMMUNE5(2) [SET FREADBLOCK TO POINT TO =QQB ADS 5 FREADBLOCK [ADJACENT BLOCK =R=2 CALL 6 SEEKFURB [X3 ->"ADJACENT" BLOCK =RPL BRN YESFUB [IT'S IN CORE =S9= LDX 2 FX2 [OVERWRITTEN. =SNW SMO FX1 =T8G BXGE 4 X,XLESS [JIF EXTRA INTO NEXT BLOCK TOO LARGE =TN6 LDCT 0 #4 =W7Q ANDX 0 AWORK1(2) =WMB BZE 0 NOFUB2 [J IF"EMPTY BL.@ E.O.F."BIT NOT SET. =X72 SMO ACOMMUNE5(2) =XLL SBS 5 FREADBLOCK =Y6= YEMPTYB =YKW LDX 3 ACOMMUNE4(2) [->INSERT3 BLOCK =^5G LDX 2 ACOMMUNE5(2) [-[FCA =^K6 BRN SGOTINS3 ?24Q # ?2JB # THE OVERFLOW IS LESS THAN THE FACTOR X.THIS MEANS THAT WE READ ?342 # DOWN A CONTIGUOUS BLOCK AND TRY TO FIT THE OVERFLOW IN TO IT. ?3HL # ALTERNATIVELY THERE IS AN ADJACENT BLOCK IN CORE,IN WHICH CASE ?43= # WE TRY TO FIT THE EXTRA IN. ?4GW # ?52G TRYFURB ?5G6 CALL 6 SEEKFURB2 [X3 ->BLOCK ?5^Q BRN YESFUB ?6FB NOFUB ?6^2 LDX 2 FX2 ?7DL NOFUB2 ?7Y= LDX 2 AWORK2(2) ?8CW GETAFURB 0(2) [GET THE USAGE BLOCK ?8XG CALL 6 SFCA2 [X2 -> FCA ?9C6 BRN TRYFURB ?9WQ YESFUB ?=BB NAME 3,FI,INSERT3 ?=W2 SBS 5 FREADBLOCK(2) [DOWNDATE FREADBLOCK AGAIN. ??*L SGOTINS3 ??T= ADN 3 A1 [X3 -> BEGINNING OF BLOCK. ?##W CALL 7 SENDBLOCK [X1 -> END OF BLOCK ?#SG NGX 7 1 [X2 CONTAINS THE AMOUNT OF ?*#6 ADX 7 3 [BLOCK USED,NEGATED ?*RQ SBN 3 A1 [X3 -> INSERT3 BLOCK ?B?B SMO FX2 [STORE AMOUNT USED IN INSERT3 BLOCK. ?BR2 # ! NB 'NOT' PLUS A1 ! ?C=L NGS 7 ACOMMUNE4 ?CQ= ADN 7 GSBS-1 [CALCULATE AMOUNT USED ?D9W BXL 7 4,WONTFIT [J IF NOT ENOUGH ROOM. ?DPG LDX 0 7 [X0 CONTAINS THE AREA LEFT AFTER ?F96 SBX 0 4 [MOVING IN THE OVERFLOW ?FNQ SMO FX1 [IF THIS AREA IS LESS THAN A CERTAIN ?G8B BXL 0 PERCENT,NSHAR [NUMBER,WE DON'T SHARE THE BLOCKS ?GN2 LDX 6 FREADWORD(2) [LOAD & PRESERVE FREADWORD. ?H7L # ?HM= # WE CALCULATE THE AVERAGE OF THE DATA SPREAD OVER THE TWO BLOX ?J6W # & ATTEMPT TO SHARE THE DATA IN THE 2 BLOX SO THAT THEY BOTH ?JLG # CONTAIN (ROUGHLY) THE MEDIAN . WE ALSO INSERT THE EXTRA RECORD ?K66 # IN THE GENERAL HURLY-BURLY. ?KKQ # ?L5B LDX 1 FX2 [WE ADD TOGETHER ?LK2 LDX 7 ACOMMUNE4(1) [1) AMT. USED IN INSERT3. ?M4L SHAR2BLOX ?MJ= LDX 0 AWORK3(1) [2) AMT. USED IN INSERT1 + A1 ?N3W ANDN 0 -1 ?NHG ADX 7 0 ?P36 LDEX 0 AWORK1(1) [3) EXTRA WANTED. ?PGQ ADX 7 0 ?Q2B SBN 7 A1 [ SUB A1 ?QG2 SRA 7 1 [DIVIDE BY 2 ?Q^L #SKI K6INSERT>99-99 ?RF= TRACE 7,SMOOTH 2 ?RYW #SKI K6INSERT ?SDG BXGE 7 BSBS,ZGEOER5 [J IO TOTAL TOO LARGE ?SY6 CALL 1 SFFURB [SET X2->INSERT1 BLOCK ?TCQ #HAL FI+INSERT1,0 ?TXB LDX 1 FX2 ?WC2 SBN 6 A1 [FREADWORD-A1 ?WWL LDCT 5 #020 ?XB= LDX 0 AWORK3(1) ?XTW SRL 0 15 ?Y*G ADX 0 6 [FREADWORD]-A1+SIZE OF NEW RECORD ?YT6 BXL 0 BSBS,NRNB ?^#Q ORS 5 AWORK1(1) [NEW REC JUST WON'T FIT IN "CURRENT" ?^SB BRN NSHAR [BLOCK SO SET RINB & DON'T BOTHER TO #2#2 [RE-CALCULATE THE O'FLOW AS WE CAN'T #2RL [ IMPROVE ON IT #3?= NRNB #3QW BXL 6 7,NRNB1 [JIF THE POSITION OF THE INSERTEE OR #4=G [REPLACEE SUGGESTS IT MAY FIT INTO #4Q6 [ THE "CURRENT" BLOCK #59Q ORS 5 AWORK1(1) [SET "RECORD IN NEXT BLOCK" BIT #5PB YRNB #692 #SKI K6INSERT>299-299 #6NL TRACE 4,YRNB #78= LDN 4 0 #7MW BRN NB #87G NRNB1 #8M6 ANDX 5 AWORK1(1) #96Q BNZ 5 YRNB [JIF "R.I.N.B." ALREADY SET #9LB LDEX 4 AWORK1(1) #=62 SBX 0 4 #=KL ADX 2 0 [-> FIRST RECORD AFTER REPLACEE/INSER #?5= ADX 4 0 [= AMOUNT TO BE LEFT(SO FAR) #?JW #SKI K6INSERT>299-299 ##4G TRACE 4,NRNB ##J6 BXGE 4 7,NC [J IF REPLACING NEW LAST REC IN BLOCK #*3Q NB #*HB LDEX 0 A1+FRH(2) [NEXT R.H. #B32 #SKI K6INSERT #BGL BZE 0 ZGEOER11 [ERROR IF E.O.B. #C2= ADX 2 0 [ADD TO PTR. #CFW ADX 4 0 [ADD NEXT R.H.INTO CUMULATIVE TOTAL #C^G #SKI K6INSERT>699-699 [OF DATA TO BE LEFT IN BLOCK #DF6 ( #DYQ TRACE 4,OLOOP #FDB TRACE 0,NEXT O #FY2 ) #GCL BXGE 4 7,NOT2NEWBLOX [J IF SURPASSED AVGE. #GX= BXGE 6 4,NB [IF THE RECORD PTR GOES PAST F'WORD #HBW BZE 5 NB [WITHOUT EXCEEDING AVERAGE, AND RINB #HWG LDX 0 AWORK4(1) [IS SET WE MUST HAVE A VERY LARGE NEW #JB6 BNZ 0 TWONEWBLOX5 [RECORD SO WE GO TO INSERTFR UNLESS #JTQ [ REPLACING LAST REC IN BLOCK #K*B #SKI K6INSERT #KT2 ( #L#L LDCT 0 #10 #LS= ANDX 0 AWORK1(1) #M?W BZE 0 ZGEOER4 #MRG LDCT 0 #200 #N?6 ANDX 0 AWORK1(1) #NQQ BZE 0 ZGEOER4 #P=B ) #PQ2 LDX 2 FX2 #Q9L BRN QFOR #QP= NOT2NEWBLOX #R8W BXGE 4 BSBS,ND [B626 #RNG LDEX 5 A1+FRH(2) #S86 BNZ 5 NC #SMQ ND #T7B SBX 4 0 [SUB LAST R.H. #TM2 NC #W6L # #WL= # WE NOW CONVERT TO CRUDE OVERFLOW. #X5W # #XKG #SKI K6INSERT>299-299 #Y56 TRACE 4,CRUDE O [UNCONVERTED AS YET #YJQ LDX 2 FX2 #^4B LDX 0 AWORK3(2) #^J2 ANDN 0 -1 [SUBTRACT AMT.USED IN INSERT1 BLOCK *23L SBX 4 0 *2H= ADN 4 A1 [+A1 *32W NGX 4 4 [INVERT *3GG LDCT 0 #20 [IF R.I.N.B BIT SET WE DON'T WANT TO *426 ANDX 0 AWORK1(2) [ADJUST OVERFLOW BY SIZE OF NEW RECOR *4FQ BZE 0 NRINB4 [ASIT WAS NEVER ADDED TO THE CRUED *4^B [OVERFLOW *5F2 LDXC 0 AWORK1(2) [J IF INSERT *5YL BCC YRINB4 *6D= ANDN 0 #777 [SUBTRACT SIZE OF RECORD BEING *6XW LDX 7 AWORK3(2) [REPLACED(I.E OLD RECORD FROM *7CG SRL 7 15 [OVERFLOW *7X6 SBX 0 7 *8BQ ADX 4 0 *8WB BRN YRINB4 *9B2 NRINB4 *9TL LDEX 0 AWORK1(2) [ADD IN X1(=0 IF INSERT =SIZE OF REC. *=*= ADX 4 0 [TO BE REPLACED O/W) & "EXTRA"REQU'D. *=SW YRINB4 *?#G #SKI K6INSERT *?S6 BXL 4 AWORK4(2),ZGEOER2 [J IF SMALLER THAN LAST OVERFLOW *#?Q STO 4 AWORK4(2) [STORE. *#RB # **?2 # TRE OVERFLOW HAS BEEN CALCULATED, AND WE KNOW IF THE RECORD **QL # GOES IN THE NEXT BLOCK. *B== # *BPW NSHAR *C9G LDX 2 FX2 *CP6 #SKI K6INSERT>699-699 *D8Q TRACE AWORK4(2),NSHAR *DNB LDCT 0 #10 *F82 ANDX 0 AWORK1(2) [J IF "EMPTY BLOCK" BIT SET *FML BNZ 0 QFOR *G7= NAME 3,FI,INSERT4 [RENAME BLOCK *GLW SMO ACOMMUNE5(2) [SMO BY PTR TO FCA *H6G LDX 4 FREADBLOCK [PICK UP BLOCK READING PTR *HL6 NGN 5 1 *J5Q LDCT 0 #40 *JKB ANDX 0 AWORK1(2) *K52 BZE 0 NOTFOR11 [J IF NOT FORWARD *KJL LDN 5 1 *L4= NOTFOR11 *LHW ADX 4 5 [ADD +/-1 TO GIVE B.N. OF INSERT3 BL. *M3G LDX 5 ACOMMUNE4(2) [PRESERVE ACOM4 OVER COORDINATING S/R *MH6 CALL 7 SCAREFULA [DO CAREFUL UPDATING *N2Q NAME 2,FI,INSERT3 [FOR INDEX,SILLY IT *NGB LDX 3 2 *P22 LDX 2 FX2 *PFL STO 5 ACOMMUNE4(2) *P^= QFOR *QDW LDCT 0 #40 *QYG ANDX 0 AWORK1(2) *RD6 BNZ 0 POINTFOR *RXQ GEOERR 1,MARK7 *SCB POINTFOR *SX2 # *TBL # 1) WE HAVE CALCULATED THE OVERFLOW,WHICH ON ENTRY HERE IS FORWARDS. *TW= # IF WE ARE SHARING 2 PART-FULL BLOX,WE MOVE DOWN THE INSERT3 BLOCK *W*W # IF B5 OF AWORK1 IS SET,THE INSERT3 BLOCK IS EMPTY. *WTG # *X*6 # 2) WE THEN CALCULATE A POINTER TO THE FIRST WORD OF THE AREA(IN THE *XSQ # INSERT1 BLOCK) WHICH WE WISH TO MOVE *Y#B # *YS2 # 3) IF THE "R.I.N.B" BIT (B4 OF AWORK1) IS SET(THIS MEANS THE INSERTEE *^?L # [OR REPLACEE] GOES INTO THE INSERT3 BLOCK),WE GO TO LABEL "RINBY" *^R= # B2=W # 4) O/W WE MOVE ACROSS THE OVERFLOW& RENAME THE INSERT3 BLOCK A FILE/ B2QG # FUWB.WE THEN MOVE DOWN THE BOTTOM SLIVER OF THE INSERT1 BLOCK, B3=6 # MOVE IN THE NEW RECORD,UPDATE FREADWORD(& CMOD IF APPROPRIATE) B3PQ # RENAME THE INSERT1 BLOCK A FUWB & GO UP. B49B # B4P2 # 5) AT "RINBY" LABEL WE HAVE TO MOVE ACROSS A "SANDWICH" OF OVERFLOW, B58L # CONSISTING OF THE NEW RECORD EMBEDDED IN A MASS OF OLD DATA.EITHER B5N= # THE TOP OR THE BOTTOM OF THE SANDWICH MAY BE NULL. B67W # B6MG STO 3 ACOMMUNE2(2) [STORE PTR TO BLOCK B776 ADN 3 A1 [MOVE DATA DOWN FROM TOP OF BLOCK B7LQ LDN 1 0 B86B LDCT 0 #20 B8L2 ANDX 0 AWORK1(2) [J IF "RINB" NOT SET B95L BZE 0 NRINBY1 B9K= LDX 1 AWORK3(2) [SIZE OF NEW RECORD. B=4W SRL 1 15 B=JG NRINBY1 B?46 ADX 1 AWORK4(2) [+AMOUNT BEING DISPLACED INTO INSERT3 B?HQ STO 1 ACOMMUNE6(2) [STORE AMOUNT EXTRA TO BE MOVED INTO B#3B [INSERT3 BLOCK IN ACOMMUNE6. B#H2 LDEX 0 FRH(3) B*2L BNZ 0 YMVDOWN [J IF BLOCK NOT EMPTY B*G= SMO 1 [ZEROISE WORD AFTER AS LAST WORD IN B*^W STOZ 0(3) [BLOCK BBFG BRN NMVDOWN BB^6 YMVDOWN BCDQ LDX 0 ACOMMUNE4(2) [EMOUNT USED IN INSERT3 BLOCK BCYB CALL 7 MOVEDOWNB [MOVE INSERT3 BLOCK'S CONTENTS DOWN BDD2 NMVDOWN BDXL CALL 1 SFURB [X2-> INSERT1 BLOCK BFC= #HAL FI+INSERT1,0 BFWW STO 2 6 [& X6 BGBG LDX 1 FX2 BGW6 STO 6 ACOMMUNE4(1) [STORE PTR TO INSERT1 BLOCK BH*Q LDX 0 AWORK3(1) BHTB ANDN 0 -1 [ADD AMOUNT USED IN INSERT1 BLOCK. BJ*2 ADX 2 0 BJSL SBX 2 AWORK4(1) [SUB AREA TO BE MOVED OUT. BK#= # X2 CONTAINS AN ABSOLUTE PTR TO THE START OF THE AREA TO BE MOVED BKRW # INTO THE INSERT3 BLOCK BL?G LDCT 0 #20 [J IF "RECORD IN NEXT BLOCK BIT" SET BLR6 ANDX 0 AWORK1(1) BM=Q BNZ 0 RINBY BMQB # THE INSERTEE/REPLACEE REMAINS IN THE INSERT1 BLOCK IN THIS PATH BN=2 SMO AWORK4(1) [MOVE OVERFLOW ACROSS BNPL MOVE 2 0 [TO THE INSERT3 BLOCK BP9= LDX 3 6 [WE'VE FINISHED WITH THE INSERT3 BLK. BPNW LDX 2 ACOMMUNE5(1) [-> FCA BQ8G ADX 3 FREADWORD(2) [X3 -> POSITION INTO WHICH WE WISH TO BQN6 LDX 0 AWORK3(1) [MOVE NEW RECORD BR7Q ANDN 0 -1 BRMB SBX 0 FREADWORD(2) [X0 CONTAINS THE AREA AFTER THE POS- BS72 SBX 0 AWORK4(1) [ITION OF THIS RECORD,THAT HAS TO BE BSLL BNZ 0 YMOVD [MOVED DOWN THE BLOCK.J IF NON-ZERO BT6= LDX 0 AWORK3(1) BTKW SRL 0 15 [SIZE OF NEW RECORD BW5G SMO 0 BWK6 STOZ 0(3) [ZEROISE NEW LAST WORD IN BLOCK. BX4Q BRN NOMOVD BXJB YMOVD BY42 LDEX 1 AWORK1(1) [DISTANCE TO BE MOVED DOWN BLOCK. BYHL CALL 7 MOVEDOWNB [DO THE TRICKY STUFF. B^3= NOMOVD B^GW MHUNTW 2,FILE,FWB [FIND NEW RECORD C22G ADN 2 A1 C2G6 SMO 0(2) C2^Q MOVE 2 0 [MOVE IT IN. C3FB LDX 1 FX2 C3^2 LDX 0 AWORK1(1) C4DL BNG 0 YREP3 [J IF REPLACE C4Y= LDEX 0 0(2) C5CW SMO ACOMMUNE5(1) C5XG ADS 0 FREADWORD [UPDATE FREADWORD C6C6 YREP3 C6WQ NGN 7 A1-2 C7BB UPDATCMOD C7W2 LDX 2 ACOMMUNE5(1) [-> FCA C8*L PSTAC 3,2 C8T= BFCBX 3,3 [-> FCB C9#W ADX 7 FREADBLOCK(2) C9SG SBX 7 FBLMOD(3) [IS INSERT3 BLOCK LAST BLOCK ? C=#6 BNZ 7 NOCHCMOD [J IF NOT C=RQ LDX 0 CMOD(3) C??B BNG 0 NOCHCMOD C?R2 LDCT 7 #14 [J IF "EMPTY BLOCK" BITS NOT SET FOR C#=L ANDX 7 AWORK1(1) [J IF "EMPTY BLOCK"BITS NOT SET FOR C#Q= [WE CAN CALCULATE CMOD C*9W BZE 7 NONEGCM [SET,WE CAN'T C*PG NGS 7 CMOD(3) CB96 BRN NOCHCMOD CBNQ NONEGCM CC8B LDX 0 ACOMMUNE6(1) [EXTRA PUT INTO INSERT3 BLOCK. CCN2 ADS 0 CMOD(3) [UPDATE CMOD CD7L NOCHCMOD CDM= NGS 3 CMOD(3) [WE WILL RECALCULATE CMOD CORRECTLY O CF6W [CURRENTLY THERE IS A PATH THAT GOES CFLG SETREP OK [DEFAULT OK CG66 LDX 0 FBLMOD(3) CGKQ SBN 0 GSBS-1-FNEARLY-FBLKS CH5B BNG 0 NOTFN2 [CHECK FOR FNEARLY CHK2 #SKI K6INSERT>99-99 CJ4L TRACE FBLMOD(3),FNEARLY CJJ= SETREP FNEARLY CK3W NOTFN2 CKHG LDN 0 #77 CL36 ANDX 0 FINFC(3) CLGQ BZE 0 RENAMEW [J IF NOT INDEXED FILE CM2B ACROSS INDEX,2 CMG2 RENAMEW CM^L LDX 2 ACOMMUNE2(1) CNF= NAME 2 ,FILE,FUWB CNYW LDX 1 ACOMMUNE4(1) [PTR TO INSERT1 BLOCK CPDG NAME 1,FILE,FUWB [RENAME FOR CORE UNJAMMER CPY6 UP CQCQ # CQXB # HERE WE HAVE TO MOVE THE "SANDWICH" INTO THE INSERT3 BLOCK. CRC2 # CRWL # ON ENTRY HERE X2 -> CONTAINS AN ABS. PTR. TO THE START OF THE AREA CSB= # TO BE MOVED INTO THE INSERT3 BLOCK CSTW # X1 = FX2, X6 -> INSERT1 BLOCK,X3 ->START OF DATA IN INSERT3 BLOCK. CT*G # CTT6 RINBY CW#Q LDXC 0 AWORK1(1) [X2 IS WHAT WE WANT FOR INSERT CWSB BCC NREP18 [BUT NOT FOR REPLACE CX#2 ANDN 0 #777 [FOR REPLACE WE SUBTRACT CXRL LDX 7 AWORK3(1) [THE SIZE OF THE OLD RECORD CY?= SRL 7 15 [FROM THE X2 POINTER CYQW SBX 0 7 C^=G ADX 2 0 C^Q6 NREP18 D29Q LDX 0 2 [CALCULATE VOLUME UN-TOUCHED BY MOVE D2PB SBX 0 6 [FROM INSERT1 BLOCK(+A1) & STORE IN D392 STO 0 ACOMMUNE3(1) [ACOMMUNE3. D3NL SMO ACOMMUNE5(1) [-> FCA D48= SBX 0 FREADWORD [GIVES SIZE OF TOP OF "SANDWICH" D4MW NGX 0 0 [INVERTED D57G #SKI K6INSERT>199-199 D5M6 TRACE 0,TOPSWICH D66Q BZE 0 NOTOPSWCH [J IF NULL D6LB #SKI K6INSERT D762 BNG 0 ZGEOER12 D7KL SMO 0 D85= MOVE 2 0 [MOVE ACROSS TOP OF S'WICH D8JW ADX 2 0 D94G ADX 3 0 [UPDATE TO & FROM PTRS D9J6 NOTOPSWCH D=3Q SMO ACOMMUNE5(1) [PRESERVE FREADWORD (INVERTED) D=HB NGX 5 FREADWORD D?32 LDX 7 AWORK1(1) D?GL BPZ 7 NSETRP [J IF INSERT D#2= ADN 0 A1 D#FW SMO ACOMMUNE5(1) D#^G STO 0 FREADWORD [RECORD PTR @ REPLACED RECORD D*F6 LDN 0 1 D*YQ SMO ACOMMUNE5(1) [BLOCK PTR @ INSERT3 BLOCK DBDB ADS 0 FREADBLOCK DBY2 NSETRP DCCL LDX 4 2 [SAVE DCX= MHUNTW 2,FILE,FWB DDBW ADN 2 A1 DDWG SMO 0(2) DFB6 MOVE 2 0 [MOVE IN NEW RECORD. DFTQ ADX 3 0(2) [UPDATE "TO" PTR. DG*B LDX 0 AWORK3(1) DGT2 ANDN 0 -1 DH#L ADX 5 0 [-FREADWORD+AMOUNT USED IN INSERT1 DHS= [BLOCK= BOTTOM HALF OF SANDWICH DJ?W LDX 2 4 [PICK UP PTR TO DJRG LDX 7 AWORK1(1) [IF REPLACE,HAVE TO OMIT REPLACEE, DK?6 BPZ 7 NOSUBREC [SO WE SUB. FROM AMOUNT MOVED & ADD DKQQ SBX 5 0(2) [TO "FROM PTR,THE SIZE OF THE REPLACE DL=B #SKI K6INSERT>599-599 DLQ2 TRACE 0(2),SIZE REP DM9L ADX 2 0(2) [ADD TO"FROM"PTR. DMP= NOSUBREC DN8W #SKI K6INSERT>199-199 DNNG TRACE 5,BOTSWCH DP86 BZE 5 NBOTSWCH DPMQ #SKI K6INSERT DQ7B BNG 5 ZGEOER13 DQM2 SMO 5 [O/W MOVE IT ACROSS. DR6L MOVE 2 0 DRL= NBOTSWCH DS5W LDCT 0 #14 [J IF NOT NEW BLOCK DSKG ANDX 0 AWORK1(1) DT56 BZE 0 NOSTOZ DTJQ SMO 5 [O/W ZEROISE LAST WORD IN BLOCK DW4B STOZ 0(3) DWJ2 NOSTOZ DX3L LDX 2 6 [ZEROISE WORD AT TOP OF TOP HALF OF DXH= SMO ACOMMUNE3(1) [SANDWICH-NOW LAST WORD IN INSERT1 DY2W STOZ 0(2) [BLOCK. DYGG LDX 0 AWORK1(1) D^26 BNG 0 NOSETRP [J IF REPLACE D^FQ SBX 3 ACOMMUNE2(1) [-> INSERT3 D^^B SMO ACOMMUNE5(1) [SET INSERT PTRS NOW! F2F2 STO 3 FREADWORD [READ RECORD PTR. @ RECORD AFTER F2YL LDN 0 1 [INSERTEE. F3D= SMO ACOMMUNE5(1) [BLOCK PTR @ NEXT BLOCK(INSERT3) F3XW ADS 0 FREADBLOCK [ F4CG NOSETRP F4X6 NGN 7 A1-1 F5BQ BRN UPDATCMOD F5WB # F6B2 # EXIT IF OVERFLOW > GSBS ! F6TL # F7*= TWONEWBLOX5 F7SW LDEX 5 AWORK1(1) F8#G ADX 5 0 F8S6 BXL 5 BSBS,NSHAR F9?Q TWONEWBLOX4 F9RB LDCT 0 #14 [IF ISERT3 BLOCK NOT A FUWB,FREE IT F=?2 ANDX 0 AWORK1(1) [UNLESS OW BLOCK BIT(2) SET F=QL BNZ 0 TWONEWBLOX F?== TWONEWBLOX3 F?PW LDCT 0 2 F#9G ANDX 0 AWORK1(1) F#P6 BNZ 0 SNAME4 F*8Q FREECORE 3 [FREE EX-FURB F*NB BRN TWONEWBLOX FB82 SNAME4 FBML NAME 3,FILE,FUWB [RENAME SO IT GETS BACKWRITTEN FC7= TWONEWBLOX FCLW ACROSS INSERTFR,1 FD6G # FDL6 # EXIT WHEN WE HAVE CURRENT BLOCK + CONTIGUOUS BLOCK,+ OVERFLOW FF5Q # WHICH WON'T FIT. WE HAVE TO SMOOTH THESE THREE. FFKB # FG52 WONTFIT FGJL #SKI K6INSERT>199$199 FH4= TRACE 7,WONTFIT FHHW BXL 4 BSBS,TLESS FJ3G LDX 1 FX2 FJH6 BRN TWONEWBLOX3 FK2Q TLESS FKGB SMO FX1 [J IF SPARE SPACE IN INSERT3 BLOCK IS FL22 BXL 7 PERCENT,THREE [LESS THAN 30%. FLFL # THERE ISN'T MUCH POINT IN TRYING TO SMOOTH 3 BLOCKS IN THIS CASE, FL^= # AS THE THIRD IS ALREADY IN A PERFECT STATE. FMDW LDCT 0 #2 FMYG SMO FX2 FND6 ANDX 0 AWORK1 [IF BLOCK WAS ORIGINALLY A FUWB,DON'T FNXQ BNZ 0 SNAME [FREECORE IT FPCB FREECORE 3 [RID OF INSERT3 BLOCK FPX2 BRN XLESS1 FQBL SNAME FQW= NAME 3,FILE,FUWB [RENAME BLOCK,SO THAT IT EVENTUALLY FR*W BRN XLESS1 [GETS BACKWRITTEN. FRTG THREE FS*6 LDX 2 FX2 FSSQ LDX 0 ACOMMUNE4(2) [STORE AMT.USED IN INSERT3 FT#B ADN 0 A1 FTS2 STO 0 AWORK4(2) [FOR INSERTHR CH. FW?L ACROSS INSERTHR,1 FWR= # FX=W # FXQG # FY=6 # INFORMATION HELD IN REGISTERS FYPQ # ON ENTRY:- F^9B # AWORK3 = AMOUNT OF SPACE USED IN INSERT1 BLOCK +A1 F^P2 # G28L XLESS G2N= #SKI K6INSERT>199$199 G37W TRACE 4,XLESS G3MG SMO ACOMMUNE5(2) G476 SBS 5 FREADBLOCK G4LQ LDCT 0 #14 G56B SMO FX2 G5L2 ANDX 0 AWORK1 G65L BNZ 0 YEMPTYB [J IF"EMPTY BLOCK" BITS SET G6K= XLESS1 G74W SETNCORE GSBS,1,FI,INSERT3 [SETUP FI/INSERT3 BL.FOR"SINSERT" S/R G7JG STOZ A1+FRH(1) [S/R & ZEROISE 1ST R.H. G846 LDCT 0 #30 [SET"EMPTY BLOCK"BIT G8HQ ORS 0 AWORK1(2) G93B LDCT 0 #20 [& UNSET "R.I.N.B" BIT G9H2 ERS 0 AWORK1(2) G=2L CALL 6 SFCA2 [X2 -> FCA G=G= LDX 4 FREADBLOCK(2) G=^W BNG 5 NOADD1 [J IF 'BACKWARD' G?FG ADN 4 1 [X4 NOW POINTS TO THE BLOCK NUMBER G?^6 NOADD1 [BEFORE WHICH WE WISH TO INSERT A G#DQ PSTAC 2,2 G#YB CHAIN 1,2 [CHAIN NEW BLOCK IN G*D2 CALL 7 SINSERT1 [NEW BLOCK. G*XL LDX 3 2 [SERT3 BLOCK) GBC= CALL 6 SFCA2 [-> FCA GBWW LDX 6 FREADWORD(2) [LOAD OEAD WD. PTR GCBG LDX 1 FX2 GCW6 LDN 7 0 GD*Q STO 7 ACOMMUNE4(1) [AMT. "USED" IN INSERT3 BLOCK GDTB BRN SHAR2BLOX GF*2 # GFSL SFULL GG#= ACROSS INSERTFR,2 GGRW # GH?G [ GHR6 MENDAREA K6INSERT/5<100>30,K99INSERTWO GJ=Q #END ^^^^ ...77104235000400000000