{{htmlmetatags>metatag-description:(ICL George 3 and George 4 source: FHOBJDIR860)}} ====== FHOBJDIR860 ====== (George Source) **Macros used:** [[george:macro:ACROSS|ACROSS]], [[george:macro:ALTLENG|ALTLENG]], [[george:macro:BACKSPACE|BACKSPACE]], [[george:macro:BBUS|BBUS]], [[george:macro:BC|BC]], [[george:macro:BITDEFS|BITDEFS]], [[george:macro:BS|BS]], [[george:macro:BWNZ|BWNZ]], [[george:macro:BWZ|BWZ]], [[george:macro:BXE|BXE]], [[george:macro:BXGE|BXGE]], [[george:macro:BXU|BXU]], [[george:macro:DELETE|DELETE]], [[george:macro:FADDRESS|FADDRESS]], [[george:macro:FLIPS|FLIPS]], [[george:macro:FOUTMOVE|FOUTMOVE]], [[george:macro:FREECORE|FREECORE]], [[george:macro:FULLBPAS|FULLBPAS]], [[george:macro:GETDIR|GETDIR]], [[george:macro:INMOVE|INMOVE]], [[george:macro:INSERT|INSERT]], [[george:macro:JBC|JBC]], [[george:macro:JBCC|JBCC]], [[george:macro:JBS|JBS]], [[george:macro:JBSS|JBSS]], [[george:macro:JFZ|JFZ]], [[george:macro:JMBS|JMBS]], [[george:macro:MBC|MBC]], [[george:macro:MBS|MBS]], [[george:macro:MENDAREA|MENDAREA]], [[george:macro:MFREE|MFREE]], [[george:macro:MFREEW|MFREEW]], [[george:macro:MHUNT|MHUNT]], [[george:macro:MHUNTW|MHUNTW]], [[george:macro:NAME|NAME]], [[george:macro:OUTMOVE|OUTMOVE]], [[george:macro:PAIR|PAIR]], [[george:macro:READ|READ]], [[george:macro:REWRITE|REWRITE]], [[george:macro:SEG|SEG]], [[george:macro:SEGENTRY|SEGENTRY]], [[george:macro:SETNCORE|SETNCORE]], [[george:macro:SETREP|SETREP]], [[george:macro:SETUPCORE|SETUPCORE]], [[george:macro:SETUPTAB|SETUPTAB]], [[george:macro:SKIP|SKIP]], [[george:macro:STEP|STEP]], [[george:macro:STEPAGAIN|STEPAGAIN]], [[george:macro:TAB|TAB]], [[george:macro:TABRESET|TABRESET]], [[george:macro:TABREWIND|TABREWIND]], [[george:macro:TABSET|TABSET]], [[george:macro:TABULATE|TABULATE]], [[george:macro:TESTREP2|TESTREP2]], [[george:macro:TESTRPN2|TESTRPN2]], [[george:macro:TOPCA1|TOPCA1]], [[george:macro:TOPFCA2|TOPFCA2]], [[george:macro:TOPFCB|TOPFCB]], [[george:macro:TOPFCB2|TOPFCB2]], [[george:macro:TREP2|TREP2]], [[george:macro:VFREE|VFREE]], [[george:macro:VFREEW|VFREEW]] 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 SIZE1ST 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