(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
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