{{htmlmetatags>metatag-description:(ICL George 3 and George 4 source: CAFSPERI867)}}
====== CAFSPERI867 ======
(George Source)
**Macros used:** [[george:macro:BXE|BXE]], [[george:macro:BXGE|BXGE]], [[george:macro:BXL|BXL]], [[george:macro:BXU|BXU]], [[george:macro:CAPCA|CAPCA]], [[george:macro:CHAIN|CHAIN]], [[george:macro:CHECKB|CHECKB]], [[george:macro:CHECKEXT|CHECKEXT]], [[george:macro:CHEKPRIV|CHEKPRIV]], [[george:macro:CLOSETOP|CLOSETOP]], [[george:macro:COOR3|COOR3]], [[george:macro:DCA|DCA]], [[george:macro:ENRING|ENRING]], [[george:macro:FADDRESS|FADDRESS]], [[george:macro:FINDACTX|FINDACTX]], [[george:macro:FINMOVE|FINMOVE]], [[george:macro:FOUTMOVE|FOUTMOVE]], [[george:macro:FPCACA|FPCACA]], [[george:macro:GETWORD|GETWORD]], [[george:macro:GPERI|GPERI]], [[george:macro:HUNT2J|HUNT2J]], [[george:macro:HUNTW|HUNTW]], [[george:macro:ILLEGALX|ILLEGALX]], [[george:macro:JNCAFSDV|JNCAFSDV]], [[george:macro:JNCFENBU|JNCFENBU]], [[george:macro:LADDP|LADDP]], [[george:macro:LGEOG|LGEOG]], [[george:macro:LINK|LINK]], [[george:macro:MFREE|MFREE]], [[george:macro:MHUNTW|MHUNTW]], [[george:macro:MONOUT|MONOUT]], [[george:macro:OLPFIN1|OLPFIN1]], [[george:macro:OPENDIR|OPENDIR]], [[george:macro:OUTPACK|OUTPACK]], [[george:macro:READ|READ]], [[george:macro:RUNPROG|RUNPROG]], [[george:macro:SEG|SEG]], [[george:macro:SEGENTRY|SEGENTRY]], [[george:macro:SETNCORE|SETNCORE]], [[george:macro:SETREP|SETREP]], [[george:macro:TESTREP2|TESTREP2]], [[george:macro:TESTRPN2|TESTRPN2]], [[george:macro:TESTTRAP|TESTTRAP]], [[george:macro:TOPCA|TOPCA]], [[george:macro:TOPCA1|TOPCA1]], [[george:macro:UNPLUG|UNPLUG]], [[george:macro:VFREE|VFREE]], [[george:macro:WORDFIN|WORDFIN]]
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