CPB TITLE 'DMKCPB (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 VALIDATE SEQUENCING OF INPUT 00002000 *. 00003000 * 00004000 * MODULE NAME - 00005000 * 00006000 * DMKCPB 00007000 * 00008000 * FUNCTION - 00009000 * 00010000 * TO SIMULATE THE REAL MACHINES PUSH BUTTONS. 00011000 * 00012000 * ATTRIBUTES - 00013000 * 00014000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00015000 * 00016000 * ENTRY POINTS - 00017000 * DMKCPBSR - TO PROCESS THE 'SYSTEM' COMMAND. 00018000 * DMKCPBEX - TO PROCESS THE 'EXTERNAL' COMMAND. 00019000 * DMKCPBRY - TO PROCESS THE 'READY' COMMAND. 00020000 * DMKCPBNR - TO PROCESS THE 'NOTREADY' COMMAND. 00021000 * DMKCPBRS - TO PROCESS THE 'RESET' COMMAND. 00022000 * DMKCPBRW - TO PROCESS THE 'REWIND' COMMAND. 00023000 * 00024000 * ENTRY CONDITIONS - 00025000 * 00026000 * GPR9 - ADDRESS OF COMMAND LINE BUFFER 00027000 * GPR11 - ADDRESS OF VMBLOK 00028000 * GPR12 - ADDRESS OF ENTRY POINT 00029000 * GPR13 - ADDRESS OF SAVEAREA 00030000 * 00031000 * 00032000 * EXIT CONDITIONS - 00033000 * 00034000 * NORMAL - 00035000 * GPR2 = 0 00036000 * 00037000 * ERROR - 00038000 * GPR2 = ERROR MESSAGE CODE NUMBER 00039000 * 00040000 * 00041000 * CALLS TO OTHER ROUTINES - 00042000 * 00043000 * DMKSCNFD - TO LOCATE NEXT ARGUMENT IN THE COMMAND LINE 00044000 * DMKCVTHB - CONVERT HEXADECIMAL ADDRESSES TO BINARY 00045000 * DMKSCNVU - TO LOCATE ADDRESSES OF THE VIRTUAL DEVICE BLOKS 00046000 * DMKQCNWT - TO OUTPUT MESSAGES TO THE TERMINAL 00047000 * DMKVATBC - TO RELEASE SHADOW TABLES FOR V370R 00048000 * DMKFREE - TO OBTAIN STORAGE FROM FREE STORAGE 00049000 * DMKFRET - TO RETURN STORAGE TO FREE STORAGE 00050000 * DMKIOSQR - TO PERFORM REAL I/O OPERATIONS 00051000 * DMKPGSPO - TO CLEAR VIRTUAL STORAGE TO BINARY ZEROS 00052000 * DMKERMSG - TO SEND ERROR MESSAGES TO THE TERMINAL. 00053000 * DMKCFPRR - TO HANDLE SYSTEM RESET FUNCTION 00054000 * DMKPTRAN - TO BRING A PAGE IN CORE 00055000 * DMKVATMD - TO ENTER TRANSLATE MODE 00056000 * DMKCVTBH - CONVERT BINARY DATA TO HEXADECMAL 00057000 * DMKCFPRD - TO RESET A VIRTUAL DEVICE 00058000 * 00059000 * 00060000 * EXTERNAL REFERENCES - 00061000 * 00062000 * DMKSYSVM - LOCATION OF THE SYSTEM VMBLOK 00063000 * 00064000 * 00065000 * TABLES/WORKAREAS - 00066000 * 00067000 * RDEVBLOK, IOBLOK, VMBLOK, VDEVBLOK, VCUBLOK, VCHBLOK 00068000 * 00069000 * 00070000 * REGISTER USAGE - 00071000 * 00072000 * GPR0 - ARGUMENT LENGTH (PASSED BACK FROM DMKSCNFD) 00073000 * GPR1 - ARGUMENT ADDRESS (PASSED BACK FROM DMKSCNFD) 00074000 * GPR2 -PASS PARAMETERS TO CALLED ROUTINES 00075000 * GPR3 - WORK REG 00076000 * GPR4 - WORK REG 00077000 * GPR5 - WORK REG 00078000 * GPR6 - VCHBLOK ADDRESS 00079000 * GPR7 - VCUBLOK ADDRESS 00080000 * GPR8 - VDEVBLOK ADDRESS 00081000 * GPR9 - RDEVBLOK ADDRESS 00082000 * GPR10 - IOBLOK ADDRESS 00083000 * GPR11 - VMBLOK ADDRESS 00084000 * GPR12 - BASE REG 00085000 * GPR13 - SAVEAREA ADDRESS 00086000 * GPR14 - LINKAGE REG 00087000 * GPR15 - LINKAGE REG 00088000 * 00089000 * 00090000 * 00091000 *** NOTE 00092000 * 00093000 *** THIS MODULE CONTAINS DEACTIVATED CODE NOT SUPPORTED IN 00094000 *** RELEASE 1.0 OF VM/370. 00095000 * 00096000 ***NOTE 00097000 * 00098000 * 00099000 * OPERATION - 00100000 * 00101000 * THE VARIOUS SUBROUTINES IN THIS MODULE ARE CALLED BY DMKCFM. 00102000 * THE FORMAT AND DESCRIPTION OF EACH COMMAND IS LISTED 00103000 * IN SEPARATE PROLOGUES BELOW. 00104000 * 00105000 * 00106000 *. 00107000 EJECT 00108000 COPY OPTIONS 00109000 COPY LOCAL 00110000 SPACE 2 00111000 DMKCPB START 00112000 SPACE 00113000 MODID DC CL8'DMKCPB' 00114000 SPACE 00115000 USING PSA,R0 00116000 USING VMBLOK,R11 00117000 USING SAVEAREA,R13 00118000 SPACE 00119000 EXTRN DMKERMSG 00120000 EXTRN DMKCFPRR,DMKCFPRD 00121000 EXTRN DMKCVTBH 00122000 EXTRN DMKCVTHB 00123000 EXTRN DMKSSSMQ,DMKSTKCP,DMKDSPCH @V60B6B8 00123500 EXTRN DMKVIOMK 00124000 EXTRN DMKPGSPO 00125000 EXTRN DMKIOSQR 00126000 EXTRN DMKSCNFD 00127000 EXTRN DMKSCNVU 00128000 EXTRN DMKIOSRW 00129000 EXTRN DMKVATBC,DMKVATMD 00130000 EXTRN DMKTRCEX @VA09019 00130500 EJECT 00131000 *********************************************************************** 00132000 *********************************************************************** 00133000 * * 00134000 * * 00135000 * 'SYSTEM' * 00136000 *********************************************************************** 00137000 *. 00138000 * SUBROUTINE NAME - 00139000 * DMKCPBSR 00140000 * 00141000 * FUNCTION - 00142000 * SIMULATES SYSTEM RESET AND PSW RESTART. IN ADDITION ALLOWS 00143000 * THE CLEARING OF STORAGE. 00144000 * 00145000 * COMMAND FORMAT - 00146000 * 00147000 * +----------+-----------+ 00148000 * | SYSTEM | CLEAR | 00149000 * | SYS | RESET | 00150000 * | | RESTART | 00151000 * +----------+-----------+ 00152000 * 00153000 * OPERATION - 00154000 * 1. CALL DMKSCNFD TO LOCATE ARGUMENT. IF NO ARGUMENT 00155000 * IS FOUND, CALL DMKERMSG TO SEND ERROR MESSAGE 00156000 * DMKCPB026E. 00157000 * 2. IF ARGUMENT=RESTART, GO TO STEP 6; IF RESET, GO TO 00158000 * STEP 8; IF CLEAR, GO TO NEXT STEP. IF NONE OF 00159000 * THESE, CALL DMKERMSG TO SEND ERROR MESSAGE 00160000 * DMKCPB026E. 00161000 * 3. CLEAR - CALL DMKPGSPO TO CLEAR STORAGE TO BINARY 00162000 * ZERO. 00163000 * 4. CALL DMKCFPRR TO RESET ALL PENDING INTERRUPTS. 00164000 * 5. CALL DMKQCNWT TO SEND THE 'STORAGE CLEARED-SYSTEM 00165000 * RESET' MESSAGE AND EXIT. 00166000 * 6. RESTART - TRANS IN VIRTUAL PAGE ZERO INTO STORAGE. 00167000 * 7. STORE CURRENT VIRTUAL PSW INTO LOCATION EIGHT. THEN 00168000 * SET THE CURRENT PSW TO THE CONTENTS OF LOCATION ZERO 00169000 * AND EXIT. 00170000 * 8. RESET - BAL TO SUBROUTINE AT LABEL RESYSTEM TO 00171000 * RESET ALL THE VIRTUAL DEVICES. 00172000 * 9. CALL DMKQCNWT TO SEND MESSAGE 'SYSTEM RESET' AND 00173000 * EXIT. 00174000 * 00175000 * RESPONSES - 00176000 * STORAGE CLEARED-SYSTEM RESET 00177000 * SYSTEM RESET 00178000 * 00179000 * ERROR MESSAGES - 00180000 * DMKCPB012E INVALID PSW - (PSW) 00181000 * DMKCPB026E OPERAND MISSING OR INVALID 00182000 *. 00183000 EJECT 00184000 DMKCPBSR RELOC SYSTEM RESET, PSW RESTART, OR CLEAR 00185000 CALL DMKSCNFD FIND ARGUMENT 00186000 BNZ CFP026 NONE FOUND 00187000 LR R2,R0 LENGTH TO GPR2 00188000 LR R3,R1 ADDRESS TO GPR3 00189000 BCTR R2,0 MINUS ONE FOR EX 00190000 EX R2,SYSCOMP1 CHECK FOR CLEAR 00191000 BE CLEARMEM BRANCH IF IT IS 00192000 EX R2,SYSCOMP2 TRY RESET 00193000 BE RESALL BRANCH IF COMPARE 00194000 EX R2,SYSCOMP3 HOPE ITS RESTART 00195000 BE PSWREST IF DON'T TAKE THIS BRANCH-- BAD NEWS 00196000 B CFP026 GOT A BAD ARGUMENT 00197000 CLEARMEM CL R2,F4 PROPER LENGTH ????? 00198000 BNE CFP026 NO ------ 00199000 SR R2,R2 INDICATE A CLEAR OPERATION TO PGSPO 00200000 CALL DMKCFPRR SYSTEM RESET 00201000 CALL DMKPGSPO CLEAR ALL OF VIRTUAL MEMORY 00202000 MSG 'STORAGE CLEARED - SYSTEM RESET' 00203000 B WRTAPL GO CLEAR PA2 FLAG @VM03094 00204000 SPACE 2 00205000 RESALL CL R2,F4 PROPER LENGTH ???? 00206000 BNE CFP026 BRANCH IF NOT 00207000 CALL DMKCFPRR SYSTEM RESET 00208000 MSG 'SYSTEM RESET' 00209000 WRTAPL EQU * RESET EXTERNAL INTERRUPT FLAG @VM03094 00210000 NI VMQSTAT,X'FF'-VMPA2APL CLEAR PA2 FLAG @VM03116 00211000 B RESWRT SEND MESSAGE AND EXIT @VM03094 00212000 SPACE 3 00213000 PSWREST CL R2,F6 PROPER LENGTH ???? 00214000 BNE CFP026 NOT IF WE TAKE THIS BRANCH 00215000 SR R1,R1 BRING IN USER PAGE ZERO 00216000 TRANS 2,1,OPT=(BRING,DEFER) 00217000 LM R3,R4,VMPSW LOAD CURRENT PSW 00218000 STM R3,R4,8(R2) STORE INTO USERS LOC. 8 00219000 TM VMPSTAT,VMV370R EC MODE ALLOWED ???? 00220000 BZ CKPSW NO --- 00221000 TM 1(R2),EXTMODE RESTART PSW = EXTENDED ???? 00222000 BZ CKMODE NO ---- 00223000 OI VMESTAT,VMEXTCM TURN ON EC MODE 00224000 TM 0(R2),TRANMODE TRANSLATE MODE 00225000 BZ CKZERO NO ------ 00226000 CALL DMKVATMD ENTER TRANSLATE MODE 00227000 SPACE 00228000 CKZERO TM 2(R2),X'D8' ALLOW ONLY PER OTHER BITS ZERO 00229010 BZ PSWOK YES - PSW OK TO USE 00230000 B ERROR NO - SEND ERROR MESSAGE 00231000 SPACE 00232000 CKMODE TM VMESTAT,VMEXTCM WERE WE IN EC MODE ??? 00233000 BZ PSWOK NO - 00234000 CALL DMKVATBC CLEAR SHADOW TABLES 00235000 NI VMESTAT,X'FF'-VMEXTCM RESET EC MODE 00236000 B PSWOK . . . 00237000 SPACE 00238000 CKPSW TM 1(R2),EXTMODE EXTENDED MODE PSW ???? 00239000 BO ERROR YES - SEND ERROR MESSAGE 00240000 PSWOK EQU * 00241000 LM R0,R1,0(R2) LOAD PSW FROM USERS LOCATION ZERO 00242000 STM R0,R1,VMPSW STORE INTO VIRTUAL PSW IN VMBLOK 00243000 TM VMTRCTL,VMTREX+VMTRBRIN TRACING? @VA09019 00243100 BZ NOTRAC NO - GO ON @VA09019 00243200 L R4,FFS DUMMY INT CODE INTO R4 @VA09019 00243300 LM R0,R1,8(R2) OLD PSW INTO R0,R1 @VA09019 00243400 LM R2,R3,VMPSW NEW PSW INTO R2, R3 @VA09019 00243500 CALL DMKTRCEX CALL EXTERNAL INTERUPT TRACE @VA09019 00243600 NOTRAC EQU * @VA09019 00243700 B RESXRUN GO RUN THE VIRTUAL MACHINE 00244000 SPACE 00245000 ERROR L R1,0(,R2) LOAD FIRST HALF OF BAD PSW 00246000 CALL DMKCVTBH CONVERT TO PRINTABLE FORM 00247000 STM R0,R1,SAVEWRK2 SAVE FOR LATER 00248000 L R1,4(,R2) LOAD SECOND HALF OF PSW 00249000 CALL DMKCVTBH CONVERT IT 00250000 MVC SAVEWRK4(2),BLANKS STICK BLANKS BETWEEN 1ST AND LAST 00251000 STCM R0,15,SAVEWRK4+2 STORE FIELD 00252000 STCM R1,15,SAVEWRK5+2 . . . 00253000 LA R0,18 FIELD LENGTH 00254000 LA R1,SAVEWRK2 ADDRESS OF PSW 00255000 B CFP012 GO SEND MESSAGE 00256000 SPACE 00257000 SYSCOMP1 CLC 0(0,R3),=C'CLEAR ' EXECUTED COMPARE 00258000 SYSCOMP2 CLC 0(0,R3),=C'RESET ' . . . 00259000 SYSCOMP3 CLC 0(0,R3),=C'RESTART ' . . . 00260000 EJECT 00261000 *********************************************************************** 00262000 * * 00263000 * 'EXTERNAL' * 00264000 * * 00265000 *********************************************************************** 00266000 *. 00267000 * 00268000 * SUBROUTINE NAME - 00269000 * DMKCPBEX 00270000 * 00271000 * FUNCTION - 00272000 * TO CAUSE AN EXTERNAL INTERRUPT TO BE PRESENTED TO THE 00273000 * VIRTUAL MACHINE. 00274000 * 00275000 * COMMAND FORMAT - 00276000 * 00277000 * +------------+--------+ 00278000 * | EXTERNAL | CODE | 00279000 * | EXT | | 00280000 * +------------+--------+ 00281000 * 00282000 * OPERATION - 00283000 * 1. SET UP DEFAULT INTERRUPT CODE TO X'40'. THEN CALL 00284000 * DMKSCNFD TO LOCATE ARGUMENT. IF NONE FOUND, GO TO 00285000 * STEP THREE. 00286000 * 2. CALL DMKCVTHB TO CONVERT CODE TO BINARY. IF CONVERT FAILS, 00287000 * CALL DMKERMSG TO SEND ERROR MESSAGE DMKCPB005E. ELSE - 00288000 * SET INTERRUPT CODE TO THIS VALUE. 00289000 * 3. SET EXTERNAL INTERRUPT PENDING FLAG AND EXIT. 00290000 * 00291000 * RESPONSES - 00292000 * SINCE CONTROL IS GIVEN TO THE VIRTUAL MACHINE, ANY RESPONSES 00293000 * WILL COME FROM THE VIRTUAL MACHINE PROCESSING. 00294000 * 00295000 * ERROR MESSAGES - 00296000 * DMKCPB005E INVALID HEXDATA - (HEXDATA) 00297000 *. 00298000 EJECT 00299000 DMKCPBEX RELOC SIMULATE PRESSING THE INTERRUPT KEY 00300000 SLR R3,R3 ZERO REGISTER THREE @V200198 00301000 L R4,=X'00400040' SET DEFAULT CODE @V200198 00302000 CALL DMKSCNFD FIND CODE IF ANY @V200198 00303000 BNZ SETCODE NO CODE, GO SET DEFAULT @V200198 00304000 STM R0,R1,SAVEWRK2 SAVE LENGTH AND ADDRESS @V200198 00305000 CALL DMKCVTHB CONVERT CODE @V200198 00306000 BNZ BADCODE INVALID CODE SPECIFIED @V200198 00307000 CL R1,=A(X'FF') CHECK FOR CLASS ZERO @V200198 00308000 BH NOTZERO MUST BE CLASS ONE @V200198 00309000 LTR R4,R1 PUT CODE IN REG4 @VA04309 00310300 BZ BADCODE IMPOSSIBLE CONDITION @VA04309 00310600 ST R4,SAVEWRK5 STORE FOR TESTING BITS @V200198 00311000 SLL R4,16 MAKE ROOM FOR MASK BITS @V200198 00312000 N R1,=A(X'C0') SELECT BUTTON AND TIMER CODES @V200198 00313000 BZ *+6 NONE THERE, SKIP @VM08922 00314000 OR R4,R1 SAVE RESULTING MASK BITS @V200198 00315000 TM SAVEWRK5+3,X'3F' CHECK FOR SIGNSL LINES @V200198 00316000 BZ SETCODE NONE THERE, GO SET WHAT WE HAVE @V200198 00317000 O R4,=A(X'20') PUT IN MASK BIT FOR SIGNAL LINES @V200198 00318000 B SETCODE ALL DONE,GO SET CODE @V200198 00319000 NOTZERO TM VMPSTAT,VMV370R EXTENDED MACHINE? @V200198 00320000 BZ BADCODE NO, ALL OTHER CODES ILLEGAL @V200198 00321000 LM R3,R4,=X'1040000010040800' CODE FOR COMPARATOR @V200198 00322000 CL R1,=A(X'1004') SETTING COMPARATOR? @V200198 00323000 BE SETCODE YES, SET IT @V200198 00324000 LM R3,R4,=X'1050000010050400' CODE FOR CPU TIMER @V200198 00325000 CL R1,=A(X'1005') SETTING TIMER 00326000 BNE BADCODE NO --- OTHERS NOT SUPPORTED 00327000 SPACE 00328000 SETCODE SLR R5,R5 PARAMETER IS MEANINGLESS HERE @V200198 00329000 LA R2,VMPXINT START OF EXTERNAL INTERRUPT @V200198 00330000 * BLOCKS 00331000 USING XINTBLOK,R2 EXTERNAL INTERRUPT BLOCK @V200198 00332000 XLOOP LR R6,R2 PRESERVE POINTER TO PREVIOUS @V200198 00333000 L R2,XINTNEXT-XINTBLOK(,R6) NEXT? @V200198 00334000 LTR R2,R2 @V200198 00335000 BZ XADD NOPE, ADD TO END OF CHAIN @V200198 00336000 C R3,XINTSORT CHECK FOR COLLATING SEQUENCE @V200198 00337000 BH XLOOP KEEP LOOKING... @V200198 00338000 BL XADD FITS RIGHT IN HERE @V200198 00339000 O R4,XINTCODE SAME COLLATING SEQUENCE @V200198 00340000 ST R4,XINTCODE SO OR TO STORAGE @V200198 00341000 B RESXRUN RETURN TO CALLER @V200198 00342000 XADD LA R0,XINTSIZE NUMBER OF DOUBLEWORDS @V200198 00343000 CALL DMKFREE GET BLOCK FORM FREE STORAGE @V200198 00344000 ST R1,XINTNEXT-XINTBLOK(,R6) CHAIN TO PREVIOUS @V200198 00345000 * BLOCK 00346000 STM R2,R5,XINTNEXT-XINTBLOK(R1) BUILD NEW @V200198 00347000 * INTERRUPT BLOCK 00348000 B RESXRUN GO RUN THE VIRTUAL MACHINE 00349000 SPACE 00350000 BADCODE LM R0,R1,SAVEWRK2 RELOAD LENGTH AND ADDRESS OF ARG. 00351000 B CFP005 . . . 00352000 EJECT 00353000 *********************************************************************** 00354000 * * 00355000 * 'READY' * 00356000 * * 00357000 *********************************************************************** 00358000 *. 00359000 * 00360000 * SUBROUTINE NAME - 00361000 * DMKCPBRY 00362000 * 00363000 * FUNCTION - 00364000 * TO SIMULATE A DEVICE END INTERRUPT TO THE SPECIFIED DEVICE. 00365000 * 00366000 * COMMAND FORMAT - 00367000 * 00368000 * +---------+---------+ 00369000 * | READY | VADDR | 00370000 * | R | | 00371000 * +---------+---------+ 00372000 * 00373000 * OPERATION - 00374000 * 1. BAL R10 TO SUBROUTINE 'FNDVADDR' TO GET ADDRESSES OF THE 00375000 * VBLOKS. 00376000 * 2. IF THE DEVICE IS BUSY, JUST EXIT SINCE THE DEVICE END WILL 00377000 * COME ANYWAY. 00378000 * 2.1 IF THE DEVICE IS A VIRTUAL CHANNEL-TO-CHANNEL ADAPTER, 00379000 * ISSUE MSG DMKCPB006E AND EXIT. 00380000 * 3. SET INTERRUPT PENDING FLAGS IN THE VDEVBLOK,VCUBLOK, 00381000 * VCHBLOK, AND VMBLOK - THEN EXIT. 00382000 * 00383000 * RESPONSES - 00384000 * A NULL LINE WILL BE SENT ON A SUCCESSFUL OPERATION 00385000 * 00386000 * ERROR MESSAGES - 00387000 * DMKCPB006E INVALID DEVICE TYPE - (ADDR) 00388000 * DMKCPB022E VADDR MISSING OR INVALID 00389000 * DMKCPB040E DEV (ADDR) DOES NOT EXIST 00390000 *. 00391000 EJECT 00392000 DMKCPBRY RELOC CAUSE A VIRTUAL DEVICE END INTERRUPT 00393000 BAL R10,FNDVADDR GO GET VBLOKS 00394000 USING VCHBLOK,R6 00395000 USING VCUBLOK,R7 00396000 USING VDEVBLOK,R8 00397000 TM VDEVSTAT,VDEVBUSY IS THE DEVICE BUSY ? 00398000 BO RESEXT RETURN AND LET IT READY NATURALLY 00399000 LA R1,CLASSPEC*256+TYPCTCA CHECK FOR VIRTUAL CTCA 00400000 CH R1,VDEVTYPC IS IT A CHAN-TO-CHAN ADAPTER ? 00401000 BNE CPBRYOK NO -- IT'S O.K. TO READY IT 00402000 TM VDEVSTAT,VDEVDED DEDICATED CTCA ? 00403000 BO CPBRYOK YES - ALSO O.K. 00404000 TM VDEVSTAT,VDEVNRDY IF THE CTCA IS NOT READY NOW... 00405000 BO BADTYPE ...'COUPLE' CMD MUST READY IT, NOT US 00406000 CPBRYOK EQU * MAKE DEVICE READY, PRESENT DEVICE END 00407000 NI VDEVSTAT,255-VDEVNRDY TURN OFF NOT READY FLAG 00408000 OI VDEVSTAT,VDEVPEND INDICATE AN INTERRUPT IS PENDING 00409000 MVI VDEVINTS,DE SET DEVICE END STATUS 00410000 L R1,=A(DMKVIOMK) LOAD ADDRESS OF INTERRUPT MASKS 00411000 LH R2,VDEVADD LOAD THE VIRTUAL DEVICE ADDRESS 00412000 AR R2,R2 MULTIPLY IT BY 2 00413000 LA R2,0(R1,R2) POINT TO PROPER MASK 00414000 OC VCUDVINT,0(R2) SET PENDING FLAG IN VCUBLOK 00415000 LH R2,VCUADD LOAD THE VIRTUAL CONTROL UNIT ADDRESS 00416000 SRL R2,3 MULTIPLY IT BY 2 00417000 LA R2,0(R1,R2) POINT TO THE PROPER MASK 00418000 OC VCHCUINT,0(R2) SET PENDING FLAG IN VCHBLOK 00419000 LH R2,VCHADD LOAD THE VIRTUAL CHANNEL ADDRESS 00420000 SRL R2,7 MULTIPLY IT BY 2 00421000 LA R2,0(R1,R2) POINT TO THE PROPER MASK 00422000 OC VMIOINT,0(R2) FLAG CHANNEL PENDING IN VMBLOK 00423000 OI VMPEND,VMIOPND FLAG SUMMARY PENDING BYTE 00424000 B RESEXT RETURN 00425000 DROP R6,R7,R8 00426000 EJECT 00427000 *. 00428000 * SUBROUTINE NAME - 00429000 * DMKCPBNR 00430000 * 00431000 * FUNCTION - 00432000 * TO CAUSE THE VIRTUAL DEVICE TO APPEAR NOT READY. 00433000 * 00434000 * COMMAND LINE FORMAT - 00435000 * +------------+---------+ 00436000 * | NOTREADY | VADDR | 00437000 * | NOTR | | 00438000 * +------------+---------+ 00439000 * 00440000 * OPERATION - 00441000 * 1. BAL R10 TO SUBROUTINE 'FNDVADDR' TO GET THE ADDRESSES OF 00442000 * THE VBLOKS. 00443000 * 2. IF THE VIRTUAL DEVICE IS NOT A VIRTUAL CONSOLE OR SPOOLED 00444000 * UNIT RECORD DEVICE, CALL DMKERMSG TO SEND ERROR MESSAGE 00445000 * DMKCPB006E. IF OK, SET THE VDEVNRDY FLAG IN THE VDEVSTAT. 00446000 * 00447000 * RESPONSES - 00448000 * NONE 00449000 * 00450000 * ERROR MESSAGES - 00451000 * DMKCPV006E INVALID DEVICE TYPE - (ADDR) 00452000 * DMKCPB022E VADDR MISSING OR INVALID 00453000 * DMKCPB040E DEV (ADDR) DOES NOT EXIST 00454000 *. 00455000 EJECT 00456000 DMKCPBNR RELOC 00457000 BAL R10,FNDVADDR GET VBLOK ADDRESSES 00458000 USING VDEVBLOK,R8 00459000 TM VDEVTYPC,CLASURO+CLASURI UNIT RECORD ????? 00460000 BNZ CHKDED IF UR, GO CHECK IF DEDICATED 00461000 TM VDEVTYPC,CLASTERM MIGHT BE A CONSOLE 00462000 BZ BADTYPE IF IT ISN'T, GO SEND ERROR MESSGAE 00463000 CLI VDEVTYPE,TYP3210 MAKE SURE IT'S A CONSOLE 00464000 BNE BADTYPE NOPE -- CAN'T MAKE NOTREADY 00465000 SPACE 00466000 CHKDED TM VDEVSTAT,VDEVDED DEDICATED ????? 00467000 BO BADTYPE YES -- CAN'T MAKE NOTREADY 00468000 OI VDEVSTAT,VDEVNRDY SET NOT READY FLAG 00469000 DROP R8 00470000 B RESEXT RETURN 00471000 EJECT 00472000 *********************************************************************** 00473000 * * 00474000 * 'RESET' * 00475000 * * 00476000 *********************************************************************** 00477000 *. 00478000 * SUBROUTINE NAME - 00479000 * DMKCPBRS 00480000 * 00481000 * FUNCTION - 00482000 * TO RESET ALL PENDING INTERRUPTS FROM THE SPECIFIED DEVICE. 00483000 * 00484000 * COMMAND FORMAT - 00485000 * 00486000 * +---------+---------+ 00487000 * | RESET | VADDR | 00488000 * | RESET | | 00489000 * +---------+---------+ 00490000 * 00491000 * OPERATION - 00492000 * 1. BAL R10 TO SUBROUTINE 'FNDVADDR' TO GET THE VBLOKS. 00493000 * 2. CALL DMKCFPRD TO RESET THE DEVICE. 00494000 * 3. IF DEVICE TYPE IS TYPIBM1 OR TYPTELE2, CALL DMKVDBRL TO 00495000 * RELEASE THE DEVICE. 00496000 * 4. CALL DMKQCNWT TO SEND THE RESPONSE 'DEVICE RESET' - EXIT. 00497000 * 00498000 * RESPONSES - 00499000 * DEVICE RESET 00500000 * 00501000 * ERROR MESSAGES - 00502000 * DMKCPB022E VADDR MISSING OR INVALID 00503000 * DMKCPB040E DEV (ADDR) DOES NOT EXIST 00504000 *. 00505000 EJECT 00506000 DMKCPBRS RELOC RESET A VIRTUAL DEVICE 00507000 BAL R10,FNDVADDR GET VBLOKS 00508000 USING VCHBLOK,R6 00509000 USING VCUBLOK,R7 00510000 USING VDEVBLOK,R8 00511000 CALL DMKCFPRD RESET THE VIRTUAL DEVICE 00512000 SPACE 00513000 RESMSG MSG 'DEVICE RESET' 00514000 SPACE 00515000 RESWRT CALL DMKQCNWT,PARM=NORET SEND VERIFICATION MESSAGE 00516000 SPACE 00517000 RESEXT EXIT RETURN TO THE CALLER 00518000 SPACE 2 00519000 RESXRUN EQU * ADJUST RETURN ADDRESS FOR RUNNING V.M. 00520000 L R1,SAVERETN ADD FOUR TO RETURN ADDRESS... 00521000 LA R1,4(0,R1) ...TO TAKE MACHINE OUT OF... 00522000 ST R1,SAVERETN ...CONSOLE FUNCTION MODE 00523000 EXIT , EXIT TO DMKCFM, RUN THE VIRTUAL MACHINE 00524000 EJECT 00525000 ********************************************************************** 00526000 * * 00527000 * 'REWIND' * 00528000 * * 00529000 ********************************************************************** 00530000 *. 00531000 * SUBROUTINE NAME - 00532000 * DMKCPBRW 00533000 * 00534000 * FUNCTION - 00535000 * ISSUE A REWIND TO THE REAL TAPE DEVICE ASSOCIATED WITH THE 00536000 * VIRTUAL ADDRESS SPCIFIED. 00537000 * 00538000 * COMMAND FORMAT - 00539000 * 00540000 * +----------+---------+ 00541000 * | REWIND | VADDR | 00542000 * | REW | | 00543000 * +----------+---------+ 00544000 * 00545000 * OPERATION - 00546000 * 1. BAL R10 TO SUBROUTINE 'FNDVADDR' TO GET THE ADDRESSES 00547000 * OF THE VBLOKS. 00548000 * 2. IF THE DEVICE IS NOT A TAPE, CALL DMKERMSG TO SEND ERROR 00549000 * MESSAGE DMKCPB006E. 00550000 * 3. CALL DMKFREE TO OBTAIN STORAGE FOR AN IOBLOK AND CCW. 00551000 * 4. INITIALIZE THE IOBLOK TO DO A SENSE OPERATION. CALL 00552000 * DMKIOSQR TO DO THE SENSE. GO TO DMKDSPCH TO WAIT FOR THE 00553000 * SENSE TO COMPLETE¬ WHEN SENSE IS DONE| CHECK IF THE TAPE 00554000 * IS READY. IF NOT, CALL DMKFRET TO FRET THE IOBLOK AND 00555000 * THEN CALL DMKQCNWT TO SEND THE RESPONSE 'REWIND NOT 00556000 * PERFORMED' AND EXIT. 00557000 * 5. IF TAPE IS READY, SET UP THE IOBLOK FOR A REWIND AND 00558000 * CALL DMKIOSQR TO DO THE REWIND. CALL DMKQCNWT TO SEND THE 00559000 * RESPONSE 'REWIND COMPLETE' AND EXIT. 00560000 * 00561000 * RESPONSES - 00562000 * REWIND COMPLETE 00563000 * REWIND NOT PERFORMED 00564000 * 00565000 * ERROR MESSAGE - 00566000 * DMKCPB006E INVALID DEVICE TYPE - (ADDR) 00567000 * DMKCPB022E VADDR MISSING OR INVALID 00568000 * DMKCPB040E DEV (ADDR) DOES NOT EXIST 00569000 *. 00570000 EJECT 00571000 DMKCPBRW RELOC REWIND A TAPE 00572000 BAL R10,FNDVADDR GET VBLOKS 00573000 USING VDEVBLOK,R8 00574000 CLI VDEVTYPC,CLASTAPE IS THIS A TAPE DEVICE 00575000 BNE BADTYPE INVALID TYPE 00576000 L R8,VDEVREAL LOAD ADDRESS OF RDEVBLOK 00577000 DROP R8 00578000 USING RDEVBLOK,R8 00579000 USING RCUBLOK,R7 00580000 USING RCHBLOK,R6 00581000 L R7,RDEVCUA ADDRESS OF RCUBLOK 00582000 TM RCUTYPE,RCUSUB IS THIS A SUBORDINATE CU @VA01081 00583000 BZ *+8 NO- BRANCH @VA01081 00584000 L R7,RCUPRIME YES- POINT TO THE PRIME CU @VA01081 00585000 L R6,RCUCHA ADDRESS OF RCHBLOK 00586000 LA R0,IOBSIZE LOAD SIZE OF IOBLOK @VA04137 00587100 CALL DMKFREE GET STORAGE FOR IOBLOK 00588000 LR R10,R1 MAKE R10 BASE FOR IOBLOK 00589000 USING IOBLOK,R10 00590000 XC IOBLOK(IOBSIZE*8),IOBLOK CLEAR IOBLOK 00591000 ST R11,IOBUSER REQUESTOR OF THE SERVICE 00592000 LA R0,3 SIZE OF RCWTASK NEEDED @VA04137 00593500 CALL DMKFREE @VA04137 00594000 ST R1,IOBCAW SAVE ADDRESS OF RCWTASK @VA04137 00594500 LA R0,1 GET BUFFER FOR THE SENSE DATA 00595000 CALL DMKFREE ..... 00596000 MVC 0(8,R1),ZEROES CLEAR BUFFER 00597000 LR R7,R1 SAVE THE BUFFER ADDRESS 00598000 LM R3,R6,REWCCWS LOAD THE SENSE AND REWIND CCW'S 00599000 OR R3,R1 ADDRESS OF SENSE BUFFER TO CCW 00600000 L R1,IOBCAW POINT TO RCWTASK @VA04137 00601090 USING RCWTASK,R1 @VA04137 00601180 XC RCWTASK(24),RCWTASK CLEAR RCWTASK @VA04137 00601270 STM R3,R4,RCWCCW MOVE IN SENSE CCW @VA04137 00601360 LA R3,3 ESTABLISH RCWTASK SIZE @VA04137 00601450 STH R3,RCWCCNT STORE TOTAL NO. OF DBL-WORDS @VA04137 00601540 L R15,FFS INITIALIZE RCWHEAD .... @VA04137 00601630 STH R15,RCWHEAD ... TO 'FFFF' @VA04137 00601720 LA R15,RCWCCW NOW WE HAVE TO.... @VA04137 00601810 ST R15,IOBCAW POINT IOBCAW TO CCW @VA04137 00601900 ST R13,IOBMISC SAVE ADDRESS OF SAVEAREA 00602000 STM R5,R8,SAVEWRK2 SAVE REGISTERS NEEDED UPON RETURN 00603000 LA R1,SENSRETN ADDRESS OF RETURN FROM SENSE 00604000 ST R1,IOBIRA STORE IT 00605000 TM RDEVSTAT,RDEVBUSY IF THE DEVICE IS ALREADY BUSY... 00606000 BO NOREW ...WE WON'T START THE REWIND 00607000 CALL DMKIOSQR QUEUE IT 00608000 GOTO DMKDSPCH WAIT FOR IT 00609000 SPACE 00610000 SENSRETN EQU * 00611000 USING *,R12 00612000 SL R12,=A(SENSRETN-DMKCPB) REESTABILISH ADDRESSABLITY 00613000 USING DMKCPB,R12 00614000 L R13,IOBMISC RELOAD SAVEAREA ADDRESS 00615000 LM R5,R8,SAVEWRK2 RESTORE NEEDED REGISTERS 00616000 TM 0(R7),X'40' TEST FOR INT. REQ. 00617000 BO NOREW DON'T DO REWIND IF IT IS 00618000 LR R1,R7 BEFORE DOING REWIND 00619000 LA R0,1 FRET THE SENSE BUFFER 00620000 CALL DMKFRET ..... 00621000 L R1,IOBCAW POINT TO CCW @VA04137 00622150 SL R1,F16 POINT TO BEGINNING OF RCWTASK @VA04137 00622300 STM R5,R6,RCWCCW MOVE REWIND CCW INTO RCWTASK @VA04137 00622450 L R1,=A(DMKIOSRW) IRA ADDRESS 00623000 ST R1,IOBIRA STORE IT 00624000 L R1,ASYSVM USE THE SYSTEM VMBLOK FOR THE REW. 00625000 ST R1,IOBUSER ....... 00626000 CALL DMKIOSQR QUEUE REWIND 00627000 MSG 'REWIND COMPLETE' 00628000 B RESWRT SEND MESSAGE AND GET OUT 00629000 SPACE 00630000 NOREW LR R1,R7 FRET SENSE BUFFER 00631000 LA R0,1 .... 00632000 CALL DMKFRET .... 00633000 L R1,IOBCAW POINT TO CCW @VA04137 00633150 SL R1,F16 POINT TO BEGINNING OF RCWTASK @VA04137 00633300 LH R0,RCWCCNT GET SIZE OF RCWTASK @VA04137 00633450 CALL DMKFRET RELEASE RCWTASK @VA04137 00633600 DROP R1 @VA04137 00633750 LR R1,R10 FRET THE IOBLOK 00634000 LA R0,IOBSIZE .... @VA04137 00635500 CALL DMKFRET .... 00636000 MSG 'REWIND NOT PERFORMED' 00637000 B RESWRT SEND RESPONSE AND EXIT 00638000 SPACE 00639000 DROP R8,R10 00640000 SPACE 00641000 BADTYPE LM R0,R1,SAVEWRK2 LOAD ADDRESS AND LENGTH OF BAD ARG. 00642000 B CFP006 GO SEND ERROR MESSAGE 00643000 SPACE 00644000 REWCCWS CCW 04,0,SILI,6 SENSE CCW 00645000 CCW 07,0,SILI,1 REWIND CCW 00646000 EJECT 00647000 *. 00648000 * SUBROUTINE NAME - 00649000 * FNDVADDR 00650000 * 00651000 * FUNCTION - 00652000 * TO LOCATE AND VERIFY THE EXISTENCE OF A VADDR. 00653000 * 00654000 * OPERATION - 00655000 * 1. CALL DMKSCNFD TO LOCATE THE VADDR. IF NONE IS FOUND, CALL 00656000 * DMKERMSG TO SEND ERROR MESSAGE DMKCFP022E. 00657000 * 2. IF THE LENGTH OF THE ARGUMENT IS OVER THREE CHARACTERS, 00658000 * CALL DMKERMSG TO SEND ERROR MESSAGE DMKCFP 022E. 00659000 * 3. CALL DMKCVTHB TO CONVERT THE ADDRESS TO BINARY. IF THE 00660000 * CONVERT FAILS, CALL DMKERMSG TO SEND ERROR MESSAGE 00661000 * DMKCFP022E. 00662000 * 4. CALL DMKSCNVU TO LOCATE THE VBLOK ADDRESSES. IF NOT FOUND, 00663000 * CALL DMKERMSG TO SEND ERROR MESSAGE DMKCFP040E. 00664000 * 5. IF EVERYTHING OS OK, RETURN ON R10. 00665000 *. 00666000 SPACE 3 00667000 FNDVADDR EQU * 00668000 CALL DMKSCNFD GET DEVICE ADDRESS 00669000 BNZ CFP022 BRANCH IF CAN'T FIND 00670000 STM R0,R1,SAVEWRK2 SAVE LEN AND ADDR FOR POSSIBLE ERROR 00671000 CL R0,F3 CAN ONLY HAVE THREE CHARACTERS 00672000 BH CFP022 BRANCH IF HE GOOFED 00673000 CALL DMKCVTHB CONVERT THE ADDRESS TO BINARY 00674000 BNZ CFP022 BAD CONVERT IF BRANCH 00675000 MAXDV R15 GET HIGHEST VIRTUAL DEVICE 00676000 CLR R1,R15 VALID VIRTUAL ADDRESS ? 00677000 BH CFP022 NOPE ---- 00678000 CALL DMKSCNVU NOW LETS GET THE BLOKS 00679000 BNZ CPBCKMSS MAY BE RESET OF MSS PENDING VADDR@V60B6B8 00680000 BR R10 RETURN--- 00681000 EJECT 00682000 CFP005 LA R2,005 LOAD ERROR CODE 00683000 B CALLERM . . . 00684000 SPACE 00685000 CFP006 LA R2,006 ERROR CODE 00686000 B CALLERM . . . 00687000 SPACE 00688000 CFP012 LA R2,012 ERROR CODE 00689000 B CALLERM . . . 00690000 CFP026 LA R2,26 ERROR CODE 00691000 B NOVAR 00692000 CFP022 LA R2,22 ERROR CODE 00693000 B NOVAR . . . 00694000 CFP040 CALL DMKCVTBH CONVERT TO PRINTABLE FORM 00695000 N R1,X40FFS BLANK HIGH BYTE 00696000 SLR R0,R0 ZERO LENGTH REGISTER 00697000 LA R2,40 ERROR CODE 00698000 B CALLERM . . . 00699000 CPBCKMSS EQU * SEE IF DEVICE HAS I/O PENDING @V60B6B8 00699020 * 00699040 * IF THE VADDR SPECIFIED IS MAPPED TO AN MSS 3330V, 00699060 * THEN IT IS POSSIBLE THAT DMKVSI OR DMKDGD 00699080 * HAS QUEUED A SIO, PENDING THE VOLUME MOUNT 00699100 * AND VDEVBLOK BUILD. IF THIS IS THE CASE, 00699120 * CLEAR THE PENDING I/O. 00699140 * 00699160 L R3,MSSQADD ADDR OF Q OF MSSCOM BLOCKS @V60B6B8 00699180 LTR R3,R3 IS THE VCON = 0,POSSIB. NO DMKSSS@VA09319 00699185 BZ CFP040 NO, BAD RESET COMMAND @VA09319 00699190 L R3,0(R3) POINTER TO FIRST MSSCOM BLOCK @V60B6B8 00699200 USING OSVSCOM,R3 ASSEMBLER ADDRESSABILITY @V60B6B8 00699220 TESTBLOK EQU * SEE IF THERE IS A BLOCK @V60B6B8 00699240 LTR R3,R3 IS THERE A BLOCK PTR @V60B6B8 00699260 BZ CFP040 NO, BAD RESET COMMAND @V60B6B8 00699280 CLC VMUSER(8),MSSUSER IS BLOCK FOR THIS USER @V60B6B8 00699300 BE TESTDEV YES, SEE IF THIS DEVICE @V60B6B8 00699320 NEXTCOM EQU * GET NEXT MSSCOM BLOCK @V60B6B8 00699340 L R3,MSSNEXT NEXT BLOCK CHAIN PTR @V60B6B8 00699360 B TESTBLOK SEE IF THERE IS ONE @V60B6B8 00699380 TESTDEV EQU * SEE IF THIS DEVICE IS PENDING @V60B6B8 00699400 L R4,MSSTASK2 CPEXBLOK PTR @V60B6B8 00699420 LTR R4,R4 IS THERE ONE @V60B6B8 00699440 BZ NEXTCOM NO, TEST FOR ANOTHER MSSCOM @V60B6B8 00699460 DROP R3 @V60B6B8 00699480 * 00699500 * TEST TO SEE IF THE VADDR ON THE RESET COMMAND IS THE 00699520 * SAME AS THE VADDR WHICH HAS MSS I/O PENDING 00699540 * 00699560 C R1,CPEXMISC-CPEXBLOK(R4) IS IT THIS VADDR @V60B6B8 00699580 BNE CFP040 NO, JUST BAD PARAMETER @V60B6B8 00699600 LR R1,R4 CPEXBLOK ADDR @V60B6B8 00699620 LA R0,4 RETURN CODE VALUE @V60B6B8 00699640 ST R0,CPEXMISC-CPEXBLOK(R1) SET ERROR CODE @V60B6B8 00699660 CALL DMKSTKCP STACK THE EXBLOK @V60B6B8 00699680 GOTO DMKDSPCH AND CALL THE DISPATCHER @V60B6B8 00699700 SPACE 00700000 NOVAR SR R1,R1 ZERO ARG REG 00701000 CALLERM ICM R0,14,MODID+3 INSERT MODULE ID 00702000 CALL DMKERMSG CALL MESSAGE MODULE 00703000 * 00704000 * MESSAGE MODULE RETURNS DIRECTLY TO DMKCFM 00705000 * 00706000 MSSQADD DC V(DMKSSSMQ) @V60B6B8 00706500 EJECT 00707000 LTORG 00708000 EJECT 00709000 OSVSCOM MSSCOM @V60B6B8 00709500 PSA , @V306638 00710000 COPY DEVTYPES @V306638 00711000 COPY EQU @V306638 00712000 COPY IOBLOKS @V306638 00713000 COPY RBLOKS @V306638 00714000 COPY SAVE @V306638 00715000 COPY VBLOKS @V306638 00716000 COPY VMBLOK @V306638 00717000 COPY XINTBLOK @V306638 00718000 END DMKCPB 00719000