4 22FL [ 19 22_= [THIS IS A TIDIED-UP VERSION WITH MODETEST & BITSETTING MACROS 15 2394 ...[ (C) COPYRIGHT INTERNATIONAL COMPUTERS LTD 1983 4 23DW [ 14 23YG SEG OPENTWO,8,JUDY BIDGOOD,OPEN 12 24D6 SEGENTRY K1OPENTWO,Z1OPENTWO 12 24XQ SEGENTRY K2OPENTWO,Z2OPENTWO 4 25CB [ 4 25X2 # 4 26BL # 21 26W= # THIS SEGMENT IS ENTERED FROM OPENFILE WITH [X4]=DEPTH OF FILE TO 21 27*W # BE OPENED,[X5]=POINTER FROM THE BOTTOM OF THE FABSNB TO NAME OF 17 27TG # 1ST FILE TO BE OPENED,& [X3]= MODE TO OPEN IT IN. 4 28*6 # 21 28SQ # AN ATTEMPT IS MADE TO HALF-OPEN THIS FILE. IF THIS FAILS WE SET 21 29#B # THE MODE ONE FURTHER TOO THE RIGHT(SEE TABLE AT HEAD OF OPENFILE 20 29S2 # SEGMENT) & THE PTR. TO THE USERNAME ABOVE THE ONE JUST TRIED & 21 2=?L # HAVE ANOTHER GO.IF WE RUN OFF THE TOP OF THE FABSNB,WE EXPAND IT 21 2=R= # FULLY UP TO MASTER & CARRY ON UNTIL WE'VE CONTRIVED TO HALFOPEN AT 21 2?=W # LEAST ONE FILE(WE MUST BE ABLE TO DO THIS AS MASTER'S FCB IS ALWAY 7 2?QG # IN CORE) 20 2#=6 # AS SOON AS WE'VE HALFOPENED A FILE,WE GO DOWN THE FABSNB AGAIN 21 2#PQ # DOING AN OPENREC ON EACH FILE BENEATH THE HALFOPENED ONE ,UPDATING 21 2*9B # THE MODE & PTR IN EACH CASE,UNTIL,HOORAH!,WE'VE REACHED THE BOTTOM 4 2*P2 # 4 2B8L # 4 2BN= # 9 2C7W MASTER 12HMASTER 5 2CMG SIX +6 8 2D76 THREE +3 20 2DLQ [ THIS SUBROUTINE CALCULATES THE MODE NECESSARY TO DO AN OPENREL 20 2F6B [ ON THE NEXT FILE DOWN IN THE FABSNB.TO DO THIS IT CALCULATES 21 2FL2 [ HOW FAR FROM THE END OF THE BLOCK WE ARE,FROM OUR TRUSTY POINTER 20 2G5L [ IN X5,AND THEN ^SETMODE^'S IN X3 ACCORDING TO THE MODE WE WANT 11 2GK= [ TO OPEN THE BOTTON FILE 5 2H4W QCHEQMOD 7 2HJG LDX 0 5 7 2J46 SBN 0 6 20 2JHQ BNG 0 SLAST [PTR 6 WORDS FROM END OF FABSNB 21 2K3B BZE 0 SLAST [UNLESS FABSNB 4 WORDS LONG IN WHICH 20 2KH2 SBN 0 7 [CASE IT'S ONLY 3 WORDS FROM END 21 2L2L BNG 0 SLASTDIR [J IF POINTING TO PENULTIMATE FILE 7 2LG= SBN 0 7 20 2L_W BNG 0 SLASTBUTDIR [J IF POINTING TO LAST BUT-TWO'TH 13 2MFG [NAME 8 2M_6 BRN SREAD 5 2NDQ SLASTDIR 11 2NYB TESTMODE 6,NOTHAW,NOT,THAW 11 2PD2 TESTMAIN 6,NOTHAW,,READING 21 2QC= GEOERR BRIEFPM,THAWMODE [ONLY ALLOW READING MODE IF OPENTHAW 5 2QWW NOTHAW 12 2RBG TESTMODE 6,SUNCLEAN,,CREATE 12 2RW6 TESTMODE 6,SCLEAN,,THAW,REOPEN 12 2S*Q TESTMAIN 6,SREAD,NOT,UNCLEAN 5 2STB SCLEAN 9 2T*2 SETMODE 3,CLEAN 8 2TSL BRN SCONT 5 2W#= SUNCLEAN 9 2WRW SETMODE 3,GENERAL 8 2X?G BRN SCONT 6 2XR6 SLASTBUTDIR 12 2Y=Q TESTMODE 6,SREAD,NOT,CREATE 9 2YQB BRN SCLEAN 5 2_=2 SLAST 7 2_PL LDX 3 6 7 329= EXIT 7 0 5 32NW SREAD 9 338G SETMODE 3,READ 5 33N6 SCONT 16 347Q SETMODE 0,REPLY,NOWAIT,ERASING,DIREPLY,QUERY 19 34MB ANDX 0 6 [TRANSFER MODES IF PRESENT 7 3572 ORX 3 0 11 35LL TESTMODE 6,NNTHAW,NOT,THAW 18 366= ADDMODE 3,ERASING ['THAW' IMPLIES ERASING 14 36KW NNTHAW [ERASING 7 375G EXIT 7 0 4 37K6 # 4 384Q # 4 38JB # 20 3942 # THIS IS THE ENTRY POINT TO THE ROUTINE. X5 CONTAINS A POINTER 20 39HL # (FROM THE BOTTOM OF THE FABSNB) TO THE NAME OF A FILE TO BE 18 3=3= # HALFOPENED & X3 THE MAIN MODE IT IS TO BE OPENED IN. 4 3=GW # 4 3?2G # 20 3?G6 # WE DO AN^OPENMASD^ IF THE INDICATED FILE IS MASTER.O/W WE TRY 13 3?_Q # TO HALFOPEN THE POINTED-TO F_E. 4 3#FB # 6 3#_2 Z1OPENTWO 4 3*DL ZB 10 3*Y= HUNT 2,FILE,FABSNB 20 3B3B ... LDX 0 A1(2) [OMIT CHECK FOR :MASTER IF NOT 20 3B6G ... SBN 0 1 [POINTING TO TOP FILE IN FABSNB, 20 3B9L ... SBX 0 5 [AS COULD BE DEALING WITH ANOTHER 19 3B#Q ... BNZ 0 NOTMASSA [FILE WITH LOCAL NAME MASTER. 8 3BCW ADX 2 A1(2) 7 3BXG SBX 2 5 14 3CC6 TESTNAMX 3,MASTER(1),A1(2),NOTMASSA 6 3CWQ Z2OPENTWO 9 3DBB ADDMODE 3,CAREFUL 14 3DW2 TRACEIF K6OPENTWO,99,299,3,OPEN MAS 9 3F*L OPENMASD NOBREAK,3 10 3FT= TESTREP2 OK,QBOTFILE 9 3G#W GEOERR 1,MASNOPEN 5 3GSG NOTMASSA 7 3H#6 LDX 0 5 7 3HRQ SBN 0 7 21 3J?B BNG 0 QHALF [DON'T OR IN ANY BITS IF BOTTOM FILE 16 3JR2 CALL 7 SCONT [TRANSFER MODES 5 3K=L QHALF 9 3KQ= ADDMODE 3,CAREFUL 14 3L9W TRACEIF K6OPENTWO,99,299,3,HALFOPEN 9 3LPG HALFOPEX XBRK,5,3 10 3M96 TESTREP2 OK,QBOTFILE1 11 3MNQ TESTRPN2 NOTFOUND,XREPLY 4 3N8B # 21 3NN2 # WE'VE BEEN UNABLE TO HALF-OPEN THE INDICATED FILE,SO WE TRY THE 21 3P7L # NEXT ONE UP,USING QCHEQMOD TO UPDATE THE MODE.IF WE'RE ALREADY AT 13 3PM= # THE TOP,WE HAVE TO DO A FINDNAME. 4 3Q6W # 10 3QLG HUNT 2,FILE,FABSNB 8 3R66 LDX 0 A1(2) 7 3RKQ SBN 0 1 7 3S5B SBX 0 5 20 3SK2 BZE 0 TOPFAB [J IF PTR.POINTS TO TOP OF FABSNB 20 3T4L [AND WE CANT 1/2-OPEN THIS FILE 10 3TJ= BXU 0 THREE(1),Q2 4 3W3W SUB4 7 3WHG ADN 5 3 8 3X36 BRN Q37 7 3XGQ Q2 ADN 5 6 4 3Y2B Q37 21 3YG2 CALL 7 QCHEQMOD [UPDATE MODE & RETURN TO CHECK IF NAME 21 3Y_L LDX 1 FX1 [IS :MASTER AT LABEL 'ZB'(=K1OPENTWO) 8 3_F= BRN ZB 5 3_YW TOPFAB 4 42DG # 21 42Y6 # WE'VE REACHED THE TOP UNSUCCESSFULLY.DO A FINDNAME,ADJUST PTR(TRI 21 43CQ # THIS!) AND GO TO LABEL^Q37^ TO CHECK MODE & RE-ENTER ROUT9NE A0 ^Z 4 43XB # 7 44C2 FINDNAME 10 44WL TESTREP2 NOUSER,WREPLY 7 45B= ADN 5 3 10 45TW HUNT 2,FILE,FABSNB 8 46*G LDX 0 A1(2) 7 46T6 SBN 0 1 7 47#Q SBX 0 5 10 47SB BXE 0 THREE(1),SUB4 8 48#2 BRN Q2 12 48RL ...[THE NEXT TWO LINES ARE REDUNDANT 15 49?= LDX 2 7 [PICK UP PTR. 9 49QW BRN QBOTFILE3 6 4==G QBOTFILE1 4 4=Q6 # 20 4?9Q # WE'VE EITHER OPENED MASTER SUCCESSFULLY,OR HALFOPENED A FILE 21 4?PB # WE CHECK WHETHER WE ARE AT THE BOTTOM.IF NOT WE ADJUST THE POINTER 17 4#92 # SET UP A FLOCNB,CHANGE THE MODE & DO AN OPENREL. 5 4#NL QBOTFILE 10 4*8= HUNT 2,FILE,FABSNB 6 4*MW QBOTFILE3 7 4B7G LDX 0 5 7 4BM6 SBN 0 3 9 4C6Q BZE 0 ZBOTIS 7 4CLB SBN 0 3 17 4D62 BZE 0 ZBOTIS [J IF AT BOTTOM NAME 5 4DKL PTRUPD 7 4F5= NGX 0 5 8 4FJW ADX 0 A1(2) 8 4G4G SMO FX1 9 4GJ6 BXGE 0 THREE,ZD4 21 4H3Q SBN 5 3 [FILE OF THE FABSNB,THE DIFFERENCE 21 4HHB BRN OLO [BETWEEN IT & THE R. H. WILL BE 1(<3) 7 4J32 ZD4 SBN 5 6 4 4JGL OLO 10 4K2= HUNT 3,FILE,FLOCNB 8 4KFW ADN 3 A1 8 4K_G ADN 2 A1 8 4LF6 ADX 2 0(2) 7 4LYQ SBX 2 5 20 4MDB MOVE 2 6 [MOVE IN REQUISITE NO. OF WORDS. 9 4MY2 CALL 7 QCHEQMOD 14 4NCL TRACEIF K6OPENTWO,99,299,3,OPENREL? 9 4NX= OPENRELD XBRK,3 9 4PBW TESTRPN2 OK,XREPLY 4 4PWG # 20 4QB6 # WE NOW PICK UP THE FCB & JUMP IMMEDIATELY IF THE FILE IS NOT 21 4QTQ # A DIRECTORY/B0 OF COMM UNSET) OTHERWISE WE MOVE A3ROSS THE USER 21 4R*B # NAME TO THE 6ABSNB,OVERWRITING THE LOCAL NAME OF THE DIRECTORY 4 4RT2 # 7 4S#L TOPFCB2 2 10 4SS= HUNT 3,FILE,FABSNB 7 4T?W LDX 7 3 11 4TRG JBC ZBOTIS,2,BFDIR 8 4W?6 ADX 3 A1(3) 7 4WQQ SBX 3 5 11 4X=B TESTUSER A1(3),QBOTFILE 21 4XQ2 # WE ARE NOT AT THE BOTTOM,& WE HAVE A LOCAL NAME,SO OVERWRITE IT 12 4Y9L # WITH THE APPROPRIATE USERNAME 8 4YP= LDN 1 A1(3) 7 4_8W SUM 0 3 9 4_NG STO 0 A1+5(3) 9 5286 LDX 0 HCOLUSER 8 52MQ STO 0 A1(3) 9 537B LDN 1 A1+1(3) 9 53M2 LDN 0 FME1(2) 16 546L MOVE 0 3 [ORIGINALLY THERE 8 54L= LDX 0 ACES 9 555W STO 0 A1+4(3) 18 5656 LDX 2 7 [PICK UP POINTER AGAIN 7 56JQ NGN 0 6 7 574B ADX 0 5 18 57J2 BNZ 0 PTRUPD [J.IF NOT TO BOTTOM YET 5 583L ZBOTIS 10 58H= TESTMODE 6,ND,NOT,DIR 18 59GG LDN 1 6 [SIZE OF FLOCNB = 6 WORDS 17 5=26 ADS 1 A1(2) [RESTORE REC. HEADER 15 5=FQ HUNT 3,FILE,FLOCNB [X3-> FLOCNB 21 5=_B LDX 0 ALOGLEN(2) [IF 0<(ALOGLEN) - (A1) <6 SET U 18 5?F2 SBX 0 A1(2) [ AN 8 WORD FLOCNB 12 5?YL BZE 0 NOSER [ 4 5#D= XX1 7 5#XW SBN 0 6 20 5*CG BZE 0 NOSER [IF FABSNB SIZE 4+6N,WHERE N IS 21 5*X6 BPZ 0 XX1 [INTEGRAL, THEN FLOCNB SHOULB BE 6WDS 11 5BBQ ALTLEND 3,8,FILE,FLOCNB 15 5BWB HUNT 2,FILE,FABSNB [X2-> FABSNB 15 5CB2 HUNT 3,FILE,FLOCNB [X3-> FLOCNB 18 5CTL LDN 1 8 [SIZE OF FLOCNB = 8 WORDS 5 5D*= NOSER 9 5DSW LDX 0 ATYPE(2) 21 5F#G DSA 0 ATYPE(3) [COPY LS 12 BITS OF TYPE WORD TO FLOC 8 5FS6 ADN 3 A1 8 5G?Q ADX 2 A1(2) 8 5GRB ADN 2 A1-6 21 5H?2 MOVE 2 0(1) [MOVE LOCAL NAME FROM FABSNB TO FLOCN 12 5HQL TESTMODE 6,NERASE,NOT,ERASING 21 5J== GETDIR 2 [TELL ME OF ENTRY EVEN IF TO-BE-ERASE 8 5JPW BRN TESTR 5 5K9G NERASE 6 5KP6 GETDIR 5 5L8Q TESTR 9 5LNB TESTRPN2 OK,UREPLY 18 5M82 ND [REPLY ^OKAY^ ALREADY SET 10 5MML HUNT 2,FILE,FABSNB 8 5N7= LDX 1 A1(2) 8 5NLW SMO FX1 9 5P6G BXL 1 SIX,N6 7 5PL6 SBN 1 3 4 5Q5Q N6 7 5QKB SBN 1 3 7 5R52 ADX 1 2 8 5RCC ... LDX 0 A1(1) 10 5RPS ... BXU 0 HCOLUSER,NOAD 7 5S4= ADN 1 1 4 5SHW NOAD 10 5T3G TRACE A1(1),OPENED 10 5TH6 HUNT 1,FILE,FLOCNB 8 5W2Q LDX 0 A1(2) 20 5WGB SMO FX1 [FILE & HAD A LOCAL NAME,MOVE RN 18 5X22 BXL 0 SIX,MND [CORRESPONDING USERNAME 7 5XFL SBN 0 6 7 5X_= SMO 0 9 5YDW TESTUSER A1(2),MND 8 5YYG ADN 1 A1+4 8 5_D6 ADX 2 A1(2) 21 5_XQ ADN 2 A1-2 [X2-> GEN. NO. OF LAST LOCAL NAME IN 21 62CB MOVE 1 2 [UPDATE FABSNB WITH DIR. ENTRY INFORM 8 62X2 SBN 1 A1+4 4 63BL MND 4 63W= [ 21 64*W [THE CODE BETWEEN HERE & THE 'FREECORE' WAS INSERTED TO DEAL WITH BUG 21 64TG [2586. AT THE END OF AN OPENTHAW ALL ACTIVITIES WAITING FOR FILE TO BE 11 65*6 [FREE FOR EMPTYING ARE WOKEN UP. 4 65SQ [ 11 66#B TESTMODE 6,NOFR,NOT,THAW 18 66S2 LONGON 6,A1(1) [FREE WAITING ACTIVITIES 16 67?L HUNT 1,FILE,FLOCNB [RELOCATE FLOCNB. 4 67R= NOFR 15 68=W FREECORE 1 [FREE FLOCNB 5 69=6 UPPLUS1 9 69PQ LDX 0 AWORK2(2) 16 6=9B BZE 0 NOFREE [J IF NOT OPENSYS 10 6=P2 MFREE FILE,FABSNB 5 6?8L NOFREE 7 6?N= UPPLUS 1 4 6#7W XBRK 9 6*76 LDX 0 AWORK2(2) 9 6*LQ BZE 0 NFREEFAB 10 6B6B MFREE FILE,FABSNB 5 6BL2 NFREEFAB 19 6C5L UP [THERE HAS BEEN A BREAK-IN 4 6CK= # 4 6D4W # 14 6DJG # ROUTINES TO DEAL WITH NON-OF REPLIES 5 6F46 XREPLY 7 6FHQ LDX 0 5 7 6G3B SBN 0 3 9 6GH2 BZE 0 WREPLY 7 6H2L SBN 0 3 16 6HG= BZE 0 WREPLY [J IF BOTTOM FILE 8 6H_W SETREP NAME 5 6JFG WREPLY 10 6J_6 TESTMODE 6,RD,NOT,DIR 17 6KDQ SETREP NAME [MUST BE REPLY ^NAME^ 15 6LD2 HUNT 1,FILE,FABSNB [X1->FABSNB 7 6LXL LDN 0 6 20 6MC= ADS 0 A1(1) [RESTORE REC. HEADER TO ORIGINAL 4 6MWW RD 14 6NBG TESTMODE 6,QUERYM,,QUERY,REPLY,NOWAIT 4 6NW6 PD 21 6P*Q GEOERR BRIEFPM,NO FILE [FILE YOU ARE TRYING TO OPEN DOEESN