FHOBJ860

(George Source)

Macros used: ACROSS, BACKSPACE, BC, BITDEFS, BS, BXGE, CHECKB, COMPQU, DELETE, FADDRESS, FDRMTEST, FINMOVE, FOUTMOVE, INMOP, INSERT, JBC, JBS, JMBS, LOCKCA, MENDAREA, MFREEW, MHUNTW, NAME, OLPEND, OUTMOP, PAIR, PMODES, REPLACE, SEG, SEGENTRY, SETREP, SETUPCORE, STEP, STEPAGAIN, TESTREP2, TOPCA, TOPCA1, TOPFCA2, TOPFCB2, VFREE, VFREEW, WHICHMOP

FHOBJ860.txt
22FL          SEG   FHOBJ,860,FILE  
22^=    #   
23DW    #  THIS SEGMENT IS THE MAIN PATH OF FILEHANDLER. IT DOES THE INITIAL
23YG    #  ANALYSIS AND BASIC CHECKING OF ALL PERIS, AND ACTUALLY IMPLEMENTS
24D6    #  THE MOST COMMON MODES.   
24XQ    #  SEGMENTS FHOBJDIR, FHOBJBL AND FHOBJIND HANDLE THE REST. 
25CB    #   
25X2    #   
26BL          SEGENTRY K1FHOBJ,PERI        [ENTRY TO DEAL WITH A PERI.  
26W=          SEGENTRY K2FHOBJ,SETREP      [REENTRY FROM OTHER CODE TO SET  
27*W                                       [A REPLY AND WIND UP THE TRANSFER.   
27TG          SEGENTRY K3FHOBJ,M0FOUND      [OK RETURN FROM MODE #0 CODE IN 
28*6                                       [FHOBJIND
28SQ          SEGENTRY K4FHOBJ,NOTFOUND    ['NOT FOUND' RETURN FROM MODE #0 CODE
29#B          SEGENTRY K5FHOBJ,NOTINDMODE3 [OK RETURN FROM MODE #3 INDEXING 
29S2                                       [CHECKS IN FHOBJIND  
2=?L          SEGENTRY K56FHOBJ,OKINDMODE4 [OK RETURN FROM FHOBJIND MODE #4 
2=R=                                       [INDEXING CODE IF RECORD IS KEYED.   
2?=W                                       [WOULD BE K6 BUT THID IS RESERVED
2?QG                                       [FOR TRACING LEVELS  
2#=6          SEGENTRY K7FHOBJ,NOTINDMODE4 [DITTO: BUT THE RECORD IS NOT KEYED  
2#PQ                                       [AND A BEGINNING OF FILE CHECK IS
2*9B                                       [NEEDED  
2*P2          SEGENTRY K8FHOBJ,YESOL3      [RETURN FROM MODE #12 CODE   
2B8L          SEGENTRY K9FHOBJ,NILDATA     [VARIOUS ILLEGAL RETURNS 
2BN=          SEGENTRY K10FHOBJ,NILCOUNT
2C7W          SEGENTRY K11FHOBJ,OUTILLBOF   
2CMG          SEGENTRY K12FHOBJ,OUTILLEOF   
2D76    #   
2DLQ    #  AWORK AND ACC CONVENTIONS:-  
2F6B    #   
2FL2    #     AWORK1 IS SET UP WITH BIT 0 SHIFTED RIGHT N PLACES WHERE N IS 
2G5L    #     THE MODE. THIS IS DONE BY THE INITIAL ANALYSIS CODE, AND MAKES
2GK=    #     IT POSSIBLE TO ESTABLISH IF THE MODE FALLS INTO A GIVEN SET BY
2H4W    #     SIMPLY 'AND'ING AWORK1 AGAINST A SUITABLE BIT MASK.   
2HJG    #     THE DIRECTORY MODES #30 ETC ARE TREATED AS THEIR CORRSP RECORD
2J46    #     MODES FOR THIS PURPOSE.   
2JHQ    #   
2K3B    #     AWORK2 IS SET UP BY THE INITIAL ANALYSIS CODE TO CONTAIN THE  
2KH2    #     ADDRESS OF THE BUFFER WITHIN THE PROGRAM. 
2L2L    #   
2LG=    #     AWORK3 IS SET UP BY ASSIGN AS A MASK OF FORBIDDEN MODES WITH THE  
2L^W    #     TYPE OF FILE IN USE. THIS IS ANDXED AGAINST AWORK1 DURING 
2MFG    #     INITIAL ANALYSIS AND CHECKING.
2M^6    #   
2NDQ    #     AWORK4 IS A BIT WORD. THE DEFINITIONS ARE:-   
2NYB    #   
2PD2          BITDEFS  AWORK4,23,MFHEOFMULT    [WE'VE RUN OFF THE END OF A  
2PXL                                           [MULTIFILE. NO FURTHER PERIS 
2QC=                                           [CAN BE IMPLEMENTED. 
2QWW          BITDEFS  AWORK4,22,MFHDIRMOD     [THIS IS A DIRECTORY MODE WE'RE  
2RBG                                           [IMPLEMENTING
2RW6          BITDEFS  AWORK4,21,MFHRECEOF     [LAST READ PERI LEFT US  
2S*Q                                           [AFTER EOF.  
2STB          BITDEFS  AWORK4,20,MFHBLOCKEOF   [SIMILAR BIT FOR BLOCK PERIS.
2T*2                                           [HAS TO BE HANDLED SEPARATELY
2TSL                                           [OWING TO DIFFERENT POINTER  
2W#=                                           [CONVENTIONS.
2WRW          BITDEFS  AWORK4,19,MFHNOT1ST     [THIS IS NOT THE 1ST PERI.   
2X?G          BITDEFS  AWORK4,18,MFHDIROWN     [USER OWNS THE FILES IN  
2XR6                                           [THIS DIRECTORY  
2Y=Q          BITDEFS  AWORK4,17,MFHNONSER     [THIS IS A DA,DR, OR MT FILE 
2YQB          BITDEFS  AWORK4,16,MFHCHUCKOFF   [WE ARE THROWING THIS FILE   
2^=2                                           [OFFLINE (SET DURING MODE #33).  
2^PL          BITDEFS  AWORK4,15,MFHTRAPSALT   [WE ARE ALTERING THIS FILE'S 
329=                                           [TRAPS (SET DURING MODE #33).
32NW          BITDEFS  AWORK4,14,MFHTABSSET    [THE TAB SYSTEM HAS BEEN 
338G                                           [INITIALISED.
33N6    #   
347Q    #     AWORK4 IS INITIALISED BY ASSIGN. ALL SWITCHES ARE CLEAR ON
34MB ...#     ENTRY WITH THE POSSIBLE EXCEPTION OF MFHDIROWN AND MFHNONSER  
3572    #   
35LL    #     X7 IS ZEROISED BY THE INITIAL ANALYSIS CODE AND IS USED TO
366=    #     ACCUMULATE THE FINAL REPLY WORD.  
36KW    #   
375G    #     X6 IS THE USUAL SUBROUTINE LINK.  
37K6    #   
384Q    #     X1=FX1 AND X2=FX2. ANY CODE WHICH ALTERS THESE MUST ALTER THEM
38C7 ...#     BACK BEFORE PROCEEDING. IF THIS RULE IS NOT FOLLOWED THE  
38PJ ...#     FACT MUST BE DOCUMENTED IN THE COMMENTS.  
3942    #   
39HL    #  SUNDRY PRESET CONSTANTS:-
3=3=    #   
3=8D ...      SEGENTRY K98FHOBJ            [LABEL TO ALLOW MENDIG OF NEXT   
3=*L ...                                   [LOCATION BY RESTORE TIME MACRO. 
3=GW    VALIDMODDIR    #56200000           [AWORK1 TYPE MASK OF DEFINED 
3?2G                                       [DIRECTORY MODES.
3?G6    VALIDMOD       #77660160           [DITTO: NORMAL MODES 
3?^Q    MCHAPP         #20060100           [DITTO: ACCEPTABLE MODES WHEN
3#FB ...                                   [APPENDING.  
3#^2 ...MCHNSWRITE     #00040100           [DITTO: NONSERIAL FILE WRITING.  
3*DL    MCHREAD        #50220040           [DITTO : READ MODES  
3*Y=    #   
3BCW    #   
3BXG    #  A SUBROUTINE TO LOCK THE CONTROL AREA DOWN.  
3CC6    #  CALLED ON X6, LEAVES X3->APET
3CWQ    #   
3DBB    MCALOCK 
3DW2          LDX   3  APETADDR(2)  
3F*L          LOCKCA   3,ACAP(2)
3FT=          EXIT  6  0
3G#W    #   
3GSG    #   
3H#6    #  A SUBROUTINE TO CHECK FILE IS NOT POSITIONED AT BEGINNING OF FILE.   
3HRQ    #  IF IT IS WE JUMP INTO THE EXCEPTION CODE. CALLED ON X6. USES X3. 
3J?B    #   
3JR2    TESTBOF 
3K=L          TOPFCA2  3
3KQ=          LDX   0  FREADBLOCK(3)       [PICK UP READ BLOCK PTR  
3L9W          BNG   0  NILBOF              [-VE=> BEGINNING OF FILE 
3LPG          SBN   0  FBLKS               [IF IT POINTS TO 1ST BLOCK   
3M96          BNZ   0  NOTBOF              [THEN WORD PTR -VE=> BEG OF FILE 
3MNQ          LDX   0  FREADWORD(3) 
3N8B          BNG   0  NILBOF   
3NN2    NOTBOF  
3P7L          EXIT  6  0
3PM=    #   
3Q6W    #   
3QLG    # ********************************************************************* 
3R66    # ********************************************************************* 
3RKQ    #   
3S5B    #  MAIN PATH STARTS HERE
3SK2    #   
3T4L    # ********************************************************************* 
3TJ=    # ********************************************************************* 
3W3W    #   
3WHG    PERI
3X36          LDN   7  0                   [X7 IS BASIS FOR THE ASSEMBLED   
3XGQ                                       [REPLY WORD. INDIVIDUAL IMPLEMENTATIO
3Y2B                                       [SECTIONS WILL ADD ADDRESSES AND 
3YG2                                       [BITS INTO IT AS NECESSARY   
3Y^L    #   
3^F=    #  WE LOCK AND THEN COPY THE CONTROL AREA ACROSS TO THE AOLPT.  
3^YW    #   
42DG          CALL  6  MCALOCK             [LOCK CONTROL AREA   
42Y6                                       [LEAVING X3->APET
43CQ          LDN   6  4                   [LENGTH OF CA
43XB          LDX   4  ACAP(2)             [SOURCE OF MOVE  
44C2          LDN   5  ACA1(2)             [DESTINATION OF MOVE 
44WL          FOUTMOVE 3,4,5,6,HLOCK1,2    [MOVE
45B=    #   
45TW    #     **********
46*G    #   
46T6    #  IF ONCE WE ENCOUNTER EOF/FILEFULL ON A MULTIFILE NO FURTHER PERIS
47#Q    #  CAN BE ACCEPTED. WE MAKE THIS CHECK IMMEDIATELY, WHILE AWORK1 IS 
47SB    #  STILL SET UP TO INDICATE THE MODE WHICH CAUSED THE CONDITION.
48#2    #   
48RL          JBS      MEOF1,2,MFHEOFMULT   
49?=    #   
49QW    #     **********
4==G    #   
4=Q6    #  THE MODE MUST BE RECOGNISABLE AND MUST BE ACCEPTABLE WITH THIS   
4?9Q    #  TYPE OF FILE. WE CHECK THIS AND SET UP AWORK1 IN THE PROCESS.
4?PB    #  IF THE MODE IS A DIRECTORY MODE WE SET AWORK1 AS FOR THE CORRSP  
4#92    #  RECORD MODE AND SET THE DIRMODE SWITCH.  
4#NL    #   
4*8=          LDX   4  ACA1(2)  
4*MW          ANDN  4  #7777               [X4=MODE 
4B7G          SBN   4  #30  
4BM6          BNG   4  NDIRMOD             [J IF NOT DIRECTORY MODE 
4C6Q
4CLB          SBN   4  #10                 [CHECK A VALID DIRECTORY MODE
4D62          BPZ   4  NMODNR                   [J IF OUT OF RANGE  
4DKL          ADN   4  #10  
4F5=          TOPFCB2  3
4FJW          JBC      NILLTYPE,3,BFDIR    [UNACCEPTABLE IF FILE NOT A DIR  
4G4G          BS       2,MFHDIRMOD         [SET DIRECTORY MODE SWITCH   
4GJ6          LDX   5  VALIDMODDIR(1)       [PICK UP MASK OF RECOG DIR MODES
4H3Q          BRN      YDIRMOD  
4HHB
4J32    NDIRMOD 
4JGL          BC       2,MFHDIRMOD         [CLEAR DIRECTORY MODE SWITCH 
4K2=          ADN   4  #30  
4KFW          LDX   5  VALIDMOD(1)         [MASK OF RECOG MODES 
4K^G
4LF6    YDIRMOD 
4LYQ          LDCT  0  #400 
4MDB          SMO      4
4MY2          SRL   0  0                   [AWORK1 SET UP   
4NCL          STO   0  AWORK1(2)
4NX=          ANDX  5  0                   [CHECK MODE RECOGNISED   
4PBW          BZE   5  NMODNR              [J IF NOT
4PWG          JBS      NOTFBD,2,MFHDIRMOD  [NEXT CHECK NOT NEEDED IF DIRMOD 
4QB6          ANDX  5  AWORK3(2)           [CHECK MODE NOT FORBIDDEN WITH FILE  
4QTQ          BNZ   5  NILLTYPE            [J IF FORBIDDEN  
4R*B    NOTFBD  
4RT2    #   
4S#L    #     **********
4SS=    #   
4T?W    #  WE ALSO HAVE TO CHECK WHETHER THE MODE IS CONSISTENT WITH THE WAY
4TRG    #  THE FILE IS OPEN. WHILE WE CHECK THIS WE ALSO CHECK THAT THE 
4W?6    #  CURRENT PERI COUNT (UPDATED BY EXEC) HASNT EXCEEDED THE LIMIT
4WQQ    #  QUALIFIER IN THE WRITE CASE. 
4X=B    #   
4XQ2          WHICHMOP NOTOL1              [CHECK INVALID IF ONLINED FILEHANDLER
4Y9L          BRN      YESOL1   
4YP=    NOTOL1  
4^8W          TOPFCA2  3                   [X3->FCA 
4^NG ...      JMBS     MCHREM,3,BAMREAD,BAMREADR[J IF READ MODES ONLY   
5286          LDX   0  ACOUNT(2)           [CURRENT PERI COUNT  
52MQ          BXGE  0  ALIMEY(2),NILLIMIT  [J IF OUTPUT LIMIT EXCEEDED  
537B          JBS      YESOL1,3,BAMGEN     [J IF GEN MODE (NO FURTHER CHECKS)   
53C8 ...      JBS      MCHNONSERWR,2,MFHNONSER [J IF WRITING TO NONSER FILE 
53M2          LDX   0  MCHAPP(1)           [MASK OF MODES ALLOWED IN APPEND CASE
546L          BRN      YRESTRICTS   
549Q ...MCHNONSERWR 
54#W ...      LDX   0  MCHNSWRITE(1)       [MASK OF MODES ALLOWED WHEN  
54D2 ...                                   [OVERWRITING NONSERIAL FILES.
54H6 ...      BRN      YRESTRICTS   
54L=    MCHREM  
555W          LDX   0  MCHREAD(1)          [MASK OF MODES ALLOWED FOR READ CASE 
55KG    YRESTRICTS  
5656          ANDX  0  AWORK1(2)
56JQ          BZE   0  NILLAC              [J IF NOT AN ACCEPTED MODE   
574B    YESOL1  
57J2    #   
583L    #     **********
58H=    #   
592W    #  WE NOW CHECK AND LOCK THE DATA BUFFER (EXCEPT FOR MODES 5,6,7,#37
59GG    #  WHICH DO NOT TRANSFER DATA)  
5=26    #   
5=FQ          LDCT  0  #016                [BITS 5,6 AND 7  
5=^B          ANDX  0  AWORK1(2)
5?F2          BNZ   0  NODATAAREA          [J IF NON DATA MODE  
5?YL          LDX   3  APETADDR(2)         [X3->APET
5#D=          LDX   5  ACA4(2)             [BUFFER ADDR WITHIN PROGRAM  
5#XW          ANDX  5  BITS22LS            [AT MOST WE WANT ONLY LS 22 BITS 
5*CG          PMODES   0,3                 [  (X0=PROGRAM MODES)
5*X6          ANDN  0  #10                 [
5BBQ          BNZ   0  P22AM               [  (J IF 22AM PROG)  
5BWB          ANDX  5  BSP16               [AND ONLY LS 15 IF 15AM PROGRAM. 
5CB2    P22AM   
5CTL          STO   5  AWORK2(2)           [KEEP BUFFER ADDRESS 
5D*=          CHECKB   5,ACA3(2),RESVIOL,3,W,NODATAAREA,HLOCK2,,PERI
5DSW                                       [SEE PRM 6.CHECKB FOR EXPLANATION
5F#G                                       [DATA AREA IS NOW CHECKED AND LOCKED 
5FS6    NODATAAREA  
5G?Q    #   
5GRB    #     **********
5H?2    #   
5HQL    #  WE NOW CARRY OUT SOME FILE POSITIONING CHECKS FOR THE RECORD AND 
5J==    #  DIRECTORY MODES. THE BLOCK MODE CHECKS ARE INCOMPATIBLE AND ARE  
5JPW    #  THEREFORE HANDLED IN FHOBJBL (THIS ARISES FROM A DIFFERENT F'BLOCK   
5K9G    #  CONVENTION WITH READB AND WRITEB).   
5KP6    #  FOR MODES 3,5,#33 AND #37 WE CHECK THAT WE ARE NOT AT BEGINNING OF   
5L8Q    #  FILE. (THE BOF CHECK FOR MODE #7 IS SAVED UNTIL WE IMPLEMENT IT  
5LNB    #  AS THE DIRECTION OF SKIP IS AS YET UNKNOWN. THE SAME APPLIES TO MODE 
5M82    #  SINCE THE RECORD TO BE INSERTED MAY BE A KEYED RECORD OF AN INDEXED  
5MML    #  FILE IN WHICH CASE WE WILL POSITION THE FILE FOR INDEXING FIRST.)
5N7=
5NLW    #   
5P6G          WHICHMOP MBOFCHECK           [THIS AND FOLLOWING SECTION NOT  
5PL6          BRN      NOTEOF              [APPLICABLE TO OL *FH
5Q5Q    MBOFCHECK   
5QKB          LDCT  0  #052                [MODES 3,#33,5,7,AND #37 
5R52          ANDX  0  AWORK1(2)
5RJL          BZE   0  NOTATBOF            [J IF NOT ONE OF THOSE MODES 
5S4=          LDCT  4  #050                [IF ITS MODE 7 OR #37 WE HAVE TO 
5SHW          ANDX  0  4                   [ENSURE WE ONLY MAKE THE CHECK FOR   
5T3G          BNZ   0  NOTM737             [MODE #37
5TH6          JBC      NOTATBOF,2,MFHDIRMOD 
5W2Q    NOTM737 
5WGB          CALL  6  TESTBOF             [ENSURE NOT BEGINNING OF FILE
5X22    NOTATBOF
5XFL    #   
5X^=    #     **********
5YDW    #   
5YYG    #  MORE CHECKS ARE NECESSARY ON REC AND DIR MODES ILLEGAL AFTER END 
5^D6    #  OF FILE AND ALSO ON MODES 4 AND 7 WHICH MAY NEED SPECIAL ACTION  
5^XQ    #  IF WE WERE PREVIOUSLY AT EOF BUT ARE NO LONGER.  
62CB    #  FIRST WE CHECK WHETHER THE LAST PERI TO USE THE READ POINTERS LEFT   
62X2    #  THEM SET HAVING JUST READ EOF (THE SWITCH MFHRECEOF WILL BE SET  
63BL    #  IF THIS IS SO). IF IT DIDNT THE PERI PROCEEDS. OTHERWISE WE CHECK
63W=    #  TO SEE WHETHER THE END OF FILE CONDITION STILL HOLDS. IF MORE DATA   
64*W    #  HAS NOT BEEN ADDED WE EITHER PROCEED (MODES 4 AND 7) OR ILLEGAL. 
64TG    #  IF MORE DATA HAS BEEN ADDED WE DO A BACKSPACE TO RESET THE POINTERS  
65*6    #  TO HAVING JUST READ THE RECORD LAST READ AND LOOP BACK TO THE START  
65SQ    #  OF THE PREVIOUS SECTION TO ENSURE THAT WE ARE NOT NOW ILLEGALLY AT   
66#B    #  BEGINNING OF FILE
66S2    #   
67?L          LDCT  0  #172                [MODES 2,3,4,5,7 
67R=          ANDX  0  AWORK1(2)           [TEST IF ONE OF THESE
68=W          BZE   0  NOTEOF              [J IF NOT   NO CHECK NEEDED  
68QG          JBC      NOTEOF,2,MFHRECEOF  [J IF READ PTRS NOT LEFT AFTER EOF   
69=6          STEPAGAIN                    [CHECK IF THEY STILL ARE 
69PQ          BZE   3  STILLEOF            [J IF SO 
6=9B          BC       2,MFHRECEOF         [OTHERWISE CLEAR EOF SWITCH  
6=P2          BACKSPACE                    [RESET READ POINTERS.
6?8L                                       [OTHERWISE PERI WOULD BE OBEYED  
6?N=                                       [AS IF WE HAD JUST READ 1ST NEW  
6#7W                                       [RECORD  
6#MG          BRN      MBOFCHECK           [REPEAT BOF CHECK IF NEC 
6*76    STILLEOF
6*LQ          LDCT  0  #22                 [OK IF MODE 4 OR 7 OTHERWISE 
6B6B          ANDX  0  AWORK1(2)           [POTENTIALLY ILLEGAL 
6BL2          BZE   0  NILEOF   
6C5L    NOTEOF  
6CK=    #   
6D4W    #     **********
6DJG    #   
6F46    #  NOW WE ENTER THE INDIVIDUAL MODE IMPLEMENTATION SECTIONS 
6FHQ    #   
6G3B          JBC      NOTDIR2,2,MFHDIRMOD [FURTHER CHECKS AND IMPLEMENTATION   
6GH2          ACROSS   FHOBJDIR,1          [IN FHOBJDIR FOR DIRECTORY MODES 
6H2L    NOTDIR2 
6HG=          LDN   4  #7777
6H^W          ANDX  4  ACA1(2)             [EXTRACT MODE
6JFG          ADX   4  1                   [SWITCH TO INDIVIDUAL CODE   
6J^6          EXIT  4  1+0? 
6KDQ          BRN      MODE0
6KYB          BRN      MODE1
6LD2          BRN      MODE2
6LXL          BRN      MODE3
6MC=          BRN      MODE4
6MWW          BRN      MODE5
6NBG          BRN      MODE6
6NW6          BRN      MODE7
6P*Q          BRN      NMODNR   
6PTB          BRN      MODE11   
6Q*2          BRN      MODE12   
6QSL          BRN      NMODNR   
6R#=          BRN      NMODNR   
6RRW          BRN      NMODNR   
6S?G          BRN      NMODNR   
6SR6          BRN      NMODNR   
6T=Q          BRN      NMODNR   
6TQB          BRN      MODE21   
6W=2          BRN      MODE22   
6WPL          BRN      MODE23   
6X9=    #   
6XNW    #   
6Y8G    #  *********************************************************************
6YN6    #   
6^7Q    #  THIS SECTION LOOKS AFTER THE MODES 0 ,2 ,#12. THEY SHARE THE CODE
6^MB    #  WHICH CHECKS THE COUNT AND WHICH MOVES THE DATA INTO THE PROGRAM.
7272    #   
72LL    #  SUBROUTINE TO CHECK THE COUNT. CALLED ON X6  
736=    #   
73KW    READCOUNT   
745G          NGX   0  ACA3(2)             [NEGATE COUNT FIELD  
74K6          BPZ   0  NILCOUNT            [J IF COUNT ZERO OR NEG  
754Q          ADN   0  512  
75JB          BNG   0  NILCOUNT            [J IF COUNT > 511
7642          EXIT  6  0
76HL    #   
773=    #  MODE 0 CALLS FHOBJIND TO PERFORM THE COMPLEX AND BULKY INDEXING  
77GW    #  ROUTINES. IT THEN MERGES WITH MODE 2. IF THE RECORD IS NOT FOUND 
782G    #  THEN A NULL RECORD IS TRANSFERRED TO THE PROGRAM. IF THE FILE IS 
78G6    #  NOW POSITIONED AFTER EOF WE JUMP TO THE APPROPRIATE EXCEPTION CODE   
78^Q    #   
79FB    MODE0   
79^2          CALL  6  READCOUNT           [PERFORM COUNT CHECK 
7=DL          ACROSS    FHOBJIND,1          [DO INDEXED SEARCH IGNORING SUBKEYS 
7=Y=
7?CW    M0FOUND                              [RETURNS HERE IF FOUND 
7?XG          STEPAGAIN                    [X3->RECORD  
7#C6          BRN      READMOVE 
7#WQ    NOTFOUND
7*BB          JBS      READEOF,2,MFHRECEOF [J IF INDEXING ROUTINES LEFT US  
7*W2                                       [POSITIONED AFTER EOF.   
7B*L          BRN      NULLREC             [OTHERWISE JUST GIVE PROGRAM NULL
7BT=                                       [RECORD  
7C#W    #   
7CSG    #     **********
7D#6    #   
7DRQ    #  MODE2 IS QUITE COMPLICATED. FIRST WE CHECK FOR AN ONLINED *FH.   
7F?B    #  IF THIS IS THE CASE THE MOP ROUTINES ARE INVOKED TO READ THE DATA
7FR2    #  INTO A FILE FRB AND WE JUMP AHEAD TO DEAL WITH IT.   
7G=L    #   
7GQ=    MODE2   
7H9W          CALL  6  READCOUNT          [PERFORM COUNT CHECK  
7HPG          INMOP    PERI,YESOL3         [IF OL BRN TO YESOL3 WITH FRB.   
7J96    #   
7JNQ    #     **********
7K8B    #   
7KN2    #  HAVING ESTABLISHED THAT ITS A NORMAL ASSIGNED FILEHANDLER WE READ
7L7L    #  THE DATA FROM THE FILE   
7LM=    #   
7M6W          STEP  
7MLG          TESTREP2 STEPWAIT,STEPWAIT   [REPLY GIVEN IN COMMUNE MODE WHEN
7N66                                       [AT EOF WITH APPENDERS   
7NKQ          BZE   3  READEOF             [J IF READ OFF END OF FILE   
7P5B    #   
7PK2    #     **********
7Q4L    #   
7QJ=    #  NEXT WE CARRY OUT THE COMMON 'MOVE IN DATA' PATH OF MODES 0,2,#12
7R3W    #  X3->DATA 
7RHG    #   
7S36    READMOVE
7SGQ          LDEX  6  FRH(3)              [RECORD LENGTH   
7T2B          SBN   6  1                   [LESS 1 FOR RECHEAD WE DONT TRANSFER 
7TG2                                       [=AMOUNT OF DATA TO MOVE.
7T^L          LDX   0  ACA3(2)             [SIZE OF BUFFER  
7WF=          BXGE  0  6,READNOUGH         [J IF BUFFER BIG ENOUGH  
7WYW          LDX   6  0                   [OTHERWISE SET X6=BUFFER SIZE
7XDG          LDCT  7  #200                [AND SET LONG BLOCK MARKER IN REPLY  
7XY6    READNOUGH   
7YCQ          ADN   3  1                   [X3->FIRST WORD TO BE MOVED  
7YXB          LDX   4  AWORK2(2)           [X4=ADDR OF BUFFER IN PROGRAM
7^C2          FINMOVE  APETADDR(2),4,3,6,HLOCK2,2[MOVE DATA INTO PROGRAM
7^WL    #   
82B=    #     **********
82TW    #   
83*G    #  THIS SUBSECTION SETS UP THE REPLY WORD AND JUMPS TO THE WINDING  
83T6    #  UP ROUTINE. IT EXPECTS X6=AMOUNT OF DATA TRANSFERRED 
84#Q    #   
84SB    READREP 
85#2          ADX   6  AWORK2(2)           [WORD IN PROGRAM AFTER LAST WORD 
85RL                                       [TRANSFERRED 
86?=          ANDX  6  MASKREPADDR(1)      [MASK OUT ALL BUT LS 18 BITS 
86QW          ORX   7  6                   ['OR' ADDRESS INTO REPLY 
87=G          VFREE    FILE,FRB            [SOME OF THE READ MODES LEAVE A FRB  
87Q6          BRN      SETREP              [SET REPLY AND WIND UP   
889Q    MASKREPADDR    #777777             [MASK OF LS 18 BITS  
88PB    #   
8992    #     **********
89NL    #   
8=8=    #  A LOOSE END FROM IMPLEMENTATION OF MODE 0 - WE MUST TRANSFER A   
8=MW    #  NULL RECORD IF WE COULDNT FIND THE RECORD REQUIRED. THIS IS ALSO 
8?7G    #  USED BY ANY ROUTINE WHICH HITS END OF FILE WHILE READING.
8?M6    #   
8#6Q    NULLREC 
8#LB          LDN   6  0                   [ZERO LENGTH TRANSFER
8*62          BRN      READREP             [GO TO SET UP REPLY  
8*KL    #   
8B5=    #     **********
8BJW    #   
8C4G    #  MODE #12 IS ONLY PERMITTED AS THE FIRST PERI ON A CHANNEL. AFTER 
8CJ6    #  THAT WE DO NOT RECOGNISE IT. IT IS SUBJECT TO THE SAME COUNT 
8D3Q    #  CHECK AS MODES 0 AND 2. IT IS ACTUALLY IMPLEMENTED IN FHOBJIND AS
8DHB    #  IT IS NOT STRAIGHTFORWARD AND IS RELATIVELY RARE. FHOBJIND RETURNS   
8F32    #  WITH THE DATA IN A FRB.  
8FGL    #   
8G2=    MODE12  
8GFW          JBS      NMODNR,2,MFHNOT1ST  [ILLEGAL IF NOT 1ST PERI 
8G^G          CALL  6  READCOUNT           [PERFORM COUNT CHECK 
8HF6          ACROSS    FHOBJIND,12         [SETS UP A FRB CONTAINING THE DATA  
8HYQ                                       [AND RETURNS TO YESOL3   
8JDB    #   
8JY2    #     **********
8KCL    #   
8KX=    #  MODE 2 ONLINE CASE SETS UP A FRB AND JUMPS HERE  
8LBW    #   
8LWG    YESOL3  
8MB6          MHUNTW   3,FILE,FRB   
8MH# ...      LDX   0  A1(3)
8MNG ...      BZE   0  READEOF  
8MTQ          ADN   3  A1                  [X3->DATA
8N*B          BRN      READMOVE            [HAVING GOT A PTR TO THE DATA
8NT2                                       [REJOIN MAIN PATH
8P#L    #   
8PS=    #  ******************************************************************** 
8Q?W    #   
8QRG    #  THE FOLLOWING SECTION DEALS WITH MODES 1,3,AND 4.
8R?6    #   
8RQQ    #  SUBROUTINE TO PERFORM COUNT CHECKS. CALLED ON X6.
8S=B    #   
8SQ2    WRITECOUNT  
8T9L          NGX   0  ACA3(2)             [NEGATE COUNT
8TP=          BPZ   0  NILCOUNT            [ILLEGAL IF COUNT NEG OR ZERO
8W8W          ADN   0  501                 [AND ALSO IF COUNT>501   
8WNG          BNG   0  NILCOUNT 
8X86          EXIT  6  0                   [OTHERWISE EXIT  
8XMQ    #   
8Y7B    #  SUBROUTINE TO MOVE DATA OUT OF PROGRAM TO AREA POINTED AT BY X4. 
8YM2    #  CALLED ON X6,DESTROYS X3 AND X4. 
8^6L    #   
8^L=    WRITEMOVE   
925W          LDX   3  AWORK2(2)           [X3->DATA IN PROG
92KG          FOUTMOVE APETADDR(2),3,4,ACA3(2),HLOCK2,2 
9356          EXIT  6  0
93JQ    #   
944B    #  SUBROUTINE TO SET UP A FWB AND MOVE BUFFER INTO IT ADDING RECORD 
94J2    #  HEADER. CALLED ON X6,USES X3,4. COORDINATES. 
953L    #   
95H=    WRITEFWB
962W          SBX   6  FX1  
96GG          LDX   4  ACA3(2)             [COUNT   
9726          ADN   4  1                   [PLUS 1 ROR RECORD HEADER.   
97FQ          SETUPCORE 4,3,FILE,FWB       [SET UP BLOCK
97^B          STO   4  A1(3)               [STORE RECORD HEADER 
98F2          STO   6  ACOMMUNE1(2)        [SAVE LINK   
98YL          LDN   4  A1+1(3)             [ADDR TO WHICH TO MOVE DATA  
99D=          CALL  6  WRITEMOVE           [MOVE DATA INTO BLOCK
99XW          LDX   6  ACOMMUNE1(2)        [RESTORE LINK AND EXIT   
9=CG          ADX   6  FX1  
9=X6          EXIT  6  0
9?BQ    #   
9?WB    #     **********
9#B2    #   
9#TL    #  MODE 1 IS IMPLEMENTED DIFFERENTLY FOR THE ONLINE AND NORMAL CASES.   
9**=    #  WE TAKE THE ONLINE CASE FIRST. THE DATA IS MOVED INTO A FWB. IT  
9*SW    #  IS THEN SUBJECTED TO AN INTEGRITY CHECK FORCED BY THE MOP ROUTINES   
9B#G    #  AND NAMED AN FRB. THE MOP ROUTINES ARE THEN CALLED TO DEAL WITH IT.  
9BS6    #   
9C?Q    MODE1   
9CRB          CALL  6  WRITECOUNT          [CHECK COUNT 
9D?2          WHICHMOP NOTOLMODE1          [J IF NORMAL CASE
9DQL          CALL  6  WRITEFWB            [SET UP FWB WITH DATA
9F==          MHUNTW   3,FILE,FWB   
9FPW          NAME     3,FILE,FRB          [MOP ROUTINES WANT A FRB.
9G9G          LDX   0  A1(3)               [THEY ALSO CANNOT COPE IF B0 AND 1   
9GP6          SBN   0  2                   [OF THE PFCC WORD ARE SET FOR A  
9H8Q          BNZ   0  NOTNULLREC          [BLANK LINE. 
9HNB          LDX   0  A1+1(3)  
9J82          SLL   0  2
9JML          SRL   0  2
9K7=          STO   0  A1+1(3)  
9KLW    NOTNULLREC  
9L6G          OUTMOP   SETREP,PERI         [OUTPUT LINE 
9LL6          BRN      SETREP              [J TO WIND UP CODE   
9M5Q    #   
9MKB    #     **********
9N52    #   
9NJL    #  IN THE NORMAL CASE WE MOVE THE DATA DIRECT FROM PROGRAM TO FILE  
9P4=    #  AND EXIT TO WIND UP CODE 
9PHW    #   
9Q3G    NOTOLMODE1  
9QH6          LDX   2  ACA3(2)             [COUNT   
9R2Q          STEP     ,1(2),ANSWER        [SET UP [2]+1 WORD RECORD
9RGB          TESTREP2 APPWAIT,XAPPWAIT,FILEFULL,XFILEFULL,GLUTTON,TOOMUCH  
9S22          LDX   0  ACA3(2)             [SET UP RECORD HEADER
9SFL          ADN   0  1
9S^=          STO   0  FRH(3)   
9TDW          LDN   4  FRH+1(3)            [X4->DESTINATION OF DATA 
9TYG          CALL  6  WRITEMOVE           [MOVE DATA   
9WD6          BRN      SETREP              [J TO WINDUP CODE
9WXQ    #   
9XCB    #     **********
9XX2    #   
9YBL    #  MODE3 IS SIMPLE IF THE FILE IS NOT INDEXED. WE SIMPLY MOVE THE   
9YW=    #  DATA OUT TO A FWB AND DO A REPLACE. THE CHECKS FOR AN INDEXED FILE   
9^*W    #  ARE IMPLEMENTED ELSEWHERE.   
9^TG    #   
=2*6    MODE3   
=2SQ          CALL  6  WRITECOUNT          [CARRY OUT COUNT CHECK   
=3#B          CALL  6  WRITEFWB            [SET UP THE FWB  
=3S2          TOPFCB2  3
=4?L          LDN   6  #77  
=4R=          ANDX  6  FINFC(3) 
=5=W          BZE   6  NOTINDMODE3         [J IF NOT AN INDEXED FILE
=5QG          ACROSS    FHOBJIND,3          [PERFORM CHECKS 
=6=6    NOTINDMODE3                        [RETURNS HERE IF OK  
=6PQ          REPLACE                      [REWRITE THE RECORD  
=79B    #   
=7P2    #     **********
=88L    #   
=8N=    #  AFTER A MODE 3 OR 4 WE JUST CHECK THAT FILEFULL HASNT OCCURRED   
=97W    #  FREE THE FWB AND JUMP TO THE WINDUP CODE 
=9MG    #   
==76    MODE34END   
==LQ          MFREEW   FILE,FWB 
=?6B          TESTREP2 FILEFULL,XFILEFULL,GLUTTON,TOOMUCH   
=?L2          BRN      SETREP              [JUMP TO WINDUP CODE 
=#5L    #   
=#K=    #     **********
=*4W    #   
=*JG    #  MODE 4 IS LIKE MODE 3 EXCEPT THAT WE DO AN INSERT INSTEAD OF A   
=B46    #  REPLACE AND A DIFFERENT PIECE OF INDEXED FILE CODE IS OBEYED.
=BHQ    #   
=C3B    MODE4   
=CH2          CALL  6  WRITECOUNT          [CARRY OUT COUNT CHECK   
=D2L          CALL  6  WRITEFWB            [SET UP BUFFER   
=DG=          TOPFCB2  3
=D^W          LDN   6  #77  
=FFG          ANDX  6  FINFC(3)            [NON ZERO IF INDEXED 
=F^6          BZE   6  NOTINDMODE4  
=GDQ          ACROSS    FHOBJIND,4          [PERFORM SPECIAL INDEXED ACTION 
=GYB    NOTINDMODE4                        [RETURNS HERE IF UNKEYED RECORD  
=HD2          CALL  6  TESTBOF             [ENSURE NOT BEGINNING OF FILE
=HXL    OKINDMODE4                         [RETURNS HERE IF OK AND KEYED RECORD 
=JC=          INSERT
=JWW          BRN      MODE34END
=KBG    #   
=KW6    #  ******************************************************************** 
=L*Q    #   
=LTB    #  THIS SECTION DEALS WITH THE OTHER MODES, MOST OF WHICH ARE   
=M*2    #  IMPLEMENTED ELSEWHERE.   
=MSL    #   
=N#=    #  MODE 5 IS THE SIMPLEST OF THE LOT AND NEEDS NO EXPLANATION.  
=NRW    #   
=P?G    MODE5   
=PR6          DELETE
=Q=Q          BRN      SETREP              [J TO WIND UP CODE   
=QQB    #   
=R=2    #     **********
=RPL    #   
=S9=    #  MODE 6 INVOKES THE HUGE 'CURTAIL' MACRO, AND IS THE RAREST OF THE
=SNW    #  LOT SO WE IMPLEMENT IT IN FHOBJIND.  
=T8G    #   
=TN6    MODE6   
=W7Q          ACROSS   FHOBJIND,56  
=WMB    #   
=X72    #     **********
=XLL    #   
=Y6=    #  MODE 7 IS RELATIVELY RARE AND ISN'T THAT SIMPLE SO IT TOO IS 
=YKW    #  BANISHED.
=^5G    #   
=^K6    MODE7   
?24Q          ACROSS   FHOBJIND,7   
?2JB    #     **********
?342    #   
?3HL    #  MODE #11 IS PROBABLY AS RARE AS CURTAIL - IT IS ALLOWED AS THE FIRST 
?43=    #  PERI ON DA,DR AND MT FILES ONLY, SO IT ALSO GOES TO FHOBJIND.
?4GW    #   
?52G    MODE11  
?5G6          JBS      NMODNR,2,MFHNOT1ST  [ILLEGAL IF NOT 1ST PERI 
?5^Q          ACROSS   FHOBJIND,11  
?6FB    #   
?6^2    #     **********
?7DL    #   
?7Y=    #  THE REMAINING BLOCK MODES ARE NATURALLY IMPLEMENTED IN FHOBJBL.  
?8CW    #   
?8XG    MODE21  
?9C6          ACROSS   FHOBJBL,21   
?9WQ    MODE22  
?=BB          ACROSS   FHOBJBL,22   
?=W2    MODE23  
??*L          ACROSS   FHOBJBL,23   
??T=    #   
?##W    #  ******************************************************************** 
?#SG    #   
?*#6    #  THIS SECTION, THE WIND UP CODE, IS USED BY ALL PERIS EXCEPT FOR MODE 
?*RQ    #  #22 WHICH GOES AUTONOMOUS AND PERIS WHICH GO ILLEGAL. WE PUT THE REPL
?B?B    #  FROM X7 INTO THE PROGRAM AND DO AN OLPEND WHICH SENDS US WAITING 
?BR2    #  FOR THE NEXT PERI.   
?BY8 ...#  SOME PATHS TRANSFER HERE WITH X1 NOT FX1. CURRENTLY SETREP   
?C5B ...#  DOES NOT NEED X1=FX1 SO WE TAKE NO STEPS TO CORRECT IT.  
?C=L    #   
?CQ=    SETREP  
?D9W          BS       2,MFHNOT1ST         [SHOW A PERI HAS BEEN DONE   
?DPG          LDX   3  ACAP(2)             [X3->CONTROL AREA IN PROGRAM 
?F96          ADN   3  1                   [X3->REPLY WORD IN PROGRAM   
?FNQ          FADDRESS APETADDR(2),3,HLOCK1,2 [X3->REPLY IN GEORGE CORE 
?G8B          STO   7  0(3)                [STORE REPLY 
?GN2          OLPEND                       [KICK PROG AND WAIT FOR NEXT PERI.   
?H7L          BRN      PERI                [LOOP BACK TO START OF SEGMENT   
?HM=    #   
?J6W    #  ******************************************************************** 
?JLG    #   
?K66    #  THIS IS THE EXCEPTION PART OF THE SEGMENT, WHICH CONTAINS ALL
?KKQ    #  ILLEGAL, EOF ,LIMIT ETC CODE.
?L5B    #   
?LK2    #  SUBROUTINE TO SET BITS 3+5 OF X7 IF PROGRAM IS USING OWN MONITORING  
?M4L    #  CALLED ON X6 
?MJ=    #   
?N3W    MCHOWN  
?NHG          LDX   0  ACA1(2)             [MODE WORD   
?P36          SRL   0  6
?PGQ          ANDN  0  #777                [EXTRACT ADDITIVE MODE   
?Q2B          SBN   0  #300 
?QG2          BNZ   0  (6)                 [EXIT IF NOT OWN MON 
?Q^L          LDCT  7  #050                [ELSE SET OWN MON BITS IN REPLY  
?RF=          EXIT  6  0
?RYW    #   
?SDG    #  SUBROUTINE TO CHECK FOR AND IF NECESSARY IMPLEMENT A SWITCH OF   
?SY6    #  MULTIFILE ELEMENTS. IF THIS CAN BE DONE WE DO IT AND JUMP TO 
?TCQ    #  THE BEGINNING OF THE SEG TO REPEAT THE PERI WITH THE NEW ELEMENT.
?TXB    #  OTHERWISE WE EXIT. IF NECESSARY THE 'END OF MULTIFILE' BIT WILL  
?WC2    #  HAVE BEEN SET.   
?WWL    #   
?XB=    MULTSWITCH  
?XTW          SBX   6  FX1                 [RELATIVISE LINK 
?Y*G          LDX   5  6                   [AND SAVE IT IN X5   
?YT6          COMPQU   NOTAMULT            [EXIT IF NOT A MULTIFILE 
?^#Q          BRN      PERI                [REPEAT PERI IF SWITCH SUCCESSFUL
?^SB          BS       2,MFHEOFMULT        [OTHERWISE SET 'EOF MULT ' BIT   
#2#2          CALL  6  MCALOCK             [RELOCK CONTROL AREA (COMPQU 
#2RL                                       [CLEARS ALL LOCKS)   
#3?=    NOTAMULT
#3QW          ADX   5  FX1                 [RESTORE LINK
#4=G          EXIT  5  0
#4Q6    #   
#59Q    #  SUBROUTINE TO RESET OLPA LINK TO START OF SEGMENT AND TRANSFER TO
#5PB    #  THE PCA. THIS IS ALWAYS DONE BEFORE GOING ACROSS TO OLPODD FOR   
#692    #  SOME REASON (E.G. TO ISSUE AN ILLEGAL).  
#6NL    #   
#78=    TOPCA   
#7MW          TOPCA1   RESETLINK(1) 
#87G          EXIT  6  0
#8M6    RESETLINK   
#96Q          PAIR     FHOBJ,1             [REENTRY POINT WHEN OLPA REACTIVATED 
#9LB    #   
#=62    #  SUBROUTINE TO CARRY OUT THE DRM CODE FOR READING COMMUNAL FILES. 
#=KL    #  IT EXITS 0 IF DRM NOT IN USE. OTHERWISE IT EXIT 1 WITH ALL DRM   
#?5=    #  UPDATING DONE.   
#?JW    #   
##4G    READDRM 
##J6          FDRMTEST STEPWAIT,RDNDRM     [CHECK IF DRM AND DO UPDATING IF SO  
#*3Q          ADN   6  1                   [FALLS THRU IF TWAS DRM  
#*HB    RDNDRM  
#B32          LDX   1  FX1  
#BGL          EXIT  6  0                   [EXIT +0 OR +1 AS REQUIRED   
#C2=    #   
#CFW    #  DITTO: FOR APPENDING TO A FILE.  
#C^G    #   
#DF6    WRITEDRM
#DYQ          FDRMTEST APPWAIT,WRNDRM      [AS BEFORE.  
#FDB          ADN   6  1
#FY2    WRNDRM  
#GCL          LDX   1  FX1  
#GX=          EXIT  6  0
#HBW    #   
#HWG    #     **********
#JB6    #   
#JTQ    #  END OF FILE WHILE READING A FILE. WE FIRST CARRY OUT THE DRM CHECK   
#K*B    #  AND UPDATING. IF THE CHECK PROVES POSITIVE WE BACKSPACE AND SET  
#KT2    #  A 'REJECTED, INOPERABLE' REPLY. ( THE CORRECT REPLY WHEN THERE ARE   
#L#L    #  NO APPENDERS. IF THERE HAD BEEN APPENDERS STEP WOULD HAVE SET THE
#LS=    #  STEPWAIT REPLY WHICH IS DEALT WITH BELOW.)   
#M?W    #   
#MRG    READEOF 
#N?6          CALL  6  READDRM             [DO DRM CHECKS   
#NQQ          BRN      READNODRM           [J IF NOT DRM
#P=B          BACKSPACE                    [RESET READ POINTERS 
#PQ2          LDCT  7  #410                [REJECTED INOPERABLE 
#Q9L          BRN      SETREP              [J TO WINDUP CODE
#QP=    #   
#R8W    #  IT'S NOT DRM. WE CHECK TO SEE IF THIS IS A MULTIFILE WITH FURTHER
#RNG    #  ELEMENTS, DOING A SWITCH AND BRANCHING BACK TO THE START IF IT IS.   
#S86    #  OTHERWISE WE SET THE END OF FILE MARKER AND JUMP BACK TO GIVE A NULL 
#SMQ    #  TRANSFER. IF OWN MONITORING IS BEING USED WE FIRST SET THE OWN MON   
#T7B    #  BITS IN THE REPLY.   
#TM2    #   
#W6L    READNODRM   
#W=H ...      WHICHMOP  READMULTQ          [JUMP IF NOT OL *FH  
#WBD ...      BRN      READJDFEND         [JDF CANNOT BE A MULTIFILE
#WG* ...READMULTQ   
#WL=          CALL  6  MULTSWITCH          [IS IT A MULTIFILE WITH MORE ELEMS   
#WW4 ...READJDFEND  
#X5W          CALL  6  MCHOWN              [NO. SET OWN MON BITS IF APPLICABLE. 
#XKG          BS       2,MFHRECEOF         [SET EOF MARKER. 
#Y56          BRN      NULLREC             [JUMP BACK INTO READ SECTION TO  
#YJQ                                       [SIMULATE A ZERO LENGTH RECORD   
#^4B    #   
#^J2    #     ********  
*23L    #   
*2H=    #  IF A STEPWAIT REPLY IS GIVEN WHILE READING END OF FILE HAS BEEN  
*32W    #  REACHED BUT THERE IS AN APPENDER. IF ITS DRM WE SET A 'REJECTED, 
*3GG    #  OPERABLE' REPLY. THERE IS NO NEED TO BACKSPACE SINCE STEP HASNT  
*426    #  ADVANCED THE READ POINTERS IN THIS CASE. 
*4FQ    #   
*4^B    STEPWAIT
*5F2          CALL  6  READDRM             [DO DRM CHECKS.  
*5YL          BRN      WAITCOMMUNE         [J IF NOT DRM
*6D=          LDCT  7  #420                [REJECTED OPERABLE   
*6XW          BRN      SETREP              [J TO WIND UP CODE   
*7CG    #   
*7X6    #  IF ITS NOT DRM WE GO ACROSS TO OLPODD TO WAIT FOR THE OTHERS TO DO   
*8BQ    #  SOMETHING. (THIS IS ALSO USED IN THE WRITE CASE) 
*8WB    #   
*9B2    WAITCOMMUNE 
*9TL          CALL  6  TOPCA               [TRANSFER TO THE PCA 
*=*=          ACROSS   OLPODD,1 
*=SW    #   
*?#G    #     **********
*?S6    #   
*#?Q    #  HERE WE DEAL WITH THE FILEFULL CONDITION ON WRITING.THIS IS SIMILAR  
*#RB    #  TO THE END OF FILE CONDITION WHILE READING. FIRST WE CHECK FOR DRM   
**?2    #  AND SET A 'REJECTED,INOPERABLE' REPLY IT IT IS.  
**QL    #   
*B==    XFILEFULL   
*BPW          CALL  6  WRITEDRM            [CARRY OUT DRM CHECKS.   
*C9G          BRN      WRITENOTDRM         [J IF NOT DRM
*CP6          LDCT  7  #410                [REJECTED INOPERABLE 
*D8Q ...      BRN      SETREP              [J TO WINDUP CODE
*DNB    #   
*F82    #  IF ITS NOT DRM WE MUST SWITCH M/F ELEMENTS , SET AN OWN-MON REPLY,   
*FML    #  OR ILLEGAL AS APPROPRIATE.   
*G7=    #   
*GLW    WRITENOTDRM 
*H6G          CALL  6  MULTSWITCH          [SWITCH M/F ELEM IF POSSIBLE 
*HL6    NILOUTFULL  
*J5Q          CALL  6  MCHOWN              [OTHERWISE SET OWNMON REPLY IF   
*JKB                                       [OWN MON. X7 WILL STILL BE ZERO IF   
*K52                                       [NOT.
*KJL          BNZ   7  SETREP              [J TO WINDUP IF TWAS OWNMON. 
*L4=          LDN   3  FYOUTFULL           [SET ILLEGAL AND JUMP TO THE CODE
*LHW          BRN      PARAMILL            [WHICH DEALS WITH ILLEGALS WITH A
*M3G                                       [A PERIPHERAL TYPE/NO PARAMETER  
*MH6                                       [(LIKE THIS ONE).
*N2Q    #   
*NGB    #     **********
*P22    #   
*PFL    #  IF WE GET AN APPWAIT REPLY FROM STEP(APPEND) WE HAVE FILLED A FILE   
*P^=    #  WITH GDR READERS. AS BEFORE WE DO A DRM CHECK, SETTING 'REJECTED,
*QDW    #  OPERABLE' IF IT IS DRM, JOINING THE READ CODE AS IT GOES TO OLPODD   
*QYG    #  IF IT ISN'T. 
*RD6    #   
*RXQ    XAPPWAIT
*SCB          CALL  6  WRITEDRM            [DO DRM CHECK
*SX2          BRN      WAITCOMMUNE         [J IF IT ISN'T   
*TBL          LDCT  7  #420                [REJECTED OPERABLE.  
*TW=          BRN      SETREP              [J TO WINDUP CODE
*W*W    #   
*WTG    #     **********
*X*6    #   
*XSQ    #  A FURTHER PERI HAS BEEN ISSUED FOR A MULTIFILE WHICH IS FULL OR  
*Y#B    #  EXHAUSTED. WE TREAT IT AS FILE FULL OR END OF FILE DEPENDING ON THE  
*YS2    #  SETTING OF AWORK1 WHICH HAS NOT BEEN DISTURBED SINCE THE CONDITION   
*^?L    #  ORIGINALLY AROSE.
*^R=    #   
B2=W    MEOF1   
B2QG          LDCT  0  #200                [MASK FOR WRITE PERI 
B3=6          ORN   0  #0100
B3PQ          ANDX  0  AWORK1(2)
B49B          BNZ   0  NILOUTFULL          [J IF FILE FULL  
B4P2    #   
B58L    #   
B5N=    #     **********
B67W    #   
B6MG    #  WE HAVE RECEIVED A FURTHER READ ON A FILE WHICH IS EXHAUSTED.
B776    #  WE EITHER ILLEGAL OR GIVE AN OWN MON REPLY AS APPROPRIATE.   
B7LQ    #   
B86B    NILEOF  
B8L2          CALL  6  MCHOWN              [SET REPLY IN X7 IF OWNMON   
B95L          BNZ   7  SETREP              [IF REPLY SET J TO WINDUP CODE   
B9K=    OUTILLEOF   
B=4W          LDN   3  FYENDFILE           [ILLEGAL 
B=JG    #   
B?46    #     **********
B?HQ    #   
B#3B    #  WE ARE ISSUING AN ILLEGAL WITH A PERIPHERAL TYPE/NUMBER PARAMETER.   
B#H2    #  BEFORE GOING TO OLPODD WE SET THIS PARAMETER IN X4   
B*2L    #   
B*G=    PARAMILL
B*^W          LDX   4  FTYPNO(2)
BBFG    #   
BB^6    #     **********
BCDQ    #   
BCYB    #  ILLEGALS ARE DONE BY OLPODD. 
BDD2    #   
BDXL    OUTILL  
BFC=          CALL  6  TOPCA               [CHANGE TO PCA   
BFWW          ACROSS   OLPODD,4 
BGBG    #   
BGW6    #     **********
BH*Q    #   
BHTB    #  WE HAVE TRIED A MODE WHICH IS ILLEGAL AT BEGINNING OF FILE.  
BJ*2    #  AS USUAL ILLEGAL OR GIVE OWN MONITORING REPLY
BJSL    #   
BK#=    NILBOF  
BKRW          VFREEW   FILE,FWB            [MAY BE A FWB IF MODE #4 
BL?G          LDX   1  FX1                 [CORRUPTED BY VFREE  
BLR6          CALL  6  MCHOWN              [IF OWNMON SET OWNMON REPLY  
BM=Q          BNZ   7  SETREP              [IF REPLY SET J TO WINDUP CODE   
BMQB    OUTILLBOF   
BN=2          LDN   3  FYBEGFILE
BNPL          BRN      OUTILL   
BP9=    #   
BPNW    #     **********
BQ8G    #   
BQN6    #  ILLEGAL MODE WITH GIVEN FILE TYPE.   
BR7Q    #   
BRMB    NILLTYPE
BS72          LDN   3  FYILLMOD 
BSLL          BRN      OUTILL   
BT6=    #   
BTKW    #     **********
BW5G    #   
BWK6    #  ILLEGAL MODE WITH GIVEN ACCESS MODE. 
BX4Q    #   
BXJB    NILLAC  
BY42          LDN   3  FYILLAC  
BYHL          BRN      OUTILL   
B^3=    #   
B^GW    #     **********
C22G    #   
C2G6    #  LIMIT EXCEEDED   
C2^Q    #   
C3FB    NILLIMIT
C3^2          LDN   3  FYOUTPUT 
C4DL          BRN      PARAMILL 
C4Y=    #   
C5CW    #     **********
C5XG    #   
C6C6    #  RESERVATION VIOLATION
C6WQ    #   
C7BB    RESVIOL 
C7W2          LDX   1  FX1  
C8*L          LDX   2  FX2                 [NOT RESET BY CHECKB ON RES VIOL.
C8T=          LDN   3  FYNOBUF  
C9#W          BRN      OUTILL   
C9SG    #   
C=#6    #     **********
C=RQ    #   
C??B    #  COUNT OUT OF RANGE.  
C?R2    #   
C#=L    NILCOUNT
C#Q=          LDN   3  FYCOUNT  
C*9W          BRN      OUTILL   
C*PG    #   
CB96    #     **********
CBNQ    #   
CC8B    #  MODE NOT RECOGNISED  
CCN2    #   
CD7L    NMODNR  
CDM=          LDN   3  FYMODE   
CF6W          BRN      OUTILL   
CFLG    #   
CG66    #     **********
CGKQ    #   
CH5B    #  DATA FORMAT ERROR
CHK2    #   
CJ4L    NILDATA 
CJJ=          LDN   3  FYDATAER 
CK3W          BRN      OUTILL   
CKHG    #   
CL36    #     **********
CLGQ    #   
CM2B    #   
CMG2    #  BACKING STORE LIMIT EXCEEDED. DEALT WITH BY OLPODD.  
CM^L    #   
CNF=    TOOMUCH 
CNYW          CALL  6  TOPCA                [CHANGE TO PCA  
CPDG          ACROSS   OLPODD,2 
CPY6    #   
CQCQ    #   
CQXB    #   
CRC2          MENDAREA 30,K99FHOBJ  
CRWL    #   
CSB=    #END
^^^^ ...621402200009