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