VCN TITLE 'DMKVCN (CP) VM/370 - RELEASE 6' 00001000
ISEQ 73,80 VALIDATE SEQUENCING OF SYSIN 00002000
*. 00003000
* MODULE NAME - 00004000
* 00005000
* DMKVCN 00006000
* 00007000
* FUNCTION - 00008000
* 00009000
* TO HANDLE THE SIMULATION OF ALL USER SIO'S TO A VIRTUAL 00010000
* CONSOLE 00011000
* 00012000
* ATTRIBUTES - 00013000
* 00014000
* REENTRANT, RESIDENT, ENTERED VIA GOTO FROM DMKVIOEX 00015000
* 00016000
* ENTRY POINTS - 00017000
* 00018000
* DMKVCNEX - TO SIMULATE A SIO TO A VIRTUAL CONSOLE 00019000
* 00020000
* ENTRY CONDITIONS - 00021000
* 00022000
* GPR2 = CONTENTS OF THE USER'S CAW (VIRTUAL ADDRESS) 00023000
* GPR6 = ADDRESS OF THE VCHBLOK FOR ADDRESSED VIRTUAL CHANNEL 00024000
* GPR7 = ADDRESS OF THE VCUBLOK FOR ADDRESSED VIRTUAL 00025000
* CONTROL UNIT 00026000
* GPR8 = ADDRESS OF THE VDEVBLOK FOR ADDRESSED VIRTUAL DEVICE 00027000
* GPR11 = ADDRESS OF THE USER'S VMBLOK 00028000
* GPR12 = ADDRESS OF DMKVCN 00029000
* 00030000
* NOTE THAT WHEN DMKVCNEX IS ENTERED ROM DMKVIO, GPR13 DOES 00031000
* NOT POINT TO A SAVEAREA, AND THE ENTER AND EXIT MACROS MAY NOT 00032000
* BE USED. INSTEAD, EXIT IS MADE DIRECTLY TO DMKDSPCH VIA A 00033000
* GOTO. 00034000
* 00035000
* EXIT CONDITIONS - 00036000
* 00037000
* NORMAL - 00038000
* EXIT IS MADE DIRECTLY TO DMKDSPCH, WITH THE CORRECT PENDING 00039000
* STATUS PLACED IN ALL VIRTUAL IO BLOKS AND THE USER'S 00040000
* CHANNEL PROGRAM COMPLETELY INTERPRETED. NOTE THAT THE USER IS 00041000
* REMOVED FROM EXECUTION WAIT BEFORE THE FIRST CCW IS 00042000
* INTERPRETED. 00043000
* 00044000
* ERROR - 00045000
* NONE 00046000
* 00047000
EJECT 00048000
* 00049000
* CALLS TO OTHER ROUTINES - 00050000
* 00051000
* DMKFREE, DMKFRET - TO GET AND RETURN A DATA BUFFER FROM FREE 00052000
* STORAGE 00053000
* DMKQCNWT - TO WRITE DATA TO THE USER IN RESPONSE TO A 00054000
* WRITE CCW, AND TO WRITE THE VIRTUAL BELL MESSAGE 00055000
* IN RESPONSE TO AN ALARM CCW 00056000
* DMKQCNRD - TO READ DATA FROM THE USER IN RESPONSE TO A VIRTUAL 00057000
* READ CCW 00058000
* DMKCFMBK - TO PLACE THE USER IN CONSOLE FUNCTION MODE IF 2 00059000
* OR MORE ATTENTIONS ARE HIT 00060000
* DMKSCNVU - TO SCAN FOR VIRTUAL CONSOLE DEVICE AFTER 00061000
* READ OR WRITE RETURN - IT MAY HAVE MOVED. 00062000
* DMKDSPCH - TO AWAIT COMPLETION OF CONSOLE I/O 00063000
* DMKCFMAT - TO SET AN ATTN INT PENDING 00064000
* DMKPSASC - TO CHECK STORAGE PROTECTION KEY 00065000
* DMKPSACC - TO CHECK IF SHARED PAGE HAS BEEN CHANGED 00066000
* DMKVMAPS - TO UNSHARE A NAMED SHARED SYSTEM FROM RUNUSER 00067000
* HDKD58EN - TO HANDLE DIAGNOSE X'58' FULL SCREEN I/O HRC058DK 00067100
* 00068000
* EXTERNAL REFERENCES - 00069000
* 00070000
* DMKVIOMK - A TABLE OF BIT FLAGS INDEXABLE BY DEVICE ADDRESS, 00071000
* USED TO SET AND CLEAR PENDING FLAGS IN VIRTUAL 00072000
* DEVICE, CONTROL UNIT, AND CHANNEL BLOKS 00073000
* 00074000
* TABLES / WORK AREAS - 00075000
* 00076000
* THE VIRTUAL DEVICE, CONTROL UNIT, AND CHANNEL BLOKS ARE 00077000
* UPDATED WITH THE PROPER INTERRUPT AND STATUS INFORMATION 00078000
* SO THAT UNSTIO MAY UNSTACK A VIRTUAL INTERRUPT TO THE 00079000
* USER WHEN HE IS ENABLED 00080000
* 00081000
* REGISTER USAGE - 00082000
* 00083000
* GPR6 = ADDRESS OF THE VCHBLOK FOR ADDRESSED DEVICE 00084000
* GPR7 = ADDRESS OF THE VCUBLOK FOR ADDRESSED DEVICE 00085000
* GPR8 = ADDRESS OF THE VDEVBLOK FOR ADDRESSED DEVICE 00086000
* GPR9 = SUBROUTINE LINKAGE RETURN REGISTER 00087000
* GPR10 = DATA BUFFER PTR 00088000
* GPR11 = ADDRESS OF USER'S VMBLOK 00089000
* GPR12 = DMKVCN BASE ADDRESS 00090000
* GPR13 = ADDRESS OF THE VCONCTL BLOK 00091000
* GPR14,GPR15 = BALR LINKAGE FOR CALLS TO DMKFREE AND DMKFRET 00092000
* 00093000
* ALL OTHER REGISTERS ARE WORK REGISTERS 00094000
* 00095000
* NOTES - 00096000
* 00097000
* VIRTUAL CONSOLE READ OR WRITE OPERATIONS ARE LIMITED TO 00098000
* A MAXIMUM OF 2032 BYTES ON A CCW SEQUENCE. A CCW SEQUENCE 00099000
* IS DEFINED AS A READ OR WRITE CCW THAT IS DATA CHAINED. 00100000
* A CCW THAT IS UNCHAINED OR COMMAND CHAINED COMPLETES 00101000
* A SEQUENCE. IF AN OPERATION IS ATTEMPTED FOR MORE THAN 00102000
* 2032 BYTES THE CCW CHANNEL PROGRAM IS TERMINATED WITH 00103000
* INCORRECT LENGTH AND CHANNEL PROGRAM CHECK. 00104000
* 00105000
EJECT 00106000
* 00107000
* OPERATION - 00108000
* 00109000
* 1. MARK THE VIRTUAL DEVICE AND SUBCHANNEL BUSY, CLEAR THE 00110000
* CSW AND SAVE THE STORAGE KEY. 00111000
* 00112000
* 2. VERIFY THAT THE DEVICE IS READY; IF NOT SET INTERVENTION 00113000
* REQUIRED IN THE VIRTUAL SENSE BYTE AND INDICATE UNIT 00114000
* CHECK. 00115000
* 00116000
* 3. IF THE CCW OP-CODE IS LEGAL CONTINUE PROCESSING FOR THE 00117000
* GIVEN CCW OP-CODE TYPE; OTHERWISE SET COMMAND REJECT IN 00118000
* THE VIRTUAL SENSE BYTE AND INDICATE UNIT CHECK. 00119000
* 00120000
*. 00121000
EJECT 00122000
COPY OPTIONS 00123000
SPACE 2 00124000
COPY LOCAL OPTIONS 00125000
EJECT 00126000
DMKVCN CSECT 00127000
SPACE 3 00128000
USING PSA,R0 00129000
USING VCHBLOK,R6 00130000
USING VCUBLOK,R7 00131000
USING VDEVBLOK,R8 00132000
USING VMBLOK,R11 00133000
SPACE 00134000
EXTRN DMKCFMEN,DMKTBLUP @V200930 00135000
EXTRN DMKQCNRD,DMKCFMBK,DMKVIOMK 00136000
EXTRN DMKSCNVU,DMKCFMAT @V200930 00137000
EXTRN DMKFRET @V200730 00138000
EXTRN DMKGRTDS,DMKGRTIN @V60A6B6 00138100
EXTRN DMKPSASC,DMKPSACC @V60BC11 00139000
EXTRN DMKVMASH @VA07351 00139100
EXTRN HDKD58EN HRC058DK 00139150
EJECT 00140000
ENTRY DMKVCNEX 00141000
USING *,R12 00142000
SPACE 00143000
DMKVCNEX DS 0H 00144000
L R1,VDEVIOCT GET IOCOUNT FOR DEVICE 00145000
AL R1,F1 BUMP IO COUNT 00146000
ST R1,VDEVIOCT AND STORE 00147000
OI VDEVSTAT,VDEVBUSY+VDEVCHBS INDICATE DEVICE BUSY 00148000
NI VMRSTAT,X'FF'-VMEXWAIT REMOVE FROM EXECUTION WAIT 00149000
LA R1,0(,R2) CLEAR STORAGE KEY FROM CAW 00150000
OI VDEVFLAG,VDEVCCW1 INDICATE 1ST CCW 00151000
XC VDEVCSW+4(2),VDEVCSW+4 SET STATUS PORTION OF INITIAL *00152000
CSW TO ZERO 00153000
STCM R2,B'1000',VDEVKEY SAVE STORAGE KEY IN VDEVBLOK 00154000
L R13,VDEVCON GET VCONCTL BLOCK 00155000
USING VCONCTL,R13 00156000
ST R1,VCONCAW SET FIRST VIRTUAL CAW 00157000
NI VDEVCFLG,X'FF'-(VDEVATTN+VDEVTRAN+VDEVVCF) RESET@V200930 00158000
MVI VCONFLAG,0 CLEAR FLAG 00159000
TM VDEVKEY,X'0F' CHECK FOR INVALID KEY BITS IN CAW 00160000
BNZ PROGCHK BRANCH IF ANY ON 00161000
SPACE 1 00162000
VCNGTNXT EQU * HERE TO GET AND PROCESS NEXT CCW 00163000
BAL R9,GETCCW GET CCW 00164000
SPACE 00165000
VCNNEXT EQU * HERE TO INTERPRET CCW 00166000
TM VCONCOMD,X'0F' CHECK FOR A VALID OPCODE BIT 00167000
BZ PROGCHK ERROR IF NONE ON 00168000
CLI VCONCOMD,X'03' NOP? 00169000
BE VCNF1 YES 00170000
CLI VCONCOMD,X'04' SENSE? 00171000
BE VCNSNSCN YES 00172000
MVI VDEVSNSE,0 RESET VIRTUAL SENSE BYTE 00173000
CLI VCONCOMD,X'0B' ALARM? 00174000
BE VCNF1 YES 00175000
TM VDEVSTAT,VDEVNRDY IS DEVICE NOT READY? 00176000
BNO VCNDTACW NO 00177000
MVI VDEVSNSE,INTREQ SET INTERVENTION REQUIRED 00178000
B UNITCHK 00179000
SPACE 1 00180000
VCNDTACW CLI VCONCOMD,X'0A' READ INQUIRY? 00181000
BE VCNRD YES 00182000
CLI VCONCOMD,X'0E' CMS READ WITH INHIBIT ? @V60C3BE 00182100
BE VCNRD BR YES @V60C3BE 00182200
CLI VCONCOMD,X'02' READ READER 2? 00183000
BE VCNRD YES 00184000
CLI VCONCOMD,X'09' WRITE WITH AUTO CARRIAGE RETURN 00185000
BE VCNWRT YES 00186000
CLI VCONCOMD,X'01' WRITE WITH NO AUTO CARRIAGE RETURN 00187000
BE VCNWRT YES 00188000
CLI VCONCOMD,X'19' DIAG SCREEN WRITE ?? @V200730 00189000
BE VCNWRT YES, CONT AND CHECK LATER @V200730 00190000
CLI VCONCOMD,X'29' DIAG 58 FULL SCR WRITE? HRC058DK 00190100
BE HD58SPCL Y, SPECIAL HANDLING HRC058DK 00190110
CLI VCONCOMD,X'2A' DIAG 58 FULL SCR READ? HRC058DK 00190120
BE HD58SPCL Y, SPECIAL HANDLING HRC058DK 00190130
CLI VCONCOMD,X'63' DIAG 58 control query? HRC064DK 00190200
BE HD58SPCL Y, special handling HRC064DK 00190210
VDEVREJ MVI VDEVSNSE,CMDREJ SET COMMAND REJECT @V200730 00191000
B UNITCHK 00192000
HD58SPCL EQU * HRC058DK 00192100
CALL HDKD58EN CALL DIAG 58 SUPPORT RTN HRC058DK 00192110
B LASTCCW POST STATUS AND EXIT HRC058DK 00192120
EJECT 00193000
*. 00194000
* OPERATION OF SENSE COMMAND - 00195000
* 00196000
* 1. TURN ON PCI BIT IN VIRTUAL CSW IF ON IN CCW. 00197000
* 00198000
* 2. SET CHANNEL END AND DEVICE END IN VIRTUAL CSW. 00199000
* 00200000
* 3. IF THE CCW COUNT IS 1 PROCEED; OTHERWISE IF DATA CHAINING 00201000
* IS ON OR SILI IS NOT ON SET INCORRECT LENGTH IN VIRTUAL 00202000
* CSW AND SUPPRESS ALL CHAINING. 00203000
* 00204000
* 4. IF SKIP IS ON GOTO STEP 5; OTHERWISE CHECK FOR PROTECTION 00205000
* AND ADDRESSING VIOLATIONS AND MOVE SENSE DATA TO VIRTUAL 00206000
* MEMORY. 00207000
* 00208000
* 5. TEST FOR POSSIBLE COMMAND CHAINING; IF CHAINING, LOCATE AND 00209000
* VERIFY NEXT CCW AND RESTART INTERPRETAION PROCESS; 00210000
* OTHERWISE EXIT AFTER POSTING PROPER ENDING STATUS. 00211000
* 00212000
*. 00213000
SPACE 3 00214000
VCNSNSCN EQU * HERE TO SIMULATE A SENSE OPERATION 00215000
OI VDEVCSW+4,CE+DE SET BOTH CHANNEL & DEVICE END 00216000
LH R4,VCONCNT GET COUNT 00217000
N R4,XRIGHT16 ... 00218000
BCTR R4,0 DECREMENT BY 1 00219000
STH R4,VDEVCSW+6 SET RESIDUAL COUNT 00220000
LTR R4,R4 NOW ZERO? 00221000
BZ SENSMOVE YES, COUNT WAS OK 00222000
TM VCONFLAG,CD DATA CHAINED? 00223000
BO SENSWLR YES, GIVE WLR 00224000
TM VCONFLAG,SILI SILI SPECIFIED? 00225000
BO SENSMOVE YES 00226000
SENSWLR OI VDEVCSW+5,IL SET INCORRECT LENGTH 00227000
NI VCONFLAG,X'FF'-(CD+CC) SUPPRESS CHAINING 00228000
SENSMOVE TM VCONFLAG,SKIP SKIP SPECIFIED? 00229000
BO FLAGTEST YES 00230000
L R1,VCONADDR GET VIRTUAL DATA ADDRESS 00231000
LA R1,0(,R1) ... 00232000
SL R6,VMCHSTRT CHANNEL DISP @VA01770 00233000
SL R7,VMCUSTRT CONT. UNIT DISP @VA01770 00234000
SL R8,VMDVSTRT GET VDEVBLOK DISPLACEMENT 00235000
TRANS 2,1,OPT=(BRING,DEFER),ADEX=PROGCHK1 00236000
AL R6,VMCHSTRT RESTORE ADDRESS @VA01770 00237000
AL R7,VMCUSTRT RESTORE ADDRESSS @VA01770 00238000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 00239000
TM VCONFLAG,IDA INDIRECT DATA ADDRESS ? 00240000
BNO SENSPROT NO 00241000
TM VCONADDR+3,X'03' IDA LIST MUST BE ON A WORD *00242000
BOUNDRY 00243000
BNZ PROGCHK ERROR IF NOT 00244000
L R1,0(,R2) GET FIRST INDIRECT DATA ADDRESS WORD 00245000
SL R6,VMCHSTRT CHANNEL DISP @VA01770 00246000
SL R7,VMCUSTRT CONT. UNIT DISP @VA01770 00247000
SL R8,VMDVSTRT GET VDEVBLOK DISPLACEMENT 00248000
ALTER1 TRANS 2,1,OPT=(BRING,DEFER),ADEX=PROGCHK1 @V304735 00249000
CALL DMKPSACC CHECK IF SHARED PAGE WAS CHANGED @V304735 00250000
BZ NOTCHG1 IF NOT - CONTINUE @V304735 00251000
CALL DMKVMASH FLAG ALL CHANGED SHARED PAGES @VA07351 00251100
B ALTER1 RE-ISSUE THE TRANS CALL @V304735 00254000
NOTCHG1 AL R6,VMCHSTRT RESTORE ADDRESS @V304735 00255000
AL R7,VMCUSTRT RESTORE ADDRESS @V304735 00256000
AL R8,VMDVSTRT RESTORE ADDRESS @V304735 00257000
SENSPROT IC R0,VDEVKEY GET VIRTUAL CAW KEY @V304735 00258000
CALL DMKPSASC CHECK FOR PROTECTION VIOLATION @V304735 00259000
BNE PROTCHK ERROR 00260000
MVC 0(1,R2),VDEVSNSE MOVE SENSE BYTE TO VIRTUAL CORE 00261000
B FLAGTEST 00262000
EJECT 00263000
*. 00264000
* OPERATION OF ALARM AND NOP COMMANDS - 00265000
* 00266000
* 1. TURN ON PCI BIT IN VIRTUAL CSW IF ON IN CCW. 00267000
* 00268000
* 2. SET CHANNEL END AND DEVICE END IN VIRTUAL CSW. 00269000
* 00270000
* 3. IF ALARM COMMAND SEND VIRTUAL BELL MESSAGE TO USER; 00271000
* OTHERWISE CONTINUE. 00272000
* 00273000
* 4. TEST FOR POSSIBLE COMMAND CHAINING; IF CHAINING, LOCATE 00274000
* AND VERIFY NEXT CCW AND RESTART INTERPRETATION PROCESS; 00275000
* OTHERWISE EXIT AFTER POSTING PROPER ENDING STATUS. 00276000
* 00277000
*. 00278000
SPACE 3 00279000
VCNF1 EQU * HERE FOR A CONTROL IMMEDIATE CCW 00280000
OI VDEVCSW+4,CE+DE SET BOTH CHANNEL & DEVICE END 00281000
CLI VCONCOMD,X'0B' ALARM? 00282000
BNE FLAGTEST NO 00283000
TM VDEVFLAG,VDEVCCW1 FIRST CCW? @VA03330 00284000
BZ VCNALRM NO - CONTINUE @VA03330 00285000
TM VCONFLAG,CD DATA CHAINED CONTROL? @VA03330 00286000
BNZ VCNALRW YES - CC=1 @VA03330 00287000
TM VCONFLAG,CC POSSIBLE CC=0? @VA03330 00288000
BNZ VCNALRM YES - LET HIM RUN @VA03330 00289000
VCNALRW OI VMRSTAT,VMEXWAIT MAKE HIM WAIT @VA03330 00290000
VCNALRM EQU * @VA03330 00291000
BAL R9,VCNQM000 Clear queued messages HRC063DK 00291500
LA R0,L'ALARMMSG GET LENGTH OF MESSAGE 00292000
LA R1,ALARMMSG GET MESSAGE PTR 00293000
LA R2,VMGENIO+ALARM+NOTIME PARMS FOR DMKQCNWT @VM01022 00294000
SL R6,VMCHSTRT CHANNEL DISPLACEMENT @VA09479 00294100
SL R7,VMCUSTRT CTRL UNIT DISPLACEMENT @VA09479 00294200
SL R8,VMDVSTRT VDEVBLOK DISPLACEMENT @VA09479 00294300
CALL DMKQCNWT WRITE WITH DELAYED RETURN @VA04067 00295000
AL R6,VMCHSTRT RESTORE ADDRESS @VA09479 00295100
AL R7,VMCUSTRT RESTORE ADDRESS @VA09479 00295200
AL R8,VMDVSTRT RESTORE ADDRESS @VA09479 00295300
SLR R15,R15 ZERO REG 15 @VA04067 00296000
STC R15,VMRBSC ZERO CONTASK CNT FOR REMOTE 3270 @VA04067 00297000
SPACE 00298000
FLAGTEST TM VCONFLAG,CD DATA CHAINED? 00299000
BO CKALARM VMEXWAIT ON FOR ALARM CCW @VA04067 00300000
TM VCONFLAG,CC COMMAND CHAINED? 00301000
BNO CKALARM VMEXWAIT ON FOR ALARM CCW @VA04067 00302000
NI VDEVFLAG,X'FF'-VDEVCCW1 TURN OFF FIRST CCW FLAG 00303000
B VCNGTNXT PROCESS NEXT CCW 00304000
CKALARM CLI VCONCOMD,X'0B' ALARM CCW? @VA04067 00305000
BNE LASTCCW NO - VMEXWAIT NOT ON BEFORE QCN @VA04067 00306000
TM VDEVFLAG,VDEVCCW1 FIRST CCW? @VA04067 00307000
BZ LASTCCW NO - VMEXWAIT NOT ON BEFORE QCN @VA04067 00308000
NI VMRSTAT,X'FF'-VMEXWAIT TURN OFF VMEXWAIT @VA04067 00309000
B LASTCCW GO FINISH UP @VA04067 00310000
EJECT 00311000
*. 00312000
* OPERATION OF READ COMMAND - 00313000
* 00314000
* 1. CALCULATE SIZE OF FREE STORAGE DATA BUFFER. 00315000
* 00316000
* 1A. LOOK FOR SPECIAL CASE WHERE A READ IS TO BE INTERCEPTED 00317000
* AND A CARRIAGE RETURN IS TO BE SIMULATED. THIS FUNCTION 00318000
* IS PART OF THE SYSLOAD DRIVER AND CAUSES THE AUTOLOGGED 00319000
* ON USER TO EXECUTE HIS PROFILE EXEC WHEN THE FIRST READ 00320000
* IS ISSUED AFTER IPLING CMS. 00321000
SPACE 1 00322000
* 2. CALL DMKQCNRD TO OBTAIN TERMINAL INPUT. 00323000
* 00324000
* 3. SET CHANNEL END IN VIRTUAL CSW. 00325000
* 00326000
* 4. IF A LINE BREAK HAS OCCURED DURING THE READ CALL DMKFRET 00327000
* TO RETURN THE DATA BUFFER TO FREE STORAGE AND THEN EXIT; 00328000
* IF A SINGLE ATTENTION IS HIT AND IF THE VIRTUAL CONSOLE IS 00329000
* STILL BUSY SET UNIT EXCEPTION IN THE VIRTUAL CSW AND POST 00330000
* PROPER ENDING STATUS; IF 2 OR MORE ATTENTIONS ARE HIT TURN 00331000
* ON THE MULTIPLE ATTENTION FLAG FOR LATER INTERROGATION; 00332000
* OTHERWISE IF THE VIRTUAL CONSOLE IS STILL BUSY TURN 00333000
* ON PCI IN THE VIRTUAL CSW IF ON IN CCW AND VALIDITY CHECK 00334000
* FOR PROTECTION AND ADDRESSING VIOLATIONS AND IF THE SKIP 00335000
* FLAG IS NOT ON CCW MOVE DATA TO VIRTUAL MEMORY 00336000
* REEXECUTING THE MOVE WITH AN UPDATED ADDRESS WHEN DATA 00337000
* CHAINING IS SPECIFIED. 00338000
* 00339000
* 5. TEST FOR POSSIBLE COMMAND CHAINING; IF CHAINING LOCATE 00340000
* AND VERIFY NEXT CCW AND RESTART INTERPRETATION PROCESS; 00341000
* OTHERWISE EXIT AFTER POSTING PROPER ENDING STATUS. 00342000
* 00343000
* 6. THE DATA ENTERED BY A VIRTUAL MACHINE READ IS EXAMINED 00344000
* TO CHECK FOR EXECUTION OF CP CONSOLE FUNCTIONS . 00345000
* THE DATA IS EXANINED ONLY IF THE VIRTUAL MACHINE IS 00346000
* USING LINEDIT AND IF NO ATTN INDICATORS ARE SET. 00347000
* THE DATA MUST START AT THE FIRST DATA POSITION AND 00348000
* MUST BE OF THE FOLLOWING FORMAT: 00349000
* #CP ( OPTIONAL DATA ) 00350000
* WHERE THE # IS THE LOGICAL LINEND CHARACTER 00351000
* IF THE OPTIONAL DATA IS NOT ENTERED THE CP ENVIR 00352000
* IS ENTERED OTHERWISE THE DATA IS A CONSOLE FUNCTION TO BE 00353000
* EXECUTED . CONTROL IS RETURNED TO THE VIRTUAL MACHINE 00354000
* AND THE READ IS CANCELLD BY A UE STATUS. 00355000
* THIS FEATURE ALLOWS ANY MACHINE TO EXECUTE A CONSOLE 00356000
* FUNCTION FROM A VIRTUAL MACHINE READ. 00357000
* NIFTY .... !!!! 00358000
* 00359000
*. 00360000
SPACE 3 00361000
VCNRD EQU * HERE TO SIMULATE A READ OPERATION 00362000
OI VDEVCSW+4,CE SET CHANNEL END 00363000
BAL R9,VCNSCALC CALCULATE SIZE NEEDED FOR BUFFER 00364000
LA R0,9(,R4) GET COUNT ROUNDED TO NEAREST DOUBLE WORD 00365000
SRL R0,3 ALLOWING FOR A 2 BYTE SLOP AREA 00366000
CALL DMKFREE 00367000
ST R1,VCONBUF SAVE BUFFER ADDRESS @V200730 00368000
STH R0,VCONBFSZ SET DATA BUFFER SIZE HRC101DK 00369490
L R10,VCONRBUF TEST IF A VIRTUAL BUFFER EXISTS @V200730 00370000
LTR R10,R10 IS THERE ONE ?? @V200730 00371000
BZ TSTWBUF NO, TEST FOR WRITE BUFFER @V200730 00372000
CH R4,VCONRCNT IS COUNT LESS THAN BUFFER COUNT ?@V200730 00373000
BL *+8 YES - @V200730 00374000
LH R4,VCONRCNT NO - USE BUFFER BYTE COUNT @V200730 00375000
S R4,F1 DECREMENT FOR EXECUTED MOVE @V305535 00377000
BM *+8 BYPASS MOVE, NOTHING THERE @V305535 00378000
EX R4,MVCBUFF MOVE DATA FROM VIRTUAL BUFFER @V200730 00379000
L R1,VCONRBUF LOAD ADDRESS OF VIRTUAL BUFFER @V200730 00380000
SLR R0,R0 CLEAR @V200730 00381000
ST R0,VCONRBUF CLEAR BUFFER ADDRESS @V200730 00382000
LH R0,VCONRBSZ SIZE IN DW'S OF VIRTUAL BUFFER HRC101DK 00383490
CALL DMKFRET FRET IT. @V200730 00384000
LA R0,1 INCREMENT . . @V305535 00385000
AR R0,R4 . . DECREMENTED COUNT @V305535 00386000
SLR R2,R2 CLEAR @V200730 00387000
LH R4,VDEVADD FORM DEVICE ADDR IN R4 @V200730 00388000
LH R5,VCUADD ... @V200730 00389000
OR R4,R5 ... @V200730 00390000
AH R4,VCHADD ... @V200730 00391000
L R1,VCONBUF GET BUFFER ADDRESS @V200730 00392000
B VCNRDRET CONTINUE AS IF READ WAS DONE @V200730 00393000
SPACE 00394000
TSTWBUF TM VDEVFLAG,VDEVCSPL CONSOLE SPOOLING ?? @V200730 00395000
BZ WFRET NO, FRET ANY BUFFER @V200730 00396000
TM VDEVSFLG,VDEVTERM TERM OUTPUT WITH SPOOLING ?? @V200730 00397000
BO WFRET YES, FRET ANY BUFFER @V200730 00398000
L R1,VCONWBUF GET LAST OUTPUT FROM VIRT WRITE @V200730 00399000
LTR R1,R1 IS THERE ANY ?? @V200730 00400000
BZ QCNRD NO, CONT WITH READ @V200730 00401000
LH R0,VCONWCNT GET DATA COUNT @V200730 00402000
CALL DMKQCNWT,PARM=NORET+PRIORITY FORCE MSG TO TERMI @V200730 00403000
WFRET L R1,VCONWBUF GET BUFFER ADDRESS @V200730 00404000
LTR R1,R1 IS THERE ONE ?? @V200730 00405000
BZ QCNRD NO, CONT WITH THE READ @V200730 00406000
SR R0,R0 CLEAR @V200730 00407000
ST R0,VCONWBUF CLEAR BUFFER ADDRESS @V200730 00408000
IC R0,VCONWBSZ GET BUFFER SIZE @V200730 00409000
CALL DMKFRET FRET BUFFER @V200730 00410000
QCNRD EQU * @V200820 00411000
TM VMMLEVEL,VMMSTMP TIME-STAMPING OUTPUT ? @V200820 00412000
BZ QCNRDR NO -- O.K. AS IS @V200820 00413000
SLR R0,R0 ZERO-LENGTH WRITE FOR TIME STAMP @V200820 00414000
LA R1,BLANKS LET GR1 BE VALID @V200820 00415000
CALL DMKQCNWT,PARM=NORET+NOAUTO FORCE TIME STAMP @V200820 00416000
QCNRDR EQU * @V200820 00417000
LA R2,VMGENIO PARM FOR READ @V200730 00418000
TM VMMLEVEL,VMMLINED EDIT INPUT ?? @V200730 00419000
BZ *+8 NO, CONT @V200730 00420000
LA R2,EDIT+VMGENIO EDIT AND VM IO @V200730 00421000
LR R0,R4 SET DATA COUNT TO READ @V200730 00422000
LH R4,VDEVADD FORM DEV ADDRESS IN R4 @V200730 00423000
LH R5,VCUADD .. @V200730 00424000
OR R4,R5 .. @V200730 00425000
AH R4,VCHADD .. @V200730 00426000
L R1,VCONBUF SET BUFFER ADDRESS @V200730 00427000
SPACE 00427010
CLI VCONCOMD,X'0E' CMS READ WITH INHIBIT ? @V60C3BE 00427020
BNE VCNRDY BR NO @V60C3BE 00427030
MVI VCONCOMD,X'0A' YES. CHANGE TO REAL READ @V60C3BE 00427040
LA R2,INHIBIT(R2) AND ADD INHIBIT TO QCN PARMS @V60C3BE 00427050
VCNRDY EQU * @V60C3BE 00427060
SPACE 00427070
CALL DMKQCNRD READ DATA FROM TERMINAL @V200730 00428000
SPACE 1 00429000
VCNRDRET EQU * HERE AT COMPLETION OF READ 00430000
TM VMRSTAT,VMLOGOFF USER IN LOGOFF NOW ? @VM08939 00431000
BO VCNEXITY YES - JUST BAIL OUT FAST @VM08939 00432000
LR R10,R1 SAVE BUFFER ADDRESS @V200730 00433000
L R1,VCONRBUF IS THERE A WAITING BUFFER @VA11787 00433100
LTR R1,R1 ... @VA11787 00433150
BZ VCNRDCNT NO,CONTINUE AS BEFORE @VA11787 00433200
ST R10,VCONRBUF EXCHANGE PREVIOUS BUFFER AND @VA11787 00433250
ST R1,VCONBUF CURRENT BUFFER @VA11787 00433300
LR R10,R1 CURRENT BUFFER FOR VCN @VA11787 00433350
SR R0,R0 CLEAR WORK REGISTER @VA11787 00433400
LH R0,VCONRBSZ GET CURRENT BUFFER SIZE HRC101DK 00433480
LH R1,VCONBFSZ GET PREVIOUS BUFFER SIZE HRC101DK 00433510
STH R1,VCONRBSZ AND EXCHANGE THEM HRC101DK 00433540
STH R0,VCONBFSZ ... HRC101DK 00433570
LH R0,VCONRCNT GET CURRENT DATA COUNT @VA11787 00433650
LH R1,VCONCNT GET PREVIOUS DATA COUNT @VA11787 00433700
STH R0,VCONCNT AND EXCHANGE THEM @VA11787 00433750
STH R1,VCONRCNT ... @VA11787 00433800
VCNRDCNT DS 0H @VA11787 00433850
LR R1,R4 SET DEVICE ADDRESS 00434000
CALL DMKSCNVU FIND DEVICE BLOKS AGAIN 00435000
BNZ VCNEXITY DEVICE GONE, GET OUT 00436000
LR R1,R10 SET BUFFER ADDRESS 00437000
TM VDEVTYPC,CLASTERM STILL A TERMINAL ?? 00438000
BZ VCNEXITY NO, GET OUT 00439000
CLI VDEVTYPE,TYP3210 STILL A VIRTUAL CONSOLE ?? 00440000
BNE VCNEXITY NO, GET OUT 00441000
B *+4(R2) 00442000
B VCNRDNAT NO ATTENTION HIT 00443000
B VCNRDSAT SINGLE ATTENTION HIT 00444000
B VCNRDDAT 2 OR MORE ATTENTIONS HIT 00445000
B VCNUE LINE BREAK - CANCEL THE READ @VM08939 00446000
SPACE 00447000
VCNRDSAT EQU * HERE WHEN A SINGLE ATTENTION IS HIT DURING A READ 00448000
LTR R0,R0 TEST FOR ATTN WITH NO CHARS TYPED 00449000
BNZ VCNUE NO, SET UE 00450000
CALL DMKCFMAT SET ATTN INT PENDING @V200930 00451000
BZ VCNRDNAT ATTN SET OK, CONT @V200930 00452000
TM VDEVCFLG,VDEVATTN FLAGGED FOR CP, ATTN NOT SET @V200930 00453000
BO LASTCCW YES, TERMINATE CCW STRING @V200930 00454000
SPACE 00455000
VCNRDDAT EQU * HERE WHEN 2 OR MORE ATTENTIONS ARE HIT FOR A READ 00456000
OI VDEVCFLG,VDEVATTN INDICATE BREAK IS TO BE CALLED LATER 00457000
LTR R0,R0 ANY CHARACTERS TYPED ?? 00458000
BNZ VCNRDNAT YES, CONT 00459000
VCNUE OI VDEVCSW+4,UE FLAG UE FOR CANCEL, MACHINE @V200930 00460000
* RE-READ 00461000
SPACE 00462000
VCNRDNAT EQU * HERE AT COMPLETION OF READ 00463000
ALR R0,R10 GET END OF BUFFER 00464000
TM VDEVSTAT,VDEVBUSY+VDEVCHBS IS DEVICE STILL BUSY? 00465000
BO VCNRDCD YES - O.K. @VM08939 00466000
BAL R9,VCNRELSE FRET THE READ BUFFERS @VM08939 00467000
B VCNEXITY EXIT FORTHWITH @VM08939 00468000
VCNRDCD EQU * HERE TO MOVE READ DATA 00469000
CLR R0,R10 ANY CHARS ENTERED ?? @V200930 00470000
BE NOCP NO, CONT @V200930 00471000
TM VDEVCSW+4,UE LINE CANCELED ?? @V200930 00472000
BO NOCP YES, CONT @V200930 00473000
TM VDEVCFLG,VDEVATTN ATTN TO CP ?? @V200930 00474000
BNO NOATT NO, CONTINUE @VA11228 00475100
OI VCONFLAG,SKIP YES,DON'T PASS DATA TO USER @VA11228 00475200
B NOCP PROCESS READ DATA @VA11228 00475300
NOATT DS 0H @VA11228 00475400
TM VMMLEVEL,VMMLINED LINEDIT ON ?? @V200930 00476000
BZ NOCP NO, IGNORE DATA @V200930 00477000
L R15,0(R10) GET CHARS TYPED .. FIRST FOUR @V200930 00478000
O R15,=X'00404040' UPPER CASE FOR COMPARE @V200930 00479000
CLM R15,14,=X'15C3D7' IS IT 'LINEND'CP'? @VA03041 00480000
BNE NOCP NO, CONTINUE @VA03041 00481000
SLR R0,R10 COMPUTE INPUT COUNT @VA03041 00482000
CL R0,F3 MORE THAN THREE? @VA03041 00483000
BNH SETCP NO, MUST BE CP ONLY @VA03041 00484000
CLI 3(R10),X'40' FOLLOWED BY A BLANK? @VA03041 00485000
BNE SETBUFL NO, CANNOT EXECUTE CP @VA03041 00486000
CL R0,F4 MORE THAN FOUR? @VA03041 00487000
BNH SETCP NO, MUST BE CP ONLY @VA03041 00488000
OI VDEVCFLG,VDEVVCF FLAG FOR VIRT CONSOLE FUNCTION @V200930 00489000
LR R3,R0 GET SIZE @V200930 00490000
LA R0,18 SIZE FOR BUFFER @V200930 00491000
CALL DMKFREE GET CONSOLE FUNCTION BUFFER @V200930 00492000
MVC 0(8,R1),BLANKS CLEAR BUFFER @V200930 00493000
MVC 8(17*8,R1),0(R1) .. @V200930 00494000
CL R3,=F'132' IS IT BIGGER THAN ALLOWED .. @V200930 00495000
BL *+8 NO, CONT @V200930 00496000
LA R3,132 SET TO MAXIMUM @V200930 00497000
BCTR R3,R0 SET FOR EXECUTE @V200930 00498000
EX R3,MVCP MOVE DATA TO BUFFER @V200930 00499000
L R15,=A(DMKTBLUP) GET UPPER CASE TRANSLATE TABLE @V200930 00500000
EX R3,TRCP TRANSLATE TO UPPER CASE DATA @V200930 00501000
LA R0,1(R3) RESTORE R0 COUNT @V200930 00502000
USING BUFIN,R1 @V200930 00503000
ST R1,BUFNXT SET DATA ADDRESS @V200930 00504000
ST R0,BUFCNT SET DATA COUNT @V200930 00505000
DROP R1 @V200930 00506000
ST R1,VCONRBUF SAVE BUFFER ADDRESS @V200930 00507000
B SETUE SET CANCEL TO MACHINE @V200930 00508000
SETCP OI VDEVCFLG,VDEVATTN FLAG TO GO TO CP MODE @V200930 00509000
SETUE OI VDEVCSW+4,UE FLAG CANCEL TO MACHINE @V200930 00510000
SETBUFL ALR R0,R10 SET R0 TO END OF BUFFER @VA03041 00511000
NOCP DS 0H @V200930 00512000
BAL R9,VCNMVDAT MOVE DATA 00513000
TM VDEVCSW+4,UE UNIT EXCEPTION ? 00514000
BO LASTCCW YES 00515000
TM VCONFLAG,CD+CC CHAINING? 00516000
BZ LASTCCW 00517000
NI VDEVFLAG,X'FF'-VDEVCCW1 TURN OFF FIRST CCW FLAG 00518000
BAL R9,GETCCW GET NEXT CCW 00519000
B VCNRDRL RETURN HERE IF COMMAND CHAINING 00520000
B VCNRDCD RETURN HERE IF DATA CHAINING 00521000
VCNRDRL EQU * ... 00522000
BAL R9,VCNRELSE RELEASE BUFFER 00523000
B VCNNEXT 00524000
SPACE 2 00525000
MVCP MVC 0(*-*,R1),0(R10) MOVE DATA TO BUFFER @V200930 00526000
TRCP TR 0(*-*,R1),0(R15) TRANSLATE TO UPPER CASE @V200930 00527000
EJECT 00528000
*. 00529000
* OPERATION OF WRITE COMMAND - 00530000
* 00531000
* 1. CALCULATE SIZE OF FREE STORAGE DATA BUFFER. 00532000
* 00533000
* 2. TURN PCI ON IN THE VIRTUAL CSW IF ON IN THE CCW AND 00534000
* VALIDITY CHECK FOR ADDRESSING VIOLATION AND MOVE DATA FROM 00535000
* VIRTUAL MEMORY. 00536000
* 00537000
* 3. IF DATA CHAINING IS ON LOCATE AND VERIFY NEXT CCW AND THEN 00538000
* REPEAT STEP 2. 00539000
* 00540000
* 4. IF SILI IS NOT SPECIFIED, SET INCORRECT LENGTH IN THE 00541000
* VIRTUAL CSW. 00542000
* 00543000
* 5. IF THE VIRTUAL CONSOLE IS STILL BUSY, CALL DMKQCNWT TO 00544000
* WRITE THE MESSAGE ON THE REAL TERMINAL. 00545000
* 00546000
* 6. IF A LINE BREAK HAS OCCURED DURING THE WRITE CALL DMKFRET 00547000
* TO RETURN THE DATA BUFFER TO FREE STORAGE AND THEN EXIT; 00548000
* IF A SINGLE ATTENTION IS HIT SET THE ATTN FLAG IN VDEVINTS 00549000
* TO REFLECT AN ATTENTION INTERRUPT AFTER THE PRESANT I/O 00550000
* OPERATION IS REFLECTED; IF 2 OR MORE ATTENTIONS ARE HIT, 00551000
* TURN ON THE MULTIPLE ATTENTION FLAG FOR LATER 00552000
* INTERROGATION. 00553000
* 00554000
* 7. TEST FOR POSSIBLE COMMAND CHAINING; IF CHAINING LOCATE AND 00555000
* VERIFY NEXT CCW AND RESTART INTERPRETATION PROCESS; 00556000
* OTHERWISE EXIT AFTER POSTING PROPER ENDING STATUS. 00557000
* 00558000
*. 00559000
SPACE 3 00560000
VCNWRT EQU * HERE TO SIMULATE A WRITE OPERATION 00561000
BAL R9,VCNQM000 Clear queued messages HRC063DK 00561500
OI VDEVCSW+4,CE SET CHANNEL END 00562000
BAL R9,VCNSCALC CALCULATE SIZE NEEDED FOR BUFFER 00563000
LA R0,7(,R4) GET COUNT ROUNDED TO NEAREST DOUBLE WORD 00564000
SRL R0,3 ... 00565000
CALL DMKFREE 00566000
LR R10,R1 SAVE PTR 00567000
ST R10,VCONBUF REMEBER HERE 00568000
STH R0,VCONBFSZ SET DATA BUFFER SIZE HRC101DK 00569490
VCNCNCDW LH R0,VCONCNT GET CCW COUNT 00570000
N R0,XRIGHT16 ... 00571000
ALR R0,R10 RO POINTS TO CURRENT END OF BUFFER 00572000
BAL R9,VCNMVDAT CALL SUBROUTINE TO MOVE DATA 00573000
TM VCONCCW+4,CD DATA CHAINING? 00574000
BO VCNCNCHN YES 00575000
TM VCONCCW+4,SILI SILI? 00576000
BO VCNCWRT YES 00577000
OI VDEVCSW+5,IL SET INCORRECT LENGTH 00578000
NI VCONCCW+4,X'FF'-(CD+CC) SUPPRESS CHAINING 00579000
VCNCWRT L R1,VCONBUF GET CONSOLE WORK BUFFER 00580000
SR R2,R2 CLEAR PARAMETER REGISTER 00581000
SLR R10,R1 GET LENGTH 00582000
LTR R0,R10 LENGTH .EQ. 0 00583000
BZ VCNWTNAT YES -- NOTHING MORE TO WRITE 00584000
TM VCONCOMD,X'08' AUTO CARRIAGE RETURN? 00585000
BO VCNCNF5 YES 00586000
LA R2,VMGENIO+NOAUTO @V200820 00587000
B VCNCN 00588000
VCNCNF5 EQU * NORMAL VIRTUAL MACHINE WRITE @V200820 00589000
LA R2,VMGENIO @V200820 00590000
VCNCN LH R4,VDEVADD GET DEVICE ADDRESS @V200730 00591000
LH R5,VCUADD .. 00592000
OR R4,R5 .. 00593000
AH R4,VCHADD .. 00594000
LR R10,R1 BUFFER ADDRESS IN R10 @V200930 00595000
ICM R2,8,VCONDWC GET DIAGNOSE CORD OR ZERO @VA07542 00596100
TM VCONFLAG,X'01' HIGH INTENSITY? HRC310DK 00596110
BZ *+8 NOPE, LEAVE R2 ALONE HRC310DK 00596120
O R2,=A(HILIGHT) YES, SET HILIGHT FLAG HRC310DK 00596130
TM VCONDWC,X'40' DIAGNOSE GRAPHICS WRITE ?? @VA07542 00597100
BNZ CONWAIT YES..WAIT FOR MESSAGE @VM01023 00598000
ICM R15,B'1111',VMTERM GET TERM RDEVBLOK.. @VM01023 00599000
BNP CONWAIT NOT THERE..SAD... @VM01023 00600000
USING RDEVBLOK,R15 @VM01023 00601000
CLI RDEVTYPC,CLASTERM TERM CLASS ? @VM01023 00602000
BNE CONWAIT NO..3270L @VM01023 00603000
CLI RDEVTYPE,TYPBSC REMOTE 3270 ? @VM01023 00604000
BNE CONWAIT NO..SORRY... @VM01023 00605000
DROP R15 @VM01023 00606000
SLR R15,R15 CLEAR COUNT REG @VM01023 00607000
CH R0,=H'80' MORE THAN A LINE ? @VM01023 00608000
BH CONWAIT SKIP FOR NOW... @VM01023 00609000
IC R15,VMRBSC PICK UP CONTASK COUNT (MAYBE) @VM01023 00610000
LA R15,1(,R15) ADD ONE @VM01023 00611000
STC R15,VMRBSC REPLACE @VM01023 00612000
CH R15,=H'22' REACHED THE LIMIT ? @VM01023 00613000
BNL CONWAIT YES..STOP RIGHT HERE... @VM01023 00614000
O R2,=A(NORET) RETURN IMMEDIATELY @VM01023 00615000
CALL DMKQCNWT AND GO SEND MSG @VM01023 00616000
SLR R2,R2 CLEAR RETURN CODE @VM01023 00617000
B VCNNMVI CONTINUE... @VM01023 00618000
CONWAIT EQU * @VM01023 00619000
CALL DMKQCNWT WAIT FOR COMPLETION @VM01023 00620000
SLR R15,R15 CLEAR CONTASK @VM01023 00621000
STC R15,VMRBSC COUNT... @VM01023 00622000
SPACE 1 00623000
VCNNMVI EQU * HERE AT COMPLETION OF WRITE 00624000
TM VMRSTAT,VMLOGOFF VIRTUAL MACHINE IN LOGOFF ? @VM08939 00625000
BO VCNEXITY YES - BAIL OUT RAPIDLY @VM08939 00626000
LR R1,R4 GET DEVICE ADDRESS 00627000
CALL DMKSCNVU FIND DEVICE BLOKS AGAIN 00628000
BNZ VCNEXITY DEVICE GONE, GET OUT 00629000
TM VDEVTYPC,CLASTERM IS IT A TERMINAL DEVICE ? 00630000
BZ VCNEXITY NO - EXIT 00631000
CLI VDEVTYPE,TYP3210 IS IT A CONSOLE ?? 00632000
BNE VCNEXITY NO -- EXIT 00633000
LR R4,R0 SAVE DATA COUNT @V200730 00634000
L R1,VCONWBUF GET OLD BUFFER ADDRESS @V200730 00635000
LTR R1,R1 IS THERE ONE ?? @V200730 00636000
BZ TSTSAVE NO, TEST TO SAVE THIS DATA @V200730 00637000
SR R0,R0 CLEAR @V200730 00638000
ST R0,VCONWBUF CLEAR BUFFER ADDRESS 00639000
IC R0,VCONWBSZ GET OLD BUFFER SIZE @V200730 00640000
CALL DMKFRET FRET OLD BUFFER @V200730 00641000
TSTSAVE TM VDEVFLAG,VDEVCSPL CONSOLE SPOOLING ?? @V200730 00642000
BZ TSTR2 NO, CONT @V200730 00643000
TM VDEVSFLG,VDEVTERM TERM OUTPUT WITH SPOOLING ?? @V200730 00644000
BO TSTR2 YES, CONT @V200730 00645000
CLI VCONCOMD,X'19' DIAGNOSE WRITE ? @VM01022 00646000
BE TSTR2 YES, DO NOT SAVE DIAGNOSE DATA @VM01022 00647000
LA R0,7(R4) ROUND UP DATA COUNT @V200730 00648000
SRL R0,3 GET DOUBLE WORD COUNT @V200730 00649000
CALL DMKFREE GET A BUFFER @V200730 00650000
STC R0,VCONWBSZ SAVE BUFFER SZIE @V200730 00651000
STH R4,VCONWCNT SAVE DATA COUNT @V200730 00652000
ST R1,VCONWBUF SAVE BUFFER ADDRESS @V200730 00653000
BCTR R4,R0 DECREMENT FOR EXECUTE @V200730 00654000
EX R4,SAVEBUF SAVE DATA IN BUFFER @V200730 00655000
TSTR2 B *+4(R2) BRANCH ON R2 RETURN CODE @V200730 00656000
B VCNWTNAT NO ATTENTION HIT 00657000
B VCNWTSAT SINGLE ATTENTION HIT 00658000
B VCNWTDAT 2 OR MORE ATTENTIONS HIT 00659000
B LASTCCW LINE BREAK - STOP CHAINING NOW @VM08939 00660000
SPACE 00661000
VCNWTSAT CALL DMKCFMAT CALL TO SET ATTN INT PENDING @V200930 00662000
BZ VCNWTNAT ATTN SET OK, CONT @V200930 00663000
TM VDEVCFLG,VDEVATTN FLAGGED FOR CP, ATTN NOT SET @V200930 00664000
BO LASTCCW YES, TERMINATE CCW STRING @V200930 00665000
SPACE 00666000
VCNWTDAT EQU * HERE WHEN 2 OR MORE ATTENTIONS ARE HIT DURING A WRITE 00667000
OI VDEVCFLG,VDEVATTN INDICATE BREAK IS TO BE CALLED LATER 00668000
SPACE 00669000
VCNWTNAT EQU * HERE AT COMPLETION OF WRITE 00670000
BAL R9,VCNRELSE RELEASE BUFFER 00671000
TM VDEVSTAT,VDEVBUSY+VDEVCHBS DEVICE STILL BUSY? 00672000
BNO VCNEXITY NO 00673000
TM VCONFLAG,CD+CC CHAINING? 00674000
BZ LASTCCW NO 00675000
VCNCNCHN NI VDEVFLAG,X'FF'-VDEVCCW1 TURN OFF FIRST CCW FLAG 00676000
BAL R9,GETCCW GET NEXT CCW 00677000
B VCNNEXT RETURN HERE IF COMMAND CHAINING 00678000
B VCNCNCDW RETURN HERE IF DATA CHAINING 00679000
EJECT 00680000
GETCCW EQU * HERE TO FIND AND VALIDATE THE NEXT NON-TIC CCW IN *00681000
CHANNEL PROGRAM 00682000
NC VDEVCSW+4(2),=AL1(CE,PCI) CLEAR VIRTUAL CSW STATUS 00683000
L R1,VCONCAW POINT TO NEXT CCW TO PROCESS 00684000
ADDRTEST TM VCONCAW+3,7 CHECK DOUBLE-WORD ALIGNMENT 00685000
BNZ PROGCHK ALIGNMENT ERROR 00686000
LA R15,8(,R1) GET CCW ADDRESS+8 00687000
ST R15,VDEVCSW AND SAVE IN CSW 00688000
ST R15,VCONCAW AND IN CAW FOR NEXT TIME 00689000
SL R6,VMCHSTRT CHANNEL DISP @VA01770 00690000
SL R7,VMCUSTRT CONT. UNIT DISP @VA01770 00691000
SL R8,VMDVSTRT GET VDEVBLOK DISPLACEMENT 00692000
ALTER2 TRANS 2,1,OPT=(BRING,DEFER),ADEX=PROGCHK1 GET CCW @V304735 00693000
CALL DMKPSACC CHECK IF SHARED PAGE WAS CHANGED @V304735 00694000
BZ NOTCHG2 IF NOT - CONTINUE @V304735 00695000
CALL DMKVMASH FLAG ALL CHANGED SHARED PAGES @VA07351 00695100
B ALTER2 RE-ISSUE THE TRANS CALL @V304735 00697000
NOTCHG2 AL R6,VMCHSTRT RESTORE ADDRESS @V304735 00698000
AL R7,VMCUSTRT RESTORE ADDRESS @V304735 00699000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 00700000
TM 0(R2),X'07' COULD IT BE A TIC ? 00701000
BNZ NOTTIC NO 00702000
TM 0(R2),X'08' IS IT A TIC ? 00703000
BO TIC YES 00704000
SPACE 1 00705000
NOTTIC EQU * 00706000
LA R15,4 SET TENTATIVE EXIT INDEX 00707000
TM VCONFLAG,CD DATA CHAINING ?? @V200730 00708000
BO GETCD YES, GET ADDRESS @V200730 00709000
MVC VCONCCW,0(R2) MOVE CCW TO VCONCTL @V200730 00710000
SLR R15,R15 SET EXIT INDEX FOR CMD CHHRC058DK 00710100
CLI VCONCCW,X'29' DIAG 58 FULL SCR WRITE? HRC058DK 00710110
BE SETRETN Y, BYTE 5 HAS OPT FLAGS HRC058DK 00710120
CLI VCONCCW,X'2A' DIAG 58 FULL SCR READ? HRC058DK 00710130
BE SETRETN Y, BYTE 5 HAS OPT FLAGS HRC058DK 00710140
CLI VCONCCW,X'63' DIAG 58 control query? HRC064DK 00710200
BE SETRETN Y, pass it through HRC064DK 00710210
OI VCONDWC,X'40' ASSUME DIAGNOSE GRAPHICS WRITE @VA07542 00711100
CLI VCONCCW,X'19' DIAG WRITE CCW ?? @V200730 00713000
BE SETRETN YES, BYTE 5 HAS LINE CORD @V200730 00714000
MVI VCONDWC,X'00' CLEAR FOR OTHER WRITES @VA07542 00715100
B SETRETN SET RETURN INDEX @V200730 00716000
GETCD L R1,0(R2) GET ADDRESS PORTION @V200730 00717000
STCM R1,7,VCONCCW+1 SET DATA ADDRESS @V200730 00718000
L R1,4(R2) GET REST OF CCW @V200730 00719000
STCM R1,8,VCONFLAG SET CCW FLAGS @V200730 00720000
STH R1,VCONCNT SET NEW CCW COUNT @V200730 00721000
SETRETN ALR R9,R15 SET CORRECT EXIT ADDRESS 00722000
TM VCONFLAG,PCIF PCI FLAG ON ? 00723000
BNO *+8 NO 00724000
OI VDEVCSW+5,PCI SET PCI IN VIRTUAL CSW 00725000
LH R1,VCONCNT GET CCW COUNT 00726000
N R1,XRIGHT16 COUNT ZERO? 00727000
BZ PROGCHK YES 00728000
STH R1,VDEVCSW+6 SET RESIDUAL COUNT 00729000
CLI VCONCCW,X'19' DIAGNOSE WRITE? HRC310DK 00729100
BE *+12 YES, ALLOW 38-39 NON-ZERO HRC310DK 00729200
TM VCONFLAG,3 BITS 38-39 OF THE CCW MUST BE 0 00730000
BNZ PROGCHK IF NOT -- 00731000
TM VCONFLAG,IDA INDIRECT DATA ADDRESS ? 00732000
BNO VCNDTTS NO 00733000
TM VCONADDR+3,X'03' IDA MUST BE ON A WORD *00734000
BOUNDRY 00735000
BNZ PROGCHK ERROR IF NOT 00736000
SL R6,VMCHSTRT GET DISPLACEMENT; BLOCKS @VA03177 00737000
SL R7,VMCUSTRT MAY MOVE @VA03177 00738000
SL R8,VMDVSTRT ... @VA03177 00739000
L R1,VCONCCW GET VIRT ADD OF IDA LIST @VA03177 00740000
TRANS 2,1,OPT=(BRING,DEFER),ADEX=PROGCHK1 PULL IDA IN @VA03177 00741000
AL R6,VMCHSTRT FIX DISPLACEMENT; BLOCKS @VA03177 00742000
AL R7,VMCUSTRT MAY HAVE MOVED @VA03177 00743000
AL R8,VMDVSTRT ... @VA03177 00744000
TM 0(R2),X'FF' IS FIRST IDA ENTRY VALID ? @VA03177 00745000
BNZ PROGCHK NO- BRANCH; ERROR @VA03177 00746000
VCNDTTS NI VDEVCFLG,X'FF'-VDEVTIC TURN TIC FLAG OFF 00747000
BR R9 RETURN 00748000
SPACE 1 00749000
TIC EQU * HERE TO FOLLOW THE TIC 00750000
TM VDEVFLAG,VDEVCCW1 IS IT THE FIRST CCW? 00751000
BO PROGCHK YES, GO SET PROGRAM CHECK 00752000
TM VDEVCFLG,VDEVTIC TIC TO TIC ? 00753000
BO PROGCHK YES, GO SET PROGRAM CHECK 00754000
OI VDEVCFLG,VDEVTIC INDICATE LAST CCW WAS A TIC 00755000
L R1,0(,R2) GET TIC ADDRESS 00756000
LA R1,0(,R1) STRIP OP-CODE 00757000
ST R1,VCONCAW SAVE ADDRESS 00758000
B ADDRTEST GO VALIDATE NEW CCW 00759000
EJECT 00760000
VCNSCALC EQU * HERE TO CALCUATE THE SIZE OF THE DATA BUFFER *00761000
NEEDED FOR READ AND WRITE SIMULATION 00762000
SLR R4,R4 CLEAR 00763000
L R1,VCONCAW GET CURRENT CAW 00764000
S R1,F8 AND BACKUP TO GET CURRENT CCW 00765000
VCNSCLP LR R3,R1 CHECK FOR NON DOUBLE WORD ALIGNMENT 00766000
N R3,F7 ... 00767000
BNZ PROGCHK MUST BE ZERO 00768000
SL R6,VMCHSTRT CHANNEL DISP @VA01770 00769000
SL R7,VMCUSTRT CONT. UNIT DISP @VA01770 00770000
SL R8,VMDVSTRT GET VDEVBLOK DISPLACEMENT 00771000
ALTER3 TRANS 2,1,OPT=(BRING,DEFER),ADEX=PROGCHK1 GET CCW @V304735 00772000
CALL DMKPSACC CHECK IF SHARED PAGE WAS CHANGED @V304735 00773000
BZ NOTCHG3 NOT CHANGED - CONTINUE @V304735 00774000
CALL DMKVMASH FLAG ALL CHANGED SHARED PAGES @VA07351 00774100
B ALTER3 RE-ISSUE THE TRANS CALL @V304735 00776000
NOTCHG3 AL R6,VMCHSTRT RESTORE ADDRESS @V304735 00777000
AL R7,VMCUSTRT RESTORE ADDRESS @V304735 00778000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 00779000
TM VCONCOMD-VCONCCW(R2),X'07' IS CCW A TIC ? 00780000
BNZ VCNSCCT NO 00781000
TM VCONCOMD-VCONCCW(R2),X'08' IS CCW A TIC ? 00782000
BNO VCNSCCT NO 00783000
TM VDEVCFLG,VDEVTIC HAD A TIC BEFORE ?? 00784000
BO PROGCHK YES, PROGRAM CHECK FOR CHANNEL 00785000
OI VDEVCFLG,VDEVTIC FLAG AS TIC ENCOUNTERED 00786000
L R1,VCONADDR-VCONCCW(,R2) GET NEW CCW ADDRESS 00787000
LA R1,0(,R1) CLEAR OP-CODE 00788000
B VCNSCLP 00789000
SPACE 1 00790000
VCNSCCT EQU * 00791000
NI VDEVCFLG,X'FF'-VDEVTIC UNFLAG TIC ENCOUNTERED 00792000
LH R3,VCONCNT-VCONCCW(,R2) GET CCW COUNT 00793000
N R3,XRIGHT16 ... 00794000
ALR R4,R3 ACCUMULATE COUNT 00795000
TM VCONDWC,X'40' IS THIS DIAG 58 ? HRC101DK 00795100
BZ CKSIOSIZ NO, USE NORMAL SIZE HRC101DK 00795200
CL R4,=F'4064' LARGER THAN MAX ALLOWED ?? HRC101DK 00795300
BNH NEXT OK IF LESS THAN OR EQUAL TO MAX HRC101DK 00795400
B PRGIL ELSE PROG CHECK HRC101DK 00795500
CKSIOSIZ EQU * HRC101DK 00795600
CL R4,=F'2032' LARGER THAN MAX ALLOWED ?? 00796000
BL NEXT NO, CONT 00797000
PRGIL OI VDEVCSW+5,IL SET INCORRECT LENGTH @V200730 00798000
B PROGCHK SET CHAN PROG CHECK 00799000
NEXT DS 0H 00800000
TM VCONFLAG-VCONCCW(R2),CD DATA CHAINED ? 00801000
BZ TSTGRF NO, TEST FOR DIAG WRITE @V200730 00802000
LA R1,8(,R1) GET NEXT CCW 00803000
B VCNSCLP 00804000
TSTGRF TM VCONDWC,X'40' DIAGNOSE GRAPHICS WRITE ?? @VA07542 00805100
BCR 8,R9 NO, RETURN @V200730 00806000
L R3,VMTERM GET USER TERM RDEVBLOK @V200730 00807000
LTR R3,R3 IS THERE ONE NOW ?? @V200730 00808000
BNP 0(R9) NO, RETURN @V200730 00809000
USING RDEVBLOK,R3 ADDRESSING @V200730 00810000
CLI RDEVTYPC,CLASGRAF IS IT A GRAF DEVICE @V200730 00811000
BE *+20 YES, CHECK FOR ERASE SCREEN @V2D3931 00812000
CLI RDEVTYPC,CLASTERM IS THIS A TERMINAL CLASS @V2D3931 00813000
BNE VDEVREJ NO, REJECT - CANN'T HACK IT @V2D3931 00814000
CLI RDEVTYPE,TYPBSC IS THIS A BISYNC LINE FOR 3270 @V2D3931 00815000
BNE VDEVREJ NO, REJECT - SET UNIT CHECK FLAG @V2D3931 00816000
CLI VCONDWC,X'FF' ERASE SCREEN, CLEAR DIAGNOSE ?? @VA07542 00818100
BCR 8,R9 YES, LET IT GO 00819000
SLR R0,R0 CLEAR A WORK REGISTER @V60A6B6 00819100
IC R0,VCONDWC GET LINE COORDINATE NO @V60A6B6 00819200
N R0,=XL4'0000003F' AND OUT ERASE BIT @V60A6B6 00819300
SLR R1,R1 CLEAR DISPLAY INDEX REGISTER @V60A6B6 00820000
CLI RDEVTYPE,TYPBSC DISPLAY ON A REMOTE LINE ? @V60A6B6 00821100
BE CHKSIZE YES. @V60A6B6 00822100
CHKGRAF EQU * @V60A6B6 00822200
IC R1,RDEVGRTY GET LOCAL DISPLAY'S SCREEN INDEX @V60A6B6 00822300
DROP R3 FINISHED USING RDEVBLOK... @V60A6B6 00822400
CHKSIZE EQU * @V60A6B6 00822500
L R2,=A(DMKGRTIN) ADDRESS INPUT COORDINATE TABLE @V60A6B6 00822600
LA R2,0(R1,R2) AND GET THE RIGHT ONE FOR DEVICE @V60A6B6 00823000
CLM R0,B'0001',0(R2) THIS WRITE TO THE INPUT AREA? @V60A6B6 00823100
BE TSTINPT YES, CHECK THAT @V200730 00824000
MH R0,=H'80' GET BUFFER POSITION START @V60A6B6 00825100
ALR R0,R4 ADD THIS DATA COUNT @V60A6B6 00825200
L R2,=A(DMKGRTDS) ADDRESS TABLE OF DISPLAY SIZES @V60A6B6 00825300
L R2,0(R1,R2) GET RIGHT SIZE FOR THIS DEVICE @V60A6B6 00825400
LA R2,6(,R2) PLUS 6 FOR HI INTENSITY HRC310DK 00825410
CLR R0,R2 CAN'T BE MORE THAN THIS @V60A6B6 00825500
BNHR R9 OK, CONTINUE @V60A6B6 00825600
B PRGIL SORRY CHUM, THAT'S A NO-NO @V200730 00829000
TSTINPT CL R4,=F'136' CANT WRITE MORE THAN THIS @V200730 00830000
BNH 0(R9) OK, CONT @V200730 00831000
B PRGIL WELL, I WARNED YOU @V200730 00832000
EJECT 00833000
VCNMVDAT EQU * HERE TO MOVE DATA BETWEEN USER AND DATA BUFFER 00834000
OI VDEVCFLG,VDEVTRAN INDICATE A DATA TRANSFER 00835000
VCNCUPCR CLR R0,R10 IF FIELD IS ALREADY EMPTY 00836000
BE CCWWLRCN GIVE STATUS 00837000
L R1,VCONADDR GET DATA ADDRESS 00838000
LA R1,0(,R1) CLEAR OP-CODE 00839000
LH R4,VCONCNT GET COUNT 00840000
N R4,XRIGHT16 ... 00841000
TM VCONFLAG,IDA INDIRECT DATA ADDRESS ? 00842000
BNO VCNCTADR NO 00843000
ST R1,VCONIDAP SAVE FIRST IDAW PTR 00844000
SL R6,VMCHSTRT CHANNEL DISP @VA01770 00845000
SL R7,VMCUSTRT CONT. UNIT DISP @VA01770 00846000
SL R8,VMDVSTRT GET VDEVBLOK DISPLACEMENT 00847000
ALTER4 TRANS 2,1,OPT=(BRING,DEFER),ADEX=VCNCHAD FETCH IDAW @V304735 00848000
CALL DMKPSACC CHECK IF SHARED PAGE WAS CHANGED @V304735 00849000
BZ NOTCHG4 NOT CHANGED - CONTINUE @V304735 00850000
CALL DMKVMASH FLAG ALL CHANGED SHARED PAGES @VA07351 00850100
B ALTER4 RE-ISSUE THE TRANS CALL @V304735 00852000
NOTCHG4 AL R6,VMCHSTRT RESTORE ADDRESS @V304735 00853000
AL R7,VMCUSTRT RESTORE ADDRESS @V304735 00854000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 00855000
L R1,0(,R2) GET FIRST IDA 00856000
VCNCTADR LR R5,R0 GET CURRENT CHARACTER PTR @V304635 00857000
SLR R5,R10 GET FIELD LENGTH COUNT 00858000
LA R14,2048(,R1) 00859000
N R14,=A(X'FFF800') 00860000
SLR R14,R1 GET COUNT TO END OF 2K PROTECTION AREA 00861000
CLR R4,R5 LESS THAN FULL RECORD REQUESTED? 00862000
BNL VCNCTPG NO 00863000
LR R5,R4 COUNT TO BE MOVED IS CCW COUNT 00864000
TM VCONFLAG,CD+SILI DATA CHAINING OR SILI? 00865000
BNZ VCNCTPG YES 00866000
OI VDEVCSW+5,IL SET INCORRECT LENGTH 00867000
NI VCONFLAG,X'FF'-(CD+CC) SUPPRESS CHAINING 00868000
VCNCTPG CLR R14,R5 00869000
BNL VCNMVDCN MUST STOP AT END OF 2K 00870000
LR R5,R14 COUNT TO BE MOVED IS TO 2K BOUNDRY 00871000
VCNMVDCN C R5,F256 IS COUNT > 256 BYTES? 00872000
BNH VCNMVDCO NO 00873000
L R5,F256 COUNT TO BE MOVED IS 256 BYTES 00874000
VCNMVDCO BCTR R5,0 DECREMENT COUNT FOR MVC 00875000
SL R6,VMCHSTRT CHANNEL DISP @VA01770 00876000
SL R7,VMCUSTRT CONT. UNIT DISP @VA01770 00877000
SL R8,VMDVSTRT GET VDEVBLOK DISPLACEMENT 00878000
ALTER5 TRANS 2,1,OPT=(BRING,DEFER),ADEX=VCNCHAD GET DATA PAGE@V304735 00879000
CALL DMKPSACC CHECK IF SHARED PAGE WAS CHANGED @V304735 00880000
BZ NOTCHG5 NOT CHANGED - CONTINUE @V304735 00881000
CALL DMKVMASH FLAG ALL CHANGED SHARED PAGES @VA07351 00881100
B ALTER5 NOW RE-ISSUE THE TRANS CALL @V304735 00883000
NOTCHG5 AL R6,VMCHSTRT RESTORE ADDRESS @V304735 00884000
AL R7,VMCUSTRT RESTORE ADDRESS @V304735 00885000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 00886000
TM VCONCOMD,X'01' WRITE COMMAND? 00887000
BNO VCNMVRD NO 00888000
EX R5,MVCFCORE MOVE DATA FROM VIRTUAL CORE 00889000
B VCNMVDC 00890000
VCNMVRD TM VCONFLAG,SKIP SUPPRESS DATA TRANSFER? 00891000
BO VCNMVDC YES 00892000
LR R3,R0 SAVE BUFFER LENGTH REGISTER @V304735 00893000
IC R0,VDEVKEY GET VIRTUAL CAW KEY @V304735 00894000
CALL DMKPSASC CHECK FOR PROTECTION VIOLATION @V304735 00895000
BNZ VCNCPRTV BRANCH ON PROTECTION ERROR @V304735 00896000
LR R0,R3 RESTORE BUFFER LENGTH @V304735 00897000
EX R5,MVCTCORE MOVE DATA INTO VIRTUAL CORE 00898000
VCNMVDC LA R5,1(,R5) DATA MOVE COMPLETE, RESTORE COUNT 00899000
ALR R10,R5 POINT TO NEW START OF FIELD 00900000
SLR R4,R5 REDUCE CCW COUNT 00901000
STH R4,VDEVCSW+6 SAVE RESIDUAL COUNT 00902000
BCR 10,R9 CCW COUNT SATISFIED, EXIT 00903000
CLR R0,R10 BUFFER EXHAUSTED? 00904000
BE CCWWLRCN YES, TEST FOR WRL 00905000
ALR R1,R5 POINT TO NEW VIRTUAL DATA AREA 00906000
TM VCONFLAG,IDA INDIRECT DATA ADDRESS ? 00907000
BNO VCNCTADR NO 00908000
LR R3,R1 GET IDA 00909000
N R3,=X'FF0007FF' VALID IDA ON 2K BOUNDRY? @VA03177 00910000
BNZ VCNCTADR NO 00911000
L R1,VCONIDAP GET CURRENT IDAW PTR 00912000
LA R1,4(,R1) BUMP BY 4 00913000
ST R1,VCONIDAP REPLACE 00914000
SL R6,VMCHSTRT CHANNEL DISP @VA01770 00915000
SL R7,VMCUSTRT CONT. UNIT DISP @VA01770 00916000
SL R8,VMDVSTRT GET VDEVBLOK DISPLACEMENT 00917000
ALTER6 TRANS 2,1,OPT=(BRING,DEFER),ADEX=VCNCHAD FETCH IDAW @V304735 00918000
CALL DMKPSACC CHECK IF SHARED PAGE WAS CHANGED @V304735 00919000
BZ NOTCHG6 NOT CHANGED - CONTINUE @V304735 00920000
CALL DMKVMASH FLAG ALL CHANGED SHARED PAGES @VA07351 00920100
B ALTER6 NOW - REISSUE THE TRANS CALL @V304735 00922000
NOTCHG6 AL R6,VMCHSTRT RESTORE ADDRESS @V304735 00923000
AL R7,VMCUSTRT RESTORE ADDRESS @V304735 00924000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 00925000
L R1,0(,R2) GET IDA 00926000
LR R3,R1 GET IDA 00927000
N R3,=X'FF0007FF' VALID IDA ON 2K BOUNDRY? @VA03177 00928000
BNZ VCNCCHAD NO -- GIVE CHANNEL PROGRAM CHECK 00929000
B VCNCTADR 00930000
SPACE 00931000
VCNCHAD EQU * HERE WHEN A CHANNEL PROGRAM CHECK OCCURS DURING 00932000
* EXECUTION OF THE MOVE SUBROUTINE (BRANCH FROM TRANS) 00933000
AL R6,VMCHSTRT ADDRESS OF VCHBLOK @VA01770 00934000
AL R7,VMCUSTRT ADDRESS OF VCUBLOK @VA01770 00935000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 00936000
VCNCCHAD EQU * HERE IF CHANNEL PROGRAM CHECK DURING MOVE ROUTINE 00937000
OI VDEVCSW+5,PRGC INDICATE PROGRAM CHECK 00938000
B *+8 00939000
SPACE 00940000
VCNCPRTV EQU * HERE WHEN A PROTECTION VIOLATION OCCURS DURING *00941000
EXECUTION OF THE MOVE SUBROUTINE 00942000
OI VDEVCSW+5,PRTC INDICATE PROTECTION CHECK 00943000
TM VCONCCW+4,CD DATA CHAINING? 00944000
BO WLRBRKCN YES -- GIVE WLR 00945000
TM VCONCCW+4,SILI SILI? 00946000
BO WLRBRKSP YES -- JUST BREAK CHAIN 00947000
B WLRBRKCN GIVE INCORRECT LENGTH AND BREAK CHAIN 00948000
SPACE 00949000
CCWWLRCN EQU * HERE WHEN FIELD COUNT EMPTIED BEFORE CCW COUNT 00950000
TM VCONFLAG,CD DATA CHAINING? 00951000
BO WLRBRKCN DATA CHAINING MUST BE BROKEN 00952000
TM VCONFLAG,SILI WLR IS OK WITH SILI SET 00953000
BCR 1,R9 00954000
WLRBRKCN OI VDEVCSW+5,IL SET INCORRECT LENGTH RECORD 00955000
WLRBRKSP NI VCONFLAG,X'FF'-(CD+CC) SUPPRESS CHAINING 00956000
BR R9 EXIT 00957000
SPACE 00958000
MVCTCORE MVC 0(0,R2),0(R10) EXECUTED MOVE TO VIRTUAL CORE 00959000
MVCFCORE MVC 0(0,R10),0(R2) EXECUTED MOVE FROM VIRTUAL CORE 00960000
MVCBUFF MVC 0(0,R1),0(R10) EXCUTED MOVE FROM VIRTUAL BUFFER @V200730 00961000
SAVEBUF MVC 0(0,R1),0(R10) EXECUTED TO SAVE WRITE DATA @V200730 00962000
EJECT 00963000
VCNRELSE EQU * HERE TO RETURN THE DATA BUFFER TO FREE STORAGE 00964000
L R13,VDEVCON POINT TO VCONCTL BLOK @VA14366 00964100
SLR R0,R0 CLEAR FOR IC 00965000
LH R0,VCONBFSZ GET NUMBER OF DOUBLE WORDS TO FREHRC101DK 00966490
L R1,VCONBUF GET PTR TO DATA BUFFER 00967000
LTR R1,R1 BLOCK ALREADY RETURNED ? 00968000
BCR 8,R9 (BZR) YES 00969000
CALL DMKFRET 00970000
ENTRY DMKVCNFT ENTRY POINT TO TELL DMKFRE ... @VA05235 00970100
DMKVCNFT EQU * ADDRESS OF ABOVE DMKFRET CALL. @VA05235 00970200
XC VCONBUF,VCONBUF CLEAR PTR 00971000
BR R9 00972000
* 00972200
VCNQM000 EQU * HRC063DK 00972220
L R5,VDEVQMB -> QMBLOK chain anchor HRC063DK 00972240
XC VDEVQMB,VDEVQMB Clear queued msg chain HRC063DK 00972260
USING QMBLOK,R5 QMBLOK is def in VBLOKS HRC063DK 00972280
* HRC063DK 00972300
VCNQM010 EQU * HRC063DK 00972320
LTR R5,R5 Do we have queued msgs? HRC063DK 00972340
BZR R9 No, just exit HRC063DK 00972360
L R0,QMQCNR0 Load message length HRC063DK 00972380
LA R1,QMMSGTXT -> message text HRC063DK 00972400
L R2,QMQCNR2 Load msg option flags HRC063DK 00972420
O R2,=A(NOQUEUE) Set 'do not queue' flag HRC063DK 00972440
CALL DMKQCNWT Issue msgs HRC063DK 00972460
L R0,QMSIZE Size of QMBLOK+msg txt HRC063DK 00972480
LR R1,R5 QMBLOK ptr to R1 HRC063DK 00972500
L R5,QMNEXT -> next QMBLOK HRC063DK 00972520
CALL DMKFRET Release prev QMBLOK HRC063DK 00972540
B VCNQM010 Go prcoess next QMBLOK HRC063DK 00972560
DROP R5 QMBLOK HRC063DK 00972580
* HRC063DK 00972600
EJECT 00973000
* 00974000
* HERE FOR SUBROUTINES TO HANDLE EXIT FROM DMKVCNEX 00975000
* 00976000
SPACE 00977000
UNITCHK EQU * HERE TO INDICATE UNIT CHECK - SENSE BYTE IS ALREADY 00978000
* SET 00979000
OI VDEVCSW+4,CE+DE+UC SET UNIT CHECK 00980000
B VCNEXIT 00981000
SPACE 00982000
PROTCHK EQU * HERE ON A PROTECTION VIOLATION 00983000
OI VDEVCSW+5,PRTC SET PROTECTION CHECK 00984000
B LASTCCWX 00985000
SPACE 00986000
PROGCHK1 EQU * HERE ON A CHANNEL PROGRAM CHECK FROM TRANS MACRO 00987000
AL R6,VMCHSTRT ADDRESS OF VCHBLOK @VA01770 00988000
AL R7,VMCUSTRT ADDRESS OF VCUBLOK @VA01770 00989000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 00990000
PROGCHK EQU * HERE ON A PROGRAM CHECK 00991000
OI VDEVCSW+5,PRGC SET CHANNEL PROGRAM CHECK 00992000
SPACE 1 00993000
LASTCCWX EQU * 00994000
TM VDEVCSW+4,CE IS CE IN CSW ? 00995000
BNO VCNEXIT NO 00996000
OI VDEVCSW+4,DE PUT DE IN CSW FOR EXCEPTION CONDITIONS 00997000
B VCNEXIT 00998000
SPACE 00999000
LASTCCW EQU * HERE TO FINISH PROCESSING THE LAST CCW 01000000
TM VDEVCSW+4,DE IS DE IN CSW? 01001000
BO VCNEXIT YES, NO DE STATUS IN DEVICE 01002000
OI VDEVSTAT,VDEVPEND DE MUST BE PENDING IN DEVICE 01003000
OI VDEVINTS,DE ... 01004000
SPACE 01005000
VCNEXIT EQU * HERE FOR GENERAL EXIT 01006000
IC R0,VDEVKEY GET CAW PROTECT KEY @VA13617 01006100
STC R0,VDEVCSW PUT IT IN CSW @VA13617 01006200
NI VDEVCSW,X'F0' CLEAN UP LOW NIBBLE @VA13617 01006300
BAL R9,VCNRELSE RELEASE BUFFER - IF ANY 01007000
TM VCUTYPE,VCUSHRD SHARED SUBCHANNEL? @VA01709 01008000
BZ *+8 NO, NO STATUS FOR CU @VA01709 01009000
OI VCUSTAT,VCUCEPND INTERRUPT PENDING IN CU @VA02998 01010000
OI VDEVSTAT,VDEVCHAN SET CHANNEL INTERRUPT PENDING 01011000
CLI VCONCOMD,X'29' DIAG 58 FULL SCR WRITE? HRC058DK 01011100
BE VCND58 Y, SPECIAL HANDLING HRC058DK 01011110
CLI VCONCOMD,X'2A' DIAG 58 FULL SCR READ? HRC058DK 01011120
BE VCND58 Y, SPECIAL HANDLING HRC058DK 01011130
CLI VCONCOMD,X'63' DIAG 58 control query? HRC064DK 01011200
BE VCND58 Y, exit w/ CC from HDKD58HRC064DK 01011210
TM VDEVFLAG,VDEVCCW1 STILL ON 1ST CCW? 01012000
BNO VCNEXITX NO, NO CHANCE FOR CC1 TO SIO 01013000
TM VDEVCSW+4,CE+DE ANY CHANNEL OR DEVICE STATUS PENDING 01014000
BZ VCNCC1 NO, MUST BE AN UNUSUAL CONDITION 01015000
TM VCONCOMD,X'03' IS IT AN IMMEDIATE COMMAND? 01016000
BNO VCNEXITX NO 01017000
B VCNCC1 GO SET CC1 HRC058DK 01017100
VCND58 EQU * HRC058DK 01017110
CLI VDEVCSW+4,CE+DE NORMAL COMPLETION? HRC058DK 01017120
BE VCNEXITX Y, HANDLE PENDING INTRPT HRC058DK 01017130
SPACE 01018000
VCNCC1 EQU * HERE FOR CC1 TO SIO 01019000
TM VMESTAT,VMEXTCM IS V.M. IN EXTENDED CONTROL MODE ? 01020000
BNO VCN004 NO 01021000
OI VMPSW+2,X'10' SET CC1 IN EXTENDED PSW 01022000
B VCN005 01023000
VCN004 OI VMPSW+4,X'10' SET CC1 IN STANDARD PSW 01024000
VCN005 EQU * 01025000
LA R1,CSW ADDRESS OF CSW 01026000
SL R6,VMCHSTRT CHANNEL DISP @VA01770 01027000
SL R7,VMCUSTRT CONTR. UNIT DISP @VA01770 01028000
SL R8,VMDVSTRT GET VDEVBLOK DISPLACEMENT 01029000
TRANS 2,1,OPT=(BRING,DEFER) BRING IN USER'S PAGE 0 01030000
AL R6,VMCHSTRT RESTORE ADDRESS @VA01770 01031000
AL R7,VMCUSTRT RESTORE ADDRESS @VA01770 01032000
AL R8,VMDVSTRT ADDRESS OF VDEVBLOK 01033000
MVC 4(2,R2),VDEVCSW+4 STORE STATUS ONLY 01034000
NI VDEVSTAT,X'FF'-VDEVCHAN NO CHANNEL CLASS INTERRUPT PEND 01035000
CLI VDEVCSW+4,X'8E' DIAG 58 CP interruption? HRC062DK 01035100
BNE VCNEXITX No HRC062DK 01035150
MVC 0(8,R2),VDEVCSW Provide full CSW on X'8E'HRC062DK 01035200
SPACE 01036000
VCNEXITX EQU * HERE TO TEST FOR AND POST PENDING INTERRUPTS 01037000
TM VDEVSTAT,VDEVCHAN+VDEVPEND ANY INTERRUPTS PENDING? 01038000
BZ VCNNOINT NO, EXIT 01039000
L R2,=A(DMKVIOMK) POINT TO INTERRUPT PENDING MASK *01040000
TABLE 01041000
LH R3,VDEVADD GET DEVICE ADDRESS 01042000
AR R3,R3 *2 01043000
LA R3,0(R3,R2) POINT TO CORRECT PENDING MASK 01044000
OC VCUDVINT,0(R3) SET PENDING FLAGS IN VCUBLOK 01045000
LH R3,VCUADD GET ADDRESS OF CONTROL UNIT 01046000
SRL R3,3 *2 01047000
LA R3,0(R3,R2) POINT TO CORRECT PENDING MASK 01048000
OC VCHCUINT,0(R3) AND SET PENDING FLAG 01049000
LH R3,VCHADD GET CHANNEL ADDRESS 01050000
SRL R3,7 *2 01051000
ALR R3,R2 POINT TO MASK BYTES 01052000
OC VMIOINT,0(R3) FLAG CHANNEL PENDING IN VMBLOK 01053000
OI VMPEND,VMIOPND FLAG SUMMARY PENDING BYTE 01054000
TM VDEVCFLG,VDEVTRAN DID DATA TRANSFER OCCUR ? 01055000
BNO VCNNOINT NO 01056000
TM VMOSTAT,VMDISC DISCONNECTED USER ? 01057000
BO *+8 YES -- FORGET ABOUT Q1 01058000
OI VMQSTAT,VMPRIDSP FLAG USER TO ENTER DISPATCHER Q1 01059000
SPACE 01060000
VCNNOINT EQU * HERE DIRECTLY IF NO INTERRUPTS ARE PENDING 01061000
NI VDEVSTAT,X'FF'-(VDEVBUSY+VDEVCHBS) MARK DEVICE & *01062000
SUBCHANNEL AS NO LONGER BUSY 01063000
TM VDEVCFLG,VDEVATTN WAS A DOUBLE ATTN HIT ? 01064000
BO VCNBK YES, GO TO CP MODE @V200930 01065000
TM VDEVCFLG,VDEVVCF FLAGGED TO DO VIRT CONS FUNC ??@V200930 01066000
BZ VCNEXITY NO, CONT @V200930 01067000
L R1,VCONRBUF GET BUFFER ADDRESS @V200930 01068000
USING BUFIN,R1 @V200930 01069000
SR R0,R0 CLEAR @V200930 01070000
ST R0,VCONRBUF CLEAR BUFFER ADDRESS @V200930 01071000
L R0,BUFCNT GET DATA COUNT @V200930 01072000
DROP R1 @V200930 01073000
TM VMOSTAT,VMCF AVOID OVERLAPPING TASKS @VA02350 01074000
BO VCNEXITY @VA02350 01075000
CALL DMKCFMEN DO VIRT CONSOLE FUNCTION @V200930 01076000
B VCNEXITY RETURN @V200930 01077000
VCNBK DS 0H @V200930 01078000
CALL DMKCFMBK PLACE USER IN CONSOLE FUNCTION MODE 01079000
SPACE 1 01080000
VCNEXITY TM VMDSTAT,VMTIO USER IN TIO BUSY LOOP ?? @V200730 01081000
BZ *+8 NO, SKIP @V200730 01082000
NI VMRSTAT,X'FF'-VMEXWAIT-VMIDLE REMOVE FROM WAIT @V200730 01083000
GOTO DMKDSPCH LEAVE HERE @V200730 01084000
SPACE 01085000
ALARMMSG DC C'RRRR....RING....GGGG' VIRTUAL BELL 01086000
EJECT 01087000
LTORG 01088000
COPY DEVTYPES 01089000
COPY EQU 01090000
COPY VBLOKS 01091000
COPY RBLOKS @V200730 01092000
COPY VMBLOK 01093000
PSA 01094000
COPY IOBLOKS 01095000
COPY CONBUF @V200930 01096000
END 01097000