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 <BE> 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 <BNZ> IF CAN'T GET IT, GIVE UP (SADLY). 01015000
CLC 0(2,R2),HSVCB2 IS THE SVC B2 STILL THERE ? 01016000
BCR 7,R3 <BNE> 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 <BZ> NOPE - EXIT FORTHWITH. 01537000
TROUSUB4 DS 0H OUTPUT WILL <ALSO> BE ON THE TERMINAL: 01538000
CLI SAVEWRK8+3,04 HAS MORE THAN ONE ATTENTION BEEN HIT ? 01539000
BCR 2,R3 <BH> 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 <BNH> 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