SCT TITLE 'DMSSCT (CMS) VM/370 - RELEASE 6' 00001000 SPACE 2 00002000 *. 00003000 * 00004000 * 00005000 * MODULE NAME: 00006000 * 00007000 * DMSSCT (SOCNTRL) 00008000 * 00009000 * FUNCTION: 00010000 * 00011000 * TO HANDLE OS NOTE, POINT, CHECK AND FIND (TYPE C) MACROES 00012000 * DMSSCT ALSO HANDLES QSAM I/O ERRORS FOR DMSSQS 00013000 * AND PDS (PARTITIONED DATA SET) AND KEYS ERRORS FOR 00014000 * DMSSOP. 00015000 * 00016000 * ATTRIBUTES: 00017000 * 00018000 * REENTRANT, NUCLEUS RESIDENT 00019000 * 00020000 * ENTRY POINTS: 00021000 * 00022000 * DMSSCTNP - OS NOTE, POINT OR FIND (TYPE C) MACRO 00023000 * DMSSCTCK - OS CHECK MACRO 00024000 * DMSSCTCE - DMSSQS, DMSSOP 00025000 * 00026000 * ENTRY CONDITIONS: 00027000 * 00028000 * DMSSCTNP - OS NOTE, POINT OR FIND (TYPE C) MACRO 00029000 * DMSSCTCK - OS CHECK MACRO 00030000 * DMSSCTCE - R2 - A(DCB) 00031000 * R6 - A(DECB) 00032000 * R11 - A(FCB) 00033000 * R12 - A(DMSSCTCK) 00034000 * R13 - A(SAVE AREA) 00035000 * 00036000 * 00037000 * EXIT CONDITIONS: 00038000 * 00039000 * NOTE, POINT AND FIND - 00040000 * CONTROL IS RETURNED TO THE USER 00041000 * 00042000 * CHECK AND DMSSCTCE - 00043000 * IF NO ERROR FLAGS ARE SET IN THE ECB OR DECB, CONTROL 00044000 * IS RETURNED TO THE USER. IF THE ECB INPUT 00045000 * END-OF-DATA (EODAD) FLAG IS SET, CONTROL IS GIVEN TO 00046000 * THE EODAD ROUTINE. IF OTHER DECB OR ECB ERROR FLAGS 00047000 * ARE SET, THE ERROR ANALYSIS (SYNAD) ROUTINE IS GIVEN 00048000 * CONTROL, OR, IF NO ERROR ANALYSIS ROUTINE IS 00049000 * PROVIDED, ERROR MSG DMSSCT120S IS TYPED OUT AND 00050000 * THE TASK IS ABNORMALLY TERMINATED. 00051000 * 00052000 * CALLS TO OTHER ROUTINES: 00053000 * 00054000 * NOTE, POINT AND FIND - DMSROS 00055000 * CHECK AND DMSSCTCE - EODAD ROUTINE, SYNAD ROUTINE, DMSSVT, 00056000 * DMSSAB, DMSERR 00057000 * 00058000 * EXTERNAL REFERENCES: 00059000 * 00060000 * IHADECB, IHADCB, OPSECT, NUCON, FCBSECT 00061000 * 00062000 * TABLES/WORKAREAS: 00063000 * 00064000 * NONE 00065000 * 00066000 * REGISTER USAGE: 00067000 * 00068000 * NOTE AND POINT - R0,R3-R10,R10,R12,R14 - WORK 00069000 * R1 - A(DECB) 00070000 * R2 - A(DCB) 00071000 * R11 - A(FCB) 00072000 * R13 - A(SAVE AREA) 00073000 * R15 - A(DMSSCT) 00074000 * 00075000 * FIND - R12 - A(DMSSCT) 00076000 * R15 - A(FCB) 00077000 * R1 - A(DCB) 00078000 * 00079000 * CHECK AND DMSSCTCE - R0,R1,R3-R5,R7-R10,R14,R15-WORK 00080000 * R2 - A(DCB) 00081000 * R6 - A(DECB) 00082000 * R11 - A(FCB) 00083000 * R12 - A(DMSSCTCK) 00084000 * R13 - A(SAVE AREA) 00085000 * 00086000 * OPERATION OF DMSSCT MACRO SIMULATION ROUTINES: 00087000 * 00088000 * *NOTE (BSAM, BDAM) 00089000 * 00090000 * OPERATION: 00091000 * 00092000 * UPON ENTRY TO NOTE, A CHECK IS MADE TO DETERMINE IF 00093000 * THE DCB REFERS TO AN OS DISK. IF IT DOES, DMSROS IS 00094000 * CALLED TO GET THE CURRENT TTR AND CONTROL IS RETURNED 00095000 * TO THE USER. OTHERWISE, A CHECK IS MADE TO SEE IF A POINT 00096000 * WAS JUST ISSUED. IF NOT, THE ITEM NUMBER OF NEXT 00097000 * RECORD TO BE PROCESSED IS LOADED FROM FCBITEM INTO 00098000 * REGISTER 1, REGISTER 1 IS DECREMENTED BY 1 AND 00099000 * CONTROL IS RETURNED TO THE USER. IF A POINT WAS JUST 00100000 * ISSUED, REGISTER 1 IS LOADED WITH THE VALUE IN 00101000 * DCBFDAD AND CONTROL IS RETURNED TO THE USER. 00102000 * 00103000 * *CHECK (BDAM, BSAM, BPAM) 00104000 * 00105000 * OPERATION: 00106000 * 00107000 * CHECK IS CALLED BY DMSSQS, DMSSOP, AND OS CHECK MACROES. 00108000 * UPON ENTRY, THE 00109000 * DECB OR ECB IS TESTED FOR I/O ERRORS. IF THERE ARE 00110000 * NO ERRORS, CONTROL IS RETURNED TO THE USER. IF AN 00111000 * ECB END-OF-DATA-SET FLAG IS ON, THE EODAD ROUTINE IS 00112000 * GIVEN CONTROL. IF AN EODAD ROUTINE IS NOT SPECIFIED OR 00113000 * IF THE ERROR WAS OTHER THAN END OF FILE, THE SYNAD 00114000 * ROUTINE IS GIVEN CONTROL. IF NO SYNAD ROUTINE IS 00115000 * SPECIFIED, THE SYNADAF, DMSERR, AND SYNADRLS MACROES 00116000 * ARE USED TO TYPE OUT ERROR MSG. DMSSCT120S AND THE TASK IS 00117000 * ABENDED WITH A SYSTEM CODE. 00118000 * 00119000 * *POINT (BSAM, BDAM, BPAM) 00120000 * 00121000 * OPERATION: 00122000 * 00123000 * THE POINT ROUTINE IS CALLED BY THE USER. UPON ENTRY, 00124000 * A CHECK IS MADE TO DETERMINE IF THE DCB REFERS TO 00125000 * AN OS DISK. IF IT DOES, DMSROS IS CALLED TO RESET 00126000 * THE CURRENT TTR, CKCONCAT IS CALLED AND CONTROL IS 00127000 * RETURNED TO THE CALLER. OTHERWISE, 00128000 * THE RELATIVE BLOCK ADDRESS IS LOADED INTO A REGISTER 00129000 * AND RIGHT ADJUSTED. IF THE RIGHTMOST BYTE OF THE 00130000 * BLOCK ADDRESS IS NOT SET TO ONE, A ONE IS SUBTRACTED 00131000 * FROM THE REGISTER. THE CONTENTS OF THE REGISTER ARE 00132000 * STORED IN THE LAST TWO BYTES OF DCBFDAD AND A 'P' IS 00133000 * STORED IN THE FIRST BYTE. THEN CKCONCAT IS CALLED AND 00134000 * CONTROL IS RETURNED TO THE USER. 00135000 * 00136000 * CKCONCAT: UPON ENTRY, A CHECK IS MADE TO DETERMINE 00137000 * IF THE FCB MACLIB CONCAT BIT IS ON. IF NOT, CONTROL IS 00138000 * RETURNED TO THE CALLER. IF IT IS, DCBRELAD+3 IS USED 00139000 * TO SET THE CORRECT OS FST OR OS PDS POINTER IN THE 00140000 * FCB AND CONTROL IS RETURNED TO THE CALLER. 00141000 * 00142000 * *FIND (TYPE C) (BPAM) 00143000 * 00144000 * OPERATION: 00145000 * 00146000 * FIND (TYPE C) MOVES SPECIFIED TTR TO THE ITEM NO. FIELD 00147000 * OF THE FCB AND CALLS CKCONCAT. THEN IF THE DCB DOES 00148000 * NOT REFER TO AN OS DISK, CONTROL IS RETURNED TO THE 00149000 * CALLER. IF THE DCB REFERS TO AN OS DISK, DMSROS IS 00150000 * CALLED TO UPDATE THE TTR AND CONTROL IS RETURNED TO 00151000 * THE CALLER. 00152000 * 00153000 * 00154000 *. 00155000 * 00156000 EJECT 00157000 * 00158000 * 00159000 * 00160000 DMSSCT START 0 00161000 ENTRY DMSSCTNP,DMSSCTCK,DMSSCTCE 00162000 SPACE 00163000 USING IHADECB,R1 00164000 USING IHADCB,R2 00165000 USING OPSECT,R8 00166000 USING NUCON,R0 00167000 USING FCBSECT,R11 00168000 USING DMSSCT,R12 BASE REG V0313 00169000 USING DMSSCT,R15 00170000 EJECT 00171000 * 00172000 * NOTE/POINT COMMON ENTRY 00173000 * 00174000 DMSSCTNP DS 0H NOTE: 0(R15) 00175000 B NOTE 00176000 CR R1,R0 IS THIS A CALL FOR FIND 00177000 BE FINDC YES 00178000 DROP R15 USE R12 AS BASE REG V0313 00179000 * 00180000 POINT STM R14,R12,12(R13) SAVE REGS 00181000 L R12,16(,R13) SETUP BASE REG V0313 00182000 LR R2,R1 GET V(DCB) 00183000 L R11,DCBDEBAD GET ADDR OF DEB 00184000 SH R11,=AL2(IHADEB-FCBINIT) GET ADDR OF FCB 00185000 LA R5,NTPT2 GET RETURN ADDR @V201122 00186000 TM FCBINIT,FCBOS IS THIS AN OS DATA SET @V201122 00187000 BO CALLROS YES, GO TO DMSROS @V201122 00188000 LR R4,R0 00189000 L R5,0(R4) GET ITEM NO. 00190000 CLI FCBDEV,FCBTAP IS DEVICE TAPE 00191000 BE LESS1 YES, THEN DON'T SHIFT TTR 00192000 SRL R5,8 00193000 CLI 3(R4),X'01' SHOULD WE ADD ONE 00194000 BNE LESS1 NO, DON'T ADD ONE P3036 00195000 AH R5,FCBCOUT YES, ADD ONE BLOCK TO PTR P3036 00196000 LESS1 BCTR R5,R0 SUBTRACT ONE FROM TTR 00197000 STPTR STH R5,FCBOP ALLIGN ITEM NO. 00198000 MVC DCBFDAD+6(2),FCBOP MOVE IT INTO DCBFDAD 00199000 MVI DCBFDAD,C'P' INDICATE POINT 00200000 NI DCBOFLGS,X'7F' 00201000 BAL R14,CKCONCAT CHECK FOR PDS CONCATONATION V0313 00202000 B NTPT2 RETURN 00203000 NOTE DS 0H 00204000 STM R14,R12,12(R13) SAVE REGS IN CALLERS SAVEAREA 00205000 L R12,16(,R13) SETUP BASE REG V0313 00206000 * 00207000 * SOME HOUSEKEEPING 00208000 * 00209000 LR R2,R1 GET V(DCB) 00210000 L R11,DCBDEBAD GET ADDR OF DEB 00211000 SH R11,=AL2(IHADEB-FCBINIT) GET ADDR OF FCB 00212000 * EXECUTE "NOTE": RECORD PRESENT I/O POINTERS 00213000 SR R0,R0 INDICATE NOTE @V201122 00214000 LA R5,SETR1 SET RETURN ADDRESS @V201122 00215000 TM FCBINIT,FCBOS IS THIS AN OS FCB @V201122 00216000 BNO GETITEM NO, DON'T GO TO DMSROS @V201122 00217000 CALLROS DMSKEY NUCLEUS @V201122 00218000 L R15,ADMSROS GET ADDRESS OF DMSROS @V201122 00219000 BAL R14,16(R15) BAL TO DMSROS @V201122 00220000 DMSKEY RESET @V201122 00221000 BR R5 RETURN TO CALLER @V201122 00222000 GETITEM EQU * GET ITEM NO. @V201122 00223000 LH R0,FCBITEM GET FCBITEM 00224000 N R0,HALFWORD 00225000 CLI DCBFDAD,C'P' WAS A POINT ISSUED 00226000 BNE SETCOUT NO, GO SAVE ITEM NO. 00227000 CLC DCBFDAD+6(2),=XL2'FFF8' WAS THIS POINT ISSUED BY EOB 00228000 BE SETCOUT YES, THEN IGNORE 00229000 MVC FCBOP+1(3),DCBFDAD+5 ALLIGN ITEM NO. 00230000 LH R3,FCBOP+2 GET ITEM NO. 00231000 LA R0,1(R3) ADD ONE TO IT 00232000 SETCOUT LR R3,R0 SAVE ITEM NO. 00233000 SH R0,FCBCOUT GET ITEM NO. OF LAST BLK 00234000 BNM ALIGN BRANCH ZERO OR POSITIVE @VA09010 00235000 LR R0,R3 DO NOT ADJUST FOR LAST BLK 00236000 ALIGN CLI FCBDEV,FCBTAP IS DEVICE TAPE 00237000 BE SETR1 YES, THEN SET R1 IN SAVE AREA 00238000 SLL R0,8 SHIFT TTR LEFT 8 FOR DISK 00239000 SETR1 ST R0,24(,R13) SET R1 IN SAVE AREA 00240000 NTPT2 EQU * EXIT FROM 'NOTE' OR 'POINT' ... 00241000 ST R13,FCBR13 00242000 LM R14,R12,12(R13) RESTORE REGS 00243000 BR 14 RETURN 00244000 HALFWORD DC F'65535' 00245000 EJECT 00246000 * "CHECK": DETERMINE STATUS OF PREVIOUS READ/WRITE OPERATION 00247000 * 00248000 DMSSCTCK DS 0H 00249000 STM R14,R12,12(R13) SAVE REGS IN CALLER SAVEAREA 00250000 USING DMSSCTCK,R12 00251000 USING IHADECB,R6 00252000 SPACE 00253000 SPACE 00254000 LR R12,R15 SETUP BASE REG 00255000 LR R6,R1 SETUP DECB REG 00256000 L R2,DECDCBAD GET V(DCB) 00257000 CK1 TM DECSDECB,X'40' TEST ECB COMPLETION BIT 00258000 BZ POSTERR SET ERROR BYTE 00259000 CLI DECSDECB+3,0 TEST FOR I/O ERRORS 00260000 BNE CK2 ERRORS. GOSH! 00261000 CKRET EQU * 00262000 LM R14,R12,12(R13) RESTORE USER6S REGS 00263000 BR R14 RETURN TO USER 00264000 POSTERR MVI DECSDECB+3,254 SET NOT COMPLETE ERROR CODE 00265000 CK2 L R11,DCBDEBAD GET ADDR OF DEB IN FCB 00266000 SH R11,=AL2(IHADEB-FCBINIT) GET ADDR OF FCB 00267000 L R4,DECIOBPT GET ADDR OF IOB 00268000 SH R4,=H'8' GET ADDR OF IOB PREFIX 00269000 MVC IOBIOFLG(1),IOBBFLG(R4) GET PROPER IOB FLG 00270000 DMSSCTCE EQU * 00271000 LA R7,64 SET OUTPUT CODE 00272000 TM IOBIOFLG,IOBOUT OUTPUT? 00273000 BO GETSYNAD YES, USE ERROR EXIT 00274000 LA R7,128 SET INPUT CODE 00275000 CLI DECSDECB+3,X'0C' END-OF-FILE? 00276000 BNE GETSYNAD PRINT I/O ERROR MSG 00277000 L R1,DCBEODAD GET ADDR OF EOF RTN 00278000 LA R15,0(R1) CLEAR HIGH ORDER BYTE 00279000 CH R15,=H'1' IS EOF RTN SPECIFIED ? 00280000 BNH GETSYNAD NO, ABEND V0277 00281000 LM R0,R12,20(R13) RESTORE REGS V0277 00282000 BALR R14,R15 CALL EXIT ROUTINE V0277 00283000 LM R14,R12,12(R13) RESTORE V0277 00284000 BR R14 RETURN TO CALLER V0277 00285000 GETSYNAD L R1,DCBSYNAD GET SYNAD ADDR 00286000 TM FCBIOSW,FCBCLOSE WAS ERROR DURING CLOSE @VA06290 00287000 BO CKABEND YES, THEN DIE @VA06290 00288000 LA R15,0(R1) ZERO HIGH ORDER BYTE @VA07120 00289000 CH R15,=H'1' IS SYNAD ROUTINE SPECIFIED 00290000 BH CKTYPE NO, ABEND 00291000 CKABEND LA R15,SYNABEND GET ADDR OF ABEND ROUTINE 00292000 CKTYPE ST R6,20(R13) SET R0 TO A(DECB) 00293000 TM DCBCIND2,1 BSAM? 00294000 BZ SYNADRTN YES, CONTINUE 00295000 L R8,AOPSECT GET ADDR OF CMSOP 00296000 XC 0(32,R8),0(R8) CLEAR FIRST 32 BYTES 00297000 MVC CMSOP(4),DECSDECB SETUP STATUS BITS 00298000 LA R9,16(R8) GET ADDR OF FAKE CCW 00299000 ST R9,FILENAME USE IT FOR ADDR OF CCW 00300000 MVC 14(2,R8),IOBCSW+6 SET LENGTH IN CSW 00301000 ST R8,20(R13) SET R0 TO A(STATUS BITS) 00302000 MVI 20(R13),8 SET DISPLACEMENT TO CCW ADDR 00303000 SYNADRTN ST R2,24(R13) SET DCB ADDR IN REG1 SAVE AREA 00304000 STC R7,24(R13) SET I/O CODE IN SAVE AREA 00305000 CLC DECSDECB+1(2),=XL2'2000' IS THIS NO SPACE FOUND 00306000 BNE ERREXIT NO, THEN CONTINUE 00307000 MVI 24(R13),X'41' YES, THEN SIGNAL NO SPACE FOUND 00308000 ERREXIT EQU * 00309000 LM R0,R12,20(R13) RESTORE REGS 00310000 BALR R14,R15 CALL EXIT ROUTINE 00311000 LM R14,R1,12(R13) RESTORE BDAM REGS V0213 00312000 TM X'1A'(R1),DA DCBDSORG= DA SPECIFIED V0300 00313000 BCR 1,R14 YES, RETURN TO CALLER V0213 00314000 LM R14,R12,12(R13) RESTORE REGS 00315000 BR R14 RETURN TO USER 00316000 SYNABEND BALR R14,R0 SETUP BASE REG 00317000 USING *,R14 00318000 SYNADAF ACSMETH=BSAM 00319000 LA R4,54(R1) SET ADDR OF MSG. 00320000 DMSERR MF=I,NUM=120,LET=S,SUB=(CHARA,(R4)), X00321000 TEXT='.............................' 00322000 SYNADRLS 00323000 ABEND 1 00324000 DROP R14 00325000 EJECT 00326000 FINDC STM R14,R12,12(R13) SAVE REGS 00327000 LR R12,R15 SETUP BASE REG 00328000 USING DMSSCT,R12 00329000 LR R2,R1 SET DCB BASE REG V0313 00330000 L R11,DCBDEBAD GET DEB ADDRESS V0313 00331000 SH R11,=AL2(IHADEB-FCBINIT) GET FCB ADDRESS V0313 00332000 MVC FCBITEM(2),DCBRELAD+1 SET ITEM NO. V0313 00333000 BAL R14,CKCONCAT CHECK FOR CONCATONATION V0313 00334000 TM FCBINIT,FCBOS OS FCB? @V201122 00335000 BNO FINDCRET NO, RETURN TO CALLER @V201122 00336000 L R6,DCBRELAD SAVE CONCAT BYTE @V201122 00337000 MVI DCBRELAD+3,0 SETUP FOR POINT @V201122 00338000 LA R0,DCBRELAD GET ADDR OF TTR @V201122 00339000 BAL R5,CALLROS BRANCH TO OS POINT @V201122 00340000 STC R6,DCBRELAD+3 RESTORE CONCAT @V201122 00341000 FINDCRET LM R14,R12,12(R13) RESTORE REGS @V201122 00342000 SR R15,R15 RETURN 00343000 BR R14 RETURN TO CALLER 00344000 CKCONCAT TM FCBINIT,FCBCATML CONCATONATION SPECIFIED V0313 00345000 BCR 14,R14 NO, RETURN V0313 00346000 SR R6,R6 ZERO REG FOR INSERT V0313 00347000 IC R6,DCBRELAD+3 GET CONCAT NO. V0313 00348000 NI FCBINIT,255-FCBOS TURN OFF FCB OS SWITCH @V201122 00349000 L R15,MACDIRC(R6) GET ADDRESS OF FCB OR PDS @V201122 00350000 LTR R15,R15 OS FCB? @V201122 00351000 BNM GETMACNM NO, GET MACLIB NAME @V201122 00352000 OI FCBINIT,FCBOS TURN ON FCB OS SWITCH @V201122 00353000 ST R15,FCBOSFST SET OS FST POINTER @V201122 00354000 BR R14 RETURN TO CALLER @V201122 00355000 GETMACNM SLL R6,1 MULTIPLY BY 2 @V201122 00356000 ST R15,FCBPDS SET NEW PDS ADDRESS @V201122 00357000 LA R5,MACLIBL(R6) GET ADDR OF NAME IN MAC LIST @V201122 00358000 MVC FCBDSNAM(8),0(R5) SET FCB TO NEW PDS NAME V0313 00359000 BR R14 RETURN TO CALLER V0313 00360000 EJECT 00361000 ********************************************************************** 00362000 * 00363000 * DCB LAYOUT 00364000 * 00365000 ********************************************************************** 00366000 DCBD DSORG=(PS) 00367000 EJECT 00368000 NUCON 00369000 CMSCB 00370000 IO 00371000 EJECT 00372000 REGEQU 00373000 UTSAV EQU IOBCSW 00374000 NOTEWD EQU SAVER14 00375000 END 00376000