FHOBJDIR860

(George Source)

Macros used: ACROSS, ALTLENG, BACKSPACE, BBUS, BC, BITDEFS, BS, BWNZ, BWZ, BXE, BXGE, BXU, DELETE, FADDRESS, FLIPS, FOUTMOVE, FREECORE, FULLBPAS, GETDIR, INMOVE, INSERT, JBC, JBCC, JBS, JBSS, JFZ, JMBS, MBC, MBS, MENDAREA, MFREE, MFREEW, MHUNT, MHUNTW, NAME, OUTMOVE, PAIR, READ, REWRITE, SEG, SEGENTRY, SETNCORE, SETREP, SETUPCORE, SETUPTAB, SKIP, STEP, STEPAGAIN, TAB, TABRESET, TABREWIND, TABSET, TABULATE, TESTREP2, TESTRPN2, TOPCA1, TOPFCA2, TOPFCB, TOPFCB2, TREP2, VFREE, VFREEW

FHOBJDIR860.txt
22FL          SEG      FHOBJDIR,860,FILE
22^=    #   
23DW    #  THIS IS THE FILEHANDLER SEGMENT WHICH IMPLEMENTS 'DIRECTORY ENTRY'   
23YG    #  MODE PERIS (#30,#32,#33,#34,#37) 
24D6    #  IT IS ENTERED ACROSS FROM MASTER SEGMENT FHOBJ WITH MOST PRELIMINARY 
24XQ    #  CHECKS COMPLETED ( INCLUDING THE 'CHECKB' ON THE BUFFER).
25CB    #   
25X2          SEGENTRY K1FHOBJDIR,PERI  
26BL          SEGENTRY K2FHOBJDIR,MDIR2RETURN  [OK RETURN FROM MODE #33 NAME
26W=                                       [REC ALTERATION CHECKS IN FHDIRTWO   
27*W          SEGENTRY K3FHOBJDIR,NILDATA  [ILLEGAL RETURN  
27TG          SEGENTRY K4FHOBJDIR,REJECT   [REJECTION RETURN
28*6    #   
28SQ    #  AWORK AND ACC CONVENTIONS ARE AS FOR FHOBJ.  
29#B    #   
29S2    #  BIT IDENTIFIERS:-
2=?L          BITDEFS  AWORK4,23,MFHEOFMULT    [WE'VE RUN OFF THE END OF A  
2=R=                                           [MULTIFILE. NO FURTHER PERIS 
2?=W                                           [CAN BE IMPLEMENTED. 
2?QG          BITDEFS  AWORK4,22,MFHDIRMOD     [THIS IS A DIRECTORY MODE WE'RE  
2#=6                                           [IMPLEMENTING
2#PQ          BITDEFS  AWORK4,21,MFHRECEOF     [LAST READ PERI LEFT US  
2*9B                                           [AFTER EOF.  
2*P2          BITDEFS  AWORK4,20,MFHBLOCKEOF   [SIMILAR BIT FOR BLOCK PERIS.
2B8L                                           [HAS TO BE HANDLED SEPARATELY
2BN=                                           [OWING TO DIFFERENT POINTER  
2C7W                                           [CONVENTIONS.
2CMG          BITDEFS  AWORK4,19,MFHNOT1ST     [THIS IS NOT THE 1ST PERI.   
2D76          BITDEFS  AWORK4,18,MFHDIROWN     [USER OWNS THE FILES IN  
2DLQ                                           [THIS DIRECTORY  
2F6B          BITDEFS  AWORK4,17,MFHNONSER     [THIS IS A DA,DR, OR MT FILE 
2FL2          BITDEFS  AWORK4,16,MFHCHUCKOFF   [WE ARE THROWING THIS FILE   
2G5L                                           [OFFLINE (SET DURING MODE #33).  
2GK=          BITDEFS  AWORK4,15,MFHTRAPSALT   [WE ARE ALTERING THIS FILE'S 
2H4W                                           [TRAPS (SET DURING MODE #33).
2HJG          BITDEFS  AWORK4,14,MFHTABSSET    [THE TAB SYSTEM HAS BEEN 
2J46                                           [INITIALISED.
2JHQ    #   
2K3B    #   
2KH2    #  SUNDRY PRESET CONSTANTS:-
2L2L    MASKREPADDR    #60777777           [MASK OF MS2 AND LS18 BITS FOR USE   
2LG=                                       [ASSEMBLING READ MODE REPLIES
2L^W    VALUEFIVE      5
2MFG ...MBIT2SET       #10000000          [USED IN VALIDATING GEN NOS.  
2M^6    #   
2NDQ    #  SOME BIT MASKS   
2NYB    #   
2PD2 ...MEINF1SAME  #21357177              [BITS TO BE UNCHANGED IN EINF1   
2PXL    MEINF2SAME  #37501242              [DITTO EINF2 
2QC=    MEINF1REJ5  #06000200              [BITS IN EINF1 CAUSING REJECTION 5   
2QWW                                       [IF CHANGED  
2RBG    MEINF2REJ5  #02000000              [DITTO EINF2 
2RW6    MASKECOPS   #77700001              [PERMITTED BITS IN ECOPS 
2S*Q    #   
2STB    #   
2T*2    #   
2TSL    #   
2W#=    #  ******************************************************************** 
2WRW    #   
2X?G    #  THIS SECTION CONTAINS THE SUBROUTINES USED IN THE IMPLEMENTATION 
2XR6    #  SECTIONS.
2Y=Q    #   
2YQB    #  ******************** 
2^=2    #  SUBROUTINE TO VALIDATE A NAME OR LANGUAGE CODE.  
2^PL    #  CALLED ON X6. EXPECTS X4->DATA,X5=NO OF CHARS.   
329=    #   
32NW    NAMECHECK   
338G          LDX   1  4                   [X1->DATA
33N6          LDX   0  0(1)                [CHECK 1ST WD NEGATIVE ( 1ST CHAR A  
347Q          BPZ   0  NILDATA             [LETTER) 
34MB    NAMECHAR
3572          LDCH  0  0(1)                [PICK UP CHAR
35LL          SBN   0  10   
366=          BNG   0  NMCHAROK            [OK IF NUMBER
36KW          SBN   0  #20-10   
375G          BZE   0  NMCHAROK            [AND IF ' '  
37K6          SBN   0  #35-#20  
384Q          BZE   0  NMCHAROK            [AND IF '-'  
38JB          SBN   0  #41-#35  
3942          BNG   0  NILDATA             [OTHERWISE ILLEGAL IF NOT A LETTER   
39HL          SBN   0  #73-#41  
3=3=          BPZ   0  NILDATA  
3=GW    NMCHAROK
3?2G          BCHX  1  £                   [UPDATE CHAR POINTER 
3?G6          BCT   5  NAMECHAR            [LOOP IF MORE CHARS TO CHECKS
3?^Q          LDX   1  FX1  
3#FB          EXIT  6  0
3#^2    #   
3*DL    #  ******************** 
3*Y=    #   
3BCW    #  SUBROUTINE TO MOVE USER BUFFER OUT INTO A FILE/FRB AND PERFORM BASIC 
3BXG    #  FORMAT CHECKS AND CONVERSIONS.   
3CC6    #  CALLED ON X6, COORDINATES.   
3CWQ    #   
3DBB    #  FIRST WE SET UP THE FRB AND MOVE THE ENTIRE BUFFER OUT. THIS IS  
3DW2    #  SOMEWHAT WASTEFUL SINCE WE ARE ONLY GOING TO THROW THE BLOCKS AND
3F*L    #  INDEX RECORDS AWAY BUT TO IMPLEMENT IT USING REPEATED ACCESS TO THE  
3FT=    #  CORE IMAGE WOULD BE VERY COMPLICATED AND LONG.   
3G#W    #   
3GSG    OUTBUFFER   
3H#6          SBX   6  FX1                 [RELATIVISE LINK 
3HRQ          SETUPCORE ACA3(2),3,FILE,FRB [X3->FRB OF RIGHT SIZE   
3J?B          LDN   3  A1(3)               [X3->DESTINATION OF DATA.
3JR2          LDX   4  AWORK2(2)           [X4->BUFFER IN PROGRAM   
3K=L          LDX   5  ACA3(2)             [SIZE OF BUFFER  
3KQ=          LDN   1  512                 [MAXIMUM MOVE
3L9W    OUTMLOOP
3LPG          BXGE  5  1,MAXMOVE           [DO MAX MOVE IF SIZE>MAX 
3M96          LDX   1  5                   [OTHERWISE DO ONLY MOVE REQUIRED 
3MNQ    MAXMOVE 
3N8B          OUTMOVE  APETADDR(2),4,3,1   [DO MOVE 
3NN2          ADX   3  1                   [UPDATE FRB POINTER  
3P7L          ADX   4  1                   [AND BUFFER POINTER  
3PM=          SBX   5  1                   [DECREMENT SIZE LEFT TO MOVE 
3Q6W          BNZ   5  OUTMLOOP            [IF MORE TO MOVE LOOP
3QLG          LDX   1  FX1                 [RESTORE CORRUPTED X1
3R66    #   
3RKQ    #     **********
3S5B    #   
3SK2    #  WE NOW PARTLY VALIDATE THE NAME RECORD AND CARRY OUT NECESSARY CONVER
3T4L    #   
3TJ=          MHUNTW   3,FILE,FRB   
3W3W          LDX   0  A1(3)               [CHECK RECORD HEADER 
3WHG          SBN   0  FRDE 
3X36          BNZ   0  NILDATA             [ILLEGAL IF WRONG SIZE   
3XGQ
3Y2B          BWNZ     ERES(3),NILDATA     [ILLEGAL IF DOESNT LOOK LIKE NAME REC
3YG2
3Y^L          LDX   0  EGMTLA(3)           [IF GMTLA NONZERO CONVERT IT 
3^F=          BZE   0  NOGMTSET 
3^YW          SBX   0  GMTNOW   
42DG          NGS   0  EGMTLA(3)
42Y6    NOGMTSET
43CQ    #   
43XB    #  IF THE ENTRY APPEARS TO BE FOR A FILESTORE FILE WE SET OR CLEAR BITS 
44C2    #  BEMT+BESERIAL SO AS TO BE CONSISTENT WITH ETM
44WL    #   
45B=          JMBS     NOTAFILE,3,BELIB,BEEXO   
45TW          MBC      3,BEMT,BESERIAL     [CLEAR THE BITS  
46*G          LDXC  0  ETM(3)              [PICK UP TYPE MODE DROPPING B0   
46T6          SRL   0  15                  [GET TYPE NO 
47#Q          SBN   0  5                   [COMPARE IT AGAINST *MT  
47SB          BPZ   0  NOTSERTYPE          [J UNLESS SERIAL FILE
48#2          BS       3,BESERIAL          [SET SERIAL BIT  
48RL          BRN      NOTAFILE 
49?=    NOTSERTYPE  
49QW          BNZ   0  NOTAFILE            [NO BITS REQD FOR DA OR DR   
4==G          BS       3,BEMT              [OTHERWISE MUST BE MT
4=Q6    NOTAFILE
4?9Q    #   
4?PB    #  WE CHECK THAT SIZE<=MAXSIZE, INCREASING MAXSIZE TO SIZE IF THIS IS   
4#92    #  NOT SO.  
4#NL    #   
4*8=          LDX   0  ECOPS(3) 
4*MW          SRL   0  15                  [SIZE
4B7G          LDEX  4  EINF3(3)            [MAXSIZE 
4BM6          SBX   0  4                   [X0=SIZE-MAXSIZE 
4C6Q          BNG   0  SIZEOK              [OK IF SIZE<MAXSIZE  
4CLB          ADX   4  0                   [OTHERWISE MODIFY MAXSIZE
4D62    SIZEOK  
4DKL          DEX   4  EINF3(3)            [PUT MAXSIZE BACK
4F5=    #   
4FJW    #     **********
4FLS ...#   
4FNQ ...#  WE SET BIT BEFHDIRMODE IN THE DIRECTORY ENTRY TO SHOW THAT IT HAS
4FQN ...#  BEEN INSERTED OR REWRITTEN BY A FILEHANDLER PERI.
4FSL ...#   
4FWJ ...      BS       3,BEFHDIRMODE
4FYG ...#   
4G2D ...#     **********
4G4G    #   
4GJ6    #  NEXT WE CHECK THE RECORD HEADERS OF BLOCKS AND INDEX RECORDS (IF ANY)
4H3Q    #  AND GET AN OFFSET DOWN FRB TO THE FIRST TRAPS RECORD.
4HHB    #   
4J32          LDN   4  FRDE                [OFFSET DOWN FRB TO 1ST REC AFTER
4JGL                                       [NAME REC
4K2=    RECHDLOOP   
4KFW          LDX   0  4
4K^G          SBX   0  ACA3(2)             [CHECK NEW OFFSET AGAINST SIZE OF BUF
4LF6          BZE   0  NOTRAPS             [J IF HAVE REACHED END WITHOUT   
4LYQ                                       [FINDING TRAPS   
4MDB          BPZ   0  NILDATA             [ILLEGAL IF OFF END OF BUFFER
4MY2          SMO      4
4NCL          LDX   0  A1+1(3)             [IF ITS A TRAP RECORD JUMP OUT OF
4NX=          BNG   0  VALTRAPS            [THIS LOOP TO VALIDATE TRAPS 
4PBW          SMO      4
4PWG          LDEX  0  A1(3)               [PICK UP RECORD HEADER   
4QB6          BZE   0  NILDATA             [ILLEGAL IF ZERO 
4QTQ          ADX   4  0                   [UPDATE OFFSET IN X4 
4R*B          BRN      RECHDLOOP           [LOOP TO LOOK AT NEXT REC
4RT2    #   
4S#L    #     **********
4SS=    #   
4T?W    #  WE HAVE LOCATED THE FIRST TRAP RECORD. WE KEEP A COPY OF THE OFFSET  
4TRG    #  TO IT IN ACOMMUNE1 FOR LATER USE IN MOVING THE TRAPS UP THE FRB. 
4W?6    #  NOW WE CHAIN DOWN THE TRAPS VALIDATING THEM AND ACCUMULATING A   
4WQQ    #  COUNT IN X5 TO BE STORED IN ENUSE IN THE NAME RECORD.
4X=B    #   
4XQ2    VALTRAPS
4Y9L          LDN   5  0                   [TRAP COUNT  
4YP=          STO   4  ACOMMUNE1(2)        [KEEP COPY OF OFFSET 
4^8W    TRAPVAL 
4^NG          SMO      4
5286          LDX   0  A1+1(3)             [CHECK USERNAME STARTS WITH A LETTER 
52MQ          BPZ   0  NILDATA  
537B          SMO      4
53M2          LDEX  0  A1(3)               [CHECK RECORD HEADER IS 5
546L          SBN   0  5
54L=          BNZ   0  NILDATA             [ILLEGAL IF NOT  
555W          ADN   5  1                   [UPDATE COUNT OF TRAPS   
55KG          ADN   4  5                   [UPDATE OFFSET   
5656          LDX   0  4
56JQ          SBX   0  ACA3(2)             [COMPARE IT AGAINST BUFFER SIZE  
574B          BNG   0  TRAPVAL             [JUMP IF NOT FINISHED YET
57J2          BNZ   0  NILDATA             [ILLEGAL IF OFF END OF BUFFER
583L    #   
58H=    #     **********
592W    #   
59GG    #  WE HAVE VALIDATED ALL THE TRAPS, HAVE AN OFFSET TO THE FIRST OF THEM 
5=26    #  IN ACOMMUNE1 AND A COUNT OF THEM IN X5. NOW WE PUT THE COUNT IN ENUSE
5=FQ    #  (WE DON'T TRUST THE USER TO GET IT RIGHT).   
5=^B    #   
5?F2          STO   5  ENUSE(3) 
5?YL    #   
5#D=    #     **********
5#XW    #   
5*CG    #  IF THERE ARE BLOCK AND INDEX RECORDS WE MOVE THE TRAPS UP OVER THEM. 
5*X6    #  WE DO THIS ONE TRAP AT A TIME SINCE IN THEORY THERE COULD BE UP TO   
5BBQ    #  512 OF THEM. 
5BWB    #   
5CB2          LDN   0  FRDE                [OFFSET TO 1ST REC AFTER NAME REC
5CTL          BXE   0  ACOMMUNE1(2),NOMOVE [J IF NO MOVE REQUIRED (NO BLOCKS
5D*=                                       [OR INDEX RECORD).   
5DSW          SMO      ACOMMUNE1(2) 
5F#G          LDN   2  A1(3)               [X2->1ST TRAP
5FS6          LDN   3  A1+FRDE(3)          [X3->DESTINATION 
5G?Q    TRMOVE  
5GRB          MOVE  2  5                   [MOVE TRAP   
5H?2          ADN   2  5                   [UPDATE THE POINTERS 
5HQL          ADN   3  5
5J==          BCT   5  TRMOVE              [AND LOOP IF THERE ARE MORE TO MOVE  
5JPW          LDX   2  FX2                 [RESTORE CORRUPTED X2
5K9G          LDX   0  ACOMMUNE1(2) 
5KP6          SBN   0  FRDE                [X0=AMOUNT BY WHICH BUFFER TO BE 
5L8Q                                       [SHORTENED   
5LNB          LDX   4  ACA3(2)  
5M82          SBX   4  0                   [NEW BUFFER SIZE 
5MML          MHUNTW   3,FILE,FRB   
5N7=          BRN      SHORTENBUF          [JUMP TO SHORTEN BUFFER  
5NLW    #   
5P6G    #     **********
5PL6    #   
5Q5Q    #  IF WHILE CHECKING BLOCKS AND INDEX RECORDS WE DISCOVER THERE ARE 
5QKB    #  NO TRAPS WE JUST ZEROISE ENUSE AND SHORTEN THE BUFFER TO THE LENGTH  
5R52    #  OF A NAME RECORD. IF WE HAVE JUST MOVED SOME TRAPS UP WE ALSO SHORTEN
5RJL    #  IT TO THE SIZE CALCULATED IN THE LAST SUBSECTION.
5S4=    #   
5SHW    NOTRAPS 
5T3G          STOZ     ENUSE(3) 
5TH6          LDN   4  FRDE                [NEW BUFFER SIZE 
5W2Q    SHORTENBUF  
5WGB          ALTLENG  3,4  
5X22    NOMOVE  
5XFL    #   
5X^=    #     **********
5YDW    #   
5YYG    #  THATS THE LOT, WE JUST EXIT  
5^D6    #   
5^XQ          ADX   6  FX1  
62CB          EXIT  6  0
62X2    #   
63BL    #  ******************** 
63W=    #   
64*W    #  SUBROUTINE TO MOVE A RECORD INDICATED BY AN OFFSET REL TO FPTR OF A F
64TG    #  UP TO THE TOP OF THE FWB AND ADVANCE THE OFFSET IN X5 TO POINT TO
65*6    #  THE NEXT RECORD. 
65SQ    #  CALLED ON X6, DOES NOT COORDINATE, USES X0,2,3   
66#B    #   
66S2    MOVERECUP   
67?L          MHUNTW   3,FILE,FWB   
67R=          SMO      5
68=W          LDN   2  0(3)                [X2->RECORD  
68QG          LDN   3  A1(3)               [X3->DESTINATION 
69=6          LDEX  0  0(2)                [PICK UP RECORD SIZE 
69PQ          ADX   5  0                   [ADVANCE X5  
6=9B          SMO      0
6=P2          MOVE  2  0                   [MOVE RECORD UP  
6?8L          LDX   2  FX2                 [RESTORE OVERWRITTEN X2  
6?N=          EXIT  6  0
6#7W    #   
6#MG    #  ******************** 
6*76    #   
6*LQ    #  SUBROUTINE TO CARRY OUT THE INDEXED SEARCH FOR AN ENTRANT. EXPECTS   
6B6B    #  A FILE/FRB CONTAINING THE NAME RECORD PART OF THE BUFFER.
6BL2    #  THE ACTION IS AS FOLLOWS:-   
6C5L    #    1. VALIDATE THE KEYS AND SET UP A FLOCNB. IF THE KEYS GIVEN
6CK=    #       MAKE IT OBVIOUS WHAT TYPE OF ENTRANT IS WANTED THE APPROPRIATE  
6D4W    #       TYPE IS SET TN THE FLOCNB. IF A MODE #34 IS BEING IMPLEMENTED   
6DJG    #       THE TYPE CAN BE OBTAINED FROM OTHER PARTS OF THE NAME RECORD
6F46    #       BUT FOR A MODE #30 THE USER WILL PROBABLY HAVE SUPPLIED ONLY
6FHQ    #       THE KEYS AND SUBKEYS.   
6G3B    #    2. DO A GETDIR 7. THIS LOCATES THE ENTRY (IF ANY)  NOTICING
6GH2    #       TO-BE-ERASED ENTRIES, POSITIONING THE DIRECTORY 'HAVING JUST
6H2L    #       READ' THE NAME RECORD AND SETTING THE 'SINGLE' AND 'MULTI'  
6HG=    #       SUBREPLIES IF NECESSARY.
6H^W    #    3. EXAMINE THE REPLIES. IF THE REPLY IS 'OK' THE FLOCNB IS FREED   
6JFG    #       AND THE SUBROUTINE EXITS 6 1. IF A 'NOFILE' REPLY IS GIVEN  
6J^6    #       THE FLOCNB IS RETAINED AND THE SUBROUTINE EXITS 6 0. IN THE 
6KDQ    #       MODE #34 CASE THE SUBREPLIES ARE ALSO EXAMINED TO ENSURE NO 
6KYB    #       SINGLE/MULTIFILE CLASHES OCCUR. OTHER MAIN REPLIES RESULT   
6LD2    #       IN AN APPROPRIATE REJECTION.
6LXL    #   
6MC=    #  THE FIRST OBJECTIVE IS THE SETTING UP OF THE FLOCNB. IF A TSN IS 
6MWW    #  PRESENT WE NEED AN 8 WORD FLOCNB, OTHERWISE 6 WORDS WILL DO. 
6NBG    #  INITIALLY WE MAKE IT AN 'ANY TYPE' FLOCNB AND ZEROISE IT.
6NW6    #   
6P*Q    MGETDIR 
6PTB          SBX   6  FX1  
6Q*2          MHUNTW   3,FILE,FRB          [X3->NAME RECORD 
6QSL          LDN   4  6                   [SIZE IF NO TSN  
6R#=          BWZ      ESER(3),NOTSN1      [J IF NO TSN 
6RRW          LDN   4  8                   [SIZE FOR TSN FLOCNB 
6S?G    NOTSN1  
6SR6          SETUPCORE 4,2,FILE,FLOCNB    [X2->FLOCNB  
6T=Q          BS       2,BFABANY           [SHOW FLOCNB IS FOR ANY TYPE OF ENTRA
6TQB          STOZ     A1(2)
6W=2          LDN   3  A1+1(2)  
6WPL          LDN   2  A1(2)
6X9=          SBN   4  1
6XNW          SMO      4
6Y8G          MOVE  2  0                   [MOVE ZEROS THRU FLOCNB  
6YN6    #   
6^7Q    #     **********
6^MB    #   
7272    #  IF A LOCAL NAME IS PRESENT WE VALIDATE IT AND MOVE IT IN. THE
72LL ...#  VALIDATION CONSISTS OF ENSURING THAT THE NAME REEL AND GEN   
736= ...#  NUMBERS ARE VALID.   
73?D ...#  IN THE EXTERNAL INTERFACE THE MEANINGS OF EGEN=0 AND EGEN=#10000000  
73DL ...#  ARE REVERSED AND HERE IS WHERE THEY ARE TRANSLATED.  
73KW    #   
745G          MHUNTW   3,FILE,FRB   
74K6          MHUNT    2,FILE,FLOCNB
754Q          LDX   0  ELOC1(3) 
75JB          BZE   0  NOLOCNAME           [J IF NO LOCAL NAME  
7642          SMO      FX2  
76HL          STO   6  ACOMMUNE2           [SAVE LINK   
773=          LDN   5  12                  [NO OF CHARS TO CHECK
77GW          LDN   4  ELOC1(3)            [X4->NAME
782G          CALL  6  NAMECHECK           [VALIDATE LOCAL NAME 
78G6          SMO      FX2  
78^Q          LDX   6  ACOMMUNE2
79FB
79^2          LDX   0  EREEL(3)            [VALIDATE THE REEL NO. ACCEPTED VALUE
7=DL ...      SRL   0  9                   [ARE 0-511   
7=Y= ...      BNZ   0  NILDATA             [OK IF NO BITS IN B0-14  
7*BB          LDX   0  EGEN(3)             [VALIDATE THE GENERATION NUMBER. 
7*W2                                       [ACCEPTABLE VALUES ARE #4000XXXX,
7B*L                                       [#2000XXXX, #XXXX AND #10000000  
7BGS ...      BXE   0  MBIT2SET(1),ZEROG   [OK IF #10000000 AND JUMP TO ZER0 IT 
7BN2 ...      BNZ   0  NOTZEROGEN          [OK IF ZER0 BUT MUST BE CHANGED TO   
7BT8 ...      LDCT  0  #100                [#10000000 (THE MEANINGS OF THESE TWO
7C2B ...      STO   0  EGEN(3)             [NUMBERS ARE REVERSED IN THE EXTERNAL
7C7J ...      BRN      YGENOK              [INTERFACE). 0->#10000000.   
7C#Q ...ZEROG   
7CFY ...      STOZ     EGEN(3)             [#10000000->0.   
7CM6 ...      BRN      YGENOK   
7CS# ...NOTZEROGEN  
7C^G ...      SLL   0  2                   [IF NOT 0 OR #10000000 NONE OF   
7D6N ...      SRL   0  14                  [BITS 2-11 MAY BE SET
7D#6          BNZ   0  NILDATA  
7DRQ    YGENOK  
7F?B
7FR2          LDN   4  ELOC1(3)            [X4->1ST WD OF LOCAL NAME
7G=L          LDN   5  A1(2)               [X5->DESTINATION 
7GQ=          MOVE  4  5                   [TRANSFER IT 
7H9W          LDX   0  ELAN(3)             [NOT FORGETTING THE LANGUAGE CODE
7HPG          STO   0  A1+5(2)  
7J96    #   
7JNQ    #     **********
7K8B    #   
7KN2    #  IF A TSN IS PRESENT WE MOVE IT INTO THE FLOCNB, SET BITS BFABTSN 
7L7L    #  AND BFABLIB AND CLEAR BIT BFABANY.   
7LM=    #   
7M6W          LDX   0  ESER(3)  
7MLG          BZE   0  NOTSN2              [J IF NO TSN 
7N66    YTSN
7N*Y ...      BNG   0  NILDATA             [TSN MUST BE POSITIVE
7NKQ          STO   0  A1+7(2)             [STORE IT IN THE FLOCNB  
7P5B          MBS      2,BFABTSN,BFABLIB   [SHOW FLOCNB WITH TSN FOR LIB ENTRANT
7PK2          BWNZ     EUSE1(3),NILDATA      [CANT HAVE TSN+USERNAME
7Q4L    NOTANY  
7QJ=          BC       2,BFABANY           [CLEAR THE 'ANY ENTRANT' MARKER  
7R3W    NOTSN2  
7RHG    #   
7S36    #     **********
7SGQ    #   
7T2B    #  IF WE ARE IMPLEMENTING A MODE #34 WE SET THE CORRECT TYPE IN THE 
7TG2    #  FLOCNB USING DATA OTHER THAN THE KEYS FROM THE NAME RECORD. FIRST
7T^L    #  WE CHECK THAT THE TYPE HAS NOT ALREADY BEEN DECIDED BY THE ABOVE 
7WF=    #  CODE AS THIS ONLY HAPPENS FOR DIRS AND TAPES, NEITHER OF WHICH CAN   
7WYW    #  BE THE SUBJECT OF A MODE #34. WE THEN CLEAR THE 'ANY' BIT AND EXAMINE
7XDG    #  BIT BEEXO IN THE NAME RECORD, SETTING BIT BFABEXO IN THE FLOCNB  
7XY6    #  IF BEEXO IS SET. 
7YCQ    #  THIS SEQUENCE LEAVES THE FLOCNB MARKED 'FILE' OR 'SECUREX' AS
7YXB    #  APPROPRIATE. 
7^C2    #   
7^WL          LDCT  0  #020                [BIT 4   
82B=          SMO      FX2  
82TW          ANDX  0  AWORK1              [J IF NOT MODE #34   
83*G          BZE   0  NOWGETDIR
83T6          JBCC     NILDATA,2,BFABANY   [CHECK ABOVE CODE HASN'T DECIDED 
84#Q                                       [TYPE ALREADY AND CLEAR BIT BFABANY  
84SB          JBC      NOWGETDIR,3,BEEXO   [J UNLESS SECUREX NEEDED 
85#2          BS       2,BFABEXO           [MARK FLOCNB 'SECUREX'   
85RL          BRN      NOWGETDIR           [AND JUMP INTO NEXT STAGE OF S/R 
86?=    #   
86QW    #     **********
87=G    #   
87Q6    #  A LOOSE END FROM ABOVE: IF AN ENTRY HAS NO LOCAL NAME IT MUST HAVE   
889Q    #  A TSN OR USERNAME. IF IT'S A TSN WE JUMP TO MOVE IT IN. OTHERWISE WE 
88PB    #  VALIDATE THE USERNAME (IE ENSURE IT STARTS WITH A LETTER), PUT IT
8992    #  IN THE FLOCNB, AND JUMP TO CLEAR THE 'ANY' BIT (THUS MARKING THE 
89NL    #  FLOCNB AS FOR A FILE).   
8=8=    #   
8=MW    NOLOCNAME   
8?7G          LDX   0  ESER(3)  
8?M6          BNZ   0  YTSN                [J IF TSN SUPPLIED   
8#6Q          SMO      FX2  
8#LB          STO   6  ACOMMUNE2           [SAVE LINK   
8*62          LDN   5  12                  [CHARS IN NAME   
8*KL          LDN   4  EUSE1(3)            [X4->NAME
8B5=          CALL  6  NAMECHECK           [VALIDATE USERAAME   
8BJW          SMO      FX2  
8C4G          LDX   6  ACOMMUNE2           [RESTORE LINK
8CJ6          LDN   4  EUSE1(3)            [X4->USERNAME
8D3Q          LDN   5  A1+1(2)             [X5->DESTINATION 
8DHB          MOVE  4  3                   [MOVE USERNAME INTO FLOCNB   
8F32          LDX   0  HCOLUSER            [PUT COLON IN 1ST WD OF FLOCNB   
8FGL          STO   0  A1(2)
8G2=          LDX   0  ACES                [AND BLANKS IN LAST BUT ONE  
8GFW          STO   0  A1+4(2)  
8G^G          STOZ     A1+5(2)             [AND ZERO IN LAST ONE. THIS FORMAT SE
8HF6                                       [TO BE CONTRA-SPEC BUT GETDIR
8HYQ                                       [WILL ASSUME THAT BLANKS IN WORD 
8JDB                                       [A1+5 ARE THE KEY FOR THE DIRECTORY  
8JY2                                       [- PROBABLY A GETDIR FAULT   
8KCL          BRN      NOTANY              [JUMP TO CLEAR THE 'ANY' MARKER  
8KX=    #   
8LBW    #     **********
8LWG    #   
8MB6    #  THE FLOCNB HAS NOW BEEN SET UP SO WE DO OUR GETDIR 7. IF THE REPLY   
8MTQ    #  IS 'OK' WE FREE THE FLOCNB AND EXIT 6 1 WITHOUT FURTHER DELAY.   
8N*B    #   
8NT2    NOWGETDIR   
8P#L          LDX   2  FX2  
8PS=          BC       2,MFHRECEOF         [IF WE WERE POSITIONED AFTER EOF 
8Q?W                                       [WE PROBABLY WONT BE AFTER THE GETDIR
8QRG                                       [SO WE CLEAR THE EOF SWITCH AND SET  
8R?6                                       [IT AGAIN IF WE HAVE TO. 
8RQQ          GETDIR   7                   [DO THE SEARCH   
8S=B          TESTRPN2 OK,NONOKREP         [J IF ENTRY NOT FOUND
8SQ2          MFREE    FILE,FLOCNB         [TAKE SUCCESS ACTION 
8T9L          ADX   6  FX1  
8TP=          EXIT  6  1
8W8W    #   
8WNG    #     **********
8X86    #   
8XMQ    #  A NON-OK REPLY EITHER MEANS THAT THE ENTRANT DOES NOT EXIST OR THAT  
8Y7B    #  THE USER HAS MADE SOME MISTAKE IN HIS DETAILS. IF THE REPLY IS   
8YM2    #  'NOFILE' WE PERFORM SOME FINAL CHECKS (MODE #34 CASE ONLY)   
8^6L    #  AND EXIT, LEAVING THE FLOCNB IN EXISTENCE.   
8^L=    #   
925W    #  THE FINAL CHECKS CONSIST OF ENSURING WE ARE NOT ABOUT TO CREATE  
92KG    #  A MULTIFILE OF THE SAME NAME AND LANGUAGE AS A NON-MULTIFILE,OR  
9356    #  VICE VERSA. THE INFORMATION IS PASSED UP BY GETDIR IN THE FORM OF
93JQ    #  OF SUBREPLIES. IF AN MDF IS BEING CREATED WE CHECKITS GEN
944B    #  IS 1, IF A MULTEL IS BEING CREATED WE ENSURE ITS GEN IS IN   
94J2    #  THE RANGE 2-127  
953L    #   
95H=    NONOKREP
962W          TESTRPN2 NOFILE,NOTNOFILE    [J IF NOT 'NOFILE' CASE  
96GG          LDCT  0  #020                [BIT 4   
9726          ANDX  0  AWORK1(2)
97FQ          BZE   0  NOMFCHECK           [JUMP IF NOT IMPLEMENTING MODE #34   
97^B          MHUNT    1,FILE,FLOCNB       [
98F2          JBS      NOMFCHECK,1,BFABEXO [CHECK NOT APPLICABLE TO SECUREXES   
98YL          MHUNTW   3,FILE,FRB   
99D=          JMBS     MFTEST,3,BEMULT,BEMDF[J IF TRYING TO CREATE MULTIFILE
99XW          TREP2    MULTI,REJECT5       [REJECT PERI IF MF OF SAME NAME/LANG 
9=CG          BRN      NOMFCHECK
9=X6    MFTEST  
9?BQ          TREP2    SINGLE,REJECT5      [REJECT IF SINGLE FILE OF SAME NAME  
9?WB          LDX   4  A1+4(1)             [X4=GENERATION NUMBER
9#B2 ...      JBS      MDFGEN,3,BEMDF      [JUMP IF MDF 
9#TL ...      SBN   4  2                   [MUST BE MULTEL. CHECK GEN   
9**= ...      BNG   4  REJECT6             [AND JUMP IF OUT OF RANGE
9*SW          SBN   4  128-2
9B#G          BPZ   4  REJECT6  
9BS6          BRN      NOMFCHECK
9C?Q    MDFGEN  
9CRB          SBN   4  1                   [CHECK MDF GEN IS 1  
9D?2          BNZ   4  REJECT6  
9DQL    NOMFCHECK   
9F==    #   
9FPW    #     **********
9G9G    #   
9GP6    #  THE NOFILE REPLY MAY HAVE LEFT US AFTER END OF FILE, IN WHICH CASE WE
9H8Q    #  SET THE EOF SWITCH MFHRECEOF. IN ANY CASE WE NOW EXIT 6 0 TO THE 
9HNB    #  CALLING ROUTINE WITH THE FLOCNB INTACT   
9J82          STEPAGAIN                    [X3 ZERO IF AFTER EOF
9JML          BNZ   3  NOTEOF              [OK IF NOT END OF FILE   
9K7=          BS       2,MFHRECEOF         [OTHERWISE SET THE SWITCH
9KLW    NOTEOF  
9L6G          ADX   6  FX1  
9LL6          EXIT  6  0
9M5Q    #   
9MKB    #     **********
9N52    #   
9NJL    #  THE REMAINING REPLIES ALL TRANSLATE INTO SOME SORT OF REJECTION. 
9P4=    #   
9PHW    NOTNOFILE   
9Q3G          TESTREP2 VRYWRONG,REJECT5 
9QH6          BRN      REJECT6  
9R2Q    #   
9RGB    #  ******************** 
9S22    #   
9SFL    #  SUBROUTINE TO MOVE A RECORD INTO THE PROGRAM. CALLED ON X6.  
9S^=    #  X3->RECORD. X7=ADDRESS IN PROGRAM. ON EXIT X7 HAS BEEN   
9TDW    #  UPDATED. DOES NOT COORDINATE.
9TYG    #   
9WD6    MOVERECIN   
9WXQ          INMOVE   APETADDR(2),7,3,FRH(3) [DO MOVE  
9XCB          ADX   7  FRH(3)              [UPDATE OBJ PROG PTR 
9XX2          EXIT  6  0
9YBL    #   
9YW=    #  ******************** 
9^*W    #   
9^TG    #  SUBROUTINE TO BACKSPACE OVER DIRENT, LEAVING X3->NAME RECORD.
=2*6    #   
=2SQ    MBACKSPACE  
=3#B          SBX   6  FX1                 [RELATIVISE LINK 
=3S2          BRN      MBSPLOOP1
=4?L    MBSPLOOP
=4R=          BACKSPACE                    [BACK ONE RECORD 
=5=W    MBSPLOOP1   
=5QG          STEPAGAIN                    [TAKE A LOOK AT IT   
=6=6          BZE   3  MBSPEXIT            [EOF COUNTS AS NAME REC  
=6PQ          BWNZ     ERESN(3),MBSPLOOP   [LOOP IF NOT NAME RECORD 
=79B    MBSPEXIT
=7P2          ADX   6  FX1                 [RESTORE LINK
=88L          EXIT  6  0
=8N=    #   
=97W    #  ******************** 
=9MG    #   
==76    #  SUBROUTINE TO ENSURE DIRECTORY IS NOT WITHIN 16 BLOCKS OF
==LQ    #  OVERFLOW.
=?6B    #   
=?L2    OFLOWCHECK  
=#5L          TOPFCB   1
=#K=          LDX   0  FBLMOD(1)
=*4W          LDX   1  FX1  
=*JG          SBN   0  FBLKS-A1+FILESIZE-16 
=B46          BPZ   0  NILOFLOW 
=BHQ          EXIT  6  0
=C3B    #   
=CH2    #  ******************** 
=D2L    #   
=DG=    #  SUBROUTINE TO RESET THE CURRENT TAB PTR TO TAB 0.
=D^W    #   
=FFG    TABREWIND   
=F^6          TABREWIND 
=GDQ          EXIT  6  0
=GYB    #   
=HD2    #  ******************** 
=HXL    #   
=JC=    #  SUBROUTINE TO RESET THE CURRENT TAB TO THE CURRENT DIRECTORY POSITION
=JWW    #   
=KBG    TABRESET
=KW6          TABRESET  
=L*Q          EXIT  6  0
=LTB    #   
=M*2    #  ******************** 
=MSL    #   
=N#=    #  SUBROUTINE TO REPOSITION THE DIRECTORY ACCORDING TO THE CURRENT  
=NRW    #  TAB. COORDINATES.
=P?G    #   
=PR6    TABULATE
=Q=Q          SBX   6  FX1  
=QQB          TABULATE  
=R=2          ADX   6  FX1  
=RPL          EXIT  6  0
=S9=    #   
=SNW    #  ******************************************************************** 
=T8G    #  ******************************************************************** 
=TN6    #   
=W7Q    #  MAIN PATH STARTS HERE.   
=WMB    #   
=X72    #  ******************************************************************** 
=XLL    #  ******************************************************************** 
=Y6=    #   
=YKW    PERI
=^5G    #   
=^K6    #  WE CHECK THAT THE BUFFER IS BIG ENOUGH TO HOLD AT LEAST A NAME REC,  
?24Q    #  UNLESS THE MODE IS #37 FOR WHICH THE COUNT HAS NO MEANING
?2JB    #   
?342          LDCT   0  #002               [BIT 7   
?3HL          ANDX  0 AWORK1(2) 
?43=          BNZ   0  NOCOUNTCHK         [SKIP CHECK IF M #37  
?4GW          LDX   0  ACA3(2)             [COUNT   
?52G          SBN   0  FRDE 
?5G6          BNG   0  NILCOUNT            [J IF COUNT OUT OF RANGE 
?5^Q    NOCOUNTCHK  
?6FB    #   
?6^2    #     **********
?7DL    #   
?7Y=    #  BEFORE WE JUMP INTO THE INDIVIDUAL MODE SECTIONS WE MUST SET A TAB   
?8CW    #  ON THE CURRENT DIRECTORY POSITION. THIS IS NECESSARY SINCE SOME  
?8XG    #  MODES REPOSITION THE DIRECTORY BEFORE DECIDING TO REJECT THE PERI.   
?9C6    #  SO ALL REJECTION PATHS ASSUME THAT TAB 0 IS SET ON THE ORIGINAL  
?9WQ    #  POSITION. IF THE TAB SYSTEM HAS NOT ALREADY BEEN INITIALISED WE  
?=BB    #  SET IT UP AND CREATE TWO TABS . TAB 0 WILL ALWAYS BE USED ON THE 
?=W2    #  ORIGINAL POSITION, TAB 1 IS USED BY MODE #33.
??*L    #   
??T=          JBSS     TABSSET,2,MFHTABSSET[J IF TAB INITIALISED ALREADY
?##W          SETUPTAB                     [INITIALISE TAB SYSTEM   
?#SG          LDN   5  2                   [NO OF TABS TO BE CREATED.   
?*#6    TABLOOP 
?*RQ          TABSET                       [SET A TAB UP
?B?B          BCT   5  TABLOOP             [J IF MORE TO SET UP 
?BR2          BRN      TABSINIT 
?C=L    TABSSET 
?CQ=          CALL  6  TABREWIND           [ENSURE TAB PTR SET TO TAB 0 
?D9W          CALL  6  TABRESET            [AND RESET THE TAB TO CURRENT POSITIO
?DPG    TABSINIT
?F96    #     **********
?FNQ    #   
?G8B    #  NOW WE SWITCH TO THE INDIVIDUAL MODE SECTIONS.   
?GN2    #   
?H7L          LDN   4  #7777
?HM=          ANDX  4  ACA1(2)             [X4=MODE 
?J6W          SBN   4  #30                 [NORMALISE FOR SWITCH
?JLG          ADX   4  1
?K66          EXIT  4  1+0?                [SWITCH  
?KKQ          BRN      MODE30   
?L5B          BRN      (GEOERR)            [FHOBJ HAS ILLEGALED ILLEGAL MODES   
?LK2          BRN      MODE32   
?M4L          BRN      MODE33   
?MJ=          BRN      MODE34   
?N3W          BRN      (GEOERR) 
?NHG          BRN      (GEOERR) 
?P36          BRN      MODE37   
?PGQ    #   
?Q2B    #  ******************************************************************** 
?QG2    #   
?Q^L    #  MODE #30 SETS UP A FRB WITH THE NAME REC AREA OF THE BUFFER. 
?RF=    #  IT USES THIS TO CALL MGETDIR, WHICH RETURNS THE NAME REC IN AN ENT,  
?RYW    #  AND LEAVES THE DIR POSITIONED ABOUT TO READ THE NEXT REC.
?SDG    #  MODE #30 THEN MERGES WITH MODE #32.  
?SY6    #   
?TCQ    MODE30  
?TXB          SETNCORE FRDE,3,FILE,FRB  
?WC2          LDN   4  A1(3)               [DESTINATION OF NAME REC AREA
?WWL          LDX   3  AWORK2(2)           [BUFFER ADDR IN PROG 
?XB=          LDN   6  FRDE                  [LENGTH OF MOVE
?XTW          FOUTMOVE APETADDR(2),3,4,6,HLOCK2,2 [MOVE OUT DATA INTO FRB   
?Y*G          CALL  6  MGETDIR             [VALIDATE KEYS, SET UP FLOCNB
?YT6                                       [AND DO GETDIR.  
?^#Q          BRN      M30NOTFOUND         [NOFILE CASE.
?^SB          MFREEW   FILE,FRB            [IF SUCCESSFUL FREE OLD FRB  
#2#2          MHUNTW   3,FILE,ENT   
#2RL          ADN   3  A1                  [X3->DATA
#3?=          BRN      READENTRY           [MERGE WITH MODE #32 
#3QW    #   
#4=G    #     **********
#4Q6    #   
#59Q    #  IF MGETDIR COULDNT FIND THE RECORD WE SET UP A ZERO-LENGTH TRANSFER  
#5PB    #  UNLESS THE READ PTRS ARE NOW POSITIONED AFTER END OF FILE, IN WHICH  
#692    #  CASE WE JUMP TO THE APPROPRIATE EXCEPTION CODE.  
#6NL    #   
#78=    M30NOTFOUND 
#7MW          MFREEW   FILE,FRB 
#87G          MFREE    FILE,FLOCNB  
#8M6          JBS      READEOF,2,MFHRECEOF [J IF MGETDIR READ EOF.  
#96Q    NULLREC 
#9LB          LDX   0  AWORK2(2)           [PUT LS18 BITS OF BUFFER ADDR
#=62          ANDX   0  MASKLS18(1)         [INTO REPLY 
#=KL          ORX   7  0
#?5=          BRN      SETREP             [AND JUMP TO SET REPLY
#?JW    MASKLS18       #777777  
##4G    #   
##J6    #     **********
#*3Q    #   
#*HB    #  MODE #32 LOOPS UNTIL IT FINDS A NAME RECORD. 
#B32    #   
#BGL    MODE32  
#C2=          STEP  
#CFW          BZE   3  READEOF             [J IF END OF FILE
#C^G          BWNZ     ERESN(3),MODE32     [LOOP IF NOT NAME REC
#DF6    #   
#DYQ    #     **********
#FDB    #   
#FY2    #   
#GCL    #  THE TWO READ MODES NOW MERGE WITH X3-> NAME RECORD. WE MOVE  
#GX=    #  THIS RECORD INTO THE OBJECT PROGRAM, AND LEAVE X7-> WORD AFTER   
#HBW    #  IT.  
#HWG    #   
#JB6    READENTRY   
#JTQ          LDX   7  AWORK2(2)           [X7->BUFFER WITHIN PROG  
#K*B          CALL  6  MOVERECIN           [CARRY OUT MOVE AND ADVANCE X7   
#KT2    #   
#L#L    #     ********  
#LS=    #   
#M?W    #  WHILE WE HAVE THE NAME RECORD AVAILABLE WE WORK OUT THE NUMBER OF
#MRG    #  AS YET UNREAD RECORDS IN THIS DIRECTORY ENTRY SO THAT WE KNOW HOW
#N?6    #  MANY TIMES TO GO ROUND THE 'MOVE IN RECORD' LOOP 
#NQQ    #   
#P=B          LDX   5  ENUSEN(3)           [NO OF TRAPS 
#PQ2          LDN   0  1
#Q9L          ANDX  0  ECOPSN(3)
#QP=          ADX   5  0                   [PLUS 1 FOR BLOCKS REC IF THERE IS   
#R8W                                       [ONE 
#RNG          JBC      NOTINDM30,3,BNINDEX [J IF NOT INDEXED FILE   
#S86          ADN   5  1                   [PLUS 1 FOR THE INDEX
#SMQ    NOTINDM30   
#T7B          VFREEW   FILE,ENT            [SET UP IN MODE #30 CASE 
#TM2          LDX   1  FX1                 [CORRUPTED BY VFREE  
#W6L    #   
#WL=    #     **********
#X5W    #   
#XKG    #  WE NOW LOOP ROUND READING UP TO [X5] RECORDS AND MOVING THEM INTO
#Y56    #  THE BUFFER. IF A RECORD WILL NOT FIT WE EXIT, ADDING THE 'LONG BLOCK'
#YJQ    #  BIT INTO THE REPLY WORD AND BACKSPACING SO THAT A
#^4B    #  SUBSEQUENT MODE #2 WILL READ THE OFFENDING RECORD
#^J2    #   
*23L          BZE   5  READFIN             [J IF NO MORE RECS TO READ   
*2H=    READLOOP
*32W          STEP                         [X3->NEXT RECORD 
*3GG          BZE   3  (GEOERR)            [CANT BE AN ED OF FILE REPLY 
*426          BWZ      ERESN(3),(GEOERR)   [NOR ANOTHER NAME RECORD 
*4FQ          LDEX  0  FRH(3)              [SIZE OF RECORD  
*4^B          ADX   0  7                   [PLUS ADDRESS WEVE GOT TO IN BUFFER  
*5F2          SBX   0  AWORK2(2)           [LESS START OF BUFFERGIVES TOTAL 
*5YL                                       [SIZE IF WE MOVE THIS IN.
*6D=          SBX   0  ACA3(2)             [SUBTRACT COUNT  
*6XW          SBN   0  1                   [PLUS 1 MORE TO MAKE IT -VE IF   
*7CG                                       [RECORD FITS 
*7X6          BNG   0  RECFITS             [J IF IT DOES
*8BQ          LDCT  0  #200                [ELSE SET LONG BLOCK BIT IN REPLY
*8WB          ORX   7  0
*9B2          BACKSPACE 
*9TL          BRN      READFIN             [AND JUMP TO SET UP REPLY.   
*=*=    RECFITS 
*=SW          CALL  6  MOVERECIN           [MOVE RECORD INTO BUFFER 
*?#G          BCT   5  READLOOP            [LOOP IF MORE RECS IN DIRENT 
*?S6    #   
*#?Q    #  WE NOW MODIFY THE 'EGMTLA' FIELD IF IT'S SET.
*#RB    #   
**?2    READFIN 
**QL          LDX   3  AWORK2(2)           [ADDR OF BUFFER WOTHIN PROG  
*B==          ADN   3  EGMTLAN             [ADDR OF EGMTLA WITHIN PROG  
*BPW          FADDRESS APETADDR(2),3,HLOCK2,2 [X3->WORD REQUIRED
*C9G          LDX   6  0(3)                [PICK UP VALUE   
*CP6          BZE   6  READREP             [J IF NOT SET
*D8Q          SBX   6  GMTNOW   
*DNB          NGS   6  0(3)                [STORE CONVERTED VALUE   
*F82    #   
*FML    #     **********
*G7=    #   
*GLW    #  FINALLY WE SET UP THE REPLY WORD BY MASKING UNWANTED BITS OUT OF 
*H6G    #  X7 AND JUMPING TO WINDUP CODE.   
*HL6    #   
*J5Q    READREP 
*JKB          ANDX  7  MASKREPADDR(1)      [MASK OUT ALL BUT MS2 AND LS18 BITS. 
*K52          BRN      SETREP              [JUMP TO WINDUP  
*KJL    #   
*L4=    #  ******************************************************************** 
*LHW    #   
*M3G    #  THIS SECTIONS IMPLEMENTS MODE #37 (BACKSPACE OVER DIRENT).   
*MH6    #  MODE #37 IS TRIVIAL. WE JUST CALL MBACKSPACE AND THEN BACKSPACE  
*N2Q    #  ONCE MORE TO POSITION THE DIRECTORY JUST ABOUT TO READ THE NAME RECOR
*NGB    #  FOUND BY MBACKSPACE. 
*P22    #   
*PFL    MODE37  
*P^=          CALL  6  MBACKSPACE          [BACKSPACE TO THE NAME RECORD
*QDW          BACKSPACE                    [BACKSPACE OVER IT   
*QYG          BC       2,MFHRECEOF         [CLEAR ANY EOF STATE 
*RD6          BRN      SETREP              [JUMP TO WINDUP CODE 
*RXQ    #   
*SCB    #  *********************************************************************
*SX2    #   
*TBL    #  THIS SECTION IMPLEMENTS MODE #33 (REWRITE LAST DIRENT READ). 
*TW=    #  MODE #33 IS THE MOST COMPLICATED OF THE LOT. THE BASIC APPROACH  
*W*W    #  IS   
*WTG    #    1. MOVE OUT AND MODIFY USER BUFFER, PERFORMING BASIC CHECKS.   
*X*6    #    2. BACKSPACE TO THE NAME RECORD AND CARRY OUT NAME RECORD  
*XSQ    #       ALTERATION CHECKS.  
*Y#B    #    3. IF THE DIRENT WILL BE BIGGER AFTER REWRITING WE APPLY AN OFLOW  
*YS2    #       CHECK.  
*^?L    #    4. WORK OUT WHETHER THE TRAPS ARE BEING ALTERED, AND IF SO CHECK   
*^R=    #       THE USER OWNS THE FILE. THIS MAY INVOLVE READING THE TRAPS. 
B2=W    #    5. TAB BACK TO THE NAME RECORD AND REWRITE IT. 
B2QG    #    6. IF THE FILE IS TO BE THROWN OFFLINE READ THE BLOCKS 
B3=6    #       RECORD INTO A FULLB AND CHAIN IT INTO THE FILE CHAIN WHERE  
B3PQ    #       IT WILL BE FREED WHEN THE DIRECTORY IS CLOSED. THEN DELETE  
B49B    #       THE BLOCKS RECORD FROM THE DIRECTORY.   
B4P2    #    7. SKIP TO THE END OF THE DIRECTORY ENTRY. 
B58L    #    8. IF THE TRAPS ARE BEING ALTERED DELETE THE OLD ONES AND  
B5N=    #       INSERT THE NEW. 
B67W    #   
B6MG    #  FIRST WE MOVE OUT THE USER BUFFER INTO A FILE/FRB, BACKSPACE TO THE  
B776    #  NAME RECORD, AND SET A TAB ON IT.
B7LQ    #   
B86B    MODE33  
B8L2          CALL  6  OUTBUFFER           [MOVE OUT BUFFER, SCRUB BLOCKS AND   
B95L                                       [AND INDEX RECORDS, ADJUST GMTLA ETC 
B9K=          TAB      ,1                  [MOVE TAB PTR TO TAB 1   
B=4W          CALL  6  MBACKSPACE          [BACKSPACE TO NAME RECORD
B=JG          CALL  6  TABRESET            [SET TAB 1 ON IT.
B?46    #   
B?HQ    #     **********
B#3B    #   
B#H2    #  WE NOW CARRY OUT THE NAME RECORD ALTERATION CHECKS. THIS CODE
B*2L    #  IS LOCATED IN FHDIRTWO WHERE IT WAS PUT WHEN FHOBJDIR OVERFLOWED.
B*G=    #   
B*^W          ACROSS   FHDIRTWO,1   
BBFG    MDIR2RETURN                        [NORMAL RETURN   
BB^6    #   
BCDQ    #     **********
BCYB    #   
BDD2    #  WE NOW CHECK THAT THE OVERFLOW CONDITION HAS NOT OCCURRED. NO CHECK  
BDXL    #  IS NECESSARY IF THE NEW ENTRY WILL NOT BE BIGGER THAN THE OLD. WE
BFC=    #  COMPUTE THE DECREASE IN SIZE AS (NO. OF OLD TRAPS- NO. OF NEW)*5+
BFWW    #  SIZE OF BLOCKS RECORD IF FILE IS BEING THROWN OFFLINE. THE DIFFERENCE
BGBG    #  IN THE NUMBER OF TRAPS RECORDS IS SAVED IN X7 AS IT IS USED IN THE   
BGW6    #  NEXT SECTION.
BH*Q    #   
BHTB          STEPAGAIN 
BJ*2          MHUNTW   2,FILE,FRB   
BJSL          LDX   4  ENUSEN(3)
BK#=          SBX   4  ENUSE(2)            [DIFFERENCE IN TRAPS.
BKRW          LDX   7  4                   [SAVE VALUE  
BL?G          JBC      NOTHROWB,FX2,MFHCHUCKOFF[THAT VALUE IS SUFFICIENT FOR
BLR6                                       [DECISION UNLESS WE ARE THROWING 
BM=Q                                       [THE FILE OFFLINE, IN WHICH CASE 
BMQB                                       [WE HAVE TO TAKE THE SIZE OF THE 
BN=2                                       [DISAPPEARING BLOCKS REC INTO ACCOUNT
BNPL          MPY   4  VALUEFIVE(1) 
BP9=          LDX   4  5                   [X4=DECREASE IN TRAP SIZE
BPNW          LDX   0  ECOPSN(3)           [
BQ8G          SRL   0  15   
BQN6          ADN   0  2                   [X0=BLOCKS REC SIZE  
BR7Q          ADX   4  0                   [X4=TOTAL DECREASE.  
BRMB    NOTHROWB
BS72          BPZ   4  SAMEORSMALL         [J IF NOT GROWING
BSLL          CALL  6  OFLOWCHECK          [PERFORM CHECK. S/R DOES NOT 
BT6=                                       [CORRUPT X7 WHICH IS NEEDED BY NEXT  
BTKW                                       [SECTION.
BW5G    SAMEORSMALL 
BWK6    #   
BX4Q    #     **********
BXJB    #   
BY42    #  NEXT WE FIND OUT WHETHER THE TRAPS ARE BEING ALTERED. IF THEY ARE WE 
BYHL    #  CARRY OUT AN OWNERSHIP CHECK AND SET BIT MFHTRAPSALT TO REMIND US TO 
B^3=    #  CARRY OUT THE ALTERATION. IF THE NUMBER OF TRAPS ARE DIFFERENT IN
B^GW    #  OLD AND NEW DIRENTS WE MUST BE ALTERING THEM OTHERWISE WE HAVE   
C22G    #  TO CARRY OUT A COMPARISION OF EACH OLD/NEW PAIR OF TRAPS.
C2G6    #  NOTE THAT OUR CHECKS INSIST ON OWNERSHIP EVEN FOR SHUFFLING TRAPS
C2^Q    #  WITHOUT CHANGING THEM. THIS IS UNAVOIDABLE - A FULL TRAP EQUIVALENCE 
C3FB    #  CHECK WOULD BE COMPLEX AND EXPENSIVE.
C3^2    #   
C4DL          BNZ   7  TRAPSALT            [J IF DIFFERING NOS OF TRAPS 
C4Y=          LDX   4  ENUSEN(3)           [X4=NO OF TRAPS TO COMPARE.  
C5CW          BZE   4  TRAPSNOALT          [J IF NONE   
C5XG          LDN   5  A1+FRDE             [OFFSET DOWN FRB OF 1ST NEW TRAP 
C6C6    TRAPCLOOP   
C6WQ          STEP                         [X3->NEXT NEW RECORD.
C7BB          LDX   0  ERESN(3)            [LOOP IF NOT A TRAPS REC.
C7W2          BPZ   0  TRAPCLOOP           [ELSE X3->OLD TRAP   
C8*L          MHUNTW   2,FILE,FRB   
C8T=          ADX   2  5                   [X2->NEW TRAP
C9#W          LDN   6  4                   [NO OF WORDS TO COMPARE  
C9SG    TRAPCHECK   
C=#6          SMO      6
C=RQ          LDX   0  0(3)                [WORD OF OLD TRAP
C??B          SMO      6
C?R2          BXU   0  0(2),TRAPSALT       [J IF DIFFERS FROM NEW   
C#=L          BCT   6  TRAPCHECK           [J IF MORE WORDS TO COMPARE  
C#Q=          ADN   5  5                   [UPDATE OFFSET DOWN FRB  
C*9W          BCT   4  TRAPCLOOP            [J IF MORE TRAPS TO CHECK   
C*PG    TRAPSNOALT  
CB96          LDX   2  FX2  
CBNQ          BC       2,MFHTRAPSALT       [SHOW TRAPS NOT BEING ALTERED.   
CC8B          BRN      TRAPSNOAL2   
CCN2    TRAPSALT
CD7L          LDX   2  FX2  
CDM=          JBC      REJECT1,2,MFHDIROWN [J IF USER DOESNT OWN FILE.  
CF6W          BS       2,MFHTRAPSALT       [NOTE TRAPS TO BE ALTERED.   
CFLG    TRAPSNOAL2  
CG66    #   
CGKQ    #     **********
CH5B    #   
CHK2    #  THAT COMPLETES THE CHECKS. WE TAB BACK TO THE NAME RECORD AND REWRITE
CJ4L    #  IT WITH THE NEW ONE AFTER PICKING OUT INTO X4 THE NUMBER OF OLD TRAPS
CJJ=    #   
CK3W          CALL  6  TABULATE            [TAB TO NAME RECORD  
CKHG          STEPAGAIN 
CL36          LDX   4  ENUSEN(3)           [X4=NO OF OLD TRAPS  
CLGQ          MHUNTW   3,FILE,FRB          [X3->NEW BUFFER  
CM2B          NAME     3,FILE,FWB          [CALL IT A FWB FOR REWRITE'S 
CMG2                                       [BENEFIT 
CM^L          REWRITE                      [UPDATE NAME RECORD  
CNF=    #   
CNYW    #     **********
CPDG    #   
CPY6    #  IF WE ARE THROWING THE FILE OFFLINE WE READ THE BLOCKS RECORD INTO   
CQCQ    #  A FULLB AND DO A FULLBPAS, SO THAT WHEN THE DIRECTORY IS CLOSED THE  
CQXB    #  BLOCKS WILL BE FREED. WE THEN DELETE THE RECORD. 
CRC2    #   
CRWL          JBC      NOTHROW2,2,MFHCHUCKOFF [J IF NOT THROWING FILE OFFLINE   
CSB=          READ  
CSTW          MHUNTW   3,FILE,FRB          [CALL BLOCKS REC A FULLB 
CT*G          NAME     3,BSTB,FULLB 
CTT6          FULLBPAS 3,2                 [PUT IT IN FILE CHAIN
CW#Q          DELETE
CWSB    NOTHROW2
CX#2    #   
CXRL    #     **********
CY?=    #   
CYQW    #  WE NOW SKIP TO THE END OF THE DIRECTORY ENTRY. THE LENGTH OF THE 
C^=G    #  SKIP IS WORKED OUT FROM THE NUMBER OF OLD TRAPS RECORDS ( IN X4) AND 
C^Q6    #  WHETHER THERE ARE ANY BLOCKS OR INDEX RECS ( FOUND FROM BUFFER). 
D29Q    #   
D2PB          LDX   3  4                   [NO OF TRAPS 
D392          MHUNTW   2,FILE,FWB   
D3NL          JBC      NINDREC,2,BEINDEX   [J IF NO INDEX REC   
D48=          ADN   3  1                   [INCR COUNT  
D4MW    NINDREC 
D57G          BBUS  23,ECOPS(2),NBLKREC    [J IF NO BLOCKS REC  
D5M6          ADN   3  1                   [INCR COUNT  
D66Q    NBLKREC 
D6LB          BZE   3  NOSKIP33 
D762          SKIP     ,0(3)               [SKIP
D7KL    NOSKIP33
D85=          LDX   2  FX2  
D8JW    #   
D94G    #     **********
D9J6    #   
D=3Q    #  IF WE ARE ALTERING THE TRAPS WE NOW DELETE ALL THE OLD TRAPS AND 
D=HB    #  LOOP INSERTING THE NEW. THIS IS NOT THE MOST EFFICIENT WAY OF DOING  
D?32    #  IT BUT THIS IS NOT ANTICIPATED TO BE THE MOST COMMON OF ACTIONS  
D?GL    #  AND A REALLY EFFICIENT WAY IS RATHER TORTUOUS.   
D#2=    #   
D#FW          JBC      NOTRAPALT,2,MFHTRAPSALT [J IF NO TRAP ALTERATION 
D#^G          BZE   4  NOTRDELETE          [J IF NO OLD TRAPS TO DELETE 
D*F6    TRDEL   
D*YQ          DELETE                       [LOOP DELETING OLD TRAPS 
DBDB          BCT   4  TRDEL
DBY2    NOTRDELETE  
DCCL          MHUNTW   3,FILE,FWB          [X3->BUFFER  
DCX=          LDX   4  ENUSE(3)            [NO OF NEW TRAPS 
DDBW          BZE   4  NOTRAPALT           [J IF NONE   
DDWG          STEP                         [READ 1ST REC OF NEXT DIRENT SO CAN  
DFB6                                       [USE INSERT ON NEW TRAPS.
DFTQ          LDN   5  A1+FRDE             [OFFSET DOWN FWB TO 1ST NEW TRAP 
DG*B    TRINSERT
DGT2          CALL  6  MOVERECUP           [MOVE UP RECORD IN FWB INDICATED BY  
DH#L                                       [X5 AND ADVANCE X5 TO INDICATE   
DHS=                                       [NEXT REC
DJ?W          INSERT                       [INSERT NEW TRAP 
DJRG          BCT   4  TRINSERT            [LOOP IF MORE TO INSERT  
DK?6          BACKSPACE                    [BACKSPACE OVER 1ST REC OF NEXT ENT  
DKQQ    NOTRAPALT   
DL=B    #   
DLQ2    #     **********
DM9L    #   
DMP=    #  THAT'S THE LOT. WE JUST FREE THE BUFFER, SET A ZERO REPLY (X7 GOT
DN8W    #  CORRUPTED IN THE IMPLEMENTATION OF THE PERI) AND JUMP TO THE 
DNNG    #  WINDUP CODE. 
DP86    #   
DPMQ          MFREE    FILE,FWB 
DQ7B          LDN   7  0
DQM2          BRN      SETREP   
DR6L    #   
DRL=    #  ******************************************************************** 
DS5W    #   
DSKG    #  THE LAST MODE IS #34, WHICH IS RELATIVELY SIMPLE. FIRST WE CARRY OUT 
DT56    #  AN OVERFLOW CHECK. THEN WE MOVE OUT THE USER BUFFER AND PERFORM THE  
DTJQ    #  BASIC CHECKS AND MODIFICATIONS.  
DW4B    #   
DWJ2    MODE34  
DX3L          JBC      REJECT1,2,MFHDIROWN  [CHECK USER ALLOWED TO DO M#34  
DXH=          CALL  6  OFLOWCHECK          [OVERFLOW CHECK  
DY2W          CALL  6  OUTBUFFER           [MOVE BUFFER OUT INTO FRB
DYGG          MHUNTW   3,FILE,FRB   
D^26    #   
D^FQ    #  THE SPECIAL CHECKS APPLIED FOR MODE #34 ARE:-
D^^B    #    BELIB CLEAR.   
F2F2    #    EREEL 1 OR ZERO.   
F2YL    #    EUSE1-3 AND ESER ZERO. 
F38D ...#    IF BEEXO CLEAR THEN EGEN MUST NOT BE 0.
F3D= ...#    ELAN MUST BE ZERO OR A VALID LANGUAGE. 
F3N4 ...#    IF EINC IS NONZERO THEN THE ALIEN FILESTORE NUMBER MUST BE 
F3XW ...#    SET. IN ANY CASE THE INCNO MUST BE NON-NEGATIVE. THE FILESTORE 
F47N ...#    NUMBER CHECK CAN BE INHIBITED BY A RESTORE TIME MACRO. 
F4CG    #   
F4X6          JBS      NILDATA,3,BELIB  
F5BQ          LDX   0  EREEL(3) 
F5WB          BZE   0  ZEROREEL 
F6B2          SBN   0  1
F6TL    ZEROREEL
F7*=          ORX   0  ESER(3)  
F7SW          ORX   0  EUSE1(3) 
F8#G          ORX   0  EUSE2(3) 
F8S6          ORX   0  EUSE3(3) 
F9?Q          BNZ   0  NILDATA  
F9RB          JBS      NOTFILEGEN,3,BEEXO   
F=?2          LDX   0  EGEN(3)  
F=QL ...      BZE   0  NILDATA  
F?==    NOTFILEGEN  
F?PW          LDX   0  ELAN(3)  
F#9G          BZE   0  ZEROLAN             [OK IF LANG ZERO 
F#P6          BXE   0  ACES,ZEROLAN        [OK IF LANG SPACES   
F*8Q          LDN   4  ELAN(3)             [X4->LANGUAGE
F*NB          LDN   5  4                   [NO OF CHARS TO CHECKS   
FB82          CALL  6  NAMECHECK
FBML    ZEROLAN 
FBPJ ...      LDX   0  EINC(3)             [NEG INCNO CAUSES GENRES.
FBRG ...      BNG   0  REJECT7  
FBTD ...      SEGENTRY K98FHOBJDIR         [LABEL FOR RESTORE TIME MACRO.   
FBXB ...      BZE   0  ZEROINCNUM          [REJECT7 IF INCNO NONZERO
FB^# ...      JFZ      REJECT7,3,FEFSNO    [AND ALIEN FSNO ZERO.
FC3= ...      SEGENTRY K97FHOBJDIR         [ANOTHER MACRO LABEL.
FC58 ...ZEROINCNUM  
FC7=    #   
FCLW    #     **********
FD6G    #   
FDL6    #  THERE APPEARS NOTHING WRONG WITH THE BUFFER SO WE CALL MGETDIR TO
FF5Q    #  VALIDATE THE KEYS IN IT AND TO POSITION THE DIRECTORY READY TO   
FFKB    #  INSERT THE NEW ENTRY.
FG52    #  IF THE FILE ALREADY EXISTS WE REJECT THE PERI.   
FGJL    #   
FH4=          CALL  6  MGETDIR             [VALIDATE KEYS AND DO SEARCH 
FHHW          BRN      M34OK               ['NOFILE' REPLY - JUST WHAT WE WANT  
FJ3G          BRN      REJECT4             [FILE ALREADY EXISTS, REJECT PERI
FJH6    M34OK   
FK2Q    #   
FKGB    #     **********
FL22    #   
FLFL    #  WE NOW UPDATE THE KEYS IN THE BUFFER FROM THE FLOCNB WHICH GETDIR
FL^=    #  LEAVES IN THE NOFILE CASE. WE DONT HAVE TO TAKE THE DIR AND TAPE FLOC
FMDW    #  FORMATS INTO CONSIDERATION AS WE HAVE ALREADY REJECTED ANY ATTEMPT   
FMYG    #  TO INSERT ONE OF THESE.  
FND6    #   
FNXQ          MHUNTW   3,FILE,FRB          [X3->BUFFER  
FPCB          MHUNT    2,FILE,FLOCNB       [X2->FLOCNB  
FPX2          LDN   4  A1(2)
FQBL          LDN   5  ELOC1(3) 
FQW=          MOVE  4  5                   [MOVE ALL OF NAME EXCEPT LANGUAGE
FR*W          LDX   0  A1+5(2)             [TRANSFER LANGUAGE   
FRTG          STO   0  ELAN(3)  
FS*6          FREECORE 2                   [FREE FLOCNB 
FSSQ    #   
FT#B    #     **********
FTS2    #   
FW?L    #  IF THE ENTRY IS FOR AN INDEXED FILE WE CLEAR THE INDEX BIT AND WORD. 
FWR=    #   
FX=W ...      JBCC     NOTINDM34,3,BEINDEX [J IF NOT AN INDEXED FILE ENTRY  
FXQG          STOZ     EINDEX(3)
FY=6    NOTINDM34   
FYPQ    #   
F^9B    #     **********
F^P2    #   
G28L    #  SOME MORE MODIFICATIONS ARE NECESSARY BEFORE WE CAN MAKE THE INSERTIO
G2N=    #  IN PARTICULAR WE ZEROISE THE FREEZECOUNTS, CLEAR A NUMBER OF BITS.   
G37W    #  THE BITS WHICH ARE CLEARED ARE THOSE WHICH IN MODE #33   
G3MG    #  WE DID NOT PERMIT THE USER TO CHANGE BUT INSTEAD COPIED THE  
G476    #  OLD VALUES ACROSS FROM OLD TO NEW.   
G4LQ    #   
G56B          LDX   0  MEINF1SAME(1)
G5L2          ORS   0  EINF1(3) 
G65L          ERS   0  EINF1(3) 
G6K=          LDX   0  MEINF2SAME(1)
G74W          ORS   0  EINF2(3) 
G7JG          ERS   0  EINF2(3) 
G846          FLIPS    ECOPS(3),23  
G8HQ          STOZ     ESVCT(3) 
G93B          STOZ     EAUTOCOUNT(3)
G9H2          LDX   0  MASKECOPS(1) 
G=2L          ANDS  0  ECOPS(3)            [CLEAR FORBIDDEN BITS OUT OF ECOPS   
G=G=    #   
G=^W    #     **********
G?FG    #   
G?^6    #  IF WE ARE INSERTING A FILE WITH THE TO-BE-DUMPED BIT SET WE  
G#DQ    #  ALSO SET THE RELEVANT BITS IN THE FCB TO ENSURE THAT 
G#YB    #  DUMPER LOOKS AT THIS DIRECTORY.  
G*D2    #   
G*XL          JBC      NOTBDUMP,3,BEDUMP
GBC=          TOPFCB2  2
GBWW          MBS      2,BFDIRUPDATE,BFDUMP 
GCBG          LDX   2  FX2  
GCW6    NOTBDUMP
GD*Q    #   
GDTB    #  ******************** 
GF*2    #   
GFSL    #  NOW WE INSERT THE RECORDS.   
GG#=    #   
GGRW          NAME     3,FILE,FWB          [FOR INSERTS BENEFIT 
GH?G          LDN   4  1                   [COUNT OF RECS: 1 FOR NAME REC   
GHR6          ADX   4  ENUSE(3)            [PLUS COUNT OF TRAPS 
GJ=Q          LDN   5  A1+FRDE             [OFFSET DOWN FWB TO 1ST TRAP REC 
GJQB          BRN      M34INSERT           [JUMP INTO INSERTION LOOP
GK=2    M34INSLOOP  
GKPL          CALL  6  MOVERECUP           [MOVE NEXT REC TO TOP OF FWB AND 
GL9=                                       [UPDATE X5 TO POINT TO THE NEXT. 
GLNW    M34INSERT   
GM8G          INSERT                       [INSERT REC AT TOP OF FWB
GMN6          BCT   4  M34INSLOOP          [LOOP IF MORE TO INSERT  
GN7Q    #   
GNMB    #  FINALLY WE CLEAN UP, AND JUMP INTO THE WINDUP CODE.  
GP72    #   
GPLL          MFREE    FILE,FWB 
GQ6=          BRN      SETREP   
GQKW    #   
GR5G    #  ******************************************************************** 
GRK6    #   
GS4Q    #  THE WINDUP CODE SIMPLY RETURNS TO FHOBJ WITH THE REPLY SET   
GSJB    #  IN X7.   
GT42    #   
GTHL    SETREP  
GW3=          ACROSS   FHOBJ,2  
GWGW    #   
GX2G    #  *********************************************************************
GXG6    #  *********************************************************************
GX^Q    #   
GYFB    #  THIS SECTION CARRIES OUT ALL THE EXCEPTION CHECKS AND ACTIONS.   
GY^2    #   
G^DL    #  EXCEPTION SUBROUTINE TO SET BITS 3+5 IN THE REPLY IF OWN-MON 
G^Y=    #  ADDITIVE MODE #30000 IS BEING USED. CALLED ON X6. ON EXIT X7 IS  
H2CW    #  EITHER UNCHANGED OR #05000000.   
H2XG    #   
H3C6    MCHOWN  
H3WQ          LDX   0  ACA1(2)             [PICK UP MODE
H4BB          SRL   0  6
H4W2          ANDN  0  #777                [EXTRACT ADDITIVE MODE   
H5*L          SBN   0  #300 
H5T=          BNZ   0  (6)                 [EXIT IF NOT OWN-MON 
H6#W          LDCT  7  #050                [SET OWN-MON REPLY   
H6SG          EXIT  6  0
H7#6    #   
H7RQ    #  ******************** 
H8?B    #   
H8R2    #  SUBROUTINE TO TIDY UP AFTER A FAULTY PERI. IT TABS BACK TO THE   
H9=L    #  ORIGINAL POSITION OF THE DIRECTORY AND FREES ALL BLOCKS THAT MIGHT   
H9Q=    #  BE IN USE.   
H=9W    #  COORDINATES AND USES X3. 
H=PG    #   
H?96    TIDYUP  
H?NQ          SBX   6  FX1                 [RELATIVISE LINK 
H#8B          LDX   3  6                   [AND SAVE IT IN X3   
H#N2          CALL  6  TABREWIND           [SET PTR TO TAB 0
H*7L          CALL  6  TABULATE            [TAB TO IT   
H*M=          LDX   6  3             [REPLACE LINK  
HB6W          VFREE    FILE,FLOCNB         [FREE ANY BLOCKS WHICH MAY BE IN USE.
HBLG          VFREE    FILE,ENT 
HC66          VFREE    FILE,FRB 
HCKQ          VFREE    FILE,FWB 
HD5B          LDX   1  FX1                 [CORRUPTED BY VFREE  
HDK2    #   
HF4L    #     **********
HFJ=    #   
HG3W    #  WE MAY HAVE BEEN AT EOF AT THE START SO WE INVESTIGATE THE DIRECTORY 
HGHG    #  POSITIONING AND SET OR CLEAR THE EOF MARKER ASS APPROPRIATE. WE CHECK
HH36    #  THAT WE ARE NOT A BEGINNING OF FILE FIRST AND THEN DO A STEPAGAIN.   
HHGQ    #   
HJ2B          TOPFCA2  3                   [X3->FCA OF DIRECORY 
HJG2          LDX   0  FREADBLOCK(3)
HJ^L          BNG   0  TIDYNEOF            [NOT EOF IF BEGINNING OF FILE
HKF=          SBN   0  FBLKS
HKYW          BNZ   0  TIDYTESTEOF         [DO STEPAGAIN UNLESS 1ST BLOCK   
HLDG          LDX   0  FREADWORD(3)        [MAY STILL BE BEG FILE   
HLY6          BNG   0  TIDYNEOF            [J IF BEG FILE   
HMCQ    TIDYTESTEOF 
HMXB          STEPAGAIN 
HNC2          BNZ   3  TIDYNEOF            [J IF NOT EOF
HNWL          BS       2,MFHRECEOF         [SET EOF SWITCH  
HPB=          BRN      TIDYEXIT 
HPTW    TIDYNEOF
HQ*G          BC       2,MFHRECEOF         [CLEAR EOF SWITCH
HQT6    TIDYEXIT
HR#Q          ADX   6  FX1                 [RESTORE LINK AND EXIT   
HRSB          EXIT  6  0
HS#2    #   
HSRL    #  ******************** 
HT?=    #   
HTQW    #  IF END OF FILE IS READ AS A RESULT OF A MODE #30 OR #32 WE HAVE TO   
HW=G    #  SET THE SWITCH 'MFHRECEOF', AND PASS A ZERO-LENGTH TRANSFER REPLY
HWQ6    #  TO THE PROGRAM. IN ADDITION IF THE OWN-MONITORING MODE #30000 WAS
HX9Q    #  USED WE SET THE OWN MON EVENT BITS B3+5 IN THE REPLY BEFORE ADDING   
HXPB    #  IN THE ZERO LENGTH TRANSFER DATA 
HY92    #   
HYNL    READEOF 
H^8=          BS       2,MFHRECEOF         [SET EOF MARKER  
H^MW          CALL  6  MCHOWN              [SET OWN-MON BITS IN REPLY IF OWN
J27G                                       [MON IN USE. 
J2M6          BRN      NULLREC             [JUMP INTO READ SECTION TO SET A 
J36Q                                       [ZERO LENGTH TRANSFER REPLY  
J3LB    #   
J462    #  ******************** 
J4KL    #   
J55=    #  THE VARIOUS REJECTIONS SIMPLY SET UP A REPLY OF B3+REJECTION CODE.   
J5JW    #  THEY THEN TIDY UP AND JUNP INTO THE WINDUP CODE  
J64G    #   
J6J6    REJECT1 
J73Q          LDN   7  1
J7HB          BRN      REJECT   
J832    REJECT2 
J8GL          LDN   7  2
J92=          BRN      REJECT   
J9FW    REJECT3 
J9^G          LDN   7  3
J=F6          BRN      REJECT   
J=YQ    REJECT4 
J?DB          LDN   7  4
J?Y2          BRN      REJECT   
J#CL    REJECT5 
J#X=          LDN   7  5
J*BW          BRN      REJECT   
J*WG    REJECT6 
JBB6          LDN   7  6
JBG3 ...      BRN      REJECT   
JBKY ...REJECT7 
JBPT ...      LDN   7  7
JBTQ    REJECT  
JC*B          LDX   1  FX1  
JCT2          LDX   2  FX2  
JD#L          LDCT  0  #040                [SET B3  
JDS=          ORX   7  0                   ['OR' INTO CODE TO MAKE REPLY
JF?W          CALL  6  TIDYUP   
JFRG          BRN      SETREP              [JUMP TO WINDUP CODE 
JG?6    #   
JGQQ    #  ******************** 
JH=B    #   
JHQ2    #  IF OVERFLOW OCCURS DURING MODE #33 OR #34 WE EITHER ILLEGAL OR   
JJ9L    #  SET AN OWN MON REPLY.
JJP=    #   
JK8W    NILOFLOW
JKNG          LDX   2  FX2  
JL86          CALL  6  TIDYUP              [CLEAN UP
JLMQ          LDN   7  0                   [MODE #33 CORRUPTS REPLY 
JM7B          CALL  6  MCHOWN              [IF OWN MON SET REPLY AND WIND UP
JMM2          BNZ   7  SETREP              [PERI
JN6L          LDN   3  FYOUTFULL           [OTHERWISE SET UP ILLEGAL TYPE   
JNL=          LDX   4  FTYPNO(2)           [AND THE FURTHER PARAMETER REQUIRED  
JP5W                                       [BY THIS ILLEGAL 
JPKG    OUTILL                             [NOW WE JUST RESET THE OLPAS LINK SO 
JQ56                                       [ON REACTIVATION IT WAKES UP IN FHOBJ
JQJQ                                       [TRANSFER TO THE PCA AND ENTER   
JR4B                                       [THE ILLEGAL 
JRJ2          LDX   1  FX1  
JS3L          TOPCA1   RESETLINK(1) 
JSH=          ACROSS   OLPODD,4 
JT2W    RESETLINK   
JTGG          PAIR     FHOBJ,1  
JW26    #   
JWFQ    #  ******************** 
JW^B    #   
JXF2    #  OTHER PROGRAM EVENTS ARE:-   
JXYL    #   
JYD=    #  ILLEGAL COUNT FIELD. A CALL TO TIDYUP IS NOT POSSIBLE OR NECESSARY   
JYXW    #  IN THIS CASE AS THE CONDITION IS DETECTED BEFORE THE RECOVERY TAB
J^CG    #  IS SET UP AND BEFORE ANY DIRECTORY REPOSITIONING HAS OCCURRED.   
J^X6    #   
K2BQ    NILCOUNT
K2WB          LDN   3  FYCOUNT  
K3B2          BRN      OUTILL   
K3TL    #   
K4*=    #  INVALID DATA FORMAT  
K4SW    #   
K5#G    NILDATA 
K5S6          LDX   1  FX1  
K6?Q          LDX   2  FX2  
K6RB          CALL  6  TIDYUP              [CLEAN UP
K7?2          LDN   3  FYDATAER 
K7QL          BRN      OUTILL   
K8==    #   
K8PW    #   
K99G          MENDAREA 40,K99FHOBJDIR   
K9P6    #   
K=8Q    #END
^^^^ ...001717350012
  • Last modified: 17/01/2024 11:55
  • by 127.0.0.1