13 22FL SEG FHOBJIND,860,FILESTORE 4 22_= # 21 23DW # THIS FILEHANDLER SEGMENT HOLDS ALL INDEXING ROUTINES AND IMPLEMENTS 20 23YG # SOME RARE AND/OR BULKY RECORD MODES. ALL ENTRIES AND EXITS ARE BY 15 24D6 # 'ACROSS' TO OR FROM THE MASTER SEGMENT FHOBJ. 4 24XQ # 21 25CB SEGENTRY K1FHOBJIND,MODE0 [SUBROUTINE TO LOCATE RECORD FOR MODE 13 25X2 [#0 21 26BL SEGENTRY K3FHOBJIND,MODE3 [SUBROUTINE TO DO CHECKS FOR MODE #3 21 26W= SEGENTRY K4FHOBJIND,MODE4 [SUBROUTINE TO POSITION FILE FOR MODE 13 27*W [#4 19 27TG SEGENTRY K56FHOBJIND,MODE6 [IMPLEMENTATION OF MODE #6 18 28*6 [WOULD BE K6 BUT THIS IS 19 28SQ [RESERVED FOR TRACING LEVELS 19 29#B SEGENTRY K7FHOBJIND,MODE7 [IMPLEMENTATION OF MODE #7 19 29S2 SEGENTRY K11FHOBJIND,MODE11 [IMPLEMENTATION OF MODE #11 21 2=?L SEGENTRY K12FHOBJIND,MODE12 [SUBROUTINE TO SET UP FRB WITH DATA 15 2=R= [FOR MODE #12 18 2?=W SEGENTRY K50FHOBJIND,M11DIRRET [LINK USED IN MODE #11 4 2?QG # 20 2#=6 # AWORK AND ACC CONVENTIONS ARE AS FOR MASTER SEGMENT FHOBJ (Q.V.) 4 2#PQ # 10 2*9B # AWORK4 BIT DEFINITIONS:- 20 2*P2 BITDEFS AWORK4,23,MFHEOFMULT [WE'VE RUN OFF THE END OF A 20 2B8L [MULTIFILE. NO FURTHER PERIS 18 2BN= [CAN BE IMPLEMENTED. 21 2C7W BITDEFS AWORK4,22,MFHDIRMOD [THIS IS A DIRECTORY MODE WE'RE 16 2CMG [IMPLEMENTING 19 2D76 BITDEFS AWORK4,21,MFHRECEOF [LAST READ PERI LEFT US 16 2DLQ [AFTER EOF. 20 2F6B BITDEFS AWORK4,20,MFHBLOCKEOF [SIMILAR BIT FOR BLOCK PERIS. 20 2FL2 [HAS TO BE HANDLED SEPARATELY 20 2G5L [OWING TO DIFFERENT POINTER 16 2GK= [CONVENTIONS. 20 2H4W BITDEFS AWORK4,19,MFHNOT1ST [THIS IS NOT THE 1ST PERI. 19 2HJG BITDEFS AWORK4,18,MFHDIROWN [USER OWNS THE FILES IN 17 2J46 [THIS DIRECTORY 20 2JHQ BITDEFS AWORK4,17,MFHNONSER [THIS IS A DA,DR, OR MT FILE 20 2K3B BITDEFS AWORK4,16,MFHCHUCKOFF [WE ARE THROWING THIS FILE 21 2KH2 [OFFLINE (SET DURING MODE #33). 20 2L2L BITDEFS AWORK4,15,MFHTRAPSALT [WE ARE ALTERING THIS FILE'S 20 2LG= [TRAPS (SET DURING MODE #33). 19 2L_W BITDEFS AWORK4,14,MFHTABSSET [THE TAB SYSTEM HAS BEEN 16 2MFG [INITIALISED. 4 2M_6 # 4 2NDQ # 18 2NYB # SUBROUTINE TO MOVE BUFFER OUT OF PROGRAM TO A FILE/FWB . 17 2PD2 # A SUITABLE RECORD HEADER WILL BE ADDED TO THE FWB. 15 2PXL # CALLED ON X6, COORDINATES, LEAVES X3->FWB. 4 2QC= # 5 2QWW SETUPFWB 16 2RBG SBX 6 FX1 [RELATIVISE LINK 17 2RW6 LDX 4 ACA3(2) [SIZE OF DATA BUFFER 18 2S*Q ADN 4 1 [PLUS 1 FOR RECORD HEADER 14 2STB SETUPCORE 4,3,FILE,FWB [X3->FWB 17 2T*2 STO 4 A1(3) [STORE RECORD HEADER 17 2TSL LDX 4 AWORK2(2) [ADDR WITHIN PROGRAM 16 2W#= LDN 5 A1+1(3) [X5->DESTINATION. 17 2WRW FOUTMOVE APETADDR(2),4,5,ACA3(2),HLOCK2,2 [DO MOVE 8 2X?G ADX 6 FX1 14 2XR6 EXIT 6 0 [AND EXIT 4 2Y=Q # 9 2YQB # ******************* 4 2_=2 # 19 2_PL # SUBROUTINE TO DO AN INDEXED SEARCH USING A RECORD SUPPLIED. 21 329= # CALLED ON X6 WITH X3->RECORD IN FWB. IF A MODE #4 IS BEING IMPLEMENTE 19 32NW # SUBKEYS ARE TAKEN INTO ACCOUNT OTHERWISE THEY ARE IGNORED. 19 338G # IF A REPLY 'OK' IS GIVEN EXIT +1 OCCURS, OTHERWISE EXIT 0 IS 5 33N6 # TAKEN 4 347Q # 5 34MB POSITION 16 3572 SBX 6 FX1 [RELATIVISE LINK 19 35LL BC 2,MFHRECEOF [CLEAR EOF CONDITION SINCE 20 366= [WE ARE GOING TO REPOSTION THE 20 36KW [FILE. IF WE LEAVE IT AFTER EOF 19 375G [WE WILL RESET THE SWITCH. 19 37K6 TOPFCB2 2 [BRANCH TO INDIVIDUAL CODE 21 384Q BRINDEX FINFC(2),(GEOERR),MGETDIR,READDICT,SSEARCH,(GEOERR),MGET- 8 38JB SOUT,MGETSYS,MGETJOB 4 3942 # 7 39HL # ********** 4 3=3= # 21 3=GW # THE DIRECTORY CASE. WE SET UP A FILE/FLOCNB AND DO A GETDIR. WE NEVER 21 3?2G # BOTHER ABOUT SUBKEYS AS A MODE #4 IS NOT ALLOWED WITH DIRECTORIES. 4 3?G6 # 5 3?_Q MGETDIR 15 3#FB SETNCORE 6,2,FILE,FLOCNB [X2->FLOCNB 16 3#_2 STOZ A1+3(2) [CLEAR SUBKEYS 9 3*DL STOZ A1+4(2) 9 3*Y= STOZ A1+5(2) 10 3BCW MHUNTW 3,FILE,FWB 17 3BXG LDN 4 ELOC1(3) [TRANSFER LOCAL NAME 8 3CC6 LDN 5 A1(2) 7 3CWQ MOVE 4 3 19 3DBB BS 2,BFABANY [SHOW ANY ENTRANT ACCEPTABLE 15 3DW2 GETDIR 6 [DO A GETDIR 9 3F*L VFREEW FILE,ENT 10 3FT= MFREE FILE,FLOCNB 16 3G#W BRN POSITIONED [J TO END OF S/R 4 3GSG # 7 3H#6 # ********** 4 3HRQ # 21 3J?B # THE DICTIONARY CASE. WE SIMPLY DO A READDICT, UNLESS THE KEY IS ZERO 21 3JR2 # (A CIRCUMSTANCE WHICH BREAKS READDICT) IN WHICH CASE WE DO A REWIND 15 3K=L # AND STEP TO READ THE LIST ENTRY (1ST RECORD). 4 3KQ= # 5 3L9W READDICT 16 3LPG BWZ CUSER(3),READ1STREC [J IF ZERO KEY 16 3M96 READDICT ,CUSER(3),NOADICT [LOCATE RECORD 17 3MNQ BRN POSITIONED [J TO ANALYSE REPLY 6 3N8B READ1STREC 6 3NN2 REWIND 6 3P7L STEP 18 3PM= BRN POSITOK [NO NEED TO ANALYSE REPLY 4 3Q6W # 7 3QLG # ********** 4 3R66 # 14 3RKQ # THE :SYSTEM.SERIAL CASE. WE USE SSEARCH. 4 3S5B # 5 3SK2 SSEARCH 15 3T4L LDX 0 A1+1(3) [PICK UP TSN 19 3TJ= SSEARCH NOTFOUND,0 [J TO NOTFOUND IF NOT FOUND 18 3W3W BRN POSITOK [NO NEED TO ANALYSE REPLY 4 3WHG # 7 3X36 # ********** 4 3XGQ # 21 3Y2B # THE :SYSTEM.OUTPUT CASE. WE DO A GETSOUT. IF THE MODE IS NOT #4 WE 10 3YG2 # ZEROISE THE SUBKEY FIRST. 4 3Y_L # 5 3_F= MGETSOUT 8 3_YW LDX 2 FX2 14 42DG LDCT 0 #020 [BIT 4 9 42Y6 ANDX 0 AWORK1(2) 15 43CQ BNZ 0 YESM4 [J IF MODE #4 15 43XB STOZ GOUTKEY2(3) [CLEAR SUBKEY 5 44C2 YESM4 13 44WL GETSOUT ,GOUTKEY1(3),GOUTKEY2(3) 17 45B= BRN POSITIONED [J TO ANALYSE REPLY 4 45TW # 7 46*G # ********** 4 46T6 # 21 47#Q # THE :SYSTEM.JOBLIST CASE. WE DO A GETJOB WITH THE 'SYSTEM' PARAMETER 4 47SB # 5 48#2 MGETSYS 12 48RL GETJOB JLJOBNO+A1(3),SYSTEM 17 49?= BRN POSITIONED [J TO ANALYSE REPLY 4 49QW # 7 4==G # ********** 4 4=Q6 # 21 4?9Q # THE USER JOBLIST CASE. THIS TIME THE GETJOB HAS THE 'USER' PARAMETER. 4 4?PB # 5 4#92 MGETJOB 14 4#NL LDN 2 JLJOBNAME+A1(3) [X2->KEY 9 4*8= GETJOB 2,USER 4 4*MW # 7 4B7G # ********** 4 4BM6 # 20 4C6Q # THE VARIOUS PATHS NOW MERGE. IF THE REPLY IS OK WE JUST EXIT 6 1. 19 4CLB # OTHERWISE WE DO A STEPAGAIN AND IF THE REPLY REVEALS WE ARE 20 4D62 # POSITIONED AFTER EOF WE SET THE 'HAVING JUST READ EOF' SWITCH. 8 4DKL # WE THEN EXIT 6 0 4 4F5= # 6 4FJW POSITIONED 16 4G4G TESTREPN OK,NOTFOUND [J IF NONOK REPLY 5 4GJ6 POSITOK 18 4H3Q LDX 2 FX2 [CORRUPTED IN MOST PATHS 17 4HHB ADX 6 FX1 [DE RELATIVISE LINK 14 4J32 EXIT 6 1 [AND EXIT 5 4JGL NOTFOUND 7 4K2= STEPAGAIN 17 4KFW BNZ 3 NOTEOFEXIT [J UNLESS END OF FILE 10 4K_G BS 2,MFHRECEOF 6 4LF6 NOTEOFEXIT 8 4LYQ ADX 6 FX1 7 4MDB EXIT 6 0 4 4MY2 # 21 4NCL # ********************************************************************* 4 4NX= # 21 4PBW # THIS SECTION IS A SUBROUTINE CALLED BY MODE #0 TO LOCATE A RECORD. 19 4PWG # IT RETURNS TO K3FHOBJ IN THE OK CASE AND K4FHOBJ OTHERWISE. 4 4QB6 # 20 4QTQ # WE SET UP A FWB AND CALL POSITION TO DO THE SEARCH. WHATEVER THE 21 4R*B # RESULT WE FREE THE FWB AND EXIT ACROSS TO THE RELEVANT ENTRY POINT 6 4RT2 # IN FHOBJ. 4 4S#L # 5 4SS= MODE0 19 4T?W CALL 6 SETUPFWB [SET UP FWB WITH DATA AREA 16 4TRG CALL 6 POSITION [POSITION FILE 15 4W?6 BRN M30NOTFOUND [NON-OK EXIT 14 4WQQ MFREEW FILE,FWB [FREE FWB 15 4X=B ACROSS FHOBJ,3 [OK RETURN 2 4XQ2 6 4Y9L M30NOTFOUND 9 4YP= MFREEW FILE,FWB 9 4_8W ACROSS FHOBJ,4 4 4_NG # 21 5286 # ******************************************************************** 4 52MQ # 21 537B # THIS SECTION CARRIES OUT THE INDEXED FILE CHECKS FOR A MODE #3. ON 20 53M2 # ENTRY THERE EXISTS A FILE/FWB CONTAINING THE NEW RECORD AND X6 11 546L # CONTAINS THE INDEX NUMBER. 20 54L= # THE CHECK APPLIED IS THAT THE USER IS NOT ATTEMPTING TO ALTER THE 14 555W # KEY OR SUBKEYS OF THE RECORD IN ANY WAY. 20 55KG # WE USE THE INDEX NUMBER TO SWITCH TO A RELEVANT PIECE OF CODE. 4 5656 # 5 56JQ MODE3 16 574B STEPAGAIN [X3->OLD RECORD 16 57J2 MHUNTW 2,FILE,FWB [X2->NEW RECORD 21 583L BRINDEX 6,(GEOERR),M3DIR,M3DICT,M3SER,M3INC,M3OUT,M3SYSJOB,M3USE- 4 58H= JOB 4 592W # 7 59GG # ********** 4 5=26 # 20 5=FQ # IN THE DICTIONARY CASE WE ENSURE THE USERNAME OF THE DIR HAS NOT 6 5=_B # CHANGED. 4 5?F2 # 5 5?YL M3DICT 21 5#D= TESTNAMX 3,CUSER(2),CUSER-A1(3),NILDATA,4 [ILLEGAL IF HAS CHANGED 8 5#XW BRN M3OK 4 5*CG # 7 5*X6 # ********** 4 5BBQ # 17 5BWB # :SYSTEM.SERIAL REQUIRES A SIMPLE COMPARISION OF TSNS. 4 5CB2 # 5 5CTL M3SER 9 5D*= LDX 0 A1+1(2) 18 5DSW BXU 0 FRH+1(3),NILDATA [ILLEGAL IF TSNS CHANGED 8 5F#G BRN M3OK 4 5FS6 # 7 5G?Q # ********** 4 5GRB # 20 5H?2 # :SYSTEM.OUTPUT REQUIRES THAT BOTH OF WORDS GOUTKEY1 AND GOUTKEY2 20 5HQL # BE UNCHANGED , UNLESS WORD GOUTYPE IS NOT #40000000 WHICH IMPLIES 21 5J== # THAT THIS IS NOT A KEYED RECORD. HOWEVER IN THIS CASE NEITHER RECORD 7 5JPW # MAY BE KEYED. 4 5K9G # 5 5KP6 M3OUT 10 5L8Q LDX 0 GOUTYPE(2) 17 5LNB BXU 0 GSIGN,M3OUTNOKEY [J IF NEW REC UNKEYED 10 5LTJ ... LDX 0 GOUTYPE-A1(3) 10 5M2Q ... BXU 0 GSIGN,NILDATA 10 5M82 LDX 0 GOUTKEY1(2) 13 5MML BXU 0 GOUTKEY1-A1(3),NILDATA 10 5N7= LDX 0 GOUTKEY2(2) 13 5NLW BXU 0 GOUTKEY2-A1(3),NILDATA 8 5P6G BRN M3OK 6 5PL6 M3OUTNOKEY 18 5Q5Q LDX 0 GOUTYPE-A1(3) [ILLEGAL IF OLD REC KEYED 17 5QKB BXE 0 GSIGN,NILDATA [AND NEW REC UNKEYED 8 5R52 BRN M3OK 4 5RJL # 7 5S4= # ********** 4 5SHW # 20 5T3G # IN THE :SYSTEM.JOBLIST CASE WE ENSURE THAT THE JOB NUMBER REMAINS 21 5TH6 # UNCHANGED. A NEGATIVE JOB NUMBER IS TREATED AS ZERO (B0 OF THE JOB 21 5W2Q # NUMBER IS SET FOR THE TEMPLATE RECORD AT THE START OF :SYSTEM.JOBLIST 4 5WGB # 5 5X22 M3SYSJOB 10 5XFL LDX 0 JLJOBNO+A1(2) 9 5X_= BPZ 0 NNGJNO 7 5YDW LDN 0 0 5 5YYG NNGJNO 10 5_D6 LDX 4 JLJOBNO(3) 9 5_XQ BPZ 4 NNGJNO2 7 62CB LDN 4 0 5 62X2 NNGJNO2 9 63BL BXU 0 4,NILDATA 8 63W= BRN M3OK 4 64*W # 7 64TG # ********** 4 65*6 # 20 65SQ # IN THE :USER.JOBLIST(/****) CASE THE KEY IS THE 3 WDS STARTING AT 7 66#B # JLJOBNAME. 4 66S2 # 5 67?L M3USEJOB 11 67R= LDX 0 JLJOBNAME+A1(2) 12 68=W BXU 0 JLJOBNAME(3),NILDATA 11 68QG LDX 0 JLJOBNAME+A1+1(2) 13 69=6 BXU 0 JLJOBNAME+1(3),NILDATA 11 69PQ LDX 0 JLJOBNAME+A1+2(2) 13 6=9B BXU 0 JLJOBNAME+2(3),NILDATA 4 6=P2 # 7 6?8L # ********** 4 6?N= # 10 6#7W # THE KEYS ARE UNCHANGED. 4 6#MG # 21 6*76 M3DIR [NEITHER DIRS NOR INCINDEX ARE EXPECT 5 6*LQ M3INC 4 6B6B M3OK 16 6BL2 ACROSS FHOBJ,5 [RETURN TO FHOBJ 4 6C5L # 21 6CK= # ******************************************************************** 4 6D4W # 21 6DJG # THIS SECTION IS OBEYED BY MODE #4 TO POSITION AN INDEXED FILE READY 12 6F46 # FOR THE INSERTION OF A RECORD. 21 6FHQ # ON ENTRY A FILE/FWB EXISTS WITH THE RECORD IN IT AND X6=INDEX NUMBER. 21 6G3B # WE INVOKE KEYRECI TO TELL US IF THE RECORD IS KEYED AND IF IT IS WE 21 6GH2 # CALL POSITION TO POSITION THE FILE. RETURN IS ACROSS TO FHOBJ 56 IF 17 6H2L # THE RECORD IS KEYED AND ACROSS TO FHOBJ 7 IF IT ISNT. 4 6HG= # 5 6H_W MODE4 12 6JFG MHUNTW 3,FILE,FWB [ 17 6J_6 LDN 2 A1(3) [X2->1ST WD OF RECORD 17 6KDQ KEYRECI 6,,2,NOKEY,1 [J TO NOKEY IF NO KEY 8 6KYB LDX 2 FX2 8 6LD2 LDX 1 FX1 16 6LXL CALL 6 POSITION [POSITION FILE 16 6MC= NULL [REPLY IRRELEVANT 20 6MGB ... LDCT 7 #100 [SET BIT IN REPLY TO SHOW THIS IS 21 6MKG ... [AN INDEXED FILE AND A KEYED RECORD 21 6MNL ... [AND THAT THE FILE HAS THEREFORE BEEN 20 6MRQ ... [REPOSITIONED DURING THE PERI. 9 6MWW ACROSS FHOBJ,56 5 6NBG NOKEY 9 6NW6 ACROSS FHOBJ,7 4 6P*Q # 21 6PTB # ******************************************************************** 4 6Q*2 # 21 6QSL # THIS SECTION IMPLEMENTS MODE #6. IT IS IN THIS SEGMENT BECAUSE IT IS 13 6R#= # VERY RARE AND INVOKES A HUGE MACRO. 18 6R#T ...# THIS MODE SHOULD CONSIST SIMPLY OF A 'CURTAIL'. HOWEVER 21 6R*D ...# CURTAIL HAS TWO SERIOUS DEFICIENCIES AND UNTIL THESE ARE CORRECTED 13 6RB3 ...# 'TEMPORARY' FRIGS HERE ARE NECESSARY. 4 6RBL ...# 20 6RC9 ...# 1)CURTAIL DOES NOT WRITE AWAY ANY USAGE BLOCKS FOR THE AREA WHICH 20 6RCS ...# HAS BEEN TRUNCATED OUT OF EXISTENCE. THUS IF RECORDS ARE APPENDED 21 6RDC ...# AND TRUNCATED AWAY WITHOUT BEING READ A FILE/FUWB MAY BE LEFT IN THE 20 6RF2 ...# FILE CHAIN WHICH DOES NOT BELONG WITHIN THE FILE. THIS WILL BREAK 16 6RFK ...# CLOSE AND ANYONE ELSE WHO TRIES TO WRITE IT AWAY. 20 6RG8 ...# THE TEMPORARY SOLUTION IS FOR FILEHANDLER TO ISSUE A FRITE MACRO. 19 6RGR ...# THIS WRITES AWAY ALL USAGE WRITE BLOCKS. THE FRITE HAS TO BE 19 6RHB ...# NONAUTONOMOUS SINCE IF A WRITE FAIL OCCURS AFTER THE FILE HAS 19 6RH_ ...# BEEN TRUNCATED READFAIL WILL BREAK BECAUSE THE FILE DOES NOT 9 6RJJ ...# CONTAIN THE BLOCK. 4 6RK7 ...# 20 6RKQ ...# 2)CURTAIL DOES NOT PUT A ZERO WORD ON THE END OF THE NEW 'LAST 21 6RL* ...# BLOCK'. THE FILEHANDLER DOES A DUMMY STEP(APPEND) AND THIS DOES IT. 21 6RLY ...# THIS IS NASTY SINCE IF THE USER DOES NOT APPEND ANYTHING TO THE FILE 20 6RMH ...# THE DUMMY RECORD WILL BE LEFT, WHICH MAY CONFUSE USERS AND HAS 17 6RN6 ...# BEEN KNOWN TO BREAK ROUTINES WHICH DIDNT EXPECT IT. 4 6RNP ...# 20 6RP# ...# THE MAIN OBSTACLE TO A REWRITE OF CURTAIL IS THAT THE EDITOR USES 20 6RPX ...# IT IN A RIDICULOUS AND EXTREMELY INEFFICIENT FASHION. WE CANNOT 15 6RQG ...# REWRITE IT UNTIL THIS IS CHANGED, I.E. NEVER. 4 6RR5 ...# 4 6RRW # 5 6S?G MODE6 9 6SH# ... FRITE ,NONAUT 16 6SR6 CURTAIL [TRUNCATE FILE 20 6T=Q STEP ,1,ANSWER [THIS IS NEEDED TO PUT THE ZERO 16 6TQB [AT END OF FILE 8 6W28 ... STOZ 0(3) 16 6W=2 BRN SETREP [J TO WINDUP CODE 4 6WPL # 21 6X9= # ********************************************************************* 4 6XNW # 21 6Y8G # THIS SECTION HANDLES MODE #7. FIRST WE VALIDATE THE COUNT/SUBMODE WOR 16 6YN6 # AND JUMP TO THE INDIVIDUAL IMPLEMENTATION CODE. 4 6_7Q # 5 6_MB MODE7 18 7272 LDX 0 ACA3(2) [PICK UP COUNT/SUBMODES 7 72LL SLL 0 1 16 736= BNG 0 WINDREWIND [J IF WIND/REWIND 21 73KW BZE 0 NILCOUNT [REMAINING MODES EXPECT COUNT 0 4095 21 754Q LDXC 3 ACA3(2) [PICK OUT COUNT AND SET C IF BACKSPAC 16 75JB BCS M7BSP [J IF BACKSPACE 16 7642 BRN M7SKIP [OTHERWISE SKIP 6 76HL WINDREWIND 7 773= SLL 0 1 21 77GW BNZ 0 NILCOUNT [ILLEGAL TO HAVE NONZERO COUNT FOR 16 782G [WIND OR REWIND 21 78G6 MBC 2,MFHRECEOF,MFHBLOCKEOF [BOTH MODES CLEAR EOF CONDITIONS 9 78_Q LDX 0 ACA3(2) 16 79FB BPZ 0 M7WIND [J IF IT'S WIND 4 79_2 # 7 7=DL # ********** 4 7=Y= # 11 7?CW # 'REWIND'. THIS IS TRIVIAL. 4 7?XG # 6 7#C6 REWIND 16 7#WQ BRN SETREP [J TO WINDUP CODE 4 7*BB # 7 7*W2 # ********** 4 7B*L # 11 7BT= # 'WIND' IS JUST AS TRIVIAL. 4 7C#W # 5 7CSG M7WIND 6 7D#6 WIND 16 7DRQ BRN SETREP [J TO WINDUP CODE 4 7F?B # 8 7FR2 # *********** 4 7G=L # 21 7GQ= # 'BACKSPACE'. THIS CLEARS THE RECORD END OF FILE CONDITION. THE BLOCK 21 7H9W # END OF FILE CONDITION REMAINS SET TILL THE NEXT MODE #22 AS WE CANNOT 21 7HPG # EASILY TELL HERE WHETHER THE CONDITION HAS BEEN CLEARED OWING TO A 21 7J96 # DIFFERENCE BETWEEN THE RECORD AND BLOCK POINTER CONVENTIONS. MODE #22 21 7JNQ # VERIFIES THAT THE CONDITION HAS NOT BEEN CLEARED BEFORE ACTING ON IT 6 7K8B # ANYWAY. 20 7KN2 # THE BACKSPACE IS ACCOMPLISHED VIA A SPECIAL ENTRY TO PERUSFIL. 4 7L7L # 5 7LM= M7BSP 20 7M6W BC 2,MFHRECEOF [CLEAR ONE END OF FILE CONDITION 18 7MLG STO 3 ACOMMUNE8(2) [PUT COUNT IN ACOMMUNE8 15 7N66 DOWN PERUSFIL,84 [DO BACKSPACE 21 7NKQ TESTREP2 BEGFILE,M7BEGFILE [JUMP TO EXCEPTION CODE IF BEGFILE 14 7P5B [FOUND. 16 7PK2 BRN SETREP [J TO WINDUP CODE 4 7Q4L # 7 7QJ= # ********** 4 7R3W # 21 7RHG # 'SKIP'. IF WE ARE IN AN END OF FILE CONDITION WE PROCEED DIRECT TO 21 7S36 # THE EXCEPTION CODE SINCE ACCORDING TO THE WRITEUP 'VSKIP' MAY GEOERR. 14 7SGQ # OTHERWISE WE CALL VSKIP TO DO THE SKIP. 4 7T2B # 5 7TG2 M7SKIP 17 7T_L JBS M7EOF,2,MFHRECEOF [J IF ALREADY AT EOF 14 7WF= VSKIP 0,0(3) [DO SKIP 21 7WKG ... TESTREP2 ENDFILE,M7EOF [JUMP TO EXCEPTION CODE IF HIT EOF 20 7WPQ ... [WITH AN UNEXPIRED SKIP COUNT. 19 7WW2 ... BNZ 3 SETREP [J TO WIND UP CODE UNLESS WE 20 7X2= ... [HIT END OF FILE EXACTLY (WITHOUT 19 7X6G ... [AN UNEXPIRED SKIP COUNT). 18 7X=Q ... BS 2,MFHRECEOF [SET 'RECORD EOF' MARKER. 20 7XC2 ... CALL 6 MCHOWN [SET OWN MONITORING EVENT BITS IF 20 7XH= ... [OWNMON IN USE (SEE 'MCHOWN' DEFN 14 7XMG ... [BELOW). 17 7XRQ ... BRN SETREP [J TO WINDUP CODE. 4 7XY6 # 7 7YCQ # ********** 4 7YXB # 4 7_C2 # 20 7_WL # MODE #11. THIS IS ONLY ALLOWED FOR DA,DR, AND MT FILES. THE DATA 21 82B= # AREA IS 7 WORDS LONG AND IS TO BE USED TO UPDATE REDTAPE IN THE FCB 10 82TW # AND THE DIRECTORY ENTRY. 4 83*G # 21 83T6 # FIRST WE CHECK THAT THE COUNT IS 7 WORDS, MOVE THE DATA OUT INTO A 20 84#Q # FILE/FWB, AND ENSURE THAT THE FIRST DATA WORD IS THE SAME AS THE 10 84SB # TYPE/MODE OF THE FILE. 4 85#2 # 5 85RL MODE11 9 86?= LDX 0 ACA3(2) 7 86QW SBN 0 7 20 87=G BNZ 0 NILCOUNT [ILLEGAL IF COUNT OUT OF RANGE 16 87Q6 CALL 6 SETUPFWB [MOVE BUFFER OUT 7 889Q TOPFCB2 2 18 88PB LDX 0 A1+1(3) [PICK UP T/M FROM BUFFER 19 8992 BXU 0 FETM(2),NILDATA [ILLEGAL IF NOT T/M OF FILE 8 89NL LDX 2 FX2 4 8=8= # 7 8=MW # ********** 4 8?7G # 20 8?M6 # IF ANY OF THE FOLLOWING FIELDS ARE NONZERO IN THE BUFFER WE ARE 21 8#6Q # GOING TO HAVE TO UPDATE THE DIRECTORY AS WELL AS THE FCB OTHERWISE WE 14 8#LB # CAN GET BY WITH JUST UPDATING THE FCB. 4 8*62 # 18 8*KL # MS 2 BITS OF SECOND DATA WORD, 3RD, 4TH, 5TH DATA WORDS. 4 8B5= # 8 8BJW LDCT 0 #600 21 8C4G ANDX 0 A1+2(3) [PICK MS2 BITS OF 2ND WORD OF DATA 20 8CJ6 ORX 0 A1+3(3) [OR IN REST OF DIR ONLY DATA WDS 9 8D3Q ORX 0 A1+4(3) 9 8DHB ORX 0 A1+5(3) 19 8F32 BZE 0 M11NODIRUPD [J IF NO DIR UPDATE NEEDED 4 8FGL # 7 8G2= # ********** 4 8GFW # 20 8G_G # WE ARE GOING TO HAVE TO UPDATE THE DIRECTORY. SINCE ANY OPEN CAN 20 8HF6 # TAKE A LONG TIME THE PROGRAM MUST BE SWAPPABLE FOR THE DURATION. 16 8HYQ # SO, WE ADOPT THE FOLLOWING TORTUOUS APPROACH:- 21 8JDB # 1) SET UP A FABSNB FOR THE FILE AND CLEAR ALL OBJECT PROGRAM LOCKS. 16 8JY2 # 2) TRANSFER TO THE PCA AND UNPLUG THE PROGRAM. 21 8KCL # 3) TRANSFER TO THE CPA , LOCATE THE OLPA AND PICK UP THE FABSNB AND 7 8KX= # THE FWB. 21 8LBW # 4) DO AN OPENDIR, FREE THE FABSNB, UPDATE THE DIRENT, CLOSE THE DIR, 15 8LWG # REFIND THE OLPA AND GIVE IT BACK THE FWB. 21 8MB6 # 5) STEP BACK THE PROGRAM COUNTER AND RESTART THE PROGRAM. THIS WILL 21 8MTQ # MAKE THE PROGRAM REPEAT THE PERI, AND THE OLPA WILL BE WOKEN UP 21 8N*B # AND WILL CONTINUE OBEYING THIS CHAPTER AT THE LINK WE SET IN IT 12 8NT2 # BEFORE TRANSFERRNG TO THE PCA. 21 8P#L # 6) ON REACTIVATION THE OLPA WILL RELOCK THE CONTROL AREA FOR THE REPL 4 8PS= # 16 8Q?W # FIRST WE SET UP THE FABSNB AND CLEAR THE LOCKS. 4 8QRG # 16 8R?6 SETNCORE 10,3,FILE,FABSNB [SET UP A FABSNB 16 8RQQ LDN 0 10 [RECORD HEADER 8 8S=B STO 0 A1(3) 14 8SQ2 TOPFCB2 1 [X1->FCB 17 8T9L LDN 4 FUSE1(1) [X4->START OF NAME 16 8TP= LDN 5 A1+1(3) [X5->DESTINATION 15 8W8W MOVE 4 9 [MOVE NAME IN 20 8WNG CLEAR APETADDR(2),0 [CLEAR ALL LOCKED DOWN MARKERS 8 8X86 LDX 1 FX1 4 8XMQ # 7 8Y7B # ********** 4 8YM2 # 20 8_6L # NEXT WE PICK UP THE ACTIVITY NUMBER OF THE OLPA SO WE CAN REFIND 21 8_L= # IT, TRANSFER TO THE PCA AND UNPLUG THE PROGRAM, MAKING IT SWAPPABLE. 4 925W # 16 92KG LDX 4 ACTNUM(2) [X4=OLPA ACTNUM 21 9356 TOPCA1 M11RETLINK(1) [CHANGE TO PCA SETTING UP LINK IN OLP 6 93JQ UNPLUG 4 944B # 7 94J2 # ********** 4 953L # 20 95H= # NOW TO THE CPA. ONCE THERE WE REFIND THE OLPA AND STEAL THE FIRST 20 962W # TWO BLOCKS IN ITS CHAIN, WHICH WILL BE THE FABSNB AND THE FWB. 4 96GG # 14 9726 FCAPCA 3,2 [X3->CPA 15 97FQ CHANGEAC 3 [CHANGE TO IT 14 97_B FINDACTX 3,4 [X3->OLPA 17 98F2 CHAIN FPTR(3),2 [RECHAIN 1ST 2 BLOCKS 9 98YL CHAIN FPTR(3),2 4 99D= # 7 99XW # ********** 4 9=CG # 21 9=X6 # HERE WE ARE IN THE CPA WITH THE FWB AND THE FABSNB. WE OPEN THE DIR 20 9?BQ # SPECIFYING 'ERASING' SUBMODE, AND GEOERRING IF A NON-OK REPLY IS 6 9?WB # GIVEN. 4 9#B2 # 13 9#TL OPENDIR (GEOERR),GENERAL,ERASING 10 9**= TESTRPN2 OK,(GEOERR) 4 9*SW # 7 9B#G # ********** 4 9BS6 # 21 9C?Q # WE NOW UPDATE THE FILE/ENT FROM THE FWB, NAME IT A FWB, REPOSITION 12 9CRB # THE DIRECTORY, AND REWRITE IT. 15 9D?2 # WE THEN FREE THE RENAMED ENT AND THE FABSNB. 4 9DQL # 10 9F== MHUNTW 3,FILE,ENT 10 9FPW MHUNTW 2,FILE,FWB 19 9G9G LDX 0 A1+1(2) [TRANSFER TM AND OTHER DATA 9 9GP6 STO 0 ETM(3) 9 9H8Q LDX 0 A1+2(2) 9 9HNB STO 0 EINF3(3) 9 9J82 LDX 0 A1+3(2) 9 9JML STO 0 EFLOW(3) 9 9K7= LDX 0 A1+4(2) 9 9KLW STO 0 EORG(3) 9 9L6G LDX 0 A1+5(2) 9 9LL6 STO 0 EKEY(3) 9 9M5Q LDX 0 A1+6(2) 10 9MKB STO 0 EENDBUCK(3) 9 9N52 LDX 0 A1+7(2) 10 9NJL STO 0 EVERSION(3) 19 9P4= NAME 3,FILE,FWB [RENAME THE ENT FOR REWRITING 21 9PHW BBUS 23,ECOPS(3),NOBLOCK [J IF NO BLOCKS REC TO BACKSPACE OVER 19 9Q3G BACKSPACE [BACKSPACE OVER BLOCKS REC 5 9QH6 NOBLOCK 16 9R2Q REWRITE [REWRITE NAME REC 14 9RGB MFREEW FILE,FWB [FREE ENT 10 9S22 MFREEW FILE,FABSNB 4 9SFL # 7 9S_= # ********** 4 9TDW # 21 9TYG # NOW WE CLOSE THE DIRECTORY, REFIND THE OLPA AND GIVE IT BACK ITS FWB. 4 9WD6 # 16 9WXQ CLOSETOP [CLOSE DIRECTORY 14 9XCB FINDACTX 2,4 [X2->OLPA 14 9XX2 MHUNTW 3,FILE,FWB [X3->FWB 16 9YBL CHAIN 3,2 [GIVE FWB TO OLPA 4 9YW= # 7 9_*W # ********** 4 9_TG # 21 =2*6 # WE CANNOT JUST CHANGE BACK TO THE OLPA AS WE HAVE UNPLUGGED THE PROGR 21 =2SQ # AND MUCKED UP THE CPA'S LINK. WE GET ROUND THE PROBLEM BY STEPPING 21 =3#B # BACK THE PROGRAM COUNTER , RESTARTING THE PROGRAM SO THAT THE OLPA 21 =3S2 # WILL IMMEDIATELY BE WOKEN BY THE REPEATED PERI. WE DUMPED THE LINK TO 17 =4?L # THE CONTINUATION WHEN WE TRANSFERRED OUT OF THE OLPA. 4 =4R= # 18 =5=W STEPBACK [STEP BACK PROG COUNTER 16 =5QG RUNPROG [RESTART PROGRAM 4 =6=6 # 4 =6PQ # 7 =79B # ********** 4 =7P2 # 21 =88L # WE HAVE JUST REURNED FROM REWRITING THE DIRECTORY ENTRY IN THE CPAT. 18 =8N= # WE RELOCK THE CONTROL AREA SINCE THIS HAS BEEN UNLOCKED . 4 =97W # 6 =9MG M11RETLINK 21 ==76 PAIR FHOBJIND,50 [RETURN LINK (BRNS TO M11DIRRET) 6 ==LQ M11DIRRET 14 =?6B LDX 3 APETADDR(2) [X3->PCA 17 =?L2 LOCKCA 3,ACAP(2) [LOCK CONTROL AREA 15 =#5L MHUNTW 3,FILE,FWB [REFIND FWB 4 =#K= # 7 =*4W # ********** 4 =*JG # 21 =B46 # NOW WE UPDATE THE FCB. THE PATH WHICH SKIPPED THE DIRECTORY UPDATE 7 =BHQ # REJOINS HERE. 4 =C3B # 6 =CH2 M11NODIRUPD 14 =D2L TOPFCB2 2 [X2->FCB 9 =DG= LDX 0 A1+1(3) 9 =D_W STO 0 FETM(2) 9 =FFG LDX 0 A1+2(3) 9 =F_6 DEX 0 FSIZE(2) 9 =GDQ LDX 0 A1+6(3) 10 =GYB STO 0 FENDBUCK(2) 9 =HD2 LDX 0 A1+7(3) 10 =HXL STO 0 FVERSION(2) 8 =JC= LDX 2 FX2 4 =JWW # 7 =KBG # ********** 4 =KW6 # 18 =L*Q # FINALLY WE FREE THE FWB AND RETURN TO SET A ZERO REPLY. 4 =LTB # 9 =M*2 MFREEW FILE,FWB 16 =MSL BRN SETREP [J TO WINDUP CODE 4 =N#= # 21 =NRW # ********************************************************************* 4 =P?G # 21 =PR6 # MODE #12. THIS SECTION SETS UP A FILE/FRB WITH A RECORD CONTAINING 21 =Q=Q # TYPE/MODE DATA ETC FOR THE FILE. ON RETURN TO FHOBJ THIS RECORD WILL 20 =QQB # BE USED IN THE NORMAL READ MODE CODE AND THE DATA TRANSFERRED TO 7 =R=2 # THE PROGRAM. 20 =RPL # IF THE FILE IS SERIAL WE HAVE ONLY ONE WORD OF DATA SO THE FRB IS 21 =S9= # 2 WORDS LONG. OTHERWISE WE HAVE 7 WORDS OF DATA AND NEED AN 8 WORD 5 =SNW # FRB. 4 =T8G # 5 =TN6 MODE12 19 =W7Q LDN 4 2 [SIZE OF FRB FOR SERIAL CASE 18 =WMB JBC M12SER,2,MFHNONSER [J UNLESS NONSERIAL FILE 18 =X72 LDN 4 8 [SIZE FOR NON SERIAL FILE 5 =XLL M12SER 15 =Y6= SETUPCORE 4,3,FILE,FRB [SET UP FRB 18 =YKW STO 4 A1(3) [INITIALISE RECORD HEADER 4 =_5G # 7 =_K6 # ********** 4 ?24Q # 21 ?2JB # IF THIS IS THE SERIAL CASE WE PICK UP THE TYPE/MODE AND STORE IT IN 21 ?342 # THE FRB. THIS IS OBTAINED FROM WORD FSCTM OF THE OLPA IN THE NORMAL 21 ?3HL # CASE. FOR AN ONLINED FILEHANDLER WE GET IT FROM THE JDF FCB (BACKGROU 15 ?43= # CASE) OR ASSUME IT TO BE GRAPHIC (MOP CASE). 4 ?4GW # 18 ?52G JBS M12NONSER,2,MFHNONSER [J IF NONSERIAL CASE 16 ?5G6 WHICHMOP M12NORMAL [J IF NOT OL *FH 14 ?5_Q FCAPCA 1,APETADDR(2) [X1->CPA 16 ?6FB BCONTEXT M12ONLINE,1,MOP [J IF MOP OL CASE 20 ?6_2 NGN 4 2 [DEPTH OF JDF FCB IN CPA FILERING 17 ?7DL SFSTACK 4,2,1,1 [X1->FSTACK OF JDF 18 ?7Y= LDX 2 FX2 [X2 CORRUPTED BY MACRO 16 ?8CW LDX 1 BPTR(1) [X1->FCB OF FILE 15 ?8XG LDX 4 FETM(1) [TYPE MODE 3 ?8_D ... 5 ?93B ...SETB1 10 ?95# ... SEGENTRY K80FHOBJIND 19 ?97= ... BRN K81FHOBJIND [NULL IF FHONLINE ON 8 ?998 ... LDCT 1 #200 18 ?9?6 ... ORX 4 1 [ONLINE FH SO SET BIT 1 10 ?9*4 ... SEGENTRY K81FHOBJIND 5 ?9C6 STORETM 17 ?9WQ STO 4 A1+1(3) [PUT VALUE IN BUFFER 8 ?=BB LDX 1 FX1 16 ?=W2 BRN M12WINDUP [J TO WINDUP CODE 14 ??*L M12ONLINE [MOP CASE 17 ??T= LDN 4 #12 [ASSEMBLE GRAPHIC T/M 8 ?##W ORX 4 GSIGN 8 ?#SG ... BRN SETB1 15 ?*#6 M12NORMAL [NORMAL CASE 17 ?*RQ LDX 4 FSCTM(2) [X4= T/M FROM OLPA 9 ?B?B BRN STORETM 4 ?BR2 # 7 ?C=L # ********** 4 ?CQ= # 20 ?D9W # IN THE NONSERIAL CASE MUCH MORE DATA IS INVOLVED. SOME OF THIS IS 21 ?DPG # TAKEN FROM THE FCB, SOME FROM THE FILE/ENT THOUGHTFULLY CHAINED TO 20 ?F96 # THE OLPA BY ASSIGN. WE CAN'T GET ALL THE DATA FROM THE ENT AS THE 20 ?FNQ # INFORMATION IN THE FCB IS VOLATILE AND MAY HAVE CHANGED SINCE THE 13 ?G8B # ENT WAS SET UP DURING THE USEROPEN. 4 ?GN2 # 6 ?H7L M12NONSER 14 ?HM= MHUNTW 2,FILE,ENT [X2->ENT 19 ?J6W LDCT 0 #600 [TRANSFER TOP 2 BITS OF EINF3 9 ?JLG ANDX 0 EINF3(2) 9 ?K66 STO 0 A1+2(3) 9 ?KKQ LDX 0 EFLOW(2) 9 ?L5B STO 0 A1+3(3) 9 ?LK2 LDX 0 EORG(2) 9 ?M4L STO 0 A1+4(3) 9 ?MJ= LDX 0 EKEY(2) 9 ?N3W STO 0 A1+5(3) 14 ?NHG TOPFCB 2 [X2->FCB 17 ?P36 LDX 0 FETM(2) [TRANSFER TYPE MODE 9 ?PGQ STO 0 A1+1(3) 9 ?Q2B LDX 0 FSIZE(2) 20 ?QG2 DEX 0 A1+2(3) [DEX TO AVOID CLEARING MS 2 BITS 10 ?Q_L LDX 0 FENDBUCK(2) 9 ?RF= STO 0 A1+6(3) 10 ?RYW LDX 0 FVERSION(2) 9 ?SDG STO 0 A1+7(3) 8 ?SY6 LDX 2 FX2 4 ?TCQ # 7 ?TXB # ********** 4 ?WC2 # 21 ?WWL # MODE #12 IS NOW COMPLETE. WE EXIT ACROSS TO FHOBJ (Q.V.) WHICH TREATS 17 ?XB= # THE FRB AS THOUGH IT HAD JUST READ IT FROM THE FILE. 4 ?XTW # 6 ?Y*G M12WINDUP 9 ?YT6 ACROSS FHOBJ,8 4 ?_#Q # 21 ?_SB # ********************************************************************* 4 #2#2 # 4 #2RL # 19 #3?= # THE WINDUP CODE SIMPLY GOES ACROSS TO FHOBJ TO SET THE REPLY. 4 #3QW # 5 #4=G SETREP 9 #4Q6 ACROSS FHOBJ,2 4 #59Q # 21 #5PB # ********************************************************************* 4 #692 # 21 #6NL # THIS IS THE EXCEPTION SECTION. MOST EXCEPTIONS ARE HANDLED IN FHOBJ. 4 #78= # 9 #7MW # ILLEGAL DATA ERROR 4 #87G # 5 #8M6 NILDATA 9 #8WY ... VFREEW FILE,FWB 17 #96Q ACROSS FHOBJ,9 [GET FHOBJ TO ILLEGAL 4 #9LB # 11 #=62 # ILLEGAL COUNT OUT OF RANGE 4 #=KL # 5 #?5= NILCOUNT 17 #?JW ACROSS FHOBJ,10 [GET FHOBJ TO ILLEGAL 4 ##4G # 9 ##J6 # ******************** 4 #*3Q # 21 #*HB # THE ONLY EXCEPTIONS REQUIRNG ACTION IN FHOBJIND ARE THE END OF FILE 19 #B32 # AND BEGINNING OF FILE CONDITIONS WHICH ARISE DURING MODE #7. 20 #BGL # IN BOTH CASES A REPLY OF #0500XXXX IS SET IF OWN-MON IS IN USE, 19 #C2= # WHERE #XXXX IS THE REMAINDER COUNT FROM THE SKIP/BACKSPACE. 17 #CFW # OTHERWISE A SUITABLE ILLEGAL TAKES PLACE IN FHOBJ. 4 #C_G # 20 #DF6 # SUBROUTINE TO SET X7 = #05000000 IF OWN-MON IS IN USE AND ZERO 7 #DYQ # OTHERWISE. 7 #FDB # CALLED ON X6. 4 #FY2 # 5 #GCL MCHOWN 15 #GX= LDN 7 0 [CLEAR REPLY 9 #HBW LDX 0 ACA1(2) 7 #HWG SRL 0 6 18 #JB6 ANDN 0 #777 [EXTRACT ADDITIVE MODE 8 #JTQ SBN 0 #300 18 #K*B BNZ 0 (6) [EXIT IF #30000 NOT USED 17 #KT2 LDCT 7 #050 [SET OWN MON REPLY 13 #L#L EXIT 6 0 [EXIT 4 #LS= # 20 #M?W # MODE #7 BEG FILE CONDITION. THE REMAINDER COUNT IS IN ACOMMUNE8. 4 #MRG # 6 #N?6 M7BEGFILE 17 #NQQ BC 2,MFHRECEOF [ENSURE SWITCH CLEAR 19 #P=B CALL 6 MCHOWN [SET OWN MON REPLY IF OWN MON 15 #PQ2 BNZ 7 NOTILLBOF [J IF OWN MON 17 #Q9L ACROSS FHOBJ,11 [GET FHOBJ TO ILLEGAL 6 #QP= NOTILLBOF 20 #R8W ORX 7 ACOMMUNE8(2) [OR REMAINDER COUNT INTO REPLY 17 #RNG BRN SETREP [JUMP TO WINDUP CODE 4 #S86 # 18 #SMQ # MODE #7 END FILE CONDITION. THE REMAINDER COUNT IS IN X3. 4 #T7B # 5 #TM2 M7EOF 17 #W6L BS 2,MFHRECEOF [ENSURE SWITCH SET 17 #WL= CALL 6 MCHOWN [SET REPLY IF OWNMON 15 #X5W BNZ 7 NOTILLEOF [J IF OWNMON 17 #XKG ACROSS FHOBJ,12 [GET FHOBJ TO ILLEGAL 6 #Y56 NOTILLEOF 20 #YJQ ORX 7 3 [OR REMAINDER COUNT INTO REPLY 17 #_4B BRN SETREP [JUMP TO WINDUP CODE 4 #_J2 # 4 *23L # 4 *2H= # 11 *32W MENDAREA 30,K99FHOBJIND 4 *3GG # 4 *426 #END 6 ____ ...552515340009