CAFSPERI867

(George Source)

Macros used: BXE, BXGE, BXL, BXU, CAPCA, CHAIN, CHECKB, CHECKEXT, CHEKPRIV, CLOSETOP, COOR3, DCA, ENRING, FADDRESS, FINDACTX, FINMOVE, FOUTMOVE, FPCACA, GETWORD, GPERI, HUNT2J, HUNTW, ILLEGALX, JNCAFSDV, JNCFENBU, LADDP, LGEOG, LINK, MFREE, MHUNTW, MONOUT, OLPFIN1, OPENDIR, OUTPACK, READ, RUNPROG, SEG, SEGENTRY, SETNCORE, SETREP, TESTREP2, TESTRPN2, TESTTRAP, TOPCA, TOPCA1, UNPLUG, VFREE, WORDFIN

CAFSPERI867.txt
22FL          SEG      CAFSPERI,865,D. A. BELL  
22KH ...#   
22PD ...#     COPYRIGHT INTERNATIONAL COMPUTERS LTD   1982  
22T* ...#   
22^=    #   
23DW    #   
23YG    #     THIS SEGMENT DEALS WITH THE UDAS MODES #12 AND #13 THAT ARE   
24D6    #     USED TO ISSUE TASKS TO A CAFS SUBSYSTEM.   THEY ARE ONLY  
24XQ    #     PERMITTED ON AN ONLINE *DA CHANNEL AND ARE DIVERTED TO THIS   
25CB    #     SEGMENT FROM PERION   
25X2    #   
26BL    #   
26W=    #   
27*W          SEGENTRY K1CAFSPERI,XK1   
27TG    #   
28*6    #   
28SQ    #     FIRST WE HAVE SOME DEFINITIONS OF USEFUL LOCATIONS
29#B    #     THAT WILL CONTAIN INFORMATION TAKEN FROM THE OBJECT   
29S2    #     PROGRAM AS PART OF PROCESSING THE EXTRACODE   
2=?L    #   
2=R=    #DEF  TASKLEN=ACOMMUNE3 
2?=W    #DEF  TASKADDR=ACOMMUNE4
2?QG    #DEF  TASKMINLEN=5  
2#=6    #DEF  TASKMODE=ACOMMUNE1
2#PQ    #DEF  TASKCSNDV=ACOMMUNE3   
2*9B    #DEF  TASKCSN=ACOMMUNE5 
2*P2    #   
2B8L    #DEF  TASKCYL=ACOMMUNE2 
2BN=    #   
2C7W    #     NOW WE HAVE SOME PRESETS (MAINLY MESSAGE IDENTIFIERS FOR ILLEGALS)
2CMG    #   
2D76    #   
2DLQ    XMODE          +JYMODE  
2F6B    XRVCA          +JYNOCA  
2FL2    XRESV          +JYRESVIOL   
2G5L    XNOWR          +JYNOWRITE   
2GK=    #   
2H4W    #   
2HJG          SEGENTRY K50CAFSPERI         [USED BY CAFSPRIV MACRO  
2J46    #   
2JHQ    PRIVNAME       8HCAFSMODE   
2K3B    #   
2KH2    QFABSNB        4,12HDA             [FRAME OF /FABSNB FOR SECURITY CHECKS
2L2L    #   
2LG=    SLINK1  
2L^W          LINK     PERION,1 
2MFG    #   
2M^6    #   
2NDQ    XK1            [ENTRY POINT ONE 
2NYB    #   
2PD2    #     WE CAN BE ENTERED HERE FOR EITHER MODE #12 OR MODE #13 ORDERS 
2PXL    #     AND THE FIRST THING WE MUST DO IS TO SEPARATE ONE FROM THE OTHER  
2QC=    #   
2QWW    #   
2RBG          LDEX  0  EVENT4(2)           [GET MODE OF OBJ PROG PERI ORDER 
2RW6          SBN   0  #12  
2S*Q          BNZ   0  SMODE13             [JIF THIS IS A MODE #13 ORDER
2STB    #   
2T*2    #   
2TSL    #     THIS IS THE CODE FOR THE MODE #12 PERI TO ISSUE A CAFS TASK   
2W#=    #   
2WRW    #     IT IS ONLY ENTERED WHEN THE INFORMATION AVAILABLE TO EXECUTIVE IS 
2X?G    #     NOT SUFFICIENT FOR FOR THE TRANSFER TO BE HANDLED DIRECTLY
2XR6    #   
2Y=Q    #     THE REASON FOR ENTRY IS GIVEN IN THE WORD 'CFREASON' IN THE OLPA  
2YQB    #     AND CURRENT PERMITTED SETTINGS ARE:   
2^=2    #   
2^PL    #         0 - READ VALIDATION CHECKS HAVE FAILED (IE APPROPRIATE BIT
329=    #             IN 'CFRDBITS' IS NOT SET) 
32NW    #         1 - CHANNEL NOT YET INITIALISED FOR CAFS  
338G    #         2 - 'CAFS WRITE' TRANSFER (FOR CYLINDER VALIDATION)   
33N6    #         3 - OUTSTANDING ENGAGE BUTTONS ON THE SPECIFIED DRIVE 
347Q    #             (IE GEORGE IS LAGGING BEHIND) 
34MB    #   
3572    #     FIRST WE CHECK THAT THE CONTROL AREA (5 WORDS) IN IN RESERVATIONS 
35LL    #     AND WE EXTRACT THE FIRST FOUR WORDS INTO THE ACOMMUNE AREA OF THE 
366=    #     OLPA  
36KW    #   
375G          LDX   7  XRVCA(1)            [PRESET CORRECT ILLEGAL MESSAGE  
37K6          LDN   6  5                   [LENGTH TO CHECK 
384Q          CHECKEXT EVENT2(2),6,XILLOLPA,APETADDR(2),W,XCHECKEXT,HLOCK1  
38JB    #   
3942    XCHECKEXT   
39HL          LDX   1  APETADDR(2)         [NOW WE CAN MOVE THE C/A INTO THE
3=3=          LDX   4  EVENT2(2)           [ACOMMUNE WORDS OF THE OLPA  
3=GW          LDN   5  ACOMMUNE1(2) 
3?2G          LDN   6  4                   [MOVE FOUR WORDS INTO ACOMMUNE1  
3?G6          FOUTMOVE 1,4,5,6,HLOCK1,2 
3?^Q    #   
3#FB          LDN   4  TASKMINLEN          [THERE MUST BE A CERTAIN MINIMUM 
3#^2          BXGE  4  TASKLEN(2),WRNGSPEC [NUMBER OF WORDS IN THE TASK SPEC
3*DL    #   
3*Y=    #     NOW WE CAN CHECK THAT THE SPEC IS WITHIN RESERVATIONS AND IF  
3BCW    #     IT IS, WE CAN MOVE THE FIRST FOUR WORDS INTO THE ACOMMUNE AREA
3BXG    #   
3CC6          LDX   4  TASKLEN(2)          [GET LENGTH OF TASK SPEC 
3CWQ          LDX   3  TASKADDR(2)         [GET OBJ PROG ADDR OF TASK SPEC  
3DBB    #   
3DW2          SMO      FX1  
3F*L          LDX   7  XRESV               [PRESET THE CORRECT ILLEGAL MESSAGE  
3FT=    #   
3G#W          CHECKB   3,4,XILLOLPA,APETADDR(2),,XCHECKB,HLOCK2 
3GSG    #   
3H#6    XCHECKB 
3HRQ          LDX   1  APETADDR(2)  
3J?B          LDN   4  ACOMMUNE1(2)        [NOW WE CAN MOVE FOUR WORDS FROM THE 
3JR2          LDN   5  4                   [TASK SPEC INTO ACOMMUNE1 OF THE OLPA
3K=L          FOUTMOVE 1,3,4,5,HLOCK2,2 
3KQ=    #   
3L9W    #   
3LPG    #     THERE ARE TWO PLACES IN THE TASK SPECIFICATION WHERE THE  
3M96    #     GEOGRAPHIC UNIT NUMBER MAY BE SUPPLIED.   THE PREFERRED PLACE 
3MNQ    #     IS IN THE LEAST SIGNIFICANT 9 BITS OF THE FIRST WORD OF THE   
3N8B    #     SPEC.   HOWEVER, IT MAY ALSO OCCUR IN THE TOP 6 BITS OF THE 'CSN' 
3NN2    #     WORD. 
3P7L    #   
3PM=          LDEX  5  TASKMODE(2)         [TRY PREFERRED LOCATION FIRST
3Q6W          BNZ   5  SGOTGEOG            [JIF WE WERE RIGHT FIRST TIME!!  
3QLG          LDCH  5  TASKCSNDV(2)        [ELSE TRY THE 'CSN' WORD 
3R66          BZE   5  WRNGSPEC            [JIF NO GEOG UNIT NUMBER SUPPLIED
3RKQ    #   
3S5B    SGOTGEOG
3SK2          FINDPERE 3,APGEOG,5          [& FIND DEVICE LIST ENTRY FOR DRIVE  
3T4L          BNG   3  WRNGSPEC            [JIF DRIVE DOES NOT EXIST
3TJ=    #   
3W3W    #     NOW WE CAN DO SEVERAL CHECKS ON THE DRIVE 
3WHG    #   
3X36          JNCAFSDV 3,WRNGDRV           [JIF THE DRIVE IS NOT ON 'CAFS'  
3XGQ    #   
3Y2B    #     WE ONLY NEED TO ALLOW GEORGE TO CATCH UP WITH ENGAGE BUTTONS  
3YG2    #     WHEN EXEC ASKS US TO!! (I.E. FOR CFREASON=3)  
3Y^L    #   
3^F=          LDX   0  CFREASON(2)         [GET THE REASON FOR REFERRAL 
3^YW          SBN   0  3                   [& JIF WE ARE NOT TO WAIT FOR ENGAGE 
42DG          BNZ   0  XNOENBU             [BUTTONS TO CLEAR
42Y6    #   
43CQ          LDN   7  5                   [WE ARE ONLY PREPARED TO WAIT FOR
43XB    #                                  [APPROX 1 SEC BEFORE WE REPORT BACK  
44C2    #                                  [TO THE PROGRAM  
44WL    #   
45B=    XENGBU  
45TW          JNCFENBU 3,XNOENBU           [JIF NO ENGAGE BUTTONS OUTSTANDING   
46*G          COOR3    #41                 [ELSE ALLOW THEM TO CLEAR AND
46T6          BCT   7  XENGBU              [TRY AGAIN   
47#Q          BRN      REASON3             [JIF WE HAVE WAITED FOR APPROX 1 SEC 
47SB    #   
48#2    XNOENBU 
48RL          LADDP    3,1                 [GET ADDRESS OF APIA FOR OUR DRIVE   
49?=          LDCT  0  #20  
49QW          ANDX  0  BSUNIT(1)           [CHECK THE BSTS 'ENGAGED' MARKER 
4==G          BZE   0  WRNGDRV             [& JIF DEVICE NOT OFFICIALLY ENGAGED 
4=Q6    #   
4?9Q    #     THAT COMPLETES THE CHECKS THAT ARE COMMON TO ALL THE ENTRIES  
4?PB    #     THAT ARE MADE FOR MODE #12 TRANSFERS  
4#92    #   
4#NL    #     WE CAN NOW THE 'REASON' WORD TO JUMP TO THE APPROPRIATE CODE  
4*8=    #     TO CONTINUE   
4*MW    #   
4B7G          SMO      CFREASON(2)  
4BM6          BRN      £
4C6Q          BRN      REASON0             [READ VALIDATION FAIL
4CLB          BRN      REASON1             [CHANNEL NEEDS INITIALISATION
4D62          BRN      REASON2             [CAFS WRITE ORDER
4DKL          BRN      REASON3             [ENGAGE BUTTONS OUTSTANDING  
4F5=    #   
4FJW    #   
4G4G    REASON0 
4GJ6    #   
4H3Q    #     READ VALIDATION CAN FAIL FOR SEVERAL REASONS: 
4HHB    #   
4J32    #     1.   THE DRIVE HAS NOT BEEN USED FOR CAFS BY THIS CHANNEL BEFORE  
4JGL    #     2.   THE DRIVE HAS CHANGED STATUS SINCE IT WAS LAST USED  
4K2=    #     3.   A FILE HAS BEEN OPENED/CLOSED FOR WRITING ON THIS DRIVE  
4KFW    #   
4K^G    #     SOME OF THE EVENTS CAN BE DEALT WITH FROM THE OLPA, BUT IF
4LF6    #     EXOFILE SECURITY IS SWITCHED ON AND EXOFILE TRAPS HAVE TO BE  
4LYQ    #     CHECKED, IT IS NECESSARY TO TRANSFER TO THE CPAT  
4MDB    #   
4MY2    #     WE FIRST MAKE A SIMPLE CHECK TO SEE IF THE ENTRY IN THE OLPA'S
4NCL    #     LOCAL CAFS CSN TABLE MATCH THE CENTRAL TABLE.   THIS IS THE   
4NX=    #     STATE THAT EXISTS WHEN A DRIVE WAS IN USE, BUT FILE HAS BEEN  
4PBW    #     OPENED FOR WRITING ON THAT DRIVE. 
4PWG    #   
4QB6          LDX   1  CAFSPTR             [GET ADDRESS OF BSA/CAFSACT ACTIVITY 
4QTQ          SBX   5  CFLOWGEOG(1)        [AND CONVERT DRIVE NUMBER TO USE 
4R*B          SMO      5                   [AS TABLE MODIFIER   
4RT2          LDX   6  CFDRVTAB(1)         [GET CENTRAL TABLE CSN FOR DRIVE 
4S#L    #   
4SS=          MHUNTW   1,CAFS,CFCSNTABLE   [FIND THE LOCAL TABLE WITH THE OLPA  
4SWK          BRN      REVALIDATE          [J TO VALIDATE RIGHTS OF ACCESS TO   
4SYY    #                                  [SPECIFIED DISC  
4T3?    SDISCEVENT  
4T5L    #   
4T7^    #     WE COME HERE WHEN THERE IS AN OUTSTANDING EVENT(S) LIKE A NEW 
4T=#    #     DISC BEING LOADED OR A FILE OPEN/CLOSED FOR WRITING ON A DISC 
4T#M    #     THAT WE ARE VALIDATED TO USE.   WE GET HERE BY WAY OF A REASON1   
4TC2    #     EVENT WHICH NORMALLY INDICATES CHANNEL NOT YET VALIDATED FOR CAFS 
4TF*    #   
4THN          LDN   5  0                   [SET INITIAL TABLE ENTRY ADDRESS 
4TL3          LDX   0  ALOGLEN(1)          [& GET LENGTH OF TABLE   
4TNB    #   
4TQP    SEARCHCSNS1 
4TT4          SMO      5
4TXC          LDXC  6  CFTDRVTAB(1)        [LOOK FOR EVENT BITS IN CSN TABLE
4T^Q          BCS      SFOUNDEVENT         [JIF WE HAVE FOUND AN EVENT  
4W45    #   
4W6D          ADN   5  1                   [ELSE GO FOR THE NEXT ENTRY IN THE   
4W8R          BCT   0  SEARCHCSNS1         [TABLE   
4W?6    #   
4W*F    #     NO EVENT FOUND!!   (PERHAPS THE DISC HAS BEEN UNLOADED)   
4WCS    #   
4WG7          LDCT  0  #400                [WE MERELY SET 'INITIALISED-FOR-CAFS'
4WJG          ORS   0  CFRDBITS(2)         [IN THE OLPA AND ASK THE PROGRAM TO  
4WLT          BRN      STRYAGAIN           [TRY AGAIN   
4WP8    #   
4WRH    SFOUNDEVENT 
4WTW          SMO      5
4WY9          STO   6  CFTDRVTAB(1)        [CLEAR THE EVENT BIT IN THE CSN TABLE
4X2J    #   
4X4X          ADX   1  5                   [NOW LOOK TO SEE IF THIS IS THE ONLY 
4X7=          LDN   4  0                   [EVENT WAITING TO BE NOTIFIED
4X9K    #   
4X?Y    SEARCHCSNS2 
4XB?          LDXC  7  CFTDRVTAB(1)        [BY USING CARRY WE MAKE X4 NON-ZERO  
4XDL          ADN   4  0                   [IF THERE ARE STILL EVENTS WAITING   
4XG^          ADN   1  1
4XK#          BCT   0  SEARCHCSNS2  
4XMM    #   
4XQ2          BNZ   4  STILLEVENTS         [JIF THERE ARE STILL EVENTS WAITING  
4XS*    #   
4XWN          LDCT  0  #400                [ELSE SET CAFS INITIALISED MARKER
4X^3          ORS   0  CFRDBITS(2)         [AGAIN IN OLPA   
4Y3B    #   
4Y5P    STILLEVENTS 
4Y84          LDN   0  0                   [FINALLY WE CHECK IF WE CAN RESET THE
4Y=C          LDX   1  CAFSPTR             [READ-VALIDATED BIT FOR THE CURRENT  
4Y#Q          SMO      5                   [DRIVE IN THE OLPA 'READ BITS' WORDS 
4YC5          TXU   6  CFDRVTAB(1)         [THIS ONLY DONE IF THE LOCAL CSN 
4YFD          ADN   0  0                   [ENTRY MATCHES THE CENTRAL ONE!! 
4YHR    #   
4YL6          LDCT  7  #120                [SET 'EVENT-ON-CARTRIDGE' REPLY  
4YNF          ANDX  6  BSB18               [ENSURE ONLY CSN IS PASSED OVER!!
4YQS          ORX   7  6
4YT7    #   
4YXG          BNZ   0  SETREPLY            [JIF CENTRAL/LOCAL CSN ENTRY MISMATCH
4Y^T    #   
4^48          ADX   5  CFLOWGEOG(1)        [ELSE FIND THE DEVICE LIST ENTRY FOR 
4^6H          FINDPERE 3,APGEOG,5          [THE SELECTED DRIVE  
4^8W    #   
4^NG    SETRDBITS   
5286    #   
52MQ    #     HERE WE SET THE BIT IN 'CFRDBITS' OF THE OLPA THAT CORRESPONDS
537B    #     TO OUR DRIVE  
53M2    #   
546L          LDX   4  CFRDBITMASK(3)      [COLLECT THE 42-BIT MASK FROM THE
54L=          LDX   5  CFRDBITMASK+1(3)    [DEVICE LIST 
555W          ANDX  4  BSB18               [CLEAR OUT BITS THAT ARE NOT REQUIRED
55KG          ORS   4  CFRDBITS(2)  
5656          ORS   5  CFRDBITS+1(2)       [SET APPROPRIATE READ VALIDATION BIT 
56JQ    #   
574B    SETREPLY
57J2    #   
583L    #     HERE WE SET THE REPLY IN X7 INTO THE REPLY WORD IN THE PROGRAM
58H=    #     AND THEN WE END THE TRANSFER  
592W    #   
59GG          LDX   3  EVENT2(2)           [GET THE REPLY WORD ADDRESS AND  
5=26          ADN   3  1                   [CONVERT IT INTO A GEORGE ADDRESS
5=FQ          LDX   1  APETADDR(2)  
5=^B          FADDRESS 1,3,HLOCK1   
5?F2    #   
5?YL          STO   7  0(3)                [SET THE PROGRAM REPLY WORD  
5#D=          LDX   1  FX1                 [END THE TRANSFER, RESETTING THE 
5#XW          OLPFIN1  SLINK1(1)           [OLPA'S LINK BACK TO PERION  
5*CG    #   
5*X6    #   
5BBQ    REASON1 
5BDF    #   
5BG8    #     WE MAY GET A TRANSFER REFERRED BY EXEC WHEN AN EVENT HAS OCCURRED 
5BHX    #     ON A CARTRIDGE THAT IS BEING USED ON CAFS.   WE DETECT THIS BY THE
5BKL    #     PRESENCE OF A LOCAL CSN TABLE BLOCK (CAFS/CFCSNTABLE) WITH THE
5BM*    #     OLPA'S DATA BLOCKS
5BP4    #   
5BQR          HUNTW    1,CAFS,CFCSNTABLE
5BSG          BPZ   1  SDISCEVENT          [JIF WE ARE ALREADY CAFS INITIALISED 
5BWB    #   
5CB2    #     FURTHER VALIDATION CHECKS REQUIRE A CHANGE TO THE CPAT SO THAT
5CTL    #     FILES CAN BE OPENED, PRIVILEGES CHECKED, ETC  
5D*=    #   
5DSW    #     PARAMETERS FOR THE CHECKS THAT ARE TO BE MADE ARE SENT TO THE CPAT
5F#G    #     BY PLACING THEM IN THE AWORK WORDS OF THE PCA.   CAPCA THEN   
5FS6    #     TRANSFERS THEM INTO THE AWORK WORDS OF THE CPAT.  
5G?Q    #   
5GRB          LDX   1  APETADDR(2)         [GET ADDRESS OF PCA  
5H?2          STOZ     AWORK1(1)           [AND INDICATE CHANNEL INITIALISATION 
5HQL          BRN      TOPCA
5J==    #   
5JPW    #   
5K9G    REVALIDATE  
5KP6    #   
5L8Q    #     IF THE CARTRIDGE ON A DRIVE HAS CHANGED OR IF WE HAVE NOT USED
5LNB    #     THE DRIVE BEFORE, READ VALIDATION FAILURE CAN OCCUR.   IT IS  
5M82    #     NECESSARY TO GO TO THE CPAT TO REVALIDATE RIGHTS OF ACCESS TO 
5MML    #     THE DRIVE 
5N7=    #   
5NLW    #     HOWEVER, IF EXOFILE SECURITY IS NOT IN USE, WE CAN MERELY 
5P6G    #     CLEAR THE DRIVE FOR USE AND CONTINUE  
5PL6    #   
5Q5Q          LDX   0  EDSQ 
5QKB          BZE   0  QUICKREVAL          [JIF EXOFILE SECURITY NOT BEING USED 
5R52    #   
5RJL          LDX   1  APETADDR(2)         [ELSE INDICATE REVALIDATION REQUIRED 
5S4=          STO   1  AWORK1(1)           [IN THE PCA. 
5SHW    #   
5T3G    #   
5TH6    TOPCA   
5W2Q    #     BEFORE TRANSFERRING TO THE PCA, WE SET UP THE REST OF THE 
5WGB    #     PARAMETERS THAT WE WILL REQUIRE   
5X22    #   
5XFL          STO   3  AWORK2(1)           [DEVICE LIST ADDRESS FOR DRIVE   
5X^=          LDX   0  ACTNUM(2)
5YDW          STO   0  AWORK3(1)           [ACTIVITY NUMBER OF OLPA 
5YYG          LDX   0  EVENT2(2)
5^D6          ADN   0  1
5^XQ          STO   0  AWORK4(1)           [OBJ PROG REPLY WORD ADDRESS 
62CB    #   
62X2          LDX   1  FX1                 [TRANSFER TO THE PCA, RESETTING THE  
63BL          TOPCA1   SLINK1(1)           [LINK IN THE OLPA IN THE PROCESS 
63W=    #   
64*W    #     ******************************************************************
64TG    #   
65*6    #     WE ARE NOW RUNNING IN THE PCA 
65SQ    #   
66#B    #     ******************************************************************
66S2    #   
67?L          UNPLUG                       [UNPLUG THE PROGRAM  
67R=          CAPCA                        [AND TRANSFER TO THE CPAT
68=W    #   
68QG    #     ******************************************************************
69=6    #   
69PQ    #     WE ARE NOW RUNNING IN THE CPAT
6=9B    #   
6=P2    #     ******************************************************************
6?8L    #   
6?N=          LDX   0  AWORK1(2)
6#7W          BNZ   0  SETUPNOW            [JIF DOING REVALIDATION ONLY 
6#MG    #   
6*76    #     HERE WE ARE GOING TO INITIALISE THE CHANNEL FOR CAFS  
6*LQ    #   
6B6B    #     FIRST WE CHECK THAT THE USER IS SUITABLY PRIVILEGED TO USE CAFS   
6BL2    #   
6C5L          CHEKPRIV ,PRIVNAME,XCHEKPRIV  
6CK=          BRN      XCANUSECAFS         [JIF USER CAN USE CAFS   
6D4W    #   
6DJG    XCHEKPRIV   
6F46          TESTREP2 NOSUCH,XCANUSECAFS   
6FHQ    #   
6G3B    #     IF THE USER IS NOT SUITABLY PRIVILEGED, THE MODE #12 ORDER IS 
6GH2    #     ILLEGEAL  
6H2L    #   
6HG=          LDX   7  XMODE(1)            [ILLEGAL MESSAGE IDENTIFIER  
6H^W    #   
6JFG    XILLEGAL
6J^6          ILLEGALX 7                   [SEND PROGRAM ILLEGAL
6KDQ    #   
6KYB    #   
6LD2    XILLOLPA
6LXL    #   
6MC=    #     BEFORE WE CAN SEND THE PROGRAM ILLEGAL, WE MUST GO TO THE PCA 
6MWW    #   
6NBG          LDX   1  FX1                 [TRANSFER TO PCA AND RESET THE LINK  
6NW6          TOPCA1   SLINK1(1)           [IN THE OLPA ON THE WAY  
6P*Q    #   
6PTB    #     ******************************************************************
6Q*2    #   
6QSL    #     WE ARE NOW RUNNING IN THE PCA 
6R#=    #   
6RRW    #     ******************************************************************
6S?G    #   
6SR6          UNPLUG                       [UNPLUG THE PROGRAM BEFORE SENDING IT
6T=Q          BRN      XILLEGAL            [ILLEGAL 
6TQB    #   
6W=2    #   
6WPL    XCANUSECAFS 
6X9=    #   
6XNW    #     WE ARE SUITABLY PRIVILEGED TO USE CAFS AND MUST THEREFORE SET UP  
6Y8G    #     THE OLPA FOR USE WITH CAFS
6YN6    #   
6^7Q          LDX   3  CAFSPTR             [FIND THE BSA/CAFSACT ACTIVITY   
6^MB          LDX   3  CFDRVTABLEN(3)      [& GET THE DRIVE TABLE LENGTH
7272          SETUPCOR 3,1,CAFS,CFCSNTABLE [SET UP A BLOCK TO HOLD THE TABLE
72LL    #   
736=          STOZ     CFTDRVTAB(1)        [INITIALISE THE TABLE TO ZEROS   
73KW          LDN   4  CFTDRVTAB(1) 
745G          LDN   5  CFTDRVTAB+1(1)   
74K6          MOVE  4  -1(3)
754Q    #   
75JB    #     THIS TABLE BLOCK IS GOING TO BELONG TO THE OLPA AND SO WE MUST
7642    #     GIVE IT TO THE OLPA NOW   
76HL    #   
773=          FPCACA   3,2                 [GET THE ADDRESS OF THE PCA  
77GW          LDX   4  AWORK3(2)           [AND USE THE OLPA ACTIVITY NUMBER
782G          FINDACTX 3,4                 [TO LOCATE THE OLPA  
78G6          CHAIN    1,3                 [GIVE THE TABLE BLOCK TO THE OLPA
78^Q    #   
79FB    #     TO EASILY LOCATE ALL VALIDATED CAFS CHANNELS, THE OLPAS ARE   
79^2    #     RINGED TO THE BSA/CAFSACT THROUGH THE CFRING ELEMENT (RENAMED 
7=DL    #     WORKFILE RING)
7=Y=    #   
7?CW          SMO      CAFSPTR  
7?XG          LDN   2  CFRING              [ADDR OF CAFS RING IN BSA/CAFSACT
7#C6          LDN   1  CFRING(3)           [ADDR OF CAFS RING IN OLPA   
7#WQ          ENRING   1,2  
7*BB    #   
7*W2          LDCT  0  #400                [MARK OLPA AS INITIALISED FOR CAFS   
7B*L          ORS   0  CFRDBITS(3)         [(NB DON'T CLEAR ANY BIT MAP BITS!!) 
7C#W    #   
7CSG    #   
7D#6    SETUPNOW
7DRQ    #   
7F?B    #     NOW WE GET THE CARTRIDGE NUMBER FOR OUR DRIVE 
7FR2    #   
7G=L          LADDP    AWORK2(2),1         [GET ADDR OF APIA FOR DRIVE  
7GQ=          LDCT  0  #20                 [& CHECK THAT CARTRIDGE IS STILL 
7H9W          ANDX  0  BSUNIT(1)           [THERE   
7HPG          BZE   0  SNODRIVE            [AFTER ALL THAT, THE DRIVE IS DOWN   
7J96          LDX   7  BSUNIT5(1)          [PICK UP THE CSN FOR THE DRIVE   
7JNQ          LDX   5  7                   [AND MAKE A COPY FOR USE LATER   
7K8B    #   
7KN2    #     WE ARE NOW READY TO CHECK THAT THE USER IS ALLOWED TO ACCESS  
7L7L    #     THE CARTRIDGE ON THE SPECIFIED DRIVE  
7LM=    #   
7M6W          LDN   3  0                   [INDICATE LOGACCESS NOT REQUIRED 
7MLG          LDX   0  EDSQ                [CHECK WHETHER EXOFILE SECURITY IN   
7N66          BZE   0  SETBITS             [USE - JIF NOT BEING USED
7NKQ    #   
7P5B    #     NOW WE SET UP A FILE/FABSNB TO OPEN THE DIRECTORY FOR :DANNNNNN   
7PK2    #     AS CAFS ACCESS REQUIRES A READ TRAP FOR THE CARTRIDGE'S DIRECTORY 
7Q4L    #   
7QJ=          SETNCORE 4,3,FILE,FABSNB     [/FABSNB NEEDS ONLY FOUR WORDS   
7R3W          ADN   3  A1   
7RHG          LDN   2  QFABSNB(1)          [SET UP FRAME OF NAME
7S36          MOVE  2  4
7SGQ          LDX   2  FX2  
7T2B    #   
7TG2          BCHX  3  £                   [STEP THE POINTER IN X3 BY TWO   
7T^L          BCHX  3  £                   [CHARACTERS  
7WF=          SLL   7  6                   [PREPARE CASN FOR CONVERSION INTO
7WYW          LDN   4  6                   [OCTAL DIGITS
7XDG    #   
7XY6    STILLZERO   
7YCQ    #   
7YXB    #     EXOFILE DIRECTORIES ARE NAMED :DANNNNNN WHERE 'NNNNNN' IS THE CSN 
7^C2    #     WITH LEADING ZEROS OMITTED
7^WL    #   
82B=          LDN   6  0                   [GET NEXT OCTAL DIGIT INTO X6
82TW          SLL   67 3
83*G          BNZ   6  NOWDUMPCHAR         [JIF WE HAVE A SIGNIFICANT DIGIT 
83T6          BCT   4  STILLZERO           [OMIT LEADING ZEROS  
84#Q          BRN      (GEOERR)            [ERROR - CSN IS ALL ZEROS
84SB    #   
85#2    NEXTCHAR
85RL          LDN   6  0
86?=          SLL   67 3                   [GET NEXT OCTAL DIGIT INTO X6
86QW    #   
87=G    NOWDUMPCHAR 
87Q6          DCH   6  1(3)                [PUT OCTAL DIGIT INTO /FABSNB
889Q          BCHX  3  £                   [STEP POINTERS AND GO FOR NEXT CHAR  
88PB          BCT   4  NEXTCHAR 
8992    #   
89NL    #     THE /FABSNB IS NOW COMPLETE AND WE CAN OPEN THE DIRECTORY 
8=8=    #   
8=MW          OPENDIR  (GEOERR),READ,QUERY  
8?7G    #   
8?M6          TESTREP2 OK,SCHECKTRAPS,CLUDGE,SNOTRAPS   
8#6Q    #   
8#LB    #     FURTHER ACTION DEPENDS ON THE TYPE OF EXOFILE SECURITY IN USE 
8*62    #   
8*KL          LDX   0  EDSQ                [IF SECURITY IS MANDATORY, FAILURE   
8B5=          BNG   0  SNOTRAPS            [TO OPEN THE DIRECTORY MEANS NO TRAP 
8BJW    #   
8C4G    #     FOR OPTIONAL SECURITY WE ALLOW ACCESS IF THE DIRECTORY DOES NOT   
8CJ6    #     EXIST 
8D3Q    #   
8DHB          LDN   3  0                   [INDICATE DON'T 'LOGACCESS'  
8F32          BRN      SETBITS             [SET THE READ VALIDATION BIT 
8FGL    #   
8G2=    SCHECKTRAPS 
8GFW    #   
8G^G    #     HERE THE DIRECTORY IS OPEN AND WE MUST CHECK THE USER'S RIGHT 
8HF6    #     TO READ THE DIRECTORY 
8HYQ    #   
8JDB          CHECKTRAPS
8JY2          TESTTRAP READ                [CHECK FOR A READ TRAP   
8KCL    #   
8KX=          LDN   3  7                   [INDICATE 'ACCESS FRUSTRATED' FOR
8LBW          TESTREP2 NOTRAP,NOTFORUSE    [LOGACCESS AND TEST REPLY
8LWG    #   
8MB6          LDN   3  2                   [INDICATE 'ACCESS PERMITTED' FOR 
8MTQ    #   
8N*B    SETBITS 
8NT2    #   
8P#L    #     HERE WE CAN SET THE 'READ VALIDATION BIT' IN THE OLPA 
8PS=    #   
8Q?W          FPCACA   1,2                 [FIND THE PCA AND FROM THERE LOCATE  
8QRG          LDX   4  AWORK3(2)           [THE OLPA BY ITS ACTIVITY NUMBER 
8R?6          FINDACTX 1,4  
8RQQ    #   
8S=B          LDX   2  AWORK2(2)           [GET DEVICE LIST ADDRESS 
8SQ2          LDX   6  CFRDBITMASK(2)      [AND PICK UP THE READ VALIDATION BIT 
8T9L          LDX   7  CFRDBITMASK+1(2)    [FROM THE 42-BIT MASK AREA   
8TP=          ANDX  6  BSB18               [REMOVE UNWANTED BITS AT THE TOP 
8W8W          ORS   6  CFRDBITS(1)         [SET THE READ VALIDATION BIT IN THE  
8WNG          ORS   7  CFRDBITS+1(1)       [OLPA
8X86    #   
8XMQ    #     WE MUST ALSO PUT THE CSN INTO THE OLPA'S CSN LIST 
8Y7B    #   
8YM2          LGEOG    2,6                 [GET THE DRIVE'S GEOG UNIT NUMBER
8^6L          SMO      CAFSPTR             [AND CONVERT IT TO USE AS A TABLE
8^L=          SBX   6  CFLOWGEOG           [MODIFIER
925W    #   
92KG          HUNT2J   1,CAFS,CFCSNTABLE,,(GEOERR) [FIND BLOCK HOLDING CSN TABLE
9356          SMO      6
93JQ          STO   5  CFTDRVTAB(1)        [STORE CSN IN TABLE(KEPT FROM ABOVE) 
944B    #   
94J2    NOTFORUSE   
953L    #   
95H=    #     WE MUST NOW LOG THE ACCESS AS APPROPRIATE 
962W    #   
96GG          BZE   3  TRYAGAIN            [JIF ACCESS LOGGING IS NOT REQUIRED  
9726    #   
97FQ          LDN   7  CREAD               [SET 'READ' ACCESS MODE  
97^B          LOGACCES 0(3),7              [& LOG THE ACCESS
98F2    #   
98YL          MFREE    FILE,ENT            [TIDY UP FROM TRAP CHECKING  
99D=          CLOSETOP                     [AND CLOSE THE DIRECTORY 
99XW    #   
9=CG          SBN   3  2
9=X6          BNZ   3  SNOTRAPS            [JIF ACCESS WAS NOT PERMITTED
9?BQ    #   
9?WB    TRYAGAIN
9#B2    #   
9#TL    #     INDICATE TO THE PROGRAM THAT IT MAY TRY AGAIN NOW 
9**=    #   
9*SW          LDCT  7  #020 
9B#G    #   
9BS6    SETREP  
9C?Q    #   
9CRB    #     HERE WE ARE GOING TO SET A REPLY IN THE OBJECT PROGRAM
9D?2    #   
9DQL          VFREE    FILE,FABSNB         [TIDY UP FROM TRAP CHECKING  
9F==    #   
9FPW          LDX   2  FX2  
9G9G          GETWORD  AWORK4(2),3,WRITE   [GET GEORGE ADDR OF OBJ PROG REPLY WD
9GP6          TESTRPN2 OK,(GEOERR)         [FATAL ERROR IF CAN'T ACCESS PROGRAM 
9H8Q          STO   7  0(3)                [SET REPLY INTO PROGRAM  
9HNB          WORDFIN   
9J82          RUNPROG                      [SET PROGRAM RUNNING AGAIN   
9JML    #   
9K7=    #   
9KLW    SNOTRAPS
9KQ2    #   
9KT6          OUTPACK  5,1,CSN  
9KY=          MONOUT   EWSTUC              [REPORT TRAP FAIL TO M/F 
9L3B    #   
9L6G          LDCT  7  #040                [SET TRAPS CLOSED REPLY  
9LL6          BRN      SETREP   
9M5Q    #   
9MKB    SNODRIVE
9N52          LDCT  7  #410                [SET DRIVE FAILED REPLY  
9NJL          BRN      SETREP   
9P4=    #   
9PHW    WRNGSPEC
9Q3G          LDCT  7  #440                [SET ILLEGAL TASK SPEC REPLY 
9QH6          BRN      SETREPLY 
9R2Q    #   
9RGB    WRNGDRV 
9S22          LDCT  7  #410                [SET DRIVE FAILED REPLY  
9SFL          BRN      SETREPLY 
9S^=    #   
9TDW    REASON3 
9TL4    #   
9TR=    STRYAGAIN   
9TYG    #   
9WD6    #     BECAUSE WE HAVE ALREADY WAITED FOR ENGAGE BUTTONS TO CLEAR, WE
9WXQ    #     MERELY ASK THE PROGRM TO REPEAT THE TRANSFER  
9XCB    #   
9XX2          LDCT  7  #020                [SET 'TRY AGAIN' REPLY   
9YBL          BRN      SETREPLY 
9YW=    #   
9^*W    #   
9^TG    QUICKREVAL  
=2*6    #   
=2SQ    #     WE NEED ONLY SET THE TRY AGAIN REPLY AND RE-INSTATE THE READ  
=3#B    #     VALIDATION BIT IF EXOFILE SECURITY IS SWITCHED OFF
=3S2    #   
=4?L          SMO      5                   [RE-INSTATE TABLE ENTRY FROM DATA
=4R=          STO   6  CFTDRVTAB(1)        [LEFT OVER FROM CODE ABOVE!!!
=5=W    #   
=5QG          LDCT  7  #020                [SET 'TRY AGAIN' REPLY   
=6=6          BRN      SETRDBITS           [& AND GO TO SET READ VALIDATION BIT 
=6PQ    #   
=79B    #   
=7P2    REASON2 
=88L    #   
=8N=    #     ALL CAFS WRITE MODE TRANSFERS ARE REFERRED TO GEORGE FOR  
=97W    #     VALIDATION.  THE CHECKS THAT ARE CARRIED OUT ARE AS FOLLOWS:  
=9MG    #   
==76    #     1.  THAT THE FILE IS OPEN FOR WRITING 
==LQ    #     2.  THAT THE CYLINDER IS PART OF A FULL-WIDTH FILE AREA   
=?6B    #     3.  THAT THE FILE AREA IS ON THE STATED CARTRIDGE 
=?L2    #     4.  THAT THE CARTRIDGE IS ON THE STATED DRIVE 
=#5L    #   
=#K=    #   
=*4W          LDX   5  TASKCSNDV(2)        [GET CSN FROM TASK SPEC COPIED INTO  
=*JG          ANDX  5  BSB18               [OLPA ACOMMUNE AREA  
=B46          BXU   5  BSUNIT5(1),WRNGDRV  [JIF CSN IS NOT ON SPECIFIED DRIVE   
=BHQ    #   
=C3B          LDX   6  TASKCYL(2)          [PICK UP SPECIFIED CYLINDER NUMBER   
=CH2    #   
=D2L          MFINDEXO 1,EXNUM(2)          [FIND THE EWDAS/EXOF BLOCK FOR FILE  
=DG=    #   
=D^W          LDXC  0  EXMARK(1)
=FFG          BCC      XNOTOFW             [JIF FILE IS NOT OPEN FOR WRITING
=F^6    #   
=GDQ          LDX   7  FIP+5(1)            [GET NUMBER OF FILE AREA CELLS   
=GYB          ANDX  7  BSP16               [IN /EXOF BLOCK  
=HD2          BZE   7  WRNGSPEC            [JIF FILE HAS NO AREAS   
=HXL          ADN   1  FDCELLS             [GET ADDR OF 'FDCELLS' AREA IN X1
=JC=    #   
=JWW    ROUNDAGAIN  
=KBG          BXU   5  0(1),NEXTAREA       [JIF CSN DOES MATCH THIS FILE AREA   
=KW6          BXL   6  1(1),NEXTAREA       [JIF AREA STARTS AFTER REQUIRED CYL  
=L*Q          LDX   0  1(1)                [FIND END OF AREA CYLINDER NUMBER + 1
=LTB          ADXC  0  3(1) 
=M*2          BCS      NEXTAREA            [JIF THIS IS NOT A FULL WIDTH AREA   
=MSL          BXL   6  0,THISAREA          [JIF ALL CHECKS SUCCESSFULLY PASSED  
=N#=    #   
=NRW    NEXTAREA
=P?G          ADN   1  6                   [UPDATE FDCELLS POINTER  
=PR6          BCT   7  ROUNDAGAIN          [GO ROUND AGAIN IF UNPROCESSED CELLS 
=Q=Q    #   
=QQB          BRN      WRNGSPEC            [COULDN'T MATCH CYLINDER, SO ERROR   
=R=2    #   
=RPL    THISAREA
=S9=    #   
=SNW    #   
=T8G    #     HAVING SUCCESSFULLY CHECKED OUR CYLINDER, WE MUST GIVE DETAILS
=TN6    #     OF THE TRANSFER BACK TO EXECUTIVE FOR IMPLEMENTATION. 
=W7Q    #   
=WMB    #     THIS IS DONE BY ISSUING A MODE #0 ORDER FOR THE CAFS DEVICE   
=X72    #   
=XLL    #     THE DETAILS SET INTO THE DEVICE LIST ARE SOMEWHAT UNUSUAL BUT 
=Y6=    #     ALLOW EXEC TO DEAL WITH THE REST OF THE TRANSFER WITHOUT COMING   
=YKW    #     BACK TO GEORGE
=^5G    #   
=^K6    #     BEFORE THE PERI IS ISSUED, WE SET AN INTERIM REPLY INTO THE   
?24Q    #     OBJECT PROGRAM
?2JB    #   
?342    #   
?3HL          SMO      CAFSPTR             [GET DEVICE LIST ADDRESS FOR CAFS
?43=          LDX   1  CPPTR               [DEVICE  
?4GW    #   
?52G          LDN   0  0
?5G6          DCA      1,DLA,0,MODE        [SET MODE #0 ORDER   
?5^Q    #   
?6FB          SMO      APETADDR(2)  
?6^2          LDX   0  ALIMIT   
?7DL          DCA      1,STO,0,COUNT       [SET OBJECT PROGRAM LIMIT
?7Y=    #   
?8CW          SMO      APETADDR(2)  
?8XG          LDX   0  ADATUM   
?9C6          DCA      1,STO,0,CTSA        [SET OBJECT PROGRAM DATUM
?9WQ    #   
?=BB          DCA      1,STO,6,DTSA        [SET VALIDATED CYLINDER NUMBER   
?=W2    #   
??*L          STO   3  CFREASON(2)         [EXEC WILL GET DEVICE LIST ADDRESS   
??T=    #                                  [AND OTHER DETAILS FROM OLPA 
?##W    #   
?#SG          LDX   1  APETADDR(2)         [FIND OBJ PROG REPLY WORD ADDRESS
?*#6          LDX   3  EVENT2(2)
?*RQ          ADN   3  1
?B?B          FADDRESS 1,3,HLOCK1   
?BR2    #   
?C=L          LDCT  7  #400                [SET INTERIM REPLY WORD FOR OBJ  
?CQ=          STO   7  0(3)                [PROG
?D9W    #   
?DPG          SMO      CAFSPTR  
?F96          LDX   1  CPPTR               [RESTORE CAFS DEVICE LIST ADDRESS &  
?FNQ          GPERI    1,2,NC              [ISSUE ORDER TO EXECUTIVE
?G8B    #   
?GN2          LDX   1  FX1  
?H7L          OLPFIN1  SLINK1(1)           [THAT'S IT FROM OUR POINT OF VIEW
?HM=    #   
?J6W    #   
?JLG    XNOTOFW 
?K66    #   
?KKQ          SMO      FX1  
?L5B          LDX   7  XNOWR               [ILLEGAL - FILE NOT OPEN FOR WRITING 
?LK2          BRN      XILLOLPA 
?M4L    #   
?MJ=    #   
?N3W    #   
?NHG    #   
?P36    SMODE13 
?PGQ    #   
?Q2B    #     THIS IS THE CODE FOR THE MODE #13 PERI ORDER WHICH REPORTS
?QG2    #     DETAILS OF FILES WHICH ARE OPEN FOR WRITING.   THE CONTROL
?Q^L    #     AREA IS OF THE FORM:  
?RF=    #   
?RYW    #         WORD 0 - STANDARD WITH MODE BITS SET TO #13   
?SDG    #         WORD 1 - REPLIES - BO = 0  ORDER COMPLETED
?SY6    #                            B1 = 1  DATA LOST, BUFFER TOO SHORT
?TCQ    #                            B6-23   ADDRESS OF WORD AFTER VALID DATA   
?TXB    #                                    IN BUFFER  
?WC2    #         WORD 2 - BUFFER LENGTH IN WORDS   
?WWL    #         WORD 3 - BUFFER ADDRESS IN WORDS  
?XB=    #         WORD 4 - WORD CONTAINING 'CSN' OF CARTRIDGE FOR WHICH THE 
?XTW    #                  REPORT IS REQUIRED   
?Y*G    #   
?YT6    #   
?^#Q    #     THE FORMAT OF THE DATA RETURNED IN THE BUFFER IS AS FOLLOWS:  
?^SB    #   
#2#2    #         FOR EACH FILE AREA ON THE CARTRIDGE THAT IS PART OF A FILE
#2RL    #         THAT IS OPEN FOR WRITING, A TWO WORD ELEMENT IS RETURNED. 
#3?=    #         THE FORMAT OF THE TWO WORD ENTRY IS   
#3QW    #   
#4=G    #             WORD 0 - BO = 1 FILE AREA IS NOT FULL WIDTH   
#4Q6    #                      B1-11  FILE AREA START CYLINDER NUMBER   
#59Q    #                      B12-23 FILE AREA SIZE IN CYLINDERS   
#5PB    #             WORD 1 - B0-11  START BLOCK WITHIN CYLINDERS  
#692    #                      B12-23 NUMBER OF BLOCKS/SEEK AREA
#6NL    #   
#78=    #     IF THERE IS MORE FILE AREA DATA THAN THE BUFFER CAN HOLD, THE 
#7MW    #     'DATA LOST' BIT IS SET IN THE REPLY WORD AND THE REPORT IS
#87G    #     INCOMPLETE.  NOTE THAT THE DATA RETURNED TO THE PROGRAM IS
#8M6    #     IS ALWAYS AN EVEN NUMBER OF WORDS AND SO THE 'DATA LOST' REPLY
#96Q    #     MAY OCCUR WHEN THERE IS APPARENTLY STILL ONE WORD SPARE IN THE
#9LB    #     BUFFER
#=62    #   
#=KL    #   
#?5=    #   
#?JW    #     FIRST WE CHECK THAT THE CONTROL AREA (5 WORDS) IS IN RESERVATIONS 
##4G    #     AND WE COPY THE FIVE WORDS INTO THE ACOMMUNE AREA OF THE OLPA 
##J6    #   
#*3Q          LDX   7  XRVCA(1)            [PRESET THE CORRECT ILLEGAL MESSAGE  
#*HB          LDN   6  5                   [LENGTH TO CHECK 
#B32          CHECKEXT EVENT2(2),6,XILLOLPA,APETADDR(2),W,YCHECKEXT,HLOCK1  
#BGL    #   
#C2=    YCHECKEXT   
#CFW          LDX   1  APETADDR(2)         [NOW WE CAN MOVE THE C/A INTO THE
#C^G          LDX   4  EVENT2(2)           [ACOMMUNE WORDS IN THE OLPA  
#DF6          LDN   5  ACOMMUNE1(2) 
#DYQ          FOUTMOVE 1,4,5,6,HLOCK1,2    [MOVE THE DATA FROM THE OBJ PROG 
#FDB    #   
#FY2    #     NOW WE CAN CHECK THAT THE PROGRAM'S BUFFER IS ALSO IN 
#GCL    #     RESERVATIONS AND THAT WE CAN WRITE TO IT (FOR GEORGE 4).  
#GX=    #   
#HBW          LDX   4  TASKLEN(2)          [GET LENGTH OF PROGRAM BUFFER
#HWG          LDX   3  TASKADDR(2)         [AND ADDR OF OBJ PROG BUFFER 
#JB6          SMO      FX1                 [PRESET CORRECT ILLEGAL MESSAGE  
#JTQ          LDX   7  XRESV
#K*B    #   
#KT2          CHECKB   3,4,XILLOLPA,APETADDR(2),W,YCHECKB,HLOCK2
#L#L    #   
#LS=    YCHECKB 
#M?W          LDX   7  TASKCSN(2)          [GET 'CSN' REQUESTED FOR REPORT  
#MRG    #   
#N?6    #     WE NOW EXAMINE ALL /EXOF BLOCKS ON THE CARTRIDGE CONTROL CHAIN
#NQQ    #     TRYING TO MATCH 'OUR CSN' IN ANY FILE THAT IS OPEN FOR WRITING
#P=B    #   
#PQ2          LDN   3  BCCB                [START ADDR OF CART CONT CHAIN   
#Q9L    #   
#QP=    NEXTEXOF
#R8W          LDX   3  BPTR(3)             [GET ADDR OF NEXT BLOCK ON CHAIN 
#RNG          BXE   3  CXCC,SNONELEFT      [& JIF ALL BLOCKS PROCESSED  
#S86          LDX   0  BACK2(3)            [JIF NO MORE /EXOF BLOCKS (ONLY  
#SMQ          BZE   0  SNONELEFT           [THINGS LIKE /ASTUCS LEFT!!) 
#T7B    #   
#TM2          LDXC  0  EXMARK(3)           [JIF THIS FILE IS NOT OPEN FOR   
#W6L          BCC      NEXTEXOF            [WRITING 
#WL=    #   
#X5W    #     WE CAN NOW SEARCH ALL THE FILE AREAS OF THE FILE TO TRY AND   
#XKG    #     MATCH 'OUR CSN'.  
#Y56    #   
#YJQ          LDX   6  FIP+5(3)            [FIND OUT NUMBER OF FILE AREAS   
#^4B          ANDX  6  BSP16
#^J2          BZE   6  NEXTEXOF            [IGNORE IF NO CELLS  
*23L          STO   3  AWORK1(2)           [REMEMBER ADDR OF THIS /EXOF BLOCK   
*2H=    #   
*32W    NEXTCELL
*3GG          BXU   7  FDCELLS(3),STEPON   [JIF FILE AREA NOT IN OUR CARTRIDGE  
*426    #   
*4FQ    #     NOW WE FORMAT THE TWO WORD ELEMENT TO PUT IN THE OBJ PROG BUFFER  
*4^B    #   
*5F2          LDX   0  FDCELLS+1(3)        [START CYLINDER NUMBER   
*5YL          SLL   0  12   
*6D=          ORX   0  FDCELLS+3(3)        [ADD IN NUMBER OF CYLINDERS ETC  
*6XW          STO   0  ACOMMUNE7(2)        [PUT ELEMENT IN ACOMMUNE7/8  
*7CG          LDX   0  FDCELLS+2(3)        [START BLOCK NUMBER IN CYLINDER  
*7X6          SLL   0  12   
*8BQ          ORX   0  FDCELLS+4(3)        [ADD IN NUMBER OF BLOCKS/SEEK AREA   
*8WB          STO   0  ACOMMUNE8(2) 
*9B2    #   
*9TL    #     HAVING PREPARED THE TWO WORD DATA ELEMENT, WE ASSESS WHETHER  
*=*=    #     THERE IS ROOM IN THE BUFFER TO TAKE THE DATA. 
*=SW    #   
*?#G          LDX   0  TASKLEN(2)          [GET CURRENT UNEXPIRED BUFFER LENGTH 
*?S6          SBN   0  2                   [AND DECREMENT LENGTH BY TWO WORDS   
*#?Q          BNG   0  SOVERFLOW           [JIF BUFFER WOULD OVERFLOW   
*#RB          STO   0  TASKLEN(2)          [ELSE REMEMBER NEW UNEXPIRED LENGTH  
**?2    #   
**QL          LDX   1  APETADDR(2)         [PREPARE TO PUT DATA INTO OBJ PROG   
*B==          LDX   5  TASKADDR(2)         [CURRENT OBJ PROG BUFFER ADDRESS 
*BPW          LDN   4  ACOMMUNE7(2)        [GEORGE ADDR FOR DATA ELEMENT
*C9G          LDN   7  2                   [DATA ELEMENT LENGTH 
*CP6          FINMOVE  1,5,4,7,HLOCK2,2,NOTSTART
*D8Q    #   
*DNB          ADS   7  TASKADDR(2)         [UPDATE CURRENT OBJ PROG BUFFER ADDR 
*F82          LDX   7  TASKCSN(2)          [RESTORE 'CSN' WORD FOR COMPARES 
*FML    #   
*G7=    STEPON  
*GLW          ADN   3  6                   [POINT TO NEXT FILE AREA CELL
*H6G          BCT   6  NEXTCELL            [JIF STILL CELLS TO CHECK
*HL6    #   
*J5Q    #     HERE WE HAVE DEALT WITH A COMPLETE FILE AND MUST LOOK FOR 
*JKB    #     ANOTHER   
*K52    #   
*KJL          LDX   3  AWORK1(2)           [RESTORE CURRENT /EXOF BLOCK POINTER 
*L4=          BRN      NEXTEXOF 
*LHW    #   
*M3G    #   
*MH6    SNONELEFT   
*N2Q    #   
*NGB    #     WHEN WE HAVE DEALT WITH ALL THE FILES WE SET THE REPLY WORD   
*P22    #     TO INDICATE HOW MUCH DATA THERE IS IN THE BUFFER  
*PFL    #   
*P^=          LDX   7  TASKADDR(2)         [THE 'NEXT WORD' IN THE BUFFER   
*QDW          ANDX  7  BSB18               [IS IN THE OLPA (MASK TO 18 BITS)
*QYG          BRN      SETREPLY 
*RD6    #   
*RXQ    SOVERFLOW   
*SCB    #   
*SX2    #     IF THE BUFFER IS TOO SMALL, THE REPLY HAS BIT 1 SET AS WELL   
*TBL    #   
*TW=          LDX   7  TASKADDR(2)         ['NEXT WORD' PART OF REPLY   
*W*W          ANDX  7  BSB18               [AGAIN SUITABLY MASKED TO 18 BITS
*WTG          LDCT  0  #200 
*X*6          ORX   7  0                   [SET 'BUFFER OVERFLOW' BIT   
*XSQ          BRN      SETREPLY 
*Y#B    #   
*YS2    #   
*^?L    #   
*^R=    #   
B2=W    #END
^^^^ ...26452123000200000000
  • Last modified: 17/01/2024 11:55
  • by 127.0.0.1