TRD TITLE 'DMKTRD (CP) VM/370 - RELEASE 6' 00001000 ISEQ 73,80 VALIDATE SEQUENCING OF SOURCE 00002000 *. 00003000 * MODULE NAME - 00004000 * 00005000 * DMKTRD 00006000 * 00007000 * FUNCTION - 00008000 * 00009000 * TO PROVIDE A VIRTUAL MACHINE WITH THE FACILITY TO TRACE 00010000 * I/O INSTRUCTIONS WITH OUTPUT ON THE PRINTER, TERMINAL, 00011000 * OR BOTH. 00014000 * 00015000 * ATTRIBUTES - 00016000 * 00017000 * REENTRANT, PAGEABLE, CALLED VIA SVC 00018000 * 00019000 * ENTRY POINTS - 00020000 * 00021000 * DMKTRDSI - PROCESS AN I/O OPERATION (SIO, TIO, HIO, TCH) 00026000 * 00027000 * DMKTRDWT - SERIALIZATION ENTRY FOR I/O AND CCW TRACING 00028000 * 00033000 * ENTRY CONDITIONS - 00034000 * 00035000 * FOR ALL ENTRY POINTS: 00036000 * 00037000 * GPR 11 = ADDRESS OF VIRTUAL MACHINE VMBLOK 00038000 * GPR 12 = ENTRY POINT ADDRESSABILITY 00039000 * GPR 13 = ADDRESS OF STANDARD SAVE AREA 00040000 * 00041000 * FOR DMKTRDSI (SIO,TIO,HIO,TCH) ENTRY POINT: 00071000 * 00072000 * GPR 1 = VIRTUAL DEVICE ADDRESS 00073000 * GPR 8 = ADDRESS OF VDEVBLOK 00074000 * GPR 10 = ADDRESS OF IOBLOK (FOR 'SIO' WITH CC = 0) 00075000 * 'VMINST' FIELD (IN VMBLOK) HOLDS THE INSTRUCTION 00076000 * 00077000 * 00078000 * FOR DMKTRDWT ENTRY POINTS: 00079000 * 00080000 * (NO SPECIAL REGISTER REQUIREMENTS OTHER THAN GPR11-13) 00081000 * 00082000 * EXIT CONDITIONS - 00095000 * 00096000 * APPROPRIATE OUTPUT MESSAGES HAVE BEEN GIVEN ON THE USER'S 00102000 * TERMINAL AND/OR VIRTUAL PRINTER; THE USER'S 00103000 * VIRTUAL MACHINE IS IN THE SAME RUNNABLE (OR NON-RUNNABLE) 00106000 * STATE AS IT WOULD BE IF TRACING WERE NOT IN EFFECT. 00107000 EJECT 00108000 * CALLS TO OTHER ROUTINES - 00109000 * 00110000 * DMKQCNWT - WRITE A MESSAGE TO USER TERMINAL 00111000 * DMKVSPRT - WRITE A MESSAGE ON PRINTER 00112000 * DMKCVTBH - CONVERT BINARY FIELDS TO HEXADECIMAL 00113000 * DMKSCNRD - TO GET REAL DEVICE ADDRESS IN CCU FORM 00114000 * DMKSCNVU - TO GET VIRTUAL DEVICE BLOCKS 00115000 * DMKSCNVN - TO GET MNEMONIC NAME OF VIRTUAL DEVICE (E.G. DASD) 00116000 * DMKSCNRN - TO GET MNEMONIC NAME OF REAL DEVICE 00117000 * DMKDSPCH - TO DISPATCH USER 00118000 * DMKNEMOP - TO GET MNEMONIC EQUIVALENT OF A 370 OP CODE 00119000 * DMKFREE - TO GET FREE STORAGE FOR TRACE CONTROL BLOCK 00120000 * DMKFRET - TO RETURN TRACE CONTROL BLOCK TO FREE STORAGE 00121000 * DMKCFMBK - TO INITIATE A READ FROM A TERMINAL 00122000 * DMKPTRAN - TO BRING A USER PAGE INTO MEMORY WHEN NEEDED 00123000 * DMKCCWSB - TO OBTAIN SEEK ARGS FOR CCW TRACING 00128000 * DMKVATRN - TO PERFORM VIRTUAL ADDRESS TRANSLATION AS NEEDED 00131000 * DMKPSASP - TO CHECK FOR STORAGE PROTECTION 00132000 * 00133000 * EXTERNAL REFERENCES - 00134000 * 00135000 * NONE 00136000 * 00137000 * TABLES / WORK AREAS - 00138000 * 00139000 * TRACE CONTROL BLOCK 00140000 * 00141000 * REGISTER USAGE - 00142000 * 00143000 * GPR 9 = ADDRESS OF TRACE CONTROL BLOCK 00144000 * GPR 10 = ADDRESS OF IOBLOK (WHERE APPLICABLE) 00145000 * GPR 12 - BASE REGISTER 00146000 * GPR 13 - ADDRESS OF STANDARD SAVE AREA 00147000 * 00148000 * OTHER REGISTERS = WORK REGISTERS 00149000 EJECT 00150000 * NOTES - 00151000 * 00152000 * SEE "RESTRICTIONS" (PRECEDING "ERROR MESSAGES") 00153000 * 00154000 * VARIOUS TRACE OPTIONS CAN BE SET CUMULATIVELY BY ISSUING 00155000 * SUCCESSIVE TRACE COMMANDS; FOR EXAMPLE TO HAVE BRANCH 00156000 * TRACING ON THE TERMINAL (WITH RUN ON) AND FULL INSTRUCTION 00157000 * TRACING ON THE PRINTER THE FOLLOWING COULD BE ISSUED 00158000 * (ASSUMING THE USER IS IN CP MODE): 00159000 * 00160000 * TRACE BRANCH TERMINAL RUN 00161000 * TRACE INSTRUCT PRINTER 00162000 * BEGIN (OR SIMILAR CP COMMAND) 00163000 * 00164000 * FOR FULL INSTRUCTION OR BRANCH TRACING, ANY INSTRUCTION 00165000 * WHICH MODIFIES THE NEXT BYTE IN STORAGE (FOLLOWING THE 00166000 * INSTRUCTION) WILL CAUSE ERRONEOUS RESULTS, USUALLY 00167000 * RESULTING IN TRACING BEING TERMINATED UNTIL AN INTERRUPT 00168000 * OCCURS. 00169000 * 00170000 * SIMILARLY, AN INSTRUCTION WHICH EXAMINES EITHER (OR BOTH) 00171000 * OF THE NEXT TWO BYTES FOLLOWING THE INSTRUCTION (WHEN 00172000 * RUNNING WITH FULL INSTRUCTION OR BRANCH TRACING) WILL 00173000 * OBTAIN ERRONEOUS DATA. 00174000 * 00175000 * AN INSTRUCTION WHICH EXECUTES THE NEXT INSTRUCTION IN 00176000 * SEQUENCE, ON THE OTHER HAND, WILL BE HANDLED SATISFACTORILY, 00177000 * EXCEPT THAT ONLY THE FIRST EXECUTION OF THE INSTRUCTION WILL 00178000 * WILL BE TRACED. (IF NO TRANSFER OCCURS, THE 'EX' DROPS THRU, 00179000 * AND THE INSTRUCTION IS DONE AGAIN IN LINE, IT WILL NOT 00180000 * BE TRACED THE SECOND TIME. TRACING WILL THEN RESUME WITH 00181000 * THE NEXT INSTRUCTION FOLLOWING THE EXECUTED INSTRUCTION.) 00182000 * 00183000 * WHEN SEVERAL TRACE OPTIONS ARE IN EFFECT, THE SAME 00184000 * INSTRUCTION CAN APPEAR IN THE TRACE OUTPUT MORE THAN 00185000 * ONCE. FOR EXAMPLE, IF FULL INSTRUCTION TRACING WERE 00186000 * IN EFFECT, A START I/O (SIO) INSTRUCTION WOULD BE TRACED 00187000 * BEFORE IT IS EXECUTED; SUBSEQUENTLY, WHEN THE SIO HAS 00188000 * BEEN HANDLED BY CP, AND THE CONDITION CODE IS READY 00189000 * TO BE REFLECTED TO THE USER, THE SIO WOULD BE TRACED 00190000 * AGAIN WITH THE USUAL PERTINENT INFORMATION GIVEN FOR 00191000 * THE TRACING OF I/O OPERATIONS (SEE RESPONSES). 00192000 EJECT 00193000 * OPERATION - 00194000 * 00195000 * NOTE: DMKTRACE - INITIALIZE, MODIFY, OR TERMINATE THE TRACE 00196000 * FUNCTION - IS LOCATED IN "DMKTRA" (A SEPARATE MODULE). 00197000 * 00198000 * DMKTRDSI - PROCESS AN I/O OPERATION (SIO, TIO, HIO, TCH) 00229000 * 00230000 * A TRACE OUTPUT LINE IS CONSTRUCTED CONTAINING THE 00231000 * PERTINENT INFORMATION FOR A SIO, TIO, HIO, TCH AT THE POINT 00232000 * AT WHICH THE CONDITION-CODE IS ABOUT TO BE REFLECTED TO THE 00233000 * USER; THE OUTPUT LINE IS THEN PRESENTED TO THE USER IN THE 00234000 * USUAL WAY, EXCEPT THAT IF 'CCW' WAS SPECIFIED, AND A 00235000 * SUCCESSFUL SIO WAS TRACED, THE VIRTUAL MACHINE DOES NOT 00236000 * PAUSE AS USUAL EVEN IF NORUN WAS SPECIFIED, BUT ALLOWS THE 00237000 * CCW TRACING TO BE DONE AS SOON AS PRACTICAL. 00238000 * 00239000 * IF A SUCCESSFUL SIO HAS BEEN TRACED AND CCWS ARE ALSO 00240000 * SPECIFIED, THEN A STRING OF OUTPUT LINES IS GIVEN SHOWING THE 00241000 * VIRTUAL AND REAL CCWS; NO PAUSE IS MADE UNTIL ALL LINES ARE 00242000 * GIVEN; ADDITIONAL LINES ARE GIVEN IF IDA WAS SET FOR 00243000 * THE REAL CCWS (AND VIRTUAL CCWS), OR IF SEEK ARGUMENTS ARE 00244000 * PRESENT. THE VIRTUAL INFORMATION IS GIVEN FIRST, THE REAL 00245000 * INFORMATION ON THE RIGHT SIDE OF THE PRINTOUTS. 00246000 * 00285000 * NOTE: WHEN PRINTING TRACE OUTPUT LINES, IF A SEVERE ERROR 00286000 * (R2 = 8 - FOR SPOOLING SPACE FULL) IS RETURNED BY DMKVSPRT, 00287000 * THEN A FORCED 'TRACE END' IS TRIGGERED TO TERMINATE TRACING. 00288000 EJECT 00289000 * RESPONSES - 00290000 * 00291000 * TERMINAL RESPONSES FOR VARIOUS TRACING SITUATIONS: 00292000 * (SEE KEYS BELOW) 00293000 * 00294000 * 1. I/O INSTRUCTION - SIO/SIOF, TIO, HIO/HDV, OR TCH: 00295000 * 00296000 * A. TCH: 00297000 * 00298000 * I/O VVVVVV TCH 240XXXXX TYPE VADD CC N 00299000 * 00300000 * B. TIO OR HIO/HDV: 00301000 * 00302000 * I/O VVVVVV MNEM 240XXXXX TYPE VADD CC N TYPE RADD CSW XXXX 00303000 * 00304000 * C. SIO/SIOF: 00305000 * 00306000 * I/O VVVVVV MNEM 240XXXXX TYPE VADD CC N TYPE RADD CSW XXXX CAW VV..VV 00307000 * 00308000 * 2. CCW ("IDAL" OR "SEEK" LINES INCLUDED ONLY IF APPLICABLE): 00308050 * 00308100 * CCW VVVVVV XXXXXXXX XXXXXXXX RRRRRR YYYYYYYY YYYYYYYY 00308150 * " IDAL VVVVVVVV VVVVVVVV IDAL 00RRRRRR 00RRRRRR 00308200 * " SEEK XXXXXXXX XXXXXX SEEK YYYYYYYY YYYY 00308250 * 00308300 * VVVVVV = VIRTUAL ADDRESS 00308350 * RRRRRR = REAL ADDRESS 00308400 * XXXXXXXX = VIRTUAL INSTRUCTION, COMMAND, ETC. 00308450 * YYYYYYYY = REAL INSTRUCTION, COMMAND, ETC. 00308500 * ERROR MESSAGES - 00382000 * 00383000 * NONE 00384000 *. 00385000 SPACE 2 00386000 * REVISED "RELOC" MACRO - USES HALFWORDS (TO SAVE SPACE): 00387000 MACRO 00388000 &NAME RELOC 00389000 ENTRY &NAME 00390000 &NAME DS 0H 00391000 USING *,R12 00392000 ENTER 00393000 SH R12,=AL2(&NAME-&SYSECT) 00394000 USING &SYSECT,R12 00395000 MEND 00396000 EJECT 00397000 COPY OPTIONS 00398000 COPY LOCAL 00399000 EJECT 00400000 DMKTRD CSECT LOADER CONTROL 00401000 SPACE 00402000 DC CL8'DMKTRD' MODULE IDENTIFIER 00403000 SPACE 00404000 USING PSA,R0 00405000 USING TREXT,R9 00406000 USING VMBLOK,R11 00407000 USING DMKTRD,R12 00408000 USING SAVEAREA,R13 00409000 * 00410000 EXTRN DMKCVTBH 00411000 EXTRN DMKSYSRM @VA03162 00412000 EXTRN DMKSCNRD,DMKSCNVU,DMKSCNVN,DMKSCNRN 00413000 EXTRN DMKVSPRT 00414000 EXTRN DMKCFMBK 00416000 EXTRN DMKNEMOP 00417000 EXTRN DMKLOCKQ,DMKLOCKD @V200820 00419000 EXTRN DMKPTRUL @V408246 00419100 EXTRN DMKCCWSB 00420000 EXTRN DMKSTKCP @VA07421 00420100 EXTRN DMKVATRN 00421000 * 00423000 * 00426000 SPACE 00455000 DMKTRDSI RELOC PROCESS A SIO/TIO/TCH/HIO 00456000 BAL R14,TRAINIT CALL INITIALIZER SUBROUTINE 00457000 MVC TRLNSIO(3),PFXIO PUT IN PREFIX FOR SIO ETC. 00458000 LH R0,VMINST 1ST 2 BYTES OF SIO (ETC.) INTO R0 00459000 LA R1,TRLNSIO5 POINT TO WHERE TO PUT SIO MNEMONIC 00460000 CALL DMKNEMOP GET 'SIO' 'SIOF' 'TIO' 'HIO' 'HDV' 'TCH' 00461000 LA R5,VMTRSIO SIGNAL IN R5 - DMKTRDSI ENTRY 00462000 L R1,VMPSW+4 VIRTUAL MACHINE PSW ADDRESS FIELD 00463000 SL R1,F4 LESS 4 GIVES ADDRESS OF INSTRUCTION 00464000 TRAJOIN2 STC R5,SAVEWRK1+2 STORE INPUT FLAG BITS 00478000 SR R15,R15 SET TO ZERO @VA07715 00479100 IC R15,TREXCTL1 GET CONTROL FLAG @VA07715 00479200 NR R5,R15 DOES IT MATCH CONTROL FLAG @VA07715 00479300 BNZ TRAJOIN3 IF YES WE HAVE NO PROBLEMS. 00480000 MVC SAVEWRK1+3(1),TREXCTL2 IF NOT, THEN SET BRANCH AND/OR 00481000 NI SAVEWRK1+3,(TREXBRAN+TREXINST) INSTRUCT CONTROL BITS 00482000 TRAJOIN3 CALL DMKCVTBH OLD PSW ADDRESS TO HEX PLEASE 00483000 STH R0,TRLNINT1 STORE 6-BYTE HEX ADDRESS 00484000 STCM R1,B'1111',TRLNINT1+2 @VA07715 00485100 B TRA120 HANDLE SIO/TIO/HIO/TCH @V4M0240 00486000 EJECT 00487000 TRA90 BAL R3,TROUSUB NOW GIVE THE OUTPUT MESSAGE 00555000 * 00556000 TRA92 DS 0H HERE WHEN WE'RE "ALL FINISHED" 00557000 ICM R15,B'0011',TREXTERM PICK UP THE TERMINAL FLAGS @V408246 00558100 BZ TRA94 NOPE, AIM FOR EXIT W/O STOP. @VA00782 00560000 LH R15,TREXRUNF PICK UP STOP/RUN FLAG BITS 00561000 N R15,SAVEWRK1 SHOULD WE STOP OR KEEP RUNNING ? 00562000 BZ TRA96 IF "NORUN", GO CALL DMKCFMBK "BREAK" RTN 00563000 TRA94 CLI SAVEWRK8+3,00 FOR "RUN", ANY ERRORS FROM DMKQCNWT ? 00564000 BE TRA97 IF NOT (NO ATTN HIT BY USER), GO EXIT. 00565000 * 00566000 * TRIGGER A STOP AFTER TRACING THIS EVENT, EITHER BECAUSE 'RUN' FLAG 00567000 * IS NOT SET, OR BECAUSE THE USER HIT ATTENTION DURING TERMINAL OUTPUT: 00568000 TRA96 CLI SAVEWRK2,X'83' IS IT A DIAG ?? 00569000 BNE TRA961 NO, OK 00570000 CLC SAVEWRK2+2(2),F8+2 IS DIAG CONSOLE FUNCTION 00571000 BE TRA97 YES, DONT CALL DMKCFMBK, DIAG WILL DO IT 00572000 TRA961 CALL DMKCFMBK ENTER CONSOLE FUNCTION MODE 00573000 OI SAVEWRK7,VMCFWAIT REMEMBER THAT DMKCFMBK SET VMCFWAIT 00574000 TRA97 EQU * UNLOCK USER'S TREXT BLOCK @V200820 00575000 ST R9,TRALOCK+4 SETUP LOCK "NAME" @V200820 00576000 LA R1,TRALOCK POINT TO IT FOR DMKLOC @V200820 00577000 CALL DMKLOCKD UNLOCK - TRACING FINISHED @V200820 00578000 TRAEXIT DS 0H RESTORE VMRSTAT FLAGBITS (AS NEEDED) BEFORE EXIT: 00580000 OI SAVEWRK7,255-(VMEXWAIT+VMCFWAIT) PRESERVE ALL OTHER BITS 00581000 NC VMRSTAT(1),SAVEWRK7 RESTORE VMEXWAIT|VMCFWAIT AS NEEDED 00582000 TRAEXITR LCTL C1,C1,VMSEG BE SURE CONTROL REG 1 IS CORRECTLY SET, 00583000 TM SAVEWRK8,SETCC SET COND CODE 0 OR NONZERO 00584000 EXIT AND REALLY EXIT. 00585000 EJECT 00611000 TRA120 DS 0H HANDLE SIO/TIO/HIO/TCH CASES: 00612000 MVC TRLNSIO2(3),CLDEV DEFAULT DEVICE-NAME TO 'DEV' 00613000 L R1,VMINST GET 4-BYTE INSTRUCTION 00614000 CALL DMKCVTBH BINARY TO HEX, 00615000 STCM R0,B'1111',TRLNSIO4 STORE IN MESSAGE @VA07715 00616100 STCM R1,B'1111',TRLNSIO4+4 STORE IN MSG @VA07715 00616200 L R1,SAVER1 CALLER'S R1 HOLDS THE VIRTUAL DEVICE ADDR 00617000 CALL DMKCVTBH INTO HEX HE SHALL GO 00618000 ST R1,TRLNSIO3 AND STORE IN MESSAGE 00619000 L R1,SAVER1 PICK UP THAT VIRTUAL DEVICE ADDRESS AGAIN 00620000 CALL DMKSCNVU DO WE HAVE A VIRTUAL DEVICE BLOCK ? 00621000 BNZ TRA122 NOPE - DON'T TRY TO GET NAME, THEN. 00622000 CALL DMKSCNVN YES - GET VIRTUAL DEVICE NAME (E.G. DASD) 00623000 STCM R1,B'1111',TRLNSIO2 STORE IN MESSAGE @VA07715 00624100 TRA122 MVC TRLNSIOB(2),CLCC NOW SET 'CC' IN MESSAGE 00625000 IC R3,VMPSW+4 GET CC ETC. FOR "VANILLA" MACHINE 00626000 TM VMESTAT,VMEXTCM EXTENDED CONTROL MODE NOW ? 00627000 BZ TRA124 NOPE - SIMPLE. 00628000 IC R3,VMPSW+2 GET CC FOR EXTENDED CONTROL MODE MACHINE 00629000 TRA124 SRL R3,4 4 PLACES TO THE RIGHT, GENTLEMEN 00630000 LTR R10,R10 DO WE HAVE AN IOBLOK FROM THE CALLER ? 00631000 BZ TRA125 NOPE - USE R3 AS WE HAVE IT FROM VMPSW 00632000 USING IOBLOK,R10 00633000 IC R3,IOBSTAT YES - GET CONDITION-CODE FROM IOBLOK 00634000 TRA125 N R3,F3 ISOLATE LOW-ORDER 2-BITS OF COND CODE 00636000 LR R1,R3 PLACE IN R1 (REMEMBERING IT IN R3) 00637000 AL R1,F240 + X'F0' = FAST BINARY-TO-DEC FOR 1 DIGIT 00638000 STC R1,TRLNSIOC STORE IN OUTPUT MESSAGE 00639000 CL R3,F3 CONDITION CODE 3 ? 00640000 BE TRA90 IF YES THAT'S THE END. 00641000 CLI VMINST,X'9F' OR A 'TCH' ? 00642000 BE TRA90 IF YES WE'RE ALSO THRU. 00643000 USING VDEVBLOK,R8 R8 STILL HOLDS A (VDEVBLOK) FROM CALLER 00644000 * CHECK FOR POSSIBLE SIMULATED OR SPOOLED DEVICES 00645000 TM VDEVTYPC,CLASTERM+CLASURI+CLASURO+CLASGRAF @VM01006 00646000 BZ TRA126 NO .. 00647000 TM VDEVSTAT,VDEVDED CONTINUE ONLY IF DEDICATED .. 00648000 BZ TRA90 MUST BE SPOOLED OR SIMULATED 00649000 TRA126 EQU * 00650000 MVC SAVEWRK7+1(1),VDEVTYPC SAVE THE DEVICE CLASS 00651000 CLI VDEVTYPC,CLASSPEC CHANNEL TO CHANNEL ADAPTER ? 00652000 BNE TRA126C NO -- NORMAL DEVICE 00653000 LA R4,TRLNSIOD CSW START IF VIRTUAL CTCA 00654000 TM VDEVSTAT,VDEVDED IS THE CTCA DEDICATED ? 00655000 BZ TRA126B NO -- LEAVE OUT REAL DEVICE DATA 00656000 TRA126C EQU * 00657000 L R8,VDEVREAL POINT TO REAL DEVICE BLOCK 00658000 DROP R8 (R8 POINTS TO REAL DEVICE BLOCK NOW) 00659000 LTR R10,R10 DID WE GET AN IOB WITH THIS ONE? @V407438 00659250 BZ TRD126C2 NOPE, THEN GET FIRST PATH CCU @V407438 00659500 LH R1,IOBRADD YA, GET CCU (PATH) THAT IOS USED @V407438 00659750 B TRD126C3 AND CONTINUE @V407438 00660000 SPACE 00660250 TRD126C2 CALL DMKSCNRD GET FIRST PATH CCU @V407438 00660500 TRD126C3 CALL DMKCVTBH CONVERT ADDR TO PRINTABLE HEX @V407438 00660750 DROP R10 NO MORE IOB @V407438 00661000 STCM R1,B'1111',TRLNSIOE STORE IN OUTPUT MSG @VA07715 00662100 CALL DMKSCNRN GET REAL NAME OF DEVICE 00663000 ST R1,TRLNSIOD STORE IN MESSAGE 00664000 LA R4,TRLNSIOF R4 = WHERE TO PUT CAW IF CC = 0 FOR SIO 00665000 TRA126B EQU * 00666000 CL R3,F1 CHECK CONDITION CODE 00667000 BL TRA127 IF CC=0, GO CHECK IF WAS AN SIO ETC. 00668000 BH TRA90 IF CC > 1, THERE'S NO CSW TO HANDLE 00669000 MVC 0(3,R4),CLCSW FOR CC = 1 SHOW THE CSW 00670000 USING IOBLOK,R10 00671000 LA R2,IOBCSW+4 LET R2 POINT TO IOBCSW+4 (IF ANY) 00672000 DROP R10 00673000 LTR R10,R10 DOES AN IOBLOK EXIST ? 00674000 BNZ TRA126A YES - R2 ALL SET, CONVERT TO HEX 00675000 LA R1,CSW+4 NO - GET CSW+4/5 FROM USER'S PAGE 0 00676000 BAL R14,TRANBRNG ... 00677000 TRA126A LH R1,0(,R2) GET ACTUAL CSW+4/5 (FROM THE RIGHT PLACE) 00678000 CALL DMKCVTBH BINARY TO HEX PLEASE 00679000 ST R1,TRLNSIOG-TRLNSIOF(,R4) STORE IN MESSAGE 00680000 LA R4,TRLNSIO9-TRLNSIOF(,R4) R4 = WHERE TO PUT CAW NOW 00681000 * 00682000 TRA127 CLI VMINST,X'9C' IF CC = 0 OR 1, WAS IT AN SIO ? 00683000 BNE TRA90 IF NOT, GIVE MESSAGE AND EXIT. 00684000 MVC 0(3,R4),CLCAW FILL IN 'CAW', 00685000 TRA127A LA R1,CAW FOR 'SIO' (X'9C'), FIND THE USER'S CAW 00686000 BAL R14,TRANBRNG ... 00687000 L R1,0(,R2) ... 00688000 TRA127B CALL DMKCVTBH USER'S CAW BINARY TO HEX 00689000 STM R0,R1,4(R4) AND STORE IN THE MESSAGE 00690000 TM TREXCTL2,TREXCCW IF YES, WAS CCW TRACING WANTED ? 00691000 BZ TRA90 IF NOT JUST GIVE MESSAGE & EXIT. 00692000 LTR R10,R10 MAKE SURE WE HAVE AN IOBLOK 00693000 BNP TRA90 IF NOT, FORGET IT - CAN'T TRACE CCWS. 00694000 BAL R3,TROUSUB SIO, CC=0 OR 1, CCW TRACING - GIVE SIO 00695000 * OUTPUT LINE, AND CONTINUE ... 00696000 EJECT 00697000 * GIVE TRACE OUTPUT FOR A CCW STRING: 00698000 MVI SAVEWRK1+2,0 SHUT OFF SIO TO AVOID TROUSUB @VA00782 00699000 * CONFUSING IMPLIED OPTIONS ABOUT 00700000 * OUTPUT DEVICES. 00701000 MVI SAVEWRK1+3,TREXCCW INDICATE TRACING CCWS 00702000 USING IOBLOK,R10 00703000 L R10,IOBCAW GET POINTER TO FIRST REAL CCW STRING 00704000 DROP R10 (THRU WITH IOBLOK) 00705000 SL R10,F16 BACK UP TO POINT TO BEG OF FIRST RCWTASK 00706000 * 'SL' HANDLES HIGH-ORDER BYTE (IF ANY) IN IOBCAW 00707000 * 00708000 TRA129 BAL R14,BLANKBUF BLANK-FILL THE OUTPUT BUFFER, THEN ... 00709000 USING RCWTASK,R10 R10 REFERENCES RCWTASK 00710000 L R4,RCWVCAW R4 = ADDRESS OF VIRTUAL CCWS 00711000 LH R5,RCWVCNT R5 = COUNT OF VIRTUAL CCWS 00712000 LA R6,RCWCCW R6 = ADDRESS OF REAL CCWS 00713000 LH R7,RCWRCNT R7 = COUNT OF REAL CCWS 00714000 B TRA133 START WITH 1ST VIRTUAL AND REAL CCWS 00715000 * 00716000 * NOTE - SAVEWRK2-3 WILL HOLD THE VIRTUAL CCW 00717000 * SAVEWRK4-5 WILL HOLD THE REAL CCW 00718000 * 00719000 TRA132 DS 0H LOOP TO OBTAIN & PRINT VIRTUAL & REAL CCWS: 00720000 TM SAVEWRK4+5,RCWGEN WAS PREVIOUS REAL CCW CP-GENERATED ? 00721000 BO TRA135 IF YES, DON'T TOUCH THIS VIRTUAL CCW. 00722000 TRA133 MVC SAVEWRK2(8),ZEROES CLEAR VIRTUAL CCW (UNTIL WE GET IT) 00723000 LTR R5,R5 ARE THERE ANY VIRTUAL CCWS LEFT ? 00724000 BNP TRA135 NOPE - DON'T GET ANY NONEXISTENT ONES 00725000 MVC TRLNCCW,PFXCCW HEADING 00726000 LR R1,R4 GET ADDRESS OF VIRTUAL CCW, 00727000 CALL DMKCVTBH BINARY TO HEX 00728000 STH R0,TRLNCCW1 STORE IN OUTPUT MESSAGE (6 BYTES) 00729000 STCM R1,B'1111',TRLNCCW1+2 @VA07715 00730100 LR R1,R4 ADDRESS OF VIRTUAL CCW 00731000 BAL R14,TRANBRNG GET THE CCW FROM SOMEWHERE IN USER CORE 00732000 BNZ TRA134 IF BAD ADDRESS LEAVE IT OUT 00733000 LM R1,R2,0(R2) GET THE VIRTUAL CCW IN R1-R2, 00734000 STM R1,R2,SAVEWRK2 AND SAVE FOR GENERAL USE 00735000 CALL DMKCVTBH 1ST HALF BINARY TO HEX 00736000 STCM R0,B'1111',TRLNCCW2 STORE INTO OUTOUT MSG @VA07715 00737100 STCM R1,B'1111',TRLNCCW2+4 STORE INTO OUTPUT MSG @VA07715 00737200 LR R1,R2 NOW 2ND HALF BINARY TO HEX 00738000 CALL DMKCVTBH ... 00739000 STM R0,R1,TRLNCCW3 AND STORE 00740000 TRA134 LA R4,8(,R4) ADVANCE TO NEXT VIRTUAL CCW FOR NEXT TIME 00741000 BCT R5,TRA136 DECREMENT COUNT AND GO 00742000 B TRA136 GET THE REAL CCW. 00743000 * 00744000 TRA135 MVI TRLNCCW+1,PFXDITTO INDICATE CONTINUATION OF PREVIOUS CCW 00745000 * 00746000 TRA136 LR R1,R6 ADDRESS OF REAL CCW 00747000 CALL DMKCVTBH BINARY TO HEX 00748000 STH R0,TRLNCCW4 STORE 00749000 ST R1,TRLNCCW4+2 ... 00750000 LM R1,R2,0(R6) GET THE REAL CCW IN R1-R2, 00751000 STM R1,R2,SAVEWRK4 AND SAVE FOR GENERAL USE 00752000 CALL DMKCVTBH 1ST HALF BINARY TO HEX 00753000 STCM R0,B'1111',TRLNCCW5 STORE IN OUTPUT MSG @VA07715 00754100 STCM R1,B'1111',TRLNCCW5+4 STORE INTO MSG @VA07715 00754200 LR R1,R2 2ND HALF BINARY TO HEX 00755000 CALL DMKCVTBH ... 00756000 STCM R0,B'1111',TRLNCCW6 STORE INTO OUTPUT MSG @VA07715 00757100 STCM R1,B'1111',TRLNCCW6+4 STORE INTO MESSAGE @VA07715 00757200 BAL R3,TROUSUB OUTPUT THE FINISHED LINE 00758000 BAL R14,BLANKBUF AND RE-INITIALIZE THE MESSAGE BUFFER 00759000 L R3,SAVEWRK4 PICK UP ADDR @VA05047 00760000 LA R3,0(,R3) CLEAR FIRST BYTE @VA05047 00760300 L R14,=A(DMKSYSRM) GET ADDR OF REAL MACHINE SIZE @VA05047 00760600 L R14,0(,R14) REAL MACHINE SIZE @VA05047 00760900 CLR R3,R14 VALID ADDRESS? @VA05047 00761200 BNL TRA138 NO--IGNORE IDA CHECK @VA05047 00761500 TM SAVEWRK4+4,IDA REAL IDA SET IN REAL CCW ? 00762000 BO TRA140 IF YES SHOW REAL IDAL (& VIRTUAL, IF ANY) 00763000 TM SAVEWRK7+1,CLASDASD DASD CLASS ? 00764000 BO TRA150 IF YES CHECK FOR SOME KIND OF SEEK 00765000 TRA138 LA R6,8(,R6) ADVANCE TO NEXT REAL CCW (IF ANY) 00766000 BCT R7,TRA132 ITERATE THRU THE RCWTASK. 00767000 ICM R10,B'1111',RCWPNT GET POINTER TO NEXT RCWTASK @V408246 00768100 BZ TRA139 IF 0, WE'RE ALL DONE (ALMOST) @VA00782 00770000 MVC TRLNCCW,PFXBREAK FOR R10 NONZERO (ANOTHER RCWTASK THERE) 00771000 BAL R3,TROUSUB SHOW A BREAK IN THE CCW STRINGS 00772000 B TRA129 BLANK BUFFER & START THE NEXT RCWTASK. 00773000 SPACE 00774000 TRA139 MVI SAVEWRK1+2,VMTRSIO TELL RUN DETERMINATOR WE'VE @VA00782 00775000 * DONE AN SIO DURING THIS LAP 00776000 B TRA92 AND GO DO IT. @VA00782 00777000 EJECT 00778000 TRA140 DS 0H IDA WAS SET IN THE REAL CCW: 00779000 TM SAVEWRK4,X'08' WAS THE COMMAND A TIC ? 00780000 BZ TRA140C NOPE - CONTINUE. 00781000 TM SAVEWRK4,X'07' MAYBE - CHECK FURTHER 00782000 BZ TRA138 IF = TIC, FORGET THE IDA BIT. 00783000 TRA140C EQU * CONTINUE: 00784000 L R3,FFS R3 NEGATIVE MEANS NO VIRTUAL IDAL 00785000 L R8,SAVEWRK4 GET ADDRESS OF REAL IDAL IN R8 00786000 TM SAVEWRK2+4,IDA WAS VIRTUAL IDA SET ? 00787000 BZ TRA141 IF NOT, USE REAL CCW FOR COUNT 00788000 CLC SAVEWRK2(1),SAVEWRK4 VIRTUAL IDA SET - SAME OP CODE ? 00789000 BNE TRA141 IF NOT, IGNORE VIRTUAL IDAL. 00790000 CLC SAVEWRK2+6(2),SAVEWRK4+6 AND SAME BYTE-COUNT 00791000 BNE TRA141 DON'T TRUST IT IF NOT THE SAME. 00792000 L R1,SAVEWRK2 GET ADDRESS OF VIRTUAL IDAL 00793000 BAL R14,TRANBRNG GET REAL ADDRESS 00794000 BNZ TRA141 IF NO GOOD IGNORE IT. 00795000 LA R3,0(,R1) IF OK, LET R3 POINT TO VIRTUAL IDAL 00796000 L R14,0(,R2) GET FIRST IDAW IN VIRTUAL IDAL 00797000 CL R14,VMSTOR IS ADDRESS IN USER'S STORAGE @V304635 00798000 BL TRA142 IF YES, CONSIDER OK FOR DETERMINING COUNT 00799000 * 00800000 TRA141 L R14,0(,R8) USE FIRST IDAW IN REAL IDAL TO GET COUNT 00801000 * 00802000 TRA142 SLR R15,R15 GET THE BYTE-COUNT 00803000 ICM R15,3,SAVEWRK4+6 ... 00804000 BCTR R15,0 LESS 1 FOR HANDY USE 00805000 IC R0,SAVEWRK4 GET THE OP-CODE 00806000 N R0,F15 ISOLATE LOW-ORDER 4 BITS 00807000 CLM R0,1,LOW12 IS IT '12' = X'0C' = READ BACKWARD ? 00808000 BNE TRA144 NOT THIS TIME. 00809000 LR R0,R15 BYTE-COUNT INTO R0, 00810000 LR R15,R14 LET R15 = STARTING-ADDRESS OF RD/BACKWARD 00811000 SR R14,R0 AND R14 = ENDING-ADDRESS (LAST BYTE READ) 00812000 B TRA145 NOW COMPUTE HOW MANY IDAWS THERE WILL BE 00813000 * 00814000 TRA144 AR R15,R14 R15 = ENDING ADDRESS (FWD DIRECTION CCW) 00815000 * 00816000 TRA145 STH R7,SAVEWRK7+2 REMEMBER R7 REAL-CCW-COUNT 00817000 N R14,X2048BND ISOLATE STARTING & ENDING ADDRESSES 00818000 N R15,X2048BND TO 2048-BYTE BOUNDARIES 00819000 SLR R15,R14 GET END ADDRESS MINUS STARTING ADDRESS 00820000 LA R15,0(,R15) ALLOW STORAGE WRAP-AROUND, PREVENT 00821000 * PROGRAM CHECK IF R14 > R15 ... 00822000 SRL R15,11 SHIFTED RIGHT 11 = NO. OF CROSSOVERS 00823000 LA R7,1(,R15) PLUS ONE = NUMBER OF IDAWS THERE MUST BE. 00824000 * (WHEW - BUT WE'VE GOT THE NEEDED NUMBER.) 00825000 * LOOP TO PRINT REAL (AND VIRTUAL, IF ANY) IDALS: 00826000 * R3 = VIRTUAL ADDRESS OF FIRST VIRTUAL IDAW 00827000 * R7 = COUNT OF IDAWS THERE MUST BE 00828000 * R8 = REAL ADDRESS OF FIRST REAL IDAW 00829000 * R4-R6 AS IN USE BY MAIN CCW-PRINTING ROUTINE 00830000 * R7 FROM MAIN CCW-PRINTING ROUTINE SAVED IN SAVEWRK7+2 00831000 * 00832000 TRA146 MVI TRLNIDAL+1,PFXIDAL IDAL PREFIX INTO OUTPUT MESSAGE 00833000 LTR R1,R3 ANY VIRTUAL IDAL AT ALL ? 00834000 BM TRA147 IF R3 NEGATIVE, FORGET IT 00835000 BAL R14,TRANBRNG GET REAL ADDRESS OF VIRTUAL IDAW 00836000 BNZ TRA147 IF ADDRESSING ERROR, FORGET IT. 00837000 L R1,0(,R2) OK, PICK UP THE IDAW 00838000 CALL DMKCVTBH BINARY TO HEX PLEASE 00839000 STCM R0,B'1111',TRLNIDA2 STORE INTO OUTOUT MSG @VA07715 00840100 STCM R1,B'1111',TRLNIDA2+4 STORE INTO OUTPUT MSG @VA07715 00840200 MVC TRLNIDA1,=CL4'IDAL' AND STORE IDENTIFIER IN MESSAGE 00841000 LA R3,4(,R3) ADVANCE TO NEXT VIRTUAL IDAW (IF ANY) 00842000 CL R7,F1 ANY IDAWS LEFT ? 00843000 BNH TRA147 NOPE - JUST THE ONE WE JUST DID. 00844000 LR R1,R3 SOME LEFT - GET THE NEXT ONE 00845000 BAL R14,TRANBRNG ... 00846000 BNZ TRA147 IF ADDRESSING ERROR, FORGET IT. 00847000 L R1,0(,R2) OK, PICK UP THE IDAW 00848000 CALL DMKCVTBH BINARY TO HEX 00849000 STM R0,R1,TRLNIDA3 STORE IN MESSAGE 00850000 LA R3,4(,R3) ADVANCE TO NEXT VIRTUAL IDAW 00851000 * 00852000 TRA147 MVC TRLNIDA4,=CL4'IDAL' IDENTIFIER TO MESSAGE 00853000 L R1,0(,R8) FIRST REAL IDAW INTO R1, 00854000 CALL DMKCVTBH BINARY TO HEX 00855000 STCM R0,B'1111',TRLNIDA5 STORE IN OUTPUT MSG @VA07715 00856100 STCM R1,B'1111',TRLNIDA5+4 STORE INTO MSG @VA07715 00856200 CL R7,F1 ANY IDAWS LEFT ? 00857000 BNH TRA148 NOPE - JUST THE ONE WE JUST DID. 00858000 L R1,4(,R8) PICK UP NEXT IDAW 00859000 CALL DMKCVTBH BINARY TO HEX 00860000 STCM R0,B'1111',TRLNIDA6 STORE INTO OUTPUT MSG @VA07715 00861100 STCM R1,B'1111',TRLNIDA6+4 STORE INTO MESSAGE @VA07715 00861200 TRA148 LA R8,8(,R8) SET FOR NEXT PAIR OF IDAWS (IF ANY) 00862000 ST R3,SAVEWRK6 REMEMBER R3, 00863000 BAL R3,TROUSUB OUTPUT THE FINISHED LINE 00864000 BAL R14,BLANKBUF AND REINITIALIZE THE MESSAGE BUFFER 00865000 L R3,SAVEWRK6 RESTORE R3 00866000 S R7,F2 TWO LESS IDAWS TO DO 00867000 BP TRA146 IF > 0, STILL SOME LEFT TO DO. 00868000 LH R7,SAVEWRK7+2 ALL DONE, RESTORE R7 00869000 B TRA138 WHEN FINISHED, ADVANCE TO NEXT CCW. 00870000 EJECT 00871000 TRA150 DS 0H DASD CLASS, LOOK FOR SOME KIND OF SEEK: 00872000 CLI SAVEWRK4,X'07' SEEK ? 00873000 BE TRA151 YES 00874000 CLI SAVEWRK4,X'0B' SEEK CYLINDER ? 00875000 BE TRA151 YES 00876000 CLI SAVEWRK4,X'1B' SEEK HEAD ? 00877000 BNE TRA138 NO - FORGET IT. 00878000 TRA151 L R8,SAVEWRK4 PICK UP ADDRESS @VA03162 00879000 LA R8,0(,R8) CLEAR UNWANTED BITS @VA03162 00880000 L R14,=A(DMKSYSRM) GET REAL MACHINE @VA03162 00881000 L R14,0(,R14) SIZE @VA03162 00882000 CLR R8,R14 VALID ADDRESS @VA03162 00883000 BNL TRA138 NO..SKIP SEEK ARGUMENTS @VA03162 00884000 MVI TRLNSEEK+1,PFXSEEK @VA03162 00885000 MVC TRLNSK4,=CL4'SEEK' SET UP NAMES @VA03162 00886000 L R1,0(,R8) FIRST 4 BYTES INTO R1, 00887000 CALL DMKCVTBH BINARY TO HEX PLEASE, 00888000 STCM R0,B'1111',TRLNSK5 STORE INTO OUTOUT MSG @VA07715 00889100 STCM R1,B'1111',TRLNSK5+4 STORE INTO OUTPUT MSG @VA07715 00889200 LH R1,4(,R8) NEXT 2 BYTES INTO R1, 00890000 CALL DMKCVTBH BINARY TO HEX 00891000 STCM R1,B'1111',TRLNSK6 STORE INTO MSG @VA07715 00892100 CLC SAVEWRK2(1),SAVEWRK4 VIRTUAL COMMAND THE SAME ? 00893000 BNE TRA159 IF NOT, IGNORE IT. 00894000 LA R0,6 R0=6 MEANS 7 BYTES WANTED 00895000 LA R1,SAVEWRK2 LET R1 POINT AT USER'S CCW 00896000 LA R2,TRLNSK2 AND R2 POINTS TO 8-BYTE SCRATCH-AREA 00897000 CALL DMKCCWSB LET DMKCCWSB FIND THE SEEK ARGS 00898000 BNZ TRA159 IF CC NONZERO, FORGET IT (DATA NO GOOD) 00899000 ICM R1,B'1111',TRLNSK2 PICK UP SEEK ARGUMENTS @VA07715 00900100 ICM R2,B'1111',TRLNSK2+4 PICK UP ARGUMENTS FOR SEEK @VA07715 00900200 CALL DMKCVTBH THE FIRST 4 BYTES BINARY TO HEX 00901000 STCM R0,B'1111',TRLNSK2 STORE INTO OUTPUT MSG @VA07715 00902100 STCM R1,B'1111',TRLNSK2+4 STORE INTO MESSAGE @VA07715 00902200 LR R1,R2 NOW THE REST 00903000 CALL DMKCVTBH BINARY TO HEX 00904000 ST R0,TRLNSK3 STORE THE REMAINING CHARS 00905000 STCM R1,12,TRLNSK3+4 (TOTAL OF 7 PRINTABLE CHARACTERS) 00906000 MVC TRLNSK1,=CL4'SEEK' SIGNAL VIRTUAL SEEK GIVEN 00907000 TRA159 BAL R3,TROUSUB OUTPUT THE FINISHED LINE, 00908000 BAL R14,BLANKBUF REINITIALIZE THE MESSAGE BUFFER 00909000 B TRA138 WHEN FINISHED, ADVANCE TO NEXT CCW. 00910000 SPACE 00911000 DROP R10 (THRU WITH RCWTASK) 00912000 EJECT 00914000 SPACE 3 00915000 DMKTRDWT RELOC , SERIALIZATION FOR I/O TRACING @VA07229 00916000 TM VMTRCTL,VMTRSIO SIO TRACING? @VA07421 00916100 BZ NOIOSTK NO, DON'T WORRY @VA07421 00916150 LA R0,CPEXSIZE GET A CPEXBLOK @VA07421 00916200 CALL DMKFREE @VA07421 00916250 USING CPEXBLOK,R1 TELL THE ASSEMBLER WHERE IT IS @VA07421 00916300 LA R15,NOIOSTK INSERT RETURN ADDRESS @VA07421 00916350 STM R15,R14,CPEXADD AND FILL IN THE BLOK @VA07421 00916400 CALL DMKSTKCP NOW STACK IT @VA07421 00916450 GOTO DMKDSPCH AND WAIT TO RETURN BELOW @VA07421 00916500 DROP R1 ASSEMBLER DONE WITH CPEXBLOK @VA07421 00916550 NOIOSTK EQU * @VA07421 00916600 BAL R14,TRAINIT ENQUEUE FOR TRACING ACTIVITY @VA07229 00917000 B TRA97 GO UNLOCK AGAIN AND EXIT @VA07229 00918000 EJECT 00919000 * TRAINIT = SUBROUTINE TO INITIALIZE VARIOUS STUFF AT ENTRY: 00953000 * R14 = RETURN REGISTER 00954000 * 00955000 TRAINIT MVC SAVEWRK7(1),VMRSTAT SAVE VMRSTAT FLAG STATUS AT ENTRY 00956000 OI VMRSTAT,VMEXWAIT+VMCFWAIT ENSURE THAT USER IS NOT RUN 00957000 ICM R9,B'1111',VMTREXT POINT TO TRACE EXT BLOCK @V408246 00958100 BZ TRAEXIT IF NOT, GO AWAY QUIETLY. 00960000 SLR R15,R15 CLEAR SAVEWRK1 FLAG 00961000 ST R15,SAVEWRK1 ... 00962000 ST R15,SAVEWRK8 AND SAVEWRK8 FLAGS & "ERROR CODE" 00963000 ST R9,TRALOCK+4 SETUP LOCK "NAME" @V200820 00964000 LA R1,TRALOCK POINT TO IT FOR DMKLOC @V200820 00965000 LR R9,R14 SAVE INTERNAL RETURN ADDRESS @V200820 00966000 CALL DMKLOCKQ ENQUEUE FOR TRACING @V200820 00967000 TM VMTRCTL,255-VMTRPER STILL TRACING? PER001 00968000 BE TRAEXIT NO -- EXIT QUIETLY @V200820 00969000 LR R14,R9 RESTORE RETURN REGISTER @V200820 00970000 L R9,VMTREXT GR9 = VIRTUAL MACHINE TRACE BLOCK@V200820 00971000 NI TREXFLAG,255-TREXNDSP RESET DSP INTERLOCK @VA04044 00971500 LM R0,R1,SAVER0 RESTORE REGS @VM08544 00972000 BLANKBUF MVC TREXBUFF(8),BLANKS BLANK THE OUTPUT BUFFER 00973000 MVC TREXBUFF+8(72),TREXBUFF ... 00974000 BR R14 AND RETURN. 00975000 SPACE 2 00976000 EJECT 00991000 * SUBROUTINE TO PUT BACK ANY INSTRUCTIONS WHICH WERE ALTERED: 00992000 * R3 = RETURN REGISTER 00993000 PUTBACK L R0,FFS X'FFFFFFFF' INTO R0 00994000 ST R0,TREXANSI STORE IN TREXANSI (UNTIL SET OTHERWISE) 00995000 L R1,TREXIN1 GET ADDRESS OF 1ST REPLACED INSTRUCTION 00996000 CLR R1,R0 ANYTHING THERE TO PUT BACK ? 00997000 BE PUTBACK2 NO. 00998000 ST R0,TREXIN1 SET ADDR AT TREXIN1 BACK TO X'FFFFFFFF' 00999000 BAL R14,TRANPTBK GET REAL ADDRESS OF 1ST INSTRUCTION 01000000 BNZ PUTBACK2 IF CAN'T GET IT, GIVE UP (SADLY). 01001000 LH R15,TREXSVC1 GET FIRST TWO BYTES OF REAL INSTRUCTION 01002000 CLI 0(R2),X'0A' IS THE SVC STILL THERE ? 01003000 BNE PUTBACK1 IF NOT LEAVE FIRST BYTE ALONE 01004000 STCM R15,2,0(R2) OK - PUT BACK FIRST BYTE OF REAL INSTR 01005000 PUTBACK1 CLI 1(R2),X'B1' IS THE "B1" STILL THERE ? 01006000 BNE PUTBACK2 IF NOT LEAVE THE SECOND BYTE ALONE 01007000 STC R15,1(,R2) OK, PUT BACK 2ND BYTE OF INSTR 01008000 * 01009000 PUTBACK2 L R1,TREXIN2 GET ADDRESS OF 2ND REPLACED INSTRUCTION 01010000 CLR R1,R0 ANYTHING THERE TO PUT BACK ? 01011000 BCR 8,R3 NO - EXIT. 01012000 ST R0,TREXIN2 SET ADDR AT TREXIN2 BACK TO X'FFFFFFFF' 01013000 BAL R14,TRANPTBK GET REAL ADDRESS OF 2ND INSTRUCTION 01014000 BCR 7,R3 IF CAN'T GET IT, GIVE UP (SADLY). 01015000 CLC 0(2,R2),HSVCB2 IS THE SVC B2 STILL THERE ? 01016000 BCR 7,R3 NO (STRANGE) - LEAVE WELL ENOUGH ALONE. 01017000 MVC 0(2,R2),TREXSVC2 PUT BACK 1ST 2 BYTES OF REAL INSTR 01018000 BR R3 AND EXIT. 01019000 EJECT 01020000 * SUBROUTINE TO OUTPUT A TRACE LINE ON THE PRINTER AND/OR TERMINAL 01502000 * R3 = RETURN REGISTER 01503000 * TREXBUFF IS FILLED IN TO APPROPRIATE DATA 01504000 * SAVEWRK1 ANDED WITH TREXPRNT SIGNALS OUTPUT ON PRINTER 01505000 * SAVEWRK1 ANDED WITH TREXTERM SIGNALS OUTPUT ON TERMINAL 01506000 * SAVEWRK8+2=HIGHEST ERROR-CODE "SO FAR" FROM DMKQCNWT/DMKDSPCH 01507000 * I.E. 04 = SINGLE ATTENTION HIT BY USER 01508000 * 08 = MORE THAN ONE ATTENTION HIT BY USER 01509000 * 12 = USER'S TERMINAL HAS BEEN TURNED OFF 01510000 * SAVEWRK9 = USED TO SAVE/RESTORE RETURN-REGISTER 01511000 * R2 IS USED FOR SCRATCH (NOT PRESERVED) 01512000 SPACE 01513000 TROUSUB DS 0H OUTPUT LINE ON PRINTER AND/OR TERMINAL: 01514000 LA R0,80 LENGTH = 80 BYTES 01515000 LA R1,TREXBUFF ADDRESS = TREXBUFF 01516000 SLR R2,R2 R2=0 FOR USE BY DMKVSPRT & DMKQCNWT 01517000 LH R15,TREXPRNT GET PRINTER FLAG-BITS 01518000 N R15,SAVEWRK1 OUTPUT ON PRINTER FOR THIS ONE ? 01519000 BZ TROUSUB4 NOPE - MUST BE JUST THE TERMINAL. 01520000 LH R0,TREXLCNT GET CURRENT LINE COUNT @V408246 01521100 LTR R0,R0 NEED PAGE EJECT? @V408246 01521200 BP TROUSUB2 NOPE - RESTORE R0 = 80 & PRINT. 01523000 CALL DMKVSPRT YES - GIVE A PAGE EJECT (R0 = 0) 01524000 TROUSUB2 LA R0,80 NOW RESTORE R0 = 80, 01525000 CALL DMKVSPRT AND PRINT THE OUTPUT LINE 01526000 CL R2,F8 *** SEVERE ERROR FROM DMKVSPRT ? *** 01527000 BE TRAEND1 *** YES - FORCE A TRACE END. *** 01528000 LH R14,TREXLCNT GET THE CURRENT LINE COUNT, 01529000 LA R14,1(,R14) ADD ONE, 01530000 CL R14,F60 CHECK AGAINST 60 LINES PER PAGE 01531000 BL TROUSUB3 IF < 60 WE'RE OK 01532000 SLR R14,R14 RESET TO 0 WHEN WE HIT 60 01533000 TROUSUB3 STH R14,TREXLCNT STORE UPDATED LINE COUNT 01534000 LH R15,TREXTERM GET TERMINAL FLAG-BITS 01535000 N R15,SAVEWRK1 OUTPUT ALSO ON TERMINAL ? 01536000 BCR 8,R3 NOPE - EXIT FORTHWITH. 01537000 TROUSUB4 DS 0H OUTPUT WILL BE ON THE TERMINAL: 01538000 CLI SAVEWRK8+3,04 HAS MORE THAN ONE ATTENTION BEEN HIT ? 01539000 BCR 2,R3 YES - EXIT (DON'T TYPE THE LINE) 01540000 * (DMKQCNWT WILL REMOVE TRAILING BLANKS FROM COUNT) 01541000 TROUSUB6 DS 0H NOW READY TO CALL DMKQCNWT: 01542000 SLR R2,R2 R2=0 FOR PARM=0 FOR DMKQCNWT, AND ... 01543000 CALL DMKQCNWT WRITE MESSAGE TO TERMINAL 01544000 * 01545000 TM VMTRCTL,255-VMTRPER STILL HAVE TRACE IN EFFECT? PER001 01546000 BE TRAEXIT NO, GET OUT 01547000 CH R2,SAVEWRK8+2 CHECK ERROR-CODE AGAINST "HIGHEST SO FAR" 01548000 BCR 13,R3 EXIT IF NO NEW ERROR RETURN CODE 01549000 STH R2,SAVEWRK8+2 STORE NEW VALUE OF RETURN CODE 01550000 BR R3 AND EXIT TO CALLER. 01551000 SPACE 3 01552000 * NECESSARY TO TERMINATE TRACING: 01559000 TRAEND1 BAL R3,PUTBACK PUT BACK ANY INSTRUCTIONS WE ALTERED 01560000 ST R9,TRALOCK+4 SETUP LOCK "NAME" @V200820 01561000 LA R1,TRALOCK POINT TO THE NAME FIELD @V200820 01562000 TRAEND2 EQU * DEQUEUE ALL PENDING REQUESTS @V200820 01563000 CALL DMKLOCKD DEQUEUE THE TRACING LOCK @V200820 01564000 BZ TRAEND2 CONTINUE UNTIL NOT LOCKED @V200820 01565000 LA R0,TREXSIZE SIZE OF TREX BLOCK 01566000 LR R1,R9 AND ITS ADDRESS 01567000 SLR R15,R15 BEFORE CALLING DMKFRET, 01568000 ST R15,VMTREXT CLEAR "VMTREXT" AND 01569000 NI VMTRCTL,VMTRPER CLEAR TRACING PER001 01570000 CALL DMKFRET GIVE IT BACK TO FREE STORAGE 01571000 TM VMRSTAT,VMLOGOFF IN LOGOFF PROCESS ? @V200820 01572000 BO TRAEXIT YES - SKIP THE MESSAGE @V200820 01573000 MSG 'TRACE ENDED' 'TRACE ENDED' MESSAGE TO THE USER 01574000 CALL DMKQCNWT,PARM=NORET ... 01575000 B TRAEXIT AND GO EXIT. 01576000 EJECT 01577000 * SUBROUTINES TO PERFORM A "TRANS - BRING/DEFER" OR 01578000 * A CALL TO DMKVATRN (IF NECESSARY) TO GET A REAL EQUIVALENT (IF 01579000 * FEASIBLE) OF A VIRTUAL ADDRESS: 01580000 * 01581000 * AT ENTRY: 01582000 * R1 = VIRTUAL ADDRESS TO BE TRANSLATED 01583000 * R14 = RETURN REGISTER 01584000 * 01585000 * AT EXIT: 01586000 * R1 = VIRTUAL ADDRESS 01587000 * R2 = REAL ADDRESS 01588000 * CONDITION-CODE SET FROM LRA, DMKPTRLK, OR DMKPTRAN 01589000 * (CC = 0 IF VIRTUAL ADDRESS WAS LEGITIMATE, AND PAGE IS 01590000 * IN CORE, OR HAS BEEN BROUGHT INTO CORE WITHOUT ERROR) 01591000 * 01592000 * ENTER AT "TRANVIRT" TO PERFORM VIRTUAL/VIRTUAL "TRANS", 01593000 * OR AT "TRANBRNG" FOR SIMPLE ("VANILLA") TRANSLATIONS 01594000 * (E.G. USER'S PAGE 0 STUFF, ETC.) 01595000 SPACE 01596000 TRANVIRT TM VMESTAT,VMEXTCM IN EC-MODE NOW ? 01597000 BZ TRANBRNG NO - IT'S "VANILLA" - THAT'S EASY. 01598000 TM VMPSW+1,EXTMODE STAYING IN EC-MODE? @VA04044 01598300 BZ TRANBRNG NOPE - USE OUR CREG 1 @VA04044 01598600 TM VMPSW,TRANMODE IN EC-MODE, IN TRANSLATE MODE ALSO ? 01599000 BO TRANVAT YES - THAT'S A WORTHY CHALLENGE. 01600000 * 01601000 TRANBRNG LCTL C1,C1,VMSEG VANILLA - GET SEGMENT TABLE ORIGIN 01602000 LRA R2,0(,R1) ATTEMPT TO GET REAL ADDRESS 01603000 BCR 8,R14 EXIT FORTHWITH IF THE PAGE WAS IN 01604000 LA R2,(BRING+DEFER) IF NOT, SET "BRING/DEFER" OPTIONS 01605000 L R15,APTRAN SET R15 TO CALL "DMKPTRAN" 01606000 TRANCALL ST R14,SAVEWRK9 SAVE R14 = RETURN-REGISTER, 01607000 CALL 15 ATTEMPT TO BRING IN THE PAGE 01608000 L R14,SAVEWRK9 RESTORE R14 RETURN REGISTER, 01609000 BR R14 RETURN TO CALLER WITH CC FROM DMKPTRAN. 01610000 EJECT 01611000 * ENTER AT "TRANPTBK" TO INVOKE "TRANBRNG" OR "TRANVAT" 01612000 * DEPENDING ON WHETHER "TRANBRNG" OR "TRANVAT" WAS 01613000 * INVOKED TO REPLACE THE USER INSTRUCTION 01614000 * (THIS BEING REMEMBERED IN "TREXVAT" FLAGBIT IN "TREXFLAG") 01615000 SPACE 01616000 TRANPTBK TM TREXFLAG,TREXVAT DID WE SET IT VIA "TRANVAT" ? 01617000 BZ TRANBRNG NO - INVOKE "TRANBRNG". 01618000 * YES - CONTINUE ... 01619000 SPACE 01620000 * IN EC-MODE & TRANSLATE MODE ALSO: 01621000 TRANVAT L R15,VMECEXT GET THE USER'S CONTROL REGISTERS 01622000 USING ECBLOK,R15 01623000 TM VMESTAT,VMINVPAG TABLES VALID? @VM08636 01624000 BNZ INTERLD PTR AT WORK... @VM01060 01625000 PTBKLRA EQU * @VM08636 01626000 LCTL C0,C1,EXTSHCR0 POINT TO THE SHADOW TABLES 01627000 DROP R15 01628000 LRA R2,0(,R1) MAKE THE ATTEMPT FIRST 01629000 LCTL C0,C0,CPCREG0 RESTORE STAND C-REGS BEFORE 01630000 LCTL C1,C1,VMSEG WE GO ANYPLACE 01631000 BCR 8,R14 IF "LRA" SUCCEEDED, RETURN TO CALLER. 01632000 INTERLD EQU * @VM08636 01633000 L R15,=A(INTERVAT) SET R15 TO CALL INTERFACE TO DMKVATRN 01634000 B TRANCALL GO SAVE R14 AND DO THE CALL. 01635000 SPACE 2 01636000 * INTERFACE ROUTINE TO CALL DMKVATRN: 01637000 USING INTERVAT,R12 FOR THIS INTERFACE ROUTINE ONLY. 01638000 INTERVAT ENTER ENTER HERE (SEE "TRANCALL" ABOVE) 01639000 LR R3,R1 SET R3 AS NEEDED FOR DMKVAT 01640000 CALL DMKVATRN ATTEMPT TO GET THE NEEDED ADDRESS 01641000 LTR R0,R0 SET CC FROM RETURN INDICATOR FROM DMKVAT 01642000 ST R2,SAVER2 RETURN R2 TO CALLER (IN CASE GOOD) 01643000 EXIT RETURN TO DMKTRD (WITH COND CODE SET). 01644000 SPACE 01645000 USING DMKTRD,R12 RESTORE STANDARD ADDRESSABILITY. 01646000 EJECT 01647000 * CONSTANTS: 01648000 HSVCB2 DC X'0AB2' SVC B2 INSTRUCTION @V4M0240 01649100 DS 0F FULL-WORD ALIGNED CONSTANTS: 01650000 CLDEV DC CL3'DEV' 'DEV' 01652000 LOW12 DC AL1(12) LOW-ORDER 12 = X'0C' = READ-BACKWARD 01653000 TRALOCK DC C'TREX',A(*-*) LOCK "NAME" FOR TRACING @V200820 01654000 SPACE 01655000 * MISCELLANEOUS FLAGBITS DEFINED IN FIRST BYTE OF SAVEWRK8: 01656000 SETCC EQU X'80' MUST SET CONDITION-CODE NONZERO AT EXIT 01657000 SPACE 01660000 * NOTE: BYTE AT SAVEWRK8+1 IS AVAILABLE FOR FLAG IF NEEDED 01661000 * HALFWORD AT SAVEWRK8+2 IS USED FOR ERROR RETURNS FROM DMKQCNWT 01662000 SPACE 2 01663000 LTORG 01667000 EJECT 01668000 * CONSTANTS (CONTINUED): 01669000 * 01670000 CLCAW DC C'CAW' 01671000 CLIO DC C'I/O' 01673000 CLCCW DC C'CCW' 01676000 CLCC EQU CLCCW 'CC' 01677000 CLCSW DC C'CSW' 01678000 * 01679000 * PREFIXES FOR THE VARIOUS RESPONSES: 01680000 * (THESE MAY READILY BE REVISED PER INSTALLATION REQUIREMENTS) 01681000 SPACE 01682000 PFXIO EQU CLIO I/O INSTR (SIO/SIOF, TIO, HIO/HDV, TCH) 01685000 PFXCCW EQU CLCCW CCW 01686000 PFXBREAK DC CL3'---' TO INDICATE A BREAK IN CCW CHAINS 01687000 PFXDITTO EQU C'"' INDICATES CONTINUATION OF ABOVE LINES 01688000 PFXIDAL EQU C'"' IDAL 01689000 PFXSEEK EQU C'"' SEEK 01690000 PFXBRNCH DC CL3'==>' TO SHOW WE ARE AT A NEW LOCATION 01691000 *PFXINST DC CL3' ' INSTRUCTION TRACING 01693000 EJECT 01695000 COPY VMBLOK 01696000 VMTRALL EQU VMTRINT+VMTRSIO+VMTRBRIN FOR TRACE 'ALL' 01697000 COPY TREXT 01698000 ORG TREXBUFF OUTPUT LINE FOR TCH/TIO/HIO/SIO: 01699000 SPACE 01700000 TRLNSIO DC CL3'I/O' PREFIX FOR I/O INSTR (SET FROM PFXIO) 01701000 DC C' ' 01702000 TRLNSIO1 DS XL6'00' VIRT ADDR OF I/O INSTR (= TRLNINT1) 01703000 DC C' ' 01704000 TRLNSIO5 DS CL5' ' MNEMONIC OF IO INSTRUCTION 01705000 DC C' ' 01706000 TRLNSIO4 DS XL8'00' SIO, TIO, HIO, OR TCH INSTRUCTION (HEX) 01707000 DC CL2' ' 01708000 TRLNSIO2 DS CL4'DEV' MNEMONIC "NAME" OF VIRTUAL DEVICE 01709000 DC C' ' 01710000 TRLNSIO3 DS XL4'00' VADD (HEX) 01711000 DC CL2' ' 01712000 TRLNSIOB DC CL2'CC' CC 01713000 DC C' ' 01714000 TRLNSIOC DS AL1(0) CC NUMBER 01715000 DC CL2' ' 01716000 TRLNSIOD DS CL4'DEV ' REAL TYPE 01717000 DC C' ' 01718000 TRLNSIOE DS XL4'00' RADD (HEX) 01719000 DC CL2' ' 01720000 TRLNSIOF DC CL3'CSW' CSW 01721000 DC C' ' 01722000 TRLNSIOG DS XL4'00' CSW+4/CSW+5 BYTES 01723000 DC CL2' ' 01724000 TRLNSIO9 DC CL3'CAW' CAW (FOR SIO ONLY, CC = 0 OR 1) 01725000 DC C' ' (FOR SIO ONLY, CC = 0 OR 1) 01726000 DS XL8'00' VIRTUAL CAW (FOR SIO ONLY, CC = 0 OR 1) 01727000 EJECT 01728000 ORG TREXBUFF OUTPUT LINE FOR CCW: 01729000 SPACE 01730000 TRLNCCW DC CL3'CCW' PREFIX 01731000 DC C' ' 01732000 TRLNCCW1 DS XL6'00' VIRTUAL ADDRESS OF CCW 01733000 DC C' ' 01734000 TRLNCCW2 DS XL8'00' VIRTUAL CCW 1ST HALF 01735000 DC C' ' 01736000 TRLNCCW3 DS XL8'00' VIRTUAL CCW 2ND HALF 01737000 DC CL2' ' 01738000 TRLNCCW4 DS XL6'00' REAL ADDRESS OF CCW 01739000 DC C' ' 01740000 TRLNCCW5 DS XL8'00' REAL CCW 1ST HALF 01741000 DC C' ' 01742000 TRLNCCW6 DS XL8'00' REAL CCW 2ND HALF 01743000 SPACE 01744000 ORG TREXBUFF OUTPUT LINE FOR "IDAL" LINE OF CCW: 01745000 TRLNIDAL DC CL3' " ' PREFIX (IF ANY) 01746000 DC CL2' ' 01747000 TRLNIDA1 DC CL4'IDAL' VIRTUAL IDAL 01748000 DC CL2' ' 01749000 TRLNIDA2 DS XL8'00' FIRST VIRTUAL IDAW 01750000 DC C' ' 01751000 TRLNIDA3 DS XL8'00' SECOND VIRTUAL IDAW 01752000 DC CL3' ' 01753000 TRLNIDA4 DC CL4'IDAL' REAL IDAL 01754000 DC CL2' ' 01755000 TRLNIDA5 DS XL8'00' FIRST REAL IDAW 01756000 DC C' ' 01757000 TRLNIDA6 DS XL8'00' SECOND REAL IDAW 01758000 SPACE 01759000 ORG TREXBUFF OUTPUT LINE FOR "SEEK" LINE OF CCW: 01760000 TRLNSEEK DC CL3' " ' PREFIX (IF ANY) 01761000 DC CL2' ' 01762000 TRLNSK1 DC CL4'SEEK' VIRTUAL SEEK 01763000 DC CL2' ' 01764000 TRLNSK2 DS XL8'00' VIRTUAL SEEK ARG (1ST 4 BYTES) 01765000 DC C' ' 01766000 TRLNSK3 DS XL6'00' VIRTUAL SEEK ARG ETC. (NEXT 3 BYTES) 01767000 DC CL5' ' 01768000 TRLNSK4 DC CL4'SEEK' REAL SEEK 01769000 DC CL2' ' 01770000 TRLNSK5 DS XL8'00' REAL SEEK ARG (1ST 4 BYTES) 01771000 DC C' ' 01772000 TRLNSK6 DS XL4'00' REAL SEEK ARG (LAST 2 BYTES) 01773000 EJECT 01774000 ORG TREXBUFF OUTPUT LINE FOR INTERRUPT TRACING: 01775000 SPACE 01776000 TRLNINT DC CL3' ' PREFIX (IF ANY) 01777000 DC C' ' 01778000 TRLNINT1 DS XL6'00' VIRTUAL ADDRESS OF INSTRUCTION 01779000 DC C' ' 01780000 TRLNINT2 DS CL4' ' TYPE (SVC, PROG, EXT, OR I/O) 01781000 DC CL2' ' 01782000 TRLNINT3 DS XL4'00' INTERRUPT CODE OR VIRTUAL DEVICE ADDRESS 01783000 DC C' ' 01784000 TRLNINT4 DS C'==>' PFXARROW GOES IN HERE 01785000 DC C' ' 01786000 TRLNINT5 DS XL6'00' VIRTUAL TRANSFER-TO ADDRESS (FROM NEW PSW) 01787000 DC CL2' ' 01788000 TRLNINT6 DC CL3'CSW' CSW (FOR I/O INTERRUPTS ONLY) 01789000 DC C' ' 01790000 TRLNINT7 DS XL4'00' CSW+4/CSW+5 BYTES ONLY 01791000 SPACE 1 01792000 ORG TRLNINT2 RE-DEFINITION FOR INSTRUCTION TRACING 01793000 TRLNINS2 DS CL5' ' MNEMONIC OF INSTRUCTION 01794000 DC C' ' 01795000 TRLNINS3 DS XL4'00' FIRST TWO BYTES OF INSTRUCTION 01796000 TRLNINS4 DS XL4'00' NEXT TWO BYTES OF INSTRUCTION (IF ANY) 01797000 TRLNINS5 DS XL4'00' LAST TWO BYTES OF INSTRUCTION (IF ANY) 01798000 DC C' ' 01799000 TRLNINS6 DS XL6'00' VIRTUAL XFER-TO-ADDRESS OR PSW (IF ANY) 01800000 SPACE 2 01801000 ORG TRLNINS5+1 RE-DEFINITION FOR EXECUTED INSTRUCTIONS 01802000 * 01803000 * NOTE: KEEP TRLNINS8 UP TO TRLNINS9 AT SAME RELATIVE DISPLACEMENTS 01804000 * AS TRLNINT1 AND TRLNINS2 TO TRLNINS6 01805000 * (BECAUSE FILLED IN BY INDEXED CODE). 01806000 * 01807000 TRLNINS7 DS XL2'00' LOW-ORDER BYTE OF EX "R1" REGISTER (IF ANY) 01808000 * (OR SSM-BYTE FOR SSM, STNSM, OR STOSM) 01809000 DC CL2' ' 01810000 TRLNINS8 DS XL6'00' VIRTUAL ADDRESS OF EXECUTED INSTRUCTION 01811000 DC C' ' 01812000 TRLNINSM DS CL5' ' MNEMONIC OF EXECUTED INSTRUCTION 01813000 DC C' ' 01814000 DS XL12'00' TWO TO SIX BYTES OF EXECUTED INSTRUCTION 01815000 DC C' ' 01816000 TRLNINS9 DS XL6'00' TRANSFER-TO ADDRESS FOR EXECUTED BRANCH 01817000 * 01818000 DS XL11'00' WORST CASE (SPACE-WISE) = EXECUTED LPSW 01819000 WORSCASE EQU *-TRLNINT LENGTH OF OUTPUT LINE FOR WORST CASE. 01820000 SPACE 01821000 TRLNBUMP EQU TRLNINS8-TRLNINT1 DISP. OF TRLNINS8 MSG FROM TRLNINT1 01822000 EJECT 01823000 ORG TREXBUFF OUTPUT LINE FOR CSW: 01824000 SPACE 01825000 TRLNCSW DC CL3'CSW' PREFIX 01826000 DC C' ' 01827000 TRLNCSWV DC C'V' 'V' 01828000 DC C' ' 01829000 TRLNCSW1 DS XL4'00' VADD 01830000 DC C' ' 01831000 TRLNCSW2 DS XL8'00' VIRTUAL CSW (1ST HALF) 01832000 DC C' ' 01833000 TRLNCSW3 DS XL8'00' VIRTUAL CSW (2ND HALF) 01834000 DC CL2' ' 01835000 TRLNCSWR DC C'R' 'R' 01836000 DC C' ' 01837000 TRLNCSW4 DS XL4'00' RADD 01838000 DC C' ' 01839000 TRLNCSW5 DS XL8'00' REAL CSW (1ST HALF) 01840000 DC C' ' 01841000 TRLNCSW6 DS XL8'00' REAL CSW (2ND HALF) 01842000 EJECT 01843000 PSA 01844000 COPY SAVE 01845000 COPY CORE @V304735 01846000 COPY EQU 01847000 COPY IOBLOKS 01848000 COPY VBLOKS 01849000 COPY DEVTYPES 01850000 END DMKTRD 01851000