PERUSFIL84

(George Source)

Macros used: ADDSKIP, BC, BFCBX, BS, BXE, BXGE, BXL, BXU, CHAIN, COOR3, FILEAUTW, FILENUMB, FILEREAD, FILETRAN, FON, FREECORE, GEOERR, JBC, JBS, JMBAC, MBC, MENDAREA, MFREEW, MHUNTW, NAME, PSTAC, READ, READAGAIN, READB, REWIND, SEGENTRY, SETNCORE, SETREP, SFSTACK, SFUB, SKIPTRACE, STEPAGAIN, TESTLOOK, TESTUSEJ, TESTWAIT, UP, VARIADNR, VARIADNW, VFREE

PERUSFIL84.txt
22FL ...#SEG  PERUSFIL6                    [M.J.VELLACOTT.  
22^=    #OPT  K0PERUSFIL=K0ACCESS>K0FILESTORE>K0ALLGEO  
23DW    #LIS  K0PERUSFIL
23YG    #OPT  K6PERUSFIL=K6ACCESS>K6FILESTORE>K6ALLGEO  
24D6          8HPERUSFIL
24XQ          SEGENTRY K7PERUSFIL,NGET  
25CB          SEGENTRY K16PERUSFIL,READB
25X2          SEGENTRY K27PERUSFIL,ZGET 
26BL          SEGENTRY K30PERUSFIL,REWIND   
26W=          SEGENTRY K31PERUSFIL,ZREWIND  
27*W          SEGENTRY K40PERUSFIL,NBSPACE  
27TG          SEGENTRY K44PERUSFIL,ZBSPACE  
28*6          SEGENTRY K67PERUSFIL,ZREADB   
28SQ          SEGENTRY K80PERUSFIL,READAGAIN
29#B          SEGENTRY K81PERUSFIL,ZREADAGAIN   
29S2          SEGENTRY K82PERUSFIL,RBACK
2=?L          SEGENTRY K83PERUSFIL,ZRBACK   
2=HD ...      SEGENTRY K84PERUSFIL,ZBSKIP   
2=R=    #     IMPLEMENTS MACROS WHOSE ENTRY POINTS ARE AS FOLLOWS :-
2?=W    #     K30   -  'REWIND' 
2?QG    #     K31   -     "    (ZERO DEPTH) 
2#=6    #     K40   -  'BACKSPACE'  
2#PQ    #     K44      "      (ZERO DEPTH)  
2*9B    #     K16   -  'READB'  
2*P2    #     K67   - .  "        [ZERO DEPTH   
2B8L    #     K80   -  'READAGAIN'  
2BN=    #     K81   -      "      (ZERO DEPTH)  
2C7W    #     K82   -  'READBACK'   
2CMG    #     K83   -      "      (ZERO DEPTH)  
2D76    #     K7   -   'GETAFURB'  NONZERO DEPTH
2DLQ    #     K27  -      [        ZERO DEPTH   
2F6B    #   
2FL2    #   
2G5L    #   
2GK=    #     THE   SEGMENT IS IMPLEMENTED USING FILESTORE RINGS
2H4W    #   
2HJG    #     ALL FILES OPEN HAVE AN FCB IN THE FILE CHAIN. NEXT TO THIS FCB
2J46    #     THERE IS A FILE/FSTACK BLOCK CONTAINING AN ENTRY FOR EACH ACTIVITY
2JHQ    #     THAT HAS THE FILE OPEN.   
2K3B    #     THIS ENTRY IS 'FELLEN'(CURRENTLY=7 WDS) LONG  
2KH2    #     EACH  ENTRY IN THE STACK IS RINGED TO THE ACTIVITY THAT IT REPRESE
2L2L    #     AND THE  NTH ELEMENT ALONG THE RING REPRESENTS THE FILE OPEN AT   
2LG=    #     DEPTH N   
2L^W    #     THE ENTRY LOOKS LIKE: 
2MFG    #     WORD 1   FPTRF      :FORWARD POINTER ALONG RING   
2M^6    #     WORD 2   BPTRF      :BACKWARD POINTER ALONG RING  
2NDQ    #     WORD 3   FBACKPOINT :RELATIVE BACKWARD POINTER TO START OF FSTACK 
2NYB    #     WORD 4   FREADBLOCK :POINTER TO NUMBER OF CURRENT BLOCK BEING READ
2PD2    #     WORD 5   FREADWORD  :  "     "    "    "   "     RECORD   "    "  
2PXL    #     WORD 6   FGENERAL1  :(OLD FCA5 WORD) ALLPURPOSE WORD,BITS SET HAVE
2QC=    #     WORD 7   FGENERAL2  :SPECIAL MEANINGS FGENERAL2 IS FOR EXPANSION  
2QWW    #   
2RBG    #     BITS  IN THE FGENERL WORDS MEAN  AS FOLLOWS:- 
2RW6    # A)  FGENERAL1 
2S*Q    #   B0 :             )READ MODE 
2STB    #   B1 :             )READRANDOM MODE   
2T*2    #   B2 :FILE OPEN IN >APPEND MODE   
2TSL    #   B3 :             )WRITE  MODE   
2W#=    #   B4 :             )GENERAL MODE  
2WRW    #   B5 :UNUSED  
2X?G    #   B6 :FILE OPEN IN CLEAN MODE 
2XR6    #   B8 :FILE IS COMPONENT OF STREAM OR S.D.F.OTHER THAN MASTER ONE  
2Y=Q    #   B9 :TWO REELS OPEN IN GENERAL MODE,LAST AND ANOTHER 
2YQB    #   B10:FILE HAS HAD RECORDS DELETED FROM IT (COMPRESS) 
2^=2    #   B11:OPEN FOR COMMUNICATION  
2^PL    #   B12:MAGTAPE BULK FILE   
329=    #   B13:DIRECTORY   
32NW    #   B14:OPEN IN USERCLEAN MODE(= COMMUNICATION FOR RANDOM FILES)
338G    #   
33N6    #   BITS 8,9,&12 ARE CURRENTLY(11/9/69) NOT USED
347Q    #     B15-23 USED TO BE USED TO HOLD THE "HEIGHT" OF THE FILE. CURRENTLY
34MB    #     DISUSED   
3572    #   BIT 5 UNALLOCATED   
35LL    #     B7 USED TO BE THE END-OF-FILE BIT,BUT WE'VE DONE AWAY WITH IT 
366=    #     (I HOPE). IT'S NOW UNALLOCATED.   
36KW    # B)  FGENERAL2 
375G    #   B23:THIS ACTIVITY WAITING FOR THIS BLOCK
37K6    #   B22:THIS ACTIVITY HAS GONE FOR THIS BLOCK   
384Q    #   
38JB    #     THE REST UNALLOCATED  
3942    # -------------------------------------------------------------------   
39HL    #   
3=3=    #   
3=GW    MASK2   
3?2G    MCOMUNI 
3?G6          #17770000 
3?^Q    ZGEOER1 
3#FB          GEOERR  1,READDEEP
3#^2    ZGEOER2 
3*DL          GEOERR  1,REC BIT?
3*Y=    ZGEOER3 
3BCW          GEOERR  1,END FILE
3BXG    ZGEOER6 
3CC6          GEOERR   1,CANTBACK   
3CWQ    Z7  
3DBB    ZGEOER7 
3DW2          GEOERR   1,CANTREAB   
3F*L    ZGEOER8 
3FT=          GEOERR 1,BEG FILE 
3G#W    Z11 
3GSG    ZGEOER11
3H#6          GEOERR   1,CANTREWI   
3HRQ    #   
3J?B    #     SFUBREAD SUBROUTINE   
3JR2    #   
3K=L          FILETRAN                     [SUBROUTINES FOR SPECIAL FILESTORE   
3KQ=                                       [B.S. TRANSFER ROUTINES. 
3L9W    SFUBREAD
3LPG    #     LOOKS FOR A BLOCK,& READS IT DOWN IF NECESSARY
3M96    #     ON ENTRY X2=>FSTACK,X3=> F.C.A.   
3MNQ    #     ON EXIT  X2->FSTACK,X3=> F.C.A. X1-> USAGE BLOCK  
3N8B          BFCBX  1,2                   [X1 -> FCB   
3NN2    SFUBREAD1   
3P7L          JBS      WAITDCFX1,1,BFAPPCARE   [J IF 'CAREFUL UPDATING' 
3PM=                                           [BEING DONE BY APPEND
3Q6W    NOWAITDC
3QLG          SMO      FREADBLOCK(3)
3R66          LDX   4  0(1)                [X4 = BLOCK NUMBER   
3RKQ          SKIPTRACE 299,4,SFUBREAD  
3S5B          SFUB     2,4,1,READFCB       [J IF USAGE BLOCK NOT THERE  
3SK2          EXIT  5  0
3T4L    #   
3TJ=    #     WE CAN'T GET THE LAST BLOCK IF CAREFUL UPDATING IS BEING DONE 
3W3W    #     BY APPEND AS FBLMOD WILL BE INCORRECT & THE BLOCK USUALLY IS FULL 
3WHG    #     OF RUBBISH. THIS INTERLOCK SHOULD BE GOT ROUND EVENTUALLY.
3X36    WAITDCFX1   
3XGQ          LDX   0  FBLMOD(1)           [J IF NOT LAST BLOCK 
3Y2B          ADN   0  A1-1 
3YG2          BXU   0  FREADBLOCK(3),NOWAITDC   
3Y^L          SBX   5  FX1                 [DECREMENT LINK  
3^F=    WAITDC  
3^YW          BS       1,BFCAREW           [SET THE 'WAITING FOR APPEND TO  
42DG                                       [FINISH CAREFUL UPDATING' BIT.   
42Y6          COOR3    #113                [WAIT
43CQ          CALL  4  ZEXTRO   
43XB          CALL  4  POINTERS 
44C2          BC       1,BFCAREW           [UNSET BIT   
44WL          ADX   5  FX1                 [INCREMENT LINK  
45B=          BRN      SFUBREAD1           [TRY AGAIN   
45TW    #     READ SUBROUTINE   
46*G    #     THIS READS THE NEXT BLOCK OF THE FILE DOWN
46T6    #     WAITING IF NECESSARY  
47#Q    #   
47SB    #     WAITING IS THE COMPLEX PART.WE MUST AVOID,AT ALL COSTS,   
48#2    #     READING THE SAME BLOCK DOWN TWICE,WHILE MAUING SURE THAT ANYONE   
48RL    #     WANTING A BLOCK GETS IT.  
49?=    #   
49QW    #     THERE  ARE TWO MAIN CASES.
4==G    # (A)  NOT LAST BLOCK' CASE 
4=Q6    #     WE TEST TO SEE IF ANY OTHER READER HAS GONE FOR THIS BLOCK.   
4?9Q    #   ' IF YES WE SET OURSELVES WAITING IN STYLE 7,SETTING A BIT IN   
4?PB    #     FGENERAL2.EVENTUALLY,WHEN WE WAKE UP,THE BLOCK IS THERE.  
4#92    #   2 IF NO WE GO AND DO A BACKREAD(SETTING GONE FOR THIS BLOCK BIT)
4#NL    #   
4*8=    # (B) LLAST BLOCK' CASE 
4*MW    #   1 IF SOMEONE HAS GONE FOR LAST BLOCK,WE SET OURSELVES WAITING   
4B7G    #     IN STYLE 4,SETTING THE WAITING FOR LAST BLOCK BIT IN THE FCB. 
4BM6    #   2 IF ANYONE HAS"GONE FOR THIS BLOCK",WE SET "WAITING FOR THIS   
4C6Q    #     BLOCK(FGEN.1) & WAIT IN STYLE 7   
4CLB    #   3 IF NOONE HAS GONE FOR THIS BLOCK,WE CHECK IF THE "GONE FOR NEW
4D62    #     BLOCK"BIT IS SET.IF IT IS NOT WE SET GONE FOR LAST BLOCK BIT ,AND 
4DKL    #     WE ALSO SET GONE FOR THIS BLOCK BIT IN EITHER CASE
4F5=    #     THIS  IS BECAUSE WE MAY GO TO READ DOWN A LAST BLOCK JUST AFTER   
4FJW    #     SOMEONE ELSE HAS GONE TO GET A NEW BLOCK;LATER SOMEONE ELSE MIGHT 
4G4G    #     COME FOR A BLOCK,AFTER THE NEW BLOCK HAS BEEN OBTAINED,AND READ   
4GJ6    #     THE SAME BLOCK DOWN,APPEND WILL NOT GET A NEW BLOCK IF ANYONE 
4H3Q    #     HAS GONE FOR LAST BLOCK.  
4HHB    READSTACK              [ENTRY IF NO POINTERS AT ALL 
4J32          CALL  4  ZFSTACK  
4JGL    READFCB                [ENTRY IF HAVE POINTERS ONLY TO FSTACK & ELEMENT 
4K2=          BFCBX  1,2                   [X1 IS POINTER TO FCB
4KFW    READ
4K^G          SBX   5  FX1     [ADJUST LINK 
4LF6          LDX   0  FREADBLOCK(3)
4LYQ          SKIPTRACE 699,0,READFCB   
4MDB          BPZ   0  R1                  [J IF FILE HAS BEEN READ FROM BEFORE 
4MY2          LDN   0  FBLKS               [O/W SET TO INITIAL VALUE
4NCL          STO   0  FREADBLOCK(3)
4NX=    R1  
4PBW          LDX   0  FBLMOD(1)           [J IF
4PWG          ADN   0  A1-1                [NOT LAST
4QB6          BXU   0  FREADBLOCK(3),NOLBLOK     [ BLOCK IN FILE
4QTQ          JBC      SETGONR,1,BFLAST    [J IF 'GONE FOR LAST BLOCK' BIT UNSET
4R*B          BS       1,BFLASTW           [SET 'WAITING FOR LAST BLOCK' BIT.   
4RT2          COOR3    #4                  [WAIT
4S#L          CALL  4  ZEXTRO              [ELEMENT POINTER 
4SS=          CALL  4  POINTERS            [FSTACK & FCB POINTERS   
4T?W          BC       1,BFLASTW           [UNSET BIT.  
4TRG          BRN      SFUBR
4W?6    SETGONR       ["GONE FOR LAST BLOCK" BIT  IS SET
4WQQ          CALL  4  TESTLOOK            [ROUTINE TO TEST IF SOMEONE'S GONE   
4X=B          BRN      SETWAITR            [FOR THIS BLOCK.JTW"SETWAITR" IF 
4XQ2                                       [SOMEONE IS  
4Y9L          BFCBX  1,2                   [X1 -> FCB   
4YP=          JBS      RBACKR,1,BFNEW      [J IF 'GETTING NEW BLOCK' BIT SET.   
4^8W          BS       1,BFLAST            [SET 'GONE FOR LAST BLOCK' BIT.  
4^NG          BRN      RBACKR   
5286    WAITR            [SOMEONE(S)WAITING FOR THIS BLOCK  
52MQ          LDX   3  1                   [PICK UP FSTACK PTR AGAIN
537B          FON   7                      [FON ALL THE WAITERS 
53M2          CALL  4  POINTERS            [FSTACK & FCB
546L          BRN      NOWO 
54L=    SETWAITR
555W          BS       3,BAFBLKW           [SET 'WAITING FOR THIS BLOCK' BIT.   
55KG          COOR3  #7                    [WAIT FOR IT 
5656          CALL  4  ZEXTRO              [ELEMENT  PTR
56JQ          CALL  4  POINTERS            [FSTACK  &  FCB PTR  
574B          BC       3,BAFBLKW           [UNSET BIT.  
57J2    SFUBR   
583L          SMO   FREADBLOCK(3)   
58H=          LDX   4  0(1) 
592W          SFUB   2,4,1,SBFCBX          [J IF BLOCK NOT THERE TO SFCBX   
59GG          BRN      RLINKR   
5=26    NOLBLOK 
5=FQ    #SKI  K6PERUSFIL
5=^B          BXL   0  FREADBLOCK(3),ZGEOER3
5?F2          CALL  4  TESTLOOK            [HAS SOMEONE GONE FOR THIS BLOCK ?   
5?YL          BRN      SETWAITR            [J IF YES
5#D=          BFCBX  1,2
5#XW    RBACKR  
5*CG          BS       3,BAFBLK            [SET 'GONE FOR THIS BLOCK' BIT.  
5*X6          LDX   2  1
5BBQ          ADX   2  FREADBLOCK(3)       [GIVES PTR TO BLOCKNUMBER
5BWB          VARIADNR  1   
5CB2          SKIPTRACE 299,0(2),BACKREAD   
5CTL          ADDSKIP I516A,ARDRD   
5D5D ...#SKI JSKI33-1   
5D*=          FILEREAD 7
5DGD ...#SKI JSKI33 
5DML ...      FILEREAD 7,FAIL   
5DSW          MHUNTW  1,BSTB,BREAD       [FIND BUFFER BLOCK 
5F#G          CALL  4  ZFSTACK             [STACK & ELEMENT 
5FS6          LDX   4  BPTR(2)  
5G?Q          SMO      4                   [BS HOME MAY HAVE CHANGED,SO U DATE  
5GRB          LDX   0  BSPRE               [USAGE BLOCK 
5H?2          STO   0  BACK1(1) 
5HQL          ADX   4  FREADBLOCK(3)       [BLOCK NO.   
5J==          SMO      4
5JPW          LDX   0  0
5K9G          STO   0  BACK2(1) 
5KP6          NAME   1,FILE,FURB      [RE-NAME BLOCK
5L8Q          CHAIN  1,2                   [CHAIN USAGE BLOCK IN
5LNB          CALL  4  POINTERS            [STACK & FCB 
5M82          BC       3,BAFBLK            [UNSET BIT.  
5MML          LDX   0  FBLMOD(1)
5N7=          ADN   0  A1-1                [IS IT LAST BLOCK
5NLW          BXU   0  FREADBLOCK(3),NOLO  [IF NOT,JUMP 
5P6G          JBC      NOFON4,1,BFLASTW    [J IF 'WAITING FOR LAST BLOCK' BIT UN
5PL6          FON      #4                  [WAKE UP ANYONE WAITING FOR LAST BLOK
5Q5Q          CALL  4  POINTERS            [X1-> FCB,X2-> FSTACK
5QKB    NOFON4  
5R52          MBC      1,BFLAST,BFLASTW    [UNSET 'GETTING LAST BLOCK' AND  
5RJL                                       ['WAITING FOR LAST BLOCK' BITS,IF SET
5S4=    NOLO
5SHW          LDX   1  3                   [FOR TESTWAIT
5T3G          TESTWAIT 1,WAITR,2           [J IF ANYONE WAITING FOR THIS BLOCK  
5TH6          LDX   3  1                   [PICK UP PTR TO ELEMENT  
5W2Q    NOWO
5WGB          LDX   1  FPTR(2)             [X1 -> USAGE BLOCK   
5X22    )   
5XFL    RLINKR  
5X^=          ADX   5  FX1                 [ADJUST LINK 
5YDW          EXIT  5  0
5YYG    SBFCBX  
5^D6          BFCBX  1,2
5^XQ          BRN      R1   
62CB    #   
62X2    #   
63BL    ZDEEP   
63W=    #     SPECIAL ROUTINE FOR CHECKING & CONVERTING DEPTH   
64*W    #   
64TG          LDX   7  ACOMMUNE7(2) 
65*6          SRA   7  15   
65SQ    #SKI  K6PERUSFIL
66#B    (   
66S2          FILENUMB 5                   [X5 = NO OF FILES OPEN   
67?L          BPZ   7  P1                  [J IF DEPTH NOT <0   
67R=          ADX   5  7
68=W          BNG   5  ZGEOER1  
68QG          BRN      P2   
69=6    P1  
69PQ          BXGE  7  5,ZGEOER1
6=9B    P2  
6=P2    )   
6?8L          EXIT  6  0
6?N=    POINTERS
6#7W    #     THIS  SUBROUTINE ,GIVEN POINTER TO A FILE ELEMENT IN X3   
6#MG    #     SETS X2 -> FILE/FSTACK BLOCK & X1 -> FILE/FCB 
6*76          PSTAC  2,3                   [X2 -> FSTACK
6*LQ          BFCBX  1,2                   [X1 -> FCB   
6B6B          EXIT  4  0
6BL2    #   
6C5L    #   
6CK=    #   
6D4W    ZFSTACK 
6DJG    #     DOES AN SFSTACK ON THE FILE OPEN AT DEPTH [X7] & ALSO GIVESA'POINT
6F46    #     ER    TO THE FSTACK BLOCK 
6FHQ          SFSTACK  7,3,2
6G3B          EXIT  4  0
6GH2    #   
6H2L    ZINTRO  
6HG=    #     FIRST ENTRY;TO CHECK DEPTH
6H^W          CALL  6  ZDEEP               [CONVERT & CHECK DEPTH   
6JFG    #   
6J^6    ZEXTRO  
6KDQ    #     THIS ENTRY DOES AN SFSTACK ON THE FILE OPEN AT DEPTH [7]  
6KYB    #     & LEAVES THE POINTER IN X3
6LD2          SFSTACK  7,3  
6LXL          EXIT  4  0
6MC=    #   
6MWW    #   
6NBG    #     SFUBFREE SUBROUTINE   
6NW6    #   
6P*Q    SFUBFREE
6PTB    #     THIS  SUBROUTINE LOOKS FOR A BLOCK & EXITS IF ITS NOT THERE   
6Q*2    #     IF IT IS PRESENT,IT ENTERS THE VFREE SUBROUTINE   
6QSL    #     X1 MUST POINT TO FCB  
6R#=          SMO      FREADBLOCK(3)
6RRW          LDX   4  0(1)                [X4 = BLOCK NUMBER   
6S?G          SKIPTRACE 699,4,SFUBFREE  
6SR6          SFUB  2,4,6,VEXITS           [J TO EXIT IF NOT THERE  
6T=Q    #     THS BLOCK IS NOT FREED IF THERE IS AN APPENDER & IT'S THE LAST
6TQB    #     BLOCK.
6W=2    VFREE2  
6WPL          BFCBX  1,2                   [X1 -> FCB   
6X9=    VFREE1  
6XNW          JBS      VEXITR,1,BFCORE     [J IF 'LEAVE BLOCKS IN CORE' BIT SET.
6Y8G    VQRST   
6YN6    #   
6^7Q    #     FREES  USAGE  BLOCK   
6^MB    #      UNLESS SOMEONE IS USING IT,IN WHICH CASE IT'S LEFT   
7272    #     IF IT'S A FUWB,IS'S WRITTEN BACK  
72LL    #     X6-> USAGE BLOCK (!),CALLED BY  X5
736=    #   
73KW    VFREE   
745G          LDX   1  3                   [PRESERVE FROM TSESTUSEJ MACRO   
74K6          TESTUSEJ   1,VUSIN,2         [JIF ANYONE USING BLOCB  
754Q          LDX   3  1
75JB          SKIPTRACE 699,FREADBLOCK(3),FREEING   
7642          SMO      6
76HL          LDX   0  ATYPE               [ATYPE OF USAGE BLOCK
773=          BXE   0  FFSFURB,VREE        [J IF NOT WRITE BLOCK
77GW          CHAIN 6,FX2   
782G          SBX   5  FX1                 [CALLING  ACCUMULATOR
78G6    #SKI I516A  
78^Q    (   
79FB          BFCBX 2,2 
79^2          VARIADNW  2   
7=DL    )   
7=Y=          ADDSKIP I516A,ARDWR   
7?CW          FILEAUTW 7,FAIL+FREE  
7?XG          CALL  4  ZEXTRO              [ELEMENT 
7#C6          ADX   5  FX1  
7#WQ          BRN      VEXITQ   
7*BB    VREE
7*W2          ADDSKIP  I516A,ARDFR  
7B*L          FREECORE  6   
7BT=    VEXITQ  
7C#W          CALL  4  POINTERS            [FSTACK & FCB
7CSG          EXIT  5  0
7D#6    VUSIN   
7DRQ          LDX   3  1
7F?B          PSTAC    2,3                 [RESET X2
7FR2    VEXITS  
7G=L          BFCBX  1,2                   [KEEP EXIT CONDITION CONSISTENT  
7GQ=    VEXITR  
7H9W          EXIT  5  0
7HPG    #   
7J96    #     THIS  ROUTINE EXITS  +1 IF NOONE HAS GONE FOR CURRENT BLOCK   
7JNQ    #                 NORMALLY IF SOMEONE HAS   
7K8B    #     X0,X1 OVERWRITTEN,X2 ON NORMAL EXIT   
7KN2    TESTLOOK
7L7L          LDX   1  3
7LM=          TESTLOOK  1,TESTA1,2  
7M6W          LDX   3  1
7MLG          EXIT  4  1
7N66    TESTA1  
7NKQ          LDX   3  1
7P5B          PSTAC    2,3                 [RESET X2
7PK2          EXIT  4  0
7Q4L    #   
7QJ=    #   
7R3W    # -------------------------------------------------------------------   
7RHG    #   
7S36    RBACK                              [READBACK,N/Z DEPTH. 
7S=Y ...      STOZ     AWORK1(2)
7SGQ          CALL  4  ZINTRO          [CHECK EVERYTHING 8 GET PTRS.
7T2B          BRN      RBRA 
7TG2    ZRBACK                             [READBACK ZERO DEPTH.
7T^L          STOZ     7                   [DEPTH   
7W9D ...      STOZ     AWORK1(2)
7WF=          CALL  4  ZEXTRO   
7WYW    RBRA
7XDG          LDCT  0  #20  
7XY6          STO   0  AWORK4(2)           [MARKER TO SHOW READBACK.
7YCQ          ADDSKIP  I516A,IRBCK  
7YXB          BRN      RBACP               [DO A BACKSPACE  
7^C2    #   
7^WL    # -------------------------------------------------------------------   
82B=    REWIND                             [REWIND  N/Z DEPTH.  
82TW                                       [ENTRY: REWIND NONZERO DEPTH 
83*G          CALL  4  ZINTRO              [CHECK DEPTH & SET X3=>FCA   
83T6          BRN      RWIA 
84#Q    ZREWIND                            [REWIND ZERO DEPTH.  
84SB          STOZ     7                   [DEPTH   
85#2          CALL  4  ZEXTRO              [X3 => F.C.A 
85RL    RWIA
86?=          ADDSKIP  I516A,IREWI  
86QW          CALL  4  POINTERS    [X1-> F.C.B, X2-> FSTACK BLOCK   
87=G    #SKI  K6PERUSFIL
87Q6    (   
889Q          JMBAC    Z11,3,BAMREAD,BAMREADR,BAMAPP,BAMWRITE,BAMGEN,BAMCLEAN   
88PB                                       [CHECK FILE OPEN IN ANY MODE EXCEPT  
8992                                       [COPY. ERROR IF NOT. 
89NL    )   
8=8=          LDX   0  FREADBLOCK(3)
8=MW          BNG   0  RWIEXIT  
8?7G          SBN   0  FBLKS               [DON'T TRY TO FREE 1ST BLOCK , NOR   
8?M6          BZE   0  RWIEXIT             [LOOK FOR IT IF IT'S AN EMPTY FILE.  
8#6Q          ADDSKIP  I516A,ARWFR  
8#LB          CALL  5  SFUBFREE        [DEAL WITH BLOCK 
8*62    RWIEXIT 
8*KL          NGS   1  FREADBLOCK(3)       [INITIALISE  THE 
8B5=          NGS   1  FREADWORD(3)        [TWO  POINTERS   
8BJW          UP
8C4G    # -------------------------------------------------------------------   
8C7L ...ZBSKIP  
8C=Q ...      LDX   0  ACOMMUNE8(2) 
8C*W ...      STO   0  AWORK1(2)
8CF2 ...      BRN      ZBASKI   
8CJ6    NBSPACE                            [BACKSPACE N/Z DEPTH.
8D3Q                                       [BACKSPACE :NONZERO DEPTH
8D?J ...      STOZ     AWORK1(2)
8DHB          CALL  4  ZINTRO              [CHECK DEPTH;X3-> FCA
8F32          BRN      RBAC 
8FGL    ZBSPACE                            [BACKSPACE ZERO DEPTH.   
8FMS ...      STOZ     AWORK1(2)
8FT2 ...ZBASKI  
8G2=          LDN   7  0                      [BACKSPACE ; ZERO DEPTH   
8GFW          CALL  4  ZEXTRO              [X3 -> FCA   
8G^G    RBAC
8HF6          ADDSKIP  I516A,IBACK  
8HYQ          SMO      FX2  
8JDB          STOZ     AWORK4              [SET B'SPACE MARKER  
8JY2    RBACP   
8KCL          CALL  4  POINTERS            [X2-> FSTACK X1-> FCB
8KX=    #SKI  K6PERUSFIL
8LBW    (   
8LWG          JMBAC    ZGEOER6,3,BAMREAD,BAMAPP,BAMGEN,BAMCLEAN 
8MB6                                       [CHECK FILE OPEN IN READ,APPEND  
8MTQ                                       [GENERAL OR CLEAN MODE. ERROR IF NOT.
8N*B    )   
8NT2          LDX   0  FREADBLOCK(3)
8P#L          BPZ   0  RBACQ               [J IF FILE PREVIOUSLY ACCESSED   
8PS=    RBACT   
8PWF ...      LDX   2  FX2  
8PYN ...      LDX   0  AWORK1(2)
8Q2X ...      BZE   0  NFH  
8Q56 ...      STO   0  ACOMMUNE8(2) 
8Q7* ...      BRN      XSETRE   
8Q9J ...NFH 
8Q?W          LDCT  0  #20  
8QRG          SMO      FX2  
8R?6          ANDX  0  AWORK4   
8RQQ          BZE   0  ZGEOER8             [BEG FILE IF NOT READBACK
8S2J ...XSETRE  
8S=B          SETREP   BEGFILE             [SET REPLY & UP  
8SQ2          UP
8T9L    RBACQ   
8TP=          SBX   0  FBLMOD(1)           [CHECK IF ABOUT TO,OR HAVE READ  
8W8W          SBN   0  A1                  [E.O.F   
8WNG          BPZ   0  RBACM               [J IF SO 
8X86          LDX   0  FREADWORD(3)        [RECORD POINTER  
8XMQ          BNG   0  RBACA               [J IF BACKSPACED OFF FRONT OF
8Y7B                                       [PRESENT BLOCK   
8YM2          SBN   0  A1   
8^6L          BZE   0  RBACB               [J IF READ 1ST RECORD OF THIS BLOCK  
8^L=          CALL  5  SFUBREAD1           [GET X1-> USAGE BLOCK
925W    RBACNEX 
92KG          LDN   4  A1   
9356    RBACC   
93JQ          SMO      4
944B          LDEX  0  FRH(1)              [NEXT R.H.   
94J2          ADX   4  0                   [X4 IS FREADWORD-TYPE POINTER
953L          BXU   4  FREADWORD(3),RBACC  [J IF NOT YET UP TO FREADWORD
95H=          SBN   4  A1   
962W          BNZ   4  NOTST8              [J IF NOT EMPTY BLOCK
96GG    RSETNG  
9726          NGS   1  FREADWORD(3) 
97FQ          BRN      RBACN               [TRY AGAIN   
97^B    NOTST8  
98F2          SBS   0  FREADWORD(3)        [IF WE ARE,GO BACK ONE   
98YL          SMO      FREADWORD(3) 
99D=          LDX   0  FRH(1)   
99XW          BPZ   0  RBACN               [J IF NOT DUMMY  
9=CG          LDX   0  FREADWORD(3)        [J IF NOT DUMMY & FROET  OF BCOLK
9=X6          SBN   0  A1   
9?BQ          BZE   0  RSETNG   
9?WB          BRN      RBACNEX             [J BACK & FIND NEXT ONE UP   
9#B2    RBACN   
9#TL          LDX   0  FREADWORD(3) 
9**=          BPZ   0  YPOS 
9*SW          PSTAC    2,3                 [X2->FSTACK  
9B#G          BFCBX    1,2                 [X1->FCB 
9BS6          CALL  5  SFUBFREE            [DEAL WITH SPENT BLOCK.  
9C?Q          LDX   0  FREADBLOCK(3)
9CRB          SBN   0  FBLKS
9D?2          BNZ   0  YPOS                [J IF NOT 1ST BLOCK. 
9DQL          NGS   2  FREADBLOCK(3)
9F==    YPOS
9FPW          LDCT  0  #20  
9G5K ...      SMO      FX2  
9GF# ...      ANDX  0  AWORK4   
9H8Q          BNZ   0  RAGA                [J  IF BACKREAD  
9H=7 ...      SMO      FX2  
9H?J ...      LDX   0  AWORK1   
9H#^ ...      BNG   0  ZGEOER2  
9HBB ...      BZE   0  RBACKOUT 
9HCR ...      SBN   0  1
9HF8 ...      SMO      FX2  
9HGK ...      STO   0  AWORK1   
9HJ2 ...      BNZ   0  RBACP
9HJN ...RBACKOUT
9HKC ...      SETREP  OK
9HNB          UP
9J82    RBACX   
9JML          LDX   6  1                   [-> BLOCK
9K7=          PSTAC 2,3 
9KLW          CALL  5  VFREE2              [FREE BLOCK  
9L6G          BRN   RBACY   
9LL6    RBACA   
9M5Q          ADDSKIP I516A,ABAFR   
9MKB          CALL  5  SFUBFREE            [DEAL WITH SPENT BLOCK   
9N52    RBACY   
9NJL    #SKI  K6PERUSFIL                   [N/Z DEPTH   
9P4=    (   
9PHW          LDN   0  FBLKS                 [ERROR IF 1ST BLOCK
9Q3G          BXE   0  FREADBLOCK(3),RBACT  
9QH6    )   
9R2Q          LDN   0  1
9RGB          SBS   0  FREADBLOCK(3)       [BACK ONE BLOCK  
9S22          CALL  5  SFUBREAD1           [READ DOWN BLOCK/OR FIND IT  
9SFL          LDN   4  A1   
9S^=          LDX   2  1
9TDW    RBACD   
9TYG          SMO      4                   [X4 CONTAINS THIS REC.HEADER 
9WD6          LDX   0  FRH(2)              [NEXT RH.
9WXQ    YDUM82A                            [FX2 CONTAINS LAST POINTER.  
9XCB          BZE   0  RBACH               [J IF END OF BLOCK   
9XX2          BPZ   0  NDUM81              [JIF NOT DUMMY   
9YBL    YDUM81  
9YW=          LDEX  0  0                   [9 BITS  
9^*W    #SKI  K6PERUSFIL
9^TG          BZE   0  ZGEOER2  
=2*6          ADX   4  0                   [UPDATE CT.  
=2SQ          SMO   4   
=3#B          LDX   0  FRH(2)              [NEXT R.H.   
=3S2          BRN      YDUM82A  
=4?L    NDUM81  
=4R=          STO   4  5
=5=W          ADX   2  4
=5QG          LDX   4  0                   [UPDATE X4   
=6=6          BRN      RBACD
=6PQ    RBACH   
=79B          SBX   2  1                   [DATUMISE S2 
=7P2          BZE   2  RBACX               [THIS IS A NULL BLOCK(FULL OF DUMMIES
=88L          LDN   0  A1                  [TEST FOR 1 RECORD IN BLOCK  
=8N=          BXE   0  2,RBACRBZ           [J IF SO 
=97W          SBX   2  5                   [O/W SUBTRACT "LAST BUT TWO"'TH R.H. 
=9MG          BRN      RBACJ
==76    RBACRBZ 
==LQ          NGX   2  4                   [SET F'WORD <0   
=?6B    RBACJ   
=?L2          STO   2  FREADWORD(3)        [UPDATE RECORD POINTER   
=#5L          BRN      RBACN
=#K=    RBACB   
=*4W          LDX   0  FREADBLOCK(3)       [CHECK IF 1ST BLOCK (THIS WORKS  
=*JG          SBN   0  FBLKS               [EVEN FOR PSEUDO-READ ON EMPTY   
=B46          BNZ   0  RBACL               [FILE).J IF NOT. 
=BHQ          LDCT  0  #20  
=C3B          SMO      FX2  
=CH2          ANDX  0  AWORK4              [J IF NOT READBACK   
=D2L          BZE   0  RBACS
=DG=          SETREP   FIRSTREC 
=D^W          UP
=FFG    RBACS   
=F^6    RBACL   
=GDQ          NGS   2  FREADWORD(3)        [RANDOM NEGATIVE NUMBER  
=GYB          BRN      RBACN
=HD2    RBACM   
=HXL          LDX   0  FREADWORD(3)        [IF READ E.O.F,SET'ABOUT 
=JC=          BPZ   0  RBACB               [TO READ EOF.
=JWW          BRN      RBACY
=KBG    #   
=KW6    #   
=L*Q    #     ----------------------------------------------------------------- 
=LTB    #   
=M*2    #     GETAFURB,WHICH GETS THE CURRENT USAGE BLOCK   
=MSL    #   
=N#=    #   
=NRW    NGET                               [N/Z DEPTH ENTRY.
=P?G          CALL  4  ZINTRO   
=PR6          BRN      RGETAFA  
=Q=Q    ZGET                               [ZERO DEPTH ENTRY.   
=QQB          STOZ     7
=R=2          CALL  4  ZEXTRO   
=RPL    RGETAFA 
=S9=          ADDSKIP  I516A,IGETA  
=SNW          CALL  4  POINTERS 
=T8G          LDX   0  FREADBLOCK(3)       [BLOCK POINTER   
=TN6          BPZ   0  RGETAFB  
=W7Q          LDN   0  FBLKS               [IF IFLE REWOUND,READ 1ST BLOCK  
=WMB          STO   0  FREADBLOCK(3)
=X72    RGETAFB 
=XLL    #SKI  K6PERUSFIL
=Y6=    (   
=YKW ...      SBX   0  FBLMOD(1)
=^5G          SBN   0  A1   
=^K6          BPZ   0  ZGEOER3  
?24Q    )   
?2JB          CALL  5  SFUBREAD 
?342          UP
?3HL    #   
?43=    #   
?4GW    # --------------------------------------------------------------------  
?52G    #     READB- READS DOWN THE NEXT BLOCK,RECHAINS IT NEXT TO THE ACTIVITY 
?5G6    #     BLOCK AS A FILE/FRB   
?5^Q    #   
?6FB    READB                              [N/Z DEPTH   
?6^2          CALL  4  ZINTRO              [CHECK  DEPTH;X3 -> FCA  
?7DL          BRN      RBIN 
?7Y=    ZREADB                             [ZERO DEPTH. 
?8CW          STOZ    7 
?8XG          CALL  4  ZEXTRO   
?9C6    RBIN
?9WQ          ADDSKIP  I516A,IREAB  
?=BB          CALL  4  POINTERS            [X2-> FSTACK X1-> FCB
?=W2    #SKI  K6PERUSFIL
??*L    (   
??T=          JMBAC    Z7,3,BAMREAD,BAMREADR,BAMAPP,BAMWRITE,BAMGEN,BAMCLEAN
?##W                                       [CHECK FILE OPEN IN ANY MODE EXCEPT  
?#SG                                       [COPY. ERROR IF NOT. 
?*#6    )   
?*RQ          NGS   4  FREADWORD(3)        [INITIALISE F'WORD   
?B?B          LDX   0  FREADBLOCK(3)       [BLOCK POINTER   
?BR2          BPZ   0  RBBEG               [1 FIRST BLOCK NOT WANTOD
?C=L          LDX   0  FBLMOD(1)           [POINTS(+A1) TO LAST BLOCK   
?CQ=          SBN   0  AF2-A1              [IS FILE EMPTY(FBLMOD-> BSPRE)?  
?D9W          BNZ   0  RBFBLK              [J IF NOT SO 
?DPG          LDN   0  FBLKS
?F96          STO   0  FREADBLOCK(3)       [MOVE BLOCK PTR. 
?FNQ    RBCOR   
?G8B          SETNCORE  0,1,FILE,FRB       [ZERO READ BLOCK 
?GN2          UP
?H7L    RBFBLK  
?HM=          LDN   0  FBLKS               [SET FREADWORD TO 1ST BLOCK  
?J6W          STO   0  FREADBLOCK(3)       [
?JLG          BRN      RBFUB
?K66    RBBEG   
?KKQ          SBX   0  FBLMOD(1)           [TEST IF THERE ARE NO MORE BLOCKS
?L5B          SBN   0  A1-1                [I.E.[FREADWORD]=[FBLMOD]+A1-1   
?LK2          BZE   0  RBCOR1              [J IF SO 
?M4L    #SKI  K6PERUSFIL
?MJ=          BPZ   0  ZGEOER3  
?N3W          LDN   0  1
?NHG          ADS   0  FREADBLOCK(3)       [UPDATE F'BLOCK TO POINT TO NEXT BLK.
?P36    RBFUB   
?PGQ          CALL  5  SFUBREAD1           [GET BLOCK   
?Q2B          LDX   0  ATYPE(1)            [MUSTNT REMOVE IT BEFORE IT HAS BE5N 
?QG2          BXE   0  FFSFUWB,RBNEWB      [MUSTN'T REMOVE IT BEFORE IT HAS 
?Q^L                                       [BEEN BACKWRITTEN.   
?RF=          NAME  1,FILE,FRB             [RENAME IT   
?RYW          CHAIN 1,FX2                  [RECHAIN IT  
?SDG          UP
?SY6    RBCOR1  
?TCQ          LDN   0  1                   [UPDATE  
?TXB          ADS   0  FREADBLOCK(3)       [FB'LK   
?WC2          BRN      RBCOR
?WWL    RBNEWB  
?XB=          SETNCORE GSBS,2,FILE,FRB     [SET UP FRB  
?XTW          CALL  4  ZFSTACK             [-> FCA  
?Y*G          CALL  5  SFUBREAD            [-> USAGE BLOCK  
?YT6          MHUNTW  2,FILE,FRB
?^#Q          LDX   0  BACK1(1)            [MOVE WEVR B.S.QFME  
?^SB          STO   0  BACK1(2) 
#2#2          LDX   0  BACK2(1) 
#2RL          STO   0  BACK2(2) 
#3?=          ADN   1  A1   
#3QW          ADN   2  A1   
#4=G          MOVE  1  0                   [MOVE ACROSS DATA.   
#4Q6          UP
#59Q    #   
#5PB    #   
#692    # ----------------------------------------------------------------*--*  
#6NL    #   
#78=    READAGAIN                          [READAGAIN N/Z DEPTH.
#7MW          CALL  6  ZDEEP
#87G          BRN      RAGA 
#8M6    ZREADAGAIN                         [READAGAIN ZERO DEPTH.   
#96Q          STOZ     7
#9LB    RAGA
#=62          ADDSKIP  I516A,IRDAG  
#=KL          LDX   3  7
#?5=          STEPAGAIN 0(3)               [STEP ONTO CURRENT RECORD
#?JW    RAGB
##4G          BZE   3  RAGG                [J IF 1 WD FRB + ZERO RH 
##J6          LDEX  4  FRH(3)   
#*3Q    RAGE
#*HB          SETUPCOR  4,2,FILE,FRB       [SET  UP FRB 
#B32          LDX   3  7
#BGL          STEPAGAIN 0(3)               [STEP ONTO RECORD AGAIN  
#C2=          BZE   3  RAGF                [J IF STILL ZERO I.E,E.O.F   
#CFW          LDEX  0  FRH(3)              [PICK UP R.H.
#C^G          BXU   0  4,RAGC              [J IF R.H.CHANGED
#DF6          MHUNTW  2,FILE,FRB
#DYQ          STO   2  4
#FDB          ADN   4  A1   
#FY2          SMO      FRH(3)              [MOVE IN NEW RECORD  
#GCL          MOVE  3  0
#GX=    SOK 
#HBW          SETREP   OK   
#HWG          UP
#JB6    RAGC  MFREEW   FILE,FRB 
#JTQ          BRN      RAGB 
#K*B    RAGG  LDN   4  1                   [1 WD FRB FOR E.O.F. 
#KT2          BRN      RAGE 
#L#L    RAGF
#LS=          MHUNTW  2,FILE,FRB
#M?W          STOZ     A1(2)               [STOZ R.H.   
#MRG          BRN      SOK  
#N?6    #   
#NQQ          MENDAREA 30,K99PERUSFIL   
#P=B    #   
#PQ2    #END
#Q9L    #   
#QP=    #   
^^^^ ...45170314000300000000