22FL SEG RAND,,FILE 22^= [ 23DW [ THIS CHAPTER IMPLEMENTS THE RANDOM ACCESS MACROS READED & WRITED. 23YG [ REF G.I.M. 5.6 24D6 [ 24XQ SEGENTRY K1RAND,READED [READED MACRO ENTRY POINT 25CB SEGENTRY K2RAND,WRITED [WRITED MACRO ENTRY POINT 25X2 [ 26BL FILETRAN [SUBROUTINES FOR FILEAUTW & FILEREAD 26W= [ 27*W SEEKFULLB [GET POINTER TO FULLB IN FILE CHAIN IN X1 GIVEN X2->FCB 27TG [ EXIT+0 IF NOT FOUND: EXIT+1 IF FOUND: LINK X7 28*6 [ X0 DESTROYED: X2-X6 UNALTERED 28SQ LDX 1 FPTR(2) [X1->FSTACK 29#B SFULLB 29S2 LDX 1 FPTR(1) [X1->NEXT BLOCK 2=?L BXE 1 CXFI,(7) [EXIT OF END OF FILE CHAIN 2=R= LDX 0 ATYPE(1) 2?=W BXE 0 FFSFCB,(7) [EXIT IF NEXT FCB 2?QG BXU 0 FFSFULLB,SFULLB [GO BACK IF NOT FULLB 2#=6 LDX 0 A1+1(1) [PICK UP RESIDENCE NUMBER 2#PQ BXU 0 BSPRE(2),SFULLB [GO BACK IF WRONG FULLB 2*9B EXIT 7 1 [OK 2*P2 [ 2B8L [ 2BN= READED 2C7W [ [ENTRY FROM READED MACRO 2CMG [ 2D76 LDN 4 0 [=> READED MACRO 2DLQ LDX 7 ACOMMUNE7(2) [%C= TRANSFER LENGTH IN WORDS 2F6B JMBS OKM,FILERING(2),BAMREAD,BAMREADR,BAMWRITE,BAMGEN,BAMCLEAN 2FL2 BRN (GEOERR) [FILE NOT OPEN IN SUITABLE MODE 2G5L [ 2GK= WRITED 2H4W [ [ENTRY FROM WRITED MACRO 2HJG [ 2J46 LDN 4 1 [X4 NON-ZERO => WRITED MACRO 2JHQ JMBAC (GEOERR),FILERING(2),BAMWRITE,BAMGEN [J UNLESS OPEN FOR R 2K3B [ 2KH2 OKM 2L2L LDX 5 ACOMMUNE8(2) [BUCKET NUMBER 2LG= SBN 5 1 2L^W BNG 5 (GEOERR) [BUCKET NUMBER NEGATIVE OR ZERO 2MFG LDX 3 ACOMMUNE9(2) [BUCKET SIZE (MUST BE 1,2 OR 4) 2M^6 SRL 3 1 [=> 0,1 OR 2 2NDQ SLL 5 7(3) [CONVERT BUCKET NUMBER TO WORDS 2NYB LDEX 6 5 [X6 HAS ODD BLOCKLETS*128 2PD2 SRL 5 GSBSLOG [BLOCK MOD. 2PXL SRC 6 9 [BLOCKLET MOD TO B0/1 FOR FILETRAN 2QC= TOPFCB2 2 2QWW ADN 5 FBLKS [TURN BLOCK MOD INTO FREADBLOCK FORMA 2RBG LDX 0 5 2RW6 SBN 0 A1 [TURN INTO FBLMOD FORMAT 2S*Q BXL 0 FUSEBL(2),ZEC2 [J IF WITHIN LIMIT OF ALLOCATED BLOCK 2STB ADN 0 1 2T*2 LDX 1 FSIZE(2) [MAXIMUM PERMITTED SIZE IN BLOCKS 2TSL ADN 1 FBLKS-A1 2W#= BXGE 1 0,ZEC1 [J IF MAY GET BLOCKS 2WRW SETREP OVERFILE 2X?G UP 2XR6 [ 2Y=Q [ 2YQB ZEC1 2^=2 BZE 4 ZEC5 [J IF READED - NORIT CASE 2^PL LDX 7 0 329= SBX 0 FUSEBL(2) [GIVES EXTRA BLOCKS REQUIRED 32NW SMO FX2 338G STO 0 AWORK2 33N6 LDX 3 2 347Q ALTLEN 3,7 [ENSURE ROOM FOR EXTRA BLOCKS IN FCB 34MB LDX 3 AWORK2(2) 3572 SBX 5 3 [->LAST USED BLOCK POSITION 35LL ADN 5 1 [->FIRST UNUSED BLOCK POSITION 366= ADN 3 2 [FOR EMPTYB RECORD HEADER 36KW SETUPCOR 3,1,BSTB,EMPTYB 375G STO 3 A1(1) 37K6 [ 384Q MOVED [LOOP BACK LABEL IF FILE COPIED DURING GETBAX 38JB [ 3942 TOPFCB2 2 39HL LDX 7 BSPRE(2) 3=3= STO 7 A1+1(1) [RESIDENCE NO. IN EMPTYB 3=GW GETBAX 3?2G TOPFCB2 2 3?G6 BXE 7 BSPRE(2),ZEC11 [J IF NOT COPIED 3?^Q FREEBAX [GIVE IT BACK 3#FB MHUNTW 1,BSTB,EMPTYB 3#^2 BRN MOVED [FILE MOVED : TRY AGAIN 3*DL [ 3*Y= ZEC11 3BCW MHUNTW 1,BSTB,FULLB 3BXG ADN 1 A1+2 [X1->NEW BLOCKS 3CC6 ADX 2 5 [X5->SPACE IN FCB 3CWQ MOVE 1 510(3) [[X3]-2 BLOCKS MOVED 3DBB SBN 1 A1+2 3DW2 FREECORE 1 [FULLB 3F*L TOPFCB2 2 3FT= SBN 3 2 [NO OF NEW BLOCKS 3G#W JBC NOTCARE,2,BFCARE [J UNLESS CAREFUL FILE 3GSG LDX 0 FBLMOD(2) 3H#6 SBN 0 BSPRE-A1 [POSN TO INSERT BITS 3HRQ MAPBIN 0,,3 [EXTEND FMAPP BY [X3] BITS 3J?B TOPFCB2 2 3JR2 NOTCARE 3K=L ADS 3 FUSEBL(2) [UPDATE FUSEBL 3KQ= LDX 0 FUSEBL(2) [FOR FBLMOD UPDATE 3L9W ADX 5 3 3LPG SBN 5 1 [RECOVER FREADBLOCK POINTER 3M96 BRN UPCUBS 3MNQ [ 3N8B ZEC2 3NN2 BXL 0 FBLMOD(2),ZEC40 [J IF WITHIN LIMIT OF WRITTEN BLOCKS 3P7L BZE 4 ZEC5 [J IF READ - NORIT CASE 3PM= ADN 0 1 3Q6W UPCUBS 3QLG SBX 0 FBLMOD(2) [GIVES FBLMOD INCREMENT 3R66 LDX 3 0 3RKQ INCRECUB FORCED,,3 [UPDATE CUBS FORCIBLY 3RTJ ... TOPFCB2 2 3S5B ADS 3 FBLMOD(2) [UPDATE FBLMOD 3SK2 [ 3T4L ZEC40 3TJ= ADX 5 6 [ADD BLOCKLET MOD INTO FREADBLOCK POI 3W3W BZE 4 READ [J IF READ 3WHG MBS 2,BFALTR,BFALTB 3X36 JBC NOTCAREFUL,2,BFCARE [J UNLESS CAREFUL 3XGQ BNZ 6 WRONGCARE [J IF NOT STARTING ON BLOCK BOUNDARY 3Y2B MHUNTW 3,FILE,FRWB 3YG2 LDX 0 ALOGLEN(3) 3Y^L BXE 0 BSBS,WHOLEBLOCK [J IF NOT WHOLE BLOCK TRANSFER 3^F= WRONGCARE 3^YW GEOERR 1,CAREFUL? [CODE CAN ONLY DEAL WITH SIMPLE 42DG [CASES. SUFFICIENT FOR IDF UPDATING 42Y6 [WHICH IS ONLY CAREFUL RANDOM FILE 43CQ [(LEXICON HAS OWN UPDATE CODE) 43XB WHOLEBLOCK 44C2 LDX 3 5 [FREADBLOCK TYPE POINTER 44WL SBN 3 BSPRE [GET BL NO REL BSPRE 45B= MAPBCH 3,2 [CHECK FMAPP BIT 45TW BNZ 0 NOTCAREFUL [J IF BLOCK ALREADY SWAPPED 46*G TOPFCB2 2 46T6 CALL 7 SEEKFULLB [GET X1->FULLB 47#Q BRN SETUPFULLB [J IF NOT FOUND 47SB LDX 7 ALOGLEN(1) 48#2 ADN 7 1 48RL LDX 6 1 49?= ALTLEN 6,7 [LENGTHEN BY 1 FOR SWAPPED BLOCK 49QW BRN TRYAGAIN 4==G [ 4=Q6 SETUPFULLB 4?9Q SETNCORE 3,1,BSTB,FULLB [REDTAPE+1 FOR SWAPPED BLOCK 4?PB LDN 0 2 4#92 STO 0 A1(1) [RECORD HEADER(=NO BLOCKS) 4#NL TOPFCB2 2 4*8= LDX 0 BSPRE(2) 4*MW STO 0 A1+1(1) [RESIDENCE NUMBER 4B7G LDX 0 FFSFMAPP 4BM6 SFMAPP 4C6Q LDX 2 FPTR(2) [NEXT BLOCK FROM FCB 4CLB BXU 0 ATYPE(2),SFMAPP [J BACK UNLESS FMAPP 4D62 CHAIN 1,2 [CHAIN NEW FULLB ON FPTR OF FMAPP 4DKL [ 4F5= TRYAGAIN 4FJW TOPFCB2 2 4G4G LDX 6 BSPRE(2) 4GJ6 GETBACK 6 4H3Q LDX 7 ACOMMUNE7(2) [LOAD BLOCK NO OBTAINED BY GETBACK 4HHB TOPFCB2 2 4J32 BXE 6 BSPRE(2),UNCHANGED [J UNLESS COPYFILE HAS MOVED FILE 4JGL FREEBACK 6,7 [GIVE IT BACK 4K2= BRN TRYAGAIN 4KFW [ 4K^G UNCHANGED 4LF6 SMO 5 4LYQ LDX 6 0(2) [PICK UP OLD BLOCK NUMBER 4MDB SMO 5 4MY2 STO 7 0(2) [REPLACE WITH NEW BLOCK 4NCL CALL 7 SEEKFULLB 4NX= BRN (GEOERR) [WAS THERE A MOMENT AGO! 4PBW SMO A1(1) 4PWG STO 6 A1(1) [PUT SWAPPED BLOCK ON END OF RECORD 4QB6 LDN 0 1 4QTQ ADS 0 A1(1) [INCREMENT RECORD HEADER 4R*B MAPBSE 3,2 [MARK BLOCK SWAPPED 4RT2 [ 4S#L NOTCAREFUL 4SS= [ 4T?W MHUNTW 3,FILE,FRWB [FIND BUFFER 4TRG LDX 6 ALOGLEN(3) [PICK UP DATA LENGTH 4W?6 CHAIN 3,FX2 [CHAIN BUFFER IN FRONT OF ACTIVITY 4WQQ ... FILEAUTW ,FREE+FAIL,EX6,5,,,NOCHECK 4X=B BRN OVER 4XQ2 [ 4Y9L READ 4YP= ... FILEREAD ,FAIL,EX7,5,,,NOCHECK 4^8W MHUNTW 1,BSTB,BREAD [FIND READ BUFFER 4^NG NAME 1,FILE,FRRB [ & RENAME IT 5286 OVER 52MQ SETREP2 OK 537B UP 53M2 [ 546L [ 54L= ZEC5 [BUCKET NUMBER WITHIN FILE BUT BLOCK NOT WRITTEN 555W SETUPCOR 7,1,FILE,FRRB [SET UP BUFFER OF REQUESTED LENGTH 55KG SETREP2 NORIT 5656 STOZ A1(1) [ & ZEROISE IT 56JQ ADN 1 A1 574B LDN 2 1(1) 57J2 SMO 7 583L MOVE 1 511 [[X7]-1 WORDS 58H= UP 592W [ 59GG #END ^^^^ ...544745000001