|
|
DataMuseum.dkPresents historical artifacts from the history of: IBM System/3 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about IBM System/3 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 22606 (0x584e)
Types: s3xseg
Names: »S$E055«
└─⟦827b5bd03⟧ Bits:30009184 5702-sc1.V16.ccp
└─⟦f17e99db6⟧
└─⟦this⟧ »S$E055«
MACRO 00010000
$E055 00020000
GBLB &SHR 00030000
GBLB &D45 5445 DISK SUPPORT 00040000
LCLC &# 00050000
TEXT 00060000
AIF (&SHR).SHROK 00070000
MEXIT 00080000
.SHROK ANOP 00090000
&# SETC ' ' 00100000
TITLE 'FILE&#.SHARING&#.ENQUEUE-DEQUEUE&#.ROUTINE&#.-&#.$CC4DI' 00110000
* BEGIN MACRO '$E055' 3/16/73 00120000
*********************************************************************** 00130000
* * 00140000
* TITLE * 00150000
* . FILE SHARING ENQUEUE-DEQUEUE ROUTINE * 00160000
* * 00170000
* NAME * 00180000
* . $CC4DI * 00190000
* * 00200000
* LEVEL * 00210000
* . VERSION 8 MOD LEVEL 0 OF 5702-SC1 * 00220000
* * 00230000
* FUNCTION * 00240000
* . ALLOW FILE SHARING IN UPDATE MODE AMONG THE USER PROGRAMS * 00250000
* WHILE MAINTAINING FILE INTEGRITY. * 00260000
* . ALLOW SEVERAL PROGRAMS TO ACCESS ADDED RECORDS IN INDEXED * 00270000
* FILES CONCURRENTLY WHILE INSURING THAT ONLY ONE DTF IS * 00280000
* ACTUALLY ADDING AT ANY TIME. * 00290000
* * 00300000
* OPERATION * 00310000
* . $CC4DI COMPRISES THREE ROUTINES: * 00320000
* 1. $CC4DI - IOB ENQUEUE-DEQUEUE ROUTINE * 00330000
* 2. $CC4RQ - SQB RELEASE ROUTINE * 00340000
* 3. $CC4AO - ADDER VALIDITY CHECK ROUTINE * 00350000
* * 00360000
* . AT ENTRY TO $CC4DI, INTERCEPTED DISK I/O REQUESTS ARE * 00370000
* EXAMINED. IF THE REQUEST IS A READ AND THE DTF IS OPENED * 00380000
* FOR UPDATE, THEIOB IS ADDED AT THE END OF A QUEUE OF IOB'S * 00390000
* AWAITING ENQUEUED DATA SECTORS, THE SQB OWNED BY THE IOB * 00400000
* (IF ANY) IS LOCATED AND THE SQB RELEASE ROUTINE IS * 00410000
* ENTERED. IF THE REQUEST IS NOT TO READ, OR THE DTF IS NOT * 00420000
* OPENED FOR UPDATE, THE ADDER VALIDITY CHECK ROUTINE IS * 00430000
* ENTERED. * 00440000
* * 00450000
* . THE SQB RELEASE ROUTINE WILL FIRST FREE THE INPUT SQB, THEN * 00460000
* EXAMINE THE IOB QUEUE FOR I/O REQUESTS WHICH MAY NOW BE * 00470000
* HONORED. THE DISK ADDRESS AND N-BYTE OF THE QUEUED IOB * 00480000
* IS COMPARED TO THE DISK ADDRESSES IN EACH ACTIVE SQB FOR * 00490000
* CONFLICT. IF THERE IS NO CONFLICT, THE IOB MAY BE FREED, * 00500000
* AND AN SQB IS BUILT TO REFLECT THE DATA EXTENT OF THE I/O * 00510000
* REQUEST. THE TASK WHICH OWNED THE FREED IOB IS POSTED OUT * 00520000
* OF THE WAIT. ALL IOBS ON THE QUEUE ARE THUS EXAMINED. IF * 00530000
* A QUEUED IOB WHICH CANNOT BE FREED BELONGS TO THE CURRENT * 00540000
* TASK, THE CCP WAIT ROUTINE ($CC4WT) WILL BE INVOKED TO * 00550000
* CAUSE THE CURRENT TASK TO WAIT. * 00560000
* * 00570000
* . THE ADDER VALIDITY CHECK ROUTINE TESTS THE I/O REQUEST TO * 00580000
* DETERMINE IF IT IS AN ADD. IF SO, THE SDF FOR THE FILE IS * 00590000
* LOCATED AND TESTED TO SEE IF THE TASK IS ALLOWED TO ADD. * 00600000
* IF SO, AND NO OTHER DTF IS CURRENTLY ADDING, THE DTF ADDRESS * 00610000
* IS STORED IN THE SDF AND BECOMES THE CURRENT ADDER. * 00620000
* OTHERWISE, THE RESIDENT TERMINATION ROUTINE IS INVOKED * 00630000
* TO TERMINATE THE TASK. * 00640000
* * 00650000
* ENTRY POINTS * 00660000
* . $CC4DI - IOB ENQUE ROUTINE * 00670000
* . $CC4RQ - SQB RELEASE ROUTINE * 00680000
* . RQDPFR - DISK WAIT INTERCEPT ENTRY TO SQB RELEASE * 00690000
* * 00700000
* INPUT * 00710000
* * 00720000
* . XR1 CONTAINING IOB ADDRESS - INPUT TO $CC4DI * 00730000
* . XR2 CONTAINING SQB ADDRESS - INPUT TO SQB RELEASE * 00740000
* OUTPUT * 00750000
* . IOB FIELDS IOBCHN AND IOBTCB MODIFIED FOR QUEUED IOB * 00760000
* . SQB BUILT OR FREED * 00770000
* * 00780000
* EXTERNAL REFERENCES * 00790000
* . CCPSAV - SAVE REGISTERS ROUTINE * 00800000
* . CCPRET - RETURN ROUTINE * 00810000
* . $CC4WT - WAIT ROUTINE * 00820000
* . CC4TI2 - RESIDENT TERMINATION ROUTINE * 00830000
* * 00840000
* EXITS, NORMAL * 00850000
* . RETURN TO CALLER VIA CCPRET * 00860000
* . RETURN TO DISK WAIT INTERCEPT VIA ARR * 00870000
* * 00880000
* EXITS, ERROR * 00890000
* . CC4TI2 - TO TERMINATE AN INVALID ADDER * 00900000
* * 00910000
* TABLES * 00920000
* . $CCCOM * 00930000
* . IOB * 00940000
* . DTF * 00950000
* . SQB * 00960000
* . SDF * 00970000
* * 00980000
* ATTRIBUTES * 00990000
* . RESIDENT * 01000000
* . REUSEABLE * 01010000
* * 01020000
*********************************************************************** 01030000
SPACE 2 01040000
*------EQUATES DEFINED WITHIN THIS MODULE-----------------------------* 01050000
SPACE 2 01060000
DTFCHA EQU 5 OPEN DTF CHAIN POINTER 01070000
DTFOPC EQU 15 DTF OP CODE FIELD 01080000
DTFUPD EQU X'02' DTF ATTRIBUTE FOR UPDATE 01090000
DTFOPU EQU X'20' DTF OP-CODE FOR UPDATE 01100000
DTFOPA EQU X'40' DTF OP-CODE FOR ADD 01110000
DTFOPR EQU X'80' DTF OP CODE FOR READ 01120000
SPACE 1 01130000
DFNDTF EQU 1 SHORT DTF CHAIN FIELD 01140000
DFCHN EQU 3 ORIGIN OF OPEN DTF CHAIN 01150000
DFADD EQU 13 VALID ADD INDICATORS 01160000
DFADTF EQU 21 @ OF CURRENT ADDING DTF 01170000
SPACE 1 01180000
*------REGISTER EQUATES FOR SQB SEARCH ROUTINE------------------------* 01190000
SPACE 1 01200000
DIOLD EQU XR2 INDEX REG FOR OWNING IOB 01210000
DINEW EQU XR1 INDEX REG FOR WANTING IOB 01220000
CSREG EQU XR2 C/S TABLE REGISTER 01230000
EJECT 01240000
*---------------------------------------------------------------------* 01250000
* BEGINNING OF $CC4DI - SQB ENQ/DEQ ROUTINE * 01260000
*---------------------------------------------------------------------* 01270000
SPACE 2 01280000
$CC4DI ST CCARR,ARR SAVE THE INVOKER'S ARR 01290000
B CCPSAV SAVE INPUT REGISTERS 01300000
SPACE 1 01310000
CLC IOBDTF(2,XR1),CCXR2 IS THIS AN INDEX IOB ? 01320000
BNE $CC4AO YES, FORGET ENQ/DEQ 01330000
CLI $CCCOM+#MAXUS,X'01' IS THIS A MULTI-TASKING RUN ? 01340000
BE $CC4AO NO, FORGET ENQ/DEQ 01350000
SPACE 1 01360000
L IOBDTF(,XR1),XR2 GET IOB DTF @ VALUE 01370000
SPACE 1 01380000
*------ DETERMINE IF THIS IS AN UPDATE DTF DOING A READ --------------* 01390000
SPACE 1 01400000
SPACE 1 01410000
TBN DTFATR-1(,XR2),DTFUPD IS THIS AN UPDATE DTF? 01420000
TBN IOBQB(,XR1),READ IS THIS A READ OPERATION? 01430000
BF $CC4AO NOT UPDATE AND READ, EXIT TO 01440000
* ADDER VALIDITY CHECK ROUTINE 01450000
EJECT 01460000
*---------------------------------------------------------------------* 01470000
* QUEUE THE IOB ONTO THE DISK IOB QUEUE, CLEAR ANY EXISTING SQB * 01480000
* FOR THE READ IOB, AND GO BUILD ANOTHER SQB FOR THE NEW READ * 01490000
* OPERATION IN THE CCP RELEASE SQB ROUTINE * 01500000
*---------------------------------------------------------------------* 01510000
SPACE 1 01520000
LA DIIOBQ,XR2 GET THE @ OF THE IOB QUE PTR 01530000
SPACE 1 01540000
DICKIQ CLC IOBCHN(2,XR2),CC0000 ANY IOB'S IN THE PENDING QUE? 01550000
JE DIQIT NO, GO QUEUE THE NEW IOB 01560000
SPACE 1 01570000
*------ARE IOB'S IN QUEUE, GO TO END OF QUEUE-------------------------* 01580000
SPACE 1 01590000
L IOBCHN(,XR2),XR2 GET @ OF NEXT IOB AND SEE IF 01600000
* THERE ARE MORE 01610000
B DICKIQ SEE IF MORE IOB'S ARE QUEUED 01620000
SPACE 2 01630000
*------END OF QUEUE REACHED, PUT THIS IOB ONTO THE BOTTOM-------------* 01640000
SPACE 1 01650000
DIQIT ST IOBCHN(,XR2),XR1 QUEUE THE CURRENT IOB OFF OF THE 01660000
* LAST ONE IN THE QUEUE 01670000
SLC IOBCHN(2,XR1),IOBCHN(,XR1) MAKE THE CURRENT IOB THE LAST 01680000
LA $CCCOM,XR2 GET @ OF C.C.P. COMM. AREA 01690000
SPACE 1 01700000
*------SAVE THE @ OF THE CURRENT TASK IN THE QUEUED IOB---------------* 01710000
SPACE 1 01720000
MVC IOBTCB(2,XR1),@CURTB(,XR2) SET THE @ OF THE TCB WHICH THIS 01730000
* IOB BELONGS TO 01740000
SPACE 1 01750000
*---------------------------------------------------------------------* 01760000
* FREE ANY SQB THAT MIGHT BE ASSOCIATED WITH THIS IOB * 01770000
*---------------------------------------------------------------------* 01780000
SPACE 1 01790000
L @SQB(,XR2),XR2 GET @ OF SQB LIST START 01800000
SPACE 1 01810000
DICLC1 CLC SQBIOB(2,XR2),CCXR1 DOES THIS SQB 'BELONG' TO THE 01820000
* CURRENTLY INPUT IOB? 01830000
JNE DI0010 NO, SKIP TO NEXT SQB 01840000
SPACE 1 01850000
*------IOB @ MATCHES, INSURE THAT TCB @ DOES TOO----------------------* 01860000
SPACE 1 01870000
CLC SQBTCB(2,XR2),IOBTCB(,XR1) DOES THE SQB @ THE CURRENT TCB? 01880000
JE RQRSQB YES, GO TO SQB RELEASE ROUTINE 01890000
SPACE 1 01900000
*------SQB NOT FOUND YET, SEE IF THERE ARE MORE SQB'S-----------------* 01910000
SPACE 1 01920000
DI0010 TBN SQBFLG(,XR2),SQBLST IS THIS THE 'LAST ' SQB? 01930000
LA SQBLN(,XR2),XR2 STEP TO NEXT IN CASE=NO 01940000
BF DICLC1 NO LAST SQB, CHECK NEXT SQB 01950000
SPACE 1 01960000
*------GO TO SQB RELEASE LOGIC----------------------------------------* 01970000
SPACE 1 01980000
J $CC4RR GO TO INTERNAL EPA OF SQB RELSE 01990000
EJECT 02000000
*---------------------------------------------------------------------* 02010000
*------AT ENTRY XR2 IS THE @ OF THE SQB TO FREE-----------------------* 02020000
SPACE 1 02030000
RQDPFR EQU * DISPATCHER'S ENTRY POINT TO 02040000
* FREE THE SQB FOR THE IOB WHICH 02050000
* JUST COMPLETED. 02060000
MVI RQDPSW+1,BRNOP SET DISPATCHER EXIT SWITCH 02070000
ST RQDPRA+3,ARR SAVE THE RETURN ADDRESS 02080000
ST RQSRX1+3,XR1 SAVE THE INPUT XR1 02090000
J RQRSQB GO RELEASE THE SQB 02100000
SPACE 02110000
DIIOBQ EQU * LEFT-HAND ADDRESSING EQUATE 02120000
DC AL2(####) @ OF FIRST DISK IOB ENQUEUED 02130000
$CC4RQ ST CCARR,ARR SAVE THE INPUT ARR 02140000
B CCPSAV SAVE THE INPUT REGISTERS IN TCB 02150000
SPACE 1 02160000
RQRSQB EQU * INTERNAL ENTRY POINT FROM 02170000
* SQB ENQUEUE ROUTINE TO RELEASE 02180000
* WITHOUT SAVING REGISTERS 02190000
SPACE 1 02200000
SBN SQBFLG(,XR2),SQBFRE INDICATE AVAILABLE SQB 02210000
SBF SQBFLG(,XR2),SQBOWN TURN OFF 'OWNED' DATA BIT 02220000
SPACE 1 02230000
*------ENTRY POINT WHEN THE IOB HAD NO PRIOR SQB TO RELEASE-----------* 02240000
SPACE 1 02250000
$CC4RR EQU * INTERNAL EPA # 2 02260000
MVI RQWASW+1,BR97 SET EXIT SWITCH TO 'NOT WAIT' 02270000
SPACE 1 02280000
*---------------------------------------------------------------------* 02290000
* SCAN THE CHAIN OF ENQUEUED DISK IOB'S AND RELEASE THEM ONE AT * 02300000
* A TIME DEPENDING UPON THE AVAILABILITY OF SQB'S. THE CURRENT * 02310000
* IOB IS ON THE BOTTOM OF THE CHAIN AND WILL BE PROCESSED LAST * 02320000
*---------------------------------------------------------------------* 02330000
LA DIIOBQ,XR2 GET THE @ OF THE START OF THE 02340000
* ENQUEUED IOB CHAIN 02350000
SPACE 1 02360000
RQCKIB CLC IOBCHN(2,XR2),CC0000 ANY (MORE) QUEUED IOB'S? 02370000
JNE RQ0010 YES, GO PROCESS THIS ONE 02380000
SPACE 1 02390000
*---------------------------------------------------------------------* 02400000
* END OF ENQUEUED IOB'S, DETERMINE HOW TO EXIT, EITHER WITH * 02410000
* A WAIT FOR THE CURRENT TASK OR DIRECTLY TO THE INVOKER * 02420000
*---------------------------------------------------------------------* 02430000
SPACE 1 02440000
RQDPSW JC RQWASW,BR97+## JUMP IF NOT INVOKED BY DISPATCHR 02450000
MVI RQDPSW+1,BR97 RESET DISP ENTRY SWITCH 02460000
RQSRX1 LA ####,XR1 RESTORE INPUT XR1 02470000
RQDPRA B #### RETURN TO DISPATCHER VIA ARR 02480000
SPACE 02490000
RQWASW JC RQRET,BR97+## EXIT WITH OR WITHOUT WAIT??? 02500000
SPACE 1 02510000
*------WAIT FOR DATA AVAILABILITY FOR THE CURRENT TASK----------------* 02520000
SPACE 1 02530000
B $CC4WT GO TO CCP WAIT 02540000
DC AL2(256*WPASQB) ENQ'D DATA WAIT MASK 02550000
DC AL1(1) WAIT COUNT OF ONE 02560000
DC AL1(DPREG+DPDSP) WAIT AND SAVE REG'S 02570000
SPACE 1 02580000
*------WHEN WAITING TASK RESUMES, AN SQB WILL HAVE BEEN BUILT AND THE-* 02590000
*------TASK WILL BE READY TO RUN--------------------------------------* 02600000
SPACE 1 02610000
RQRET B CCPRET RETURN, EITHER TO INVOKER OR TO 02620000
* CCP DISK INTERCEPT TO CONTINUE 02630000
* (IF TASK WAS WAITED FOR C/S/N) 02640000
SPACE 1 02650000
EJECT 02660000
*---------------------------------------------------------------------* 02670000
* DETERMINE IF AN SQB CAN BE ALLOCATED TO THE IOB JUST FOUND * 02680000
*---------------------------------------------------------------------* 02690000
SPACE 1 02700000
RQ0010 ST RQSAVQ,XR2 SAVE THE @ OF WHAT JUST POINTED 02710000
* TO THIS IOB 02720000
SPACE 1 02730000
L IOBCHN(,XR2),XR2 GET @ OF IOB TO TEST 02740000
SPACE 02750000
SPACE 02760000
*---------------------------------------------------------------------* 02770000
* CALCULATE THE BEGINNING AND ENDING DISK ADDRESSES OF THE IOB * 02780000
*---------------------------------------------------------------------* 02790000
SPACE 02800000
LA DINEWT,XR1 LOAD @ OF THE CALC WORK AREA 02810000
USING DINEWT,XR1 02820000
MVC DINQB(1,XR1),IOBQB(,XR2) MOVE THE IOB Q-BYTE 02830000
SBF DINQB(,XR1),BIT5+BIT6+BIT7 TURN OFF NON-DEVICE BITS 02840000
SPACE 02850000
AIF (&D45 NE '1').DIN45 SKIP IF NOT 5445 SUPPORT 02860000
TBN IOBQB(,XR2),DEV45 IS THIS A 5445 IOB ? 02870000
JT DICALC YES, GO CALC C/H/R @ 02880000
SPACE 02890000
*------ DEVICE IS A 5444 ---------------------------------------------* 02900000
SPACE 02910000
.DIN45 ANOP 02920000
MVC DINBEG-1(2,XR1),IOBSB(,XR2) MOVE IOB C/S TO WORK AREA 02930000
MVI DINBEG(,XR1),X'00' ZERO UNUSED BYTE FOR 5444 02940000
MVC DINEND(3,XR1),DINBEG(,XR1) MOVE C/S TO CALC AREA 02950000
MVC DINBYT(1,XR1),IOBNB(,XR2) MOVE N-BYTE 02960000
SPACE 02970000
DIADD ALC DINEND-1(2,XR1),CC0004 STEP THE C/S BY ONE SECTOR 02980000
TBN DINEND-1(,XR1),X'60' TEST FOR VALID C/S 02990000
BT DIADD KEEP ADDING UNTIL C/S IS VALID 03000000
ALC DINBYT(1,XR1),DIFF(,XR1) SUB ONE FROM N-BYTE 03010000
JNOL RQDEVT IF MINUS, WE'RE DONE 03020000
B DIADD ADD UNTIL # OF SECTORS MINUS 03030000
SPACE 03040000
AIF (&D45 NE '1').DONE SKIP IF NO 5445 SUPPORT 03050000
*------ DEVICE IS A 5445 ---------------------------------------------* 03060000
SPACE 03070000
DICALC MVC DINBEG(3,XR1),IOBR(,XR2) MOVE IOB C/H/R TO WORK AREA 03080000
MVC DINBYT(4,XR1),IOBN(,XR2) MOVE C/H/R/N TO CALC AREA 03090000
SPACE 03100000
DIADD5 ALC DINEND(1,XR1),CC0001 ADD ONE TO RECORD # 03110000
CLI DINEND(,XR1),X'15' VALID RECORD ADDRESS ? 03120000
JNE DISUB YES, JUMP 03130000
MVI DINEND(,XR1),X'01' SET RECORD @ TO FIRST ON TRK 03140000
ALC DINEND-1(1,XR1),CC0001 ADD ONE TO TRACK @ 03150000
CLI DINEND-1(,XR1),X'14' VALID TRACK @ ? 03160000
JNE DISUB YES, JUMP 03170000
MVI DINEND-1(,XR1),X'00' SET TRACK @ FIRST ON CYL 03180000
ALC DINEND-2(1,XR1),CC0001 BUMP CYLINDER @ 03190000
DISUB ALC DINBYT(1,XR1),DIFF(,XR1) SUB ONE FROM N-BYTE 03200000
BOL DIADD5 LOOP UNTIL N-BYTE GOES MINUS 03210000
.DONE ANOP 03220000
DROP XR1 03230000
EJECT 03240000
*------GET THE @ OF THE FIRST SQB IN THE SYSTEM-----------------------* 03250000
SPACE 1 03260000
RQDEVT EQU * 03270000
LA $CCCOM,XR1 GET @ OF CCP COMM. AREA 03280000
L @SQB(,XR1),XR1 GET @ OF FIRST SQB 03290000
SPACE 1 03300000
DIBACK TBN SQBFLG(,XR1),SQBFRE IS THIS SQB 'ACTIVE' 03310000
JT RQOK1 NO, GO TO NEXT SQB 03320000
SPACE 1 03330000
*------DETERMINE IF THE SQB AND IOB HAVE THE SAME DEVICE TYPE---------* 03340000
SPACE 1 03350000
CLC SQBQB(1,XR1),DINQB DO THE IOB AND SQB ADDRESS 03360000
* THE SAME DISK DEVICE ? 03370000
JNE RQOK1 NOT SAME DEVICE, O.K. TO DEQ IOB 03380000
SPACE 1 03390000
*---------------------------------------------------------------------* 03400000
* DETERMINE IF THIS IOB'S NEEDED C/S/N'S CONFLICT WITH THE * 03410000
* CURRENT SQB BEING LOOKED AT * 03420000
*---------------------------------------------------------------------* 03430000
SPACE 1 03440000
CLC DINEND(3),SQBBEG(,XR1) DOES THE END OF THE NEW 03450000
* IOB COME AFTER THE START OF THE 03460000
* RELEASED SQB? 03470000
JNH RQOK1 NO, THEREFORE IS O.K. TO DEQ IOB 03480000
SPACE 1 03490000
*------YES, CHECK FOR ADDITIONAL CONFLICT-----------------------------* 03500000
SPACE 1 03510000
CLC DINBEG(3),SQBEND(,XR1) DOES THE IOB'S BEGINNING DISK @ 03520000
* COME AFTER THE RELEASED SQB'S 03530000
* ENDING C/S?? 03540000
JNL RQOK1 YES, THEREFORE IS GO TO DEQ 03550000
SPACE 1 03560000
*------THE C/S/N'S CONFLICT, SEE IF THEY BELONG TO THE SAME TASK------* 03570000
SPACE 1 03580000
CLC SQBTCB(2,XR1),IOBTCB(,XR2) IS THE 'OWNING TCB OF THE DATA 03590000
* THE SAME AS THE 'WANTORS' TCB 03600000
JE RQOK1 YES, THERE THEREFORE THE IOB 03610000
* CAN BE DEQUED AND PROCEED 03620000
SPACE 1 03630000
EJECT 03640000
*---------------------------------------------------------------------* 03650000
* NOTE--C.C.P. FILE SHARING DOES NOT PROTECT THE USER FROM * 03660000
* HAVING THE SAME DATA IN CORE FOR TWO DIFFERENT DTF'S. * 03670000
*---------------------------------------------------------------------* 03680000
SPACE 3 03690000
*---------------------------------------------------------------------* 03700000
* NOT SAME TCB, SO SEE IF THE WANTING IOB'S TCB IS THE CURRENT * 03710000
* TASK CONTROL BLOCK * 03720000
*---------------------------------------------------------------------* 03730000
SPACE 1 03740000
RQ0020 CLC IOBTCB(2,XR2),CCURTB IS THE WANTING IOB'S TCB 03750000
* THE CURRENT TASK? 03760000
BNE RQCKIB NO, DON'T SET WAIT SWITCH ON 03770000
SPACE 1 03780000
*------YES, THERE FORE SET EXIT LOGIC TO WAIT-------------------------* 03790000
SPACE 1 03800000
MVI RQWASW+1,BRNOP SET EXIT LOGIC TO DROP INTO WAIT 03810000
B RQCKIB AND GO CHECK FOR MORE IOB'S 03820000
SPACE 2 03830000
RQOK1 TBN SQBFLG(,XR1),SQBLST END OF ALL SQB'S YET? 03840000
LA SQBLN(,XR1),XR1 STEP TO NEXT IN CASE NOT 03850000
BF DIBACK AND LOOP IS NOT YET DONE 03860000
SPACE 1 03870000
*---------------------------------------------------------------------* 03880000
* DONE WITH SQB CHECKING, GO BUILD AN SQB FOR THE IOB CURRENTLY * 03890000
* BEING PROCESSED * 03900000
*---------------------------------------------------------------------* 03910000
EJECT 03920000
*---------------------------------------------------------------------* 03930000
* O.K. TO RELEASE THIS IOB, SEE IF ANY SQB'S ARE AVAILABLE * 03940000
*---------------------------------------------------------------------* 03950000
SPACE 1 03960000
LA $CCCOM,XR1 GET @ OF CCP COMM. AREA 03970000
L @SQB(,XR1),XR1 GET @ OF SQB LIST 03980000
SPACE 1 03990000
RQCK02 TBN SQBFLG(,XR1),SQBFRE IS THIS A FREE SQB? 04000000
JT RQDEQI YES, GO DEQ IOB AND ENQ DATA 04010000
SPACE 1 04020000
*------NOT AVAILABLE, STEP TO NEXT SQB--------------------------------* 04030000
SPACE 1 04040000
TBN SQBFLG(,XR1),SQBLST IS THIS THE LAST SQB? 04050000
LA SQBLN(,XR1),XR1 STEP TO NEXT IN CASE = NO 04060000
BF RQCK02 NOT LAST , GO TO NEXT ONE 04070000
SPACE 1 04080000
*------NONE AVAILABLE, TERMINATE THE TASK-----------------------------* 04090000
SPACE 1 04100000
B CC4TI2 GO TO TERMINATION ROUTINE 04110000
DC AL1(TCCSQB) COMPLETION CODE - INSUFF SQB'S 04120000
EJECT 04130000
*---------------------------------------------------------------------* 04140000
* DEQUEUE THE WAITING IOB AND ENQ THE DATA WHICH IT WANTS * 04150000
* XR1=AVAILABLE SQB @ * 04160000
* XR2=WAITING IOB @ * 04170000
*---------------------------------------------------------------------* 04180000
SPACE 1 04190000
SPACE 1 04200000
RQDEQI ALC RQDQMV+3(2),CC0001 STEP THE MOVE TO @ TO THE RIGHT 04210000
* HAND END 04220000
RQDQMV MVC ####(2),IOBCHN(,XR2) MEND THE WAITING IOB CHAIN BY 04230000
* POINTING WHAT THIS IOB POINTS TO 04240000
* TO WHAT POINTED TO THIS IOB 04250000
RQSAVQ EQU RQDQMV+3 SAVED IOB CHAIN POINTER 04260000
SPACE 1 04270000
*------BUILD AN SQB FOR THIS IOB--------------------------------------* 04280000
SPACE 1 04290000
ST SQBIOB(,XR1),XR2 SET IOB @ INTO SQB 04300000
SPACE 1 04310000
MVC SQBTCB(2,XR1),IOBTCB(,XR2) SET 'OWNING' TCB @ INTO SQB 04320000
SPACE 1 04330000
SBF SQBFLG(,XR1),SQBFRE INDICATE NOT-FREE SQB 04340000
SBN SQBFLG(,XR1),SQBOWN INDICATE 'OWNED' SQB 04350000
SPACE 1 04360000
*------SET UP THE DATA ADDRESSES ENQUEUED BY THIS SQB-----------------* 04370000
SPACE 1 04380000
MVC SQBEND(7,XR1),DINEND SET DEVICE Q-BYTE AND 04390000
* STARTING AND ENDING DISK 04400000
* ADDRESSES INTO THE SQB 04410000
SPACE 1 04420000
*------DETERMINE WHETHER A WAITING TASK NEEDS POSTING-----------------* 04430000
SPACE 1 04440000
CLC IOBTCB(2,XR2),CCURTB DOES THE IOB BELONG TO THE 04450000
* CURRENT TASK? 04460000
JE RQCKBK YES, SKIP POST 04470000
SPACE 1 04480000
*------NO, POST THE WAITING TASK--------------------------------------* 04490000
SPACE 1 04500000
MVC RQPST@(2),IOBTCB(,XR2) SET @ OF POSTEE (TCB) 04510000
SPACE 1 04520000
B $CC4PS GO TO C.C.P. POST 04530000
DC AL2(256*WPASQB) ENQUEED DATA POST MASK 04540000
RQPST@ DC AL2(####) @ OF TCB TO POST (POSTEE) 04550000
SPACE 1 04560000
*------MEND THE CHAIN ADDRESS AND LOOP BACK FOR MORE WORK TEST--------* 04570000
SPACE 1 04580000
RQCKBK SLC RQSAVQ(2),CC0001 DECREMENT FOR CORRECT @ VALUE 04590000
L RQSAVQ,XR2 GET @ OF PRIOR CHAIN POINTER 04600000
B RQCKIB AND LOOP FOR MORE WORK 04610000
EJECT 04620000
*---------------------------------------------------------------------* 04630000
* DATA AREAS FOR THE CONFLICT TESTS * 04640000
*---------------------------------------------------------------------* 04650000
SPACE 1 04660000
*------TABLE FOR THE 'WANTORS' START + END C/S VALUES 04670000
SPACE 04680000
DINEWT EQU * START OF 'WANTORS' TABLE 04690000
DINQB DS XL1 'WANTORS' Q-BYTE 04700000
DINBEG DS XL3 BEGIN DISK ADDRESS 04710000
DINEND DS XL3 ENDING DISK ADDRESS+1 04720000
DINBYT DS XL1 'WANTORS' N-BYTE 04730000
SPACE 04740000
DIFF DC XL1'FF' CONSTANT FOR DECREMENTING N-BYTE 04750000
SPACE 04760000
TITLE 'FILE&#.SHARING&#.ADDING&#.VALIDITY&#.CHECK&#.ROUTINE&#.' 04770000
*********************************************************************** 04780000
* IF CLOSE IS DOING THE I/O, EXIT IMMEDIATELY * 04790000
*********************************************************************** 04800000
SPACE 04810000
$CC4AO L CCURTB,XR2 LOAD CURRENT TCB @ 04820000
TBN TCBDMG(,XR2),TCBOCF IS CLOSE PURGING THIS IOB ? 04830000
JT AORETN YES, FORGET SINGLE ADDER CHECK 04840000
SPACE 2 04850000
*********************************************************************** 04860000
* INITIALIZE THE TEST INSTRUCTION WITH THE TCB'S FILE BIT MASK * 04870000
*********************************************************************** 04880000
SPACE 04890000
MVC AOTSTA+1(1),TCBFBM(,XR2) STORE THE TCB FILE BIT MASK 04900000
SPACE 2 04910000
*********************************************************************** 04920000
* EXIT IF THE CURRENT OPERATION IS NOT AN ADD * 04930000
*********************************************************************** 04940000
SPACE 04950000
L CCXR2,XR2 LOAD INPUT DTF @ 04960000
TBN DTFOPC(,XR2),DTFOPA IS THIS AN ADD ? 04970000
JF AORETN NO, EXIT 04980000
SPACE 04990000
SPACE 05000000
*********************************************************************** 05010000
* THE OPERATION IS AN ADD AND THE CALLER IS NOT CLOSE. FIND THE * 05020000
* SHORT DTF FOR THE CALLER'S DTF. * 05030000
*********************************************************************** 05040000
SPACE 05050000
LA $CCCOM,XR2 LOAD @ OF CCCOM 05060000
L @DFCT(,XR2),XR2 GET THE FIRST SHORT DTF @ 05070000
SPACE 05080000
AONSDF ST AODFND+3,XR2 SAVE THIS SHORT DTF @ 05090000
CLI DFCHN-1(,XR2),X'00' ANY OPEN DTFS ON THIS CHAIN 05100000
JE AONEXT NO, GET THE NEXT SHORT DTF 05110000
SPACE 05120000
CLC DFCHN(2,XR2),CCXR2 IS THIS DTF ADDRESSED BY THE IOB 05130000
L DFCHN(,XR2),XR2 LOAD DTF @ 05140000
JE AODFND YES, JUMP TO TEST 05150000
SPACE 05160000
AONDTF CLI DTFCHA-1(,XR2),X'00' LAST DTF ON THE OPEN CHAIN ? 05170000
JE AONEXT YES, GET THE NEXT SHORT DTF 05180000
SPACE 05190000
CLC DTFCHA(2,XR2),CCXR2 ) DOES THE NEXT DTF MATCH IOB DTF 05200000
L DTFCHA(,XR2),XR2 LOAD NEXT DTF @ ANYWAY 05210000
JE AODFND YES, JUMP 05220000
B AONDTF NO, TRY THE NEXT 05230000
SPACE 05240000
AONEXT L AODFND+3,XR2 RESTORE SHORT DTF @ 05250000
L DFNDTF(,XR2),XR2 LOAD @ OF NEXT DTF 05260000
B AONSDF GO TRY THIS OPEN CHAIN 05270000
SPACE 2 05280000
*********************************************************************** 05290000
* THE SHORT DTF HAS BEEN LOCATED. INSURE THAT THE CURRENT * 05300000
* TASK IS A VALID ADDER TO THIS FILE. * 05310000
*********************************************************************** 05320000
SPACE 05330000
AODFND LA ####,XR2 LOAD @ OF THE SHORT DTF 05340000
AOTSTA TBN DFADD(,XR2),## IS THIS TASK ALLOWED TO ADD ? 05350000
JF AOABND NO, GO TERMINATE HIM 05360000
SPACE 2 05370000
*********************************************************************** 05380000
* IF NO OTHER DTF IS ADDING TO THE FILE, MAKE THIS DTF THE * 05390000
* CURRENT ADDER. IF AN ADDER IS ALREADY ON THE FILE, INSURE THAT *05400000
* IT IS THIS DTF. * 05410000
*********************************************************************** 05420000
SPACE 05430000
CLI DFADTF-1(,XR2),X'00' IS ANYONE ALREADY ADDING ? 05440000
JE AOFADR NO, JUMP 05450000
SPACE 05460000
CLC DFADTF(2,XR2),CCXR2 IS THIS DTF THE CURRENT ADDER ? 05470000
JNE AOABND TWO ADDERS TABOO, GO TERMINATE 05480000
AOFADR MVC DFADTF(2,XR2),CCXR2 MAKE THIS DTF THE CURRENT ADDER 05490000
SPACE 05500000
*********************************************************************** 05510000
* RETURN TO THE CALLER IF EVERYTHING IS OK. TERMINATE THE TASK * 05520000
* IF NOT. * 05530000
*********************************************************************** 05540000
SPACE 05550000
SPACE 05560000
AORETN B CCPRET RETURN 05570000
SPACE 05580000
AOABND B CC4TI2 GO TO ABNORMAL TERM ROUTINE 05590000
DC AL1(TCCIVA) 05600000
SPACE 1 05610000
* END MACRO $E055 05620000
MEND 05630000