{{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