16 22FL #SEG READFILE7 [JUDY BIDGOOD. 15 22_= #OPT K0READFILE=K0ACCESS>K0FILESTORE>K0ALLGEO 7 23DW #LIS K0READFILE 15 23YG #OPT K6READFILE=K6ACCESS>K6FILESTORE>K6ALLGEO 7 24D6 8HREADFILE 4 24XQ # 11 25CB SEGENTRY K1READFILE,NZREAD 11 25X2 SEGENTRY K2READFILE,STEP 12 26BL SEGENTRY K3READFILE,STEPAGAIN 12 26W= SEGENTRY K5READFILE,SHUFFLED 11 27*W SEGENTRY K7READFILE,WAITED 11 27TG ... SEGENTRY K9READFILE,VSKIP 11 28*6 SEGENTRY K21READFILE,ZREAD 11 28SQ SEGENTRY K22READFILE,ZSTEP 13 29#B SEGENTRY K23READFILE,ZSTEPAGAIN 4 29S2 # 18 2=?L # IMPLEMENTS MACROS WHOSE ENTRY POINTS ARE AS FOLLOWS :- 9 2=R= # K1 - 'READ' 12 2?=W # K21 - ^ (ZERO DEPTH) 18 2?QG # K2 - 'STEP' (GETTING A BLOCK FROM BACKING STORE 12 2#=6 # K22 - ^ (ZERO DEPTH 10 2#PQ # K3 - 'STEPAGAIN' 13 2*9B # K23 - ^ (ZERO DEPTH) 4 2*P2 # 20 2B8L # TO DEAL WITH COMMUNICATION AND D.C. FILES,SEGMENT COMMFILE IS 21 2BN= # ENTERED FROM READFILE.RE-ENTRY TO READFILE IS MADE AT ENTRY PTS 7 2C7W # K5 AND K7. 4 2CMG # 17 2D76 # THE SEGMENT IS IMPLEMENTED USING FILESTORE RINGS 4 2DLQ # 20 2F6B # ALL FILES OPEN HAVE AN FCB IN THE FILE CHAIN. NEXT TO THIS FCB 21 2FL2 # THERE IS A FILE/FSTACK BLOCK CONTAINING AN ENTRY FOR EACH ACTIVITY 11 2G5L # THAT HAS THE FILE OPEN. 16 2GK= # THIS ENTRY IS 'FELLEN'(CURRENTLY=7 WDS) LONG 21 2H4W # EACH ENTRY IN THE STACK IS RINGED TO THE ACTIVITY THAT IT REPRESE 21 2HJG # AND THE NTH ELEMENT ALONG THE RING REPRESENTS THE FILE OPEN AT 7 2J46 # DEPTH N 10 2JHQ # THE ENTRY LOOKS LIKE: 17 2K3B # WORD 1 FPTRF :FORWARD POINTER ALONG RING 17 2KH2 # WORD 2 BPTRF :BACKWARD POINTER ALONG RING 21 2L2L # WORD 3 FBACKPOINT :RELATIVE BACKWARD POINTER TO START OF FSTACK 21 2LG= # WORD 4 FREADBLOCK :POINTER TO NUMBER OF CURRENT BLOCK BEING READ 21 2L_W # WORD 5 FREADWORD : ^ ^ ^ ^ ^ RECORD ^ ^ 21 2MFG # WORD 6 FGENERAL1 :(OLD FCA5 WORD) ALLPURPOSE WORD,BITS SET HAVE 21 2M_6 # WORD 7 FGENERAL2 :SPECIAL MEANINGS FGENERAL2 IS FOR EXPANSION 4 2NDQ # 10 2NYB # USES OF AWORK WORDS 4 2PD2 # 11 2PXL # AWORK3 : INITIALLY ZERO 15 2QC= # USED AS SWITCH DURING CFS CODING 4 2QWW # 12 2RBG # AWORK4 : ZERO IF STEP ENTRY 12 2RW6 # CONTAINS 1 IF READ 13 2S*Q # CONTAINS 2 IF STEPAGAIN 4 2STB # 10 2T*2 # USES OF ACOMMUNE WORDS 4 2TSL # 18 2W#= # ACOMMUNE1 : CONTAINS FILE DEPTH FOR ENTRY TO COMMFILE 17 2WRW # ACOMMUNE2 : CONTAINS CMOD FOR ENTRY TO COMMFILE. 21 2X?G # ACOMMUNE3 : CONTAINS VALUE OF AWORK3 SWITCH FOR ENTRY TO COMMFILE 17 2XR6 # ACOMMUNE4 : CONTAINS FBLMOD FOR ENTRY TO COMMFILE. 4 2Y=Q # 16 2YQB # BITS IN THE FGENERAL WORDS MEAN AS FOLLOWS:- 7 2_=2 # A) FGENERAL1 11 2_PL # B0 : )READ MODE 13 329= # B1 : )READRANDOM MODE 12 32NW # B2 : )APPEND MODE 11 338G # B3 :FILE OPEN IN >WRITE MODE 12 33N6 # B4 : )GENERAL MODE 11 347Q # B5 : )COPY MODE 11 34MB # B6 : )CLEAN MODE 9 3572 # B7 :CURRENTLY UNUSED 20 35LL # B8 :FILE IS COMPONENT OF STREAM OR S.D.F.OTHER THAN MASTER ONE 17 366= # B9 :TWO REELS OPEN IN GENERAL MODE,LAST AND ANOTHER 17 36KW # B10:FILE HAS HAD RECORDS DELETED FROM IT (COMPRESS) 11 375G # B11:OPEN FOR COMMUNICATION 12 37K6 # B12:A RECORD HAS BEEN APPENDED. 8 384Q # B13:DIRECTORY 19 38JB # B14:OPEN IN USERCLEAN MODE(= COMMUNICATION FOR RANDOM FILES) 20 3942 # B15 TO 18:NOT SET WHEN FILE OPEN.CONCERNED WITH CLOSING FILE. 17 39HL # B19:SOMEONE SUSIN'ED FOR A RECORD TO BE APPENDED. 14 3=3= # B20:SOMEONE SUSIN'ED TO APPEND A RECORD. 11 3=GW # B21,B22:CURRENTLY UNUSED. 8 3?2G # B23:SPARE FCA. 7 3?G6 # B) FGENERAL2 14 3?_Q # B23:THIS ACTIVITY WAITING FOR THIS BLOCK 15 3#FB # B22:THIS ACTIVITY HAS GONE FOR THIS BLOCK 4 3#_2 # 18 3*DL # THE REST NOT ALLOCATED OR NOT IMMEDIATELY RELEVANT. 21 3*Y= # -------------------------------------------------------------------- 4 3BCW # 4 3BXG # 5 3CC6 MASK2 5 3CWQ MCOMUNI 7 3DBB #17770000 5 3DW2 ZGEOER1 9 3F*L GEOERR 1,READDEEP 5 3FT= ZGEOER2 21 3G#W GEOERR 1,REC BIT? [SOMETHING ODD ABOUT RECORD HEADER 5 3GSG ZGEOER3 9 3H#6 GEOERR 1,END FILE 5 3HRQ ZGEOER4 9 3J?B GEOERR 1,COMMREAD 5 3JR2 ZGEOER5 21 3K=L GEOERR 1,FREAD [SOMETHING ODD ABOUT READ POINTERS. 5 3KQ= ZGEOER10 9 3L9W GEOERR 1,CANTREAD 4 3LPG # 19 3M96 FILETRAN [SUBROUTINES FOR SPECIAL FILESTORE 18 3MNQ [B.S. TRANSFER ROUTINES 10 3N8B # SFUBREAD SUBROUTINE 4 3NN2 # 5 3P7L SFUBREAD 16 3PM= # LOOKS FOR A BLOCK,& READS IT DOWN IF NECESSARY 13 3Q6W # ON ENTRY X2=>FSTACK,X3=> F.C.A. 17 3QLG # ON EXIT X2->FSTACK,X3=> F.C.A. X1-> USAGE BLOCK 15 3R66 BFCBX 1,2 [X1 -> FCB 6 3RKQ SFUBREAD1 20 3S5B JBS WAITDCFX1,1,BFAPPCARE [J IF CAREFUL UPDATING BEING 17 3SK2 [DONE BY APPEND. 5 3T4L NOWAITDC 10 3TJ= SMO FREADBLOCK(3) 17 3W3W LDX 4 0(1) [X4 = BLOCK NUMBER 11 3WHG SKIPTRACE 299,4,SFUBREAD 19 3X36 SFUB 2,4,1,READFCB [J IF USAGE BLOCK NOT THERE 7 3XGQ EXIT 5 0 20 3Y2B # WE CAN'T GET THE LAST BLOCK IF CAREFUL UPDATING IS BEING DONE 20 3YG2 # BY APPEND AS FBLMOD IS INCORRECT & THE BLOCK USUALLY IS FULL OF 18 3Y_L # RUBBISH.THIS INTERLOCK SHOULD BY GOT ROUND EVENTUALLY. 6 3_F= WAITDCFX1 17 3_YW LDX 0 FBLMOD(1) [J IF NOT LAST BLOCK 8 42DG ADN 0 A1-1 13 42Y6 BXU 0 FREADBLOCK(3),NOWAITDC 16 43CQ SBX 5 FX1 [DECREMENT LINK 5 43XB WAITDC 21 44C2 BS 1,BFCAREW [SET 'WAITING FOR APPEND TO FINISH 18 44WL [CAREFUL UPDATING' BIT. 13 45B= COOR3 #113 [WAIT 9 45TW CALL 4 ZEXTRO 9 46*G CALL 4 POINTERS 16 46T6 ADX 5 FX1 [INCREMENT LINK 15 47#Q BRN SFUBREAD1 [TRY AGAIN. 4 47SB # 9 48#2 # READ SUBROUTINE 15 48RL # THIS READS THE NEXT BLOCK OF THE FILE DOWN 10 49?= # WAITING IF NECESSARY 4 49QW # 19 4==G # WAITING IS THE COMPLEX PART.WE MUST AVOID,AT ALL COSTS, 21 4=Q6 # READING THE SAME BLOCK DOWN TWICE,WHILE MAUING SURE THAT ANYONE 11 4?9Q # WANTING A BLOCK GETS IT. 4 4?PB # 11 4#92 # THERE ARE TWO MAIN CASES. 10 4#NL # (A) NOT LAST BLOCK' CASE 20 4*8= # WE TEST TO SEE IF ANY OTHER READER HAS GONE FOR THIS BLOCK. 20 4*MW # ' IF YES WE SET OURSELVES WAITING IN STYLE 7,SETTING A BIT IN 19 4B7G # FGENERAL2.EVENTUALLY,WHEN WE WAKE UP,THE BLOCK IS THERE. 20 4BM6 # 2 IF NO WE GO AND DO A BACKREAD(SETTING GONE FOR THIS BLOCK BIT) 4 4C6Q # 9 4CLB # (B) LLAST BLOCK' CASE 20 4D62 # 1 IF SOMEONE HAS GONE FOR LAST BLOCK,WE SET OURSELVES WAITING 20 4DKL # IN STYLE 4,SETTING THE WAITING FOR LAST BLOCK BIT IN THE FCB. 20 4F5= # 2 IF ANYONE HAS^GONE FOR THIS BLOCK^,WE SET ^WAITING FOR THIS 13 4FJW # BLOCK(FGEN.1) & WAIT IN STYLE 7 20 4G4G # 3 IF NOONE HAS GONE FOR THIS BLOCK,WE CHECK IF THE ^GONE FOR NEW 21 4GJ6 # BLOCK^BIT IS SET.IF IT IS NOT WE SET GONE FOR LAST BLOCK BIT ,AND 17 4H3Q # WE ALSO SET GONE FOR THIS BLOCK BIT IN EITHER CASE 21 4HHB # THIS IS BECAUSE WE MAY GO TO READ DOWN A LAST BLOCK JUST AFTER 21 4J32 # SOMEONE ELSE HAS GONE TO GET A NEW BLOCK;LATER SOMEONE ELSE MIGHT 21 4JGL # COME FOR A BLOCK,AFTER THE NEW BLOCK HAS BEEN OBTAINED,AND READ 20 4K2= # THE SAME BLOCK DOWN,APPEND WILL NOT GET A NEW BLOCK IF ANYONE 11 4KFW # HAS GONE FOR LAST BLOCK. 16 4K_G READSTACK [ENTRY IF NO POINTERS AT ALL 9 4LF6 CALL 4 ZFSTACK 21 4LYQ READFCB [ENTRY IF HAVE POINTERS ONLY TO FSTACK & ELEMENT 17 4MDB BFCBX 1,2 [X1 IS POINTER TO FCB 4 4MY2 READ 12 4NCL SBX 5 FX1 [ADJUST LINK 10 4NX= LDX 0 FREADBLOCK(3) 11 4PBW SKIPTRACE 699,0,READFCB 21 4PWG BPZ 0 R1 [J IF FILE HAS BEEN READ FROM BEFORE 18 4QB6 LDN 0 FBLKS [O/W SET TO INITIAL VALUE 10 4QTQ STO 0 FREADBLOCK(3) 4 4R*B R1 13 4RT2 LDX 0 FBLMOD(1) [J IF 14 4S#L ADN 0 A1-1 [NOT LAST 17 4SS= BXU 0 FREADBLOCK(3),NOLBLOK [ BLOCK IN FILE 20 4T?W JBS WAITDC,1,BFAPPCARE [J IF CAREFUL UPDATE IN PROGRESS. 21 4TRG JBC SETGONR,1,BFLAST [J IF 'GONE FOR LAST BLOCK' BIT UNSET 21 4W?6 BS 1,BFLASTW [SET 'WAITING FOR LAST BLOCK' BIT. 13 4WQQ COOR3 #4 [WAIT 16 4X=B CALL 4 ZEXTRO [ELEMENT POINTER 18 4XQ2 CALL 4 POINTERS [FSTACK & FCB POINTERS 8 4Y9L BRN SFUBR 16 4YP= SETGONR [^GONE FOR LAST BLOCK^BIT NOT SET 21 4_8W CALL 4 TESTLOOK [ROUTINE TO TEST IF SOMEONE'S GONE 20 4_NG BRN SETWAITR [FOR THIS BLOCK.JTW^SETWAITR^ IF 15 5286 [SOMEONE IS 15 52MQ BFCBX 1,2 [X1 -> FCB 21 537B JBS RBACKR,1,BFNEW [J IF 'GETTING NEW BLOCK' BIT SET. 20 53M2 BS 1,BFLAST [SET 'GONE FOR LAST BLOCK' BIT. 9 546L BRN RBACKR 16 54L= WAITR [SOMEONE(S)WAITING FOR THIS BLOCK 18 555W LDX 3 1 [PICK UP FSTACK PTR AGAIN 17 55KG FON 7 [FON ALL THE WAITERS 15 5656 CALL 4 POINTERS [FSTACK & FCB 8 56JQ BRN NOWO 5 574B SETWAITR 21 57J2 BS 3,BAFBLKW [SET 'WAITING FOR THIS BLOCK' BIT. 15 583L COOR3 #7 [WAIT FOR IT 15 58H= CALL 4 ZEXTRO [ELEMENT PTR 17 592W CALL 4 POINTERS [FSTACK & FCB PTR 15 59GG BC 3,BAFBLKW [UNSET BIT 5 5=26 SFUBR 10 5=FQ SMO FREADBLOCK(3) 8 5=_B LDX 4 0(1) 20 5?F2 SFUB 2,4,1,SBFCBX [J IF BLOCK NOT THERE TO SFCBX 9 5?YL BRN RLINKR 5 5#D= NOLBLOK 7 5#XW #SKI K6READFILE 12 5*CG BXL 0 FREADBLOCK(3),ZGEOER3 21 5*X6 CALL 4 TESTLOOK [HAS SOMEONE GONE FOR THIS BLOCK ? 14 5BBQ BRN SETWAITR [J IF YES 7 5BWB BFCBX 1,2 5 5CB2 RBACKR 20 5CTL BS 3,BAFBLK [SET 'GONE FOR THIS BLOCK' BIT. 7 5D*= LDX 2 1 18 5DSW ADX 2 FREADBLOCK(3) [GIVES PTR TO BLOCKNUMBER 12 5F#G SKIPTRACE 299,0(2),BACKREAD 10 5FS6 ADDSKIP I516A,ARDRD 8 5G?Q VARIADNR 1 7 5GHJ ...#SKI JSKI33-1 7 5GRB FILEREAD 7 6 5GYJ ...#SKI JSKI33 9 5H5Q ... FILEREAD 7,FAIL 16 5H?2 MHUNTW 1,BSTB,BREAD [FIND BUFFER BLOCK 16 5HQL CALL 4 ZFSTACK [STACK & ELEMENT 9 5J== LDX 4 BPTR(2) 21 5JPW SMO 4 [BS HOME MAY HAVE CHANGED,SO U DATE 15 5K9G LDX 0 BSPRE [USAGE BLOCK 9 5KP6 STO 0 BACK1(1) 15 5L8Q ADX 4 FREADBLOCK(3) [BLOCK NO. 7 5LNB SMO 4 7 5M82 LDX 0 0 9 5MML STO 0 BACK2(1) 14 5N7= NAME 1,FILE,FURB [RE-NAME BLOCK 17 5NLW CHAIN 1,2 [CHAIN USAGE BLOCK IN 15 5P6G CALL 4 POINTERS [STACK & FCB 15 5PL6 BC 3,BAFBLK [UNSET BIT. 9 5Q5Q LDX 0 FBLMOD(1) 16 5QKB ADN 0 A1-1 [IS IT LAST BLOCK 15 5R52 BXU 0 FREADBLOCK(3),NOLO [IF NOT,JUMP 21 5RJL JBC NOFON4,1,BFLASTW [J IF NOONE WAITING FOR LAST BLOCK. 21 5S4= FON #4 [WAKE UP ANYONE WAITING FOR LAST BLOK 17 5SHW CALL 4 POINTERS [X1-> FCB,X2-> FSTACK 5 5T3G NOFON4 20 5TH6 MBC 1,BFLAST,BFLASTW [CLEAR 'GONE FOR LAST BLOCK' AND 21 5W2Q ['WAITING FOR LAST BLOCK' BITS,IF SET 21 5WGB ['GONE FOR LAST BLOCK' BIT MAY NOT HA 21 5X22 [BEEN SET IF APPEND WAS GETTING A NEW 21 5XFL [BLOCK ETC - MAY NOT HAVE FINISHED YE 4 5X_= NOLO 15 5YDW LDX 1 3 [FOR TESTWAIT 21 5YYG TESTWAIT 1,WAITR,2 [J IF ANYONE WAITING FOR THIS BLOCK 18 5_D6 LDX 3 1 [PICK UP PTR TO ELEMENT 4 5_XQ NOWO 17 62CB LDX 1 FPTR(2) [X1 -> USAGE BLOCK 5 62X2 RLINKR 15 63BL ADX 5 FX1 [ADJUST LINK 7 63W= EXIT 5 0 5 64*W SBFCBX 7 64TG BFCBX 1,2 8 65*6 BRN R1 4 65SQ # 4 66#B # 5 66S2 ZDEEP 17 67?L # SPECIAL ROUTINE FOR CHECKING & CONVERTING DEPTH 4 67R= # 14 68=W LDX 7 ACOMMUNE7(2) [DEPTH 8 68QG SRA 7 15 7 69=6 #SKI K6READFILE 4 69PQ ( 18 6=9B FILENUMB 5 [X5 = NO OF FILES OPEN 17 6=P2 BPZ 7 P1 [J IF DEPTH NOT <0 7 6?8L ADX 5 7 9 6?N= BNG 5 ZGEOER1 8 6#7W BRN P2 4 6#MG P1 9 6*76 BXGE 7 5,ZGEOER1 4 6*LQ P2 4 6B6B ) 7 6BL2 EXIT 6 0 5 6C5L POINTERS 19 6CK= # THIS SUBROUTINE ,GIVEN POINTER TO A FILE ELEMENT IN X3 16 6D4W # SETS X2 -> FILE/FSTACK BLOCK & X1 -> FILE/FCB 15 6DJG PSTAC 2,3 [X2 -> FSTACK 15 6F46 BFCBX 1,2 [X1 -> FCB 7 6FHQ EXIT 4 0 4 6G3B # 4 6GH2 # 4 6H2L # 5 6HG= ZFSTACK 21 6H_W # DOES AN SFSTACK ON THE FILE OPEN AT DEPTH [X7] & ALSO GIVESA'POINT 11 6JFG # ER TO THE FSTACK BLOCK 8 6J_6 SFSTACK 7,3,2 7 6KDQ EXIT 4 0 4 6KYB # 5 6LD2 ZEXTRO 19 6LXL # THIS ENTRY DOES AN SFSTACK ON THE FILE OPEN AT DEPTH [7] 11 6MC= # & LEAVES THE POINTER IN X3 8 6MWW SFSTACK 7,3 7 6NBG EXIT 4 0 4 6NW6 # 4 6P*Q # 10 6PTB # SFUBFREE SUBROUTINE 4 6Q*2 # 5 6QSL SFUBFREE 20 6R#= # THIS SUBROUTINE LOOKS FOR A BLOCK & EXITS IF ITS NOT THERE 17 6RRW # IF IT IS PRESENT,IT ENTERS THE VFREE SUBROUTINE 10 6S?G # X1 MUST POINT TO FCB 10 6SR6 SMO FREADBLOCK(3) 17 6T=Q LDX 4 0(1) [X4 = BLOCK NUMBER 11 6TQB SKIPTRACE 699,4,SFUBFREE 18 6W=2 SFUB 2,4,6,VEXITS [J TO EXIT IF NOT THERE 20 6WPL # THS BLOCK IS NOT FREED IF THERE IS AN APPENDER & IT'S THE LAST 6 6X9= # BLOCK. 15 6XNW BFCBX 1,2 [X1 -> FCB 5 6Y8G VFREE1 21 6YN6 JBS VEXITR,1,BFCORE [J IF 'LEAVE BLOCKS IN CORE' BIT SET. 10 6_7Q LDX 0 FREADBLOCK(3) 17 6_MB SBX 0 FBLMOD(1) [TEST IF LAST BLOCK 19 7272 SBN 0 A1-1 [WON'T FREE LAST BLOCK IF SO 17 72LL BNZ 0 VQRST [J IF NOT LAST BLOCK 21 736= JMBS (5),3,BAMAPP,BAMGEN [DON'T FREE BLOCK IF CURRENT ACTIVITY 21 73KW [HAS FILE OPEN IN APPEND OR GENERAL M 20 745G LDX 0 CTOPEN(1) [COUNT OF PEOPLE HAVING FILEOPEN 8 74K6 SMO FX1 19 754Q ANDX 0 MASK2 [= #17770000,MASKS OFF CT. OF APPENDERS 18 75JB BNZ 0 (5) [J IF LAST BL.& 1 APPENDER. 5 7642 VQRST 4 76HL # 10 773= # FREES USAGE BLOCK 18 77GW # UNLESS SOMEONE IS USING IT,IN WHICH CASE IT'S LEFT 13 782G # IF IT'S A FUWB,IS'S WRITTEN BACK 13 78G6 # X6-> USAGE BLOCK (!),CALLED BY X5 4 78_Q # 5 79FB VFREE 20 79_2 LDX 1 3 [PRESERVE FROM TSESTUSEJ MACRO 18 7=DL TESTUSEJ 1,VUSIN,2 [JIF ANYONE USING BLOCB 7 7=Y= LDX 3 1 14 7?CW SKIPTRACE 699,FREADBLOCK(3),FREEING 7 7?XG SMO 6 17 7#C6 LDX 0 ATYPE [ATYPE OF USAGE BLOCK 17 7#WQ BXE 0 FFSFURB,VREE [J IF NOT WRITE BLOCK 6 7*BB #SKI I516A 4 7*W2 ( 7 7B*L BFCBX 2,2 8 7BT= VARIADNW 2 4 7C#W ) 8 7CSG CHAIN 6,FX2 17 7D#6 SBX 5 FX1 [CALLING ACCUMULATOR 10 7DRQ ADDSKIP I516A,ARDWR 10 7F?B FILEAUTW 7,FAIL+FREE 14 7FR2 CALL 4 ZEXTRO [ELEMENT 8 7G=L ADX 5 FX1 9 7GQ= BRN VEXITQ 4 7H9W VREE 10 7HPG ADDSKIP I516A,ARDFR 8 7J96 FREECORE 6 5 7JNQ VEXITQ 15 7K8B CALL 4 POINTERS [FSTACK & FCB 7 7KN2 EXIT 5 0 5 7L7L VUSIN 7 7LM= LDX 3 1 14 7M6W PSTAC 2,3 [RESET X2 5 7MLG VEXITS 20 7N66 BFCBX 1,2 [KEEP EXIT CONDITION CONSISTENT 5 7NKQ VEXITR 7 7P5B EXIT 5 0 4 7PK2 # 20 7Q4L # THIS ROUTINE EXITS +1 IF NOONE HAS GONE FOR CURRENT BLOCK 14 7QJ= # NORMALLY IF SOMEONE HAS 14 7R3W # X0,X1 OVERWRITTEN,X2 ON NORMAL EXIT 5 7RHG TESTLOOK 7 7S36 LDX 1 3 10 7SGQ TESTLOOK 1,TESTA1,2 7 7T2B LDX 3 1 7 7TG2 EXIT 4 1 5 7T_L TESTA1 7 7WF= LDX 3 1 14 7WYW PSTAC 2,3 [RESET X2 7 7XDG EXIT 4 0 4 7XY6 # 4 7YCQ # 21 7YXB # -------------------------------------------------------------------- 13 7_C2 # READ, STEP (READING A BLOCK DOWN) 4 7_WL # 19 82B= # THE DEPTH IS CHECKED,AND THE FSTACK BLOCK IS SEARCHED FOR 18 82TW # THE USAGE BLOCK NUMBER IS FOUND, THE BLOCK LOOKED FOR. 7 83*G # (A) IF FOUND: 21 83T6 # IF'CURRENT'RECORD ON ENTRY WAS LAST IN BLOCK,PICK UP NEXT NUMBER 21 84#Q # (UNLESS 'CURRENT' BLOCK ON ENTRY WAS LAST, WHEN GO TO SPECIAL 21 84SB # EXIT) AND LOOK FOR THAT BLOCK. HAVING CHECKED THIS, SET UP FRB 20 85#2 # IF IN READ,LOOK AGAIN FOR USAGE (GO TO (B) IF LOST MEANWHILE ) 11 85RL # AND MOVE IN RECORD.EXIT. 17 86?= # (B) READ BLOCK DOWN,FIND POINTERS AGAIN AND GO TO (A) 4 86QW # 4 86TF ...[ 17 86Y4 ...VSKIP [VSKIP - ANY DEPTH 4 872M ...[ 7 875= ... LDN 4 3 9 877T ... BRN SAGSTEP1 4 87=G [ 18 87Q6 NZREAD [READ - N/Z DEPTH ENTRY. 4 889Q [ 10 88PB ADDSKIP I516A,IREAD 14 8992 LDN 4 1 [MARKER 9 89NL BRN RSTOLP 4 8=8= [ 19 8=MW STEPAGAIN [STEPAGAIN - N/Z DEPTH ENTRY 4 8?7G [ 7 8?M6 LDN 4 2 9 8#6Q BRN SAGSTEP1 4 8#LB [ 18 8*62 STEP [STEP - N/Z DEPTH ENTRY. 4 8*KL [ 7 8B5= LDN 4 0 5 8BJW SAGSTEP1 10 8C4G ADDSKIP I516A,K2RD 10 8CJ6 STO 3 ACOMMUNE7(2) 5 8D3Q RSTOLP 21 8F32 STOZ AWORK3(2) [SHOWS WE HAVE'NOT YET COORED'-SEE 19 8FGL [E.O.F. COMMUNICATION CODING 14 8G2= STO 4 AWORK4(2) [MARKER 18 8GFW CALL 6 ZDEEP [CONVERT AND CHECK DEPTH 8 8G_G BRN READW 4 8HF6 [ 18 8HYQ ZREAD [READ - ZERO DEPTH ENTRY. 4 8JDB [ 10 8JY2 ADDSKIP I516A,IREAD 7 8KCL LDN 4 1 9 8KX= BRN SSTOLP 4 8LBW [ 20 8LWG ZSTEPAGAIN [STEPAGAIN - ZERO DEPTH ENTRY. 4 8MB6 [ 7 8MTQ LDN 4 2 9 8N*B BRN SAGSTEP2 4 8NT2 [ 18 8P#L ZSTEP [STEP - ZERO DEPTH ENTRY 4 8PS= [ 7 8Q?W LDN 4 0 5 8QRG SAGSTEP2 10 8R?6 ADDSKIP I516A,K2RD 5 8RQQ SSTOLP 9 8SQ2 STOZ AWORK3(2) 14 8T9L STO 4 AWORK4(2) [MARKER 21 8TP= STOZ 7 [FOR READ/STEP,X7=DEPTH THROUGHOUT 8 8W8W BRN READW 4 8WNG [ 21 8X86 SHUFFLED [RE-ENTRY FROM COMMFILE. BLK NOS IN 4 8XMQ [ 20 8Y7B [FCB RESHUFFLED FOR D.C. FILES. 5 8YM2 READW 19 8_6L CALL 4 ZEXTRO [GET POINTER TO ELEMENT IN X3 18 8_L= CALL 4 POINTERS [X2 -> FSTACK,X1 FCB 7 925W #SKI K6READFILE 4 92KG ( 21 9356 JMBAC ZGEOER10,3,BAMREAD,BAMAPP,BAMGEN,BAMCLEAN [CHECK FILE OP 4 93JQ ) 5 944B READX 21 94J2 LDX 0 FBLMOD(1) [POINTER TO END OF BLOCKLIST IN FCB 9 953L SBN 0 AF2-A1 16 95H= BZE 0 READA1 [J IF EMPTY FILE 18 962W LDX 0 FREADBLOCK(3) [CURRENT BLOCK POINTER 20 96GG BPZ 0 SFUB [GO LOOK FOR USAGE BLOCK IF WE'VE 18 9726 [READ FROM FILE BEFORE. 12 97FQ LDN 0 FBLKS [ 20 97_B STO 0 FREADBLOCK(3) [FREADBLOCK POINTS TO 1ST BLOCK 9 98F2 BRN NORENDIS 4 98YL [ 21 99D= WAITED [RE-ENTRY FROM COMMFILE AFTER HAVING 4 99XW [ 20 9=CG LDX 0 ACOMMUNE3(2) [WAITED FOR RECORD TO BE APPENDED 9 9=X6 STO 0 AWORK3(2) 16 9?BQ CALL 4 ZEXTRO [RESET X3,X2,X1 9 9?WB CALL 4 POINTERS 10 9#B2 LDX 0 FREADBLOCK(3) 4 9#TL SFUB 21 9**= SBX 0 FBLMOD(1) [ IF[F'BLOCK]=[FBLMOD]+A1, WE EITHER 21 9*SW SBN 0 A1 [ ARE ABOUT TO READ E.O.F [F'WORD <0] 20 9B#G BNG 0 NORENDIS [ OR HAVE READ E.O.F [F'WORD =A1] 7 9BS6 #SKI K6READFILE 4 9C?Q ( 10 9CRB LDX 0 FREADWORD(3) 9 9D?2 BPZ 0 ZGEOER3 4 9DQL ) 14 9F== NGN 6 1 [SWITCH 8 9FPW BRN READA 5 9G9G NORENDIS 17 9GP6 CALL 5 SFUBREAD1 [SET X1->USAGE BLOCK 21 9H8Q LDX 0 FREADWORD(3) [LOOK AT RECORD POINTER IN THIS BLOCK 20 9HNB BXE 0 BSBSA1,STEPREP [J IF SPECIAL SETTING FOR STEPAGAIN 19 9J82 LDX 6 1 [PRESERVE USAGE BLOCK POINTER 20 9JML BNG 0 SETA1 [J IF FIRST READ ON THIS BLOCK 18 9K7= ADX 1 0 [X1+A1 -> RECORD HEADER 5 9KLW YDUM10 14 9L6G LDX 0 FRH(1) [NEXT R.H 16 9LL6 BPZ 0 NDUM10 [J IF NOT DUMMY 9 9M5Q ANDX 0 BRHMASK 17 9MKB BNZ 0 ZGEOER2 [OR XRUPT IF FDUD. 16 9N52 LDEX 0 FRH(1) [BOTTOM 9 BITS 7 9NJL #SKI K6READFILE 9 9P4= BZE 0 ZGEOER2 15 9PHW ADX 1 0 [STEP ON PTR 15 9Q3G ADS 0 FREADWORD(3) [& FREADWORD 9 9QH6 BRN YDUM10 5 9R2Q NDUM10 20 9RGB BZE 0 ZAPPRECQ [J IF ZERO RECORD AT END OF BLOCK 15 9S22 [LAST READ 21 9SFL ADX 1 0 [UPDATE PTR TO POINT TO NEXT RECORD 9 9S_= BRN QOLPOD 15 9TDW # WE NOW TEST IF LAST BLOCK, FOR IF SO, WE 21 9TYG # DON'T WANT TO THROW AWAY THE BLOCK EVERY TIME WE DO A READ IN THE 20 9WD6 # CLASSIC COMMUNICATION FILES CASE OF 'READ(ACT.1)-APPEND(ACT2)- 21 9WXQ # READ(ACT.1)-APPEND(ACT2).THAT WOULD BE TOO INEFFICIENT EVEN FOR G3 5 9XCB ZAPPRECQ 7 9XX2 BFCBX 1,2 7 9YBL #SKI K6READFILE 4 9YW= ( 9 9_*W LDX 0 FBLMOD(1) 8 9_TG ADN 0 A1-1 10 =2*6 SBX 0 FREADBLOCK(3) 17 =2SQ BNZ 0 NLASTBLK [J IF NOT LAST BLOCK 8 =3#B SMO FX2 9 =3S2 LDX 0 AWORK4 7 =4?L SBN 0 1 18 =4R= BNZ 0 STEPREP [J IF STEP OR STEPAGAIN 17 =5=W BRN ZGEOER3 [ERROR IF LAST BLOCK 5 =5QG NLASTBLK 21 =6=6 JBS ZGEOER4,1,BFDCF [READ E.O.F. THEREFORE ERROR IF DCF. 4 =6PQ ) 9 =79B CALL 5 VFREE1 18 =7P2 LDN 0 A1 [O/W ASSUME RECORDS HAVE 19 =88L STO 0 FREADWORD(3) [BEEN APPENDED IN A NEW BLOCK 17 =8N= LDX 0 FREADBLOCK(3) [SINCE LAST READING 18 =97W ADN 0 1 [E.O.F. & SET POINTERS 17 =9MG STO 0 FREADBLOCK(3) [AS IF WE'VE READ. 20 ==76 BRN SFUB [THE FIRST OF THES5& NEW RECORES 5 ==LQ VRECLAST 15 =?6B BFCBX 1,2 [X1 - > FCB. 19 =?L2 LDX 0 FBLMOD(1) [END OF BLOCK NUMBERS TABLE 14 =#5L SBX 0 FREADBLOCK(3) [IS IT 15 =#K= ADN 0 A1-1 [LAST BLOCK ? 16 =*4W BZE 0 READA [J TO EOF ROUTINE 4 =*JG ZEND 20 =B46 JBS RESHUFL,1,BFDCF [J TO RESHUFFLE BLK NOS. IF DCF. 21 =BHQ JBC XFREE,1,BFGDR [J IF NOT GENERAL DESTRUCTIVE READ AC 14 =C3B LDX 1 3 [X1->FCA 18 =CH2 TESTSLOWEST 1,SLOWGDR,2 [J IF SLOWEST GDR READER. 7 =D2L LDX 3 1 9 =DG= CALL 4 POINTERS 5 =D_W XFREE 18 =FFG CALL 5 VFREE1 [DEAL WITH SPENT BLOCK 7 =F_6 LDN 0 1 20 =GDQ ADS 0 FREADBLOCK(3) [O/W,ADD ONE TO BLOCK POINTER 20 =GYB NGS 0 FREADWORD(3) [SET RECORD POINTER NEGATIVE 10 =HD2 LDX 0 FREADBLOCK(3) 19 =HXL BRN SFUB [GO LOOK FOR NEXTBLOCK 5 =JC= SLOWGDR 9 =JWW #SKI K6READFILE>159-159 13 =KBG TRACE FREADBLOCK(1),GDRSHUFL 16 =KW6 FREECORE 6 [FREE USAGE BLOCK 9 =L*Q BRN XGDRSHUFL 5 =LTB RESHUFL 9 =M*2 #SKI K6READFILE>159-159 12 =MSL TRACEVER FBLMOD(1),RESHUFLE 18 =N#= LDX 2 6 [RENAME OLD BLOCK A FURB 15 =NRW NAME 2,FILE,FURB [AND EMPTY IT 8 =P?G STOZ A1(2) 6 =PR6 XGDRSHUFL 8 =Q=Q LDX 2 FX2 16 =QQB STO 7 ACOMMUNE1(2) [STORE FILE DEPTH 17 =R=2 ACROSS COMMFILE,1 [RESHUFFLE BLK NOS 5 =RPL SETA1 15 =S9= ADN 1 A1 [PTR TO 1ST REC. 5 =SNW QOLPOD 5 =T8G YDUM11 14 =TN6 LDX 0 FRH(1) [NEXT R.H 16 =W7Q BPZ 0 NDUM11 [J IF NOT DUMMY 9 =WMB ANDX 0 BRHMASK 16 =X72 BNZ 0 ZGEOER2 [OR XRUPT IF FDUD 16 =XLL LDEX 0 FRH(1) [BOTTOM 9 BITS 7 =Y6= #SKI K6READFILE 9 =YKW BZE 0 ZGEOER2 15 =_5G ADX 1 0 [STEP ON PTR 9 =_K6 BRN YDUM11 5 ?24Q NDUM11 8 ?2JB SMO FX2 9 ?342 LDX 4 AWORK4 7 ?3HL SBN 4 2 16 ?43= BZE 4 STEPREP [J IF STEPAGAIN 19 ?4GW BZE 0 VRECLAST [J IF RECORD LAST IN BLOCK. 7 ?52G SBX 1 6 21 ?5G6 BXGE 1 BSBSA1,ZGEOER2 [J IF GREATER THAN ONE BLOCK SIZE. 16 ?5_Q ADN 4 1 [TO XRUPT IF FDUD 15 ?6FB BNZ 4 STEPREP [J IF STEP 16 ?6_2 STO 1 FREADWORD(3) [UPDATE F'WORD 7 ?7DL ADX 1 6 11 ?7Y= SKIPTRACE 199,6,READ BL 17 ?8CW LDX 6 0 [SIZE OF BLOCK WANTED 18 ?8XG SETUPCOR 6,1,FILE,FRB [SET UP READ BLOCK 14 ?9C6 CALL 4 ZFSTACK [POINTERS 17 ?9WQ CALL 5 SFUBREAD [X1 -> USAGE BLOCK 9 ?=BB MHUNTW 2,FILE,FRB 16 ?=W2 ADX 1 FREADWORD(3) [PTR TO RECORD 8 ??*L ADN 2 A1 14 ??T= SMO FRH(1) [MOVE IN 14 ?##W MOVE 1 0 [RECORD 5 ?#SG SETREP 16 ?*#6 SETREP OK [REPLY FOR READ 4 ?*RQ UP 5 ?B?B UP 5 ?BR2 STEPREP 16 ?C=L SETREP COORED [REPLY FOR STEP 5 ?CQ= UP 8 ?D9W # LAST BLOCK 5 ?J6W READA1 7 ?JLG STOZ 6 5 ?K66 READA 8 ?KKQ SMO FX2 9 ?L5B LDX 0 AWORK4 7 ?LK2 SBN 0 2 16 ?M4L ... BPZ 0 STEPREP [J IF STEPAGAIN 20 ?MJ= JBC NOAPPE,3,BACOMM [J IF NOT OPEN IN COMMUNE MODE. 21 ?N3W JBS MORAPPE,1,BFDCF [IF A D.C. FILE WE WISH TO GO WAITING 21 ?NHG [ANYWAY - IF NECESSARY FOR EVER - SO 21 ?P36 [ANOTHER APPENDER CAN OPEN THE FILE. 9 ?PGQ LDX 0 CTOPEN(1) 19 ?Q2B SMO FX1 [MASK OUT ALL EXCEPT COUNT OF 15 ?QG2 ANDX 0 MCOMUNI [APPENDERS 17 ?Q_L BZE 0 NOAPPE [J IF NO APPENDERS 7 ?RF= SRL 0 2 16 ?RYW SBN 0 #4000 [NEG IF ONLY ONE 16 ?SDG BPZ 0 MORAPPE [J IF >1 APPENDER 21 ?SY6 JBC MORAPPE,3,BAMAPP [SEE IF WE'RE THE ONE(SOLE) APPENDER 17 ?TCQ [AND J IF WE'RE NOT. 5 ?TXB NOAPPE 8 ?WC2 SMO FX2 15 ?WWL LDX 0 AWORK4 [MARKER WORD 15 ?XB= BZE 0 STEPREP [J IF STEP 8 ?XTW BNG 0 UP 16 ?Y*G BNG 6 OFRI [SPECIAL ENTRIES 8 ?YT6 BZE 6 NOFR1 8 ?_#Q CALL 5 VFREE 5 ?_SB NOFR1 9 #2#2 LDX 0 FBLMOD(1) 20 #2RL ADN 0 A1 [EOF SETTING ,F'WORD = FBLKOD+A1 15 #3?= STO 0 FREADBLOCK(3) [F'WORD =A1 8 #3QW LDN 0 A1 10 #4=G STO 0 FREADWORD(3) 16 #4Q6 SETNCORE 1,1,FILE,FRB [SET UP ZERO FRB 16 #59Q STOZ A1(1) [STOZ 1ST WORD 9 #5PB BRN SETREP 4 #692 OFRI 17 #6NL CALL 5 SFUBFREE [TRY TO FREE BLOCK 8 #78= BRN NOFR1 5 #7MW MORAPPE 21 #87G # ENTRY IS NOW MADE TO COMMFILE TO DEAL WITH COMPLEX COMMUNICATION 20 #8M6 # FILE INTERLOCKS AT E.O.F. ONLY 'STEP' ENTRIES ALLOWED HERE. 8 #96Q LDX 2 FX2 7 #9LB #SKI K6READFILE 4 #=62 ( 9 #=KL LDX 0 AWORK4(2) 8 #?5= BZE 0 T46 9 #?JW BPZ 0 ZGEOER4 4 ##4G T46 4 ##J6 ) 14 #*3Q STO 7 ACOMMUNE1(2) [DEPTH 9 #*HB LDX 0 AWORK3(2) 10 #B32 STO 0 ACOMMUNE3(2) 21 #BGL LDX 0 CMOD(1) [CURRENT POSN. OF APPEND POINTERS. 10 #C2= STO 0 ACOMMUNE2(2) 9 #CFW LDX 0 FBLMOD(1) 10 #C_G STO 0 ACOMMUNE4(2) 20 #DF6 ACROSS COMMFILE,2 [WAIT FOR RECORD TO BE APPENDED. 4 #DYQ # 4 #FDB ...#END 8 ____ ...11250114000300000000