{{htmlmetatags>metatag-description:(ICL George 3 and George 4 source: INSERTWO6)}}
====== INSERTWO6 ======
(George Source)
**Macros used:** [[george:macro:ACROSS|ACROSS]], [[george:macro:ADDSKIP|ADDSKIP]], [[george:macro:ALTLEN|ALTLEN]], [[george:macro:BFCBX|BFCBX]], [[george:macro:BLOCK|BLOCK]], [[george:macro:BXE|BXE]], [[george:macro:BXGE|BXGE]], [[george:macro:BXL|BXL]], [[george:macro:BXU|BXU]], [[george:macro:CHAIN|CHAIN]], [[george:macro:DOWN|DOWN]], [[george:macro:FREEBACK|FREEBACK]], [[george:macro:FREECORE|FREECORE]], [[george:macro:GEOERR|GEOERR]], [[george:macro:GETAFURB|GETAFURB]], [[george:macro:GETBACK|GETBACK]], [[george:macro:JBC|JBC]], [[george:macro:MAPBCH|MAPBCH]], [[george:macro:MAPBSE|MAPBSE]], [[george:macro:MBS|MBS]], [[george:macro:MENDAREA|MENDAREA]], [[george:macro:MHUNTW|MHUNTW]], [[george:macro:NAME|NAME]], [[george:macro:PSTAC|PSTAC]], [[george:macro:SEGENTRY|SEGENTRY]], [[george:macro:SETNCORE|SETNCORE]], [[george:macro:SETREP|SETREP]], [[george:macro:SFSTACK|SFSTACK]], [[george:macro:SFUB|SFUB]], [[george:macro:TESTREP|TESTREP]], [[george:macro:TRACE|TRACE]], [[george:macro:UP|UP]]
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